From: Sven Hoexter Date: Mon, 17 Jan 2011 15:25:31 +0000 (+0100) Subject: Imported Upstream version 3.05 X-Git-Tag: upstream/3.05 X-Git-Url: https://git.sven.stormbind.net/?a=commitdiff_plain;h=4462e07b00d676043759fe1ada684ae53eba7f7d;p=sven%2Fmysqltcl.git Imported Upstream version 3.05 --- 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..2accc74 --- /dev/null +++ b/COPYING @@ -0,0 +1,4 @@ +Some other old historical license notes can be fond in +READMY-msqltcl , mysqltcl.c and mysqltcl.n + +It seems that it is BSD-like licence diff --git a/ChangeLog b/ChangeLog new file mode 100755 index 0000000..5e70d06 --- /dev/null +++ b/ChangeLog @@ -0,0 +1,100 @@ +Release 3.05 +-- applied path from Björn König to support compilation with mysql3.20 (with help of #if) +-- some addaption and bug fixes for mysql 5 for handling mutiple result queries. In case of mustiple statement mysql::exec return a list of results. +Release 3.04 +-- bug fix for mysql::state (check for argument lenght). Thanks to Snyper for bug fix +Release 3.03 +-- patch for file mysqltcl.c to adapt mysql column comands for mysql5 was applied. This accept +new columns types: newdecimal, bit and geometry. Thanks to Joerg Mehring. +Release 3.02 +-- bug in mysql::map and mysql::recieve removed (occurs only for one column evalated in global context) +-- TEA upgrated +Release 3.01 +-- bug in mysql::state then no proper handle fixed +-- bug in mysql::nextresult fixed +-- bug in man format doc fixed +-- new command mysql::encoding +-- new ssl connection options -sslkey -sslcert -sslca -sslcapath -sslciphers using of mysql_ssl_set +-- new command option mysq::info state +-- removed c-header installation section from Makefile.in +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..0552d56 --- /dev/null +++ b/Makefile.in @@ -0,0 +1,436 @@ +# Makefile.in -- +# +# This file is a Makefile for Sample TEA Extension. If it has the name +# "Makefile.in" then it is a template for a Makefile; to generate the +# actual Makefile, run "./configure", which is a configuration script +# generated by the "autoconf" program (constructs like "@foo@" will get +# replaced in the actual Makefile. +# +# Copyright (c) 1999 Scriptics Corporation. +# Copyright (c) 2002-2005 ActiveState Corporation. +# +# See the file "license.terms" for information on usage and redistribution +# of this file, and for a DISCLAIMER OF ALL WARRANTIES. +# +# RCS: @(#) $Id: Makefile.in,v 1.60 2005/09/13 22:06:37 hobbs Exp $ + +#======================================================================== +# Add additional lines to handle any additional AC_SUBST cases that +# have been added in a customized configure script. +#======================================================================== + +#SAMPLE_NEW_VAR = @SAMPLE_NEW_VAR@ + +#======================================================================== +# Nothing of the variables below this line should need to be changed. +# Please check the TARGETS section below to make sure the make targets +# are correct. +#======================================================================== + +#======================================================================== +# The names of the source files is defined in the configure script. +# The object files are used for linking into the final library. +# This will be used when a dist target is added to the Makefile. +# It is not important to specify the directory, as long as it is the +# $(srcdir) or in the generic, win or unix subdirectory. +#======================================================================== + +PKG_SOURCES = @PKG_SOURCES@ +PKG_OBJECTS = @PKG_OBJECTS@ + +PKG_STUB_SOURCES = @PKG_STUB_SOURCES@ +PKG_STUB_OBJECTS = @PKG_STUB_OBJECTS@ + +#======================================================================== +# PKG_TCL_SOURCES identifies Tcl runtime files that are associated with +# this package that need to be installed, if any. +#======================================================================== + +PKG_TCL_SOURCES = @PKG_TCL_SOURCES@ + +#======================================================================== +# This is a list of public header files to be installed, if any. +#======================================================================== + +PKG_HEADERS = @PKG_HEADERS@ + +#======================================================================== +# "PKG_LIB_FILE" refers to the library (dynamic or static as per +# configuration options) composed of the named objects. +#======================================================================== + +PKG_LIB_FILE = @PKG_LIB_FILE@ +PKG_STUB_LIB_FILE = @PKG_STUB_LIB_FILE@ + +lib_BINARIES = $(PKG_LIB_FILE) +BINARIES = $(lib_BINARIES) + +SHELL = @SHELL@ + +srcdir = @srcdir@ +prefix = @prefix@ +exec_prefix = @exec_prefix@ + +bindir = @bindir@ +libdir = @libdir@ +datadir = @datadir@ +mandir = @mandir@ +includedir = @includedir@ + +DESTDIR = + +PKG_DIR = $(PACKAGE_NAME)-$(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_NAME = @PACKAGE_NAME@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +CC = @CC@ +CFLAGS_DEFAULT = @CFLAGS_DEFAULT@ +CFLAGS_WARNING = @CFLAGS_WARNING@ +CLEANFILES = @CLEANFILES@ +EXEEXT = @EXEEXT@ +LDFLAGS_DEFAULT = @LDFLAGS_DEFAULT@ +MAKE_LIB = @MAKE_LIB@ +MAKE_SHARED_LIB = @MAKE_SHARED_LIB@ +MAKE_STATIC_LIB = @MAKE_STATIC_LIB@ +MAKE_STUB_LIB = @MAKE_STUB_LIB@ +OBJEXT = @OBJEXT@ +RANLIB = @RANLIB@ +RANLIB_STUB = @RANLIB_STUB@ +SHLIB_CFLAGS = @SHLIB_CFLAGS@ +SHLIB_LD = @SHLIB_LD@ +SHLIB_LD_LIBS = @SHLIB_LD_LIBS@ @MYSQL_LIBS@ +STLIB_LD = @STLIB_LD@ +#TCL_DEFS = @TCL_DEFS@ +TCL_BIN_DIR = @TCL_BIN_DIR@ +TCL_SRC_DIR = @TCL_SRC_DIR@ +#TK_BIN_DIR = @TK_BIN_DIR@ +#TK_SRC_DIR = @TK_SRC_DIR@ + +# Not used, but retained for reference of what libs Tcl required +#TCL_LIBS = @TCL_LIBS@ @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) +#EXTRA_PATH = $(top_builddir):$(TCL_BIN_DIR):$(TK_BIN_DIR) +TCLLIBPATH = $(top_builddir) +TCLSH_ENV = TCL_LIBRARY=`@CYGPATH@ $(TCL_SRC_DIR)/library` \ + @LD_LIBRARY_PATH_VAR@="$(EXTRA_PATH):$(@LD_LIBRARY_PATH_VAR@)" \ + PATH="$(EXTRA_PATH):$(PATH)" \ + TCLLIBPATH="$(TCLLIBPATH)" +# TK_LIBRARY=`@CYGPATH@ $(TK_SRC_DIR)/library` + +TCLSH_PROG = @TCLSH_PROG@ +TCLSH = $(TCLSH_ENV) $(TCLSH_PROG) + +#WISH_PROG = @WISH_PROG@ +#WISH = $(TCLSH_ENV) $(WISH_PROG) + + +SHARED_BUILD = @SHARED_BUILD@ + +INCLUDES = @PKG_INCLUDES@ @TCL_INCLUDES@ @MYSQL_INCLUDES@ +#INCLUDES = @PKG_INCLUDES@ @TCL_INCLUDES@ @TK_INCLUDES@ @TK_XINCLUDES@ + +PKG_CFLAGS = @PKG_CFLAGS@ + +# TCL_DEFS is not strictly need here, but if you remove it, then you +# must make sure that configure.in checks for the necessary components +# that your library may use. TCL_DEFS can actually be a problem if +# you do not compile with a similar machine setup as the Tcl core was +# compiled with. +#DEFS = $(TCL_DEFS) @DEFS@ $(PKG_CFLAGS) +DEFS = @DEFS@ $(PKG_CFLAGS) + +CONFIG_CLEAN_FILES = Makefile + +CPPFLAGS = @CPPFLAGS@ +LIBS = @PKG_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) + +libraries: + + +#======================================================================== +# Your doc target should differentiate from doc builds (by the developer) +# and doc installs (see install-doc), which just install the docs on the +# end user machine when building from source. +#======================================================================== + +doc: + @echo "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 + +#======================================================================== +# This rule installs platform-independent files, such as header files. +# The list=...; for p in $$list handles the empty list case x-platform. +#======================================================================== + +install-libraries: libraries + @mkdir -p $(DESTDIR)$(includedir) + @echo "Installing header files in $(DESTDIR)$(includedir)" + @list='$(PKG_HEADERS)'; for i in $$list; do \ + echo "Installing $(srcdir)/$$i" ; \ + $(INSTALL_DATA) $(srcdir)/$$i $(DESTDIR)$(includedir) ; \ + done; + +#======================================================================== +# Install documentation. Unix manpages should go in the $(mandir) +# directory. +#======================================================================== + +install-doc: doc + @mkdir -p $(DESTDIR)$(mandir)/mann + @echo "Installing documentation in $(DESTDIR)$(mandir)" + @list='$(srcdir)/doc/*.n'; for i in $$list; 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/all.tcl` $(TESTFLAGS) + +shell: binaries libraries + @$(TCLSH) $(SCRIPT) + +gdb: + $(TCLSH_ENV) gdb $(TCLSH_PROG) $(SCRIPT) + +depend: + +#======================================================================== +# $(PKG_LIB_FILE) should be listed as part of the BINARIES variable +# mentioned above. That will ensure that this target is built when you +# run "make binaries". +# +# The $(PKG_OBJECTS) objects are created and linked into the final +# library. In most cases these object files will correspond to the +# source files above. +#======================================================================== + +$(PKG_LIB_FILE): $(PKG_OBJECTS) + -rm -f $(PKG_LIB_FILE) + ${MAKE_LIB} + $(RANLIB) $(PKG_LIB_FILE) + +$(PKG_STUB_LIB_FILE): $(PKG_STUB_OBJECTS) + -rm -f $(PKG_STUB_LIB_FILE) + ${MAKE_STUB_LIB} + $(RANLIB_STUB) $(PKG_STUB_LIB_FILE) + +#======================================================================== +# We need to enumerate the list of .c to .o lines here. +# +# In the following lines, $(srcdir) refers to the toplevel directory +# containing your extension. If your sources are in a subdirectory, +# you will have to modify the paths to reflect this: +# +# sample.$(OBJEXT): $(srcdir)/generic/sample.c +# $(COMPILE) -c `@CYGPATH@ $(srcdir)/generic/sample.c` -o $@ +# +# Setting the VPATH variable to a list of paths will cause the makefile +# to look into these paths when resolving .c to .obj dependencies. +# As necessary, add $(srcdir):$(srcdir)/compat:.... +#======================================================================== + +VPATH = $(srcdir):$(srcdir)/generic:$(srcdir)/unix:$(srcdir)/win + +.c.@OBJEXT@: + $(COMPILE) -c `@CYGPATH@ $<` -o $@ + +#======================================================================== +# Distribution creation +# You may need to tweak this target to make it work correctly. +#======================================================================== + +#COMPRESS = tar cvf $(PKG_DIR).tar $(PKG_DIR); compress $(PKG_DIR).tar +COMPRESS = 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)/README-msqltcl $(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 + + for i in $(srcdir)/*.[ch]; do \ + if [ -f $$i ]; then \ + cp -p $$i $(DIST_DIR)/ ; \ + fi; \ + done; + + 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: 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; \ + stub=`echo $$p|sed -e "s/.*\(stub\).*/\1/"`; \ + if test "x$$stub" = "xstub"; then \ + echo " $(RANLIB_STUB) $(DESTDIR)$(pkglibdir)/$$p"; \ + $(RANLIB_STUB) $(DESTDIR)$(pkglibdir)/$$p; \ + else \ + echo " $(RANLIB) $(DESTDIR)$(pkglibdir)/$$p"; \ + $(RANLIB) $(DESTDIR)$(pkglibdir)/$$p; \ + fi; \ + ext=`echo $$p|sed -e "s/.*\.//"`; \ + if test "x$$ext" = "xdll"; then \ + lib=`basename $$p|sed -e 's/.[^.]*$$//'`.lib; \ + if test -f $$lib; then \ + echo " $(INSTALL_DATA) $$lib $(DESTDIR)$(pkglibdir)/$$lib"; \ + $(INSTALL_DATA) $$lib $(DESTDIR)$(pkglibdir)/$$lib; \ + fi; \ + fi; \ + fi; \ + done + @list='$(PKG_TCL_SOURCES)'; for p in $$list; do \ + if test -f $(srcdir)/$$p; then \ + destp=`basename $$p`; \ + echo " Install $$destp $(DESTDIR)$(pkglibdir)/$$destp"; \ + $(INSTALL_DATA) $(srcdir)/$$p $(DESTDIR)$(pkglibdir)/$$destp; \ + fi; \ + done + @if test "x$(SHARED_BUILD)" = "x1"; then \ + echo " Install pkgIndex.tcl $(DESTDIR)$(pkglibdir)"; \ + $(INSTALL_DATA) pkgIndex.tcl $(DESTDIR)$(pkglibdir); \ + fi + +#======================================================================== +# Install binary executables (e.g. .exe files and dependent .dll files) +# This is for files that must go in the bin directory (located next to +# wish and tclsh), like dependent .dll files on Windows. +# +# You should not have to modify this target, except to define bin_BINARIES +# above if necessary. +#======================================================================== + +install-bin-binaries: binaries + @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='$(PKG_TCL_SOURCES)'; for p in $$list; do \ + p=`basename $$p`; \ + rm -f $(DESTDIR)$(pkglibdir)/$$p; \ + done + list='$(bin_BINARIES)'; for p in $$list; do \ + rm -f $(DESTDIR)$(bindir)/$$p; \ + done + +.PHONY: all binaries clean depend distclean doc install libraries test + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/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 100755 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..08988e0 --- /dev/null +++ b/configure @@ -0,0 +1,11211 @@ +#! /bin/sh +# Guess values for system-dependent variables and create Makefiles. +# Generated by GNU Autoconf 2.61 for mysqltcl 3.05. +# +# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, +# 2002, 2003, 2004, 2005, 2006 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 more Bourne compatible +DUALCASE=1; export DUALCASE # for MKS sh +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+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in + *posix*) set -o posix ;; +esac + +fi + + + + +# PATH needs CR +# 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 + +# Support unset when possible. +if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then + as_unset=unset +else + as_unset=false +fi + + +# IFS +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent editors from complaining about space-tab. +# (If _AS_PATH_WALK were called with IFS unset, it would disable word +# splitting by setting IFS to empty value.) +as_nl=' +' +IFS=" "" $as_nl" + +# Find who we are. Look in the path if we contain no directory separator. +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 +IFS=$as_save_IFS + + ;; +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_myself: error: cannot find myself; rerun with an absolute file name" >&2 + { (exit 1); exit 1; } +fi + +# Work around bugs in pre-3.0 UWIN ksh. +for as_var in ENV MAIL MAILPATH +do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var +done +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 -z "`(eval $as_var=C; export $as_var) 2>&1`"); then + eval $as_var=C; export $as_var + else + ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var + fi +done + +# Required to use basename. +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; 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'` + +# CDPATH. +$as_unset CDPATH + + +if test "x$CONFIG_SHELL" = x; then + if (eval ":") 2>/dev/null; then + as_have_required=yes +else + as_have_required=no +fi + + if test $as_have_required = yes && (eval ": +(as_func_return () { + (exit \$1) +} +as_func_success () { + as_func_return 0 +} +as_func_failure () { + as_func_return 1 +} +as_func_ret_success () { + return 0 +} +as_func_ret_failure () { + return 1 +} + +exitcode=0 +if as_func_success; then + : +else + exitcode=1 + echo as_func_success failed. +fi + +if as_func_failure; then + exitcode=1 + echo as_func_failure succeeded. +fi + +if as_func_ret_success; then + : +else + exitcode=1 + echo as_func_ret_success failed. +fi + +if as_func_ret_failure; then + exitcode=1 + echo as_func_ret_failure succeeded. +fi + +if ( set x; as_func_ret_success y && test x = \"\$1\" ); then + : +else + exitcode=1 + echo positional parameters were not saved. +fi + +test \$exitcode = 0) || { (exit 1); exit 1; } + +( + as_lineno_1=\$LINENO + as_lineno_2=\$LINENO + test \"x\$as_lineno_1\" != \"x\$as_lineno_2\" && + test \"x\`expr \$as_lineno_1 + 1\`\" = \"x\$as_lineno_2\") || { (exit 1); exit 1; } +") 2> /dev/null; then + : +else + as_candidate_shells= + 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=. + case $as_dir in + /*) + for as_base in sh bash ksh sh5; do + as_candidate_shells="$as_candidate_shells $as_dir/$as_base" + done;; + esac +done +IFS=$as_save_IFS + + + for as_shell in $as_candidate_shells $SHELL; do + # Try only shells that exist, to save several forks. + if { test -f "$as_shell" || test -f "$as_shell.exe"; } && + { ("$as_shell") 2> /dev/null <<\_ASEOF +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+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in + *posix*) set -o posix ;; +esac + +fi + + +: +_ASEOF +}; then + CONFIG_SHELL=$as_shell + as_have_required=yes + if { "$as_shell" 2> /dev/null <<\_ASEOF +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+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in + *posix*) set -o posix ;; +esac + +fi + + +: +(as_func_return () { + (exit $1) +} +as_func_success () { + as_func_return 0 +} +as_func_failure () { + as_func_return 1 +} +as_func_ret_success () { + return 0 +} +as_func_ret_failure () { + return 1 +} + +exitcode=0 +if as_func_success; then + : +else + exitcode=1 + echo as_func_success failed. +fi + +if as_func_failure; then + exitcode=1 + echo as_func_failure succeeded. +fi + +if as_func_ret_success; then + : +else + exitcode=1 + echo as_func_ret_success failed. +fi + +if as_func_ret_failure; then + exitcode=1 + echo as_func_ret_failure succeeded. +fi + +if ( set x; as_func_ret_success y && test x = "$1" ); then + : +else + exitcode=1 + echo positional parameters were not saved. +fi + +test $exitcode = 0) || { (exit 1); exit 1; } + +( + as_lineno_1=$LINENO + as_lineno_2=$LINENO + test "x$as_lineno_1" != "x$as_lineno_2" && + test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2") || { (exit 1); exit 1; } + +_ASEOF +}; then + break +fi + +fi + + done + + if test "x$CONFIG_SHELL" != x; then + for as_var in BASH_ENV ENV + do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var + done + export CONFIG_SHELL + exec "$CONFIG_SHELL" "$as_myself" ${1+"$@"} +fi + + + if test $as_have_required = no; then + echo This script requires a shell more modern than all the + echo shells that I found on your system. Please install a + echo modern shell, or manually run the script under such a + echo shell if you do have one. + { (exit 1); exit 1; } +fi + + +fi + +fi + + + +(eval "as_func_return () { + (exit \$1) +} +as_func_success () { + as_func_return 0 +} +as_func_failure () { + as_func_return 1 +} +as_func_ret_success () { + return 0 +} +as_func_ret_failure () { + return 1 +} + +exitcode=0 +if as_func_success; then + : +else + exitcode=1 + echo as_func_success failed. +fi + +if as_func_failure; then + exitcode=1 + echo as_func_failure succeeded. +fi + +if as_func_ret_success; then + : +else + exitcode=1 + echo as_func_ret_success failed. +fi + +if as_func_ret_failure; then + exitcode=1 + echo as_func_ret_failure succeeded. +fi + +if ( set x; as_func_ret_success y && test x = \"\$1\" ); then + : +else + exitcode=1 + echo positional parameters were not saved. +fi + +test \$exitcode = 0") || { + echo No shell found that supports shell functions. + echo Please tell autoconf@gnu.org about your system, + echo including any error possibly output before this + echo message +} + + + + as_lineno_1=$LINENO + as_lineno_2=$LINENO + test "x$as_lineno_1" != "x$as_lineno_2" && + test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2" || { + + # 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 after each line using $LINENO; the second 'sed' + # does the real work. The second script uses 'N' to pair each + # line-number line with the line containing $LINENO, 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 + # scripts with optimization help from Paolo Bonzini. Blame Lee + # E. McMahon (1931-1989) for sed's syntax. :-) + sed -n ' + p + /[$]LINENO/= + ' <$as_myself | + sed ' + s/[$]LINENO.*/&-/ + t lineno + b + :lineno + N + :loop + s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ + t loop + s/-\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 sensitive to this). + . "./$as_me.lineno" + # Exit status is that of the last command. + exit +} + + +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi + +ECHO_C= ECHO_N= ECHO_T= +case `echo -n x` in +-n*) + case `echo 'x\c'` in + *c*) ECHO_T=' ';; # ECHO_T is single tab character. + *) ECHO_C='\c';; + esac;; +*) + ECHO_N='-n';; +esac + +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then + as_expr=expr +else + as_expr=false +fi + +rm -f conf$$ conf$$.exe conf$$.file +if test -d conf$$.dir; then + rm -f conf$$.dir/conf$$.file +else + rm -f conf$$.dir + mkdir conf$$.dir +fi +echo >conf$$.file +if ln -s conf$$.file conf$$ 2>/dev/null; then + as_ln_s='ln -s' + # ... but there are two gotchas: + # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. + # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. + # In both cases, we have to default to `cp -p'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || + as_ln_s='cp -p' +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$$.dir/conf$$.file conf$$.file +rmdir conf$$.dir 2>/dev/null + +if mkdir -p . 2>/dev/null; then + as_mkdir_p=: +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false +fi + +if test -x / >/dev/null 2>&1; then + as_test_x='test -x' +else + if ls -dL / >/dev/null 2>&1; then + as_ls_L_option=L + else + as_ls_L_option= + fi + as_test_x=' + eval sh -c '\'' + if test -d "$1"; then + test -d "$1/."; + else + case $1 in + -*)set "./$1";; + esac; + case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in + ???[sx]*):;;*)false;;esac;fi + '\'' sh + ' +fi +as_executable_p=$as_test_x + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="eval 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="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" + + + +exec 7<&0 &1 + +# 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` + +# +# Initializations. +# +ac_default_prefix=/usr/local +ac_clean_files= +ac_config_libobj_dir=. +LIBOBJS= +cross_compiling=no +subdirs= +MFLAGS= +MAKEFLAGS= +SHELL=${CONFIG_SHELL-/bin/sh} + +# Identity of this package. +PACKAGE_NAME='mysqltcl' +PACKAGE_TARNAME='mysqltcl' +PACKAGE_VERSION='3.05' +PACKAGE_STRING='mysqltcl 3.05' +PACKAGE_BUGREPORT='' + +# Factoring default headers for most tests. +ac_includes_default="\ +#include +#ifdef HAVE_SYS_TYPES_H +# include +#endif +#ifdef HAVE_SYS_STAT_H +# include +#endif +#ifdef STDC_HEADERS +# include +# include +#else +# ifdef HAVE_STDLIB_H +# include +# endif +#endif +#ifdef HAVE_STRING_H +# if !defined STDC_HEADERS && defined HAVE_MEMORY_H +# include +# endif +# include +#endif +#ifdef HAVE_STRINGS_H +# include +#endif +#ifdef HAVE_INTTYPES_H +# include +#endif +#ifdef HAVE_STDINT_H +# include +#endif +#ifdef 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 +datarootdir +datadir +sysconfdir +sharedstatedir +localstatedir +includedir +oldincludedir +docdir +infodir +htmldir +dvidir +pdfdir +psdir +libdir +localedir +mandir +DEFS +ECHO_C +ECHO_N +ECHO_T +LIBS +build_alias +host_alias +target_alias +CYGPATH +EXEEXT +PKG_LIB_FILE +PKG_STUB_LIB_FILE +PKG_STUB_SOURCES +PKG_STUB_OBJECTS +PKG_TCL_SOURCES +PKG_HEADERS +PKG_INCLUDES +PKG_LIBS +PKG_CFLAGS +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 +CPP +INSTALL_PROGRAM +INSTALL_SCRIPT +INSTALL_DATA +SET_MAKE +RANLIB +GREP +EGREP +MATH_LIBS +PKG_SOURCES +PKG_OBJECTS +CLEANFILES +TCL_INCLUDES +TCL_THREADS +SHARED_BUILD +AR +CELIB_DIR +LIBOBJS +DL_LIBS +CFLAGS_DEBUG +CFLAGS_OPTIMIZE +CFLAGS_WARNING +STLIB_LD +SHLIB_LD +SHLIB_LD_LIBS +SHLIB_CFLAGS +LD_LIBRARY_PATH_VAR +TCL_DBGX +CFLAGS_DEFAULT +LDFLAGS_DEFAULT +MAKE_LIB +MAKE_SHARED_LIB +MAKE_STATIC_LIB +MAKE_STUB_LIB +RANLIB_STUB +LIBMYSQL +MYSQL_INCLUDES +MYSQL_LIBS +MYSQL_LIB_DIR +TCLSH_PROG +LTLIBOBJS' +ac_subst_files='' + ac_precious_vars='build_alias +host_alias +target_alias +CC +CFLAGS +LDFLAGS +LIBS +CPPFLAGS +CPP' + + +# 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. +# (The list follows the same order as the GNU Coding Standards.) +bindir='${exec_prefix}/bin' +sbindir='${exec_prefix}/sbin' +libexecdir='${exec_prefix}/libexec' +datarootdir='${prefix}/share' +datadir='${datarootdir}' +sysconfdir='${prefix}/etc' +sharedstatedir='${prefix}/com' +localstatedir='${prefix}/var' +includedir='${prefix}/include' +oldincludedir='/usr/include' +docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' +infodir='${datarootdir}/info' +htmldir='${docdir}' +dvidir='${docdir}' +pdfdir='${docdir}' +psdir='${docdir}' +libdir='${exec_prefix}/lib' +localedir='${datarootdir}/locale' +mandir='${datarootdir}/man' + +ac_prev= +ac_dashdash= +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 + + case $ac_option in + *=*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; + *) ac_optarg=yes ;; + esac + + # Accept the important Cygnus configure options, so we can diagnose typos. + + case $ac_dashdash$ac_option in + --) + ac_dashdash=yes ;; + + -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) + ac_prev=datadir ;; + -datadir=* | --datadir=* | --datadi=* | --datad=*) + datadir=$ac_optarg ;; + + -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ + | --dataroo | --dataro | --datar) + ac_prev=datarootdir ;; + -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ + | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) + datarootdir=$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 ;; + + -docdir | --docdir | --docdi | --doc | --do) + ac_prev=docdir ;; + -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) + docdir=$ac_optarg ;; + + -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) + ac_prev=dvidir ;; + -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) + dvidir=$ac_optarg ;; + + -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'` + 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 ;; + + -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) + ac_prev=htmldir ;; + -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ + | --ht=*) + htmldir=$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 ;; + + -localedir | --localedir | --localedi | --localed | --locale) + ac_prev=localedir ;; + -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) + localedir=$ac_optarg ;; + + -localstatedir | --localstatedir | --localstatedi | --localstated \ + | --localstate | --localstat | --localsta | --localst | --locals) + ac_prev=localstatedir ;; + -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ + | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) + 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 ;; + + -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) + ac_prev=pdfdir ;; + -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) + pdfdir=$ac_optarg ;; + + -psdir | --psdir | --psdi | --psd | --ps) + ac_prev=psdir ;; + -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) + psdir=$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'` + 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; }; } + 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 directory names. +for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ + datadir sysconfdir sharedstatedir localstatedir includedir \ + oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ + libdir localedir mandir +do + eval ac_val=\$$ac_var + case $ac_val in + [\\/$]* | ?:[\\/]* ) continue;; + NONE | '' ) case $ac_var in *prefix ) continue;; esac;; + esac + { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2 + { (exit 1); exit 1; }; } +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 + + +ac_pwd=`pwd` && test -n "$ac_pwd" && +ac_ls_di=`ls -di .` && +ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || + { echo "$as_me: error: Working directory cannot be determined" >&2 + { (exit 1); exit 1; }; } +test "X$ac_ls_di" = "X$ac_pwd_ls_di" || + { echo "$as_me: error: pwd does not report name of working directory" >&2 + { (exit 1); exit 1; }; } + + +# 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 the parent directory. + ac_confdir=`$as_dirname -- "$0" || +$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 + test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." + { echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2 + { (exit 1); exit 1; }; } +fi +ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" +ac_abs_confdir=`( + cd "$srcdir" && test -r "./$ac_unique_file" || { echo "$as_me: error: $ac_msg" >&2 + { (exit 1); exit 1; }; } + pwd)` +# When building in place, set srcdir=. +if test "$ac_abs_confdir" = "$ac_pwd"; then + srcdir=. +fi +# Remove unnecessary trailing slashes from srcdir. +# Double slashes in file names in object file debugging info +# mess up M-x gdb in Emacs. +case $srcdir in +*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; +esac +for ac_var in $ac_precious_vars; do + eval ac_env_${ac_var}_set=\${${ac_var}+set} + eval ac_env_${ac_var}_value=\$${ac_var} + eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} + eval ac_cv_env_${ac_var}_value=\$${ac_var} +done + +# +# 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 mysqltcl 3.05 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 \`..'] + +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] + --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] + --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] + --datadir=DIR read-only architecture-independent data [DATAROOTDIR] + --infodir=DIR info documentation [DATAROOTDIR/info] + --localedir=DIR locale-dependent data [DATAROOTDIR/locale] + --mandir=DIR man documentation [DATAROOTDIR/man] + --docdir=DIR documentation root [DATAROOTDIR/doc/mysqltcl] + --htmldir=DIR html documentation [DOCDIR] + --dvidir=DIR dvi documentation [DOCDIR] + --pdfdir=DIR pdf documentation [DOCDIR] + --psdir=DIR ps documentation [DOCDIR] +_ACEOF + + cat <<\_ACEOF +_ACEOF +fi + +if test -n "$ac_init_help"; then + case $ac_init_help in + short | recursive ) echo "Configuration of mysqltcl 3.05:";; + esac + 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 (default: on) + --enable-64bit enable 64bit support (default: off) + --enable-64bit-vis enable 64bit Sparc VIS support (default: off) + --enable-wince enable Win/CE support (where applicable) + --disable-load disallow dynamic loading and "load" command + (default: enabled) + --enable-symbols build with debugging symbols (default: off) + --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 + LIBS libraries to pass to the linker, e.g. -l + CPPFLAGS C/C++/Objective 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 +ac_status=$? +fi + +if test "$ac_init_help" = "recursive"; then + # If there are subdirs, report their specific --help. + for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue + test -d "$ac_dir" || continue + ac_builddir=. + +case "$ac_dir" in +.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; +*) + ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` + # A ".." for each directory in $ac_dir_suffix. + ac_top_builddir_sub=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,/..,g;s,/,,'` + case $ac_top_builddir_sub in + "") ac_top_builddir_sub=. ac_top_build_prefix= ;; + *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; + esac ;; +esac +ac_abs_top_builddir=$ac_pwd +ac_abs_builddir=$ac_pwd$ac_dir_suffix +# for backward compatibility: +ac_top_builddir=$ac_top_build_prefix + +case $srcdir in + .) # We are building in place. + ac_srcdir=. + ac_top_srcdir=$ac_top_builddir_sub + ac_abs_top_srcdir=$ac_pwd ;; + [\\/]* | ?:[\\/]* ) # Absolute name. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir + ac_abs_top_srcdir=$srcdir ;; + *) # Relative name. + ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_build_prefix$srcdir + ac_abs_top_srcdir=$ac_pwd/$srcdir ;; +esac +ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix + + cd "$ac_dir" || { ac_status=$?; continue; } + # Check for guested 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 + else + echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 + fi || ac_status=$? + cd "$ac_pwd" || { ac_status=$?; break; } + done +fi + +test -n "$ac_init_help" && exit $ac_status +if $ac_init_version; then + cat <<\_ACEOF +mysqltcl configure 3.05 +generated by GNU Autoconf 2.61 + +Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, +2002, 2003, 2004, 2005, 2006 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 +fi +cat >config.log <<_ACEOF +This file contains any messages produced by compilers while +running configure, to aid debugging if configure makes a mistake. + +It was created by mysqltcl $as_me 3.05, which was +generated by GNU Autoconf 2.61. Invocation command line was + + $ $0 $@ + +_ACEOF +exec 5>>config.log +{ +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` +/usr/bin/hostinfo = `(/usr/bin/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 +IFS=$as_save_IFS + +} >&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_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_arg'" + ;; + 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: Use '\'' to represent an apostrophe within the trap. +# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. +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, +( + for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do + eval ac_val=\$$ac_var + case $ac_val in #( + *${as_nl}*) + case $ac_var in #( + *_cv_*) { echo "$as_me:$LINENO: WARNING: Cache variable $ac_var contains a newline." >&5 +echo "$as_me: WARNING: Cache variable $ac_var contains a newline." >&2;} ;; + esac + case $ac_var in #( + _ | IFS | as_nl) ;; #( + *) $as_unset $ac_var ;; + esac ;; + esac + done + (set) 2>&1 | + case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( + *${as_nl}ac_space=\ *) + sed -n \ + "s/'\''/'\''\\\\'\'''\''/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" + ;; #( + *) + sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" + ;; + esac | + sort +) + echo + + cat <<\_ASBOX +## ----------------- ## +## Output variables. ## +## ----------------- ## +_ASBOX + echo + for ac_var in $ac_subst_vars + do + eval ac_val=\$$ac_var + case $ac_val in + *\'\''*) ac_val=`echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; + esac + echo "$ac_var='\''$ac_val'\''" + done | sort + echo + + if test -n "$ac_subst_files"; then + cat <<\_ASBOX +## ------------------- ## +## File substitutions. ## +## ------------------- ## +_ASBOX + echo + for ac_var in $ac_subst_files + do + eval ac_val=\$$ac_var + case $ac_val in + *\'\''*) ac_val=`echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; + esac + echo "$ac_var='\''$ac_val'\''" + done | sort + echo + fi + + if test -s confdefs.h; then + cat <<\_ASBOX +## ----------- ## +## confdefs.h. ## +## ----------- ## +_ASBOX + echo + cat confdefs.h + 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.conftest.* && + rm -f -r 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 -f -r conftest* 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 -n "$CONFIG_SITE"; then + set x "$CONFIG_SITE" +elif test "x$prefix" != xNONE; then + set x "$prefix/share/config.site" "$prefix/etc/config.site" +else + set x "$ac_default_prefix/share/config.site" \ + "$ac_default_prefix/etc/config.site" +fi +shift +for ac_site_file +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 $ac_precious_vars; 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 + + + +#-------------------------------------------------------------------- +# Call TEA_INIT as the first TEA_ macro to set up initial vars. +# This will define a ${TEA_PLATFORM} variable == "unix" or "windows" +# as well as PKG_LIB_FILE and PKG_STUB_LIB_FILE. +#-------------------------------------------------------------------- + + + # TEA extensions pass this us the version of TEA they think they + # are compatible with. + TEA_VERSION="3.5" + + { 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_NAME}" = x ; then + { { echo "$as_me:$LINENO: error: +The PACKAGE_NAME variable must be defined by your TEA configure.in" >&5 +echo "$as_me: error: +The PACKAGE_NAME variable must be defined by your TEA configure.in" >&2;} + { (exit 1); exit 1; }; } + fi + if test x"3.5" = x ; then + { { echo "$as_me:$LINENO: error: +TEA version not specified." >&5 +echo "$as_me: error: +TEA version not specified." >&2;} + { (exit 1); exit 1; }; } + elif test "3.5" != "${TEA_VERSION}" ; then + { echo "$as_me:$LINENO: result: warning: requested TEA version \"3.5\", have \"${TEA_VERSION}\"" >&5 +echo "${ECHO_T}warning: requested TEA version \"3.5\", have \"${TEA_VERSION}\"" >&6; } + else + { echo "$as_me:$LINENO: result: ok (TEA ${TEA_VERSION})" >&5 +echo "${ECHO_T}ok (TEA ${TEA_VERSION})" >&6; } + fi + 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$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 +IFS=$as_save_IFS + + 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. + # Note when adjusted, so that TEA_PREFIX can correct for this. + # This is needed for recursive configures, since autoconf propagates + # $prefix, but not $exec_prefix (doh!). + if test x$exec_prefix = xNONE ; then + exec_prefix_default=yes + exec_prefix=$prefix + fi + + + + + # This package name must be replaced statically for AC_SUBST to work + + # Substitute STUB_LIB_FILE in case package creates a stub library too. + + + # We AC_SUBST these here to ensure they are subst'ed, + # in case the user doesn't call TEA_ADD_... + + + + + + + + + +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 + +# These three variables are undocumented and unsupported, +# and are intended to be withdrawn in a future Autoconf release. +# They can cause serious problems if a builder's source tree is in a directory +# whose full name contains unusual characters. +ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. +ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. +ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. + + + +#-------------------------------------------------------------------- +# Load the tclConfig.sh file +#-------------------------------------------------------------------- + + + + # + # 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 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 + case ${with_tclconfig} in + */tclConfig.sh ) + if test -f ${with_tclconfig}; then + { echo "$as_me:$LINENO: WARNING: --with-tcl argument should refer to directory containing tclConfig.sh, not to tclConfig.sh itself" >&5 +echo "$as_me: WARNING: --with-tcl argument should refer to directory containing tclConfig.sh, not to tclConfig.sh itself" >&2;} + with_tclconfig=`echo ${with_tclconfig} | sed 's!/tclConfig\.sh$!!'` + fi ;; + esac + if test -f "${with_tclconfig}/tclConfig.sh" ; then + ac_cv_c_tclconfig=`(cd ${with_tclconfig}; pwd)` + else + { { 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].[0-9]* 2>/dev/null` \ + `ls -dr ../tcl[8-9].[0-9] 2>/dev/null` \ + `ls -dr ../tcl[8-9].[0-9]* 2>/dev/null` \ + ../../tcl \ + `ls -dr ../../tcl[8-9].[0-9].[0-9]* 2>/dev/null` \ + `ls -dr ../../tcl[8-9].[0-9] 2>/dev/null` \ + `ls -dr ../../tcl[8-9].[0-9]* 2>/dev/null` \ + ../../../tcl \ + `ls -dr ../../../tcl[8-9].[0-9].[0-9]* 2>/dev/null` \ + `ls -dr ../../../tcl[8-9].[0-9] 2>/dev/null` \ + `ls -dr ../../../tcl[8-9].[0-9]* 2>/dev/null` ; do + if test -f "$i/unix/tclConfig.sh" ; then + ac_cv_c_tclconfig=`(cd $i/unix; pwd)` + break + fi + done + fi + + # on Darwin, check in Framework installation locations + if test "`uname -s`" = "Darwin" -a x"${ac_cv_c_tclconfig}" = x ; then + for i in `ls -d ~/Library/Frameworks 2>/dev/null` \ + `ls -d /Library/Frameworks 2>/dev/null` \ + `ls -d /Network/Library/Frameworks 2>/dev/null` \ + `ls -d /System/Library/Frameworks 2>/dev/null` \ + ; do + if test -f "$i/Tcl.framework/tclConfig.sh" ; then + ac_cv_c_tclconfig=`(cd $i/Tcl.framework; pwd)` + break + fi + done + fi + + # on Windows, check in common installation locations + if test "${TEA_PLATFORM}" = "windows" \ + -a x"${ac_cv_c_tclconfig}" = x ; then + for i in `ls -d C:/Tcl/lib 2>/dev/null` \ + `ls -d C:/Progra~1/Tcl/lib 2>/dev/null` \ + ; do + if test -f "$i/tclConfig.sh" ; then + ac_cv_c_tclconfig=`(cd $i; pwd)` + break + fi + done + fi + + # check in a few common install locations + if test x"${ac_cv_c_tclconfig}" = x ; then + for i in `ls -d ${libdir} 2>/dev/null` \ + `ls -d ${exec_prefix}/lib 2>/dev/null` \ + `ls -d ${prefix}/lib 2>/dev/null` \ + `ls -d /usr/local/lib 2>/dev/null` \ + `ls -d /usr/contrib/lib 2>/dev/null` \ + `ls -d /usr/lib 2>/dev/null` \ + ; do + if test -f "$i/tclConfig.sh" ; then + ac_cv_c_tclconfig=`(cd $i; pwd)` + break + fi + done + fi + + # check in a few other private locations + if test x"${ac_cv_c_tclconfig}" = x ; then + for i in \ + ${srcdir}/../tcl \ + `ls -dr ${srcdir}/../tcl[8-9].[0-9].[0-9]* 2>/dev/null` \ + `ls -dr ${srcdir}/../tcl[8-9].[0-9] 2>/dev/null` \ + `ls -dr ${srcdir}/../tcl[8-9].[0-9]* 2>/dev/null` ; do + if test -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: Can't find Tcl configuration definitions" >&5 +echo "$as_me: WARNING: Can't 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: could not find ${TCL_BIN_DIR}/tclConfig.sh" >&5 +echo "${ECHO_T}could not find ${TCL_BIN_DIR}/tclConfig.sh" >&6; } + fi + + # eval is required to do the TCL_DBGX substitution + eval "TCL_LIB_FILE=\"${TCL_LIB_FILE}\"" + eval "TCL_STUB_LIB_FILE=\"${TCL_STUB_LIB_FILE}\"" + + # If the TCL_BIN_DIR is the build directory (not the install directory), + # then set the common variable name to the value of the build variables. + # For example, the variable TCL_LIB_SPEC will be set to the value + # of TCL_BUILD_LIB_SPEC. An extension should make use of TCL_LIB_SPEC + # instead of TCL_BUILD_LIB_SPEC since it will work with both an + # installed and uninstalled version of Tcl. + if test -f ${TCL_BIN_DIR}/Makefile ; then + TCL_LIB_SPEC=${TCL_BUILD_LIB_SPEC} + TCL_STUB_LIB_SPEC=${TCL_BUILD_STUB_LIB_SPEC} + TCL_STUB_LIB_PATH=${TCL_BUILD_STUB_LIB_PATH} + elif test "`uname -s`" = "Darwin"; then + # If Tcl was built as a framework, attempt to use the libraries + # from the framework at the given location so that linking works + # against Tcl.framework installed in an arbitary location. + case ${TCL_DEFS} in + *TCL_FRAMEWORK*) + if test -f ${TCL_BIN_DIR}/${TCL_LIB_FILE}; then + for i in "`cd ${TCL_BIN_DIR}; pwd`" \ + "`cd ${TCL_BIN_DIR}/../..; pwd`"; do + if test "`basename "$i"`" = "${TCL_LIB_FILE}.framework"; then + TCL_LIB_SPEC="-F`dirname "$i"` -framework ${TCL_LIB_FILE}" + break + fi + done + fi + if test -f ${TCL_BIN_DIR}/${TCL_STUB_LIB_FILE}; then + TCL_STUB_LIB_SPEC="-L${TCL_BIN_DIR} ${TCL_STUB_LIB_FLAG}" + TCL_STUB_LIB_PATH="${TCL_BIN_DIR}/${TCL_STUB_LIB_FILE}" + fi + ;; + esac + fi + + # eval is required to do the TCL_DBGX substitution + eval "TCL_LIB_FLAG=\"${TCL_LIB_FLAG}\"" + eval "TCL_LIB_SPEC=\"${TCL_LIB_SPEC}\"" + eval "TCL_STUB_LIB_FLAG=\"${TCL_STUB_LIB_FLAG}\"" + eval "TCL_STUB_LIB_SPEC=\"${TCL_STUB_LIB_SPEC}\"" + + + + + + + + + + + + + + + + + + + + +#-------------------------------------------------------------------- +# 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. +#----------------------------------------------------------------------- + + + if test "${prefix}" = "NONE"; then + prefix_default=yes + if test x"${TCL_PREFIX}" != x; then + { echo "$as_me:$LINENO: --prefix defaulting to TCL_PREFIX ${TCL_PREFIX}" >&5 +echo "$as_me: --prefix defaulting to TCL_PREFIX ${TCL_PREFIX}" >&6;} + prefix=${TCL_PREFIX} + else + { echo "$as_me:$LINENO: --prefix defaulting to /usr/local" >&5 +echo "$as_me: --prefix defaulting to /usr/local" >&6;} + prefix=/usr/local + fi + fi + if test "${exec_prefix}" = "NONE" -a x"${prefix_default}" = x"yes" \ + -o x"${exec_prefix_default}" = x"yes" ; then + if test x"${TCL_EXEC_PREFIX}" != x; then + { echo "$as_me:$LINENO: --exec-prefix defaulting to TCL_EXEC_PREFIX ${TCL_EXEC_PREFIX}" >&5 +echo "$as_me: --exec-prefix defaulting to TCL_EXEC_PREFIX ${TCL_EXEC_PREFIX}" >&6;} + exec_prefix=${TCL_EXEC_PREFIX} + else + { echo "$as_me:$LINENO: --exec-prefix defaulting to ${prefix}" >&5 +echo "$as_me: --exec-prefix defaulting to ${prefix}" >&6;} + 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. +#----------------------------------------------------------------------- + + + # Don't put any macros that use the compiler (e.g. AC_TRY_COMPILE) + # in this macro, they need to go into TEA_SETUP_COMPILER instead. + + # 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$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 +IFS=$as_save_IFS + +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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$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 +IFS=$as_save_IFS + +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 + + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools +whose name does not start with the host triplet. If you think this +configuration is useful to you, please write to autoconf@gnu.org." >&5 +echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools +whose name does not start with the host triplet. If you think this +configuration is useful to you, please write to autoconf@gnu.org." >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$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 +IFS=$as_save_IFS + +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 +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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$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 +IFS=$as_save_IFS + +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.exe + 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$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 +IFS=$as_save_IFS + +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.exe +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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$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 +IFS=$as_save_IFS + +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 + + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools +whose name does not start with the host triplet. If you think this +configuration is useful to you, please write to autoconf@gnu.org." >&5 +echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools +whose name does not start with the host triplet. If you think this +configuration is useful to you, please write to autoconf@gnu.org." >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +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` +{ (ac_try="$ac_compiler --version >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compiler --version >&5") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } +{ (ac_try="$ac_compiler -v >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compiler -v >&5") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } +{ (ac_try="$ac_compiler -V >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&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 +/* 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 file name" >&5 +echo $ECHO_N "checking for C compiler default output file name... $ECHO_C" >&6; } +ac_link_default=`echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` +# +# List of possible output files, starting from the most likely. +# The algorithm is not robust to junk in `.', hence go to wildcards (a.*) +# only as a last resort. b.out is created by i960 compilers. +ac_files='a_out.exe a.exe conftest.exe a.out conftest a.* conftest.* b.out' +# +# The IRIX 6 linker writes into existing files which may not be +# executable, retaining their permissions. Remove them first so a +# subsequent execution test works. +ac_rmfiles= +for ac_file in $ac_files +do + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.o | *.obj ) ;; + * ) ac_rmfiles="$ac_rmfiles $ac_file";; + esac +done +rm -f $ac_rmfiles + +if { (ac_try="$ac_link_default" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link_default") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; then + # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. +# So ignore a value of `no', otherwise this would lead to `EXEEXT = no' +# in a Makefile. We should not override ac_cv_exeext if it was cached, +# so that the user can short-circuit this test for compilers unknown to +# Autoconf. +for ac_file in $ac_files '' +do + test -f "$ac_file" || continue + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.o | *.obj ) + ;; + [ab].out ) + # We found the default executable, but exeext='' is most + # certainly right. + break;; + *.* ) + if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; + then :; else + ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + fi + # We set ac_cv_exeext here because the later test for it is not + # safe: cross compilers may not add the suffix if given an `-o' + # argument, so we may need to know it at that point already. + # Even if this section looks crufty: it has the advantage of + # actually working. + break;; + * ) + break;; + esac +done +test "$ac_cv_exeext" = no && ac_cv_exeext= + +else + ac_file='' +fi + +{ echo "$as_me:$LINENO: result: $ac_file" >&5 +echo "${ECHO_T}$ac_file" >&6; } +if test -z "$ac_file"; then + 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 + +# Check that 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' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&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 that 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 { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&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 | *.map | *.inf | *.o | *.obj ) ;; + *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + 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 +/* 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 { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; then + for ac_file in conftest.o conftest.obj conftest.*; do + test -f "$ac_file" || continue; + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf ) ;; + *) 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 +/* 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 { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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 core conftest.err 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 +{ 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 + ac_save_c_werror_flag=$ac_c_werror_flag + ac_c_werror_flag=yes + ac_cv_prog_cc_g=no + CFLAGS="-g" + cat >conftest.$ac_ext <<_ACEOF +/* 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 { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_prog_cc_g=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + CFLAGS="" + cat >conftest.$ac_ext <<_ACEOF +/* 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 { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + : +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_c_werror_flag=$ac_save_c_werror_flag + CFLAGS="-g" + cat >conftest.$ac_ext <<_ACEOF +/* 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 { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_prog_cc_g=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_c_werror_flag=$ac_save_c_werror_flag +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 ISO C89" >&5 +echo $ECHO_N "checking for $CC option to accept ISO C89... $ECHO_C" >&6; } +if test "${ac_cv_prog_cc_c89+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_cv_prog_cc_c89=no +ac_save_CC=$CC +cat >conftest.$ac_ext <<_ACEOF +/* 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; +} + +/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has + function prototypes and stuff, but not '\xHH' hex character constants. + These don't provoke an error unfortunately, instead are silently treated + as 'x'. The following induces an error, until -std is added to get + proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an + array size at least. It's necessary to write '\x00'==0 to get something + that's true only with -std. */ +int osf4_cc_array ['\x00' == 0 ? 1 : -1]; + +/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters + inside strings and character constants. */ +#define FOO(x) 'x' +int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; + +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 +for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ + -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" +do + CC="$ac_save_CC $ac_arg" + rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_prog_cc_c89=$ac_arg +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + +fi + +rm -f core conftest.err conftest.$ac_objext + test "x$ac_cv_prog_cc_c89" != "xno" && break +done +rm -f conftest.$ac_ext +CC=$ac_save_CC + +fi +# AC_CACHE_VAL +case "x$ac_cv_prog_cc_c89" in + x) + { echo "$as_me:$LINENO: result: none needed" >&5 +echo "${ECHO_T}none needed" >&6; } ;; + xno) + { echo "$as_me:$LINENO: result: unsupported" >&5 +echo "${ECHO_T}unsupported" >&6; } ;; + *) + CC="$CC $ac_cv_prog_cc_c89" + { echo "$as_me:$LINENO: result: $ac_cv_prog_cc_c89" >&5 +echo "${ECHO_T}$ac_cv_prog_cc_c89" >&6; } ;; +esac + + +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_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 +/* 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 { (ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&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 && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.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 nonexistent headers + # can be detected and how. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +_ACEOF +if { (ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&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 && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.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 +/* 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 { (ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&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 && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.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 nonexistent headers + # can be detected and how. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +_ACEOF +if { (ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&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 && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.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 + + + # 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" +# OS/2's system install, which has a completely different semantic +# ./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/* | \ + ?:\\/os2\\/install\\/* | ?:\\/OS2\\/INSTALL\\/* | \ + /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 { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$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 +IFS=$as_save_IFS + + +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. Don't cache a + # value for INSTALL within a source directory, because that will + # break other packages using the cache if that directory is + # removed, or if the value is a relative name. + 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 x ${MAKE-make}; ac_make=`echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` +if { as_var=ac_cv_prog_make_${ac_make}_set; eval "test \"\${$as_var+set}\" = set"; }; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.make <<\_ACEOF +SHELL = /bin/sh +all: + @echo '@@@%%%=$(MAKE)=@@@%%%' +_ACEOF +# GNU make sometimes prints "make[1]: Entering...", which would confuse us. +case `${MAKE-make} -f conftest.make 2>/dev/null` in + *@@@%%%=?*=@@@%%%*) + eval ac_cv_prog_make_${ac_make}_set=yes;; + *) + eval ac_cv_prog_make_${ac_make}_set=no;; +esac +rm -f conftest.make +fi +if eval test \$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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$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 +IFS=$as_save_IFS + +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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$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 +IFS=$as_save_IFS + +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 + + if test "x$ac_ct_RANLIB" = x; then + RANLIB=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools +whose name does not start with the host triplet. If you think this +configuration is useful to you, please write to autoconf@gnu.org." >&5 +echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools +whose name does not start with the host triplet. If you think this +configuration is useful to you, please write to autoconf@gnu.org." >&2;} +ac_tool_warned=yes ;; +esac + RANLIB=$ac_ct_RANLIB + fi +else + RANLIB="$ac_cv_prog_RANLIB" +fi + + + #-------------------------------------------------------------------- + # Determines the correct binary file extension (.o, .obj, .exe etc.) + #-------------------------------------------------------------------- + + + + + + +{ echo "$as_me:$LINENO: checking for grep that handles long lines and -e" >&5 +echo $ECHO_N "checking for grep that handles long lines and -e... $ECHO_C" >&6; } +if test "${ac_cv_path_GREP+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + # Extract the first word of "grep ggrep" to use in msg output +if test -z "$GREP"; then +set dummy grep ggrep; ac_prog_name=$2 +if test "${ac_cv_path_GREP+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_path_GREP_found=false +# Loop through the user's path and test for each of PROGNAME-LIST +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in grep ggrep; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" + { test -f "$ac_path_GREP" && $as_test_x "$ac_path_GREP"; } || continue + # Check for GNU ac_path_GREP and select it if it is found. + # Check for GNU $ac_path_GREP +case `"$ac_path_GREP" --version 2>&1` in +*GNU*) + ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; +*) + ac_count=0 + echo $ECHO_N "0123456789$ECHO_C" >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + echo 'GREP' >> "conftest.nl" + "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + ac_count=`expr $ac_count + 1` + if test $ac_count -gt ${ac_path_GREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_GREP="$ac_path_GREP" + ac_path_GREP_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + + $ac_path_GREP_found && break 3 + done +done + +done +IFS=$as_save_IFS + + +fi + +GREP="$ac_cv_path_GREP" +if test -z "$GREP"; then + { { echo "$as_me:$LINENO: error: no acceptable $ac_prog_name could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&5 +echo "$as_me: error: no acceptable $ac_prog_name could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&2;} + { (exit 1); exit 1; }; } +fi + +else + ac_cv_path_GREP=$GREP +fi + + +fi +{ echo "$as_me:$LINENO: result: $ac_cv_path_GREP" >&5 +echo "${ECHO_T}$ac_cv_path_GREP" >&6; } + GREP="$ac_cv_path_GREP" + + +{ echo "$as_me:$LINENO: checking for egrep" >&5 +echo $ECHO_N "checking for egrep... $ECHO_C" >&6; } +if test "${ac_cv_path_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_path_EGREP="$GREP -E" + else + # Extract the first word of "egrep" to use in msg output +if test -z "$EGREP"; then +set dummy egrep; ac_prog_name=$2 +if test "${ac_cv_path_EGREP+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_path_EGREP_found=false +# Loop through the user's path and test for each of PROGNAME-LIST +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in egrep; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" + { test -f "$ac_path_EGREP" && $as_test_x "$ac_path_EGREP"; } || continue + # Check for GNU ac_path_EGREP and select it if it is found. + # Check for GNU $ac_path_EGREP +case `"$ac_path_EGREP" --version 2>&1` in +*GNU*) + ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; +*) + ac_count=0 + echo $ECHO_N "0123456789$ECHO_C" >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + echo 'EGREP' >> "conftest.nl" + "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + ac_count=`expr $ac_count + 1` + if test $ac_count -gt ${ac_path_EGREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_EGREP="$ac_path_EGREP" + ac_path_EGREP_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + + $ac_path_EGREP_found && break 3 + done +done + +done +IFS=$as_save_IFS + + +fi + +EGREP="$ac_cv_path_EGREP" +if test -z "$EGREP"; then + { { echo "$as_me:$LINENO: error: no acceptable $ac_prog_name could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&5 +echo "$as_me: error: no acceptable $ac_prog_name could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&2;} + { (exit 1); exit 1; }; } +fi + +else + ac_cv_path_EGREP=$EGREP +fi + + + fi +fi +{ echo "$as_me:$LINENO: result: $ac_cv_path_EGREP" >&5 +echo "${ECHO_T}$ac_cv_path_EGREP" >&6; } + EGREP="$ac_cv_path_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 +/* 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 { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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 core conftest.err 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 +/* 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 +/* 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 +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +#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)) + return 2; + return 0; +} +_ACEOF +rm -f conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { ac_try='./conftest$ac_exeext' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&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.conftest.* 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 { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* 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 { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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 core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +ac_res=`eval echo '${'$as_ac_Header'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&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 + + + + # Any macros that use the compiler (e.g. AC_TRY_COMPILE) have to go here. + + + #------------------------------------------------------------------------ + # 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 +/* 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 { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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 core conftest.err conftest.$ac_objext conftest.$ac_ext + fi + + #-------------------------------------------------------------------- + # Common compiler flag setup + #-------------------------------------------------------------------- + + { echo "$as_me:$LINENO: checking whether byte ordering is bigendian" >&5 +echo $ECHO_N "checking whether byte ordering is bigendian... $ECHO_C" >&6; } +if test "${ac_cv_c_bigendian+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + # See if sys/param.h defines the BYTE_ORDER macro. +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +#include + +int +main () +{ +#if ! (defined BYTE_ORDER && defined BIG_ENDIAN && defined LITTLE_ENDIAN \ + && BYTE_ORDER && BIG_ENDIAN && LITTLE_ENDIAN) + bogus endian macros +#endif + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + # It does; now see whether it defined to BIG_ENDIAN or not. +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +#include + +int +main () +{ +#if BYTE_ORDER != BIG_ENDIAN + not big endian +#endif + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_c_bigendian=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_c_bigendian=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + # It does not; compile a test program. +if test "$cross_compiling" = yes; then + # try to guess the endianness by grepping values into an object file + ac_cv_c_bigendian=unknown + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +short int ascii_mm[] = { 0x4249, 0x4765, 0x6E44, 0x6961, 0x6E53, 0x7953, 0 }; +short int ascii_ii[] = { 0x694C, 0x5454, 0x656C, 0x6E45, 0x6944, 0x6E61, 0 }; +void _ascii () { char *s = (char *) ascii_mm; s = (char *) ascii_ii; } +short int ebcdic_ii[] = { 0x89D3, 0xE3E3, 0x8593, 0x95C5, 0x89C4, 0x9581, 0 }; +short int ebcdic_mm[] = { 0xC2C9, 0xC785, 0x95C4, 0x8981, 0x95E2, 0xA8E2, 0 }; +void _ebcdic () { char *s = (char *) ebcdic_mm; s = (char *) ebcdic_ii; } +int +main () +{ + _ascii (); _ebcdic (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + if grep BIGenDianSyS conftest.$ac_objext >/dev/null ; then + ac_cv_c_bigendian=yes +fi +if grep LiTTleEnDian conftest.$ac_objext >/dev/null ; then + if test "$ac_cv_c_bigendian" = unknown; then + ac_cv_c_bigendian=no + else + # finding both strings is unlikely to happen, but who knows? + ac_cv_c_bigendian=unknown + fi +fi +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ + + /* Are we little or big endian? From Harbison&Steele. */ + union + { + long int l; + char c[sizeof (long int)]; + } u; + u.l = 1; + return u.c[sizeof (long int) - 1] == 1; + + ; + return 0; +} +_ACEOF +rm -f conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { ac_try='./conftest$ac_exeext' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_c_bigendian=no +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_c_bigendian=yes +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi + + +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ echo "$as_me:$LINENO: result: $ac_cv_c_bigendian" >&5 +echo "${ECHO_T}$ac_cv_c_bigendian" >&6; } +case $ac_cv_c_bigendian in + yes) + +cat >>confdefs.h <<\_ACEOF +#define WORDS_BIGENDIAN 1 +_ACEOF + ;; + no) + ;; + *) + { { echo "$as_me:$LINENO: error: unknown endianness +presetting ac_cv_c_bigendian=no (or yes) will help" >&5 +echo "$as_me: error: unknown endianness +presetting ac_cv_c_bigendian=no (or yes) will help" >&2;} + { (exit 1); exit 1; }; } ;; +esac + + if test "${TEA_PLATFORM}" = "unix" ; then + + #-------------------------------------------------------------------- + # 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"). + #-------------------------------------------------------------------- + + { echo "$as_me:$LINENO: checking for sin" >&5 +echo $ECHO_N "checking for sin... $ECHO_C" >&6; } +if test "${ac_cv_func_sin+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* Define sin to an innocuous variant, in case declares sin. + For example, HP-UX 11i declares gettimeofday. */ +#define sin innocuous_sin + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char sin (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef sin + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char sin (); +/* 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_sin || defined __stub___sin +choke me +#endif + +int +main () +{ +return sin (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then + ac_cv_func_sin=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_func_sin=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +fi +{ echo "$as_me:$LINENO: result: $ac_cv_func_sin" >&5 +echo "${ECHO_T}$ac_cv_func_sin" >&6; } +if test $ac_cv_func_sin = yes; then + MATH_LIBS="" +else + MATH_LIBS="-lm" +fi + + { echo "$as_me:$LINENO: checking for main in -lieee" >&5 +echo $ECHO_N "checking for main in -lieee... $ECHO_C" >&6; } +if test "${ac_cv_lib_ieee_main+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lieee $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + + +int +main () +{ +return main (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then + ac_cv_lib_ieee_main=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_lib_ieee_main=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ echo "$as_me:$LINENO: result: $ac_cv_lib_ieee_main" >&5 +echo "${ECHO_T}$ac_cv_lib_ieee_main" >&6; } +if test $ac_cv_lib_ieee_main = yes; then + MATH_LIBS="-lieee $MATH_LIBS" +fi + + + #-------------------------------------------------------------------- + # Interactive UNIX requires -linet instead of -lsocket, plus it + # needs net/errno.h to define the socket-related error codes. + #-------------------------------------------------------------------- + + { echo "$as_me:$LINENO: checking for main in -linet" >&5 +echo $ECHO_N "checking for main in -linet... $ECHO_C" >&6; } +if test "${ac_cv_lib_inet_main+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-linet $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + + +int +main () +{ +return main (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then + ac_cv_lib_inet_main=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_lib_inet_main=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ echo "$as_me:$LINENO: result: $ac_cv_lib_inet_main" >&5 +echo "${ECHO_T}$ac_cv_lib_inet_main" >&6; } +if test $ac_cv_lib_inet_main = yes; then + LIBS="$LIBS -linet" +fi + + if test "${ac_cv_header_net_errno_h+set}" = set; then + { echo "$as_me:$LINENO: checking for net/errno.h" >&5 +echo $ECHO_N "checking for net/errno.h... $ECHO_C" >&6; } +if test "${ac_cv_header_net_errno_h+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +fi +{ echo "$as_me:$LINENO: result: $ac_cv_header_net_errno_h" >&5 +echo "${ECHO_T}$ac_cv_header_net_errno_h" >&6; } +else + # Is the header compilable? +{ echo "$as_me:$LINENO: checking net/errno.h usability" >&5 +echo $ECHO_N "checking net/errno.h usability... $ECHO_C" >&6; } +cat >conftest.$ac_ext <<_ACEOF +/* 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 { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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 core conftest.err 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 net/errno.h presence" >&5 +echo $ECHO_N "checking net/errno.h presence... $ECHO_C" >&6; } +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +_ACEOF +if { (ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&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 && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.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:$ac_c_preproc_warn_flag in + yes:no: ) + { echo "$as_me:$LINENO: WARNING: net/errno.h: accepted by the compiler, rejected by the preprocessor!" >&5 +echo "$as_me: WARNING: net/errno.h: accepted by the compiler, rejected by the preprocessor!" >&2;} + { echo "$as_me:$LINENO: WARNING: net/errno.h: proceeding with the compiler's result" >&5 +echo "$as_me: WARNING: net/errno.h: proceeding with the compiler's result" >&2;} + ac_header_preproc=yes + ;; + no:yes:* ) + { echo "$as_me:$LINENO: WARNING: net/errno.h: present but cannot be compiled" >&5 +echo "$as_me: WARNING: net/errno.h: present but cannot be compiled" >&2;} + { echo "$as_me:$LINENO: WARNING: net/errno.h: check for missing prerequisite headers?" >&5 +echo "$as_me: WARNING: net/errno.h: check for missing prerequisite headers?" >&2;} + { echo "$as_me:$LINENO: WARNING: net/errno.h: see the Autoconf documentation" >&5 +echo "$as_me: WARNING: net/errno.h: see the Autoconf documentation" >&2;} + { echo "$as_me:$LINENO: WARNING: net/errno.h: section \"Present But Cannot Be Compiled\"" >&5 +echo "$as_me: WARNING: net/errno.h: section \"Present But Cannot Be Compiled\"" >&2;} + { echo "$as_me:$LINENO: WARNING: net/errno.h: proceeding with the preprocessor's result" >&5 +echo "$as_me: WARNING: net/errno.h: proceeding with the preprocessor's result" >&2;} + { echo "$as_me:$LINENO: WARNING: net/errno.h: in the future, the compiler will take precedence" >&5 +echo "$as_me: WARNING: net/errno.h: in the future, the compiler will take precedence" >&2;} + + ;; +esac +{ echo "$as_me:$LINENO: checking for net/errno.h" >&5 +echo $ECHO_N "checking for net/errno.h... $ECHO_C" >&6; } +if test "${ac_cv_header_net_errno_h+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_cv_header_net_errno_h=$ac_header_preproc +fi +{ echo "$as_me:$LINENO: result: $ac_cv_header_net_errno_h" >&5 +echo "${ECHO_T}$ac_cv_header_net_errno_h" >&6; } + +fi +if test $ac_cv_header_net_errno_h = yes; then + + +cat >>confdefs.h <<\_ACEOF +#define HAVE_NET_ERRNO_H 1 +_ACEOF + +fi + + + + #-------------------------------------------------------------------- + # 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 + { echo "$as_me:$LINENO: checking for connect" >&5 +echo $ECHO_N "checking for connect... $ECHO_C" >&6; } +if test "${ac_cv_func_connect+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* Define connect to an innocuous variant, in case declares connect. + For example, HP-UX 11i declares gettimeofday. */ +#define connect innocuous_connect + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char connect (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef connect + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char connect (); +/* 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_connect || defined __stub___connect +choke me +#endif + +int +main () +{ +return connect (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then + ac_cv_func_connect=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_func_connect=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +fi +{ echo "$as_me:$LINENO: result: $ac_cv_func_connect" >&5 +echo "${ECHO_T}$ac_cv_func_connect" >&6; } +if test $ac_cv_func_connect = yes; then + tcl_checkSocket=0 +else + tcl_checkSocket=1 +fi + + if test "$tcl_checkSocket" = 1; then + { echo "$as_me:$LINENO: checking for setsockopt" >&5 +echo $ECHO_N "checking for setsockopt... $ECHO_C" >&6; } +if test "${ac_cv_func_setsockopt+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* Define setsockopt to an innocuous variant, in case declares setsockopt. + For example, HP-UX 11i declares gettimeofday. */ +#define setsockopt innocuous_setsockopt + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char setsockopt (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef setsockopt + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char setsockopt (); +/* 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_setsockopt || defined __stub___setsockopt +choke me +#endif + +int +main () +{ +return setsockopt (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then + ac_cv_func_setsockopt=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_func_setsockopt=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +fi +{ echo "$as_me:$LINENO: result: $ac_cv_func_setsockopt" >&5 +echo "${ECHO_T}$ac_cv_func_setsockopt" >&6; } +if test $ac_cv_func_setsockopt = yes; then + : +else + { echo "$as_me:$LINENO: checking for setsockopt in -lsocket" >&5 +echo $ECHO_N "checking for setsockopt in -lsocket... $ECHO_C" >&6; } +if test "${ac_cv_lib_socket_setsockopt+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lsocket $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char setsockopt (); +int +main () +{ +return setsockopt (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then + ac_cv_lib_socket_setsockopt=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_lib_socket_setsockopt=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ echo "$as_me:$LINENO: result: $ac_cv_lib_socket_setsockopt" >&5 +echo "${ECHO_T}$ac_cv_lib_socket_setsockopt" >&6; } +if test $ac_cv_lib_socket_setsockopt = yes; then + LIBS="$LIBS -lsocket" +else + tcl_checkBoth=1 +fi + +fi + + fi + if test "$tcl_checkBoth" = 1; then + tk_oldLibs=$LIBS + LIBS="$LIBS -lsocket -lnsl" + { echo "$as_me:$LINENO: checking for accept" >&5 +echo $ECHO_N "checking for accept... $ECHO_C" >&6; } +if test "${ac_cv_func_accept+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* Define accept to an innocuous variant, in case declares accept. + For example, HP-UX 11i declares gettimeofday. */ +#define accept innocuous_accept + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char accept (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef accept + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char accept (); +/* 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_accept || defined __stub___accept +choke me +#endif + +int +main () +{ +return accept (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then + ac_cv_func_accept=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_func_accept=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +fi +{ echo "$as_me:$LINENO: result: $ac_cv_func_accept" >&5 +echo "${ECHO_T}$ac_cv_func_accept" >&6; } +if test $ac_cv_func_accept = yes; then + tcl_checkNsl=0 +else + LIBS=$tk_oldLibs +fi + + fi + { echo "$as_me:$LINENO: checking for gethostbyname" >&5 +echo $ECHO_N "checking for gethostbyname... $ECHO_C" >&6; } +if test "${ac_cv_func_gethostbyname+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* Define gethostbyname to an innocuous variant, in case declares gethostbyname. + For example, HP-UX 11i declares gettimeofday. */ +#define gethostbyname innocuous_gethostbyname + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char gethostbyname (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef gethostbyname + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char gethostbyname (); +/* 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_gethostbyname || defined __stub___gethostbyname +choke me +#endif + +int +main () +{ +return gethostbyname (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then + ac_cv_func_gethostbyname=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_func_gethostbyname=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +fi +{ echo "$as_me:$LINENO: result: $ac_cv_func_gethostbyname" >&5 +echo "${ECHO_T}$ac_cv_func_gethostbyname" >&6; } +if test $ac_cv_func_gethostbyname = yes; then + : +else + { echo "$as_me:$LINENO: checking for gethostbyname in -lnsl" >&5 +echo $ECHO_N "checking for gethostbyname in -lnsl... $ECHO_C" >&6; } +if test "${ac_cv_lib_nsl_gethostbyname+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lnsl $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char gethostbyname (); +int +main () +{ +return gethostbyname (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then + ac_cv_lib_nsl_gethostbyname=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_lib_nsl_gethostbyname=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ echo "$as_me:$LINENO: result: $ac_cv_lib_nsl_gethostbyname" >&5 +echo "${ECHO_T}$ac_cv_lib_nsl_gethostbyname" >&6; } +if test $ac_cv_lib_nsl_gethostbyname = yes; then + LIBS="$LIBS -lnsl" +fi + +fi + + + # 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}' + + + + + { echo "$as_me:$LINENO: checking dirent.h" >&5 +echo $ECHO_N "checking dirent.h... $ECHO_C" >&6; } +if test "${tcl_cv_dirent_h+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* 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 { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then + tcl_cv_dirent_h=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + tcl_cv_dirent_h=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +fi +{ echo "$as_me:$LINENO: result: $tcl_cv_dirent_h" >&5 +echo "${ECHO_T}$tcl_cv_dirent_h" >&6; } + + if test $tcl_cv_dirent_h = no; then + +cat >>confdefs.h <<\_ACEOF +#define NO_DIRENT_H 1 +_ACEOF + + fi + + 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 +/* 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 { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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 core conftest.err 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 +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +_ACEOF +if { (ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&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 && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.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:$ac_c_preproc_warn_flag 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 compiler's result" >&5 +echo "$as_me: WARNING: errno.h: proceeding with the compiler's result" >&2;} + ac_header_preproc=yes + ;; + 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: see the Autoconf documentation" >&5 +echo "$as_me: WARNING: errno.h: see the Autoconf documentation" >&2;} + { echo "$as_me:$LINENO: WARNING: errno.h: section \"Present But Cannot Be Compiled\"" >&5 +echo "$as_me: WARNING: errno.h: section \"Present But Cannot Be Compiled\"" >&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;} + { echo "$as_me:$LINENO: WARNING: errno.h: in the future, the compiler will take precedence" >&5 +echo "$as_me: WARNING: errno.h: in the future, the compiler will take precedence" >&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 +/* 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 { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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 core conftest.err 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 +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +_ACEOF +if { (ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&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 && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.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:$ac_c_preproc_warn_flag 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 compiler's result" >&5 +echo "$as_me: WARNING: float.h: proceeding with the compiler's result" >&2;} + ac_header_preproc=yes + ;; + 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: see the Autoconf documentation" >&5 +echo "$as_me: WARNING: float.h: see the Autoconf documentation" >&2;} + { echo "$as_me:$LINENO: WARNING: float.h: section \"Present But Cannot Be Compiled\"" >&5 +echo "$as_me: WARNING: float.h: section \"Present But Cannot Be Compiled\"" >&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;} + { echo "$as_me:$LINENO: WARNING: float.h: in the future, the compiler will take precedence" >&5 +echo "$as_me: WARNING: float.h: in the future, the compiler will take precedence" >&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 +/* 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 { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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 core conftest.err 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 +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +_ACEOF +if { (ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&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 && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.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:$ac_c_preproc_warn_flag 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 compiler's result" >&5 +echo "$as_me: WARNING: values.h: proceeding with the compiler's result" >&2;} + ac_header_preproc=yes + ;; + 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: see the Autoconf documentation" >&5 +echo "$as_me: WARNING: values.h: see the Autoconf documentation" >&2;} + { echo "$as_me:$LINENO: WARNING: values.h: section \"Present But Cannot Be Compiled\"" >&5 +echo "$as_me: WARNING: values.h: section \"Present But Cannot Be Compiled\"" >&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;} + { echo "$as_me:$LINENO: WARNING: values.h: in the future, the compiler will take precedence" >&5 +echo "$as_me: WARNING: values.h: in the future, the compiler will take precedence" >&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 +/* 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 { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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 core conftest.err 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 +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +_ACEOF +if { (ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&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 && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.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:$ac_c_preproc_warn_flag 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 compiler's result" >&5 +echo "$as_me: WARNING: limits.h: proceeding with the compiler's result" >&2;} + ac_header_preproc=yes + ;; + 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: see the Autoconf documentation" >&5 +echo "$as_me: WARNING: limits.h: see the Autoconf documentation" >&2;} + { echo "$as_me:$LINENO: WARNING: limits.h: section \"Present But Cannot Be Compiled\"" >&5 +echo "$as_me: WARNING: limits.h: section \"Present But Cannot Be Compiled\"" >&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;} + { echo "$as_me:$LINENO: WARNING: limits.h: in the future, the compiler will take precedence" >&5 +echo "$as_me: WARNING: limits.h: in the future, the compiler will take precedence" >&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 + +cat >>confdefs.h <<\_ACEOF +#define HAVE_LIMITS_H 1 +_ACEOF + +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 +/* 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 { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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 core conftest.err 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 +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +_ACEOF +if { (ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&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 && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.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:$ac_c_preproc_warn_flag 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 compiler's result" >&5 +echo "$as_me: WARNING: stdlib.h: proceeding with the compiler's result" >&2;} + ac_header_preproc=yes + ;; + 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: see the Autoconf documentation" >&5 +echo "$as_me: WARNING: stdlib.h: see the Autoconf documentation" >&2;} + { echo "$as_me:$LINENO: WARNING: stdlib.h: section \"Present But Cannot Be Compiled\"" >&5 +echo "$as_me: WARNING: stdlib.h: section \"Present But Cannot Be Compiled\"" >&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;} + { echo "$as_me:$LINENO: WARNING: stdlib.h: in the future, the compiler will take precedence" >&5 +echo "$as_me: WARNING: stdlib.h: in the future, the compiler will take precedence" >&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 +/* 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 +/* 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 +/* 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 +/* 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 { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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 core conftest.err 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 +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +_ACEOF +if { (ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&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 && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.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:$ac_c_preproc_warn_flag 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 compiler's result" >&5 +echo "$as_me: WARNING: string.h: proceeding with the compiler's result" >&2;} + ac_header_preproc=yes + ;; + 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: see the Autoconf documentation" >&5 +echo "$as_me: WARNING: string.h: see the Autoconf documentation" >&2;} + { echo "$as_me:$LINENO: WARNING: string.h: section \"Present But Cannot Be Compiled\"" >&5 +echo "$as_me: WARNING: string.h: section \"Present But Cannot Be Compiled\"" >&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;} + { echo "$as_me:$LINENO: WARNING: string.h: in the future, the compiler will take precedence" >&5 +echo "$as_me: WARNING: string.h: in the future, the compiler will take precedence" >&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 +/* 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 +/* 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 +/* 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 { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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 core conftest.err 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 +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +_ACEOF +if { (ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&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 && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.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:$ac_c_preproc_warn_flag 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 compiler's result" >&5 +echo "$as_me: WARNING: sys/wait.h: proceeding with the compiler's result" >&2;} + ac_header_preproc=yes + ;; + 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: see the Autoconf documentation" >&5 +echo "$as_me: WARNING: sys/wait.h: see the Autoconf documentation" >&2;} + { echo "$as_me:$LINENO: WARNING: sys/wait.h: section \"Present But Cannot Be Compiled\"" >&5 +echo "$as_me: WARNING: sys/wait.h: section \"Present But Cannot Be Compiled\"" >&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;} + { echo "$as_me:$LINENO: WARNING: sys/wait.h: in the future, the compiler will take precedence" >&5 +echo "$as_me: WARNING: sys/wait.h: in the future, the compiler will take precedence" >&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 +/* 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 { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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 core conftest.err 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 +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +_ACEOF +if { (ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&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 && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.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:$ac_c_preproc_warn_flag 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 compiler's result" >&5 +echo "$as_me: WARNING: dlfcn.h: proceeding with the compiler's result" >&2;} + ac_header_preproc=yes + ;; + 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: see the Autoconf documentation" >&5 +echo "$as_me: WARNING: dlfcn.h: see the Autoconf documentation" >&2;} + { echo "$as_me:$LINENO: WARNING: dlfcn.h: section \"Present But Cannot Be Compiled\"" >&5 +echo "$as_me: WARNING: dlfcn.h: section \"Present But Cannot Be Compiled\"" >&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;} + { echo "$as_me:$LINENO: WARNING: dlfcn.h: in the future, the compiler will take precedence" >&5 +echo "$as_me: WARNING: dlfcn.h: in the future, the compiler will take precedence" >&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 sys/param.h +do +as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + { echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +fi +ac_res=`eval echo '${'$as_ac_Header'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&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 +/* 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 { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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 core conftest.err 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 +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include <$ac_header> +_ACEOF +if { (ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&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 && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.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:$ac_c_preproc_warn_flag 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 compiler's result" >&5 +echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} + ac_header_preproc=yes + ;; + 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: see the Autoconf documentation" >&5 +echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 +echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&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;} + { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 +echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} + + ;; +esac +{ echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + eval "$as_ac_Header=\$ac_header_preproc" +fi +ac_res=`eval echo '${'$as_ac_Header'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&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 + + + # Let the user call this, because if it triggers, they will + # need a compat/strtod.c that is correct. Users can also + # use Tcl_GetDouble(FromObj) instead. + #TEA_BUGGY_STRTOD + fi + + +#----------------------------------------------------------------------- +# __CHANGE__ +# Specify the C source files to compile in TEA_ADD_SOURCES, +# public headers that need to be installed in TEA_ADD_HEADERS, +# stub library C source files to compile in TEA_ADD_STUB_SOURCES, +# and runtime Tcl library files in TEA_ADD_TCL_SOURCES. +# This defines PKG(_STUB)_SOURCES, PKG(_STUB)_OBJECTS, PKG_HEADERS +# and PKG_TCL_SOURCES. +#----------------------------------------------------------------------- + + + vars="mysqltcl.c" + for i in $vars; do + case $i in + \$*) + # allow $-var names + PKG_SOURCES="$PKG_SOURCES $i" + PKG_OBJECTS="$PKG_OBJECTS $i" + ;; + *) + # check for existence - allows for generic/win/unix VPATH + if test ! -f "${srcdir}/$i" -a ! -f "${srcdir}/generic/$i" \ + -a ! -f "${srcdir}/win/$i" -a ! -f "${srcdir}/unix/$i" \ + ; then + { { echo "$as_me:$LINENO: error: could not find source file '$i'" >&5 +echo "$as_me: error: could not find source file '$i'" >&2;} + { (exit 1); exit 1; }; } + fi + PKG_SOURCES="$PKG_SOURCES $i" + # this assumes it is in a VPATH dir + i=`basename $i` + # handle user calling this before or after TEA_SETUP_COMPILER + if test x"${OBJEXT}" != x ; then + j="`echo $i | sed -e 's/\.[^.]*$//'`.${OBJEXT}" + else + j="`echo $i | sed -e 's/\.[^.]*$//'`.\${OBJEXT}" + fi + PKG_OBJECTS="$PKG_OBJECTS $j" + ;; + esac + done + + + + + vars="" + for i in $vars; do + # check for existence, be strict because it is installed + if test ! -f "${srcdir}/$i" ; then + { { echo "$as_me:$LINENO: error: could not find header file '${srcdir}/$i'" >&5 +echo "$as_me: error: could not find header file '${srcdir}/$i'" >&2;} + { (exit 1); exit 1; }; } + fi + PKG_HEADERS="$PKG_HEADERS $i" + done + + + + vars="" + for i in $vars; do + PKG_INCLUDES="$PKG_INCLUDES $i" + done + + + + vars="" + for i in $vars; do + if test "${TEA_PLATFORM}" = "windows" -a "$GCC" = "yes" ; then + # Convert foo.lib to -lfoo for GCC. No-op if not *.lib + i=`echo "$i" | sed -e 's/^\([^-].*\)\.lib$/-l\1/i'` + fi + PKG_LIBS="$PKG_LIBS $i" + done + + + + PKG_CFLAGS="$PKG_CFLAGS " + + + + vars="" + for i in $vars; do + # check for existence - allows for generic/win/unix VPATH + if test ! -f "${srcdir}/$i" -a ! -f "${srcdir}/generic/$i" \ + -a ! -f "${srcdir}/win/$i" -a ! -f "${srcdir}/unix/$i" \ + ; then + { { echo "$as_me:$LINENO: error: could not find stub source file '$i'" >&5 +echo "$as_me: error: could not find stub source file '$i'" >&2;} + { (exit 1); exit 1; }; } + fi + PKG_STUB_SOURCES="$PKG_STUB_SOURCES $i" + # this assumes it is in a VPATH dir + i=`basename $i` + # handle user calling this before or after TEA_SETUP_COMPILER + if test x"${OBJEXT}" != x ; then + j="`echo $i | sed -e 's/\.[^.]*$//'`.${OBJEXT}" + else + j="`echo $i | sed -e 's/\.[^.]*$//'`.\${OBJEXT}" + fi + PKG_STUB_OBJECTS="$PKG_STUB_OBJECTS $j" + done + + + + + vars="" + for i in $vars; do + # check for existence, be strict because it is installed + if test ! -f "${srcdir}/$i" ; then + { { echo "$as_me:$LINENO: error: could not find tcl source file '${srcdir}/$i'" >&5 +echo "$as_me: error: could not find tcl source file '${srcdir}/$i'" >&2;} + { (exit 1); exit 1; }; } + fi + PKG_TCL_SOURCES="$PKG_TCL_SOURCES $i" + done + + + +#-------------------------------------------------------------------- +# __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. +# +# 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. +# +# TEA_ADD_* any platform specific compiler/build info here. +#-------------------------------------------------------------------- + +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" + #TEA_ADD_SOURCES([win/winFile.c]) + #TEA_ADD_INCLUDES([-I\"$(${CYGPATH} ${srcdir}/win)\"]) +else + CLEANFILES="pkgIndex.tcl" + #TEA_ADD_SOURCES([unix/unixFile.c]) + #TEA_ADD_LIBS([-lsuperfly]) +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 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 + if test "`uname -s`" = "Darwin"; then + # If Tcl was built as a framework, attempt to use + # the framework's Headers directory + case ${TCL_DEFS} in + *TCL_FRAMEWORK*) + list="`ls -d ${TCL_BIN_DIR}/Headers 2>/dev/null`" + ;; + esac + fi + + # Look in the source dir only if Tcl is not installed, + # and in that situation, look there before installed locations. + if test -f "${TCL_BIN_DIR}/Makefile" ; then + list="$list `ls -d ${TCL_SRC_DIR}/generic 2>/dev/null`" + fi + + # Check order: pkg --prefix location, Tcl's --prefix location, + # relative to directory of tclConfig.sh. + + eval "temp_includedir=${includedir}" + list="$list \ + `ls -d ${temp_includedir} 2>/dev/null` \ + `ls -d ${TCL_PREFIX}/include 2>/dev/null` \ + `ls -d ${TCL_BIN_DIR}/../include 2>/dev/null`" + if test "${TEA_PLATFORM}" != "windows" -o "$GCC" = "yes"; then + list="$list /usr/local/include /usr/include" + if test x"${TCL_INCLUDE_SPEC}" != x ; then + d=`echo "${TCL_INCLUDE_SPEC}" | sed -e 's/^-I//'` + list="$list `ls -d ${d} 2>/dev/null`" + fi + fi + for i in $list ; do + if test -f "$i/tcl.h" ; then + ac_cv_c_tclh=$i + break + fi + done + fi + +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 +#TEA_PATH_X + +#-------------------------------------------------------------------- +# Check whether --enable-threads or --disable-threads was given. +# This auto-enables if Tcl was compiled threaded. +#-------------------------------------------------------------------- + + + # Check whether --enable-threads was given. +if test "${enable_threads+set}" = set; then + enableval=$enable_threads; tcl_ok=$enableval +else + tcl_ok=yes +fi + + + if test "${enable_threads+set}" = set; then + enableval="$enable_threads" + tcl_ok=$enableval + else + tcl_ok=yes + fi + + if test "$tcl_ok" = "yes" -o "${TCL_THREADS}" = 1; then + TCL_THREADS=1 + + if test "${TEA_PLATFORM}" != "windows" ; then + # We are always OK on Windows, so check what this platform wants: + + # USE_THREAD_ALLOC tells us to try the special thread-based + # allocator that significantly reduces lock contention + +cat >>confdefs.h <<\_ACEOF +#define USE_THREAD_ALLOC 1 +_ACEOF + + +cat >>confdefs.h <<\_ACEOF +#define _REENTRANT 1 +_ACEOF + + if test "`uname -s`" = "SunOS" ; then + +cat >>confdefs.h <<\_ACEOF +#define _POSIX_PTHREAD_SEMANTICS 1 +_ACEOF + + fi + +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 +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char pthread_mutex_init (); +int +main () +{ +return pthread_mutex_init (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; 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 core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + 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 +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char __pthread_mutex_init (); +int +main () +{ +return __pthread_mutex_init (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; 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 core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + 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 +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char pthread_mutex_init (); +int +main () +{ +return pthread_mutex_init (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; 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 core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + 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 +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char pthread_mutex_init (); +int +main () +{ +return pthread_mutex_init (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; 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 core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + 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 +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char pthread_mutex_init (); +int +main () +{ +return pthread_mutex_init (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; 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 core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + 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: Do not know how to find pthread lib on your system - thread support disabled" >&5 +echo "$as_me: WARNING: Do not know how to find pthread lib on your system - thread support disabled" >&2;} + fi + fi + fi + fi + 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 (default)" >&5 +echo "${ECHO_T}yes (default)" >&6; } + else + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&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_NAME} without threads enabled, but building against Tcl + that IS thread-enabled. It is recommended to use --enable-threads." >&5 +echo "$as_me: WARNING: + Building ${PACKAGE_NAME} without threads enabled, but building against Tcl + that IS thread-enabled. It is recommended to use --enable-threads." >&2;} + fi + ;; + *) + if test "${TCL_THREADS}" = "1"; then + { echo "$as_me:$LINENO: WARNING: + --enable-threads requested, but building against a Tcl that is NOT + thread-enabled. This is an OK configuration that will also run in + a thread-enabled core." >&5 +echo "$as_me: WARNING: + --enable-threads requested, but building against a Tcl that is NOT + thread-enabled. This is an OK configuration that will also run in + a thread-enabled core." >&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 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. +#-------------------------------------------------------------------- + + + + + # Step 0.a: Enable 64 bit support? + + { echo "$as_me:$LINENO: checking if 64bit support is requested" >&5 +echo $ECHO_N "checking if 64bit support is requested... $ECHO_C" >&6; } + # Check whether --enable-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 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 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. + + + { echo "$as_me:$LINENO: checking system version" >&5 +echo $ECHO_N "checking system version... $ECHO_C" >&6; } +if test "${tcl_cv_sys_version+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + if test "${TEA_PLATFORM}" = "windows" ; then + tcl_cv_sys_version=windows + elif test -f /usr/lib/NextStep/software_version; then + tcl_cv_sys_version=NEXTSTEP-`awk '/3/,/3/' /usr/lib/NextStep/software_version` + else + tcl_cv_sys_version=`uname -s`-`uname -r` + if test "$?" -ne 0 ; then + { echo "$as_me:$LINENO: WARNING: can't find uname command" >&5 +echo "$as_me: WARNING: can't find uname command" >&2;} + tcl_cv_sys_version=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 + tcl_cv_sys_version=MP-RAS-`awk '{print }' /etc/.relid` + fi + if test "`uname -s`" = "AIX" ; then + tcl_cv_sys_version=AIX-`uname -v`.`uname -r` + fi + fi + fi + +fi +{ echo "$as_me:$LINENO: result: $tcl_cv_sys_version" >&5 +echo "${ECHO_T}$tcl_cv_sys_version" >&6; } + system=$tcl_cv_sys_version + + + # 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 +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char dlopen (); +int +main () +{ +return dlopen (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; 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 core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + 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 + + + # Require ranlib early so we can override it in special cases below. + + + + # Step 3: set configuration options based on system name and version. + # This is similar to Tcl's unix/tcl.m4 except that we've added a + # "windows" case. + + do64bit_ok=no + LDFLAGS_ORIG="$LDFLAGS" + # When ld needs options to work in 64-bit mode, put them in + # LDFLAGS_ARCH so they eventually end up in LDFLAGS even if [load] + # is disabled by the user. [Bug 1016796] + LDFLAGS_ARCH="" + TCL_EXPORT_FILE_SUFFIX="" + UNSHARED_LIB_SUFFIX="" + TCL_TRIM_DOTS='`echo ${PACKAGE_VERSION} | tr -d .`' + ECHO_VERSION='`echo ${PACKAGE_VERSION}`' + TCL_LIB_VERSIONS_OK=ok + CFLAGS_DEBUG=-g + CFLAGS_OPTIMIZE=-O + if test "$GCC" = "yes" ; then + CFLAGS_OPTIMIZE=-O2 + CFLAGS_WARNING="-Wall -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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$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 +IFS=$as_save_IFS + +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' + LD_LIBRARY_PATH_VAR="LD_LIBRARY_PATH" + 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. + # This magic is based on MS Platform SDK for Win2003 SP1 - hobbs + # MACHINE is IX86 for LINK, but this is used by the manifest, + # which requires x86|amd64|ia64. + MACHINE="X86" + if test "$do64bit" != "no" ; then + if test "x${MSSDK}x" = "xx" ; then + MSSDK="C:/Progra~1/Microsoft Platform SDK" + fi + MSSDK=`echo "$MSSDK" | sed -e 's!\\\!/!g'` + PATH64="" + case "$do64bit" in + amd64|x64|yes) + MACHINE="AMD64" ; # default to AMD64 64-bit build + PATH64="${MSSDK}/Bin/Win64/x86/AMD64" + ;; + ia64) + MACHINE="IA64" + PATH64="${MSSDK}/Bin/Win64" + ;; + esac + if test ! -d "${PATH64}" ; then + { echo "$as_me:$LINENO: WARNING: Could not find 64-bit $MACHINE SDK to enable 64bit mode" >&5 +echo "$as_me: WARNING: Could not find 64-bit $MACHINE SDK to enable 64bit mode" >&2;} + { echo "$as_me:$LINENO: WARNING: Ensure latest Platform SDK is installed" >&5 +echo "$as_me: WARNING: Ensure latest Platform SDK is installed" >&2;} + do64bit="no" + else + { echo "$as_me:$LINENO: result: Using 64-bit $MACHINE mode" >&5 +echo "${ECHO_T} Using 64-bit $MACHINE mode" >&6; } + do64bit_ok="yes" + fi + fi + + if test "$doWince" != "no" ; then + if test "$do64bit" != "no" ; 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 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 + { { 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} + CELIB_DIR=`echo "$CELIB_DIR" | sed -e 's!\\\!/!g'` + { echo "$as_me:$LINENO: result: found $CELIB_DIR" >&5 +echo "${ECHO_T}found $CELIB_DIR" >&6; } + fi + fi + + # Set defaults for common evc4/PPC2003 setup + # Currently Tcl requires 300+, possibly 420+ for sockets + CEVERSION=420; # could be 211 300 301 400 420 ... + TARGETCPU=ARMV4; # could be ARMV4 ARM MIPS SH3 X86 ... + ARCH=ARM; # could be ARM MIPS X86EM ... + PLATFORM="Pocket PC 2003"; # or "Pocket PC 2002" + if test "$doWince" != "yes"; then + # If !yes then the user specified something + # Reset ARCH to allow user to skip specifying it + ARCH= + eval `echo $doWince | awk -F, '{ \ + if (length($1)) { printf "CEVERSION=\"%s\"\n", $1; \ + if ($1 < 400) { printf "PLATFORM=\"Pocket PC 2002\"\n" } }; \ + if (length($2)) { printf "TARGETCPU=\"%s\"\n", toupper($2) }; \ + if (length($3)) { printf "ARCH=\"%s\"\n", toupper($3) }; \ + if (length($4)) { printf "PLATFORM=\"%s\"\n", $4 }; \ + }'` + if test "x${ARCH}" = "x" ; then + ARCH=$TARGETCPU; + fi + fi + OSVERSION=WCE$CEVERSION; + if test "x${WCEROOT}" = "x" ; then + WCEROOT="C:/Program Files/Microsoft eMbedded C++ 4.0" + if test ! -d "${WCEROOT}" ; then + WCEROOT="C:/Program Files/Microsoft eMbedded Tools" + fi + fi + if test "x${SDKROOT}" = "x" ; then + SDKROOT="C:/Program Files/Windows CE Tools" + if test ! -d "${SDKROOT}" ; then + SDKROOT="C:/Windows CE Tools" + fi + fi + WCEROOT=`echo "$WCEROOT" | sed -e 's!\\\!/!g'` + SDKROOT=`echo "$SDKROOT" | sed -e 's!\\\!/!g'` + if test ! -d "${SDKROOT}/${OSVERSION}/${PLATFORM}/Lib/${TARGETCPU}" \ + -o ! -d "${WCEROOT}/EVC/${OSVERSION}/bin"; then + { { echo "$as_me:$LINENO: error: could not find PocketPC SDK or target compiler to enable WinCE mode $CEVERSION,$TARGETCPU,$ARCH,$PLATFORM" >&5 +echo "$as_me: error: could not find PocketPC SDK or target compiler to enable WinCE mode $CEVERSION,$TARGETCPU,$ARCH,$PLATFORM" >&2;} + { (exit 1); exit 1; }; } + doWince="no" + else + # We could PATH_NOSPACE these, but that's not important, + # as long as we quote them when used. + CEINCLUDE="${SDKROOT}/${OSVERSION}/${PLATFORM}/include" + if test -d "${CEINCLUDE}/${TARGETCPU}" ; then + CEINCLUDE="${CEINCLUDE}/${TARGETCPU}" + fi + CELIBPATH="${SDKROOT}/${OSVERSION}/${PLATFORM}/Lib/${TARGETCPU}" + fi + fi + + if test "$GCC" != "yes" ; then + if test "${SHARED_BUILD}" = "0" ; then + runtime=-MT + else + runtime=-MD + fi + + if test "$do64bit" != "no" ; then + # All this magic is necessary for the Win64 SDK RC1 - hobbs + CC="\"${PATH64}/cl.exe\"" + CFLAGS="${CFLAGS} -I\"${MSSDK}/Include\" -I\"${MSSDK}/Include/crt\" -I\"${MSSDK}/Include/crt/sys\"" + RC="\"${MSSDK}/bin/rc.exe\"" + lflags="-nologo -MACHINE:${MACHINE} -LIBPATH:\"${MSSDK}/Lib/${MACHINE}\"" + LINKBIN="\"${PATH64}/link.exe\"" + CFLAGS_DEBUG="-nologo -Zi -Od -W3 ${runtime}d" + CFLAGS_OPTIMIZE="-nologo -O2 -W2 ${runtime}" + # Avoid 'unresolved external symbol __security_cookie' + # errors, c.f. http://support.microsoft.com/?id=894573 + + vars="bufferoverflowU.lib" + for i in $vars; do + if test "${TEA_PLATFORM}" = "windows" -a "$GCC" = "yes" ; then + # Convert foo.lib to -lfoo for GCC. No-op if not *.lib + i=`echo "$i" | sed -e 's/^\([^-].*\)\.lib$/-l\1/i'` + fi + PKG_LIBS="$PKG_LIBS $i" + done + + + elif test "$doWince" != "no" ; then + CEBINROOT="${WCEROOT}/EVC/${OSVERSION}/bin" + if test "${TARGETCPU}" = "X86"; then + CC="\"${CEBINROOT}/cl.exe\"" + else + CC="\"${CEBINROOT}/cl${ARCH}.exe\"" + fi + CFLAGS="$CFLAGS -I\"${CELIB_DIR}/inc\" -I\"${CEINCLUDE}\"" + RC="\"${WCEROOT}/Common/EVC/bin/rc.exe\"" + arch=`echo ${ARCH} | awk '{print tolower($0)}'` + defs="${ARCH} _${ARCH}_ ${arch} PALM_SIZE _MT _WINDOWS" + if test "${SHARED_BUILD}" = "1" ; then + # Static CE builds require static celib as well + defs="${defs} _DLL" + fi + for i in $defs ; do + +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" + lversion=`echo ${CEVERSION} | sed -e 's/\(.\)\(..\)/\1\.\2/'` + lflags="-MACHINE:${ARCH} -LIBPATH:\"${CELIBPATH}\" -subsystem:windowsce,${lversion} -nologo" + LINKBIN="\"${CEBINROOT}/link.exe\"" + + else + RC="rc" + lflags="-nologo" + LINKBIN="link" + CFLAGS_DEBUG="-nologo -Z7 -Od -W3 -WX ${runtime}d" + CFLAGS_OPTIMIZE="-nologo -O2 -W2 ${runtime}" + fi + fi + + if test "$GCC" = "yes"; then + # mingw gcc mode + RC="windres" + CFLAGS_DEBUG="-g" + CFLAGS_OPTIMIZE="-O2 -fomit-frame-pointer" + SHLIB_LD="$CC -shared" + UNSHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.a' + LDFLAGS_CONSOLE="-wl,--subsystem,console ${lflags}" + LDFLAGS_WINDOW="-wl,--subsystem,windows ${lflags}" + else + SHLIB_LD="${LINKBIN} -dll ${lflags}" + # link -lib only works when -lib is the first arg + STLIB_LD="${LINKBIN} -lib ${lflags}" + UNSHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.lib' + PATHTYPE=-w + # For information on what debugtype is most useful, see: + # http://msdn.microsoft.com/library/en-us/dnvc60/html/gendepdebug.asp + # 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}.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 + case "${CC}" in + *_r) + # ok ... + ;; + *) + CC=${CC}_r + ;; + esac + { 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_LD_LIBS='${LIBS}' + SHLIB_SUFFIX=".so" + + DL_OBJS="tclLoadDl.o" + LD_LIBRARY_PATH_VAR="LIBPATH" + + # 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 + CFLAGS="$CFLAGS -q64" + LDFLAGS_ARCH="-q64" + RANLIB="${RANLIB} -X64" + AR="${AR} -X64" + SHLIB_LD_FLAGS="-b64" + fi + fi + + 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 + CC_SEARCH_FLAGS='-Wl,-R,${LIB_RUNTIME_DIR}' + else + CC_SEARCH_FLAGS='-R${LIB_RUNTIME_DIR}' + fi + LD_SEARCH_FLAGS='-R ${LIB_RUNTIME_DIR}' + else + if test "$GCC" = "yes" ; then + SHLIB_LD="gcc -shared" + else + SHLIB_LD="/bin/ld -bhalt:4 -bM:SRE -bE:lib.exp -H512 -T512 -bnoentry" + fi + SHLIB_LD="${TCL_SRC_DIR}/unix/ldAix ${SHLIB_LD} ${SHLIB_LD_FLAGS}" + DL_LIBS="-ldl" + CC_SEARCH_FLAGS='-L${LIB_RUNTIME_DIR}' + LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} + TCL_NEEDS_EXP_FILE=1 + TCL_EXPORT_FILE_SUFFIX='${PACKAGE_VERSION}.exp' + fi + + # AIX v<=4.1 has some different flags than 4.2+ + if test "$system" = "AIX-4.1" -o "`uname -v`" -lt "4" ; then + case " $LIBOBJS " in + *" tclLoadAix.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS tclLoadAix.$ac_objext" + ;; +esac + + 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 +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char gettimeofday (); +int +main () +{ +return gettimeofday (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; 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 core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + 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 + ;; + BeOS*) + SHLIB_CFLAGS="-fPIC" + SHLIB_LD="${CC} -nostart" + SHLIB_LD_LIBS='${LIBS}' + SHLIB_SUFFIX=".so" + DL_OBJS="tclLoadDl.o" + DL_LIBS="-ldl" + + #----------------------------------------------------------- + # Check for inet_ntoa in -lbind, for BeOS (which also needs + # -lsocket, even if the network functions are in -lnet which + # is always linked to, for compatibility. + #----------------------------------------------------------- + { echo "$as_me:$LINENO: checking for inet_ntoa in -lbind" >&5 +echo $ECHO_N "checking for inet_ntoa in -lbind... $ECHO_C" >&6; } +if test "${ac_cv_lib_bind_inet_ntoa+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lbind $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char inet_ntoa (); +int +main () +{ +return inet_ntoa (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then + ac_cv_lib_bind_inet_ntoa=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_lib_bind_inet_ntoa=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ echo "$as_me:$LINENO: result: $ac_cv_lib_bind_inet_ntoa" >&5 +echo "${ECHO_T}$ac_cv_lib_bind_inet_ntoa" >&6; } +if test $ac_cv_lib_bind_inet_ntoa = yes; then + LIBS="$LIBS -lbind -lsocket" +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" + CC_SEARCH_FLAGS="" + 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="$LDFLAGS -export-dynamic" + CC_SEARCH_FLAGS="" + 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" + CC_SEARCH_FLAGS="" + LD_SEARCH_FLAGS="" + ;; + HP-UX-*.11.*) + # Use updated header definitions where possible + +cat >>confdefs.h <<\_ACEOF +#define _XOPEN_SOURCE_EXTENDED 1 +_ACEOF + + # Needed by Tcl, but not most extensions + #AC_DEFINE(_XOPEN_SOURCE, 1, [Do we want to use the XOPEN network library?]) + #LIBS="$LIBS -lxnet" # Use the XOPEN network library + + 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 +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char shl_load (); +int +main () +{ +return shl_load (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; 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 core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + 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="$LDFLAGS -Wl,-E" + CC_SEARCH_FLAGS='-Wl,+s,+b,${LIB_RUNTIME_DIR}:.' + LD_SEARCH_FLAGS='+s +b ${LIB_RUNTIME_DIR}:.' + LD_LIBRARY_PATH_VAR="SHLIB_PATH" + fi + if test "$GCC" = "yes" ; then + SHLIB_LD="gcc -shared" + SHLIB_LD_LIBS='${LIBS}' + LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} + fi + + # Users may want PA-RISC 1.1/2.0 portable code - needs HP cc + #CFLAGS="$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='${LIBS}' + CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' + LD_SEARCH_FLAGS=${CC_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 + CFLAGS="$CFLAGS +DD64" + LDFLAGS_ARCH="+DD64" + 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 +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char shl_load (); +int +main () +{ +return shl_load (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; 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 core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + 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="$LDFLAGS -Wl,-E" + CC_SEARCH_FLAGS='-Wl,+s,+b,${LIB_RUNTIME_DIR}:.' + LD_SEARCH_FLAGS='+s +b ${LIB_RUNTIME_DIR}:.' + LD_LIBRARY_PATH_VAR="SHLIB_PATH" + fi + ;; + IRIX-5.*) + SHLIB_CFLAGS="" + SHLIB_LD="ld -shared -rdata_shared" + SHLIB_LD_LIBS='${LIBS}' + SHLIB_SUFFIX=".so" + DL_OBJS="tclLoadDl.o" + DL_LIBS="" + CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' + LD_SEARCH_FLAGS='-rpath ${LIB_RUNTIME_DIR}' + ;; + IRIX-6.*) + SHLIB_CFLAGS="" + SHLIB_LD="ld -n32 -shared -rdata_shared" + SHLIB_LD_LIBS='${LIBS}' + SHLIB_SUFFIX=".so" + DL_OBJS="tclLoadDl.o" + DL_LIBS="" + CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' + LD_SEARCH_FLAGS='-rpath ${LIB_RUNTIME_DIR}' + if test "$GCC" = "yes" ; then + CFLAGS="$CFLAGS -mabi=n32" + LDFLAGS="$LDFLAGS -mabi=n32" + else + case $system in + IRIX-6.3) + # Use to build 6.2 compatible binaries on 6.3. + CFLAGS="$CFLAGS -n32 -D_OLD_TERMIOS" + ;; + *) + CFLAGS="$CFLAGS -n32" + ;; + esac + LDFLAGS="$LDFLAGS -n32" + 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="" + CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' + LD_SEARCH_FLAGS='-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" + CFLAGS="$CFLAGS -64" + LDFLAGS_ARCH="-64" + fi + fi + ;; + Linux*) + SHLIB_CFLAGS="-fPIC" + SHLIB_LD_LIBS='${LIBS}' + SHLIB_SUFFIX=".so" + + CFLAGS_OPTIMIZE="-O2 -fomit-frame-pointer" + # 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" + + SHLIB_LD="${CC} -shared" + DL_OBJS="tclLoadDl.o" + DL_LIBS="-ldl" + LDFLAGS="$LDFLAGS -Wl,--export-dynamic" + CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' + LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} + if test "`uname -m`" = "alpha" ; then + CFLAGS="$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"${USE_COMPAT}" != x ; then + CFLAGS="$CFLAGS -fno-inline" + fi + + ;; + GNU*) + SHLIB_CFLAGS="-fPIC" + SHLIB_LD_LIBS='${LIBS}' + SHLIB_SUFFIX=".so" + + SHLIB_LD="${CC} -shared" + DL_OBJS="" + DL_LIBS="-ldl" + LDFLAGS="$LDFLAGS -Wl,--export-dynamic" + CC_SEARCH_FLAGS="" + LD_SEARCH_FLAGS="" + if test "`uname -m`" = "alpha" ; then + CFLAGS="$CFLAGS -mieee" + fi + ;; + Lynx*) + SHLIB_CFLAGS="-fPIC" + SHLIB_LD_LIBS='${LIBS}' + SHLIB_SUFFIX=".so" + CFLAGS_OPTIMIZE=-02 + SHLIB_LD="${CC} -shared " + DL_OBJS="tclLoadDl.o" + DL_LIBS="-mshared -ldl" + LD_FLAGS="-Wl,--export-dynamic" + CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' + LD_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' + ;; + MP-RAS-02*) + SHLIB_CFLAGS="-K PIC" + SHLIB_LD="cc -G" + SHLIB_LD_LIBS="" + SHLIB_SUFFIX=".so" + DL_OBJS="tclLoadDl.o" + DL_LIBS="-ldl" + CC_SEARCH_FLAGS="" + 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="$LDFLAGS -Wl,-Bexport" + CC_SEARCH_FLAGS="" + LD_SEARCH_FLAGS="" + ;; + NetBSD-*|FreeBSD-[1-2].*) + # 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="" + CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' + LD_SEARCH_FLAGS='-rpath ${LIB_RUNTIME_DIR}' + { echo "$as_me:$LINENO: checking for ELF" >&5 +echo $ECHO_N "checking for ELF... $ECHO_C" >&6; } +if test "${tcl_cv_ld_elf+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + cat >conftest.$ac_ext <<_ACEOF +/* 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 + tcl_cv_ld_elf=yes +else + tcl_cv_ld_elf=no +fi +rm -f conftest* + +fi +{ echo "$as_me:$LINENO: result: $tcl_cv_ld_elf" >&5 +echo "${ECHO_T}$tcl_cv_ld_elf" >&6; } + if test $tcl_cv_ld_elf = yes; then + SHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.so' + else + SHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.so.1.0' + fi + + # Ancient FreeBSD doesn't handle version numbers with dots. + + UNSHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.a' + TCL_LIB_VERSIONS_OK=nodots + ;; + OpenBSD-*) + # OpenBSD/SPARC[64] needs -fPIC, -fpic will not do. + case `machine` in + sparc|sparc64) + SHLIB_CFLAGS="-fPIC";; + *) + SHLIB_CFLAGS="-fpic";; + esac + SHLIB_LD="${CC} -shared ${SHLIB_CFLAGS}" + SHLIB_LD_LIBS='${LIBS}' + SHLIB_SUFFIX=".so" + DL_OBJS="tclLoadDl.o" + DL_LIBS="" + CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' + LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} + SHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.so.1.0' + { echo "$as_me:$LINENO: checking for ELF" >&5 +echo $ECHO_N "checking for ELF... $ECHO_C" >&6; } +if test "${tcl_cv_ld_elf+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + cat >conftest.$ac_ext <<_ACEOF +/* 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 + tcl_cv_ld_elf=yes +else + tcl_cv_ld_elf=no +fi +rm -f conftest* + +fi +{ echo "$as_me:$LINENO: result: $tcl_cv_ld_elf" >&5 +echo "${ECHO_T}$tcl_cv_ld_elf" >&6; } + if test $tcl_cv_ld_elf = yes; then + LDFLAGS=-Wl,-export-dynamic + else + LDFLAGS="" + fi + + # OpenBSD doesn't do version numbers with dots. + UNSHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.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="$LDFLAGS -export-dynamic" + CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' + LD_SEARCH_FLAGS='-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//` + CFLAGS="$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}.a' + SHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.so' + TCL_LIB_VERSIONS_OK=nodots + ;; + esac + ;; + Darwin-*) + CFLAGS_OPTIMIZE="-Os" + SHLIB_CFLAGS="-fno-common" + if test $do64bit = yes; then + do64bit_ok=yes + CFLAGS="$CFLAGS -arch ppc64 -mpowerpc64 -mcpu=G5" + fi + # TEA specific: use LDFLAGS_DEFAULT instead of LDFLAGS here: + SHLIB_LD='${CC} -dynamiclib ${CFLAGS} ${LDFLAGS_DEFAULT}' + { echo "$as_me:$LINENO: checking if ld accepts -single_module flag" >&5 +echo $ECHO_N "checking if ld accepts -single_module flag... $ECHO_C" >&6; } +if test "${tcl_cv_ld_single_module+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + hold_ldflags=$LDFLAGS + LDFLAGS="$LDFLAGS -dynamiclib -Wl,-single_module" + cat >conftest.$ac_ext <<_ACEOF +/* 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 { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then + tcl_cv_ld_single_module=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + tcl_cv_ld_single_module=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext + LDFLAGS=$hold_ldflags +fi +{ echo "$as_me:$LINENO: result: $tcl_cv_ld_single_module" >&5 +echo "${ECHO_T}$tcl_cv_ld_single_module" >&6; } + if test $tcl_cv_ld_single_module = yes; then + SHLIB_LD="${SHLIB_LD} -Wl,-single_module" + fi + SHLIB_LD_LIBS='${LIBS}' + SHLIB_SUFFIX=".dylib" + DL_OBJS="tclLoadDyld.o" + DL_LIBS="" + # Don't use -prebind when building for Mac OS X 10.4 or later only: + test -z "${MACOSX_DEPLOYMENT_TARGET}" || \ + test "`echo "${MACOSX_DEPLOYMENT_TARGET}" | awk -F. '{print $2}'`" -lt 4 && \ + LDFLAGS="$LDFLAGS -prebind" + LDFLAGS="$LDFLAGS -headerpad_max_install_names" + { echo "$as_me:$LINENO: checking if ld accepts -search_paths_first flag" >&5 +echo $ECHO_N "checking if ld accepts -search_paths_first flag... $ECHO_C" >&6; } +if test "${tcl_cv_ld_search_paths_first+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + hold_ldflags=$LDFLAGS + LDFLAGS="$LDFLAGS -Wl,-search_paths_first" + cat >conftest.$ac_ext <<_ACEOF +/* 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 { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then + tcl_cv_ld_search_paths_first=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + tcl_cv_ld_search_paths_first=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext + LDFLAGS=$hold_ldflags +fi +{ echo "$as_me:$LINENO: result: $tcl_cv_ld_search_paths_first" >&5 +echo "${ECHO_T}$tcl_cv_ld_search_paths_first" >&6; } + if test $tcl_cv_ld_search_paths_first = yes; then + LDFLAGS="$LDFLAGS -Wl,-search_paths_first" + fi + CC_SEARCH_FLAGS="" + LD_SEARCH_FLAGS="" + LD_LIBRARY_PATH_VAR="DYLD_LIBRARY_PATH" + + # TEA specific: for Tk extensions, remove -arch ppc64 from CFLAGS + # for fat builds, as neither TkAqua nor TkX11 can be built for 64bit + # at present (no 64bit GUI libraries). + test $do64bit_ok = no && test -n "${TK_BIN_DIR}" && \ + CFLAGS="`echo "$CFLAGS" | sed -e 's/-arch ppc64/-arch ppc/g'`" + ;; + NEXTSTEP-*) + SHLIB_CFLAGS="" + SHLIB_LD="cc -nostdlib -r" + SHLIB_LD_LIBS="" + SHLIB_SUFFIX=".so" + DL_OBJS="tclLoadNext.o" + DL_LIBS="" + CC_SEARCH_FLAGS="" + LD_SEARCH_FLAGS="" + ;; + OS/390-*) + CFLAGS_OPTIMIZE="" # Optimizer is buggy + +cat >>confdefs.h <<\_ACEOF +#define _OE_SOCKETS 1 +_ACEOF + + ;; + 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="" + CC_SEARCH_FLAGS="" + 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="" + CC_SEARCH_FLAGS="" + 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="" + CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' + LD_SEARCH_FLAGS='-rpath ${LIB_RUNTIME_DIR}' + if test "$GCC" = "yes" ; then + CFLAGS="$CFLAGS -mieee" + else + CFLAGS="$CFLAGS -DHAVE_TZSET -std1 -ieee" + fi + # see pthread_intro(3) for pthread support on osf1, k.furukawa + if test "${TCL_THREADS}" = "1" ; then + CFLAGS="$CFLAGS -DHAVE_PTHREAD_ATTR_SETSTACKSIZE" + CFLAGS="$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 + CFLAGS="$CFLAGS -pthread" + LDFLAGS="$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="" + CC_SEARCH_FLAGS="" + LD_SEARCH_FLAGS="" + ;; + 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="$LDFLAGS -melf -Wl,-Bexport" + else + SHLIB_CFLAGS="-Kpic -belf" + LDFLAGS="$LDFLAGS -belf -Wl,-Bexport" + fi + SHLIB_LD="ld -G" + SHLIB_LD_LIBS="" + SHLIB_SUFFIX=".so" + DL_OBJS="tclLoadDl.o" + DL_LIBS="" + CC_SEARCH_FLAGS="" + 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" + CC_SEARCH_FLAGS="" + LD_SEARCH_FLAGS="" + ;; + SunOS-4*) + SHLIB_CFLAGS="-PIC" + SHLIB_LD="ld" + SHLIB_LD_LIBS="" + SHLIB_SUFFIX=".so" + DL_OBJS="tclLoadDl.o" + DL_LIBS="-ldl" + CC_SEARCH_FLAGS='-L${LIB_RUNTIME_DIR}' + LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} + + # 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}.so.1.0' + UNSHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.a' + TCL_LIB_VERSIONS_OK=nodots + ;; + SunOS-5.[0-6]) + # Careful to not let 5.10+ fall into this case + + # Note: If _REENTRANT isn't defined, then Solaris + # won't define thread-safe library routines. + + +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" + if test "$GCC" = "yes" ; then + SHLIB_LD="$CC -shared" + CC_SEARCH_FLAGS='-Wl,-R,${LIB_RUNTIME_DIR}' + LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} + else + SHLIB_LD="/usr/ccs/bin/ld -G -z text" + CC_SEARCH_FLAGS='-R ${LIB_RUNTIME_DIR}' + LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} + 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" + + # 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 + if test "`gcc -dumpversion | awk -F. '{print $1}'`" -lt "3" ; then + { echo "$as_me:$LINENO: WARNING: 64bit mode not supported with GCC < 3.2 on $system" >&5 +echo "$as_me: WARNING: 64bit mode not supported with GCC < 3.2 on $system" >&2;} + else + do64bit_ok=yes + CFLAGS="$CFLAGS -m64 -mcpu=v9" + LDFLAGS="$LDFLAGS -m64 -mcpu=v9" + SHLIB_CFLAGS="-fPIC" + fi + else + do64bit_ok=yes + if test "$do64bitVIS" = "yes" ; then + CFLAGS="$CFLAGS -xarch=v9a" + LDFLAGS_ARCH="-xarch=v9a" + else + CFLAGS="$CFLAGS -xarch=v9" + LDFLAGS_ARCH="-xarch=v9" + fi + # Solaris 64 uses this as well + #LD_LIBRARY_PATH_VAR="LD_LIBRARY_PATH_64" + fi + elif test "$arch" = "amd64 i386" ; 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 + CFLAGS="$CFLAGS -xarch=amd64" + LDFLAGS="$LDFLAGS -xarch=amd64" + fi + else + { echo "$as_me:$LINENO: WARNING: 64bit mode not supported for $arch" >&5 +echo "$as_me: WARNING: 64bit mode not supported for $arch" >&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" + CC_SEARCH_FLAGS='-Wl,-R,${LIB_RUNTIME_DIR}' + LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} + if test "$do64bit_ok" = "yes" ; then + # We need to specify -static-libgcc or we need to + # add the path to the sparv9 libgcc. + # JH: static-libgcc is necessary for core Tcl, but may + # not be necessary for extensions. + SHLIB_LD="$SHLIB_LD -m64 -mcpu=v9 -static-libgcc" + # for finding sparcv9 libgcc, get the regular libgcc + # path, remove so name and append 'sparcv9' + #v9gcclibdir="`gcc -print-file-name=libgcc_s.so` | ..." + #CC_SEARCH_FLAGS="${CC_SEARCH_FLAGS},-R,$v9gcclibdir" + fi + else + SHLIB_LD="/usr/ccs/bin/ld -G -z text" + CC_SEARCH_FLAGS='-Wl,-R,${LIB_RUNTIME_DIR}' + LD_SEARCH_FLAGS='-R ${LIB_RUNTIME_DIR}' + 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. + { echo "$as_me:$LINENO: checking for ld accepts -Bexport flag" >&5 +echo $ECHO_N "checking for ld accepts -Bexport flag... $ECHO_C" >&6; } +if test "${tcl_cv_ld_Bexport+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + hold_ldflags=$LDFLAGS + LDFLAGS="$LDFLAGS -Wl,-Bexport" + cat >conftest.$ac_ext <<_ACEOF +/* 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 { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then + tcl_cv_ld_Bexport=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + tcl_cv_ld_Bexport=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext + LDFLAGS=$hold_ldflags +fi +{ echo "$as_me:$LINENO: result: $tcl_cv_ld_Bexport" >&5 +echo "${ECHO_T}$tcl_cv_ld_Bexport" >&6; } + if test $tcl_cv_ld_Bexport = yes; then + LDFLAGS="$LDFLAGS -Wl,-Bexport" + fi + CC_SEARCH_FLAGS="" + 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: disable dynamic loading if requested via a command-line switch. + + # Check whether --enable-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="$LDFLAGS_ORIG" + CC_SEARCH_FLAGS="" + LD_SEARCH_FLAGS="" + BUILD_DLTEST="" + fi + LDFLAGS="$LDFLAGS $LDFLAGS_ARCH" + + # If we're running gcc, then change the C flags for compiling shared + # libraries to the right flags for gcc, instead of those for the + # standard manufacturer compiler. + + if test "$DL_OBJS" != "tclLoadNone.o" ; then + if test "$GCC" = "yes" ; then + case $system in + AIX-*) + ;; + BSD/OS*) + ;; + IRIX*) + ;; + NetBSD-*|FreeBSD-*) + ;; + Darwin-*) + ;; + SCO_SV-3.2*) + ;; + windows) + ;; + *) + SHLIB_CFLAGS="-fPIC" + ;; + esac + fi + fi + + if test "$SHARED_LIB_SUFFIX" = "" ; then + SHARED_LIB_SUFFIX='${PACKAGE_VERSION}${SHLIB_SUFFIX}' + fi + if test "$UNSHARED_LIB_SUFFIX" = "" ; then + UNSHARED_LIB_SUFFIX='${PACKAGE_VERSION}.a' + fi + + + + + + + + + + + + + + + + # These must be called after we do the basic CFLAGS checks and + # verify any possible 64-bit or similar switches are necessary + + { 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 +/* 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 { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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 +/* 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 { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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 core conftest.err conftest.$ac_objext conftest.$ac_ext +fi + +rm -f core conftest.err 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 +/* 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 { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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 +/* 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 { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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 core conftest.err conftest.$ac_objext conftest.$ac_ext +fi + +rm -f core conftest.err 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 "${tcl_cv_flag__largefile_source64+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +int +main () +{ +char *p = (char *)open64; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + tcl_cv_flag__largefile_source64=no +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#define _LARGEFILE_SOURCE64 1 +#include +int +main () +{ +char *p = (char *)open64; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + tcl_cv_flag__largefile_source64=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + tcl_cv_flag__largefile_source64=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi + + if test "x${tcl_cv_flag__largefile_source64}" = "xyes" ; then + +cat >>confdefs.h <<\_ACEOF +#define _LARGEFILE_SOURCE64 1 +_ACEOF + + tcl_flags="$tcl_flags _LARGEFILE_SOURCE64" + 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 + + tcl_cv_type_64bit=none + # See if the compiler knows natively about __int64 + cat >conftest.$ac_ext <<_ACEOF +/* 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 { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + tcl_type_64bit=__int64 +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + tcl_type_64bit="long long" +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + # See if we should use long anyway Note that we substitute in the + # type that is our current guess for a 64-bit type inside this check + # program, so it should be modified only carefully... + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ +switch (0) { + case 1: case (sizeof(${tcl_type_64bit})==sizeof(long)): ; + } + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + tcl_cv_type_64bit=${tcl_type_64bit} +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi + + if test "${tcl_cv_type_64bit}" = none ; then + +cat >>confdefs.h <<\_ACEOF +#define TCL_WIDE_INT_IS_LONG 1 +_ACEOF + + { echo "$as_me:$LINENO: result: using long" >&5 +echo "${ECHO_T}using long" >&6; } + elif test "${tcl_cv_type_64bit}" = "__int64" \ + -a "${TEA_PLATFORM}" = "windows" ; then + # We actually want to use the default tcl.h checks in this + # case to handle both TCL_WIDE_INT_TYPE and TCL_LL_MODIFIER* + { echo "$as_me:$LINENO: result: using Tcl header defaults" >&5 +echo "${ECHO_T}using Tcl header defaults" >&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 +/* 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 { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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 core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ echo "$as_me:$LINENO: result: $tcl_cv_struct_dirent64" >&5 +echo "${ECHO_T}$tcl_cv_struct_dirent64" >&6; } + if test "x${tcl_cv_struct_dirent64}" = "xyes" ; then + +cat >>confdefs.h <<\_ACEOF +#define HAVE_STRUCT_DIRENT64 1 +_ACEOF + + fi + + { 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 +/* 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 { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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 core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ echo "$as_me:$LINENO: result: $tcl_cv_struct_stat64" >&5 +echo "${ECHO_T}$tcl_cv_struct_stat64" >&6; } + if test "x${tcl_cv_struct_stat64}" = "xyes" ; then + +cat >>confdefs.h <<\_ACEOF +#define HAVE_STRUCT_STAT64 1 +_ACEOF + + fi + + + +for ac_func in open64 lseek64 +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 { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* Define $ac_func to an innocuous variant, in case declares $ac_func. + For example, HP-UX 11i declares gettimeofday. */ +#define $ac_func innocuous_$ac_func + +/* 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 + +#undef $ac_func + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +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 +#endif + +int +main () +{ +return $ac_func (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; 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 core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +fi +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&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 + + { 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 +/* 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 { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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 core conftest.err conftest.$ac_objext conftest.$ac_ext +fi + + if test "x${tcl_cv_type_off64_t}" = "xyes" && \ + test "x${ac_cv_func_lseek64}" = "xyes" && \ + test "x${ac_cv_func_open64}" = "xyes" ; then + +cat >>confdefs.h <<\_ACEOF +#define HAVE_TYPE_OFF64_T 1 +_ACEOF + + { echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6; } + else + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } + fi + fi + + + +#-------------------------------------------------------------------- +# Set the default compiler switches based on the --enable-symbols option. +#-------------------------------------------------------------------- + + + + { 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 was given. +if test "${enable_symbols+set}" = set; then + enableval=$enable_symbols; tcl_ok=$enableval +else + tcl_ok=no +fi + + DBGX="" + if test "$tcl_ok" = "no"; then + CFLAGS_DEFAULT="${CFLAGS_OPTIMIZE}" + LDFLAGS_DEFAULT="${LDFLAGS_OPTIMIZE}" + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } + else + CFLAGS_DEFAULT="${CFLAGS_DEBUG}" + LDFLAGS_DEFAULT="${LDFLAGS_DEBUG}" + 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 "${TEA_PLATFORM}" != "windows" ; then + LDFLAGS_DEFAULT="${LDFLAGS}" + 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, 1, [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:\$@ \$(PKG_OBJECTS)" + MAKE_SHARED_LIB="\${SHLIB_LD} \${SHLIB_LD_LIBS} \${LDFLAGS_DEFAULT} -out:\$@ \$(PKG_OBJECTS)" + MAKE_STUB_LIB="\${STLIB_LD} -out:\$@ \$(PKG_STUB_OBJECTS)" + else + MAKE_STATIC_LIB="\${STLIB_LD} \$@ \$(PKG_OBJECTS)" + MAKE_SHARED_LIB="\${SHLIB_LD} -o \$@ \$(PKG_OBJECTS) \${SHLIB_LD_LIBS}" + MAKE_STUB_LIB="\${STLIB_LD} \$@ \$(PKG_STUB_OBJECTS)" + fi + + if test "${SHARED_BUILD}" = "1" ; then + MAKE_LIB="${MAKE_SHARED_LIB} " + else + MAKE_LIB="${MAKE_STATIC_LIB} " + fi + + #-------------------------------------------------------------------- + # Shared libraries and static libraries have different names. + # Use the double eval to make sure any variables in the suffix is + # substituted. (@@@ Might not be necessary anymore) + #-------------------------------------------------------------------- + + if test "${TEA_PLATFORM}" = "windows" ; then + if test "${SHARED_BUILD}" = "1" ; then + # We force the unresolved linking of symbols that are really in + # the private libraries of Tcl and Tk. + SHLIB_LD_LIBS="${SHLIB_LD_LIBS} \"`${CYGPATH} ${TCL_BIN_DIR}/${TCL_STUB_LIB_FILE}`\"" + if test x"${TK_BIN_DIR}" != x ; then + SHLIB_LD_LIBS="${SHLIB_LD_LIBS} \"`${CYGPATH} ${TK_BIN_DIR}/${TK_STUB_LIB_FILE}`\"" + fi + eval eval "PKG_LIB_FILE=${PACKAGE_NAME}${SHARED_LIB_SUFFIX}" + else + eval eval "PKG_LIB_FILE=${PACKAGE_NAME}${UNSHARED_LIB_SUFFIX}" + fi + # Some packages build their own stubs libraries + eval eval "PKG_STUB_LIB_FILE=${PACKAGE_NAME}stub${UNSHARED_LIB_SUFFIX}" + # These aren't needed on Windows (either MSVC or gcc) + RANLIB=: + RANLIB_STUB=: + else + RANLIB_STUB="${RANLIB}" + if test "${SHARED_BUILD}" = "1" ; then + SHLIB_LD_LIBS="${SHLIB_LD_LIBS} ${TCL_STUB_LIB_SPEC}" + if test x"${TK_BIN_DIR}" != x ; then + SHLIB_LD_LIBS="${SHLIB_LD_LIBS} ${TK_STUB_LIB_SPEC}" + fi + eval eval "PKG_LIB_FILE=lib${PACKAGE_NAME}${SHARED_LIB_SUFFIX}" + RANLIB=: + else + eval eval "PKG_LIB_FILE=lib${PACKAGE_NAME}${UNSHARED_LIB_SUFFIX}" + fi + # Some packages build their own stubs libraries + eval eval "PKG_STUB_LIB_FILE=lib${PACKAGE_NAME}stub${UNSHARED_LIB_SUFFIX}" + fi + + # These are escaped so that only CFLAGS is picked up at configure time. + # The other values will be substituted at make time. + CFLAGS="${CFLAGS} \${CFLAGS_DEFAULT} \${CFLAGS_WARNING}" + if test "${SHARED_BUILD}" = "1" ; then + CFLAGS="${CFLAGS} \${SHLIB_CFLAGS}" + fi + + + + + + + + +LIBMYSQL="" + +# Check whether --with-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 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 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; } + +#-------------------------------------------------------------------- +# Determine the name of the tclsh and/or wish executables in the +# Tcl and Tk build directories or the location they were installed +# into. These paths are used to support running test cases only, +# the Makefile should not be making use of these paths to generate +# a pkgIndex.tcl file or anything else at extension build time. +#-------------------------------------------------------------------- + + + { echo "$as_me:$LINENO: checking for tclsh" >&5 +echo $ECHO_N "checking for tclsh... $ECHO_C" >&6; } + if test -f "${TCL_BIN_DIR}/Makefile" ; then + # tclConfig.sh is in Tcl build directory + if test "${TEA_PLATFORM}" = "windows"; then + TCLSH_PROG="${TCL_BIN_DIR}/tclsh${TCL_MAJOR_VERSION}${TCL_MINOR_VERSION}${TCL_DBGX}${EXEEXT}" + else + TCLSH_PROG="${TCL_BIN_DIR}/tclsh" + fi + else + # tclConfig.sh is in install location + if test "${TEA_PLATFORM}" = "windows"; then + TCLSH_PROG="tclsh${TCL_MAJOR_VERSION}${TCL_MINOR_VERSION}${TCL_DBGX}${EXEEXT}" + else + TCLSH_PROG="tclsh${TCL_MAJOR_VERSION}.${TCL_MINOR_VERSION}${TCL_DBGX}" + fi + list="`ls -d ${TCL_BIN_DIR}/../bin 2>/dev/null` \ + `ls -d ${TCL_BIN_DIR}/.. 2>/dev/null` \ + `ls -d ${TCL_PREFIX}/bin 2>/dev/null`" + for i in $list ; do + if test -f "$i/${TCLSH_PROG}" ; then + REAL_TCL_BIN_DIR="`cd "$i"; pwd`" + break + fi + done + TCLSH_PROG="${REAL_TCL_BIN_DIR}/${TCLSH_PROG}" + fi + { echo "$as_me:$LINENO: result: ${TCLSH_PROG}" >&5 +echo "${ECHO_T}${TCLSH_PROG}" >&6; } + + +#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 pkgIndex.tcl" + +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, we kill variables containing newlines. +# 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. +( + for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do + eval ac_val=\$$ac_var + case $ac_val in #( + *${as_nl}*) + case $ac_var in #( + *_cv_*) { echo "$as_me:$LINENO: WARNING: Cache variable $ac_var contains a newline." >&5 +echo "$as_me: WARNING: Cache variable $ac_var contains a newline." >&2;} ;; + esac + case $ac_var in #( + _ | IFS | as_nl) ;; #( + *) $as_unset $ac_var ;; + esac ;; + esac + done + + (set) 2>&1 | + case $as_nl`(ac_space=' '; set) 2>&1` in #( + *${as_nl}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 "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" + ;; + esac | + sort +) | + sed ' + /^ac_cv_env_/b end + t clear + :clear + s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ + t end + 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 "$as_me:$LINENO: updating cache $cache_file" >&5 +echo "$as_me: updating cache $cache_file" >&6;} + cat confcache >$cache_file + else + { echo "$as_me:$LINENO: not updating unwritable cache $cache_file" >&5 +echo "$as_me: not updating unwritable cache $cache_file" >&6;} + 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}' + +# 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 branch to the quote section. Otherwise, +# look for a macro that doesn't take arguments. +ac_script=' +t clear +:clear +s/^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*([^)]*)\)[ ]*\(.*\)/-D\1=\2/g +t quote +s/^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\)/-D\1=\2/g +t quote +b any +:quote +s/[ `~#$^&*(){}\\|;'\''"<>?]/\\&/g +s/\[/\\&/g +s/\]/\\&/g +s/\$/$$/g +H +:any +${ + g + s/^\n// + s/\n/ /g + p +} +' +DEFS=`sed -n "$ac_script" confdefs.h` + + +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_script='s/\$U\././;s/\.o$//;s/\.obj$//' + ac_i=`echo "$ac_i" | sed "$ac_script"` + # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR + # will be set to the directory where LIBOBJS objects are built. + ac_libobjs="$ac_libobjs \${LIBOBJDIR}$ac_i\$U.$ac_objext" + ac_ltlibobjs="$ac_ltlibobjs \${LIBOBJDIR}$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 more Bourne compatible +DUALCASE=1; export DUALCASE # for MKS sh +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+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in + *posix*) set -o posix ;; +esac + +fi + + + + +# PATH needs CR +# 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 + +# Support unset when possible. +if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then + as_unset=unset +else + as_unset=false +fi + + +# IFS +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent editors from complaining about space-tab. +# (If _AS_PATH_WALK were called with IFS unset, it would disable word +# splitting by setting IFS to empty value.) +as_nl=' +' +IFS=" "" $as_nl" + +# Find who we are. Look in the path if we contain no directory separator. +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 +IFS=$as_save_IFS + + ;; +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_myself: error: cannot find myself; rerun with an absolute file name" >&2 + { (exit 1); exit 1; } +fi + +# Work around bugs in pre-3.0 UWIN ksh. +for as_var in ENV MAIL MAILPATH +do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var +done +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 -z "`(eval $as_var=C; export $as_var) 2>&1`"); then + eval $as_var=C; export $as_var + else + ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var + fi +done + +# Required to use basename. +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; 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'` + +# CDPATH. +$as_unset CDPATH + + + + as_lineno_1=$LINENO + as_lineno_2=$LINENO + test "x$as_lineno_1" != "x$as_lineno_2" && + test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2" || { + + # 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 after each line using $LINENO; the second 'sed' + # does the real work. The second script uses 'N' to pair each + # line-number line with the line containing $LINENO, 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 + # scripts with optimization help from Paolo Bonzini. Blame Lee + # E. McMahon (1931-1989) for sed's syntax. :-) + sed -n ' + p + /[$]LINENO/= + ' <$as_myself | + sed ' + s/[$]LINENO.*/&-/ + t lineno + b + :lineno + N + :loop + s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ + t loop + s/-\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 sensitive to this). + . "./$as_me.lineno" + # Exit status is that of the last command. + exit +} + + +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi + +ECHO_C= ECHO_N= ECHO_T= +case `echo -n x` in +-n*) + case `echo 'x\c'` in + *c*) ECHO_T=' ';; # ECHO_T is single tab character. + *) ECHO_C='\c';; + esac;; +*) + ECHO_N='-n';; +esac + +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then + as_expr=expr +else + as_expr=false +fi + +rm -f conf$$ conf$$.exe conf$$.file +if test -d conf$$.dir; then + rm -f conf$$.dir/conf$$.file +else + rm -f conf$$.dir + mkdir conf$$.dir +fi +echo >conf$$.file +if ln -s conf$$.file conf$$ 2>/dev/null; then + as_ln_s='ln -s' + # ... but there are two gotchas: + # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. + # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. + # In both cases, we have to default to `cp -p'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || + as_ln_s='cp -p' +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$$.dir/conf$$.file conf$$.file +rmdir conf$$.dir 2>/dev/null + +if mkdir -p . 2>/dev/null; then + as_mkdir_p=: +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false +fi + +if test -x / >/dev/null 2>&1; then + as_test_x='test -x' +else + if ls -dL / >/dev/null 2>&1; then + as_ls_L_option=L + else + as_ls_L_option= + fi + as_test_x=' + eval sh -c '\'' + if test -d "$1"; then + test -d "$1/."; + else + case $1 in + -*)set "./$1";; + esac; + case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in + ???[sx]*):;;*)false;;esac;fi + '\'' sh + ' +fi +as_executable_p=$as_test_x + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="eval 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="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" + + +exec 6>&1 + +# Save the log message, to keep $[0] and so on meaningful, and to +# report actual input values of CONFIG_FILES etc. instead of their +# values after options handling. +ac_log=" +This file was extended by mysqltcl $as_me 3.05, which was +generated by GNU Autoconf 2.61. Invocation command line was + + CONFIG_FILES = $CONFIG_FILES + CONFIG_HEADERS = $CONFIG_HEADERS + CONFIG_LINKS = $CONFIG_LINKS + CONFIG_COMMANDS = $CONFIG_COMMANDS + $ $0 $@ + +on `(hostname || uname -n) 2>/dev/null | sed 1q` +" + +_ACEOF + +cat >>$CONFIG_STATUS <<_ACEOF +# Files that config.status was made for. +config_files="$ac_config_files" + +_ACEOF + +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 and configuration settings, 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="\\ +mysqltcl config.status 3.05 +configured by $0, generated by GNU Autoconf 2.61, + with options \\"`echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`\\" + +Copyright (C) 2006 Free Software Foundation, Inc. +This config.status script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it." + +ac_pwd='$ac_pwd' +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 + ;; + esac + + case $ac_option in + # Handling of the options. + -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) + ac_cs_recheck=: ;; + --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) + echo "$ac_cs_version"; exit ;; + --debug | --debu | --deb | --de | --d | -d ) + debug=: ;; + --file | --fil | --fi | --f ) + $ac_shift + CONFIG_FILES="$CONFIG_FILES $ac_optarg" + ac_need_defaults=false;; + --he | --h | --help | --hel | -h ) + echo "$ac_cs_usage"; exit ;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil | --si | --s) + ac_cs_silent=: ;; + + # This is an error. + -*) { 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" + ac_need_defaults=false ;; + + 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 CONFIG_SHELL=$SHELL $SHELL $0 "$ac_configure_args \$ac_configure_extra_args " --no-create --no-recursion" >&6 + CONFIG_SHELL=$SHELL + export CONFIG_SHELL + exec $SHELL "$0"$ac_configure_args \$ac_configure_extra_args --no-create --no-recursion +fi + +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF +exec 5>>config.log +{ + echo + sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX +## Running $as_me. ## +_ASBOX + echo "$ac_log" +} >&5 + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF + +# Handling of arguments. +for ac_config_target in $ac_config_targets +do + case $ac_config_target in + "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; + "pkgIndex.tcl") CONFIG_FILES="$CONFIG_FILES pkgIndex.tcl" ;; + + *) { { 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 against having it here, and in addition, +# creating and moving files from /tmp can sometimes cause problems. +# Hook for its removal unless debugging. +# Note that there is a small window in which the directory will not be cleaned: +# after its creation but before its name has been assigned to `$tmp'. +$debug || +{ + tmp= + trap 'exit_status=$? + { test -z "$tmp" || test ! -d "$tmp" || rm -fr "$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 "./confXXXXXX") 2>/dev/null` && + test -n "$tmp" && test -d "$tmp" +} || +{ + tmp=./conf$$-$RANDOM + (umask 077 && mkdir "$tmp") +} || +{ + echo "$me: cannot create a temporary directory in ." >&2 + { (exit 1); exit 1; } +} + +# +# Set up the sed scripts for 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 + +_ACEOF + + + +ac_delim='%!_!# ' +for ac_last_try in false false false false false :; do + cat >conf$$subs.sed <<_ACEOF +SHELL!$SHELL$ac_delim +PATH_SEPARATOR!$PATH_SEPARATOR$ac_delim +PACKAGE_NAME!$PACKAGE_NAME$ac_delim +PACKAGE_TARNAME!$PACKAGE_TARNAME$ac_delim +PACKAGE_VERSION!$PACKAGE_VERSION$ac_delim +PACKAGE_STRING!$PACKAGE_STRING$ac_delim +PACKAGE_BUGREPORT!$PACKAGE_BUGREPORT$ac_delim +exec_prefix!$exec_prefix$ac_delim +prefix!$prefix$ac_delim +program_transform_name!$program_transform_name$ac_delim +bindir!$bindir$ac_delim +sbindir!$sbindir$ac_delim +libexecdir!$libexecdir$ac_delim +datarootdir!$datarootdir$ac_delim +datadir!$datadir$ac_delim +sysconfdir!$sysconfdir$ac_delim +sharedstatedir!$sharedstatedir$ac_delim +localstatedir!$localstatedir$ac_delim +includedir!$includedir$ac_delim +oldincludedir!$oldincludedir$ac_delim +docdir!$docdir$ac_delim +infodir!$infodir$ac_delim +htmldir!$htmldir$ac_delim +dvidir!$dvidir$ac_delim +pdfdir!$pdfdir$ac_delim +psdir!$psdir$ac_delim +libdir!$libdir$ac_delim +localedir!$localedir$ac_delim +mandir!$mandir$ac_delim +DEFS!$DEFS$ac_delim +ECHO_C!$ECHO_C$ac_delim +ECHO_N!$ECHO_N$ac_delim +ECHO_T!$ECHO_T$ac_delim +LIBS!$LIBS$ac_delim +build_alias!$build_alias$ac_delim +host_alias!$host_alias$ac_delim +target_alias!$target_alias$ac_delim +CYGPATH!$CYGPATH$ac_delim +EXEEXT!$EXEEXT$ac_delim +PKG_LIB_FILE!$PKG_LIB_FILE$ac_delim +PKG_STUB_LIB_FILE!$PKG_STUB_LIB_FILE$ac_delim +PKG_STUB_SOURCES!$PKG_STUB_SOURCES$ac_delim +PKG_STUB_OBJECTS!$PKG_STUB_OBJECTS$ac_delim +PKG_TCL_SOURCES!$PKG_TCL_SOURCES$ac_delim +PKG_HEADERS!$PKG_HEADERS$ac_delim +PKG_INCLUDES!$PKG_INCLUDES$ac_delim +PKG_LIBS!$PKG_LIBS$ac_delim +PKG_CFLAGS!$PKG_CFLAGS$ac_delim +TCL_VERSION!$TCL_VERSION$ac_delim +TCL_BIN_DIR!$TCL_BIN_DIR$ac_delim +TCL_SRC_DIR!$TCL_SRC_DIR$ac_delim +TCL_LIB_FILE!$TCL_LIB_FILE$ac_delim +TCL_LIB_FLAG!$TCL_LIB_FLAG$ac_delim +TCL_LIB_SPEC!$TCL_LIB_SPEC$ac_delim +TCL_STUB_LIB_FILE!$TCL_STUB_LIB_FILE$ac_delim +TCL_STUB_LIB_FLAG!$TCL_STUB_LIB_FLAG$ac_delim +TCL_STUB_LIB_SPEC!$TCL_STUB_LIB_SPEC$ac_delim +TCL_LIBS!$TCL_LIBS$ac_delim +TCL_DEFS!$TCL_DEFS$ac_delim +TCL_EXTRA_CFLAGS!$TCL_EXTRA_CFLAGS$ac_delim +TCL_LD_FLAGS!$TCL_LD_FLAGS$ac_delim +TCL_SHLIB_LD_LIBS!$TCL_SHLIB_LD_LIBS$ac_delim +CC!$CC$ac_delim +CFLAGS!$CFLAGS$ac_delim +LDFLAGS!$LDFLAGS$ac_delim +CPPFLAGS!$CPPFLAGS$ac_delim +ac_ct_CC!$ac_ct_CC$ac_delim +OBJEXT!$OBJEXT$ac_delim +CPP!$CPP$ac_delim +INSTALL_PROGRAM!$INSTALL_PROGRAM$ac_delim +INSTALL_SCRIPT!$INSTALL_SCRIPT$ac_delim +INSTALL_DATA!$INSTALL_DATA$ac_delim +SET_MAKE!$SET_MAKE$ac_delim +RANLIB!$RANLIB$ac_delim +GREP!$GREP$ac_delim +EGREP!$EGREP$ac_delim +MATH_LIBS!$MATH_LIBS$ac_delim +PKG_SOURCES!$PKG_SOURCES$ac_delim +PKG_OBJECTS!$PKG_OBJECTS$ac_delim +CLEANFILES!$CLEANFILES$ac_delim +TCL_INCLUDES!$TCL_INCLUDES$ac_delim +TCL_THREADS!$TCL_THREADS$ac_delim +SHARED_BUILD!$SHARED_BUILD$ac_delim +AR!$AR$ac_delim +CELIB_DIR!$CELIB_DIR$ac_delim +LIBOBJS!$LIBOBJS$ac_delim +DL_LIBS!$DL_LIBS$ac_delim +CFLAGS_DEBUG!$CFLAGS_DEBUG$ac_delim +CFLAGS_OPTIMIZE!$CFLAGS_OPTIMIZE$ac_delim +CFLAGS_WARNING!$CFLAGS_WARNING$ac_delim +STLIB_LD!$STLIB_LD$ac_delim +SHLIB_LD!$SHLIB_LD$ac_delim +SHLIB_LD_LIBS!$SHLIB_LD_LIBS$ac_delim +SHLIB_CFLAGS!$SHLIB_CFLAGS$ac_delim +LD_LIBRARY_PATH_VAR!$LD_LIBRARY_PATH_VAR$ac_delim +TCL_DBGX!$TCL_DBGX$ac_delim +CFLAGS_DEFAULT!$CFLAGS_DEFAULT$ac_delim +_ACEOF + + if test `sed -n "s/.*$ac_delim\$/X/p" conf$$subs.sed | grep -c X` = 97; then + break + elif $ac_last_try; then + { { echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5 +echo "$as_me: error: could not make $CONFIG_STATUS" >&2;} + { (exit 1); exit 1; }; } + else + ac_delim="$ac_delim!$ac_delim _$ac_delim!! " + fi +done + +ac_eof=`sed -n '/^CEOF[0-9]*$/s/CEOF/0/p' conf$$subs.sed` +if test -n "$ac_eof"; then + ac_eof=`echo "$ac_eof" | sort -nru | sed 1q` + ac_eof=`expr $ac_eof + 1` +fi + +cat >>$CONFIG_STATUS <<_ACEOF +cat >"\$tmp/subs-1.sed" <<\CEOF$ac_eof +/@[a-zA-Z_][a-zA-Z_0-9]*@/!b +_ACEOF +sed ' +s/[,\\&]/\\&/g; s/@/@|#_!!_#|/g +s/^/s,@/; s/!/@,|#_!!_#|/ +:n +t n +s/'"$ac_delim"'$/,g/; t +s/$/\\/; p +N; s/^.*\n//; s/[,\\&]/\\&/g; s/@/@|#_!!_#|/g; b n +' >>$CONFIG_STATUS >$CONFIG_STATUS <<_ACEOF +CEOF$ac_eof +_ACEOF + + +ac_delim='%!_!# ' +for ac_last_try in false false false false false :; do + cat >conf$$subs.sed <<_ACEOF +LDFLAGS_DEFAULT!$LDFLAGS_DEFAULT$ac_delim +MAKE_LIB!$MAKE_LIB$ac_delim +MAKE_SHARED_LIB!$MAKE_SHARED_LIB$ac_delim +MAKE_STATIC_LIB!$MAKE_STATIC_LIB$ac_delim +MAKE_STUB_LIB!$MAKE_STUB_LIB$ac_delim +RANLIB_STUB!$RANLIB_STUB$ac_delim +LIBMYSQL!$LIBMYSQL$ac_delim +MYSQL_INCLUDES!$MYSQL_INCLUDES$ac_delim +MYSQL_LIBS!$MYSQL_LIBS$ac_delim +MYSQL_LIB_DIR!$MYSQL_LIB_DIR$ac_delim +TCLSH_PROG!$TCLSH_PROG$ac_delim +LTLIBOBJS!$LTLIBOBJS$ac_delim +_ACEOF + + if test `sed -n "s/.*$ac_delim\$/X/p" conf$$subs.sed | grep -c X` = 12; then + break + elif $ac_last_try; then + { { echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5 +echo "$as_me: error: could not make $CONFIG_STATUS" >&2;} + { (exit 1); exit 1; }; } + else + ac_delim="$ac_delim!$ac_delim _$ac_delim!! " + fi +done + +ac_eof=`sed -n '/^CEOF[0-9]*$/s/CEOF/0/p' conf$$subs.sed` +if test -n "$ac_eof"; then + ac_eof=`echo "$ac_eof" | sort -nru | sed 1q` + ac_eof=`expr $ac_eof + 1` +fi + +cat >>$CONFIG_STATUS <<_ACEOF +cat >"\$tmp/subs-2.sed" <<\CEOF$ac_eof +/@[a-zA-Z_][a-zA-Z_0-9]*@/!b end +_ACEOF +sed ' +s/[,\\&]/\\&/g; s/@/@|#_!!_#|/g +s/^/s,@/; s/!/@,|#_!!_#|/ +:n +t n +s/'"$ac_delim"'$/,g/; t +s/$/\\/; p +N; s/^.*\n//; s/[,\\&]/\\&/g; s/@/@|#_!!_#|/g; b n +' >>$CONFIG_STATUS >$CONFIG_STATUS <<_ACEOF +:end +s/|#_!!_#|//g +CEOF$ac_eof +_ACEOF + + +# 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 + +cat >>$CONFIG_STATUS <<\_ACEOF +fi # test -n "$CONFIG_FILES" + + +for ac_tag in :F $CONFIG_FILES +do + case $ac_tag in + :[FHLC]) ac_mode=$ac_tag; continue;; + esac + case $ac_mode$ac_tag in + :[FHL]*:*);; + :L* | :C*:*) { { echo "$as_me:$LINENO: error: Invalid tag $ac_tag." >&5 +echo "$as_me: error: Invalid tag $ac_tag." >&2;} + { (exit 1); exit 1; }; };; + :[FH]-) ac_tag=-:-;; + :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; + esac + ac_save_IFS=$IFS + IFS=: + set x $ac_tag + IFS=$ac_save_IFS + shift + ac_file=$1 + shift + + case $ac_mode in + :L) ac_source=$1;; + :[FH]) + ac_file_inputs= + for ac_f + do + case $ac_f in + -) ac_f="$tmp/stdin";; + *) # Look for the file first in the build tree, then in the source tree + # (if the path is not absolute). The absolute path cannot be DOS-style, + # because $ac_f cannot contain `:'. + test -f "$ac_f" || + case $ac_f in + [\\/$]*) false;; + *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; + esac || + { { echo "$as_me:$LINENO: error: cannot find input file: $ac_f" >&5 +echo "$as_me: error: cannot find input file: $ac_f" >&2;} + { (exit 1); exit 1; }; };; + esac + ac_file_inputs="$ac_file_inputs $ac_f" + done + + # 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. */ + configure_input="Generated from "`IFS=: + echo $* | sed 's|^[^:]*/||;s|:[^:]*/|, |g'`" by configure." + if test x"$ac_file" != x-; then + configure_input="$ac_file. $configure_input" + { echo "$as_me:$LINENO: creating $ac_file" >&5 +echo "$as_me: creating $ac_file" >&6;} + fi + + case $ac_tag in + *:-:* | *:-) cat >"$tmp/stdin";; + esac + ;; + esac + + ac_dir=`$as_dirname -- "$ac_file" || +$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'` + { as_dir="$ac_dir" + case $as_dir in #( + -*) as_dir=./$as_dir;; + esac + test -d "$as_dir" || { $as_mkdir_p && mkdir -p "$as_dir"; } || { + as_dirs= + while :; do + case $as_dir in #( + *\'*) as_qdir=`echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #( + *) as_qdir=$as_dir;; + esac + as_dirs="'$as_qdir' $as_dirs" + as_dir=`$as_dirname -- "$as_dir" || +$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'` + test -d "$as_dir" && break + done + test -z "$as_dirs" || eval "mkdir $as_dirs" + } || test -d "$as_dir" || { { echo "$as_me:$LINENO: error: cannot create directory $as_dir" >&5 +echo "$as_me: error: cannot create directory $as_dir" >&2;} + { (exit 1); exit 1; }; }; } + ac_builddir=. + +case "$ac_dir" in +.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; +*) + ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` + # A ".." for each directory in $ac_dir_suffix. + ac_top_builddir_sub=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,/..,g;s,/,,'` + case $ac_top_builddir_sub in + "") ac_top_builddir_sub=. ac_top_build_prefix= ;; + *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; + esac ;; +esac +ac_abs_top_builddir=$ac_pwd +ac_abs_builddir=$ac_pwd$ac_dir_suffix +# for backward compatibility: +ac_top_builddir=$ac_top_build_prefix + +case $srcdir in + .) # We are building in place. + ac_srcdir=. + ac_top_srcdir=$ac_top_builddir_sub + ac_abs_top_srcdir=$ac_pwd ;; + [\\/]* | ?:[\\/]* ) # Absolute name. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir + ac_abs_top_srcdir=$srcdir ;; + *) # Relative name. + ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_build_prefix$srcdir + ac_abs_top_srcdir=$ac_pwd/$srcdir ;; +esac +ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix + + + case $ac_mode in + :F) + # + # CONFIG_FILE + # + + case $INSTALL in + [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; + *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; + esac +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF +# If the template does not know about datarootdir, expand it. +# FIXME: This hack should be removed a few years after 2.60. +ac_datarootdir_hack=; ac_datarootdir_seen= + +case `sed -n '/datarootdir/ { + p + q +} +/@datadir@/p +/@docdir@/p +/@infodir@/p +/@localedir@/p +/@mandir@/p +' $ac_file_inputs` in +*datarootdir*) ac_datarootdir_seen=yes;; +*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) + { echo "$as_me:$LINENO: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 +echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF + ac_datarootdir_hack=' + s&@datadir@&$datadir&g + s&@docdir@&$docdir&g + s&@infodir@&$infodir&g + s&@localedir@&$localedir&g + s&@mandir@&$mandir&g + s&\\\${datarootdir}&$datarootdir&g' ;; +esac +_ACEOF + +# Neutralize VPATH when `$srcdir' = `.'. +# Shell code in configure.ac might set extrasub. +# FIXME: do we really want to maintain this feature? +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&@top_builddir@&$ac_top_builddir_sub&;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&@abs_top_builddir@&$ac_abs_top_builddir&;t t +s&@INSTALL@&$ac_INSTALL&;t t +$ac_datarootdir_hack +" $ac_file_inputs | sed -f "$tmp/subs-1.sed" | sed -f "$tmp/subs-2.sed" >$tmp/out + +test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && + { ac_out=`sed -n '/\${datarootdir}/p' "$tmp/out"`; test -n "$ac_out"; } && + { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' "$tmp/out"`; test -z "$ac_out"; } && + { echo "$as_me:$LINENO: WARNING: $ac_file contains a reference to the variable \`datarootdir' +which seems to be undefined. Please make sure it is defined." >&5 +echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' +which seems to be undefined. Please make sure it is defined." >&2;} + + rm -f "$tmp/stdin" + case $ac_file in + -) cat "$tmp/out"; rm -f "$tmp/out";; + *) rm -f "$ac_file"; mv "$tmp/out" $ac_file;; + esac + ;; + + + + esac + +done # for ac_tag + + +{ (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..4b9cffb --- /dev/null +++ b/configure.in @@ -0,0 +1,231 @@ +#!/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.46 2006/01/23 19:18:55 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__ +# Set your package name and version numbers here. +# +# This initializes the environment with PACKAGE_NAME and PACKAGE_VERSION +# set as provided. These will also be added as -D defs in your Makefile +# so you can encode the package version directly into the source files. +#----------------------------------------------------------------------- + +AC_INIT([mysqltcl], [3.05]) + +#-------------------------------------------------------------------- +# Call TEA_INIT as the first TEA_ macro to set up initial vars. +# This will define a ${TEA_PLATFORM} variable == "unix" or "windows" +# as well as PKG_LIB_FILE and PKG_STUB_LIB_FILE. +#-------------------------------------------------------------------- + +TEA_INIT([3.5]) + +AC_CONFIG_AUX_DIR(tclconfig) + +#-------------------------------------------------------------------- +# 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__ +# Specify the C source files to compile in TEA_ADD_SOURCES, +# public headers that need to be installed in TEA_ADD_HEADERS, +# stub library C source files to compile in TEA_ADD_STUB_SOURCES, +# and runtime Tcl library files in TEA_ADD_TCL_SOURCES. +# This defines PKG(_STUB)_SOURCES, PKG(_STUB)_OBJECTS, PKG_HEADERS +# and PKG_TCL_SOURCES. +#----------------------------------------------------------------------- + +TEA_ADD_SOURCES([mysqltcl.c]) +TEA_ADD_HEADERS([]) +TEA_ADD_INCLUDES([]) +TEA_ADD_LIBS([]) +TEA_ADD_CFLAGS([]) +TEA_ADD_STUB_SOURCES([]) +TEA_ADD_TCL_SOURCES([]) + +#-------------------------------------------------------------------- +# __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. +# +# 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. +# +# TEA_ADD_* any platform specific compiler/build info here. +#-------------------------------------------------------------------- + +if test "${TEA_PLATFORM}" = "windows" ; then + AC_DEFINE(BUILD_sample, 1, [Build windows export dll]) + CLEANFILES="pkgIndex.tcl *.lib *.dll *.exp *.ilk *.pdb vc*.pch" + #TEA_ADD_SOURCES([win/winFile.c]) + #TEA_ADD_INCLUDES([-I\"$(${CYGPATH} ${srcdir}/win)\"]) +else + CLEANFILES="pkgIndex.tcl" + #TEA_ADD_SOURCES([unix/unixFile.c]) + #TEA_ADD_LIBS([-lsuperfly]) +fi +AC_SUBST(CLEANFILES) + +#-------------------------------------------------------------------- +# __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 +#TEA_PATH_X + +#-------------------------------------------------------------------- +# Check whether --enable-threads or --disable-threads was given. +# This auto-enables if Tcl was compiled threaded. +#-------------------------------------------------------------------- + +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, 1, [Use Tcl stubs]) +#AC_DEFINE(USE_TK_STUBS, 1, [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 + +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]) + +#-------------------------------------------------------------------- +# Determine the name of the tclsh and/or wish executables in the +# Tcl and Tk build directories or the location they were installed +# into. These paths are used to support running test cases only, +# the Makefile should not be making use of these paths to generate +# a pkgIndex.tcl file or anything else at extension build time. +#-------------------------------------------------------------------- + +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 pkgIndex.tcl]) diff --git a/doc/man.macros b/doc/man.macros new file mode 100755 index 0000000..ae66ef9 --- /dev/null +++ b/doc/man.macros @@ -0,0 +1,236 @@ +'\" The definitions below are for supplemental macros used in Tcl/Tk +'\" manual entries. +'\" +'\" .AP type name in/out ?indent? +'\" Start paragraph describing an argument to a library procedure. +'\" type is type of argument (int, etc.), in/out is either "in", "out", +'\" or "in/out" to describe whether procedure reads or modifies arg, +'\" and indent is equivalent to second arg of .IP (shouldn't ever be +'\" needed; use .AS below instead) +'\" +'\" .AS ?type? ?name? +'\" Give maximum sizes of arguments for setting tab stops. Type and +'\" name are examples of largest possible arguments that will be passed +'\" to .AP later. If args are omitted, default tab stops are used. +'\" +'\" .BS +'\" Start box enclosure. From here until next .BE, everything will be +'\" enclosed in one large box. +'\" +'\" .BE +'\" End of box enclosure. +'\" +'\" .CS +'\" Begin code excerpt. +'\" +'\" .CE +'\" End code excerpt. +'\" +'\" .VS ?version? ?br? +'\" Begin vertical sidebar, for use in marking newly-changed parts +'\" of man pages. The first argument is ignored and used for recording +'\" the version when the .VS was added, so that the sidebars can be +'\" found and removed when they reach a certain age. If another argument +'\" is present, then a line break is forced before starting the sidebar. +'\" +'\" .VE +'\" End of vertical sidebar. +'\" +'\" .DS +'\" Begin an indented unfilled display. +'\" +'\" .DE +'\" End of indented unfilled display. +'\" +'\" .SO +'\" Start of list of standard options for a Tk widget. The +'\" options follow on successive lines, in four columns separated +'\" by tabs. +'\" +'\" .SE +'\" End of list of standard options for a Tk widget. +'\" +'\" .OP cmdName dbName dbClass +'\" Start of description of a specific option. cmdName gives the +'\" option's name as specified in the class command, dbName gives +'\" the option's name in the option database, and dbClass gives +'\" the option's class in the option database. +'\" +'\" .UL arg1 arg2 +'\" Print arg1 underlined, then print arg2 normally. +'\" +'\" RCS: @(#) $Id$ +'\" +'\" # Set up traps and other miscellaneous stuff for Tcl/Tk man pages. +.if t .wh -1.3i ^B +.nr ^l \n(.l +.ad b +'\" # Start an argument description +.de AP +.ie !"\\$4"" .TP \\$4 +.el \{\ +. ie !"\\$2"" .TP \\n()Cu +. el .TP 15 +.\} +.ta \\n()Au \\n()Bu +.ie !"\\$3"" \{\ +\&\\$1 \\fI\\$2\\fP (\\$3) +.\".b +.\} +.el \{\ +.br +.ie !"\\$2"" \{\ +\&\\$1 \\fI\\$2\\fP +.\} +.el \{\ +\&\\fI\\$1\\fP +.\} +.\} +.. +'\" # define tabbing values for .AP +.de AS +.nr )A 10n +.if !"\\$1"" .nr )A \\w'\\$1'u+3n +.nr )B \\n()Au+15n +.\" +.if !"\\$2"" .nr )B \\w'\\$2'u+\\n()Au+3n +.nr )C \\n()Bu+\\w'(in/out)'u+2n +.. +.AS Tcl_Interp Tcl_CreateInterp in/out +'\" # BS - start boxed text +'\" # ^y = starting y location +'\" # ^b = 1 +.de BS +.br +.mk ^y +.nr ^b 1u +.if n .nf +.if n .ti 0 +.if n \l'\\n(.lu\(ul' +.if n .fi +.. +'\" # BE - end boxed text (draw box now) +.de BE +.nf +.ti 0 +.mk ^t +.ie n \l'\\n(^lu\(ul' +.el \{\ +.\" Draw four-sided box normally, but don't draw top of +.\" box if the box started on an earlier page. +.ie !\\n(^b-1 \{\ +\h'-1.5n'\L'|\\n(^yu-1v'\l'\\n(^lu+3n\(ul'\L'\\n(^tu+1v-\\n(^yu'\l'|0u-1.5n\(ul' +.\} +.el \}\ +\h'-1.5n'\L'|\\n(^yu-1v'\h'\\n(^lu+3n'\L'\\n(^tu+1v-\\n(^yu'\l'|0u-1.5n\(ul' +.\} +.\} +.fi +.br +.nr ^b 0 +.. +'\" # VS - start vertical sidebar +'\" # ^Y = starting y location +'\" # ^v = 1 (for troff; for nroff this doesn't matter) +.de VS +.if !"\\$2"" .br +.mk ^Y +.ie n 'mc \s12\(br\s0 +.el .nr ^v 1u +.. +'\" # VE - end of vertical sidebar +.de VE +.ie n 'mc +.el \{\ +.ev 2 +.nf +.ti 0 +.mk ^t +\h'|\\n(^lu+3n'\L'|\\n(^Yu-1v\(bv'\v'\\n(^tu+1v-\\n(^Yu'\h'-|\\n(^lu+3n' +.sp -1 +.fi +.ev +.\} +.nr ^v 0 +.. +'\" # Special macro to handle page bottom: finish off current +'\" # box/sidebar if in box/sidebar mode, then invoked standard +'\" # page bottom macro. +.de ^B +.ev 2 +'ti 0 +'nf +.mk ^t +.if \\n(^b \{\ +.\" Draw three-sided box if this is the box's first page, +.\" draw two sides but no top otherwise. +.ie !\\n(^b-1 \h'-1.5n'\L'|\\n(^yu-1v'\l'\\n(^lu+3n\(ul'\L'\\n(^tu+1v-\\n(^yu'\h'|0u'\c +.el \h'-1.5n'\L'|\\n(^yu-1v'\h'\\n(^lu+3n'\L'\\n(^tu+1v-\\n(^yu'\h'|0u'\c +.\} +.if \\n(^v \{\ +.nr ^x \\n(^tu+1v-\\n(^Yu +\kx\h'-\\nxu'\h'|\\n(^lu+3n'\ky\L'-\\n(^xu'\v'\\n(^xu'\h'|0u'\c +.\} +.bp +'fi +.ev +.if \\n(^b \{\ +.mk ^y +.nr ^b 2 +.\} +.if \\n(^v \{\ +.mk ^Y +.\} +.. +'\" # DS - begin display +.de DS +.RS +.nf +.sp +.. +'\" # DE - end display +.de DE +.fi +.RE +.sp +.. +'\" # SO - start of list of standard options +.de SO +.SH "STANDARD OPTIONS" +.LP +.nf +.ta 4c 8c 12c +.ft B +.. +'\" # SE - end of list of standard options +.de SE +.fi +.ft R +.LP +See the \\fBoptions\\fR manual entry for details on the standard options. +.. +'\" # OP - start of full description for a single option +.de OP +.LP +.nf +.ta 4c +Command-Line Name: \\fB\\$1\\fR +Database Name: \\fB\\$2\\fR +Database Class: \\fB\\$3\\fR +.fi +.IP +.. +'\" # CS - begin code excerpt +.de CS +.RS +.nf +.ta .25i .5i .75i 1i +.. +'\" # CE - end code excerpt +.de CE +.fi +.RE +.. +.de UL +\\$1\l'|0\(ul'\\$2 +.. diff --git a/doc/man.tcl b/doc/man.tcl new file mode 100755 index 0000000..09dc12d --- /dev/null +++ b/doc/man.tcl @@ -0,0 +1,26 @@ +# 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 + +set file [open man.macros r] +set manmacros [string trim [read $file]] +close $file + +::doctools::new dl2 -file mysqltcl.man -format nroff +set file [open mysqltcl.n w] +set filein [open mysqltcl.man] +set data [dl2 format [read $filein]] +set data [string map [list {.so man.macros} $manmacros] $data] +puts $file $data +close $filein +close $file + + diff --git a/doc/mysqltcl.html b/doc/mysqltcl.html new file mode 100755 index 0000000..de5f120 --- /dev/null +++ b/doc/mysqltcl.html @@ -0,0 +1,907 @@ + + +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
::mysql::encoding handle ?encoding?
+

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. + +

+
-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. + +

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

+
-sslkey string
+is the pathname to the key file. +Used if -ssl is true + +

+
-sslcert string
+is the pathname to the certificate file. +Used if -ssl is true + +

+
-sslca string
+is the pathname to the certificate authority file. +Used if -ssl is true + +

+
-sslcapath string
+is the pathname to a directory that contains trusted SSL CA certificates in pem format. +Used if -ssl is true + +

+
-sslcipher string
+is a list of allowable ciphers to use for SSL encryption. +Used if -ssl is true + +
+ +
::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 + +

 
+% ::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 returns the number of affected rows (DELETE, UPDATE). +In case of multiple statement ::mysql::exec returns a list of number of affected rows. +

+ +

+
::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. +

 
+::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 friends. +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. +

 
+%::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. + +

+
serverversion
+Returns the version number of the server as a string. + +

+
serverversionid
+Returns the version number of the server as an integer. + +

+
sqlstate
+Returns a string containing the SQLSTATE error code for the last error. +The error code consists of five characters. '00000' means ``no error.'' +The values are specified by ANSI SQL and ODBC. + +Note that not all MySQL errors are yet mapped to SQLSTATE's. +The value 'HY000' (general error) is used for unmapped errors. + +

+
state
+Returns a character string containing information similar to that provided by the mysqladmin status command. +This includes uptime in seconds and the number of running threads, questions, reloads, and open tables. + +
+ +
::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 a known problem with Tcl, especially with DB interaction. +The mysql "varchar" type has two valid blank values, NULL and an empty +string. This is where the problem arises; Tcl is not able to differentiate +between the two because of the way it handles strings. +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. +

 
+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. + +

+
::mysql::encoding handle ?encoding?
+ +Ask or change a encoding of connection. +There are special encoding "binary" for binary data transfers. + +
+ +

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 100755 index 0000000..d01058d --- /dev/null +++ b/doc/mysqltcl.man @@ -0,0 +1,754 @@ +[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 -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. + +[opt_def -ssl [arg boolean]] +Switch to SSL after handshake. Default is false + +[opt_def -sslkey [arg string]] +is the pathname to the key file. +Used if -ssl is true + +[opt_def -sslcert [arg string]] +is the pathname to the certificate file. +Used if -ssl is true + +[opt_def -sslca [arg string]] +is the pathname to the certificate authority file. +Used if -ssl is true + +[opt_def -sslcapath [arg string]] +is the pathname to a directory that contains trusted SSL CA certificates in pem format. +Used if -ssl is true + +[opt_def -sslcipher [arg string]] +is a list of allowable ciphers to use for SSL encryption. +Used if -ssl is true + +[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 + +[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 returns the number of affected rows (DELETE, UPDATE). +In case of multiple statement ::mysql::exec returns a list of number of affected rows. +[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. +[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 friends. +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. +[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. + +[opt_def serverversion] +Returns the version number of the server as a string. + +[opt_def serverversionid] +Returns the version number of the server as an integer. + +[opt_def sqlstate] +Returns a string containing the SQLSTATE error code for the last error. +The error code consists of five characters. '00000' means ``no error.'' +The values are specified by ANSI SQL and ODBC. + +Note that not all MySQL errors are yet mapped to SQLSTATE's. +The value 'HY000' (general error) is used for unmapped errors. + +[opt_def state] +Returns a character string containing information similar to that provided by the mysqladmin status command. +This includes uptime in seconds and the number of running threads, questions, reloads, and open tables. + +[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 a known problem with Tcl, especially with DB interaction. +The mysql "varchar" type has two valid blank values, NULL and an empty +string. This is where the problem arises; Tcl is not able to differentiate +between the two because of the way it handles strings. +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. + +[call [cmd ::mysql::encoding] [arg handle] [opt encoding]] +Ask or change a encoding of connection. +There are special encoding "binary" for binary data transfers. + +[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 100755 index 0000000..4a68c58 --- /dev/null +++ b/doc/mysqltcl.n @@ -0,0 +1,1011 @@ +'\" +'\" Generated from file 'mysqltcl.man' by tcllib/doctools with format 'nroff' +'\" +'\" -*- tcl -*- mysqltcl manpage +'\" The definitions below are for supplemental macros used in Tcl/Tk +'\" manual entries. +'\" +'\" .AP type name in/out ?indent? +'\" Start paragraph describing an argument to a library procedure. +'\" type is type of argument (int, etc.), in/out is either "in", "out", +'\" or "in/out" to describe whether procedure reads or modifies arg, +'\" and indent is equivalent to second arg of .IP (shouldn't ever be +'\" needed; use .AS below instead) +'\" +'\" .AS ?type? ?name? +'\" Give maximum sizes of arguments for setting tab stops. Type and +'\" name are examples of largest possible arguments that will be passed +'\" to .AP later. If args are omitted, default tab stops are used. +'\" +'\" .BS +'\" Start box enclosure. From here until next .BE, everything will be +'\" enclosed in one large box. +'\" +'\" .BE +'\" End of box enclosure. +'\" +'\" .CS +'\" Begin code excerpt. +'\" +'\" .CE +'\" End code excerpt. +'\" +'\" .VS ?version? ?br? +'\" Begin vertical sidebar, for use in marking newly-changed parts +'\" of man pages. The first argument is ignored and used for recording +'\" the version when the .VS was added, so that the sidebars can be +'\" found and removed when they reach a certain age. If another argument +'\" is present, then a line break is forced before starting the sidebar. +'\" +'\" .VE +'\" End of vertical sidebar. +'\" +'\" .DS +'\" Begin an indented unfilled display. +'\" +'\" .DE +'\" End of indented unfilled display. +'\" +'\" .SO +'\" Start of list of standard options for a Tk widget. The +'\" options follow on successive lines, in four columns separated +'\" by tabs. +'\" +'\" .SE +'\" End of list of standard options for a Tk widget. +'\" +'\" .OP cmdName dbName dbClass +'\" Start of description of a specific option. cmdName gives the +'\" option's name as specified in the class command, dbName gives +'\" the option's name in the option database, and dbClass gives +'\" the option's class in the option database. +'\" +'\" .UL arg1 arg2 +'\" Print arg1 underlined, then print arg2 normally. +'\" +'\" RCS: @(#) $Id$ +'\" +'\" # Set up traps and other miscellaneous stuff for Tcl/Tk man pages. +.if t .wh -1.3i ^B +.nr ^l \n(.l +.ad b +'\" # Start an argument description +.de AP +.ie !"\\$4"" .TP \\$4 +.el \{\ +. ie !"\\$2"" .TP \\n()Cu +. el .TP 15 +.\} +.ta \\n()Au \\n()Bu +.ie !"\\$3"" \{\ +\&\\$1 \\fI\\$2\\fP (\\$3) +.\".b +.\} +.el \{\ +.br +.ie !"\\$2"" \{\ +\&\\$1 \\fI\\$2\\fP +.\} +.el \{\ +\&\\fI\\$1\\fP +.\} +.\} +.. +'\" # define tabbing values for .AP +.de AS +.nr )A 10n +.if !"\\$1"" .nr )A \\w'\\$1'u+3n +.nr )B \\n()Au+15n +.\" +.if !"\\$2"" .nr )B \\w'\\$2'u+\\n()Au+3n +.nr )C \\n()Bu+\\w'(in/out)'u+2n +.. +.AS Tcl_Interp Tcl_CreateInterp in/out +'\" # BS - start boxed text +'\" # ^y = starting y location +'\" # ^b = 1 +.de BS +.br +.mk ^y +.nr ^b 1u +.if n .nf +.if n .ti 0 +.if n \l'\\n(.lu\(ul' +.if n .fi +.. +'\" # BE - end boxed text (draw box now) +.de BE +.nf +.ti 0 +.mk ^t +.ie n \l'\\n(^lu\(ul' +.el \{\ +.\" Draw four-sided box normally, but don't draw top of +.\" box if the box started on an earlier page. +.ie !\\n(^b-1 \{\ +\h'-1.5n'\L'|\\n(^yu-1v'\l'\\n(^lu+3n\(ul'\L'\\n(^tu+1v-\\n(^yu'\l'|0u-1.5n\(ul' +.\} +.el \}\ +\h'-1.5n'\L'|\\n(^yu-1v'\h'\\n(^lu+3n'\L'\\n(^tu+1v-\\n(^yu'\l'|0u-1.5n\(ul' +.\} +.\} +.fi +.br +.nr ^b 0 +.. +'\" # VS - start vertical sidebar +'\" # ^Y = starting y location +'\" # ^v = 1 (for troff; for nroff this doesn't matter) +.de VS +.if !"\\$2"" .br +.mk ^Y +.ie n 'mc \s12\(br\s0 +.el .nr ^v 1u +.. +'\" # VE - end of vertical sidebar +.de VE +.ie n 'mc +.el \{\ +.ev 2 +.nf +.ti 0 +.mk ^t +\h'|\\n(^lu+3n'\L'|\\n(^Yu-1v\(bv'\v'\\n(^tu+1v-\\n(^Yu'\h'-|\\n(^lu+3n' +.sp -1 +.fi +.ev +.\} +.nr ^v 0 +.. +'\" # Special macro to handle page bottom: finish off current +'\" # box/sidebar if in box/sidebar mode, then invoked standard +'\" # page bottom macro. +.de ^B +.ev 2 +'ti 0 +'nf +.mk ^t +.if \\n(^b \{\ +.\" Draw three-sided box if this is the box's first page, +.\" draw two sides but no top otherwise. +.ie !\\n(^b-1 \h'-1.5n'\L'|\\n(^yu-1v'\l'\\n(^lu+3n\(ul'\L'\\n(^tu+1v-\\n(^yu'\h'|0u'\c +.el \h'-1.5n'\L'|\\n(^yu-1v'\h'\\n(^lu+3n'\L'\\n(^tu+1v-\\n(^yu'\h'|0u'\c +.\} +.if \\n(^v \{\ +.nr ^x \\n(^tu+1v-\\n(^Yu +\kx\h'-\\nxu'\h'|\\n(^lu+3n'\ky\L'-\\n(^xu'\v'\\n(^xu'\h'|0u'\c +.\} +.bp +'fi +.ev +.if \\n(^b \{\ +.mk ^y +.nr ^b 2 +.\} +.if \\n(^v \{\ +.mk ^Y +.\} +.. +'\" # DS - begin display +.de DS +.RS +.nf +.sp +.. +'\" # DE - end display +.de DE +.fi +.RE +.sp +.. +'\" # SO - start of list of standard options +.de SO +.SH "STANDARD OPTIONS" +.LP +.nf +.ta 4c 8c 12c +.ft B +.. +'\" # SE - end of list of standard options +.de SE +.fi +.ft R +.LP +See the \\fBoptions\\fR manual entry for details on the standard options. +.. +'\" # OP - start of full description for a single option +.de OP +.LP +.nf +.ta 4c +Command-Line Name: \\fB\\$1\\fR +Database Name: \\fB\\$2\\fR +Database Class: \\fB\\$3\\fR +.fi +.IP +.. +'\" # CS - begin code excerpt +.de CS +.RS +.nf +.ta .25i .5i .75i 1i +.. +'\" # CE - end code excerpt +.de CE +.fi +.RE +.. +.de UL +\\$1\l'|0\(ul'\\$2 +.. +.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 +\fB::mysql::encoding\fR \fIhandle\fR ?encoding? +.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-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. +.TP +\fB-ssl\fR \fIboolean\fR +Switch to SSL after handshake. Default is false +.TP +\fB-sslkey\fR \fIstring\fR +is the pathname to the key file. +Used if -ssl is true +.TP +\fB-sslcert\fR \fIstring\fR +is the pathname to the certificate file. +Used if -ssl is true +.TP +\fB-sslca\fR \fIstring\fR +is the pathname to the certificate authority file. +Used if -ssl is true +.TP +\fB-sslcapath\fR \fIstring\fR +is the pathname to a directory that contains trusted SSL CA certificates in pem format. +Used if -ssl is true +.TP +\fB-sslcipher\fR \fIstring\fR +is a list of allowable ciphers to use for SSL encryption. +Used if -ssl is true +.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 +.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 returns the number of affected rows (DELETE, UPDATE). +In case of multiple statement ::mysql::exec returns a list of number of affected rows. +.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. +.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 friends. +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. +.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. +.TP +\fBserverversion\fR +Returns the version number of the server as a string. +.TP +\fBserverversionid\fR +Returns the version number of the server as an integer. +.TP +\fBsqlstate\fR +Returns a string containing the SQLSTATE error code for the last error. +The error code consists of five characters. '00000' means ``no error.'' +The values are specified by ANSI SQL and ODBC. +Note that not all MySQL errors are yet mapped to SQLSTATE's. +The value 'HY000' (general error) is used for unmapped errors. +.TP +\fBstate\fR +Returns a character string containing information similar to that provided by the mysqladmin status command. +This includes uptime in seconds and the number of running threads, questions, reloads, and open tables. +.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 a known problem with Tcl, especially with DB interaction. +The mysql "varchar" type has two valid blank values, NULL and an empty +string. This is where the problem arises; Tcl is not able to differentiate +between the two because of the way it handles strings. +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. +.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. +.TP +\fB::mysql::encoding\fR \fIhandle\fR ?encoding? +Ask or change a encoding of connection. +There are special encoding "binary" for binary data transfers. +.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 100755 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 100755 index 0000000..cd79a07 --- /dev/null +++ b/generic/mysqltcl.c @@ -0,0 +1,2757 @@ +/* + * $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 PACKAGE_VERSION "3.04" +#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" + +#define FUNCTION_NOT_AVAILABLE "function not available" + +/* 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; + + 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)); +} + +/* + * free result from handle and consume left result of multresult statement + */ +static void freeResult(MysqlTclHandle *handle) +{ + MYSQL_RES* result; + if (handle->result != NULL) { + mysql_free_result(handle->result); + handle->result = NULL ; + } +#if (MYSQL_VERSION_ID >= 50000) + while (!mysql_next_result(handle->connection)) { + result = mysql_store_result(handle->connection); + if (result) { + mysql_free_result(result); + } + } +#endif +} + +/* + *---------------------------------------------------------------------- + * 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) +{ + freeResult(handle); + 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) +{ + 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); +#if MYSQL_VERSION_ID >= 50000 + case MYSQL_TYPE_NEWDECIMAL: + return Tcl_NewStringObj("newdecimal", -1); + case MYSQL_TYPE_GEOMETRY: + return Tcl_NewStringObj("geometry", -1); + case MYSQL_TYPE_BIT: + return Tcl_NewStringObj("bit", -1); +#endif + default: + return Tcl_NewStringObj("unknown", -1); + } + 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", +#if (MYSQL_VERSION_ID >= 40107) + "-multistatement","-multiresult", +#endif + "-localfiles","-ignorespace","-foundrows","-interactive","-sslkey","-sslcert", + "-sslca","-sslcapath","-sslciphers",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; + +#if (MYSQL_VERSION_ID >= 40107) + int isSSL = 0; +#endif + char *sslkey = NULL; + char *sslcert = NULL; + char *sslca = NULL; + char *sslcapath = NULL; + char *sslcipher = 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, +#if (MYSQL_VERSION_ID >= 40107) + MYSQL_MULTISTATEMENT_OPT,MYSQL_MULTIRESULT_OPT, +#endif + MYSQL_LOCALFILES_OPT,MYSQL_IGNORESPACE_OPT, + MYSQL_FOUNDROWS_OPT,MYSQL_INTERACTIVE_OPT,MYSQL_SSLKEY_OPT,MYSQL_SSLCERT_OPT, + MYSQL_SSLCA_OPT,MYSQL_SSLCAPATH_OPT,MYSQL_SSLCIPHERS_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 (MYSQL_VERSION_ID >= 40107) + if (Tcl_GetBooleanFromObj(interp,objv[++i],&isSSL) != TCL_OK ) + return TCL_ERROR; +#else + if (Tcl_GetBooleanFromObj(interp,objv[++i],&booleanflag) != TCL_OK ) + return TCL_ERROR; + if (booleanflag) + flags |= CLIENT_SSL; +#endif + 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; +#if (MYSQL_VERSION_ID >= 40107) + 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; +#endif + 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; + case MYSQL_SSLKEY_OPT: + sslkey = Tcl_GetStringFromObj(objv[++i],NULL); + break; + case MYSQL_SSLCERT_OPT: + sslcert = Tcl_GetStringFromObj(objv[++i],NULL); + break; + case MYSQL_SSLCA_OPT: + sslca = Tcl_GetStringFromObj(objv[++i],NULL); + break; + case MYSQL_SSLCAPATH_OPT: + sslcapath = Tcl_GetStringFromObj(objv[++i],NULL); + break; + case MYSQL_SSLCIPHERS_OPT: + sslcipher = Tcl_GetStringFromObj(objv[++i],NULL); + 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_VERSION_ID >= 40107) + if (isSSL) { + mysql_ssl_set(handle->connection,sslkey,sslcert, sslca, sslcapath, sslcipher); + } +#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) { + mysql_prim_confl(interp,objc,objv,"database name too long"); + return TCL_ERROR; + } + + 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. */ + freeResult(handle); + + 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 { + freeResult(handle); + } + 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; + Tcl_Obj *resList; + if ((handle = mysql_prologue(interp, objc, objv, 3, 3, CL_CONN,"handle sql-statement")) == 0) + return TCL_ERROR; + + /* Flush any previous result. */ + freeResult(handle); + + 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; + +#if (MYSQL_VERSION_ID >= 50000) + if (!mysql_next_result(handle->connection)) { + resList = Tcl_GetObjResult(interp); + Tcl_ListObjAppendElement(interp, resList, Tcl_NewIntObj(affected)); + do { + if ((affected=mysql_affected_rows(handle->connection)) < 0) affected=0; + Tcl_ListObjAppendElement(interp, resList, Tcl_NewIntObj(affected)); + } while (!mysql_next_result(handle->connection)); + return TCL_OK; + } +#endif + 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 *tempObj,*varNameObj; + 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_ListObjLength(interp, objv[2], &listObjc) != 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]) { + tempObj = getRowCellAsObject(statePtr,handle,row,lengths[idx]); + if (Tcl_ListObjIndex(interp, objv[2], idx, &varNameObj) != TCL_OK) + goto error; + if (Tcl_ObjSetVar2 (interp,varNameObj,NULL,tempObj,0) == NULL) + goto 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 ; +error: + Tcl_Free((char *)val); + return TCL_ERROR; +} + +/* + *---------------------------------------------------------------------- + * + * 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=0; + int count=0; + + MysqlTclHandle *handle; + int idx; + int listObjc; + Tcl_Obj *tempObj,*varNameObj; + 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_ListObjLength(interp, objv[3], &listObjc) != TCL_OK) + return TCL_ERROR; + + freeResult(handle); + + 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_ListObjIndex(interp, objv[3], idx, &varNameObj)!=TCL_OK) { + Tcl_Free((char *)val); + return TCL_ERROR; + } + tempObj = getRowCellAsObject(statePtr,handle,row,lengths[idx]); + if (Tcl_ObjSetVar2 (interp,varNameObj,NULL,tempObj,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", +#if (MYSQL_VERSION_ID >= 40107) + "serverversionid","sqlstate", +#endif + "state",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,MYSQL_INFO_STATE + }; + + /* 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: +#if (MYSQL_VERSION_ID >= 40107) + case MYSQL_INFO_SERVERVERSION_ID: + case MYSQL_INFO_SQLSTATE: +#endif + case MYSQL_INFO_STATE: + 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; +#if (MYSQL_VERSION_ID >= 40107) + 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; +#endif + case MYSQL_INFO_STATE: + Tcl_SetObjResult(interp, Tcl_NewStringObj(mysql_stat(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", +#if (MYSQL_VERSION_ID >= 40107) + "clientversionid", +#endif + 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; +#if (MYSQL_VERSION_ID >= 40107) + case MYSQL_BINFO_CLIENTVERSIONID: + Tcl_SetObjResult(interp, Tcl_NewIntObj(mysql_get_client_version())); + break; +#endif + } + 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"); + return TCL_ERROR; + } + + 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; + int len; + 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],&len); + if (len >= MYSQL_NAME_LEN) { + mysql_prim_confl(interp,objc,objv,"database name too long"); + return TCL_ERROR; + } + } + if (mysql_change_user(handle->connection, user, password, database)!=0) { + mysql_server_confl(interp,objc,objv,handle->connection); + return TCL_ERROR; + } + if (database!=NULL) + strcpy(handle->database, database); + 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[]) +{ +#if (MYSQL_VERSION_ID < 40107) + Tcl_AddErrorInfo(interp, FUNCTION_NOT_AVAILABLE); + return TCL_ERROR; +#else + 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; +#endif +} +/* + *---------------------------------------------------------------------- + * + * Mysqltcl_Commit + * usage: mysql::commit + * + */ + +static int Mysqltcl_Commit(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]) +{ +#if (MYSQL_VERSION_ID < 40107) + Tcl_AddErrorInfo(interp, FUNCTION_NOT_AVAILABLE); + return TCL_ERROR; +#else + 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; +#endif +} +/* + *---------------------------------------------------------------------- + * + * Mysqltcl_Rollback + * usage: mysql::rollback + * + */ + +static int Mysqltcl_Rollback(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]) +{ +#if (MYSQL_VERSION_ID < 40107) + Tcl_AddErrorInfo(interp, FUNCTION_NOT_AVAILABLE); + return TCL_ERROR; +#else + 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; +#endif +} +/* + *---------------------------------------------------------------------- + * + * 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[]) +{ +#if (MYSQL_VERSION_ID < 40107) + Tcl_AddErrorInfo(interp, FUNCTION_NOT_AVAILABLE); + return TCL_ERROR; +#else + 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; +#endif +} +/* + + *---------------------------------------------------------------------- + * + * 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[]) +{ +#if (MYSQL_VERSION_ID < 40107) + Tcl_AddErrorInfo(interp, FUNCTION_NOT_AVAILABLE); + return TCL_ERROR; +#else + 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==-1) { + 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; +#endif +} +/* + *---------------------------------------------------------------------- + * + * Mysqltcl_WarningCount + * usage: mysql::warningcount + * + */ + +static int Mysqltcl_WarningCount(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]) +{ +#if (MYSQL_VERSION_ID < 40107) + Tcl_AddErrorInfo(interp, FUNCTION_NOT_AVAILABLE); + return TCL_ERROR; +#else + 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; +#endif +} +/* + *---------------------------------------------------------------------- + * + * 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[]) +{ + 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 (- + * + */ +#if (MYSQL_VERSION_ID >= 40107) +static CONST char* MysqlServerOpt[] = + { + "-multi_statment_on", "-multi_statment_off",NULL + }; +#endif + +static int Mysqltcl_SetServerOption(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]) +{ +#if (MYSQL_VERSION_ID < 40107) + Tcl_AddErrorInfo(interp, FUNCTION_NOT_AVAILABLE); + return TCL_ERROR; +#else + 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; +#endif +} +/* + *---------------------------------------------------------------------- + * + * Mysqltcl_ShutDown + * usage: mysql::shutdown handle + * + */ +static int Mysqltcl_ShutDown(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_VERSION_ID >= 40107) + if (mysql_shutdown(handle->connection,SHUTDOWN_DEFAULT)!=0) { +#else + if (mysql_shutdown(handle->connection)!=0) { +#endif + mysql_server_confl(interp,objc,objv,handle->connection); + } + return TCL_OK; +} +/* + *---------------------------------------------------------------------- + * + * Mysqltcl_Encoding + * usage: mysql::encoding handle ?encoding|binary? + * + */ +static int Mysqltcl_Encoding(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]) +{ + MysqltclState *statePtr = (MysqltclState *)clientData; + Tcl_HashSearch search; + Tcl_HashEntry *entryPtr; + MysqlTclHandle *handle,*qhandle; + char *encodingname; + Tcl_Encoding encoding; + + if ((handle = mysql_prologue(interp, objc, objv, 2, 3, CL_CONN, + "handle")) == 0) + return TCL_ERROR; + if (objc==2) { + if (handle->encoding == NULL) + Tcl_SetObjResult(interp, Tcl_NewStringObj("binary",-1)); + else + Tcl_SetObjResult(interp, Tcl_NewStringObj(Tcl_GetEncodingName(handle->encoding),-1)); + } else { + if (handle->type!=HT_CONNECTION) { + Tcl_SetObjResult(interp, Tcl_NewStringObj("encoding set can be used only on connection handle",-1)); + return TCL_ERROR; + } + encodingname = Tcl_GetStringFromObj(objv[2],NULL); + if (strcmp(encodingname, "binary") == 0) { + encoding = NULL; + } else { + encoding = Tcl_GetEncoding(interp, encodingname); + if (encoding == NULL) + return TCL_ERROR; + } + if (handle->encoding!=NULL) + Tcl_FreeEncoding(handle->encoding); + handle->encoding = encoding; + + /* change encoding of all subqueries */ + for (entryPtr=Tcl_FirstHashEntry(&statePtr->hash,&search); + entryPtr!=NULL; + entryPtr=Tcl_NextHashEntry(&search)) { + qhandle=(MysqlTclHandle *)Tcl_GetHashValue(entryPtr); + if (qhandle->type==HT_QUERY && handle->connection==qhandle->connection) { + qhandle->encoding = encoding; + } + } + + } + 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" , PACKAGE_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); + Tcl_CreateObjCommand(interp,"::mysql::encoding", Mysqltcl_Encoding,(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/mysqltcl_2.14.c b/mysqltcl_2.14.c new file mode 100755 index 0000000..29b6321 --- /dev/null +++ b/mysqltcl_2.14.c @@ -0,0 +1,1631 @@ +/* + * $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. + */ +#ifdef _WINDOWS + #include + #define PACKAGE "mysqltcl" + #define VERSION "2.14" +#endif + +#include +#include + +#include +#include +#include +#include + + +/* A few macros for making the code more readable */ + +#define DECLARE_CMD(func) \ +static int func _ANSI_ARGS_((ClientData clientData, \ + Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[])) + +#define DEFINE_CMD(func) \ +static int func(clientData, interp, objc, objv) \ + ClientData clientData; \ + Tcl_Interp *interp; \ + int objc; \ + Tcl_Obj *CONST objv[]; + +#define ADD_CMD(cmdName, cmdProc) \ +Tcl_CreateObjCommand(interp, #cmdName, cmdProc, NULL, Mysqltcl_Kill) + +/* Compile-time constants */ + +#define MYSQL_SMALL_SIZE TCL_RESULT_SIZE /* Smaller buffer size. */ +#define MYSQL_NAME_LEN 80 /* Max. host, database name length. */ + +typedef struct MysqlTclHandle { + MYSQL * connection ; /* Connection handle, if connected; -1 otherwise. */ + char host[MYSQL_NAME_LEN] ; /* Host name, if connected. */ + 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; + int isquery; +} MysqlTclHandle; + +/* one global Hash for mysql handles */ +static Tcl_HashTable handleTable; + +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) */ +static char *MysqlNullvalue = NULL ; +#define MYSQL_NULLV_INIT "" + +/* Check Level for mysql_prologue */ +#define CL_PLAIN 0 +#define CL_CONN 1 +#define CL_DB 2 +#define CL_RES 3 + +/* Prototypes for all functions. */ + +DECLARE_CMD(Mysqltcl_Connect); +DECLARE_CMD(Mysqltcl_Use); +DECLARE_CMD(Mysqltcl_Escape); +DECLARE_CMD(Mysqltcl_Sel); +DECLARE_CMD(Mysqltcl_Next); +DECLARE_CMD(Mysqltcl_Seek); +DECLARE_CMD(Mysqltcl_Map); +DECLARE_CMD(Mysqltcl_Exec); +DECLARE_CMD(Mysqltcl_Close); +DECLARE_CMD(Mysqltcl_Info); +DECLARE_CMD(Mysqltcl_Result); +DECLARE_CMD(Mysqltcl_Col); +DECLARE_CMD(Mysqltcl_State); +DECLARE_CMD(Mysqltcl_InsertId); +DECLARE_CMD(Mysqltcl_Query); + +static int MysqlHandleSet _ANSI_ARGS_((Tcl_Interp *interp, + Tcl_Obj *objPtr)); +static void MysqlHandleFree _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 +}; + +static int +MysqlHandleSet(interp, objPtr) + Tcl_Interp *interp; /* Used for error reporting if not NULL. */ + register Tcl_Obj *objPtr; /* The object to convert. */ +{ + Tcl_ObjType *oldTypePtr = objPtr->typePtr; + char *string; + MysqlTclHandle *handle; + Tcl_HashEntry *entryPtr; + + string=Tcl_GetStringFromObj(objPtr, NULL); + entryPtr = Tcl_FindHashEntry(&handleTable,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); + // printf("p set obj handle %i %x\n",handle->isquery,handle); + + return TCL_OK; +} +static void +MysqlHandleFree(Tcl_Obj *obj) +{ + MysqlTclHandle *handle = (MysqlTclHandle *)obj->internalRep.otherValuePtr; + Tcl_Release((char *)handle); + // printf("r free obj handle %i %x\n",handle->isquery,handle); +} + +static int +GetHandleFromObj(interp, objPtr, handlePtr) + Tcl_Interp *interp; + register Tcl_Obj *objPtr; + register 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(handle) + register 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->isquery) ? "query" : MysqlHandlePrefix,handle->number); + objPtr->bytes = Tcl_Alloc((unsigned) len + 1); + strcpy(objPtr->bytes, buffer); + objPtr->length = len; + + entryPtr=Tcl_CreateHashEntry(&handleTable,buffer,&newflag); + Tcl_SetHashValue(entryPtr,handle); + + objPtr->internalRep.otherValuePtr = handle; + objPtr->typePtr = &mysqlHandleType; + + Tcl_Preserve((char *)handle); + // printf("p new obj handle %i %x\n",handle->isquery,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. + * + */ + +static int +mysql_server_confl (Tcl_Interp *interp,int objc,Tcl_Obj *CONST objv[],MYSQL * connection) +{ + char* mysql_errorMsg; + + 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 ; +} + +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 + * getRowCellAsObject + * This to method control how tcl data is transfered to mysql and + * how data is imported into tcl from mysql + */ +static int mysql_QueryTclObj(MysqlTclHandle *handle,Tcl_Obj *obj) +{ + char *query; + int result,queryLen; + Tcl_DString queryDS; + + query=Tcl_GetStringFromObj(obj, &queryLen); + Tcl_UtfToExternalDString(NULL, 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(MYSQL_ROW row,int length) +{ + Tcl_Obj *obj; + if (*row) { + obj = Tcl_NewByteArrayObj(*row,length); + } else { + obj = Tcl_NewStringObj(MysqlNullvalue,-1); + } + return obj; +} + +static MysqlTclHandle *createMysqlHandle() +{ + static int HandleNum=0; + MysqlTclHandle *handle; + handle=(MysqlTclHandle *)Tcl_Alloc(sizeof(MysqlTclHandle)); + if (handle == 0) { + panic("no memory for handle"); + return handle; + } + handle->connection = (MYSQL *)0 ; + handle->host[0] = '\0' ; + handle->database[0] = '\0' ; + handle->result = NULL ; + handle->res_count = 0 ; + handle->col_count = 0 ; + handle->isquery = 0; + + //printf("p create handle %i %x\n",handle->isquery,handle); + + /* not MT-safe, static */ + handle->number=HandleNum++; + return handle; +} + +static MysqlTclHandle *createQueryHandleFrom(MysqlTclHandle *handle) +{ + int number; + MysqlTclHandle *qhandle; + qhandle = createMysqlHandle(); + number = qhandle->number; + if (!qhandle) return qhandle; + memcpy(qhandle,handle,sizeof(MysqlTclHandle)); + qhandle->isquery=1; + qhandle->number=number; + return qhandle; +} +static void closeHandle(MysqlTclHandle *handle) +{ + handle->connection = (MYSQL *)0; + // printf("r close handle %i %x\n",handle->isquery,handle); + 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 (interp, objc, objv, req_min_args, req_max_args, check_level, usage_msg) + 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 (interp,objc,objv,fld,keyw) + 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, (char **)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); /* fyll på¿¿? */ + case FIELD_TYPE_SET: /* samma */ + 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: + sprintf (buf, "column '%s' has weird datatype", fld->name) ; + 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_Kill + * Close all connections. + * + */ + +static void +Mysqltcl_Kill (clientData) + ClientData clientData; +{ + Tcl_HashEntry *entryPtr; + Tcl_HashSearch search; + MysqlTclHandle *handle; + int wasdeleted=0; + + for (entryPtr=Tcl_FirstHashEntry(&handleTable,&search); + entryPtr!=NULL; + entryPtr=Tcl_NextHashEntry(&search)) { + wasdeleted=1; + handle=(MysqlTclHandle *)Tcl_GetHashValue(entryPtr); + + if (handle->connection == 0) continue; + + if (handle->result != NULL) + mysql_free_result (handle->result) ; + + mysql_close (handle->connection); + closeHandle(handle); + } + if (wasdeleted) { + Tcl_DeleteHashTable(&handleTable); + Tcl_InitHashTable (&handleTable, TCL_STRING_KEYS); + } +} + + + + +/* + *---------------------------------------------------------------------- + * + * 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 + */ + +DEFINE_CMD(Mysqltcl_Connect) +{ + int i, idx; + char *hostname = NULL; + char *user = NULL; + char *password = NULL; + char *db = NULL; + int port = 0; + char *socket = NULL; + MysqlTclHandle *handle; + const char *groupname = "mysqltcl"; + + static CONST char* MysqlConnectOpt[] = + { + "-host", "-user", "-password", "-db", "-port", "-socket", NULL + }; + enum connectoption { + MYSQL_CONNHOST_OPT, MYSQL_CONNUSER_OPT, MYSQL_CONNPASSWORD_OPT, + MYSQL_CONNDB_OPT, MYSQL_CONNPORT_OPT, MYSQL_CONNSOCKET_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]"); + return TCL_ERROR; + } + + for (i = 1; i < objc; i++) { + if (Tcl_GetIndexFromObj(interp, objv[i], (char **)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; + default: + return mysql_prim_confl(interp,objc,objv,"Weirdness in options"); + } + } + + handle = createMysqlHandle(); + + if (handle == 0) { + panic("no memory for handle"); + return TCL_ERROR; + } + + handle->connection = mysql_init(NULL); + + mysql_options(handle->connection,MYSQL_READ_DEFAULT_GROUP,groupname); + + if (!mysql_real_connect (handle->connection, hostname, user, + password, db, port, socket, 0)) { + mysql_server_confl (interp,objc,objv,handle->connection); + mysql_close (handle->connection); + closeHandle(handle); + return TCL_ERROR; + } + + if (hostname) { + strncpy (handle->host, hostname, MYSQL_NAME_LEN) ; + handle->host[MYSQL_NAME_LEN - 1] = '\0' ; + } else { + strcpy (handle->host, "localhost"); + } + + if (db) { + strncpy (handle->database, db, MYSQL_NAME_LEN) ; + handle->database[MYSQL_NAME_LEN - 1] = '\0' ; + } + + Tcl_SetObjResult(interp, Tcl_NewHandleObj(handle)); + + return TCL_OK; +} + + +/* + *---------------------------------------------------------------------- + * + * Mysqltcl_Use + * Implements the mysqluse command: + * usage: mysqluse handle dbname + * + * results: + * Sets current database to dbname. + */ + +DEFINE_CMD(Mysqltcl_Use) +{ + 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. + */ + +DEFINE_CMD(Mysqltcl_Escape) +{ + int len; + char *inString, *outString; + + if (objc != 2) { + Tcl_WrongNumArgs(interp, 2, objv, "string"); + return TCL_ERROR; + } + /* !!! here the real_escape command should be used + this need a additional parameter connection */ + + 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); + 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. + */ + +DEFINE_CMD(Mysqltcl_Sel) +{ + Tcl_Obj *res, *resList; + MYSQL_ROW row; + MysqlTclHandle *handle; + unsigned long *lengths; + static 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], (char **)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 ((handle->result = mysql_store_result (handle->connection)) == 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(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(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 + */ +DEFINE_CMD(Mysqltcl_Query) +{ + 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 = createQueryHandleFrom(handle)) == 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(qhandle)); + return TCL_OK; +} +DEFINE_CMD(Mysqltcl_EndQuery) +{ + Tcl_HashEntry *entryPtr; + MysqlTclHandle *handle; + + if ((handle = mysql_prologue(interp, objc, objv, 2, 2, CL_CONN, + "queryhanle")) == 0) + return TCL_ERROR; + + if (handle->result != NULL) { + mysql_free_result (handle->result) ; + handle->result = NULL ; + } + if (handle->isquery) { + entryPtr = Tcl_FindHashEntry(&handleTable,Tcl_GetStringFromObj(objv[1],NULL)); + if (entryPtr) { + Tcl_DeleteHashEntry(entryPtr); + } + closeHandle(handle); + } + 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. + */ + +DEFINE_CMD(Mysqltcl_Exec) +{ + 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_Next + * Implements the mysqlnext command: + * usage: mysqlnext handle + * + * results: + * next row from pending results as tcl list, or null list. + */ + +DEFINE_CMD(Mysqltcl_Next) +{ + 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(row,lengths[idx])); + } + return TCL_OK; +} + + +/* + *---------------------------------------------------------------------- + * + * Mysqltcl_Seek + * Implements the mysqlseek command: + * usage: mysqlseek handle rownumber + * + * results: + * number of remaining rows + */ + +DEFINE_CMD(Mysqltcl_Seek) +{ + 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. + */ + +DEFINE_CMD(Mysqltcl_Map) +{ + 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(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_Info + * Implements the mysqlinfo command: + * usage: mysqlinfo handle option + * + */ + +DEFINE_CMD(Mysqltcl_Info) +{ + int count ; + MysqlTclHandle *handle; + int idx ; + MYSQL_RES* list ; + MYSQL_ROW row ; + char* val ; + Tcl_Obj *resList; + static CONST char* MysqlDbOpt[] = + { + "dbname", "dbname?", "tables", "host", "host?", "databases","info", NULL + }; + enum dboption { + MYSQL_INFNAME_OPT, MYSQL_INFNAMEQ_OPT, MYSQL_INFTABLES_OPT, + MYSQL_INFHOST_OPT, MYSQL_INFHOSTQ_OPT, MYSQL_INFLIST_OPT, MYSQL_INFO + }; + + /* 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], (char **)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_INFHOSTQ_OPT: + if (handle->connection == 0) + return TCL_OK ; /* Return empty string if not connected. */ + break ; + case MYSQL_INFO: + 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(handle->host, -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; + default: /* should never happen */ + return mysql_prim_confl (interp,objc,objv,"weirdness in Mysqltcl_Info") ; + } + return TCL_OK ; +} + + +/* + *---------------------------------------------------------------------- + * + * Mysqltcl_Result + * Implements the mysqlresult command: + * usage: mysqlresult handle option + * + */ + +DEFINE_CMD(Mysqltcl_Result) +{ + 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], (char **)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. + */ + +DEFINE_CMD(Mysqltcl_Col) +{ + 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? + * + */ + +DEFINE_CMD(Mysqltcl_State) +{ + MysqlTclHandle *handle; + int numeric=0 ; + Tcl_Obj *res; + + if (mysql_prologue(interp, objc, objv, 2, 3, NULL, "handle ?-numeric?") == 0) + return TCL_ERROR; + + 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(NULL, 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 + * + */ + +DEFINE_CMD(Mysqltcl_InsertId) +{ + 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_Close -- + * Implements the mysqlclose command: + * usage: mysqlclose ?handle? + * + * results: + * null string + */ + +DEFINE_CMD(Mysqltcl_Close) +{ + 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_Kill ((ClientData)NULL) ; + return TCL_OK ; + } + + if ((handle = mysql_prologue(interp, objc, objv, 2, 2, CL_CONN, + "?handle?")) == 0) + return TCL_ERROR; + + if (handle->result != NULL) + mysql_free_result (handle->result) ; + + /* Search all queries on this handle and close those */ + if (!handle->isquery) { + mysql_close(handle->connection); + while (1) { + for (entryPtr=Tcl_FirstHashEntry(&handleTable,&search); + entryPtr!=NULL; + entryPtr=Tcl_NextHashEntry(&search)) { + + thandle=(MysqlTclHandle *)Tcl_GetHashValue(entryPtr); + if (thandle->connection == handle->connection && + thandle->isquery) { + qentries[qfound++] = entryPtr; + } + if (qfound==16) break; + } + if (qfound>0) { + for(i=0;iresult != NULL) + mysql_free_result (thandle->result); + closeHandle(thandle); + } + } + if (qfound!=16) break; + qfound = 0; + } + } + entryPtr = Tcl_FindHashEntry(&handleTable,Tcl_GetStringFromObj(objv[1],NULL)); + if (entryPtr) Tcl_DeleteHashEntry(entryPtr); + closeHandle(handle); + return TCL_OK; +} + +/* + *---------------------------------------------------------------------- + * 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]; + + 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. + */ + ADD_CMD(mysqlconnect, Mysqltcl_Connect); + ADD_CMD(mysqluse, Mysqltcl_Use); + ADD_CMD(mysqlescape, Mysqltcl_Escape); + ADD_CMD(mysqlsel, Mysqltcl_Sel); + ADD_CMD(mysqlnext, Mysqltcl_Next); + ADD_CMD(mysqlseek, Mysqltcl_Seek); + ADD_CMD(mysqlmap, Mysqltcl_Map); + ADD_CMD(mysqlexec, Mysqltcl_Exec); + ADD_CMD(mysqlclose, Mysqltcl_Close); + ADD_CMD(mysqlinfo, Mysqltcl_Info); + ADD_CMD(mysqlresult, Mysqltcl_Result); + ADD_CMD(mysqlcol, Mysqltcl_Col); + ADD_CMD(mysqlstate, Mysqltcl_State); + ADD_CMD(mysqlinsertid, Mysqltcl_InsertId); + ADD_CMD(mysqlquery, Mysqltcl_Query); + ADD_CMD(mysqlendquery, Mysqltcl_EndQuery); + + /* Initialize mysqlstatus global array. */ + + clear_msg(interp); + + /* Initialize HashTable for mysql handles */ + Tcl_InitHashTable (&handleTable, TCL_STRING_KEYS); + + /* Link the null value element to the corresponding C variable. */ + if ((MysqlNullvalue = (char*)Tcl_Alloc (12)) == NULL) return TCL_ERROR ; + strcpy (MysqlNullvalue, MYSQL_NULLV_INIT); + sprintf (nbuf, "%s(%s)", MYSQL_STATUS_ARR, MYSQL_STATUS_NULLV) ; + + if (Tcl_LinkVar (interp,nbuf,(char *)&MysqlNullvalue, TCL_LINK_STRING) != TCL_OK) + return TCL_ERROR; + + /* Register the handle object type */ + Tcl_RegisterObjType(&mysqlHandleType); + + /* 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 ; + } +} diff --git a/patch-generic-mysqltcl.c b/patch-generic-mysqltcl.c new file mode 100755 index 0000000..9f59b44 --- /dev/null +++ b/patch-generic-mysqltcl.c @@ -0,0 +1,320 @@ +--- generic/mysqltcl.c.orig 2008-04-02 16:46:38.000000000 +0200 ++++ generic/mysqltcl.c 2008-04-02 16:52:11.000000000 +0200 +@@ -42,11 +42,6 @@ + #include + #include + +-#if (MYSQL_VERSION_ID<40100) +- #error You need Mysql version 4.1 or higher to compile mysqltcl +-#endif +- +- + #include + #include + #include +@@ -97,6 +92,8 @@ + #define MYSQL_STATUS_MSG "message" + #define MYSQL_STATUS_NULLV "nullvalue" + ++#define FUNCTION_NOT_AVAILABLE "function not available" ++ + /* C variable corresponding to mysqlstatus(nullvalue) */ + #define MYSQL_NULLV_INIT "" + +@@ -714,7 +711,10 @@ + static CONST char* MysqlConnectOpt[] = + { + "-host", "-user", "-password", "-db", "-port", "-socket","-encoding", +- "-ssl", "-compress", "-noschema","-odbc","-multistatement","-multiresult", ++ "-ssl", "-compress", "-noschema","-odbc", ++#if (MYSQL_VERSION_ID >= 40107) ++ "-multistatement","-multiresult", ++#endif + "-localfiles","-ignorespace","-foundrows","-interactive","-sslkey","-sslcert", + "-sslca","-sslcapath","-sslciphers",NULL + }; +@@ -731,7 +731,9 @@ + char *socket = NULL; + char *encodingname = NULL; + ++#if (MYSQL_VERSION_ID >= 40107) + int isSSL = 0; ++#endif + char *sslkey = NULL; + char *sslcert = NULL; + char *sslca = NULL; +@@ -746,7 +748,10 @@ + 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, ++#if (MYSQL_VERSION_ID >= 40107) ++ MYSQL_MULTISTATEMENT_OPT,MYSQL_MULTIRESULT_OPT, ++#endif ++ MYSQL_LOCALFILES_OPT,MYSQL_IGNORESPACE_OPT, + MYSQL_FOUNDROWS_OPT,MYSQL_INTERACTIVE_OPT,MYSQL_SSLKEY_OPT,MYSQL_SSLCERT_OPT, + MYSQL_SSLCA_OPT,MYSQL_SSLCAPATH_OPT,MYSQL_SSLCIPHERS_OPT + }; +@@ -787,8 +792,15 @@ + encodingname = Tcl_GetStringFromObj(objv[++i],NULL); + break; + case MYSQL_CONNSSL_OPT: ++#if (MYSQL_VERSION_ID >= 40107) + if (Tcl_GetBooleanFromObj(interp,objv[++i],&isSSL) != TCL_OK ) + return TCL_ERROR; ++#else ++ if (Tcl_GetBooleanFromObj(interp,objv[++i],&booleanflag) != TCL_OK ) ++ return TCL_ERROR; ++ if (booleanflag) ++ flags |= CLIENT_SSL; ++#endif + break; + case MYSQL_CONNCOMPRESS_OPT: + if (Tcl_GetBooleanFromObj(interp,objv[++i],&booleanflag) != TCL_OK ) +@@ -808,6 +820,7 @@ + if (booleanflag) + flags |= CLIENT_ODBC; + break; ++#if (MYSQL_VERSION_ID >= 40107) + case MYSQL_MULTISTATEMENT_OPT: + if (Tcl_GetBooleanFromObj(interp,objv[++i],&booleanflag) != TCL_OK ) + return TCL_ERROR; +@@ -822,7 +835,7 @@ + if (booleanflag) + flags |= CLIENT_MULTI_RESULTS; + break; +- ++#endif + case MYSQL_LOCALFILES_OPT: + if (Tcl_GetBooleanFromObj(interp,objv[++i],&booleanflag) != TCL_OK ) + return TCL_ERROR; +@@ -881,9 +894,11 @@ + #if (MYSQL_VERSION_ID>=32350) + mysql_options(handle->connection,MYSQL_READ_DEFAULT_GROUP,groupname); + #endif ++#if (MYSQL_VERSION_ID >= 40107) + if (isSSL) { + mysql_ssl_set(handle->connection,sslkey,sslcert, sslca, sslcapath, sslcipher); + } ++#endif + + if (!mysql_real_connect(handle->connection, hostname, user, + password, db, port, socket, flags)) { +@@ -1514,7 +1529,11 @@ + static CONST char* MysqlDbOpt[] = + { + "dbname", "dbname?", "tables", "host", "host?", "databases", +- "info","serverversion","serverversionid","sqlstate","state",NULL ++ "info","serverversion", ++#if (MYSQL_VERSION_ID >= 40107) ++ "serverversionid","sqlstate", ++#endif ++ "state",NULL + }; + enum dboption { + MYSQL_INFNAME_OPT, MYSQL_INFNAMEQ_OPT, MYSQL_INFTABLES_OPT, +@@ -1548,8 +1567,10 @@ + break; + case MYSQL_INFO: + case MYSQL_INF_SERVERVERSION: ++#if (MYSQL_VERSION_ID >= 40107) + case MYSQL_INFO_SERVERVERSION_ID: + case MYSQL_INFO_SQLSTATE: ++#endif + case MYSQL_INFO_STATE: + break; + +@@ -1606,12 +1627,14 @@ + case MYSQL_INF_SERVERVERSION: + Tcl_SetObjResult(interp, Tcl_NewStringObj(mysql_get_server_info(handle->connection),-1)); + break; ++#if (MYSQL_VERSION_ID >= 40107) + 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; ++#endif + case MYSQL_INFO_STATE: + Tcl_SetObjResult(interp, Tcl_NewStringObj(mysql_stat(handle->connection),-1)); + break; +@@ -1638,7 +1661,11 @@ + char **option; + static CONST char* MysqlInfoOpt[] = + { +- "connectparameters", "clientversion","clientversionid", NULL ++ "connectparameters", "clientversion", ++#if (MYSQL_VERSION_ID >= 40107) ++ "clientversionid", ++#endif ++ NULL + }; + enum baseoption { + MYSQL_BINFO_CONNECT, MYSQL_BINFO_CLIENTVERSION,MYSQL_BINFO_CLIENTVERSIONID +@@ -1668,9 +1695,11 @@ + case MYSQL_BINFO_CLIENTVERSION: + Tcl_SetObjResult(interp, Tcl_NewStringObj(mysql_get_client_info(),-1)); + break; ++#if (MYSQL_VERSION_ID >= 40107) + case MYSQL_BINFO_CLIENTVERSIONID: + Tcl_SetObjResult(interp, Tcl_NewIntObj(mysql_get_client_version())); + break; ++#endif + } + return TCL_OK ; + } +@@ -1987,6 +2016,10 @@ + + static int Mysqltcl_AutoCommit(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]) + { ++#if (MYSQL_VERSION_ID < 40107) ++ Tcl_AddErrorInfo(interp, FUNCTION_NOT_AVAILABLE); ++ return TCL_ERROR; ++#else + MysqlTclHandle *handle; + int isAutocommit = 0; + +@@ -1999,6 +2032,7 @@ + mysql_server_confl(interp,objc,objv,handle->connection); + } + return TCL_OK; ++#endif + } + /* + *---------------------------------------------------------------------- +@@ -2010,6 +2044,10 @@ + + static int Mysqltcl_Commit(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]) + { ++#if (MYSQL_VERSION_ID < 40107) ++ Tcl_AddErrorInfo(interp, FUNCTION_NOT_AVAILABLE); ++ return TCL_ERROR; ++#else + MysqlTclHandle *handle; + + if ((handle = mysql_prologue(interp, objc, objv, 2, 2, CL_CONN, +@@ -2019,6 +2057,7 @@ + mysql_server_confl(interp,objc,objv,handle->connection); + } + return TCL_OK; ++#endif + } + /* + *---------------------------------------------------------------------- +@@ -2030,6 +2069,10 @@ + + static int Mysqltcl_Rollback(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]) + { ++#if (MYSQL_VERSION_ID < 40107) ++ Tcl_AddErrorInfo(interp, FUNCTION_NOT_AVAILABLE); ++ return TCL_ERROR; ++#else + MysqlTclHandle *handle; + + if ((handle = mysql_prologue(interp, objc, objv, 2, 2, CL_CONN, +@@ -2039,6 +2082,7 @@ + mysql_server_confl(interp,objc,objv,handle->connection); + } + return TCL_OK; ++#endif + } + /* + *---------------------------------------------------------------------- +@@ -2050,6 +2094,10 @@ + + static int Mysqltcl_MoreResult(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]) + { ++#if (MYSQL_VERSION_ID < 40107) ++ Tcl_AddErrorInfo(interp, FUNCTION_NOT_AVAILABLE); ++ return TCL_ERROR; ++#else + MysqlTclHandle *handle; + int boolResult = 0; + +@@ -2059,6 +2107,7 @@ + boolResult = mysql_more_results(handle->connection); + Tcl_SetObjResult(interp,Tcl_NewBooleanObj(boolResult)); + return TCL_OK; ++#endif + } + /* + +@@ -2072,6 +2121,10 @@ + + static int Mysqltcl_NextResult(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]) + { ++#if (MYSQL_VERSION_ID < 40107) ++ Tcl_AddErrorInfo(interp, FUNCTION_NOT_AVAILABLE); ++ return TCL_ERROR; ++#else + MysqlTclHandle *handle; + int result = 0; + +@@ -2098,6 +2151,7 @@ + Tcl_SetObjResult(interp, Tcl_NewIntObj(handle->res_count)); + } + return TCL_OK; ++#endif + } + /* + *---------------------------------------------------------------------- +@@ -2109,6 +2163,10 @@ + + static int Mysqltcl_WarningCount(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]) + { ++#if (MYSQL_VERSION_ID < 40107) ++ Tcl_AddErrorInfo(interp, FUNCTION_NOT_AVAILABLE); ++ return TCL_ERROR; ++#else + MysqlTclHandle *handle; + int count = 0; + +@@ -2118,6 +2176,7 @@ + count = mysql_warning_count(handle->connection); + Tcl_SetObjResult(interp,Tcl_NewIntObj(count)); + return TCL_OK; ++#endif + } + /* + *---------------------------------------------------------------------- +@@ -2176,13 +2235,19 @@ + * usage: mysql::setserveroption (- + * + */ ++#if (MYSQL_VERSION_ID >= 40107) + static CONST char* MysqlServerOpt[] = + { + "-multi_statment_on", "-multi_statment_off",NULL + }; ++#endif + + static int Mysqltcl_SetServerOption(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]) + { ++#if (MYSQL_VERSION_ID < 40107) ++ Tcl_AddErrorInfo(interp, FUNCTION_NOT_AVAILABLE); ++ return TCL_ERROR; ++#else + MysqlTclHandle *handle; + int idx; + enum enum_mysql_set_option mysqlServerOption; +@@ -2213,6 +2278,7 @@ + mysql_server_confl(interp,objc,objv,handle->connection); + } + return TCL_OK; ++#endif + } + /* + *---------------------------------------------------------------------- +@@ -2228,7 +2294,11 @@ + if ((handle = mysql_prologue(interp, objc, objv, 2, 2, CL_CONN, + "handle")) == 0) + return TCL_ERROR; ++#if (MYSQL_VERSION_ID >= 40107) + if (mysql_shutdown(handle->connection,SHUTDOWN_DEFAULT)!=0) { ++#else ++ if (mysql_shutdown(handle->connection)!=0) { ++#endif + mysql_server_confl(interp,objc,objv,handle->connection); + } + return TCL_OK; \ No newline at end of file diff --git a/pkgIndex.tcl.in b/pkgIndex.tcl.in new file mode 100755 index 0000000..5313c6f --- /dev/null +++ b/pkgIndex.tcl.in @@ -0,0 +1,5 @@ +# +# Tcl package index file +# +package ifneeded mysqltcl @PACKAGE_VERSION@ \ + [list load [file join $dir @PKG_LIB_FILE@] @PACKAGE_NAME@] 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..8fe951b --- /dev/null +++ b/tclconfig/tcl.m4 @@ -0,0 +1,3954 @@ +# tcl.m4 -- +# +# This file provides a set of autoconf macros to help TEA-enable +# a Tcl extension. +# +# Copyright (c) 1999-2000 Ajuba Solutions. +# Copyright (c) 2002-2005 ActiveState Corporation. +# +# See the file "license.terms" for information on usage and redistribution +# of this file, and for a DISCLAIMER OF ALL WARRANTIES. +# +# RCS: @(#) $Id: tcl.m4,v 1.89 2006/01/25 21:25:02 hobbs Exp $ + +AC_PREREQ(2.50) + +dnl TEA extensions pass this us the version of TEA they think they +dnl are compatible with (must be set in TEA_INIT below) +dnl TEA_VERSION="3.5" + +# Possible values for key variables defined: +# +# TEA_WINDOWINGSYSTEM - win32 aqua x11 (mirrors 'tk windowingsystem') +# TEA_PLATFORM - windows unix +# + +#------------------------------------------------------------------------ +# TEA_PATH_TCLCONFIG -- +# +# Locate the tclConfig.sh file and perform a sanity check on +# the Tcl compile flags +# +# Arguments: +# none +# +# Results: +# +# Adds the following arguments to configure: +# --with-tcl=... +# +# Defines the following vars: +# TCL_BIN_DIR Full path to the directory containing +# the tclConfig.sh file +#------------------------------------------------------------------------ + +AC_DEFUN(TEA_PATH_TCLCONFIG, [ + dnl Make sure we are initialized + AC_REQUIRE([TEA_INIT]) + # + # Ok, lets find the tcl configuration + # First, look for one uninstalled. + # the alternative search directory is invoked by --with-tcl + # + + if test x"${no_tcl}" = x ; then + # we reset no_tcl in case something fails here + no_tcl=true + AC_ARG_WITH(tcl, + AC_HELP_STRING([--with-tcl], + [directory containing tcl configuration (tclConfig.sh)]), + with_tclconfig=${withval}) + AC_MSG_CHECKING([for Tcl configuration]) + AC_CACHE_VAL(ac_cv_c_tclconfig,[ + + # First check to see if --with-tcl was specified. + if test x"${with_tclconfig}" != x ; then + case ${with_tclconfig} in + */tclConfig.sh ) + if test -f ${with_tclconfig}; then + AC_MSG_WARN([--with-tcl argument should refer to directory containing tclConfig.sh, not to tclConfig.sh itself]) + with_tclconfig=`echo ${with_tclconfig} | sed 's!/tclConfig\.sh$!!'` + fi ;; + esac + if test -f "${with_tclconfig}/tclConfig.sh" ; then + ac_cv_c_tclconfig=`(cd ${with_tclconfig}; pwd)` + else + AC_MSG_ERROR([${with_tclconfig} directory doesn't contain tclConfig.sh]) + fi + fi + + # then check for a private Tcl installation + if test x"${ac_cv_c_tclconfig}" = x ; then + for i in \ + ../tcl \ + `ls -dr ../tcl[[8-9]].[[0-9]].[[0-9]]* 2>/dev/null` \ + `ls -dr ../tcl[[8-9]].[[0-9]] 2>/dev/null` \ + `ls -dr ../tcl[[8-9]].[[0-9]]* 2>/dev/null` \ + ../../tcl \ + `ls -dr ../../tcl[[8-9]].[[0-9]].[[0-9]]* 2>/dev/null` \ + `ls -dr ../../tcl[[8-9]].[[0-9]] 2>/dev/null` \ + `ls -dr ../../tcl[[8-9]].[[0-9]]* 2>/dev/null` \ + ../../../tcl \ + `ls -dr ../../../tcl[[8-9]].[[0-9]].[[0-9]]* 2>/dev/null` \ + `ls -dr ../../../tcl[[8-9]].[[0-9]] 2>/dev/null` \ + `ls -dr ../../../tcl[[8-9]].[[0-9]]* 2>/dev/null` ; do + if test -f "$i/unix/tclConfig.sh" ; then + ac_cv_c_tclconfig=`(cd $i/unix; pwd)` + break + fi + done + fi + + # on Darwin, check in Framework installation locations + if test "`uname -s`" = "Darwin" -a x"${ac_cv_c_tclconfig}" = x ; then + for i in `ls -d ~/Library/Frameworks 2>/dev/null` \ + `ls -d /Library/Frameworks 2>/dev/null` \ + `ls -d /Network/Library/Frameworks 2>/dev/null` \ + `ls -d /System/Library/Frameworks 2>/dev/null` \ + ; do + if test -f "$i/Tcl.framework/tclConfig.sh" ; then + ac_cv_c_tclconfig=`(cd $i/Tcl.framework; pwd)` + break + fi + done + fi + + # on Windows, check in common installation locations + if test "${TEA_PLATFORM}" = "windows" \ + -a x"${ac_cv_c_tclconfig}" = x ; then + for i in `ls -d C:/Tcl/lib 2>/dev/null` \ + `ls -d C:/Progra~1/Tcl/lib 2>/dev/null` \ + ; do + if test -f "$i/tclConfig.sh" ; then + ac_cv_c_tclconfig=`(cd $i; pwd)` + break + fi + done + fi + + # check in a few common install locations + if test x"${ac_cv_c_tclconfig}" = x ; then + for i in `ls -d ${libdir} 2>/dev/null` \ + `ls -d ${exec_prefix}/lib 2>/dev/null` \ + `ls -d ${prefix}/lib 2>/dev/null` \ + `ls -d /usr/local/lib 2>/dev/null` \ + `ls -d /usr/contrib/lib 2>/dev/null` \ + `ls -d /usr/lib 2>/dev/null` \ + ; do + if test -f "$i/tclConfig.sh" ; then + ac_cv_c_tclconfig=`(cd $i; pwd)` + break + fi + done + fi + + # check in a few other private locations + if test x"${ac_cv_c_tclconfig}" = x ; then + for i in \ + ${srcdir}/../tcl \ + `ls -dr ${srcdir}/../tcl[[8-9]].[[0-9]].[[0-9]]* 2>/dev/null` \ + `ls -dr ${srcdir}/../tcl[[8-9]].[[0-9]] 2>/dev/null` \ + `ls -dr ${srcdir}/../tcl[[8-9]].[[0-9]]* 2>/dev/null` ; do + if test -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([Can't 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, + AC_HELP_STRING([--with-tk], + [directory containing tk configuration (tkConfig.sh)]), + with_tkconfig=${withval}) + AC_MSG_CHECKING([for Tk configuration]) + AC_CACHE_VAL(ac_cv_c_tkconfig,[ + + # First check to see if --with-tkconfig was specified. + if test x"${with_tkconfig}" != x ; then + case ${with_tkconfig} in + */tkConfig.sh ) + if test -f ${with_tkconfig}; then + AC_MSG_WARN([--with-tk argument should refer to directory containing tkConfig.sh, not to tkConfig.sh itself]) + with_tkconfig=`echo ${with_tkconfig} | sed 's!/tkConfig\.sh$!!'` + fi ;; + esac + if test -f "${with_tkconfig}/tkConfig.sh" ; then + ac_cv_c_tkconfig=`(cd ${with_tkconfig}; pwd)` + else + AC_MSG_ERROR([${with_tkconfig} directory doesn't contain tkConfig.sh]) + fi + fi + + # then check for a private Tk library + if test x"${ac_cv_c_tkconfig}" = x ; then + for i in \ + ../tk \ + `ls -dr ../tk[[8-9]].[[0-9]].[[0-9]]* 2>/dev/null` \ + `ls -dr ../tk[[8-9]].[[0-9]] 2>/dev/null` \ + `ls -dr ../tk[[8-9]].[[0-9]]* 2>/dev/null` \ + ../../tk \ + `ls -dr ../../tk[[8-9]].[[0-9]].[[0-9]]* 2>/dev/null` \ + `ls -dr ../../tk[[8-9]].[[0-9]] 2>/dev/null` \ + `ls -dr ../../tk[[8-9]].[[0-9]]* 2>/dev/null` \ + ../../../tk \ + `ls -dr ../../../tk[[8-9]].[[0-9]].[[0-9]]* 2>/dev/null` \ + `ls -dr ../../../tk[[8-9]].[[0-9]] 2>/dev/null` \ + `ls -dr ../../../tk[[8-9]].[[0-9]]* 2>/dev/null` ; do + if test -f "$i/unix/tkConfig.sh" ; then + ac_cv_c_tkconfig=`(cd $i/unix; pwd)` + break + fi + done + fi + + # on Darwin, check in Framework installation locations + if test "`uname -s`" = "Darwin" -a x"${ac_cv_c_tkconfig}" = x ; then + for i in `ls -d ~/Library/Frameworks 2>/dev/null` \ + `ls -d /Library/Frameworks 2>/dev/null` \ + `ls -d /Network/Library/Frameworks 2>/dev/null` \ + `ls -d /System/Library/Frameworks 2>/dev/null` \ + ; do + if test -f "$i/Tk.framework/tkConfig.sh" ; then + ac_cv_c_tkconfig=`(cd $i/Tk.framework; pwd)` + break + fi + done + fi + + # check in a few common install locations + if test x"${ac_cv_c_tkconfig}" = x ; then + for i in `ls -d ${libdir} 2>/dev/null` \ + `ls -d ${exec_prefix}/lib 2>/dev/null` \ + `ls -d ${prefix}/lib 2>/dev/null` \ + `ls -d /usr/local/lib 2>/dev/null` \ + `ls -d /usr/contrib/lib 2>/dev/null` \ + `ls -d /usr/lib 2>/dev/null` \ + ; do + if test -f "$i/tkConfig.sh" ; then + ac_cv_c_tkconfig=`(cd $i; pwd)` + break + fi + done + fi + + # on Windows, check in common installation locations + if test "${TEA_PLATFORM}" = "windows" \ + -a x"${ac_cv_c_tclconfig}" = x ; then + for i in `ls -d C:/Tcl/lib 2>/dev/null` \ + `ls -d C:/Progra~1/Tcl/lib 2>/dev/null` \ + ; do + if test -f "$i/tclConfig.sh" ; then + ac_cv_c_tclconfig=`(cd $i; pwd)` + break + fi + done + fi + + # check in a few other private locations + if test x"${ac_cv_c_tkconfig}" = x ; then + for i in \ + ${srcdir}/../tk \ + `ls -dr ${srcdir}/../tk[[8-9]].[[0-9]].[[0-9]]* 2>/dev/null` \ + `ls -dr ${srcdir}/../tk[[8-9]].[[0-9]] 2>/dev/null` \ + `ls -dr ${srcdir}/../tk[[8-9]].[[0-9]]* 2>/dev/null` ; do + if test -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([Can't 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([could not find ${TCL_BIN_DIR}/tclConfig.sh]) + fi + + # eval is required to do the TCL_DBGX substitution + eval "TCL_LIB_FILE=\"${TCL_LIB_FILE}\"" + eval "TCL_STUB_LIB_FILE=\"${TCL_STUB_LIB_FILE}\"" + + # If the TCL_BIN_DIR is the build directory (not the install directory), + # then set the common variable name to the value of the build variables. + # For example, the variable TCL_LIB_SPEC will be set to the value + # of TCL_BUILD_LIB_SPEC. An extension should make use of TCL_LIB_SPEC + # instead of TCL_BUILD_LIB_SPEC since it will work with both an + # installed and uninstalled version of Tcl. + if test -f ${TCL_BIN_DIR}/Makefile ; then + TCL_LIB_SPEC=${TCL_BUILD_LIB_SPEC} + TCL_STUB_LIB_SPEC=${TCL_BUILD_STUB_LIB_SPEC} + TCL_STUB_LIB_PATH=${TCL_BUILD_STUB_LIB_PATH} + elif test "`uname -s`" = "Darwin"; then + # If Tcl was built as a framework, attempt to use the libraries + # from the framework at the given location so that linking works + # against Tcl.framework installed in an arbitary location. + case ${TCL_DEFS} in + *TCL_FRAMEWORK*) + if test -f ${TCL_BIN_DIR}/${TCL_LIB_FILE}; then + for i in "`cd ${TCL_BIN_DIR}; pwd`" \ + "`cd ${TCL_BIN_DIR}/../..; pwd`"; do + if test "`basename "$i"`" = "${TCL_LIB_FILE}.framework"; then + TCL_LIB_SPEC="-F`dirname "$i"` -framework ${TCL_LIB_FILE}" + break + fi + done + fi + if test -f ${TCL_BIN_DIR}/${TCL_STUB_LIB_FILE}; then + TCL_STUB_LIB_SPEC="-L${TCL_BIN_DIR} ${TCL_STUB_LIB_FLAG}" + TCL_STUB_LIB_PATH="${TCL_BIN_DIR}/${TCL_STUB_LIB_FILE}" + fi + ;; + esac + fi + + # eval is required to do the TCL_DBGX substitution + eval "TCL_LIB_FLAG=\"${TCL_LIB_FLAG}\"" + eval "TCL_LIB_SPEC=\"${TCL_LIB_SPEC}\"" + eval "TCL_STUB_LIB_FLAG=\"${TCL_STUB_LIB_FLAG}\"" + eval "TCL_STUB_LIB_SPEC=\"${TCL_STUB_LIB_SPEC}\"" + + AC_SUBST(TCL_VERSION) + AC_SUBST(TCL_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_LIBS) + AC_SUBST(TCL_DEFS) + AC_SUBST(TCL_EXTRA_CFLAGS) + AC_SUBST(TCL_LD_FLAGS) + AC_SUBST(TCL_SHLIB_LD_LIBS) +]) + +#------------------------------------------------------------------------ +# TEA_LOAD_TKCONFIG -- +# +# Load the tkConfig.sh file +# +# Arguments: +# +# Requires the following vars to be set: +# TK_BIN_DIR +# +# Results: +# +# Sets the following vars that should be in tkConfig.sh: +# TK_BIN_DIR +#------------------------------------------------------------------------ + +AC_DEFUN(TEA_LOAD_TKCONFIG, [ + AC_MSG_CHECKING([for existence of ${TK_BIN_DIR}/tkConfig.sh]) + + if test -f "${TK_BIN_DIR}/tkConfig.sh" ; then + AC_MSG_RESULT([loading]) + . ${TK_BIN_DIR}/tkConfig.sh + else + AC_MSG_RESULT([could not find ${TK_BIN_DIR}/tkConfig.sh]) + fi + + # eval is required to do the TK_DBGX substitution + eval "TK_LIB_FILE=\"${TK_LIB_FILE}\"" + eval "TK_STUB_LIB_FILE=\"${TK_STUB_LIB_FILE}\"" + + # If the TK_BIN_DIR is the build directory (not the install directory), + # then set the common variable name to the value of the build variables. + # For example, the variable TK_LIB_SPEC will be set to the value + # of TK_BUILD_LIB_SPEC. An extension should make use of TK_LIB_SPEC + # instead of TK_BUILD_LIB_SPEC since it will work with both an + # installed and uninstalled version of Tcl. + if test -f ${TK_BIN_DIR}/Makefile ; then + TK_LIB_SPEC=${TK_BUILD_LIB_SPEC} + TK_STUB_LIB_SPEC=${TK_BUILD_STUB_LIB_SPEC} + TK_STUB_LIB_PATH=${TK_BUILD_STUB_LIB_PATH} + elif test "`uname -s`" = "Darwin"; then + # If Tk was built as a framework, attempt to use the libraries + # from the framework at the given location so that linking works + # against Tk.framework installed in an arbitary location. + case ${TK_DEFS} in + *TK_FRAMEWORK*) + if test -f ${TK_BIN_DIR}/${TK_LIB_FILE}; then + for i in "`cd ${TK_BIN_DIR}; pwd`" \ + "`cd ${TK_BIN_DIR}/../..; pwd`"; do + if test "`basename "$i"`" = "${TK_LIB_FILE}.framework"; then + TK_LIB_SPEC="-F`dirname "$i"` -framework ${TK_LIB_FILE}" + break + fi + done + fi + if test -f ${TK_BIN_DIR}/${TK_STUB_LIB_FILE}; then + TK_STUB_LIB_SPEC="-L${TK_BIN_DIR} ${TK_STUB_LIB_FLAG}" + TK_STUB_LIB_PATH="${TK_BIN_DIR}/${TK_STUB_LIB_FILE}" + fi + ;; + esac + fi + + # eval is required to do the TK_DBGX substitution + eval "TK_LIB_FLAG=\"${TK_LIB_FLAG}\"" + eval "TK_LIB_SPEC=\"${TK_LIB_SPEC}\"" + eval "TK_STUB_LIB_FLAG=\"${TK_STUB_LIB_FLAG}\"" + eval "TK_STUB_LIB_SPEC=\"${TK_STUB_LIB_SPEC}\"" + + # Ensure windowingsystem is defined + if test "${TEA_PLATFORM}" = "unix" ; then + case ${TK_DEFS} in + *MAC_OSX_TK*) + AC_DEFINE(MAC_OSX_TK, 1, [Are we building against Mac OS X TkAqua?]) + TEA_WINDOWINGSYSTEM="aqua" + ;; + *) + TEA_WINDOWINGSYSTEM="x11" + ;; + esac + elif test "${TEA_PLATFORM}" = "windows" ; then + TEA_WINDOWINGSYSTEM="win32" + fi + + AC_SUBST(TK_VERSION) + AC_SUBST(TK_BIN_DIR) + AC_SUBST(TK_SRC_DIR) + + AC_SUBST(TK_LIB_FILE) + AC_SUBST(TK_LIB_FLAG) + AC_SUBST(TK_LIB_SPEC) + + AC_SUBST(TK_STUB_LIB_FILE) + AC_SUBST(TK_STUB_LIB_FLAG) + AC_SUBST(TK_STUB_LIB_SPEC) + + 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, + AC_HELP_STRING([--enable-shared], + [build and link with shared libraries (default: on)]), + [tcl_ok=$enableval], [tcl_ok=yes]) + + if test "${enable_shared+set}" = set; then + enableval="$enable_shared" + tcl_ok=$enableval + else + tcl_ok=yes + fi + + if test "$tcl_ok" = "yes" ; then + AC_MSG_RESULT([shared]) + SHARED_BUILD=1 + else + AC_MSG_RESULT([static]) + SHARED_BUILD=0 + AC_DEFINE(STATIC_BUILD, 1, [Is this a static build?]) + fi + AC_SUBST(SHARED_BUILD) +]) + +#------------------------------------------------------------------------ +# TEA_ENABLE_THREADS -- +# +# Specify if thread support should be enabled. If "yes" is specified +# as an arg (optional), threads are enabled by default, "no" means +# threads are disabled. "yes" is the default. +# +# TCL_THREADS is checked so that if you are compiling an extension +# against a threaded core, your extension must be compiled threaded +# as well. +# +# Note that it is legal to have a thread enabled extension run in a +# threaded or non-threaded Tcl core, but a non-threaded extension may +# only run in a non-threaded Tcl core. +# +# Arguments: +# none +# +# Results: +# +# Adds the following arguments to configure: +# --enable-threads +# +# Sets the following vars: +# THREADS_LIBS Thread library(s) +# +# Defines the following vars: +# TCL_THREADS +# _REENTRANT +# _THREAD_SAFE +# +#------------------------------------------------------------------------ + +AC_DEFUN(TEA_ENABLE_THREADS, [ + AC_ARG_ENABLE(threads, + AC_HELP_STRING([--enable-threads], + [build with threads]), + [tcl_ok=$enableval], [tcl_ok=yes]) + + if test "${enable_threads+set}" = set; then + enableval="$enable_threads" + tcl_ok=$enableval + else + tcl_ok=yes + fi + + if test "$tcl_ok" = "yes" -o "${TCL_THREADS}" = 1; then + TCL_THREADS=1 + + if test "${TEA_PLATFORM}" != "windows" ; then + # We are always OK on Windows, so check what this platform wants: + + # USE_THREAD_ALLOC tells us to try the special thread-based + # allocator that significantly reduces lock contention + AC_DEFINE(USE_THREAD_ALLOC, 1, + [Do we want to use the threaded memory allocator?]) + AC_DEFINE(_REENTRANT, 1, [Do we want the reentrant OS API?]) + if test "`uname -s`" = "SunOS" ; then + AC_DEFINE(_POSIX_PTHREAD_SEMANTICS, 1, + [Do we really want to follow the standard? Yes we do!]) + fi + AC_DEFINE(_THREAD_SAFE, 1, [Do we want the thread-safe OS API?]) + AC_CHECK_LIB(pthread,pthread_mutex_init,tcl_ok=yes,tcl_ok=no) + if test "$tcl_ok" = "no"; then + # Check a little harder for __pthread_mutex_init in the same + # library, as some systems hide it there until pthread.h is + # defined. We could alternatively do an AC_TRY_COMPILE with + # pthread.h, but that will work with libpthread really doesn't + # exist, like AIX 4.2. [Bug: 4359] + AC_CHECK_LIB(pthread, __pthread_mutex_init, + tcl_ok=yes, tcl_ok=no) + fi + + if test "$tcl_ok" = "yes"; then + # The space is needed + THREADS_LIBS=" -lpthread" + else + AC_CHECK_LIB(pthreads, pthread_mutex_init, + tcl_ok=yes, tcl_ok=no) + if test "$tcl_ok" = "yes"; then + # The space is needed + THREADS_LIBS=" -lpthreads" + else + AC_CHECK_LIB(c, pthread_mutex_init, + tcl_ok=yes, tcl_ok=no) + if test "$tcl_ok" = "no"; then + AC_CHECK_LIB(c_r, pthread_mutex_init, + tcl_ok=yes, tcl_ok=no) + if test "$tcl_ok" = "yes"; then + # The space is needed + THREADS_LIBS=" -pthread" + else + TCL_THREADS=0 + AC_MSG_WARN([Do not know how to find pthread lib on your system - thread support disabled]) + fi + fi + fi + fi + fi + else + TCL_THREADS=0 + fi + # Do checking message here to not mess up interleaved configure output + AC_MSG_CHECKING([for building with threads]) + if test "${TCL_THREADS}" = 1; then + AC_DEFINE(TCL_THREADS, 1, [Are we building with threads enabled?]) + AC_MSG_RESULT([yes (default)]) + else + AC_MSG_RESULT([no]) + fi + # TCL_THREADS sanity checking. See if our request for building with + # threads is the same as the way Tcl was built. If not, warn the user. + case ${TCL_DEFS} in + *THREADS=1*) + if test "${TCL_THREADS}" = "0"; then + AC_MSG_WARN([ + Building ${PACKAGE_NAME} without threads enabled, but building against Tcl + that IS thread-enabled. It is recommended to use --enable-threads.]) + fi + ;; + *) + if test "${TCL_THREADS}" = "1"; then + AC_MSG_WARN([ + --enable-threads requested, but building against a Tcl that is NOT + thread-enabled. This is an OK configuration that will also run in + a thread-enabled core.]) + fi + ;; + esac + AC_SUBST(TCL_THREADS) +]) + +#------------------------------------------------------------------------ +# TEA_ENABLE_SYMBOLS -- +# +# Specify if debugging symbols should be used. +# Memory (TCL_MEM_DEBUG) debugging can also be enabled. +# +# Arguments: +# none +# +# TEA varies from core Tcl in that C|LDFLAGS_DEFAULT receives +# the value of C|LDFLAGS_OPTIMIZE|DEBUG already substituted. +# Requires the following vars to be set in the Makefile: +# CFLAGS_DEFAULT +# LDFLAGS_DEFAULT +# +# Results: +# +# Adds the following arguments to configure: +# --enable-symbols +# +# Defines the following vars: +# CFLAGS_DEFAULT Sets to $(CFLAGS_DEBUG) if true +# Sets to $(CFLAGS_OPTIMIZE) if false +# LDFLAGS_DEFAULT Sets to $(LDFLAGS_DEBUG) if true +# Sets to $(LDFLAGS_OPTIMIZE) if false +# DBGX Formerly used as debug library extension; +# always blank now. +# +#------------------------------------------------------------------------ + +AC_DEFUN(TEA_ENABLE_SYMBOLS, [ + dnl Make sure we are initialized + AC_REQUIRE([TEA_CONFIG_CFLAGS]) + AC_MSG_CHECKING([for build with symbols]) + AC_ARG_ENABLE(symbols, + AC_HELP_STRING([--enable-symbols], + [build with debugging symbols (default: off)]), + [tcl_ok=$enableval], [tcl_ok=no]) + DBGX="" + if test "$tcl_ok" = "no"; then + CFLAGS_DEFAULT="${CFLAGS_OPTIMIZE}" + LDFLAGS_DEFAULT="${LDFLAGS_OPTIMIZE}" + AC_MSG_RESULT([no]) + else + CFLAGS_DEFAULT="${CFLAGS_DEBUG}" + LDFLAGS_DEFAULT="${LDFLAGS_DEBUG}" + if test "$tcl_ok" = "yes"; then + AC_MSG_RESULT([yes (standard debugging)]) + fi + fi + if test "${TEA_PLATFORM}" != "windows" ; then + LDFLAGS_DEFAULT="${LDFLAGS}" + 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, 1, [Is memory debugging enabled?]) + fi + + if test "$tcl_ok" != "yes" -a "$tcl_ok" != "no"; then + if test "$tcl_ok" = "all"; then + AC_MSG_RESULT([enabled symbols mem debugging]) + else + AC_MSG_RESULT([enabled $tcl_ok debugging]) + fi + fi +]) + +#------------------------------------------------------------------------ +# TEA_ENABLE_LANGINFO -- +# +# Allows use of modern nl_langinfo check for better l10n. +# This is only relevant for Unix. +# +# Arguments: +# none +# +# Results: +# +# Adds the following arguments to configure: +# --enable-langinfo=yes|no (default is yes) +# +# Defines the following vars: +# HAVE_LANGINFO Triggers use of nl_langinfo if defined. +# +#------------------------------------------------------------------------ + +AC_DEFUN(TEA_ENABLE_LANGINFO, [ + AC_ARG_ENABLE(langinfo, + AC_HELP_STRING([--enable-langinfo], + [use nl_langinfo if possible to determine encoding at startup, otherwise use old heuristic (default: on)]), + [langinfo_ok=$enableval], [langinfo_ok=yes]) + + HAVE_LANGINFO=0 + if test "$langinfo_ok" = "yes"; then + AC_CHECK_HEADER(langinfo.h,[langinfo_ok=yes],[langinfo_ok=no]) + fi + AC_MSG_CHECKING([whether to use nl_langinfo]) + if test "$langinfo_ok" = "yes"; then + AC_CACHE_VAL(tcl_cv_langinfo_h, + AC_TRY_COMPILE([#include ], [nl_langinfo(CODESET);], + [tcl_cv_langinfo_h=yes],[tcl_cv_langinfo_h=no])) + AC_MSG_RESULT([$tcl_cv_langinfo_h]) + if test $tcl_cv_langinfo_h = yes; then + AC_DEFINE(HAVE_LANGINFO, 1, [Do we have nl_langinfo()?]) + fi + else + AC_MSG_RESULT([$langinfo_ok]) + fi +]) + +#-------------------------------------------------------------------- +# TEA_CONFIG_SYSTEM +# +# Determine what the system is (some things cannot be easily checked +# on a feature-driven basis, alas). This can usually be done via the +# "uname" command, but there are a few systems, like Next, where +# this doesn't work. +# +# Arguments: +# none +# +# Results: +# Defines the following var: +# +# system - System/platform/version identification code. +# +#-------------------------------------------------------------------- + +AC_DEFUN(TEA_CONFIG_SYSTEM, [ + AC_CACHE_CHECK([system version], tcl_cv_sys_version, [ + if test "${TEA_PLATFORM}" = "windows" ; then + tcl_cv_sys_version=windows + elif test -f /usr/lib/NextStep/software_version; then + tcl_cv_sys_version=NEXTSTEP-`awk '/3/,/3/' /usr/lib/NextStep/software_version` + else + tcl_cv_sys_version=`uname -s`-`uname -r` + if test "$?" -ne 0 ; then + AC_MSG_WARN([can't find uname command]) + tcl_cv_sys_version=unknown + else + # 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 + tcl_cv_sys_version=MP-RAS-`awk '{print $3}' /etc/.relid` + fi + if test "`uname -s`" = "AIX" ; then + tcl_cv_sys_version=AIX-`uname -v`.`uname -r` + fi + fi + fi + ]) + system=$tcl_cv_sys_version +]) + +#-------------------------------------------------------------------- +# TEA_CONFIG_CFLAGS +# +# Try to determine the proper flags to pass to the compiler +# for building shared libraries and other such nonsense. +# +# Arguments: +# none +# +# Results: +# +# Defines and substitutes the following vars: +# +# DL_OBJS - 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. Could +# be the same as CC_SEARCH_FLAGS if ${CC} is used to link. +# CC_SEARCH_FLAGS-Flags to pass to ${CC}, such as "-Wl,-rpath,/usr/local/tcl/lib", +# that tell the run-time dynamic linker where to look +# for shared libraries such as libtcl.so. Depends on +# the variable LIB_RUNTIME_DIR in the Makefile. +# SHLIB_CFLAGS - Flags to pass to cc when compiling the components +# of a shared library (may request position-independent +# code, among other things). +# SHLIB_LD - Base command to use for combining object files +# into a shared library. +# SHLIB_LD_LIBS - Dependent libraries for the linker to scan when +# creating shared libraries. This symbol typically +# goes at the end of the "ld" commands that build +# shared libraries. The value of the symbol 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. +# LIB_SUFFIX - Specifies everything that comes after the "libfoo" +# in a static or 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 a 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 +# CFLAGS - Additional CFLAGS added as necessary (usually 64-bit) +# +#-------------------------------------------------------------------- + +AC_DEFUN(TEA_CONFIG_CFLAGS, [ + dnl Make sure we are initialized + AC_REQUIRE([TEA_INIT]) + + # Step 0.a: Enable 64 bit support? + + AC_MSG_CHECKING([if 64bit support is requested]) + AC_ARG_ENABLE(64bit, + AC_HELP_STRING([--enable-64bit], + [enable 64bit support (default: off)]), + [do64bit=$enableval], [do64bit=no]) + AC_MSG_RESULT([$do64bit]) + + # Step 0.b: Enable Solaris 64 bit VIS support? + + AC_MSG_CHECKING([if 64bit Sparc VIS support is requested]) + AC_ARG_ENABLE(64bit-vis, + AC_HELP_STRING([--enable-64bit-vis], + [enable 64bit Sparc VIS support (default: off)]), + [do64bitVIS=$enableval], [do64bitVIS=no]) + AC_MSG_RESULT([$do64bitVIS]) + + 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. + + TEA_CONFIG_SYSTEM + + # 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) + + # Require ranlib early so we can override it in special cases below. + + AC_REQUIRE([AC_PROG_RANLIB]) + + # Step 3: set configuration options based on system name and version. + # This is similar to Tcl's unix/tcl.m4 except that we've added a + # "windows" case. + + do64bit_ok=no + LDFLAGS_ORIG="$LDFLAGS" + # When ld needs options to work in 64-bit mode, put them in + # LDFLAGS_ARCH so they eventually end up in LDFLAGS even if [load] + # is disabled by the user. [Bug 1016796] + LDFLAGS_ARCH="" + TCL_EXPORT_FILE_SUFFIX="" + UNSHARED_LIB_SUFFIX="" + TCL_TRIM_DOTS='`echo ${PACKAGE_VERSION} | tr -d .`' + ECHO_VERSION='`echo ${PACKAGE_VERSION}`' + TCL_LIB_VERSIONS_OK=ok + CFLAGS_DEBUG=-g + CFLAGS_OPTIMIZE=-O + if test "$GCC" = "yes" ; then + CFLAGS_OPTIMIZE=-O2 + CFLAGS_WARNING="-Wall -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' + LD_LIBRARY_PATH_VAR="LD_LIBRARY_PATH" + 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. + # This magic is based on MS Platform SDK for Win2003 SP1 - hobbs + # MACHINE is IX86 for LINK, but this is used by the manifest, + # which requires x86|amd64|ia64. + MACHINE="X86" + if test "$do64bit" != "no" ; then + if test "x${MSSDK}x" = "xx" ; then + MSSDK="C:/Progra~1/Microsoft Platform SDK" + fi + MSSDK=`echo "$MSSDK" | sed -e 's!\\\!/!g'` + PATH64="" + case "$do64bit" in + amd64|x64|yes) + MACHINE="AMD64" ; # default to AMD64 64-bit build + PATH64="${MSSDK}/Bin/Win64/x86/AMD64" + ;; + ia64) + MACHINE="IA64" + PATH64="${MSSDK}/Bin/Win64" + ;; + esac + if test ! -d "${PATH64}" ; then + AC_MSG_WARN([Could not find 64-bit $MACHINE SDK to enable 64bit mode]) + AC_MSG_WARN([Ensure latest Platform SDK is installed]) + do64bit="no" + else + AC_MSG_RESULT([ Using 64-bit $MACHINE mode]) + do64bit_ok="yes" + fi + fi + + if test "$doWince" != "no" ; then + if test "$do64bit" != "no" ; then + AC_MSG_ERROR([Windows/CE and 64-bit builds incompatible]) + fi + if test "$GCC" = "yes" ; then + AC_MSG_ERROR([Windows/CE and GCC builds incompatible]) + fi + TEA_PATH_CELIB + # Set defaults for common evc4/PPC2003 setup + # Currently Tcl requires 300+, possibly 420+ for sockets + CEVERSION=420; # could be 211 300 301 400 420 ... + TARGETCPU=ARMV4; # could be ARMV4 ARM MIPS SH3 X86 ... + ARCH=ARM; # could be ARM MIPS X86EM ... + PLATFORM="Pocket PC 2003"; # or "Pocket PC 2002" + if test "$doWince" != "yes"; then + # If !yes then the user specified something + # Reset ARCH to allow user to skip specifying it + ARCH= + eval `echo $doWince | awk -F, '{ \ + if (length([$]1)) { printf "CEVERSION=\"%s\"\n", [$]1; \ + if ([$]1 < 400) { printf "PLATFORM=\"Pocket PC 2002\"\n" } }; \ + if (length([$]2)) { printf "TARGETCPU=\"%s\"\n", toupper([$]2) }; \ + if (length([$]3)) { printf "ARCH=\"%s\"\n", toupper([$]3) }; \ + if (length([$]4)) { printf "PLATFORM=\"%s\"\n", [$]4 }; \ + }'` + if test "x${ARCH}" = "x" ; then + ARCH=$TARGETCPU; + fi + fi + OSVERSION=WCE$CEVERSION; + if test "x${WCEROOT}" = "x" ; then + WCEROOT="C:/Program Files/Microsoft eMbedded C++ 4.0" + if test ! -d "${WCEROOT}" ; then + WCEROOT="C:/Program Files/Microsoft eMbedded Tools" + fi + fi + if test "x${SDKROOT}" = "x" ; then + SDKROOT="C:/Program Files/Windows CE Tools" + if test ! -d "${SDKROOT}" ; then + SDKROOT="C:/Windows CE Tools" + fi + fi + WCEROOT=`echo "$WCEROOT" | sed -e 's!\\\!/!g'` + SDKROOT=`echo "$SDKROOT" | sed -e 's!\\\!/!g'` + if test ! -d "${SDKROOT}/${OSVERSION}/${PLATFORM}/Lib/${TARGETCPU}" \ + -o ! -d "${WCEROOT}/EVC/${OSVERSION}/bin"; then + AC_MSG_ERROR([could not find PocketPC SDK or target compiler to enable WinCE mode [$CEVERSION,$TARGETCPU,$ARCH,$PLATFORM]]) + doWince="no" + else + # We could PATH_NOSPACE these, but that's not important, + # as long as we quote them when used. + CEINCLUDE="${SDKROOT}/${OSVERSION}/${PLATFORM}/include" + if test -d "${CEINCLUDE}/${TARGETCPU}" ; then + CEINCLUDE="${CEINCLUDE}/${TARGETCPU}" + fi + CELIBPATH="${SDKROOT}/${OSVERSION}/${PLATFORM}/Lib/${TARGETCPU}" + fi + fi + + if test "$GCC" != "yes" ; then + if test "${SHARED_BUILD}" = "0" ; then + runtime=-MT + else + runtime=-MD + fi + + if test "$do64bit" != "no" ; then + # All this magic is necessary for the Win64 SDK RC1 - hobbs + CC="\"${PATH64}/cl.exe\"" + CFLAGS="${CFLAGS} -I\"${MSSDK}/Include\" -I\"${MSSDK}/Include/crt\" -I\"${MSSDK}/Include/crt/sys\"" + RC="\"${MSSDK}/bin/rc.exe\"" + lflags="-nologo -MACHINE:${MACHINE} -LIBPATH:\"${MSSDK}/Lib/${MACHINE}\"" + LINKBIN="\"${PATH64}/link.exe\"" + CFLAGS_DEBUG="-nologo -Zi -Od -W3 ${runtime}d" + CFLAGS_OPTIMIZE="-nologo -O2 -W2 ${runtime}" + # Avoid 'unresolved external symbol __security_cookie' + # errors, c.f. http://support.microsoft.com/?id=894573 + TEA_ADD_LIBS([bufferoverflowU.lib]) + elif test "$doWince" != "no" ; then + CEBINROOT="${WCEROOT}/EVC/${OSVERSION}/bin" + if test "${TARGETCPU}" = "X86"; then + CC="\"${CEBINROOT}/cl.exe\"" + else + CC="\"${CEBINROOT}/cl${ARCH}.exe\"" + fi + CFLAGS="$CFLAGS -I\"${CELIB_DIR}/inc\" -I\"${CEINCLUDE}\"" + RC="\"${WCEROOT}/Common/EVC/bin/rc.exe\"" + arch=`echo ${ARCH} | awk '{print tolower([$]0)}'` + defs="${ARCH} _${ARCH}_ ${arch} PALM_SIZE _MT _WINDOWS" + if test "${SHARED_BUILD}" = "1" ; then + # Static CE builds require static celib as well + defs="${defs} _DLL" + fi + for i in $defs ; do + AC_DEFINE_UNQUOTED($i, 1, [WinCE def ]$i) + done + AC_DEFINE_UNQUOTED(_WIN32_WCE, $CEVERSION, [_WIN32_WCE version]) + AC_DEFINE_UNQUOTED(UNDER_CE, $CEVERSION, [UNDER_CE version]) + CFLAGS_DEBUG="-nologo -Zi -Od" + CFLAGS_OPTIMIZE="-nologo -Ox" + lversion=`echo ${CEVERSION} | sed -e 's/\(.\)\(..\)/\1\.\2/'` + lflags="-MACHINE:${ARCH} -LIBPATH:\"${CELIBPATH}\" -subsystem:windowsce,${lversion} -nologo" + LINKBIN="\"${CEBINROOT}/link.exe\"" + AC_SUBST(CELIB_DIR) + else + RC="rc" + lflags="-nologo" + LINKBIN="link" + CFLAGS_DEBUG="-nologo -Z7 -Od -W3 -WX ${runtime}d" + CFLAGS_OPTIMIZE="-nologo -O2 -W2 ${runtime}" + fi + fi + + if test "$GCC" = "yes"; then + # mingw gcc mode + RC="windres" + CFLAGS_DEBUG="-g" + CFLAGS_OPTIMIZE="-O2 -fomit-frame-pointer" + SHLIB_LD="$CC -shared" + UNSHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.a' + LDFLAGS_CONSOLE="-wl,--subsystem,console ${lflags}" + LDFLAGS_WINDOW="-wl,--subsystem,windows ${lflags}" + else + SHLIB_LD="${LINKBIN} -dll ${lflags}" + # link -lib only works when -lib is the first arg + STLIB_LD="${LINKBIN} -lib ${lflags}" + UNSHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.lib' + PATHTYPE=-w + # For information on what debugtype is most useful, see: + # http://msdn.microsoft.com/library/en-us/dnvc60/html/gendepdebug.asp + # 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}.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 + case "${CC}" in + *_r) + # ok ... + ;; + *) + CC=${CC}_r + ;; + esac + AC_MSG_RESULT([Using $CC for compiling with threads]) + fi + LIBS="$LIBS -lc" + SHLIB_CFLAGS="" + SHLIB_LD_LIBS='${LIBS}' + SHLIB_SUFFIX=".so" + + DL_OBJS="tclLoadDl.o" + LD_LIBRARY_PATH_VAR="LIBPATH" + + # 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 + CFLAGS="$CFLAGS -q64" + LDFLAGS_ARCH="-q64" + RANLIB="${RANLIB} -X64" + AR="${AR} -X64" + SHLIB_LD_FLAGS="-b64" + fi + fi + + 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 + CC_SEARCH_FLAGS='-Wl,-R,${LIB_RUNTIME_DIR}' + else + CC_SEARCH_FLAGS='-R${LIB_RUNTIME_DIR}' + fi + LD_SEARCH_FLAGS='-R ${LIB_RUNTIME_DIR}' + else + if test "$GCC" = "yes" ; then + SHLIB_LD="gcc -shared" + else + SHLIB_LD="/bin/ld -bhalt:4 -bM:SRE -bE:lib.exp -H512 -T512 -bnoentry" + fi + SHLIB_LD="${TCL_SRC_DIR}/unix/ldAix ${SHLIB_LD} ${SHLIB_LD_FLAGS}" + DL_LIBS="-ldl" + CC_SEARCH_FLAGS='-L${LIB_RUNTIME_DIR}' + LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} + TCL_NEEDS_EXP_FILE=1 + TCL_EXPORT_FILE_SUFFIX='${PACKAGE_VERSION}.exp' + fi + + # 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, 1, [Do we need a special AIX hack for timezones?]) + fi + ;; + BeOS*) + SHLIB_CFLAGS="-fPIC" + SHLIB_LD="${CC} -nostart" + SHLIB_LD_LIBS='${LIBS}' + SHLIB_SUFFIX=".so" + DL_OBJS="tclLoadDl.o" + DL_LIBS="-ldl" + + #----------------------------------------------------------- + # Check for inet_ntoa in -lbind, for BeOS (which also needs + # -lsocket, even if the network functions are in -lnet which + # is always linked to, for compatibility. + #----------------------------------------------------------- + AC_CHECK_LIB(bind, inet_ntoa, [LIBS="$LIBS -lbind -lsocket"]) + ;; + BSD/OS-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" + CC_SEARCH_FLAGS="" + 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="$LDFLAGS -export-dynamic" + CC_SEARCH_FLAGS="" + 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" + CC_SEARCH_FLAGS="" + LD_SEARCH_FLAGS="" + ;; + HP-UX-*.11.*) + # Use updated header definitions where possible + AC_DEFINE(_XOPEN_SOURCE_EXTENDED, 1, [Do we want to use the XOPEN network library?]) + # Needed by Tcl, but not most extensions + #AC_DEFINE(_XOPEN_SOURCE, 1, [Do we want to use the XOPEN network library?]) + #LIBS="$LIBS -lxnet" # Use the XOPEN network library + + 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="$LDFLAGS -Wl,-E" + CC_SEARCH_FLAGS='-Wl,+s,+b,${LIB_RUNTIME_DIR}:.' + LD_SEARCH_FLAGS='+s +b ${LIB_RUNTIME_DIR}:.' + LD_LIBRARY_PATH_VAR="SHLIB_PATH" + fi + if test "$GCC" = "yes" ; then + SHLIB_LD="gcc -shared" + SHLIB_LD_LIBS='${LIBS}' + LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} + fi + + # Users may want PA-RISC 1.1/2.0 portable code - needs HP cc + #CFLAGS="$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='${LIBS}' + CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' + LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} + ;; + *) + AC_MSG_WARN([64bit mode not supported with GCC on $system]) + ;; + esac + else + do64bit_ok=yes + CFLAGS="$CFLAGS +DD64" + LDFLAGS_ARCH="+DD64" + 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="$LDFLAGS -Wl,-E" + CC_SEARCH_FLAGS='-Wl,+s,+b,${LIB_RUNTIME_DIR}:.' + LD_SEARCH_FLAGS='+s +b ${LIB_RUNTIME_DIR}:.' + LD_LIBRARY_PATH_VAR="SHLIB_PATH" + fi + ;; + IRIX-5.*) + SHLIB_CFLAGS="" + SHLIB_LD="ld -shared -rdata_shared" + SHLIB_LD_LIBS='${LIBS}' + SHLIB_SUFFIX=".so" + DL_OBJS="tclLoadDl.o" + DL_LIBS="" + CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' + LD_SEARCH_FLAGS='-rpath ${LIB_RUNTIME_DIR}' + ;; + IRIX-6.*) + SHLIB_CFLAGS="" + SHLIB_LD="ld -n32 -shared -rdata_shared" + SHLIB_LD_LIBS='${LIBS}' + SHLIB_SUFFIX=".so" + DL_OBJS="tclLoadDl.o" + DL_LIBS="" + CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' + LD_SEARCH_FLAGS='-rpath ${LIB_RUNTIME_DIR}' + if test "$GCC" = "yes" ; then + CFLAGS="$CFLAGS -mabi=n32" + LDFLAGS="$LDFLAGS -mabi=n32" + else + case $system in + IRIX-6.3) + # Use to build 6.2 compatible binaries on 6.3. + CFLAGS="$CFLAGS -n32 -D_OLD_TERMIOS" + ;; + *) + CFLAGS="$CFLAGS -n32" + ;; + esac + LDFLAGS="$LDFLAGS -n32" + 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="" + CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' + LD_SEARCH_FLAGS='-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" + CFLAGS="$CFLAGS -64" + LDFLAGS_ARCH="-64" + fi + fi + ;; + Linux*) + SHLIB_CFLAGS="-fPIC" + SHLIB_LD_LIBS='${LIBS}' + SHLIB_SUFFIX=".so" + + CFLAGS_OPTIMIZE="-O2 -fomit-frame-pointer" + # 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" + + SHLIB_LD="${CC} -shared" + DL_OBJS="tclLoadDl.o" + DL_LIBS="-ldl" + LDFLAGS="$LDFLAGS -Wl,--export-dynamic" + CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' + LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} + if test "`uname -m`" = "alpha" ; then + CFLAGS="$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"${USE_COMPAT}" != x ; then + CFLAGS="$CFLAGS -fno-inline" + fi + + ;; + GNU*) + SHLIB_CFLAGS="-fPIC" + SHLIB_LD_LIBS='${LIBS}' + SHLIB_SUFFIX=".so" + + SHLIB_LD="${CC} -shared" + DL_OBJS="" + DL_LIBS="-ldl" + LDFLAGS="$LDFLAGS -Wl,--export-dynamic" + CC_SEARCH_FLAGS="" + LD_SEARCH_FLAGS="" + if test "`uname -m`" = "alpha" ; then + CFLAGS="$CFLAGS -mieee" + fi + ;; + Lynx*) + SHLIB_CFLAGS="-fPIC" + SHLIB_LD_LIBS='${LIBS}' + SHLIB_SUFFIX=".so" + CFLAGS_OPTIMIZE=-02 + SHLIB_LD="${CC} -shared " + DL_OBJS="tclLoadDl.o" + DL_LIBS="-mshared -ldl" + LD_FLAGS="-Wl,--export-dynamic" + CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' + LD_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' + ;; + MP-RAS-02*) + SHLIB_CFLAGS="-K PIC" + SHLIB_LD="cc -G" + SHLIB_LD_LIBS="" + SHLIB_SUFFIX=".so" + DL_OBJS="tclLoadDl.o" + DL_LIBS="-ldl" + CC_SEARCH_FLAGS="" + 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="$LDFLAGS -Wl,-Bexport" + CC_SEARCH_FLAGS="" + LD_SEARCH_FLAGS="" + ;; + NetBSD-*|FreeBSD-[[1-2]].*) + # 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="" + CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' + LD_SEARCH_FLAGS='-rpath ${LIB_RUNTIME_DIR}' + AC_CACHE_CHECK([for ELF], tcl_cv_ld_elf, [ + AC_EGREP_CPP(yes, [ +#ifdef __ELF__ + yes +#endif + ], tcl_cv_ld_elf=yes, tcl_cv_ld_elf=no)]) + if test $tcl_cv_ld_elf = yes; then + SHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.so' + else + SHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.so.1.0' + fi + + # Ancient FreeBSD doesn't handle version numbers with dots. + + UNSHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.a' + TCL_LIB_VERSIONS_OK=nodots + ;; + OpenBSD-*) + # OpenBSD/SPARC[64] needs -fPIC, -fpic will not do. + case `machine` in + sparc|sparc64) + SHLIB_CFLAGS="-fPIC";; + *) + SHLIB_CFLAGS="-fpic";; + esac + SHLIB_LD="${CC} -shared ${SHLIB_CFLAGS}" + SHLIB_LD_LIBS='${LIBS}' + SHLIB_SUFFIX=".so" + DL_OBJS="tclLoadDl.o" + DL_LIBS="" + CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' + LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} + SHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.so.1.0' + AC_CACHE_CHECK([for ELF], tcl_cv_ld_elf, [ + AC_EGREP_CPP(yes, [ +#ifdef __ELF__ + yes +#endif + ], tcl_cv_ld_elf=yes, tcl_cv_ld_elf=no)]) + if test $tcl_cv_ld_elf = yes; then + LDFLAGS=-Wl,-export-dynamic + else + LDFLAGS="" + fi + + # OpenBSD doesn't do version numbers with dots. + UNSHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.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="$LDFLAGS -export-dynamic" + CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' + LD_SEARCH_FLAGS='-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//` + CFLAGS="$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}.a' + SHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.so' + TCL_LIB_VERSIONS_OK=nodots + ;; + esac + ;; + Darwin-*) + CFLAGS_OPTIMIZE="-Os" + SHLIB_CFLAGS="-fno-common" + if test $do64bit = yes; then + do64bit_ok=yes + CFLAGS="$CFLAGS -arch ppc64 -mpowerpc64 -mcpu=G5" + fi + # TEA specific: use LDFLAGS_DEFAULT instead of LDFLAGS here: + SHLIB_LD='${CC} -dynamiclib ${CFLAGS} ${LDFLAGS_DEFAULT}' + AC_CACHE_CHECK([if ld accepts -single_module flag], tcl_cv_ld_single_module, [ + hold_ldflags=$LDFLAGS + LDFLAGS="$LDFLAGS -dynamiclib -Wl,-single_module" + AC_TRY_LINK(, [int i;], tcl_cv_ld_single_module=yes, tcl_cv_ld_single_module=no) + LDFLAGS=$hold_ldflags]) + if test $tcl_cv_ld_single_module = yes; then + SHLIB_LD="${SHLIB_LD} -Wl,-single_module" + fi + SHLIB_LD_LIBS='${LIBS}' + SHLIB_SUFFIX=".dylib" + DL_OBJS="tclLoadDyld.o" + DL_LIBS="" + # Don't use -prebind when building for Mac OS X 10.4 or later only: + test -z "${MACOSX_DEPLOYMENT_TARGET}" || \ + test "`echo "${MACOSX_DEPLOYMENT_TARGET}" | awk -F. '{print [$]2}'`" -lt 4 && \ + LDFLAGS="$LDFLAGS -prebind" + LDFLAGS="$LDFLAGS -headerpad_max_install_names" + AC_CACHE_CHECK([if ld accepts -search_paths_first flag], tcl_cv_ld_search_paths_first, [ + hold_ldflags=$LDFLAGS + LDFLAGS="$LDFLAGS -Wl,-search_paths_first" + AC_TRY_LINK(, [int i;], tcl_cv_ld_search_paths_first=yes, tcl_cv_ld_search_paths_first=no) + LDFLAGS=$hold_ldflags]) + if test $tcl_cv_ld_search_paths_first = yes; then + LDFLAGS="$LDFLAGS -Wl,-search_paths_first" + fi + CC_SEARCH_FLAGS="" + LD_SEARCH_FLAGS="" + LD_LIBRARY_PATH_VAR="DYLD_LIBRARY_PATH" + + # TEA specific: for Tk extensions, remove -arch ppc64 from CFLAGS + # for fat builds, as neither TkAqua nor TkX11 can be built for 64bit + # at present (no 64bit GUI libraries). + test $do64bit_ok = no && test -n "${TK_BIN_DIR}" && \ + CFLAGS="`echo "$CFLAGS" | sed -e 's/-arch ppc64/-arch ppc/g'`" + ;; + NEXTSTEP-*) + SHLIB_CFLAGS="" + SHLIB_LD="cc -nostdlib -r" + SHLIB_LD_LIBS="" + SHLIB_SUFFIX=".so" + DL_OBJS="tclLoadNext.o" + DL_LIBS="" + CC_SEARCH_FLAGS="" + LD_SEARCH_FLAGS="" + ;; + OS/390-*) + CFLAGS_OPTIMIZE="" # Optimizer is buggy + AC_DEFINE(_OE_SOCKETS, 1, # needed in sys/socket.h + [Should OS/390 do the right thing with sockets?]) + ;; + OSF1-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="" + CC_SEARCH_FLAGS="" + 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="" + CC_SEARCH_FLAGS="" + 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="" + CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' + LD_SEARCH_FLAGS='-rpath ${LIB_RUNTIME_DIR}' + if test "$GCC" = "yes" ; then + CFLAGS="$CFLAGS -mieee" + else + CFLAGS="$CFLAGS -DHAVE_TZSET -std1 -ieee" + fi + # see pthread_intro(3) for pthread support on osf1, k.furukawa + if test "${TCL_THREADS}" = "1" ; then + CFLAGS="$CFLAGS -DHAVE_PTHREAD_ATTR_SETSTACKSIZE" + CFLAGS="$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 + CFLAGS="$CFLAGS -pthread" + LDFLAGS="$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="" + CC_SEARCH_FLAGS="" + LD_SEARCH_FLAGS="" + ;; + 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="$LDFLAGS -melf -Wl,-Bexport" + else + SHLIB_CFLAGS="-Kpic -belf" + LDFLAGS="$LDFLAGS -belf -Wl,-Bexport" + fi + SHLIB_LD="ld -G" + SHLIB_LD_LIBS="" + SHLIB_SUFFIX=".so" + DL_OBJS="tclLoadDl.o" + DL_LIBS="" + CC_SEARCH_FLAGS="" + 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" + CC_SEARCH_FLAGS="" + LD_SEARCH_FLAGS="" + ;; + SunOS-4*) + SHLIB_CFLAGS="-PIC" + SHLIB_LD="ld" + SHLIB_LD_LIBS="" + SHLIB_SUFFIX=".so" + DL_OBJS="tclLoadDl.o" + DL_LIBS="-ldl" + CC_SEARCH_FLAGS='-L${LIB_RUNTIME_DIR}' + LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} + + # 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}.so.1.0' + UNSHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.a' + TCL_LIB_VERSIONS_OK=nodots + ;; + SunOS-5.[[0-6]]) + # Careful to not let 5.10+ fall into this case + + # Note: If _REENTRANT isn't defined, then Solaris + # won't define thread-safe library routines. + + AC_DEFINE(_REENTRANT, 1, [Do we want the reentrant OS API?]) + AC_DEFINE(_POSIX_PTHREAD_SEMANTICS, 1, + [Do we really want to follow the standard? Yes we do!]) + + SHLIB_CFLAGS="-KPIC" + + # 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" + CC_SEARCH_FLAGS='-Wl,-R,${LIB_RUNTIME_DIR}' + LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} + else + SHLIB_LD="/usr/ccs/bin/ld -G -z text" + CC_SEARCH_FLAGS='-R ${LIB_RUNTIME_DIR}' + LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} + fi + ;; + SunOS-5*) + # Note: If _REENTRANT isn't defined, then Solaris + # won't define thread-safe library routines. + + AC_DEFINE(_REENTRANT, 1, [Do we want the reentrant OS API?]) + AC_DEFINE(_POSIX_PTHREAD_SEMANTICS, 1, + [Do we really want to follow the standard? Yes we do!]) + + SHLIB_CFLAGS="-KPIC" + + # Check to enable 64-bit flags for compiler/linker + if test "$do64bit" = "yes" ; then + arch=`isainfo` + if test "$arch" = "sparcv9 sparc" ; then + if test "$GCC" = "yes" ; then + if test "`gcc -dumpversion | awk -F. '{print [$]1}'`" -lt "3" ; then + AC_MSG_WARN([64bit mode not supported with GCC < 3.2 on $system]) + else + do64bit_ok=yes + CFLAGS="$CFLAGS -m64 -mcpu=v9" + LDFLAGS="$LDFLAGS -m64 -mcpu=v9" + SHLIB_CFLAGS="-fPIC" + fi + else + do64bit_ok=yes + if test "$do64bitVIS" = "yes" ; then + CFLAGS="$CFLAGS -xarch=v9a" + LDFLAGS_ARCH="-xarch=v9a" + else + CFLAGS="$CFLAGS -xarch=v9" + LDFLAGS_ARCH="-xarch=v9" + fi + # Solaris 64 uses this as well + #LD_LIBRARY_PATH_VAR="LD_LIBRARY_PATH_64" + fi + elif test "$arch" = "amd64 i386" ; then + if test "$GCC" = "yes" ; then + AC_MSG_WARN([64bit mode not supported with GCC on $system]) + else + do64bit_ok=yes + CFLAGS="$CFLAGS -xarch=amd64" + LDFLAGS="$LDFLAGS -xarch=amd64" + fi + else + AC_MSG_WARN([64bit mode not supported for $arch]) + 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" + CC_SEARCH_FLAGS='-Wl,-R,${LIB_RUNTIME_DIR}' + LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} + if test "$do64bit_ok" = "yes" ; then + # We need to specify -static-libgcc or we need to + # add the path to the sparv9 libgcc. + # JH: static-libgcc is necessary for core Tcl, but may + # not be necessary for extensions. + SHLIB_LD="$SHLIB_LD -m64 -mcpu=v9 -static-libgcc" + # for finding sparcv9 libgcc, get the regular libgcc + # path, remove so name and append 'sparcv9' + #v9gcclibdir="`gcc -print-file-name=libgcc_s.so` | ..." + #CC_SEARCH_FLAGS="${CC_SEARCH_FLAGS},-R,$v9gcclibdir" + fi + else + SHLIB_LD="/usr/ccs/bin/ld -G -z text" + CC_SEARCH_FLAGS='-Wl,-R,${LIB_RUNTIME_DIR}' + LD_SEARCH_FLAGS='-R ${LIB_RUNTIME_DIR}' + 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. + AC_CACHE_CHECK([for ld accepts -Bexport flag], tcl_cv_ld_Bexport, [ + hold_ldflags=$LDFLAGS + LDFLAGS="$LDFLAGS -Wl,-Bexport" + AC_TRY_LINK(, [int i;], tcl_cv_ld_Bexport=yes, tcl_cv_ld_Bexport=no) + LDFLAGS=$hold_ldflags]) + if test $tcl_cv_ld_Bexport = yes; then + LDFLAGS="$LDFLAGS -Wl,-Bexport" + fi + CC_SEARCH_FLAGS="" + 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: disable dynamic loading if requested via a command-line switch. + + AC_ARG_ENABLE(load, + AC_HELP_STRING([--disable-load], + [disallow dynamic loading and "load" command (default: enabled)]), + [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="$LDFLAGS_ORIG" + CC_SEARCH_FLAGS="" + LD_SEARCH_FLAGS="" + BUILD_DLTEST="" + fi + LDFLAGS="$LDFLAGS $LDFLAGS_ARCH" + + # If we're running gcc, then change the C flags for compiling shared + # libraries to the right flags for gcc, instead of those for the + # standard manufacturer compiler. + + if test "$DL_OBJS" != "tclLoadNone.o" ; then + if test "$GCC" = "yes" ; then + case $system in + AIX-*) + ;; + BSD/OS*) + ;; + IRIX*) + ;; + NetBSD-*|FreeBSD-*) + ;; + Darwin-*) + ;; + SCO_SV-3.2*) + ;; + windows) + ;; + *) + SHLIB_CFLAGS="-fPIC" + ;; + esac + fi + fi + + if test "$SHARED_LIB_SUFFIX" = "" ; then + SHARED_LIB_SUFFIX='${PACKAGE_VERSION}${SHLIB_SUFFIX}' + fi + if test "$UNSHARED_LIB_SUFFIX" = "" ; then + UNSHARED_LIB_SUFFIX='${PACKAGE_VERSION}.a' + fi + + AC_SUBST(DL_LIBS) + + AC_SUBST(CFLAGS_DEBUG) + AC_SUBST(CFLAGS_OPTIMIZE) + AC_SUBST(CFLAGS_WARNING) + + AC_SUBST(STLIB_LD) + AC_SUBST(SHLIB_LD) + + AC_SUBST(SHLIB_LD_LIBS) + AC_SUBST(SHLIB_CFLAGS) + + AC_SUBST(LD_LIBRARY_PATH_VAR) + + # These must be called after we do the basic CFLAGS checks and + # verify any possible 64-bit or similar switches are necessary + TEA_TCL_EARLY_FLAGS + TEA_TCL_64BIT_FLAGS +]) + +#-------------------------------------------------------------------- +# TEA_SERIAL_PORT +# +# Determine which interface to use to talk to the serial port. +# Note that #include lines must begin in leftmost column for +# some compilers to recognize them as preprocessor directives, +# and some build environments have stdin not pointing at a +# pseudo-terminal (usually /dev/null instead.) +# +# Arguments: +# none +# +# Results: +# +# Defines only one of the following vars: +# HAVE_SYS_MODEM_H +# USE_TERMIOS +# USE_TERMIO +# USE_SGTTY +# +#-------------------------------------------------------------------- + +AC_DEFUN(TEA_SERIAL_PORT, [ + AC_CHECK_HEADERS(sys/modem.h) + AC_CACHE_CHECK([termios vs. termio vs. sgtty], tcl_cv_api_serial, [ + AC_TRY_RUN([ +#include + +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=no, tcl_cv_api_serial=no) + 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, 1, [Use the termios API for serial lines]);; + termio) AC_DEFINE(USE_TERMIO, 1, [Use the termio API for serial lines]);; + sgtty) AC_DEFINE(USE_SGTTY, 1, [Use the sgtty API for serial lines]);; + esac +]) + +#-------------------------------------------------------------------- +# TEA_MISSING_POSIX_HEADERS +# +# Supply substitutes for missing POSIX header files. Special +# notes: +# - stdlib.h doesn't define strtol, strtoul, or +# strtod 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 +# HAVE_LIMITS_H or NO_LIMITS_H +# NO_STDLIB_H +# NO_STRING_H +# NO_SYS_WAIT_H +# NO_DLFCN_H +# HAVE_SYS_PARAM_H +# +# HAVE_STRING_H ? +# +# tkUnixPort.h checks for HAVE_LIMITS_H, so do both HAVE and +# CHECK on limits.h +#-------------------------------------------------------------------- + +AC_DEFUN(TEA_MISSING_POSIX_HEADERS, [ + AC_CACHE_CHECK([dirent.h], tcl_cv_dirent_h, + AC_TRY_LINK([#include +#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_cv_dirent_h=yes, tcl_cv_dirent_h=no)) + + if test $tcl_cv_dirent_h = no; then + AC_DEFINE(NO_DIRENT_H, 1, [Do we have ?]) + fi + + AC_CHECK_HEADER(errno.h, , [AC_DEFINE(NO_ERRNO_H, 1, [Do we have ?])]) + AC_CHECK_HEADER(float.h, , [AC_DEFINE(NO_FLOAT_H, 1, [Do we have ?])]) + AC_CHECK_HEADER(values.h, , [AC_DEFINE(NO_VALUES_H, 1, [Do we have ?])]) + AC_CHECK_HEADER(limits.h, + [AC_DEFINE(HAVE_LIMITS_H, 1, [Do we have ?])], + [AC_DEFINE(NO_LIMITS_H, 1, [Do we have ?])]) + AC_CHECK_HEADER(stdlib.h, tcl_ok=1, tcl_ok=0) + AC_EGREP_HEADER(strtol, stdlib.h, , tcl_ok=0) + AC_EGREP_HEADER(strtoul, stdlib.h, , tcl_ok=0) + AC_EGREP_HEADER(strtod, stdlib.h, , tcl_ok=0) + if test $tcl_ok = 0; then + AC_DEFINE(NO_STDLIB_H, 1, [Do we have ?]) + fi + AC_CHECK_HEADER(string.h, tcl_ok=1, tcl_ok=0) + AC_EGREP_HEADER(strstr, string.h, , tcl_ok=0) + AC_EGREP_HEADER(strerror, string.h, , tcl_ok=0) + + # See also memmove check below for a place where NO_STRING_H can be + # set and why. + + if test $tcl_ok = 0; then + AC_DEFINE(NO_STRING_H, 1, [Do we have ?]) + fi + + AC_CHECK_HEADER(sys/wait.h, , [AC_DEFINE(NO_SYS_WAIT_H, 1, [Do we have ?])]) + AC_CHECK_HEADER(dlfcn.h, , [AC_DEFINE(NO_DLFCN_H, 1, [Do we have ?])]) + + # OS/390 lacks sys/param.h (and doesn't need it, by chance). + AC_HAVE_HEADERS(sys/param.h) +]) + +#-------------------------------------------------------------------- +# TEA_PATH_X +# +# Locate the X11 header files and the X11 library archive. Try +# the ac_path_x macro first, but if it doesn't find the X stuff +# (e.g. because there's no xmkmf program) then check through +# a list of possible directories. Under some conditions the +# autoconf macro will return an include directory that contains +# no include files, so double-check its result just to be safe. +# +# This should be called after TEA_CONFIG_CFLAGS as setting the +# LIBS line can confuse some configure macro magic. +# +# Arguments: +# none +# +# Results: +# +# Sets the following vars: +# XINCLUDES +# XLIBSW +# PKG_LIBS (appends to) +# +#-------------------------------------------------------------------- + +AC_DEFUN(TEA_PATH_X, [ + if test "${TEA_WINDOWINGSYSTEM}" = "x11" ; then + TEA_PATH_UNIX_X + fi +]) + +AC_DEFUN(TEA_PATH_UNIX_X, [ + AC_PATH_X + not_really_there="" + if test "$no_x" = ""; then + if test "$x_includes" = ""; then + AC_TRY_CPP([#include ], , 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]) + found_xincludes="no" + AC_TRY_CPP([#include ], found_xincludes="yes", found_xincludes="no") + if test "$found_xincludes" = "no"; then + dirs="/usr/unsupported/include /usr/local/include /usr/X386/include /usr/X11R6/include /usr/X11R5/include /usr/include/X11R5 /usr/include/X11R4 /usr/openwin/include /usr/X11/include /usr/sww/include" + for i in $dirs ; do + if test -r $i/X11/Intrinsic.h; then + AC_MSG_RESULT([$i]) + XINCLUDES=" -I$i" + found_xincludes="yes" + break + fi + done + fi + else + if test "$x_includes" != ""; then + XINCLUDES="-I$x_includes" + found_xincludes="yes" + fi + fi + if test found_xincludes = "no"; then + AC_MSG_RESULT([couldn't find any!]) + fi + + if test "$no_x" = yes; then + AC_MSG_CHECKING([for X11 libraries]) + XLIBSW=nope + dirs="/usr/unsupported/lib /usr/local/lib /usr/X386/lib /usr/X11R6/lib /usr/X11R5/lib /usr/lib/X11R5 /usr/lib/X11R4 /usr/openwin/lib /usr/X11/lib /usr/sww/X11/lib" + for i in $dirs ; do + if test -r $i/libX11.a -o -r $i/libX11.so -o -r $i/libX11.sl; 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 + PKG_LIBS="${PKG_LIBS} ${XLIBSW}" + fi +]) + +#-------------------------------------------------------------------- +# TEA_BLOCKING_STYLE +# +# The statements below check for systems where POSIX-style +# non-blocking I/O (O_NONBLOCK) doesn't work or is unimplemented. +# On these systems (mostly older ones), use the old BSD-style +# FIONBIO approach instead. +# +# Arguments: +# none +# +# Results: +# +# Defines some of the following vars: +# HAVE_SYS_IOCTL_H +# HAVE_SYS_FILIO_H +# USE_FIONBIO +# O_NONBLOCK +# +#-------------------------------------------------------------------- + +AC_DEFUN(TEA_BLOCKING_STYLE, [ + AC_CHECK_HEADERS(sys/ioctl.h) + AC_CHECK_HEADERS(sys/filio.h) + TEA_CONFIG_SYSTEM + AC_MSG_CHECKING([FIONBIO vs. O_NONBLOCK for nonblocking I/O]) + case $system in + # 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, 1, [Should we use FIONBIO?]) + AC_MSG_RESULT([FIONBIO]) + ;; + SunOS-4*) + AC_DEFINE(USE_FIONBIO, 1, [Should we 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_CACHE_CHECK([tm_tzadj in struct tm], 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)) + if test $tcl_cv_member_tm_tzadj = yes ; then + AC_DEFINE(HAVE_TM_TZADJ, 1, [Should we use the tm_tzadj field of struct tm?]) + fi + + AC_CACHE_CHECK([tm_gmtoff in struct tm], tcl_cv_member_tm_gmtoff, + AC_TRY_COMPILE([#include ], [struct tm tm; tm.tm_gmtoff;], + tcl_cv_member_tm_gmtoff=yes, tcl_cv_member_tm_gmtoff=no)) + if test $tcl_cv_member_tm_gmtoff = yes ; then + AC_DEFINE(HAVE_TM_GMTOFF, 1, [Should we use the tm_gmtoff field of struct tm?]) + fi + + # + # Its important to include time.h in this check, as some systems + # (like convex) have timezone functions, etc. + # + AC_CACHE_CHECK([long timezone variable], tcl_cv_timezone_long, + AC_TRY_COMPILE([#include ], + [extern long timezone; + timezone += 1; + exit (0);], + tcl_cv_timezone_long=yes, tcl_cv_timezone_long=no)) + if test $tcl_cv_timezone_long = yes ; then + AC_DEFINE(HAVE_TIMEZONE_VAR, 1, [Should we use the global timezone variable?]) + else + # + # On some systems (eg IRIX 6.2), timezone is a time_t and not a long. + # + AC_CACHE_CHECK([time_t timezone variable], tcl_cv_timezone_time, + AC_TRY_COMPILE([#include ], + [extern time_t timezone; + timezone += 1; + exit (0);], + tcl_cv_timezone_time=yes, tcl_cv_timezone_time=no)) + if test $tcl_cv_timezone_time = yes ; then + AC_DEFINE(HAVE_TIMEZONE_VAR, 1, [Should we use the global timezone variable?]) + fi + fi +]) + +#-------------------------------------------------------------------- +# TEA_BUGGY_STRTOD +# +# Under Solaris 2.4, strtod returns the wrong value for the +# terminating character under some conditions. Check for this +# and if the problem exists use a substitute procedure +# "fixstrtod" (provided by Tcl) that corrects the error. +# Also, on Compaq's Tru64 Unix 5.0, +# strtod(" ") returns 0.0 instead of a failure to convert. +# +# Arguments: +# none +# +# Results: +# +# Might defines some of the following vars: +# strtod (=fixstrtod) +# +#-------------------------------------------------------------------- + +AC_DEFUN(TEA_BUGGY_STRTOD, [ + AC_CHECK_FUNC(strtod, tcl_strtod=1, tcl_strtod=0) + if test "$tcl_strtod" = 1; then + AC_CACHE_CHECK([for Solaris2.4/Tru64 strtod bugs], tcl_cv_strtod_buggy,[ + AC_TRY_RUN([ + extern double strtod(); + int main() { + char *infString="Inf", *nanString="NaN", *spaceString=" "; + char *term; + double value; + value = strtod(infString, &term); + if ((term != infString) && (term[-1] == 0)) { + exit(1); + } + value = strtod(nanString, &term); + if ((term != nanString) && (term[-1] == 0)) { + exit(1); + } + value = strtod(spaceString, &term); + if (term == (spaceString+1)) { + exit(1); + } + exit(0); + }], tcl_cv_strtod_buggy=ok, tcl_cv_strtod_buggy=buggy, + tcl_cv_strtod_buggy=buggy)]) + if test "$tcl_cv_strtod_buggy" = buggy; then + AC_LIBOBJ([fixstrtod]) + USE_COMPAT=1 + AC_DEFINE(strtod, fixstrtod, [Do we want to use the strtod() in compat?]) + fi + fi +]) + +#-------------------------------------------------------------------- +# TEA_TCL_LINK_LIBS +# +# Search for the libraries needed to link the Tcl shell. +# Things like the math library (-lm) and socket stuff (-lsocket vs. +# -lnsl) are dealt with here. +# +# Arguments: +# Requires the following vars to be set in the Makefile: +# DL_LIBS +# 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, 1, [Do we have ?])]) + + #-------------------------------------------------------------------- + # 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 +# _LARGEFILE_SOURCE64 +# +#-------------------------------------------------------------------- + +AC_DEFUN(TEA_TCL_EARLY_FLAG,[ + AC_CACHE_VAL([tcl_cv_flag_]translit($1,[A-Z],[a-z]), + AC_TRY_COMPILE([$2], $3, [tcl_cv_flag_]translit($1,[A-Z],[a-z])=no, + AC_TRY_COMPILE([[#define ]$1[ 1 +]$2], $3, + [tcl_cv_flag_]translit($1,[A-Z],[a-z])=yes, + [tcl_cv_flag_]translit($1,[A-Z],[a-z])=no))) + if test ["x${tcl_cv_flag_]translit($1,[A-Z],[a-z])[}" = "xyes"] ; then + AC_DEFINE($1, 1, [Add the ]$1[ flag when building]) + tcl_flags="$tcl_flags $1" + fi +]) + +AC_DEFUN(TEA_TCL_EARLY_FLAGS,[ + AC_MSG_CHECKING([for required early compiler flags]) + tcl_flags="" + TEA_TCL_EARLY_FLAG(_ISOC99_SOURCE,[#include ], + [char *p = (char *)strtoll; char *q = (char *)strtoull;]) + TEA_TCL_EARLY_FLAG(_LARGEFILE64_SOURCE,[#include ], + [struct stat64 buf; int i = stat64("/", &buf);]) + TEA_TCL_EARLY_FLAG(_LARGEFILE_SOURCE64,[#include ], + [char *p = (char *)open64;]) + if test "x${tcl_flags}" = "x" ; then + AC_MSG_RESULT([none]) + else + AC_MSG_RESULT([${tcl_flags}]) + fi +]) + +#-------------------------------------------------------------------- +# TEA_TCL_64BIT_FLAGS +# +# Check for what is defined in the way of 64-bit features. +# +# Arguments: +# None +# +# Results: +# +# Might define the following vars: +# TCL_WIDE_INT_IS_LONG +# TCL_WIDE_INT_TYPE +# HAVE_STRUCT_DIRENT64 +# HAVE_STRUCT_STAT64 +# HAVE_TYPE_OFF64_T +# +#-------------------------------------------------------------------- + +AC_DEFUN(TEA_TCL_64BIT_FLAGS, [ + AC_MSG_CHECKING([for 64-bit integer type]) + AC_CACHE_VAL(tcl_cv_type_64bit,[ + tcl_cv_type_64bit=none + # See if the compiler knows natively about __int64 + AC_TRY_COMPILE(,[__int64 value = (__int64) 0;], + tcl_type_64bit=__int64, tcl_type_64bit="long long") + # See if we should use long anyway Note that we substitute in the + # type that is our current guess for a 64-bit type inside this check + # program, so it should be modified only carefully... + AC_TRY_COMPILE(,[switch (0) { + case 1: case (sizeof(]${tcl_type_64bit}[)==sizeof(long)): ; + }],tcl_cv_type_64bit=${tcl_type_64bit})]) + if test "${tcl_cv_type_64bit}" = none ; then + AC_DEFINE(TCL_WIDE_INT_IS_LONG, 1, [Are wide integers to be implemented with C 'long's?]) + AC_MSG_RESULT([using long]) + elif test "${tcl_cv_type_64bit}" = "__int64" \ + -a "${TEA_PLATFORM}" = "windows" ; then + # We actually want to use the default tcl.h checks in this + # case to handle both TCL_WIDE_INT_TYPE and TCL_LL_MODIFIER* + AC_MSG_RESULT([using Tcl header defaults]) + else + AC_DEFINE_UNQUOTED(TCL_WIDE_INT_TYPE,${tcl_cv_type_64bit}, + [What type should be used to define wide integers?]) + AC_MSG_RESULT([${tcl_cv_type_64bit}]) + + # Now check for auxiliary declarations + AC_CACHE_CHECK([for struct dirent64], tcl_cv_struct_dirent64,[ + AC_TRY_COMPILE([#include +#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, 1, [Is 'struct dirent64' in ?]) + fi + + AC_CACHE_CHECK([for struct stat64], 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, 1, [Is 'struct stat64' in ?]) + fi + + AC_CHECK_FUNCS(open64 lseek64) + 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)]) + dnl Define HAVE_TYPE_OFF64_T only when the off64_t type and the + dnl functions lseek64 and open64 are defined. + if test "x${tcl_cv_type_off64_t}" = "xyes" && \ + test "x${ac_cv_func_lseek64}" = "xyes" && \ + test "x${ac_cv_func_open64}" = "xyes" ; then + AC_DEFINE(HAVE_TYPE_OFF64_T, 1, [Is off64_t in ?]) + AC_MSG_RESULT([yes]) + else + AC_MSG_RESULT([no]) + fi + fi +]) + +## +## Here ends the standard Tcl configuration bits and starts the +## TEA specific functions +## + +#------------------------------------------------------------------------ +# TEA_INIT -- +# +# Init various Tcl Extension Architecture (TEA) variables. +# This should be the first called TEA_* macro. +# +# Arguments: +# none +# +# Results: +# +# Defines and substs the following vars: +# CYGPATH +# EXEEXT +# Defines only: +# TEA_VERSION +# TEA_INITED +# TEA_PLATFORM (windows or unix) +# +# "cygpath" is used on windows to generate native path names for include +# files. These variables should only be used with the compiler and linker +# since they generate native path names. +# +# EXEEXT +# Select the executable extension based on the host type. This +# is a lightweight replacement for AC_EXEEXT that doesn't require +# a compiler. +#------------------------------------------------------------------------ + +AC_DEFUN(TEA_INIT, [ + # TEA extensions pass this us the version of TEA they think they + # are compatible with. + TEA_VERSION="3.5" + + AC_MSG_CHECKING([for correct TEA configuration]) + if test x"${PACKAGE_NAME}" = x ; then + AC_MSG_ERROR([ +The PACKAGE_NAME variable must be defined by your TEA configure.in]) + fi + if test x"$1" = x ; then + AC_MSG_ERROR([ +TEA version not specified.]) + elif test "$1" != "${TEA_VERSION}" ; then + AC_MSG_RESULT([warning: requested TEA version "$1", have "${TEA_VERSION}"]) + else + AC_MSG_RESULT([ok (TEA ${TEA_VERSION})]) + fi + 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. + # Note when adjusted, so that TEA_PREFIX can correct for this. + # This is needed for recursive configures, since autoconf propagates + # $prefix, but not $exec_prefix (doh!). + if test x$exec_prefix = xNONE ; then + exec_prefix_default=yes + exec_prefix=$prefix + fi + + AC_SUBST(EXEEXT) + AC_SUBST(CYGPATH) + + # This package name must be replaced statically for AC_SUBST to work + AC_SUBST(PKG_LIB_FILE) + # Substitute STUB_LIB_FILE in case package creates a stub library too. + AC_SUBST(PKG_STUB_LIB_FILE) + + # We AC_SUBST these here to ensure they are subst'ed, + # in case the user doesn't call TEA_ADD_... + AC_SUBST(PKG_STUB_SOURCES) + AC_SUBST(PKG_STUB_OBJECTS) + AC_SUBST(PKG_TCL_SOURCES) + AC_SUBST(PKG_HEADERS) + AC_SUBST(PKG_INCLUDES) + AC_SUBST(PKG_LIBS) + AC_SUBST(PKG_CFLAGS) +]) + +#------------------------------------------------------------------------ +# TEA_ADD_SOURCES -- +# +# Specify one or more source files. Users should check for +# the right platform before adding to their list. +# It is not important to specify the directory, as long as it is +# in the generic, win or unix subdirectory of $(srcdir). +# +# Arguments: +# one or more file names +# +# Results: +# +# Defines and substs the following vars: +# PKG_SOURCES +# PKG_OBJECTS +#------------------------------------------------------------------------ +AC_DEFUN(TEA_ADD_SOURCES, [ + vars="$@" + for i in $vars; do + case $i in + [\$]*) + # allow $-var names + PKG_SOURCES="$PKG_SOURCES $i" + PKG_OBJECTS="$PKG_OBJECTS $i" + ;; + *) + # check for existence - allows for generic/win/unix VPATH + if test ! -f "${srcdir}/$i" -a ! -f "${srcdir}/generic/$i" \ + -a ! -f "${srcdir}/win/$i" -a ! -f "${srcdir}/unix/$i" \ + ; then + AC_MSG_ERROR([could not find source file '$i']) + fi + PKG_SOURCES="$PKG_SOURCES $i" + # this assumes it is in a VPATH dir + i=`basename $i` + # handle user calling this before or after TEA_SETUP_COMPILER + if test x"${OBJEXT}" != x ; then + j="`echo $i | sed -e 's/\.[[^.]]*$//'`.${OBJEXT}" + else + j="`echo $i | sed -e 's/\.[[^.]]*$//'`.\${OBJEXT}" + fi + PKG_OBJECTS="$PKG_OBJECTS $j" + ;; + esac + done + AC_SUBST(PKG_SOURCES) + AC_SUBST(PKG_OBJECTS) +]) + +#------------------------------------------------------------------------ +# TEA_ADD_STUB_SOURCES -- +# +# Specify one or more source files. Users should check for +# the right platform before adding to their list. +# It is not important to specify the directory, as long as it is +# in the generic, win or unix subdirectory of $(srcdir). +# +# Arguments: +# one or more file names +# +# Results: +# +# Defines and substs the following vars: +# PKG_STUB_SOURCES +# PKG_STUB_OBJECTS +#------------------------------------------------------------------------ +AC_DEFUN(TEA_ADD_STUB_SOURCES, [ + vars="$@" + for i in $vars; do + # check for existence - allows for generic/win/unix VPATH + if test ! -f "${srcdir}/$i" -a ! -f "${srcdir}/generic/$i" \ + -a ! -f "${srcdir}/win/$i" -a ! -f "${srcdir}/unix/$i" \ + ; then + AC_MSG_ERROR([could not find stub source file '$i']) + fi + PKG_STUB_SOURCES="$PKG_STUB_SOURCES $i" + # this assumes it is in a VPATH dir + i=`basename $i` + # handle user calling this before or after TEA_SETUP_COMPILER + if test x"${OBJEXT}" != x ; then + j="`echo $i | sed -e 's/\.[[^.]]*$//'`.${OBJEXT}" + else + j="`echo $i | sed -e 's/\.[[^.]]*$//'`.\${OBJEXT}" + fi + PKG_STUB_OBJECTS="$PKG_STUB_OBJECTS $j" + done + AC_SUBST(PKG_STUB_SOURCES) + AC_SUBST(PKG_STUB_OBJECTS) +]) + +#------------------------------------------------------------------------ +# TEA_ADD_TCL_SOURCES -- +# +# Specify one or more Tcl source files. These should be platform +# independent runtime files. +# +# Arguments: +# one or more file names +# +# Results: +# +# Defines and substs the following vars: +# PKG_TCL_SOURCES +#------------------------------------------------------------------------ +AC_DEFUN(TEA_ADD_TCL_SOURCES, [ + vars="$@" + for i in $vars; do + # check for existence, be strict because it is installed + if test ! -f "${srcdir}/$i" ; then + AC_MSG_ERROR([could not find tcl source file '${srcdir}/$i']) + fi + PKG_TCL_SOURCES="$PKG_TCL_SOURCES $i" + done + AC_SUBST(PKG_TCL_SOURCES) +]) + +#------------------------------------------------------------------------ +# TEA_ADD_HEADERS -- +# +# Specify one or more source headers. Users should check for +# the right platform before adding to their list. +# +# Arguments: +# one or more file names +# +# Results: +# +# Defines and substs the following vars: +# PKG_HEADERS +#------------------------------------------------------------------------ +AC_DEFUN(TEA_ADD_HEADERS, [ + vars="$@" + for i in $vars; do + # check for existence, be strict because it is installed + if test ! -f "${srcdir}/$i" ; then + AC_MSG_ERROR([could not find header file '${srcdir}/$i']) + fi + PKG_HEADERS="$PKG_HEADERS $i" + done + AC_SUBST(PKG_HEADERS) +]) + +#------------------------------------------------------------------------ +# TEA_ADD_INCLUDES -- +# +# Specify one or more include dirs. Users should check for +# the right platform before adding to their list. +# +# Arguments: +# one or more file names +# +# Results: +# +# Defines and substs the following vars: +# PKG_INCLUDES +#------------------------------------------------------------------------ +AC_DEFUN(TEA_ADD_INCLUDES, [ + vars="$@" + for i in $vars; do + PKG_INCLUDES="$PKG_INCLUDES $i" + done + AC_SUBST(PKG_INCLUDES) +]) + +#------------------------------------------------------------------------ +# TEA_ADD_LIBS -- +# +# Specify one or more libraries. Users should check for +# the right platform before adding to their list. For Windows, +# libraries provided in "foo.lib" format will be converted to +# "-lfoo" when using GCC (mingw). +# +# Arguments: +# one or more file names +# +# Results: +# +# Defines and substs the following vars: +# PKG_LIBS +#------------------------------------------------------------------------ +AC_DEFUN(TEA_ADD_LIBS, [ + vars="$@" + for i in $vars; do + if test "${TEA_PLATFORM}" = "windows" -a "$GCC" = "yes" ; then + # Convert foo.lib to -lfoo for GCC. No-op if not *.lib + i=`echo "$i" | sed -e 's/^\([[^-]].*\)\.lib[$]/-l\1/i'` + fi + PKG_LIBS="$PKG_LIBS $i" + done + AC_SUBST(PKG_LIBS) +]) + +#------------------------------------------------------------------------ +# TEA_ADD_CFLAGS -- +# +# Specify one or more CFLAGS. Users should check for +# the right platform before adding to their list. +# +# Arguments: +# one or more file names +# +# Results: +# +# Defines and substs the following vars: +# PKG_CFLAGS +#------------------------------------------------------------------------ +AC_DEFUN(TEA_ADD_CFLAGS, [ + PKG_CFLAGS="$PKG_CFLAGS $@" + AC_SUBST(PKG_CFLAGS) +]) + +#------------------------------------------------------------------------ +# TEA_PREFIX -- +# +# Handle the --prefix=... option by defaulting to what Tcl gave +# +# Arguments: +# none +# +# Results: +# +# If --prefix or --exec-prefix was not specified, $prefix and +# $exec_prefix will be set to the values given to Tcl when it was +# configured. +#------------------------------------------------------------------------ +AC_DEFUN(TEA_PREFIX, [ + if test "${prefix}" = "NONE"; then + prefix_default=yes + if test x"${TCL_PREFIX}" != x; then + AC_MSG_NOTICE([--prefix defaulting to TCL_PREFIX ${TCL_PREFIX}]) + prefix=${TCL_PREFIX} + else + AC_MSG_NOTICE([--prefix defaulting to /usr/local]) + prefix=/usr/local + fi + fi + if test "${exec_prefix}" = "NONE" -a x"${prefix_default}" = x"yes" \ + -o x"${exec_prefix_default}" = x"yes" ; then + if test x"${TCL_EXEC_PREFIX}" != x; then + AC_MSG_NOTICE([--exec-prefix defaulting to TCL_EXEC_PREFIX ${TCL_EXEC_PREFIX}]) + exec_prefix=${TCL_EXEC_PREFIX} + else + AC_MSG_NOTICE([--exec-prefix defaulting to ${prefix}]) + exec_prefix=$prefix + fi + fi +]) + +#------------------------------------------------------------------------ +# TEA_SETUP_COMPILER_CC -- +# +# Do compiler checks the way we want. This is just a replacement +# for AC_PROG_CC in TEA configure.in files to make them cleaner. +# +# Arguments: +# none +# +# Results: +# +# Sets up CC var and other standard bits we need to make executables. +#------------------------------------------------------------------------ +AC_DEFUN(TEA_SETUP_COMPILER_CC, [ + # Don't put any macros that use the compiler (e.g. AC_TRY_COMPILE) + # in this macro, they need to go into TEA_SETUP_COMPILER instead. + + # 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 + AC_PROG_CPP + + 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 +]) + +#------------------------------------------------------------------------ +# TEA_SETUP_COMPILER -- +# +# Do compiler checks that use the compiler. This must go after +# TEA_SETUP_COMPILER_CC, which does the actual compiler check. +# +# Arguments: +# none +# +# Results: +# +# Sets up CC var and other standard bits we need to make executables. +#------------------------------------------------------------------------ +AC_DEFUN(TEA_SETUP_COMPILER, [ + # Any macros that use the compiler (e.g. AC_TRY_COMPILE) have to go here. + AC_REQUIRE([TEA_SETUP_COMPILER_CC]) + + #------------------------------------------------------------------------ + # If we're using GCC, see if the compiler understands -pipe. If so, use it. + # It makes compiling go faster. (This is only a performance feature.) + #------------------------------------------------------------------------ + + if test -z "$no_pipe" -a -n "$GCC"; then + AC_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 + + #-------------------------------------------------------------------- + # Common compiler flag setup + #-------------------------------------------------------------------- + + AC_C_BIGENDIAN + if test "${TEA_PLATFORM}" = "unix" ; then + TEA_TCL_LINK_LIBS + TEA_MISSING_POSIX_HEADERS + # Let the user call this, because if it triggers, they will + # need a compat/strtod.c that is correct. Users can also + # use Tcl_GetDouble(FromObj) instead. + #TEA_BUGGY_STRTOD + fi +]) + +#------------------------------------------------------------------------ +# TEA_MAKE_LIB -- +# +# Generate a line that can be used to build a shared/unshared library +# in a platform independent manner. +# +# Arguments: +# none +# +# Requires: +# +# Results: +# +# Defines the following vars: +# CFLAGS - Done late here to note disturb other AC macros +# MAKE_LIB - Command to execute to build the Tcl library; +# differs depending on whether or not Tcl is being +# compiled as a shared library. +# MAKE_SHARED_LIB Makefile rule for building a shared library +# MAKE_STATIC_LIB Makefile rule for building a static library +# MAKE_STUB_LIB Makefile rule for building a stub library +#------------------------------------------------------------------------ + +AC_DEFUN(TEA_MAKE_LIB, [ + if test "${TEA_PLATFORM}" = "windows" -a "$GCC" != "yes"; then + MAKE_STATIC_LIB="\${STLIB_LD} -out:\[$]@ \$(PKG_OBJECTS)" + MAKE_SHARED_LIB="\${SHLIB_LD} \${SHLIB_LD_LIBS} \${LDFLAGS_DEFAULT} -out:\[$]@ \$(PKG_OBJECTS)" + MAKE_STUB_LIB="\${STLIB_LD} -out:\[$]@ \$(PKG_STUB_OBJECTS)" + else + MAKE_STATIC_LIB="\${STLIB_LD} \[$]@ \$(PKG_OBJECTS)" + MAKE_SHARED_LIB="\${SHLIB_LD} -o \[$]@ \$(PKG_OBJECTS) \${SHLIB_LD_LIBS}" + MAKE_STUB_LIB="\${STLIB_LD} \[$]@ \$(PKG_STUB_OBJECTS)" + fi + + if test "${SHARED_BUILD}" = "1" ; then + MAKE_LIB="${MAKE_SHARED_LIB} " + else + MAKE_LIB="${MAKE_STATIC_LIB} " + fi + + #-------------------------------------------------------------------- + # Shared libraries and static libraries have different names. + # Use the double eval to make sure any variables in the suffix is + # substituted. (@@@ Might not be necessary anymore) + #-------------------------------------------------------------------- + + if test "${TEA_PLATFORM}" = "windows" ; then + if test "${SHARED_BUILD}" = "1" ; then + # We force the unresolved linking of symbols that are really in + # the private libraries of Tcl and Tk. + SHLIB_LD_LIBS="${SHLIB_LD_LIBS} \"`${CYGPATH} ${TCL_BIN_DIR}/${TCL_STUB_LIB_FILE}`\"" + if test x"${TK_BIN_DIR}" != x ; then + SHLIB_LD_LIBS="${SHLIB_LD_LIBS} \"`${CYGPATH} ${TK_BIN_DIR}/${TK_STUB_LIB_FILE}`\"" + fi + eval eval "PKG_LIB_FILE=${PACKAGE_NAME}${SHARED_LIB_SUFFIX}" + else + eval eval "PKG_LIB_FILE=${PACKAGE_NAME}${UNSHARED_LIB_SUFFIX}" + fi + # Some packages build their own stubs libraries + eval eval "PKG_STUB_LIB_FILE=${PACKAGE_NAME}stub${UNSHARED_LIB_SUFFIX}" + # These aren't needed on Windows (either MSVC or gcc) + RANLIB=: + RANLIB_STUB=: + else + RANLIB_STUB="${RANLIB}" + if test "${SHARED_BUILD}" = "1" ; then + SHLIB_LD_LIBS="${SHLIB_LD_LIBS} ${TCL_STUB_LIB_SPEC}" + if test x"${TK_BIN_DIR}" != x ; then + SHLIB_LD_LIBS="${SHLIB_LD_LIBS} ${TK_STUB_LIB_SPEC}" + fi + eval eval "PKG_LIB_FILE=lib${PACKAGE_NAME}${SHARED_LIB_SUFFIX}" + RANLIB=: + else + eval eval "PKG_LIB_FILE=lib${PACKAGE_NAME}${UNSHARED_LIB_SUFFIX}" + fi + # Some packages build their own stubs libraries + eval eval "PKG_STUB_LIB_FILE=lib${PACKAGE_NAME}stub${UNSHARED_LIB_SUFFIX}" + fi + + # These are escaped so that only CFLAGS is picked up at configure time. + # The other values will be substituted at make time. + CFLAGS="${CFLAGS} \${CFLAGS_DEFAULT} \${CFLAGS_WARNING}" + if test "${SHARED_BUILD}" = "1" ; then + CFLAGS="${CFLAGS} \${SHLIB_CFLAGS}" + fi + + AC_SUBST(MAKE_LIB) + AC_SUBST(MAKE_SHARED_LIB) + AC_SUBST(MAKE_STATIC_LIB) + AC_SUBST(MAKE_STUB_LIB) + AC_SUBST(RANLIB_STUB) +]) + +#------------------------------------------------------------------------ +# 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]) + + TCL_SRC_DIR_NATIVE=`${CYGPATH} ${TCL_SRC_DIR}` + TCL_TOP_DIR_NATIVE=\"${TCL_SRC_DIR_NATIVE}\" + TCL_GENERIC_DIR_NATIVE=\"${TCL_SRC_DIR_NATIVE}/generic\" + TCL_UNIX_DIR_NATIVE=\"${TCL_SRC_DIR_NATIVE}/unix\" + TCL_WIN_DIR_NATIVE=\"${TCL_SRC_DIR_NATIVE}/win\" + TCL_BMAP_DIR_NATIVE=\"${TCL_SRC_DIR_NATIVE}/bitmaps\" + TCL_TOOL_DIR_NATIVE=\"${TCL_SRC_DIR_NATIVE}/tools\" + TCL_COMPAT_DIR_NATIVE=\"${TCL_SRC_DIR_NATIVE}/compat\" + + if test "${TEA_PLATFORM}" = "windows"; then + TCL_PLATFORM_DIR_NATIVE=${TCL_WIN_DIR_NATIVE} + else + TCL_PLATFORM_DIR_NATIVE=${TCL_UNIX_DIR_NATIVE} + fi + # We want to ensure these are substituted so as not to require + # any *_NATIVE vars be defined in the Makefile + TCL_INCLUDES="-I${TCL_GENERIC_DIR_NATIVE} -I${TCL_PLATFORM_DIR_NATIVE}" + if test "`uname -s`" = "Darwin"; then + # If Tcl was built as a framework, attempt to use + # the framework's Headers and PrivateHeaders directories + case ${TCL_DEFS} in + *TCL_FRAMEWORK*) + if test -d "${TCL_BIN_DIR}/Headers" -a -d "${TCL_BIN_DIR}/PrivateHeaders"; then + TCL_INCLUDES="-I\"${TCL_BIN_DIR}/Headers\" -I\"${TCL_BIN_DIR}/PrivateHeaders\" ${TCL_INCLUDES}"; else + TCL_INCLUDES="${TCL_INCLUDES} ${TCL_INCLUDE_SPEC} `echo "${TCL_INCLUDE_SPEC}" | sed -e 's/Headers/PrivateHeaders/'`"; fi + ;; + esac + 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) + + 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 + if test "`uname -s`" = "Darwin"; then + # If Tcl was built as a framework, attempt to use + # the framework's Headers directory + case ${TCL_DEFS} in + *TCL_FRAMEWORK*) + list="`ls -d ${TCL_BIN_DIR}/Headers 2>/dev/null`" + ;; + esac + fi + + # Look in the source dir only if Tcl is not installed, + # and in that situation, look there before installed locations. + if test -f "${TCL_BIN_DIR}/Makefile" ; then + list="$list `ls -d ${TCL_SRC_DIR}/generic 2>/dev/null`" + fi + + # Check order: pkg --prefix location, Tcl's --prefix location, + # relative to directory of tclConfig.sh. + + eval "temp_includedir=${includedir}" + list="$list \ + `ls -d ${temp_includedir} 2>/dev/null` \ + `ls -d ${TCL_PREFIX}/include 2>/dev/null` \ + `ls -d ${TCL_BIN_DIR}/../include 2>/dev/null`" + if test "${TEA_PLATFORM}" != "windows" -o "$GCC" = "yes"; then + list="$list /usr/local/include /usr/include" + if test x"${TCL_INCLUDE_SPEC}" != x ; then + d=`echo "${TCL_INCLUDE_SPEC}" | sed -e 's/^-I//'` + list="$list `ls -d ${d} 2>/dev/null`" + fi + fi + for i in $list ; do + if test -f "$i/tcl.h" ; then + ac_cv_c_tclh=$i + break + fi + done + fi + ]) + + # Print a message based on how we determined the include path + + if test x"${ac_cv_c_tclh}" = x ; then + AC_MSG_ERROR([tcl.h not found. Please specify its location with --with-tclinclude]) + else + AC_MSG_RESULT([${ac_cv_c_tclh}]) + fi + + # Convert to a native path and substitute into the output files. + + INCLUDE_DIR_NATIVE=`${CYGPATH} ${ac_cv_c_tclh}` + + TCL_INCLUDES=-I\"${INCLUDE_DIR_NATIVE}\" + + AC_SUBST(TCL_INCLUDES) +]) + +#------------------------------------------------------------------------ +# TEA_PRIVATE_TK_HEADERS -- +# +# Locate the private Tk include files +# +# Arguments: +# +# Requires: +# TK_SRC_DIR Assumes that TEA_LOAD_TKCONFIG has +# already been called. +# +# Results: +# +# Substs the following vars: +# TK_INCLUDES +#------------------------------------------------------------------------ + +AC_DEFUN(TEA_PRIVATE_TK_HEADERS, [ + AC_MSG_CHECKING([for Tk private include files]) + + TK_SRC_DIR_NATIVE=`${CYGPATH} ${TK_SRC_DIR}` + TK_TOP_DIR_NATIVE=\"${TK_SRC_DIR_NATIVE}\" + TK_UNIX_DIR_NATIVE=\"${TK_SRC_DIR_NATIVE}/unix\" + TK_WIN_DIR_NATIVE=\"${TK_SRC_DIR_NATIVE}/win\" + TK_GENERIC_DIR_NATIVE=\"${TK_SRC_DIR_NATIVE}/generic\" + TK_XLIB_DIR_NATIVE=\"${TK_SRC_DIR_NATIVE}/xlib\" + if test "${TEA_PLATFORM}" = "windows"; then + TK_PLATFORM_DIR_NATIVE=${TK_WIN_DIR_NATIVE} + else + TK_PLATFORM_DIR_NATIVE=${TK_UNIX_DIR_NATIVE} + fi + # We want to ensure these are substituted so as not to require + # any *_NATIVE vars be defined in the Makefile + TK_INCLUDES="-I${TK_GENERIC_DIR_NATIVE} -I${TK_PLATFORM_DIR_NATIVE}" + if test "${TEA_WINDOWINGSYSTEM}" = "win32" \ + -o "${TEA_WINDOWINGSYSTEM}" = "aqua"; then + TK_INCLUDES="${TK_INCLUDES} -I${TK_XLIB_DIR_NATIVE}" + fi + if test "${TEA_WINDOWINGSYSTEM}" = "aqua"; then + TK_INCLUDES="${TK_INCLUDES} -I${TK_SRC_DIR_NATIVE}/macosx" + fi + if test "`uname -s`" = "Darwin"; then + # If Tk was built as a framework, attempt to use + # the framework's Headers and PrivateHeaders directories + case ${TK_DEFS} in + *TK_FRAMEWORK*) + if test -d "${TK_BIN_DIR}/Headers" -a -d "${TK_BIN_DIR}/PrivateHeaders"; then + TK_INCLUDES="-I\"${TK_BIN_DIR}/Headers\" -I\"${TK_BIN_DIR}/PrivateHeaders\" ${TK_INCLUDES}"; fi + ;; + esac + 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 + if test "`uname -s`" = "Darwin"; then + # If Tk was built as a framework, attempt to use + # the framework's Headers directory. + case ${TK_DEFS} in + *TK_FRAMEWORK*) + list="`ls -d ${TK_BIN_DIR}/Headers 2>/dev/null`" + ;; + esac + fi + + # Look in the source dir only if Tk is not installed, + # and in that situation, look there before installed locations. + if test -f "${TK_BIN_DIR}/Makefile" ; then + list="$list `ls -d ${TK_SRC_DIR}/generic 2>/dev/null`" + fi + + # Check order: pkg --prefix location, Tk's --prefix location, + # relative to directory of tkConfig.sh, Tcl's --prefix location, + # relative to directory of tclConfig.sh. + + eval "temp_includedir=${includedir}" + list="$list \ + `ls -d ${temp_includedir} 2>/dev/null` \ + `ls -d ${TK_PREFIX}/include 2>/dev/null` \ + `ls -d ${TK_BIN_DIR}/../include 2>/dev/null` \ + `ls -d ${TCL_PREFIX}/include 2>/dev/null` \ + `ls -d ${TCL_BIN_DIR}/../include 2>/dev/null`" + if test "${TEA_PLATFORM}" != "windows" -o "$GCC" = "yes"; then + list="$list /usr/local/include /usr/include" + fi + for i in $list ; do + if test -f "$i/tk.h" ; then + ac_cv_c_tkh=$i + break + fi + done + fi + ]) + + # Print a message based on how we determined the include path + + if test x"${ac_cv_c_tkh}" = x ; then + AC_MSG_ERROR([tk.h not found. Please specify its location with --with-tkinclude]) + else + AC_MSG_RESULT([${ac_cv_c_tkh}]) + fi + + # Convert to a native path and substitute into the output files. + + INCLUDE_DIR_NATIVE=`${CYGPATH} ${ac_cv_c_tkh}` + + TK_INCLUDES=-I\"${INCLUDE_DIR_NATIVE}\" + + AC_SUBST(TK_INCLUDES) + + if test "${TEA_WINDOWINGSYSTEM}" = "win32" \ + -o "${TEA_WINDOWINGSYSTEM}" = "aqua"; then + # On Windows and Aqua, we need the X compat headers + AC_MSG_CHECKING([for X11 header files]) + if test ! -r "${INCLUDE_DIR_NATIVE}/X11/Xlib.h"; then + INCLUDE_DIR_NATIVE="`${CYGPATH} ${TK_SRC_DIR}/xlib`" + TK_XINCLUDES=-I\"${INCLUDE_DIR_NATIVE}\" + AC_SUBST(TK_XINCLUDES) + fi + AC_MSG_RESULT([${INCLUDE_DIR_NATIVE}]) + fi +]) + +#------------------------------------------------------------------------ +# TEA_PROG_TCLSH +# Determine the fully qualified path name of the tclsh executable +# in the Tcl build directory or the tclsh installed in a bin +# directory. This macro will correctly determine the name +# of the tclsh executable even if tclsh has not yet been +# built in the build directory. The tclsh found is always +# associated with a tclConfig.sh file. This tclsh should be used +# only for running extension test cases. It should never be +# or generation of files (like pkgIndex.tcl) at build time. +# +# Arguments +# none +# +# Results +# Subst's the following values: +# TCLSH_PROG +#------------------------------------------------------------------------ + +AC_DEFUN(TEA_PROG_TCLSH, [ + AC_MSG_CHECKING([for tclsh]) + if test -f "${TCL_BIN_DIR}/Makefile" ; then + # tclConfig.sh is in Tcl build directory + if test "${TEA_PLATFORM}" = "windows"; then + TCLSH_PROG="${TCL_BIN_DIR}/tclsh${TCL_MAJOR_VERSION}${TCL_MINOR_VERSION}${TCL_DBGX}${EXEEXT}" + else + TCLSH_PROG="${TCL_BIN_DIR}/tclsh" + fi + else + # tclConfig.sh is in install location + if test "${TEA_PLATFORM}" = "windows"; then + TCLSH_PROG="tclsh${TCL_MAJOR_VERSION}${TCL_MINOR_VERSION}${TCL_DBGX}${EXEEXT}" + else + TCLSH_PROG="tclsh${TCL_MAJOR_VERSION}.${TCL_MINOR_VERSION}${TCL_DBGX}" + fi + list="`ls -d ${TCL_BIN_DIR}/../bin 2>/dev/null` \ + `ls -d ${TCL_BIN_DIR}/.. 2>/dev/null` \ + `ls -d ${TCL_PREFIX}/bin 2>/dev/null`" + for i in $list ; do + if test -f "$i/${TCLSH_PROG}" ; then + REAL_TCL_BIN_DIR="`cd "$i"; pwd`" + break + fi + done + TCLSH_PROG="${REAL_TCL_BIN_DIR}/${TCLSH_PROG}" + fi + AC_MSG_RESULT([${TCLSH_PROG}]) + AC_SUBST(TCLSH_PROG) +]) + +#------------------------------------------------------------------------ +# TEA_PROG_WISH +# Determine the fully qualified path name of the wish executable +# in the Tk build directory or the wish installed in a bin +# directory. This macro will correctly determine the name +# of the wish executable even if wish has not yet been +# built in the build directory. The wish found is always +# associated with a tkConfig.sh file. This wish should be used +# only for running extension test cases. It should never be +# or generation of files (like pkgIndex.tcl) at build time. +# +# Arguments +# none +# +# Results +# Subst's the following values: +# WISH_PROG +#------------------------------------------------------------------------ + +AC_DEFUN(TEA_PROG_WISH, [ + AC_MSG_CHECKING([for wish]) + if test -f "${TK_BIN_DIR}/Makefile" ; then + # tkConfig.sh is in Tk build directory + if test "${TEA_PLATFORM}" = "windows"; then + WISH_PROG="${TK_BIN_DIR}/wish${TK_MAJOR_VERSION}${TK_MINOR_VERSION}${TK_DBGX}${EXEEXT}" + else + WISH_PROG="${TK_BIN_DIR}/wish" + fi + else + # tkConfig.sh is in install location + if test "${TEA_PLATFORM}" = "windows"; then + WISH_PROG="wish${TK_MAJOR_VERSION}${TK_MINOR_VERSION}${TK_DBGX}${EXEEXT}" + else + WISH_PROG="wish${TK_MAJOR_VERSION}.${TK_MINOR_VERSION}${TK_DBGX}" + fi + list="`ls -d ${TK_BIN_DIR}/../bin 2>/dev/null` \ + `ls -d ${TK_BIN_DIR}/.. 2>/dev/null` \ + `ls -d ${TK_PREFIX}/bin 2>/dev/null`" + for i in $list ; do + if test -f "$i/${WISH_PROG}" ; then + REAL_TK_BIN_DIR="`cd "$i"; pwd`" + break + fi + done + WISH_PROG="${REAL_TK_BIN_DIR}/${WISH_PROG}" + fi + AC_MSG_RESULT([${WISH_PROG}]) + AC_SUBST(WISH_PROG) +]) + +#------------------------------------------------------------------------ +# TEA_PATH_CONFIG -- +# +# Locate the ${1}Config.sh file and perform a sanity check on +# the ${1} compile flags. These are used by packages like +# [incr Tk] that load *Config.sh files from more than Tcl and Tk. +# +# Arguments: +# none +# +# Results: +# +# Adds the following arguments to configure: +# --with-$1=... +# +# Defines the following vars: +# $1_BIN_DIR Full path to the directory containing +# the $1Config.sh file +#------------------------------------------------------------------------ + +AC_DEFUN(TEA_PATH_CONFIG, [ + # + # Ok, lets find the $1 configuration + # First, look for one uninstalled. + # the alternative search directory is invoked by --with-$1 + # + + if test x"${no_$1}" = x ; then + # we reset no_$1 in case something fails here + no_$1=true + AC_ARG_WITH($1, [ --with-$1 directory containing $1 configuration ($1Config.sh)], with_$1config=${withval}) + AC_MSG_CHECKING([for $1 configuration]) + AC_CACHE_VAL(ac_cv_c_$1config,[ + + # First check to see if --with-$1 was specified. + if test x"${with_$1config}" != x ; then + case ${with_$1config} in + */$1Config.sh ) + if test -f ${with_$1config}; then + AC_MSG_WARN([--with-$1 argument should refer to directory containing $1Config.sh, not to $1Config.sh itself]) + with_$1config=`echo ${with_$1config} | sed 's!/$1Config\.sh$!!'` + fi;; + esac + if test -f "${with_$1config}/$1Config.sh" ; then + ac_cv_c_$1config=`(cd ${with_$1config}; pwd)` + else + AC_MSG_ERROR([${with_$1config} directory doesn't contain $1Config.sh]) + fi + fi + + # then check for a private $1 installation + if test x"${ac_cv_c_$1config}" = x ; then + for i in \ + ../$1 \ + `ls -dr ../$1*[[0-9]].[[0-9]]*.[[0-9]]* 2>/dev/null` \ + `ls -dr ../$1*[[0-9]].[[0-9]][[0-9]] 2>/dev/null` \ + `ls -dr ../$1*[[0-9]].[[0-9]] 2>/dev/null` \ + `ls -dr ../$1*[[0-9]].[[0-9]]* 2>/dev/null` \ + ../../$1 \ + `ls -dr ../../$1*[[0-9]].[[0-9]]*.[[0-9]]* 2>/dev/null` \ + `ls -dr ../../$1*[[0-9]].[[0-9]][[0-9]] 2>/dev/null` \ + `ls -dr ../../$1*[[0-9]].[[0-9]] 2>/dev/null` \ + `ls -dr ../../$1*[[0-9]].[[0-9]]* 2>/dev/null` \ + ../../../$1 \ + `ls -dr ../../../$1*[[0-9]].[[0-9]]*.[[0-9]]* 2>/dev/null` \ + `ls -dr ../../../$1*[[0-9]].[[0-9]][[0-9]] 2>/dev/null` \ + `ls -dr ../../../$1*[[0-9]].[[0-9]] 2>/dev/null` \ + `ls -dr ../../../$1*[[0-9]].[[0-9]]* 2>/dev/null` \ + ${srcdir}/../$1 \ + `ls -dr ${srcdir}/../$1*[[0-9]].[[0-9]]*.[[0-9]]* 2>/dev/null` \ + `ls -dr ${srcdir}/../$1*[[0-9]].[[0-9]][[0-9]] 2>/dev/null` \ + `ls -dr ${srcdir}/../$1*[[0-9]].[[0-9]] 2>/dev/null` \ + `ls -dr ${srcdir}/../$1*[[0-9]].[[0-9]]* 2>/dev/null` \ + ; do + if test -f "$i/$1Config.sh" ; then + ac_cv_c_$1config=`(cd $i; pwd)` + break + fi + if test -f "$i/unix/$1Config.sh" ; then + ac_cv_c_$1config=`(cd $i/unix; pwd)` + break + fi + done + fi + + # check in a few common install locations + if test x"${ac_cv_c_$1config}" = x ; then + for i in `ls -d ${libdir} 2>/dev/null` \ + `ls -d ${exec_prefix}/lib 2>/dev/null` \ + `ls -d ${prefix}/lib 2>/dev/null` \ + `ls -d /usr/local/lib 2>/dev/null` \ + `ls -d /usr/contrib/lib 2>/dev/null` \ + `ls -d /usr/lib 2>/dev/null` \ + ; 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_BIN_DIR) + AC_SUBST($1_SRC_DIR) + + AC_SUBST($1_LIB_FILE) + AC_SUBST($1_LIB_SPEC) + + AC_SUBST($1_STUB_LIB_FILE) + AC_SUBST($1_STUB_LIB_SPEC) + AC_SUBST($1_STUB_LIB_PATH) +]) + +#------------------------------------------------------------------------ +# TEA_PATH_CELIB -- +# +# Locate Keuchel's celib emulation layer for targeting Win/CE +# +# Arguments: +# none +# +# Results: +# +# Adds the following arguments to configure: +# --with-celib=... +# +# Defines the following vars: +# CELIB_DIR Full path to the directory containing +# the include and platform lib files +#------------------------------------------------------------------------ + +AC_DEFUN(TEA_PATH_CELIB, [ + # First, look for one uninstalled. + # the alternative search directory is invoked by --with-celib + + if test x"${no_celib}" = x ; then + # we reset no_celib in case something fails here + no_celib=true + AC_ARG_WITH(celib,[ --with-celib=DIR use Windows/CE support library from DIR], with_celibconfig=${withval}) + AC_MSG_CHECKING([for Windows/CE celib directory]) + AC_CACHE_VAL(ac_cv_c_celibconfig,[ + # First check to see if --with-celibconfig was specified. + if test x"${with_celibconfig}" != x ; then + if test -d "${with_celibconfig}/inc" ; then + ac_cv_c_celibconfig=`(cd ${with_celibconfig}; pwd)` + else + AC_MSG_ERROR([${with_celibconfig} directory doesn't contain inc directory]) + fi + fi + + # then check for a celib library + if test x"${ac_cv_c_celibconfig}" = x ; then + for i in \ + ../celib-palm-3.0 \ + ../celib \ + ../../celib-palm-3.0 \ + ../../celib \ + `ls -dr ../celib-*3.[[0-9]]* 2>/dev/null` \ + ${srcdir}/../celib-palm-3.0 \ + ${srcdir}/../celib \ + `ls -dr ${srcdir}/../celib-*3.[[0-9]]* 2>/dev/null` \ + ; do + if test -d "$i/inc" ; then + ac_cv_c_celibconfig=`(cd $i; pwd)` + break + fi + done + fi + ]) + if test x"${ac_cv_c_celibconfig}" = x ; then + AC_MSG_ERROR([Cannot find celib support library directory]) + else + no_celib= + CELIB_DIR=${ac_cv_c_celibconfig} + CELIB_DIR=`echo "$CELIB_DIR" | sed -e 's!\\\!/!g'` + AC_MSG_RESULT([found $CELIB_DIR]) + fi + fi +]) + + +# Local Variables: +# mode: autoconf +# End: diff --git a/tests/all.tcl b/tests/all.tcl new file mode 100755 index 0000000..a54a26b --- /dev/null +++ b/tests/all.tcl @@ -0,0 +1,66 @@ +# all.tcl -- +# +# This file contains a top-level script to run all of the Tcl +# tests. Execute it by invoking "source all.test" when running tcltest +# in this directory. +# +# Copyright (c) 1998-2000 by Scriptics Corporation. +# All rights reserved. +# +# RCS: @(#) $Id: all.tcl,v 1.4 2004/07/04 22:04:20 patthoyts Exp $ + +if {[lsearch [namespace children] ::tcltest] == -1} { + package require tcltest + namespace import ::tcltest::* +} + +set ::tcltest::testSingleFile false +set ::tcltest::testsDirectory [file dir [info script]] + +# We need to ensure that the testsDirectory is absolute +if {[catch {::tcltest::normalizePath ::tcltest::testsDirectory}]} { + # The version of tcltest we have here does not support + # 'normalizePath', so we have to do this on our own. + + set oldpwd [pwd] + catch {cd $::tcltest::testsDirectory} + set ::tcltest::testsDirectory [pwd] + cd $oldpwd +} + +set chan $::tcltest::outputChannel + +puts $chan "Tests running in interp: [info nameofexecutable]" +puts $chan "Tests running with pwd: [pwd]" +puts $chan "Tests running in working dir: $::tcltest::testsDirectory" +if {[llength $::tcltest::skip] > 0} { + puts $chan "Skipping tests that match: $::tcltest::skip" +} +if {[llength $::tcltest::match] > 0} { + puts $chan "Only running tests that match: $::tcltest::match" +} + +if {[llength $::tcltest::skipFiles] > 0} { + puts $chan "Skipping test files that match: $::tcltest::skipFiles" +} +if {[llength $::tcltest::matchFiles] > 0} { + puts $chan "Only sourcing test files that match: $::tcltest::matchFiles" +} + +set timeCmd {clock format [clock seconds]} +puts $chan "Tests began at [eval $timeCmd]" + +# source each of the specified tests +foreach file [lsort [::tcltest::getMatchingFiles]] { + set tail [file tail $file] + puts $chan $tail + if {[catch {source $file} msg]} { + puts $chan $msg + } +} + +# cleanup +puts $chan "\nTests ended at [eval $timeCmd]" +::tcltest::cleanupTests 1 +return + 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 100755 index 0000000..ee13350 Binary files /dev/null and b/tests/edv.jpg.bin differ diff --git a/tests/libload.tcl b/tests/libload.tcl new file mode 100755 index 0000000..66a71dd --- /dev/null +++ b/tests/libload.tcl @@ -0,0 +1,8 @@ +set file libmysqltcl3.05 + +if {[file exists ./${file}[info sharedlibextension]]} { + load ./${file}[info sharedlibextension] +} else { + load ../${file}[info sharedlibextension] +} + diff --git a/tests/regression.tcl b/tests/regression.tcl new file mode 100755 index 0000000..0b29bca --- /dev/null +++ b/tests/regression.tcl @@ -0,0 +1,33 @@ +#!/usr/bin/tcl + +if {[file exists libload.tcl]} { + source libload.tcl +} else { + source [file join [file dirname [info script]] libload.tcl] +} + + +puts "please observe memory consumption per top (Program break after reach 2000)" + +set c [mysqlconnect -u root -db uni] +set i 0 +set p 0 +while 1 { + set a [mysqlsel $c "select * from Student" -list] + set d [string trim " $c "] + mysqlsel $d {select * from Student} + while {[set row [mysqlnext $d]]!=""} {} + unset d + set q [mysqlquery $c {select * from Student}] + while {[set row [mysqlnext $q]]!=""} {} + mysqlendquery $q + mysqlsel $c {select MatrNr,Name,Semester from Student} + mysqlmap $c {MatrNr Name Semester} { + set all [list $MatrNr $Name $Semester] + } + if {$i>100} {puts "loop [incr p]"; set i 0} + incr i + if {$p>=2000} break +} +mysqlclose $c +unset c diff --git a/tests/regression_openclose.tcl b/tests/regression_openclose.tcl new file mode 100755 index 0000000..4bf3bf3 --- /dev/null +++ b/tests/regression_openclose.tcl @@ -0,0 +1,21 @@ +#!/usr/bin/tcl + +if {[file exists libload.tcl]} { + source libload.tcl +} else { + source [file join [file dirname [info script]] libload.tcl] +} + + +puts "please observe memory consumption per top (Program break after reach 2000)" + +set i 0 +while 1 { + set c$i [mysqlconnect -u root -db uni] + mysqlsel [set c$i] {select * from Student} + while {[set row [mysqlnext [set c$i]]]!=""} {} + if {$i>=500} break + mysqlclose [set c$i] + puts "loop $i" + incr i +} diff --git a/tests/test.sql b/tests/test.sql new file mode 100755 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..5ac5f9c --- /dev/null +++ b/tests/test.tcl @@ -0,0 +1,433 @@ +#!/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 [getConnection] + 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 [getConnection] + 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 +tcltest::test {changeuser-1.1} {no such user} -body { + mysqlchangeuser $handle root {} nodb +} -returnCodes error -match glob -result "*Unknown database*" + +tcltest::test {interpreter-1.0} {mysqltcl in slave interpreter} -body { + set handle [getConnection] + set i1 [interp create] + $i1 eval " + package require mysqltcl + set hdl [mysqlconnect -user $dbuser -db $dbank] + " + interp delete $i1 + mysqlinfo $handle databases + mysqlclose $handle + return +} + +tcltest::test {mysql::state-1.0} {wrong parameter length} -body { + mysql::state + return +} -returnCodes error -match glob -result "*wrong*" + +tcltest::cleanupTests +puts "End of test" diff --git a/tests/test.test b/tests/test.test new file mode 100755 index 0000000..e680392 --- /dev/null +++ b/tests/test.test @@ -0,0 +1,456 @@ +#!/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" + +# test error in 3.01 +tcltest::test {receive-1.3} {with error 3.01} -body { + set count 0 + namespace eval :: { + mysqlreceive $handle {select Name from Student order by Name} name { + set res [list $name] + incr count + } + } + return +} + + +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 [getConnection] + 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 [getConnection] + 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 +tcltest::test {changeuser-1.1} {no such user} -body { + mysqlchangeuser $handle root {} nodb +} -returnCodes error -match glob -result "*Unknown database*" + +tcltest::test {interpreter-1.0} {mysqltcl in slave interpreter} -body { + set handle [getConnection] + set i1 [interp create] + $i1 eval " + package require mysqltcl + set hdl [mysqlconnect -user $dbuser -db $dbank] + " + 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 0} {} + if {[set ret [mysql::moreresult $conn]]} { + # mysql::nextresult $conn + } + return $ret +} -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 {info-1.3} {sqlstate} -body { + mysql::info $conn state + 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 + +tcltest::test {encoding-1.0} {read system encoding} -body { + mysql::encoding $conn +} -result [encoding system] + +tcltest::test {encoding-1.1} {change to binary} -body { + mysql::encoding $conn binary + mysql::exec $conn "INSERT INTO Student (Name,Semester) VALUES ('Test',4)" + mysql::encoding $conn +} -result binary + +tcltest::test {encoding-1.2} {change to binary} -body { + mysql::encoding $conn [encoding system] + mysql::exec $conn "INSERT INTO Student (Name,Semester) VALUES ('Test',4)" + mysql::encoding $conn +} -result [encoding system] + +tcltest::test {encoding-1.3} {change to binary} -body { + mysql::encoding $conn iso8859-1 + mysql::exec $conn "INSERT INTO Student (Name,Semester) VALUES ('Test',4)" + mysql::encoding $conn +} -result iso8859-1 + +tcltest::test {encoding-1.4} {unknown encoding} -body { + mysql::encoding $conn unknown +} -returnCodes error -match glob -result "unknown encoding*" + +tcltest::test {encoding-1.5} {changing encoding of query handle} -body { + set q [mysql::query $conn "select * from Student"] + mysql::encoding $q iso8859-1 +} -cleanup { + mysql::endquery $q +} -returnCodes error -result "encoding set can be used only on connection handle" + +tcltest::test {encoding-1.6} {changing encoding of handle} -body { + mysql::encoding $conn iso8859-1 + set q [mysql::query $conn "select * from Student"] + mysql::encoding $q +} -cleanup { + mysql::endquery $q +} -result iso8859-1 + +tcltest::test {encoding-1.7} {changing encoding of handle} -body { + set q [mysql::query $conn "select * from Student"] + mysql::encoding $conn iso8859-1 + mysql::encoding $q +} -cleanup { + mysql::endquery $q +} -result iso8859-1 + +tcltest::test {encoding-1.8} {changing encoding of handle} -body { + mysql::encoding $conn utf-8 + set q [mysql::query $conn "select * from Student"] + mysql::encoding $conn iso8859-1 + mysql::encoding $q +} -cleanup { + mysql::endquery $q +} -result iso8859-1 + +tcltest::test {encoding-1.8} {changing encoding of handle} -body { + mysql::encoding $conn iso8859-5 + set q [mysql::query $conn "select Name from Student"] + mysql::encoding $conn utf-8 + mysql::fetch $q + mysql::endquery $q + return +} + +# 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" + diff --git a/tests/testMapError.tcl b/tests/testMapError.tcl new file mode 100755 index 0000000..0a1e406 --- /dev/null +++ b/tests/testMapError.tcl @@ -0,0 +1,53 @@ +if {[file exists libload.tcl]} { + source libload.tcl +} else { + source [file join [file dirname [info script]] libload.tcl] +} + + +# global connect variables +set dbuser root +set dbpassword "" +set dbank mysqltcltest + +package require tcltest +variable SETUP {#common setup code} +variable CLEANUP {#common cleanup code} +tcltest::configure -verbose bet + +proc getConnection {{addOptions {}} {withDB 1}} { + global dbuser dbpassword dbank + if {$withDB} { + append addOptions " -db $dbank" + } + if {$dbpassword ne ""} { + append addOptions " -password $dbpassword" + } + return [eval mysqlconnect -user $dbuser $addOptions] +} + +set c [getConnection] +proc t {} {mysql::sel $::c {select Name from Student}} +t +namespace eval :: { + set n 3 + mysql::sel $c {select Name from Student} + mysql::map $c n { + puts "$n" + } + mysql::receive $c {select Name from Student} { n } { + puts "$n" + } +} + +#0 0x08002220 in ?? () +#1 0x00185ab4 in TclObjLookupVar () from /opt/tcl845-debug//lib/libtcl8.4.so +#2 0x001864f8 in Tcl_ObjSetVar2 () from /opt/tcl845-debug//lib/libtcl8.4.so +#3 0x008967d7 in Mysqltcl_Map () from /home/artur/programs/mysqltcl/libmysqltcl3.01.so +#4 0x001306db in TclEvalObjvInternal () from /opt/tcl845-debug//lib/libtcl8.4.so +#5 0x00151eba in TclExecuteByteCode () from /opt/tcl845-debug//lib/libtcl8.4.so +#6 0x001513c0 in TclCompEvalObj () from /opt/tcl845-debug//lib/libtcl8.4.so +#7 0x001315e6 in Tcl_EvalObjEx () from /opt/tcl845-debug//lib/libtcl8.4.so +#8 0x0015d65b in Tcl_RecordAndEvalObj () from /opt/tcl845-debug//lib/libtcl8.4.so +#9 0x0016fd39 in Tcl_Main () from /opt/tcl845-debug//lib/libtcl8.4.so +#10 0x080486e6 in main ()