1
0
mirror of https://github.com/sqlite/sqlite.git synced 2025-08-07 02:42:48 +03:00

i18n changes (CVS 201)

FossilOrigin-Name: 8390f6521af0f1c5cd0298cc4a1dfa3f092c1e15
This commit is contained in:
drh
2001-04-05 15:57:13 +00:00
parent 336366ebd8
commit 297ecf146b
14 changed files with 424 additions and 230 deletions

View File

@@ -139,7 +139,9 @@ parse.c: $(TOP)/src/parse.y lemon
./lemon parse.y ./lemon parse.y
sqlite.h: $(TOP)/src/sqlite.h.in sqlite.h: $(TOP)/src/sqlite.h.in
sed -e s/--VERS--/`cat ${TOP}/VERSION`/ $(TOP)/src/sqlite.h.in >sqlite.h sed -e s/--VERS--/`cat ${TOP}/VERSION`/ \
-e s/--ENCODING--/@ENCODING@/ \
$(TOP)/src/sqlite.h.in >sqlite.h
tokenize.o: $(TOP)/src/tokenize.c $(HDR) tokenize.o: $(TOP)/src/tokenize.c $(HDR)
$(TCC) $(GDBM_FLAGS) -c $(TOP)/src/tokenize.c $(TCC) $(GDBM_FLAGS) -c $(TOP)/src/tokenize.c

165
configure vendored
View File

@@ -13,6 +13,8 @@ ac_default_prefix=/usr/local
# Any additions from configure.in: # Any additions from configure.in:
ac_help="$ac_help ac_help="$ac_help
--with-hints=FILE Read configuration options from FILE" --with-hints=FILE Read configuration options from FILE"
ac_help="$ac_help
--enable-utf8 Use UTF-8 encodings"
# Initialize some variables set by options. # Initialize some variables set by options.
# The variables have the same names as the options, with # The variables have the same names as the options, with
@@ -525,7 +527,7 @@ fi
# The following RCS revision string applies to configure.in # The following RCS revision string applies to configure.in
# $Revision: 1.8 $ # $Revision: 1.9 $
######### #########
# Make sure we are not building in a subdirectory of the source tree. # Make sure we are not building in a subdirectory of the source tree.
@@ -600,7 +602,7 @@ if test "$config_BUILD_CC" = ""; then
# Extract the first word of "gcc", so it can be a program name with args. # Extract the first word of "gcc", so it can be a program name with args.
set dummy gcc; ac_word=$2 set dummy gcc; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
echo "configure:604: checking for $ac_word" >&5 echo "configure:606: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6 echo $ac_n "(cached) $ac_c" 1>&6
else else
@@ -630,7 +632,7 @@ if test -z "$CC"; then
# Extract the first word of "cc", so it can be a program name with args. # Extract the first word of "cc", so it can be a program name with args.
set dummy cc; ac_word=$2 set dummy cc; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
echo "configure:634: checking for $ac_word" >&5 echo "configure:636: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6 echo $ac_n "(cached) $ac_c" 1>&6
else else
@@ -681,7 +683,7 @@ fi
# Extract the first word of "cl", so it can be a program name with args. # Extract the first word of "cl", so it can be a program name with args.
set dummy cl; ac_word=$2 set dummy cl; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
echo "configure:685: checking for $ac_word" >&5 echo "configure:687: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6 echo $ac_n "(cached) $ac_c" 1>&6
else else
@@ -713,7 +715,7 @@ fi
fi fi
echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works""... $ac_c" 1>&6 echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works""... $ac_c" 1>&6
echo "configure:717: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5 echo "configure:719: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5
ac_ext=c ac_ext=c
# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. # CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
@@ -724,12 +726,12 @@ cross_compiling=$ac_cv_prog_cc_cross
cat > conftest.$ac_ext << EOF cat > conftest.$ac_ext << EOF
#line 728 "configure" #line 730 "configure"
#include "confdefs.h" #include "confdefs.h"
main(){return(0);} main(){return(0);}
EOF EOF
if { (eval echo configure:733: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then if { (eval echo configure:735: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
ac_cv_prog_cc_works=yes ac_cv_prog_cc_works=yes
# If we can't run a trivial program, we are probably using a cross compiler. # If we can't run a trivial program, we are probably using a cross compiler.
if (./conftest; exit) 2>/dev/null; then if (./conftest; exit) 2>/dev/null; then
@@ -755,12 +757,12 @@ if test $ac_cv_prog_cc_works = no; then
{ echo "configure: error: installation or configuration problem: C compiler cannot create executables." 1>&2; exit 1; } { echo "configure: error: installation or configuration problem: C compiler cannot create executables." 1>&2; exit 1; }
fi fi
echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6 echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6
echo "configure:759: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5 echo "configure:761: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5
echo "$ac_t""$ac_cv_prog_cc_cross" 1>&6 echo "$ac_t""$ac_cv_prog_cc_cross" 1>&6
cross_compiling=$ac_cv_prog_cc_cross cross_compiling=$ac_cv_prog_cc_cross
echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6 echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6
echo "configure:764: checking whether we are using GNU C" >&5 echo "configure:766: checking whether we are using GNU C" >&5
if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6 echo $ac_n "(cached) $ac_c" 1>&6
else else
@@ -769,7 +771,7 @@ else
yes; yes;
#endif #endif
EOF EOF
if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:773: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:775: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then
ac_cv_prog_gcc=yes ac_cv_prog_gcc=yes
else else
ac_cv_prog_gcc=no ac_cv_prog_gcc=no
@@ -788,7 +790,7 @@ ac_test_CFLAGS="${CFLAGS+set}"
ac_save_CFLAGS="$CFLAGS" ac_save_CFLAGS="$CFLAGS"
CFLAGS= CFLAGS=
echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6 echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6
echo "configure:792: checking whether ${CC-cc} accepts -g" >&5 echo "configure:794: checking whether ${CC-cc} accepts -g" >&5
if eval "test \"`echo '$''{'ac_cv_prog_cc_g'+set}'`\" = set"; then if eval "test \"`echo '$''{'ac_cv_prog_cc_g'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6 echo $ac_n "(cached) $ac_c" 1>&6
else else
@@ -827,12 +829,12 @@ fi
else else
BUILD_CC=$config_BUILD_CC BUILD_CC=$config_BUILD_CC
echo $ac_n "checking host compiler""... $ac_c" 1>&6 echo $ac_n "checking host compiler""... $ac_c" 1>&6
echo "configure:831: checking host compiler" >&5 echo "configure:833: checking host compiler" >&5
CC=$BUILD_CC CC=$BUILD_CC
echo "$ac_t""$BUILD_CC" 1>&6 echo "$ac_t""$BUILD_CC" 1>&6
fi fi
echo $ac_n "checking switches for the host compiler""... $ac_c" 1>&6 echo $ac_n "checking switches for the host compiler""... $ac_c" 1>&6
echo "configure:836: checking switches for the host compiler" >&5 echo "configure:838: checking switches for the host compiler" >&5
if test "$config_BUILD_CFLAGS" != ""; then if test "$config_BUILD_CFLAGS" != ""; then
CFLAGS=$config_BUILD_CFLAGS CFLAGS=$config_BUILD_CFLAGS
BUILD_CFLAGS=$config_BUILD_CFLAGS BUILD_CFLAGS=$config_BUILD_CFLAGS
@@ -852,7 +854,7 @@ fi
# the target machine. # the target machine.
# #
echo $ac_n "checking target compiler""... $ac_c" 1>&6 echo $ac_n "checking target compiler""... $ac_c" 1>&6
echo "configure:856: checking target compiler" >&5 echo "configure:858: checking target compiler" >&5
if test "$config_TARGET_CC" != ""; then if test "$config_TARGET_CC" != ""; then
TARGET_CC=$config_TARGET_CC TARGET_CC=$config_TARGET_CC
else else
@@ -860,7 +862,7 @@ else
fi fi
echo "$ac_t""$TARGET_CC" 1>&6 echo "$ac_t""$TARGET_CC" 1>&6
echo $ac_n "checking switches on the target compiler""... $ac_c" 1>&6 echo $ac_n "checking switches on the target compiler""... $ac_c" 1>&6
echo "configure:864: checking switches on the target compiler" >&5 echo "configure:866: checking switches on the target compiler" >&5
if test "$config_TARGET_CFLAGS" != ""; then if test "$config_TARGET_CFLAGS" != ""; then
TARGET_CFLAGS=$config_TARGET_CFLAGS TARGET_CFLAGS=$config_TARGET_CFLAGS
else else
@@ -868,7 +870,7 @@ else
fi fi
echo "$ac_t""$TARGET_CFLAGS" 1>&6 echo "$ac_t""$TARGET_CFLAGS" 1>&6
echo $ac_n "checking target linker""... $ac_c" 1>&6 echo $ac_n "checking target linker""... $ac_c" 1>&6
echo "configure:872: checking target linker" >&5 echo "configure:874: checking target linker" >&5
if test "$config_TARGET_LINK" = ""; then if test "$config_TARGET_LINK" = ""; then
TARGET_LINK=$TARGET_CC TARGET_LINK=$TARGET_CC
else else
@@ -876,7 +878,7 @@ else
fi fi
echo "$ac_t""$TARGET_LINK" 1>&6 echo "$ac_t""$TARGET_LINK" 1>&6
echo $ac_n "checking switches on the target compiler""... $ac_c" 1>&6 echo $ac_n "checking switches on the target compiler""... $ac_c" 1>&6
echo "configure:880: checking switches on the target compiler" >&5 echo "configure:882: checking switches on the target compiler" >&5
if test "$config_TARGET_TFLAGS" != ""; then if test "$config_TARGET_TFLAGS" != ""; then
TARGET_TFLAGS=$config_TARGET_TFLAGS TARGET_TFLAGS=$config_TARGET_TFLAGS
else else
@@ -888,7 +890,7 @@ else
# Extract the first word of "ranlib", so it can be a program name with args. # Extract the first word of "ranlib", so it can be a program name with args.
set dummy ranlib; ac_word=$2 set dummy ranlib; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
echo "configure:892: checking for $ac_word" >&5 echo "configure:894: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6 echo $ac_n "(cached) $ac_c" 1>&6
else else
@@ -934,7 +936,7 @@ echo "$ac_t""$TARGET_TFLAGS" 1>&6
# it 0 if we are not. # it 0 if we are not.
# #
echo $ac_n "checking if host and target compilers are the same""... $ac_c" 1>&6 echo $ac_n "checking if host and target compilers are the same""... $ac_c" 1>&6
echo "configure:938: checking if host and target compilers are the same" >&5 echo "configure:940: checking if host and target compilers are the same" >&5
if test "$BUILD_CC" = "$TARGET_CC"; then if test "$BUILD_CC" = "$TARGET_CC"; then
cross=0 cross=0
echo "$ac_t""yes" 1>&6 echo "$ac_t""yes" 1>&6
@@ -943,13 +945,35 @@ else
echo "$ac_t""no" 1>&6 echo "$ac_t""no" 1>&6
fi fi
##########
# Are we using UTF-8 or iso8859 encodings?
#
# Check whether --enable-utf8 or --disable-utf8 was given.
if test "${enable_utf8+set}" = set; then
enableval="$enable_utf8"
:
else
enable_utf8=no
fi
echo $ac_n "checking character encoding""... $ac_c" 1>&6
echo "configure:961: checking character encoding" >&5
if test "$enable_utf8" = "no"; then
ENCODING=ISO8859
echo "$ac_t""iso8859" 1>&6
else
ENCODING=UTF8
echo "$ac_t""UTF-8" 1>&6
fi
########### ###########
# Lots of things are different if we are compiling for Windows using # Lots of things are different if we are compiling for Windows using
# the CYGWIN environment. So check for that special case and handle # the CYGWIN environment. So check for that special case and handle
# things accordingly. # things accordingly.
# #
echo $ac_n "checking if executables have the .exe suffix""... $ac_c" 1>&6 echo $ac_n "checking if executables have the .exe suffix""... $ac_c" 1>&6
echo "configure:953: checking if executables have the .exe suffix" >&5 echo "configure:977: checking if executables have the .exe suffix" >&5
if test "$config_BUILD_EXEEXT" = ".exe"; then if test "$config_BUILD_EXEEXT" = ".exe"; then
CYGWIN=yes CYGWIN=yes
echo "$ac_t""yes" 1>&6 echo "$ac_t""yes" 1>&6
@@ -958,12 +982,12 @@ else
fi fi
if test "$CYGWIN" != "yes"; then if test "$CYGWIN" != "yes"; then
echo $ac_n "checking for Cygwin environment""... $ac_c" 1>&6 echo $ac_n "checking for Cygwin environment""... $ac_c" 1>&6
echo "configure:962: checking for Cygwin environment" >&5 echo "configure:986: checking for Cygwin environment" >&5
if eval "test \"`echo '$''{'ac_cv_cygwin'+set}'`\" = set"; then if eval "test \"`echo '$''{'ac_cv_cygwin'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6 echo $ac_n "(cached) $ac_c" 1>&6
else else
cat > conftest.$ac_ext <<EOF cat > conftest.$ac_ext <<EOF
#line 967 "configure" #line 991 "configure"
#include "confdefs.h" #include "confdefs.h"
int main() { int main() {
@@ -974,7 +998,7 @@ int main() {
return __CYGWIN__; return __CYGWIN__;
; return 0; } ; return 0; }
EOF EOF
if { (eval echo configure:978: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then if { (eval echo configure:1002: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest* rm -rf conftest*
ac_cv_cygwin=yes ac_cv_cygwin=yes
else else
@@ -1038,12 +1062,12 @@ else
fi fi
CC=$TARGET_CC CC=$TARGET_CC
echo $ac_n "checking for sin""... $ac_c" 1>&6 echo $ac_n "checking for sin""... $ac_c" 1>&6
echo "configure:1042: checking for sin" >&5 echo "configure:1066: checking for sin" >&5
if eval "test \"`echo '$''{'ac_cv_func_sin'+set}'`\" = set"; then if eval "test \"`echo '$''{'ac_cv_func_sin'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6 echo $ac_n "(cached) $ac_c" 1>&6
else else
cat > conftest.$ac_ext <<EOF cat > conftest.$ac_ext <<EOF
#line 1047 "configure" #line 1071 "configure"
#include "confdefs.h" #include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes, /* System header to define __stub macros and hopefully few prototypes,
which can conflict with char sin(); below. */ which can conflict with char sin(); below. */
@@ -1066,7 +1090,7 @@ sin();
; return 0; } ; return 0; }
EOF EOF
if { (eval echo configure:1070: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then if { (eval echo configure:1094: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest* rm -rf conftest*
eval "ac_cv_func_sin=yes" eval "ac_cv_func_sin=yes"
else else
@@ -1087,7 +1111,7 @@ LIBS="-lm"
fi fi
echo $ac_n "checking for dlopen in -ldl""... $ac_c" 1>&6 echo $ac_n "checking for dlopen in -ldl""... $ac_c" 1>&6
echo "configure:1091: checking for dlopen in -ldl" >&5 echo "configure:1115: checking for dlopen in -ldl" >&5
ac_lib_var=`echo dl'_'dlopen | sed 'y%./+-%__p_%'` ac_lib_var=`echo dl'_'dlopen | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6 echo $ac_n "(cached) $ac_c" 1>&6
@@ -1095,7 +1119,7 @@ else
ac_save_LIBS="$LIBS" ac_save_LIBS="$LIBS"
LIBS="-ldl $LIBS" LIBS="-ldl $LIBS"
cat > conftest.$ac_ext <<EOF cat > conftest.$ac_ext <<EOF
#line 1099 "configure" #line 1123 "configure"
#include "confdefs.h" #include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */ /* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2 /* We use char because int might match the return type of a gcc2
@@ -1106,7 +1130,7 @@ int main() {
dlopen() dlopen()
; return 0; } ; return 0; }
EOF EOF
if { (eval echo configure:1110: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then if { (eval echo configure:1134: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest* rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes" eval "ac_cv_lib_$ac_lib_var=yes"
else else
@@ -1140,14 +1164,14 @@ fi
LIBS="" LIBS=""
echo $ac_n "checking for library containing Tcl_Init""... $ac_c" 1>&6 echo $ac_n "checking for library containing Tcl_Init""... $ac_c" 1>&6
echo "configure:1144: checking for library containing Tcl_Init" >&5 echo "configure:1168: checking for library containing Tcl_Init" >&5
if eval "test \"`echo '$''{'ac_cv_search_Tcl_Init'+set}'`\" = set"; then if eval "test \"`echo '$''{'ac_cv_search_Tcl_Init'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6 echo $ac_n "(cached) $ac_c" 1>&6
else else
ac_func_search_save_LIBS="$LIBS" ac_func_search_save_LIBS="$LIBS"
ac_cv_search_Tcl_Init="no" ac_cv_search_Tcl_Init="no"
cat > conftest.$ac_ext <<EOF cat > conftest.$ac_ext <<EOF
#line 1151 "configure" #line 1175 "configure"
#include "confdefs.h" #include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */ /* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2 /* We use char because int might match the return type of a gcc2
@@ -1158,7 +1182,7 @@ int main() {
Tcl_Init() Tcl_Init()
; return 0; } ; return 0; }
EOF EOF
if { (eval echo configure:1162: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then if { (eval echo configure:1186: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest* rm -rf conftest*
ac_cv_search_Tcl_Init="none required" ac_cv_search_Tcl_Init="none required"
else else
@@ -1169,7 +1193,7 @@ rm -f conftest*
test "$ac_cv_search_Tcl_Init" = "no" && for i in tcl8.4 tcl8.3 tcl8.2 tcl8.1 tcl8.0 tcl80 tcl; do test "$ac_cv_search_Tcl_Init" = "no" && for i in tcl8.4 tcl8.3 tcl8.2 tcl8.1 tcl8.0 tcl80 tcl; do
LIBS="-l$i $otherlibs $ac_func_search_save_LIBS" LIBS="-l$i $otherlibs $ac_func_search_save_LIBS"
cat > conftest.$ac_ext <<EOF cat > conftest.$ac_ext <<EOF
#line 1173 "configure" #line 1197 "configure"
#include "confdefs.h" #include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */ /* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2 /* We use char because int might match the return type of a gcc2
@@ -1180,7 +1204,7 @@ int main() {
Tcl_Init() Tcl_Init()
; return 0; } ; return 0; }
EOF EOF
if { (eval echo configure:1184: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then if { (eval echo configure:1208: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest* rm -rf conftest*
ac_cv_search_Tcl_Init="-l$i" ac_cv_search_Tcl_Init="-l$i"
break break
@@ -1209,7 +1233,7 @@ fi
# Figure out where to get the TCL header files. # Figure out where to get the TCL header files.
# #
echo $ac_n "checking TCL header files""... $ac_c" 1>&6 echo $ac_n "checking TCL header files""... $ac_c" 1>&6
echo "configure:1213: checking TCL header files" >&5 echo "configure:1237: checking TCL header files" >&5
found=no found=no
if test "$config_TARGET_TCL_INC" != ""; then if test "$config_TARGET_TCL_INC" != ""; then
TARGET_TCL_INC=$config_TARGET_TCL_INC TARGET_TCL_INC=$config_TARGET_TCL_INC
@@ -1228,7 +1252,7 @@ if test "$found" = "yes"; then
else else
echo "$ac_t""not specified: still searching..." 1>&6 echo "$ac_t""not specified: still searching..." 1>&6
echo $ac_n "checking how to run the C preprocessor""... $ac_c" 1>&6 echo $ac_n "checking how to run the C preprocessor""... $ac_c" 1>&6
echo "configure:1232: checking how to run the C preprocessor" >&5 echo "configure:1256: checking how to run the C preprocessor" >&5
# On Suns, sometimes $CPP names a directory. # On Suns, sometimes $CPP names a directory.
if test -n "$CPP" && test -d "$CPP"; then if test -n "$CPP" && test -d "$CPP"; then
CPP= CPP=
@@ -1243,13 +1267,13 @@ else
# On the NeXT, cc -E runs the code through the compiler's parser, # On the NeXT, cc -E runs the code through the compiler's parser,
# not just through cpp. # not just through cpp.
cat > conftest.$ac_ext <<EOF cat > conftest.$ac_ext <<EOF
#line 1247 "configure" #line 1271 "configure"
#include "confdefs.h" #include "confdefs.h"
#include <assert.h> #include <assert.h>
Syntax Error Syntax Error
EOF EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
{ (eval echo configure:1253: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } { (eval echo configure:1277: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then if test -z "$ac_err"; then
: :
@@ -1260,13 +1284,13 @@ else
rm -rf conftest* rm -rf conftest*
CPP="${CC-cc} -E -traditional-cpp" CPP="${CC-cc} -E -traditional-cpp"
cat > conftest.$ac_ext <<EOF cat > conftest.$ac_ext <<EOF
#line 1264 "configure" #line 1288 "configure"
#include "confdefs.h" #include "confdefs.h"
#include <assert.h> #include <assert.h>
Syntax Error Syntax Error
EOF EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
{ (eval echo configure:1270: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } { (eval echo configure:1294: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then if test -z "$ac_err"; then
: :
@@ -1277,13 +1301,13 @@ else
rm -rf conftest* rm -rf conftest*
CPP="${CC-cc} -nologo -E" CPP="${CC-cc} -nologo -E"
cat > conftest.$ac_ext <<EOF cat > conftest.$ac_ext <<EOF
#line 1281 "configure" #line 1305 "configure"
#include "confdefs.h" #include "confdefs.h"
#include <assert.h> #include <assert.h>
Syntax Error Syntax Error
EOF EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
{ (eval echo configure:1287: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } { (eval echo configure:1311: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then if test -z "$ac_err"; then
: :
@@ -1309,17 +1333,17 @@ echo "$ac_t""$CPP" 1>&6
ac_safe=`echo "tcl.h" | sed 'y%./+-%__p_%'` ac_safe=`echo "tcl.h" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for tcl.h""... $ac_c" 1>&6 echo $ac_n "checking for tcl.h""... $ac_c" 1>&6
echo "configure:1313: checking for tcl.h" >&5 echo "configure:1337: checking for tcl.h" >&5
if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6 echo $ac_n "(cached) $ac_c" 1>&6
else else
cat > conftest.$ac_ext <<EOF cat > conftest.$ac_ext <<EOF
#line 1318 "configure" #line 1342 "configure"
#include "confdefs.h" #include "confdefs.h"
#include <tcl.h> #include <tcl.h>
EOF EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
{ (eval echo configure:1323: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } { (eval echo configure:1347: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then if test -z "$ac_err"; then
rm -rf conftest* rm -rf conftest*
@@ -1346,7 +1370,7 @@ if test "$found" = "no"; then
ac_safe=`echo "$dir/include/tcl.h" | sed 'y%./+-%__p_%'` ac_safe=`echo "$dir/include/tcl.h" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for $dir/include/tcl.h""... $ac_c" 1>&6 echo $ac_n "checking for $dir/include/tcl.h""... $ac_c" 1>&6
echo "configure:1350: checking for $dir/include/tcl.h" >&5 echo "configure:1374: checking for $dir/include/tcl.h" >&5
if eval "test \"`echo '$''{'ac_cv_file_$ac_safe'+set}'`\" = set"; then if eval "test \"`echo '$''{'ac_cv_file_$ac_safe'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6 echo $ac_n "(cached) $ac_c" 1>&6
else else
@@ -1390,14 +1414,14 @@ else
LIBS="" LIBS=""
echo $ac_n "checking for library containing gdbm_open""... $ac_c" 1>&6 echo $ac_n "checking for library containing gdbm_open""... $ac_c" 1>&6
echo "configure:1394: checking for library containing gdbm_open" >&5 echo "configure:1418: checking for library containing gdbm_open" >&5
if eval "test \"`echo '$''{'ac_cv_search_gdbm_open'+set}'`\" = set"; then if eval "test \"`echo '$''{'ac_cv_search_gdbm_open'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6 echo $ac_n "(cached) $ac_c" 1>&6
else else
ac_func_search_save_LIBS="$LIBS" ac_func_search_save_LIBS="$LIBS"
ac_cv_search_gdbm_open="no" ac_cv_search_gdbm_open="no"
cat > conftest.$ac_ext <<EOF cat > conftest.$ac_ext <<EOF
#line 1401 "configure" #line 1425 "configure"
#include "confdefs.h" #include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */ /* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2 /* We use char because int might match the return type of a gcc2
@@ -1408,7 +1432,7 @@ int main() {
gdbm_open() gdbm_open()
; return 0; } ; return 0; }
EOF EOF
if { (eval echo configure:1412: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then if { (eval echo configure:1436: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest* rm -rf conftest*
ac_cv_search_gdbm_open="none required" ac_cv_search_gdbm_open="none required"
else else
@@ -1419,7 +1443,7 @@ rm -f conftest*
test "$ac_cv_search_gdbm_open" = "no" && for i in gdbm; do test "$ac_cv_search_gdbm_open" = "no" && for i in gdbm; do
LIBS="-l$i $ac_func_search_save_LIBS" LIBS="-l$i $ac_func_search_save_LIBS"
cat > conftest.$ac_ext <<EOF cat > conftest.$ac_ext <<EOF
#line 1423 "configure" #line 1447 "configure"
#include "confdefs.h" #include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */ /* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2 /* We use char because int might match the return type of a gcc2
@@ -1430,7 +1454,7 @@ int main() {
gdbm_open() gdbm_open()
; return 0; } ; return 0; }
EOF EOF
if { (eval echo configure:1434: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then if { (eval echo configure:1458: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest* rm -rf conftest*
ac_cv_search_gdbm_open="-l$i" ac_cv_search_gdbm_open="-l$i"
break break
@@ -1458,7 +1482,7 @@ fi
# Figure out where to get the GDBM header files. # Figure out where to get the GDBM header files.
# #
echo $ac_n "checking GDBM header files""... $ac_c" 1>&6 echo $ac_n "checking GDBM header files""... $ac_c" 1>&6
echo "configure:1462: checking GDBM header files" >&5 echo "configure:1486: checking GDBM header files" >&5
found=no found=no
if test "$config_TARGET_GDBM_INC" != ""; then if test "$config_TARGET_GDBM_INC" != ""; then
TARGET_GDBM_INC=$config_TARGET_GDBM_INC TARGET_GDBM_INC=$config_TARGET_GDBM_INC
@@ -1470,17 +1494,17 @@ else
echo "$ac_t""not specified: still searching..." 1>&6 echo "$ac_t""not specified: still searching..." 1>&6
ac_safe=`echo "gdbm.h" | sed 'y%./+-%__p_%'` ac_safe=`echo "gdbm.h" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for gdbm.h""... $ac_c" 1>&6 echo $ac_n "checking for gdbm.h""... $ac_c" 1>&6
echo "configure:1474: checking for gdbm.h" >&5 echo "configure:1498: checking for gdbm.h" >&5
if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6 echo $ac_n "(cached) $ac_c" 1>&6
else else
cat > conftest.$ac_ext <<EOF cat > conftest.$ac_ext <<EOF
#line 1479 "configure" #line 1503 "configure"
#include "confdefs.h" #include "confdefs.h"
#include <gdbm.h> #include <gdbm.h>
EOF EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
{ (eval echo configure:1484: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } { (eval echo configure:1508: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then if test -z "$ac_err"; then
rm -rf conftest* rm -rf conftest*
@@ -1507,7 +1531,7 @@ if test "$found" = "no"; then
ac_safe=`echo "$dir/include/gdbm.h" | sed 'y%./+-%__p_%'` ac_safe=`echo "$dir/include/gdbm.h" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for $dir/include/gdbm.h""... $ac_c" 1>&6 echo $ac_n "checking for $dir/include/gdbm.h""... $ac_c" 1>&6
echo "configure:1511: checking for $dir/include/gdbm.h" >&5 echo "configure:1535: checking for $dir/include/gdbm.h" >&5
if eval "test \"`echo '$''{'ac_cv_file_$ac_safe'+set}'`\" = set"; then if eval "test \"`echo '$''{'ac_cv_file_$ac_safe'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6 echo $ac_n "(cached) $ac_c" 1>&6
else else
@@ -1548,14 +1572,14 @@ else
LIBS="" LIBS=""
echo $ac_n "checking for library containing readline""... $ac_c" 1>&6 echo $ac_n "checking for library containing readline""... $ac_c" 1>&6
echo "configure:1552: checking for library containing readline" >&5 echo "configure:1576: checking for library containing readline" >&5
if eval "test \"`echo '$''{'ac_cv_search_readline'+set}'`\" = set"; then if eval "test \"`echo '$''{'ac_cv_search_readline'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6 echo $ac_n "(cached) $ac_c" 1>&6
else else
ac_func_search_save_LIBS="$LIBS" ac_func_search_save_LIBS="$LIBS"
ac_cv_search_readline="no" ac_cv_search_readline="no"
cat > conftest.$ac_ext <<EOF cat > conftest.$ac_ext <<EOF
#line 1559 "configure" #line 1583 "configure"
#include "confdefs.h" #include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */ /* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2 /* We use char because int might match the return type of a gcc2
@@ -1566,7 +1590,7 @@ int main() {
readline() readline()
; return 0; } ; return 0; }
EOF EOF
if { (eval echo configure:1570: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then if { (eval echo configure:1594: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest* rm -rf conftest*
ac_cv_search_readline="none required" ac_cv_search_readline="none required"
else else
@@ -1577,7 +1601,7 @@ rm -f conftest*
test "$ac_cv_search_readline" = "no" && for i in readline; do test "$ac_cv_search_readline" = "no" && for i in readline; do
LIBS="-l$i $ac_func_search_save_LIBS" LIBS="-l$i $ac_func_search_save_LIBS"
cat > conftest.$ac_ext <<EOF cat > conftest.$ac_ext <<EOF
#line 1581 "configure" #line 1605 "configure"
#include "confdefs.h" #include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */ /* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2 /* We use char because int might match the return type of a gcc2
@@ -1588,7 +1612,7 @@ int main() {
readline() readline()
; return 0; } ; return 0; }
EOF EOF
if { (eval echo configure:1592: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then if { (eval echo configure:1616: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest* rm -rf conftest*
ac_cv_search_readline="-l$i" ac_cv_search_readline="-l$i"
break break
@@ -1616,7 +1640,7 @@ fi
# Figure out where to get the READLINE header files. # Figure out where to get the READLINE header files.
# #
echo $ac_n "checking readline header files""... $ac_c" 1>&6 echo $ac_n "checking readline header files""... $ac_c" 1>&6
echo "configure:1620: checking readline header files" >&5 echo "configure:1644: checking readline header files" >&5
found=no found=no
if test "$config_TARGET_READLINE_INC" != ""; then if test "$config_TARGET_READLINE_INC" != ""; then
TARGET_READLINE_INC=$config_TARGET_READLINE_INC TARGET_READLINE_INC=$config_TARGET_READLINE_INC
@@ -1628,17 +1652,17 @@ else
echo "$ac_t""not specified: still searching..." 1>&6 echo "$ac_t""not specified: still searching..." 1>&6
ac_safe=`echo "readline.h" | sed 'y%./+-%__p_%'` ac_safe=`echo "readline.h" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for readline.h""... $ac_c" 1>&6 echo $ac_n "checking for readline.h""... $ac_c" 1>&6
echo "configure:1632: checking for readline.h" >&5 echo "configure:1656: checking for readline.h" >&5
if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6 echo $ac_n "(cached) $ac_c" 1>&6
else else
cat > conftest.$ac_ext <<EOF cat > conftest.$ac_ext <<EOF
#line 1637 "configure" #line 1661 "configure"
#include "confdefs.h" #include "confdefs.h"
#include <readline.h> #include <readline.h>
EOF EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
{ (eval echo configure:1642: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } { (eval echo configure:1666: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then if test -z "$ac_err"; then
rm -rf conftest* rm -rf conftest*
@@ -1665,7 +1689,7 @@ if test "$found" = "no"; then
ac_safe=`echo "$dir/include/readline.h" | sed 'y%./+-%__p_%'` ac_safe=`echo "$dir/include/readline.h" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for $dir/include/readline.h""... $ac_c" 1>&6 echo $ac_n "checking for $dir/include/readline.h""... $ac_c" 1>&6
echo "configure:1669: checking for $dir/include/readline.h" >&5 echo "configure:1693: checking for $dir/include/readline.h" >&5
if eval "test \"`echo '$''{'ac_cv_file_$ac_safe'+set}'`\" = set"; then if eval "test \"`echo '$''{'ac_cv_file_$ac_safe'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6 echo $ac_n "(cached) $ac_c" 1>&6
else else
@@ -1694,7 +1718,7 @@ fi
ac_safe=`echo "$dir/include/readline/readline.h" | sed 'y%./+-%__p_%'` ac_safe=`echo "$dir/include/readline/readline.h" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for $dir/include/readline/readline.h""... $ac_c" 1>&6 echo $ac_n "checking for $dir/include/readline/readline.h""... $ac_c" 1>&6
echo "configure:1698: checking for $dir/include/readline/readline.h" >&5 echo "configure:1722: checking for $dir/include/readline/readline.h" >&5
if eval "test \"`echo '$''{'ac_cv_file_$ac_safe'+set}'`\" = set"; then if eval "test \"`echo '$''{'ac_cv_file_$ac_safe'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6 echo $ac_n "(cached) $ac_c" 1>&6
else else
@@ -1738,12 +1762,12 @@ fi
# Figure out whether or not we have a "usleep()" function. # Figure out whether or not we have a "usleep()" function.
# #
echo $ac_n "checking for usleep""... $ac_c" 1>&6 echo $ac_n "checking for usleep""... $ac_c" 1>&6
echo "configure:1742: checking for usleep" >&5 echo "configure:1766: checking for usleep" >&5
if eval "test \"`echo '$''{'ac_cv_func_usleep'+set}'`\" = set"; then if eval "test \"`echo '$''{'ac_cv_func_usleep'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6 echo $ac_n "(cached) $ac_c" 1>&6
else else
cat > conftest.$ac_ext <<EOF cat > conftest.$ac_ext <<EOF
#line 1747 "configure" #line 1771 "configure"
#include "confdefs.h" #include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes, /* System header to define __stub macros and hopefully few prototypes,
which can conflict with char usleep(); below. */ which can conflict with char usleep(); below. */
@@ -1766,7 +1790,7 @@ usleep();
; return 0; } ; return 0; }
EOF EOF
if { (eval echo configure:1770: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then if { (eval echo configure:1794: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest* rm -rf conftest*
eval "ac_cv_func_usleep=yes" eval "ac_cv_func_usleep=yes"
else else
@@ -1945,6 +1969,7 @@ s%@TARGET_LINK@%$TARGET_LINK%g
s%@TARGET_LFLAGS@%$TARGET_LFLAGS%g s%@TARGET_LFLAGS@%$TARGET_LFLAGS%g
s%@TARGET_RANLIB@%$TARGET_RANLIB%g s%@TARGET_RANLIB@%$TARGET_RANLIB%g
s%@TARGET_AR@%$TARGET_AR%g s%@TARGET_AR@%$TARGET_AR%g
s%@ENCODING@%$ENCODING%g
s%@BUILD_EXEEXT@%$BUILD_EXEEXT%g s%@BUILD_EXEEXT@%$BUILD_EXEEXT%g
s%@OS_UNIX@%$OS_UNIX%g s%@OS_UNIX@%$OS_UNIX%g
s%@OS_WIN@%$OS_WIN%g s%@OS_WIN@%$OS_WIN%g

View File

@@ -151,7 +151,7 @@ AC_INIT(src/sqlite.h.in)
dnl Put the RCS revision string after AC_INIT so that it will also dnl Put the RCS revision string after AC_INIT so that it will also
dnl show in in configure. dnl show in in configure.
# The following RCS revision string applies to configure.in # The following RCS revision string applies to configure.in
# $Revision: 1.8 $ # $Revision: 1.9 $
######### #########
# Make sure we are not building in a subdirectory of the source tree. # Make sure we are not building in a subdirectory of the source tree.
@@ -309,6 +309,21 @@ else
AC_MSG_RESULT(no) AC_MSG_RESULT(no)
fi fi
##########
# Are we using UTF-8 or iso8859 encodings?
#
AC_ARG_ENABLE(utf8,
[ --enable-utf8 Use UTF-8 encodings],,enable_utf8=no)
AC_MSG_CHECKING([character encoding])
if test "$enable_utf8" = "no"; then
ENCODING=ISO8859
AC_MSG_RESULT([iso8859])
else
ENCODING=UTF8
AC_MSG_RESULT([UTF-8])
fi
AC_SUBST(ENCODING)
########### ###########
# Lots of things are different if we are compiling for Windows using # Lots of things are different if we are compiling for Windows using
# the CYGWIN environment. So check for that special case and handle # the CYGWIN environment. So check for that special case and handle

View File

@@ -1,11 +1,11 @@
C Version\s1.0.28\s(CVS\s475) C i18n\schanges\s(CVS\s201)
D 2001-04-04T21:30:00 D 2001-04-05T15:57:13
F COPYRIGHT 74a8a6531a42e124df07ab5599aad63870fa0bd4 F COPYRIGHT 74a8a6531a42e124df07ab5599aad63870fa0bd4
F Makefile.in fd8815aa01a7181f60f786158b7737a35413189e F Makefile.in 25791375ce9f4f5b57d4cab67f0d58d772c96451
F README 51f6a4e7408b34afa5bc1c0485f61b6a4efb6958 F README 51f6a4e7408b34afa5bc1c0485f61b6a4efb6958
F VERSION fb0fbad3b7a52736cc18ea5fcf1bc6dba7b2c40c F VERSION fb0fbad3b7a52736cc18ea5fcf1bc6dba7b2c40c
F configure 3dc1edb9dcf60215e31ff72b447935ab62211442 x F configure 260d3be664b6d9b4d2d985e66b6dae1ef723c86e x
F configure.in d892ca33db7e88a055519ce2f36dcb11020e8fff F configure.in 6940e3f88bf3d28a10c73b06ab99fd3a7e039a61
F doc/lemon.html e233a3e97a779c7a87e1bc4528c664a58e49dd47 F doc/lemon.html e233a3e97a779c7a87e1bc4528c664a58e49dd47
F doc/report1.txt 734cbae63b1310cc643fe5e9e3da1ab55a79b99e F doc/report1.txt 734cbae63b1310cc643fe5e9e3da1ab55a79b99e
F src/TODO 38a68a489e56e9fd4a96263e0ff9404a47368ad4 F src/TODO 38a68a489e56e9fd4a96263e0ff9404a47368ad4
@@ -25,7 +25,7 @@ F src/ex/pg.h 23a4ac807b0546ec2bb6239ec8bd3e06926572cd
F src/ex/sizes.tcl f54bad4a2ac567624be59131a6ee42d71b41a3d7 F src/ex/sizes.tcl f54bad4a2ac567624be59131a6ee42d71b41a3d7
F src/expr.c 745383609b65d504a2cc04ac4d9389e9c8e2bc80 F src/expr.c 745383609b65d504a2cc04ac4d9389e9c8e2bc80
F src/insert.c 4bc1cab84f7805d560a1417734a532843e30b762 F src/insert.c 4bc1cab84f7805d560a1417734a532843e30b762
F src/main.c 5afe29c425b875acede20f609485866eb5b276f6 F src/main.c d52a1c2a7a964acca87880ac925019c383b8e606
F src/pager.h 889c5cf517ad30704e295540793c893ac843fd5f F src/pager.h 889c5cf517ad30704e295540793c893ac843fd5f
F src/parse.y 1ba81d3b75f37ca868aa0ab990bb977fd41519eb F src/parse.y 1ba81d3b75f37ca868aa0ab990bb977fd41519eb
F src/printf.c af0dc65c293427272e1949c7807b1d88f10004fd F src/printf.c af0dc65c293427272e1949c7807b1d88f10004fd
@@ -33,22 +33,22 @@ F src/random.c b36c3f57dc80c8f354e6bfbf39cf1e1de021d54a
F src/select.c a6bfdaa92d4614e79bf18129283c5163faa291fc F src/select.c a6bfdaa92d4614e79bf18129283c5163faa291fc
F src/shell.c c1785b4af18192056adbe894f8626a7e7bdf47aa F src/shell.c c1785b4af18192056adbe894f8626a7e7bdf47aa
F src/shell.tcl 27ecbd63dd88396ad16d81ab44f73e6c0ea9d20e F src/shell.tcl 27ecbd63dd88396ad16d81ab44f73e6c0ea9d20e
F src/sqlite.h.in 3b446fcbed6005f0ab89632f3356c4708b349e88 F src/sqlite.h.in f13156b85c51a6d7d06678bbe69554c90cde1fe2
F src/sqliteInt.h 97e2dd488ab433e27eda6e26f4c84a9a2684785c F src/sqliteInt.h 97e2dd488ab433e27eda6e26f4c84a9a2684785c
F src/table.c 5be76051a8ed6f6bfa641f4adc52529efa34fbf9 F src/table.c 5be76051a8ed6f6bfa641f4adc52529efa34fbf9
F src/tclsqlite.c f654b0399ea8a29262637dbe71fdfe7c26bd9032 F src/tclsqlite.c 82eda60c7ae5cd7b71023a55c5710a74713c313b
F src/tokenize.c 8fc3936eefad84f1fff19e0892ed0542eb9ac7b3 F src/tokenize.c 8fc3936eefad84f1fff19e0892ed0542eb9ac7b3
F src/update.c 8365b3922ea098330d1e20862d6e64911e4e03d0 F src/update.c 8365b3922ea098330d1e20862d6e64911e4e03d0
F src/util.c 16a7af31c23db4066b2cfdc200a4067bc13d80ab F src/util.c aec315b834bad444c9e0e90efd9d2eaeeb37c90c
F src/vdbe.c eec6c26547108270df5cc304d214686ebf014f4f F src/vdbe.c 5f5be704686ed328275c35815e39d041a0c6cbb6
F src/vdbe.h dc1205da434c6a9da03b5d6b089270bbc8e6d437 F src/vdbe.h dc1205da434c6a9da03b5d6b089270bbc8e6d437
F src/where.c 459bf37ac7849599da400420984b3306484b4cbb F src/where.c 459bf37ac7849599da400420984b3306484b4cbb
F test/all.test 15cac2f6b2d4c55bf896212aff3cc9d6597b0490 F test/all.test 15cac2f6b2d4c55bf896212aff3cc9d6597b0490
F test/copy.test b77a1214bd7756f2849d5c4fa6e715c0ff0c34eb F test/copy.test b77a1214bd7756f2849d5c4fa6e715c0ff0c34eb
F test/dbbe.test a022fe2d983848f786e17ef1fc6809cfd37fb02c F test/dbbe.test a022fe2d983848f786e17ef1fc6809cfd37fb02c
F test/delete.test 50b9b1f06c843d591741dba7869433a105360dbf F test/delete.test 50b9b1f06c843d591741dba7869433a105360dbf
F test/expr.test 278d7524079219f3bf9df41225903c9fb8c61c19 F test/expr.test 1e4822af0213734dd325521a6e25fe38f1fa7f9d
F test/func.test 02aed8845b98bde1043dda97455de1d37238ebb3 F test/func.test 11c415efe9d435aa0136edd0b3cb11efe5c3ead7
F test/in.test ea48016c4fcc479d315932ae2b8568146686ffaf F test/in.test ea48016c4fcc479d315932ae2b8568146686ffaf
F test/index.test b189ac11bf8d4fbcf87402f4028c25c8a6d91bb5 F test/index.test b189ac11bf8d4fbcf87402f4028c25c8a6d91bb5
F test/insert.test dbd3bd189edb61fddbe66c236694ef23352429f1 F test/insert.test dbd3bd189edb61fddbe66c236694ef23352429f1
@@ -83,18 +83,18 @@ F www/arch.fig 4f246003b7da23bd63b8b0af0618afb4ee3055c8
F www/arch.png 8dae0766d42ed3de9ed013c1341a5792bcf633e6 F www/arch.png 8dae0766d42ed3de9ed013c1341a5792bcf633e6
F www/arch.tcl a40380c1fe0080c43e6cc5c20ed70731511b06be F www/arch.tcl a40380c1fe0080c43e6cc5c20ed70731511b06be
F www/c_interface.tcl 11be2d5826eb7d6efd629751d3b483c1ed78ba14 F www/c_interface.tcl 11be2d5826eb7d6efd629751d3b483c1ed78ba14
F www/changes.tcl 9cea962625b87620cfbb2ecb0ed9a8a5e6b2cee3 F www/changes.tcl c6c8aa0fdd02d4dbc17803aa023279e0d3809ba5
F www/crosscompile.tcl c99efacb3aefaa550c6e80d91b240f55eb9fd33e F www/crosscompile.tcl c99efacb3aefaa550c6e80d91b240f55eb9fd33e
F www/dynload.tcl 02eb8273aa78cfa9070dd4501dca937fb22b466c F www/dynload.tcl 02eb8273aa78cfa9070dd4501dca937fb22b466c
F www/fileformat.tcl cfb7fba80b7275555281ba2f256c00734bcdd1c9 F www/fileformat.tcl cfb7fba80b7275555281ba2f256c00734bcdd1c9
F www/index.tcl e6a1fb2adfa9a881d7bee0c86c2959d1a872e7bb F www/index.tcl 2deb0b26970999691ed98c2e1a0bb180da8e74b8
F www/lang.tcl 7fec414487ebee2cbb17c90addf5a026cd10396a F www/lang.tcl 7fec414487ebee2cbb17c90addf5a026cd10396a
F www/mingw.tcl fc5f4ba9d336b6e8c97347cc6496d6162461ef60 F www/mingw.tcl fc5f4ba9d336b6e8c97347cc6496d6162461ef60
F www/opcode.tcl cb3a1abf8b7b9be9f3a228d097d6bf8b742c2b6f F www/opcode.tcl cb3a1abf8b7b9be9f3a228d097d6bf8b742c2b6f
F www/sqlite.tcl cb0d23d8f061a80543928755ec7775da6e4f362f F www/sqlite.tcl cb0d23d8f061a80543928755ec7775da6e4f362f
F www/tclsqlite.tcl 06f81c401f79a04f2c5ebfb97e7c176225c0aef2 F www/tclsqlite.tcl 06f81c401f79a04f2c5ebfb97e7c176225c0aef2
F www/vdbe.tcl 0c8aaa529dd216ccbf7daaabd80985e413d5f9ad F www/vdbe.tcl 0c8aaa529dd216ccbf7daaabd80985e413d5f9ad
P 490d08a8c19d52ebb41999371e2664e29bcb1164 P 8b4c87e8cf08db8e8ace57dc8dc8d110d18f19ed
R 30ef2fcf4f63f23edf35b1bdea9bb9e1 R 80c18504638b99b08ae21db4afad8915
U drh U drh
Z c09be351e07d658e489bb28e9f15d0cc Z 27516acdd74264a621463b7fd9bffc1d

View File

@@ -1 +1 @@
8b4c87e8cf08db8e8ace57dc8dc8d110d18f19ed 8390f6521af0f1c5cd0298cc4a1dfa3f092c1e15

View File

@@ -26,7 +26,7 @@
** other files are for internal use by SQLite and should not be ** other files are for internal use by SQLite and should not be
** accessed by users of the library. ** accessed by users of the library.
** **
** $Id: main.c,v 1.25 2001/02/11 16:56:24 drh Exp $ ** $Id: main.c,v 1.26 2001/04/05 15:57:13 drh Exp $
*/ */
#include "sqliteInt.h" #include "sqliteInt.h"
#include <unistd.h> #include <unistd.h>
@@ -190,6 +190,16 @@ static int sqliteInit(sqlite *db, char **pzErrMsg){
*/ */
const char sqlite_version[] = SQLITE_VERSION; const char sqlite_version[] = SQLITE_VERSION;
/*
** Does the library expect data to be encoded as UTF-8 or iso8859? The
** following global constant always lets us know.
*/
#ifdef SQLITE_UTF8
char sqlite_encoding[] = "UTF-8";
#else
char sqlite_encoding[] = "iso8859";
#endif
/* /*
** Open a new SQLite database. Construct an "sqlite" structure to define ** Open a new SQLite database. Construct an "sqlite" structure to define
** the state of this database and return a pointer to that structure. ** the state of this database and return a pointer to that structure.

View File

@@ -24,7 +24,7 @@
** This header file defines the interface that the sqlite library ** This header file defines the interface that the sqlite library
** presents to client programs. ** presents to client programs.
** **
** @(#) $Id: sqlite.h.in,v 1.10 2001/04/03 16:53:22 drh Exp $ ** @(#) $Id: sqlite.h.in,v 1.11 2001/04/05 15:57:13 drh Exp $
*/ */
#ifndef _SQLITE_H_ #ifndef _SQLITE_H_
#define _SQLITE_H_ #define _SQLITE_H_
@@ -42,6 +42,21 @@
*/ */
extern const char sqlite_version[]; extern const char sqlite_version[];
/*
** The SQLITE_UTF8 macro is defined if the library expects to see
** UTF-8 encoded data. The SQLITE_ISO8859 macro is defined if the
** iso8859 encoded should be used.
*/
#define SQLITE_--ENCODING-- 1
/*
** The following constant holds one of two strings, "UTF-8" or "iso8859",
** depending on which character encoding the SQLite library expects to
** see. The character encoding makes a difference for the LIKE and GLOB
** operators and for the LENGTH() and SUBSTR() functions.
*/
extern char sqlite_encoding[];
/* /*
** Each open sqlite database is represented by an instance of the ** Each open sqlite database is represented by an instance of the
** following opaque structure. ** following opaque structure.

View File

@@ -23,7 +23,7 @@
************************************************************************* *************************************************************************
** A TCL Interface to SQLite ** A TCL Interface to SQLite
** **
** $Id: tclsqlite.c,v 1.14 2001/04/03 16:53:22 drh Exp $ ** $Id: tclsqlite.c,v 1.15 2001/04/05 15:57:13 drh Exp $
*/ */
#ifndef NO_TCL /* Omit this whole file if TCL is unavailable */ #ifndef NO_TCL /* Omit this whole file if TCL is unavailable */
@@ -56,6 +56,16 @@ struct CallbackData {
int tcl_rc; /* Return code from TCL script */ int tcl_rc; /* Return code from TCL script */
}; };
/*
** If TCL uses UTF-8 and SQLite is configured to use iso8859, then we
** have to do a translation when going between the two. Set the
** UTF_TRANSLATION_NEEDED macro to indicate that we need to do
** this translation.
*/
#if defined(TCL_UTF_MAX) && !defined(SQLITE_UTF8)
# define UTF_TRANSLATION_NEEDED 1
#endif
/* /*
** Called for each row of the result. ** Called for each row of the result.
*/ */
@@ -67,6 +77,9 @@ static int DbEvalCallback(
){ ){
CallbackData *cbData = (CallbackData*)clientData; CallbackData *cbData = (CallbackData*)clientData;
int i, rc; int i, rc;
#ifdef UTF_TRANSLATION_NEEDED
Tcl_DString dCol;
#endif
if( cbData->zArray[0] ){ if( cbData->zArray[0] ){
if( cbData->once ){ if( cbData->once ){
Tcl_SetVar2(cbData->interp, cbData->zArray, "*", "", 0); Tcl_SetVar2(cbData->interp, cbData->zArray, "*", "", 0);
@@ -78,13 +91,28 @@ static int DbEvalCallback(
for(i=0; i<nCol; i++){ for(i=0; i<nCol; i++){
char *z = azCol[i]; char *z = azCol[i];
if( z==0 ) z = ""; if( z==0 ) z = "";
#ifdef UTF_TRANSLATION_NEEDED
Tcl_DStringInit(&dCol);
Tcl_ExternalToUtfDString(NULL, z, -1, &dCol);
Tcl_SetVar2(cbData->interp, cbData->zArray, azN[i],
Tcl_DStringValue(&dCol), 0);
Tcl_DStringFree(&dCol);
#else
Tcl_SetVar2(cbData->interp, cbData->zArray, azN[i], z, 0); Tcl_SetVar2(cbData->interp, cbData->zArray, azN[i], z, 0);
#endif
} }
}else{ }else{
for(i=0; i<nCol; i++){ for(i=0; i<nCol; i++){
char *z = azCol[i]; char *z = azCol[i];
if( z==0 ) z = ""; if( z==0 ) z = "";
#ifdef UTF_TRANSLATION_NEEDED
Tcl_DStringInit(&dCol);
Tcl_ExternalToUtfDString(NULL, z, -1, &dCol);
Tcl_SetVar(cbData->interp, azN[i], Tcl_DStringValue(&dCol), 0);
Tcl_DStringFree(&dCol);
#else
Tcl_SetVar(cbData->interp, azN[i], z, 0); Tcl_SetVar(cbData->interp, azN[i], z, 0);
#endif
} }
} }
cbData->once = 0; cbData->once = 0;
@@ -111,7 +139,15 @@ static int DbEvalCallback2(
for(i=0; i<nCol; i++){ for(i=0; i<nCol; i++){
Tcl_Obj *pElem; Tcl_Obj *pElem;
if( azCol[i] && *azCol[i] ){ if( azCol[i] && *azCol[i] ){
#ifdef UTF_TRANSLATION_NEEDED
Tcl_DString dCol;
Tcl_DStringInit(&dCol);
Tcl_ExternalToUtfDString(NULL, azCol[i], -1, &dCol);
pElem = Tcl_NewStringObj(Tcl_DStringValue(&dCol), -1);
Tcl_DStringFree(&dCol);
#else
pElem = Tcl_NewStringObj(azCol[i], -1); pElem = Tcl_NewStringObj(azCol[i], -1);
#endif
}else{ }else{
pElem = Tcl_NewObj(); pElem = Tcl_NewObj();
} }
@@ -268,6 +304,9 @@ static int DbObjCmd(void *cd, Tcl_Interp *interp, int objc,Tcl_Obj *const*objv){
char *zErrMsg; char *zErrMsg;
char *zSql; char *zSql;
int rc; int rc;
#ifdef UTF_TRANSLATION_NEEDED
Tcl_DString dSql;
#endif
if( objc!=5 && objc!=3 ){ if( objc!=5 && objc!=3 ){
Tcl_WrongNumArgs(interp, 2, objv, "SQL ?ARRAY-NAME CODE?"); Tcl_WrongNumArgs(interp, 2, objv, "SQL ?ARRAY-NAME CODE?");
@@ -275,6 +314,11 @@ static int DbObjCmd(void *cd, Tcl_Interp *interp, int objc,Tcl_Obj *const*objv){
} }
pDb->interp = interp; pDb->interp = interp;
zSql = Tcl_GetStringFromObj(objv[2], 0); zSql = Tcl_GetStringFromObj(objv[2], 0);
#ifdef UTF_TRANSLATION_NEEDED
Tcl_DStringInit(&dSql);
Tcl_UtfToExternalDString(NULL, zSql, -1, &dSql);
zSql = Tcl_DStringValue(&dSql);
#endif
Tcl_IncrRefCount(objv[2]); Tcl_IncrRefCount(objv[2]);
if( objc==5 ){ if( objc==5 ){
cbData.interp = interp; cbData.interp = interp;
@@ -303,6 +347,9 @@ static int DbObjCmd(void *cd, Tcl_Interp *interp, int objc,Tcl_Obj *const*objv){
rc = cbData.tcl_rc; rc = cbData.tcl_rc;
} }
Tcl_DecrRefCount(objv[2]); Tcl_DecrRefCount(objv[2]);
#ifdef UTF_TRANSLATION_NEEDED
Tcl_DStringFree(&dSql);
#endif
return rc; return rc;
} }
@@ -382,6 +429,7 @@ static int DbMain(void *cd, Tcl_Interp *interp, int argc, char **argv){
*/ */
int Sqlite_Init(Tcl_Interp *interp){ int Sqlite_Init(Tcl_Interp *interp){
Tcl_CreateCommand(interp, "sqlite", DbMain, 0, 0); Tcl_CreateCommand(interp, "sqlite", DbMain, 0, 0);
Tcl_SetVar(interp,"sqlite_encoding",sqlite_encoding,TCL_GLOBAL_ONLY);
Tcl_PkgProvide(interp, "sqlite", "1.0"); Tcl_PkgProvide(interp, "sqlite", "1.0");
return TCL_OK; return TCL_OK;
} }
@@ -430,6 +478,7 @@ static char zMainloop[] =
#define TCLSH_MAIN main /* Needed to fake out mktclapp */ #define TCLSH_MAIN main /* Needed to fake out mktclapp */
int TCLSH_MAIN(int argc, char **argv){ int TCLSH_MAIN(int argc, char **argv){
Tcl_Interp *interp; Tcl_Interp *interp;
Tcl_FindExecutable(argv[0]);
interp = Tcl_CreateInterp(); interp = Tcl_CreateInterp();
Sqlite_Init(interp); Sqlite_Init(interp);
if( argc>=2 ){ if( argc>=2 ){

View File

@@ -26,7 +26,7 @@
** This file contains functions for allocating memory, comparing ** This file contains functions for allocating memory, comparing
** strings, and stuff like that. ** strings, and stuff like that.
** **
** $Id: util.c,v 1.19 2001/04/04 21:10:19 drh Exp $ ** $Id: util.c,v 1.20 2001/04/05 15:57:13 drh Exp $
*/ */
#include "sqliteInt.h" #include "sqliteInt.h"
#include <stdarg.h> #include <stdarg.h>
@@ -725,91 +725,60 @@ int sqliteSortCompare(const char *a, const char *b){
return res; return res;
} }
#ifdef SQLITE_UTF8
/* /*
** When the first byte of a UTF-8 character is used as the ** X is a pointer to the first byte of a UTF-8 character. Increment
** index of the following array, then the value is the number ** X so that it points to the next character. This only works right
** of bytes in the whole UTF-8 character. This matrix assumes ** if X points to a well-formed UTF-8 string.
** a well-formed UTF-8 string. All bets are off if the input
** is not well-formed.
*/ */
static const unsigned char utf8_width[] = { #define sqliteNextChar(X) while( (0xc0&*++(X))==0x80 ){}
/* x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF */ #define sqliteCharVal(X) sqlite_utf8_to_int(X)
/* 0x */ 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
/* 1x */ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
/* 2x */ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
/* 3x */ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
/* 4x */ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
/* 5x */ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
/* 6x */ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
/* 7x */ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
/* 8x */ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
/* 9x */ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
/* Ax */ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
/* Bx */ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
/* Cx */ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
/* Dx */ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
/* Ex */ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
/* Fx */ 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 1, 1,
};
#else /* !defined(SQLITE_UTF8) */
/* /*
** This routine computes the number of bytes to the start of the ** For iso8859 encoding, the next character is just the next byte.
** next UTF-8 character. We could just do
**
** z += utf8_width[*z]
**
** accomplish the same thing, if we know that z was a well-formed
** UTF-8 string. If it is not, then z might be incremented past
** its null terminator. This function, though slower, will never
** increment z past its terminator.
*/ */
static int utf8_char_size(const unsigned char *z){ #define sqliteNextChar(X) (++(X));
int i, n = utf8_width[*z]; #define sqliteCharVal(X) ((int)*(X))
for(i=1; i<n && z[i]!=0; i++){}
return i;
}
#endif /* defined(SQLITE_UTF8) */
#ifdef SQLITE_UTF8
/* /*
** Convert the UTF-8 character pointed to by the input parameter ** Convert the UTF-8 character to which z points into a 31-bit
** into a 31-bit UCS character and return an integer holding the ** UCS character. This only works right if z points to a well-formed
** 31-bit UCS character. ** UTF-8 string.
*/ */
static int utf8_to_int(const unsigned char *z){ static int sqlite_utf8_to_int(const unsigned char *z){
int n = utf8_width[*z];
int c; int c;
switch( n ){ static const int initVal[] = {
case 0: { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
return 0; 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29,
} 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44,
case 1: { 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59,
return *z; 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74,
} 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89,
case 2: { 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104,
c = 0x1f & *(z++); 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119,
break; 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134,
} 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149,
case 3: { 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164,
c = 0x0f & *(z++); 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179,
break; 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 0, 1, 2,
} 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17,
case 4: { 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 0,
c = 0x07 & *(z++); 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
break; 0, 1, 2, 3, 4, 5, 6, 7, 0, 1, 2, 3, 0, 1, 254,
} 255,
case 5: { };
c = 0x03 & *(z++); c = initVal[*(z++)];
break; while( (0xc0&*z)==0x80 ){
}
case 6: {
c = 0x01 & *(z++);
break;
}
}
while( (--n) > 0 ){
c = (c<<6) | (0x3f&*(z++)); c = (c<<6) | (0x3f&*(z++));
} }
return c; return c;
} }
#endif
/* /*
** Compare two UTF-8 strings for equality where the first string can ** Compare two UTF-8 strings for equality where the first string can
@@ -852,7 +821,7 @@ sqliteGlobCompare(const unsigned char *zPattern, const unsigned char *zString){
while( (c=zPattern[1]) == '*' || c == '?' ){ while( (c=zPattern[1]) == '*' || c == '?' ){
if( c=='?' ){ if( c=='?' ){
if( *zString==0 ) return 0; if( *zString==0 ) return 0;
zString += utf8_char_size(zString); sqliteNextChar(zString);
} }
zPattern++; zPattern++;
} }
@@ -860,7 +829,7 @@ sqliteGlobCompare(const unsigned char *zPattern, const unsigned char *zString){
c = UpperToLower[c]; c = UpperToLower[c];
if( c=='[' ){ if( c=='[' ){
while( *zString && sqliteGlobCompare(&zPattern[1],zString)==0 ){ while( *zString && sqliteGlobCompare(&zPattern[1],zString)==0 ){
zString += utf8_char_size(zString); sqliteNextChar(zString);
} }
return *zString!=0; return *zString!=0;
}else{ }else{
@@ -868,13 +837,13 @@ sqliteGlobCompare(const unsigned char *zPattern, const unsigned char *zString){
while( c2 != 0 && c2 != c ){ c2 = *++zString; } while( c2 != 0 && c2 != c ){ c2 = *++zString; }
if( c2==0 ) return 0; if( c2==0 ) return 0;
if( sqliteGlobCompare(&zPattern[1],zString) ) return 1; if( sqliteGlobCompare(&zPattern[1],zString) ) return 1;
zString += utf8_char_size(zString); sqliteNextChar(zString);
} }
return 0; return 0;
} }
case '?': { case '?': {
if( *zString==0 ) return 0; if( *zString==0 ) return 0;
zString += utf8_char_size(zString); sqliteNextChar(zString);
zPattern++; zPattern++;
break; break;
} }
@@ -882,7 +851,7 @@ sqliteGlobCompare(const unsigned char *zPattern, const unsigned char *zString){
int prior_c = 0; int prior_c = 0;
seen = 0; seen = 0;
invert = 0; invert = 0;
c = utf8_to_int(zString); c = sqliteCharVal(zString);
if( c==0 ) return 0; if( c==0 ) return 0;
c2 = *++zPattern; c2 = *++zPattern;
if( c2=='^' ){ invert = 1; c2 = *++zPattern; } if( c2=='^' ){ invert = 1; c2 = *++zPattern; }
@@ -890,10 +859,10 @@ sqliteGlobCompare(const unsigned char *zPattern, const unsigned char *zString){
if( c==']' ) seen = 1; if( c==']' ) seen = 1;
c2 = *++zPattern; c2 = *++zPattern;
} }
while( (c2 = utf8_to_int(zPattern))!=0 && c2!=']' ){ while( (c2 = sqliteCharVal(zPattern))!=0 && c2!=']' ){
if( c2=='-' && zPattern[1]!=']' && zPattern[1]!=0 && prior_c>0 ){ if( c2=='-' && zPattern[1]!=']' && zPattern[1]!=0 && prior_c>0 ){
zPattern++; zPattern++;
c2 = utf8_to_int(zPattern); c2 = sqliteCharVal(zPattern);
if( c>=prior_c && c<=c2 ) seen = 1; if( c>=prior_c && c<=c2 ) seen = 1;
prior_c = 0; prior_c = 0;
}else if( c==c2 ){ }else if( c==c2 ){
@@ -902,10 +871,10 @@ sqliteGlobCompare(const unsigned char *zPattern, const unsigned char *zString){
}else{ }else{
prior_c = c2; prior_c = c2;
} }
zPattern += utf8_char_size(zPattern); sqliteNextChar(zPattern);
} }
if( c2==0 || (seen ^ invert)==0 ) return 0; if( c2==0 || (seen ^ invert)==0 ) return 0;
zString += utf8_char_size(zString); sqliteNextChar(zString);
zPattern++; zPattern++;
break; break;
} }
@@ -940,7 +909,7 @@ sqliteLikeCompare(const unsigned char *zPattern, const unsigned char *zString){
while( (c=zPattern[1]) == '%' || c == '_' ){ while( (c=zPattern[1]) == '%' || c == '_' ){
if( c=='_' ){ if( c=='_' ){
if( *zString==0 ) return 0; if( *zString==0 ) return 0;
zString += utf8_char_size(zString); sqliteNextChar(zString);
} }
zPattern++; zPattern++;
} }
@@ -950,13 +919,13 @@ sqliteLikeCompare(const unsigned char *zPattern, const unsigned char *zString){
while( c2 != 0 && c2 != c ){ c2 = UpperToLower[*++zString]; } while( c2 != 0 && c2 != c ){ c2 = UpperToLower[*++zString]; }
if( c2==0 ) return 0; if( c2==0 ) return 0;
if( sqliteLikeCompare(&zPattern[1],zString) ) return 1; if( sqliteLikeCompare(&zPattern[1],zString) ) return 1;
zString += utf8_char_size(zString); sqliteNextChar(zString);
} }
return 0; return 0;
} }
case '_': { case '_': {
if( *zString==0 ) return 0; if( *zString==0 ) return 0;
zString += utf8_char_size(zString); sqliteNextChar(zString);
zPattern++; zPattern++;
break; break;
} }

View File

@@ -41,7 +41,7 @@
** But other routines are also provided to help in building up ** But other routines are also provided to help in building up
** a program instruction by instruction. ** a program instruction by instruction.
** **
** $Id: vdbe.c,v 1.55 2001/04/04 21:22:14 drh Exp $ ** $Id: vdbe.c,v 1.56 2001/04/05 15:57:13 drh Exp $
*/ */
#include "sqliteInt.h" #include "sqliteInt.h"
#include <unistd.h> #include <unistd.h>
@@ -3284,7 +3284,7 @@ int sqliteVdbeExec(
break; break;
} }
/* Opcode: Length * * * /* Opcode: Strlen * * *
** **
** Interpret the top of the stack as a string. Replace the top of ** Interpret the top of the stack as a string. Replace the top of
** stack with an integer which is the length of the string. ** stack with an integer which is the length of the string.
@@ -3294,7 +3294,14 @@ int sqliteVdbeExec(
int len; int len;
VERIFY( if( tos<0 ) goto not_enough_stack; ) VERIFY( if( tos<0 ) goto not_enough_stack; )
Stringify(p, tos); Stringify(p, tos);
#ifdef SQLITE_UTF8
{
char *z = zStack[tos];
for(len=0; *z; z++){ if( (0xc0&*z)!=0x80 ) len++; }
}
#else
len = aStack[tos].n-1; len = aStack[tos].n-1;
#endif
POPSTACK; POPSTACK;
p->tos++; p->tos++;
aStack[tos].i = len; aStack[tos].i = len;
@@ -3345,7 +3352,18 @@ int sqliteVdbeExec(
} }
VERIFY( if( p->tos<0 ) goto not_enough_stack; ) VERIFY( if( p->tos<0 ) goto not_enough_stack; )
Stringify(p, p->tos); Stringify(p, p->tos);
/* "n" will be the number of characters in the input string.
** For iso8859, the number of characters is the number of bytes.
** Buf for UTF-8, some characters can use multiple bytes and the
** situation is more complex.
*/
#ifdef SQLITE_UTF8
z = zStack[p->tos];
for(n=0; *z; z++){ if( (0xc0&*z)!=0x80 ) n++; }
#else
n = aStack[p->tos].n - 1; n = aStack[p->tos].n - 1;
#endif
if( start<0 ){ if( start<0 ){
start += n + 1; start += n + 1;
if( start<0 ){ if( start<0 ){
@@ -3360,6 +3378,27 @@ int sqliteVdbeExec(
if( cnt > n ){ if( cnt > n ){
cnt = n; cnt = n;
} }
/* At this point, "start" is the index of the first character to
** extract and "cnt" is the number of characters to extract. We
** need to convert units on these variable from characters into
** bytes. For iso8859, the conversion is a no-op, but for UTF-8
** we have to do a little work.
*/
#ifdef SQLITE_UTF8
{
int c_start = start;
int c_cnt = cnt;
int i;
z = zStack[p->tos];
for(start=i=0; i<c_start; i++){
while( (0xc0&z[++start])==0x80 ){}
}
for(cnt=i=0; i<c_cnt; i++){
while( (0xc0&z[(++cnt)+start])==0x80 ){}
}
}
#endif
z = sqliteMalloc( cnt+1 ); z = sqliteMalloc( cnt+1 );
if( z==0 ) goto no_mem; if( z==0 ) goto no_mem;
strncpy(z, &zStack[p->tos][start], cnt); strncpy(z, &zStack[p->tos][start], cnt);

View File

@@ -23,7 +23,7 @@
# This file implements regression tests for SQLite library. The # This file implements regression tests for SQLite library. The
# focus of this file is testing expressions. # focus of this file is testing expressions.
# #
# $Id: expr.test,v 1.11 2001/04/04 21:10:19 drh Exp $ # $Id: expr.test,v 1.12 2001/04/05 15:57:14 drh Exp $
set testdir [file dirname $argv0] set testdir [file dirname $argv0]
source $testdir/tester.tcl source $testdir/tester.tcl
@@ -160,8 +160,9 @@ test_expr expr-5.11 {t1='abc', t2='xyz'} {t1 NOT LIKE t2} 1
test_expr expr-5.12 {t1='abc', t2='ABC'} {t1 NOT LIKE t2} 0 test_expr expr-5.12 {t1='abc', t2='ABC'} {t1 NOT LIKE t2} 0
# The following tests only work on versions of TCL that support # The following tests only work on versions of TCL that support
# Unicode. # Unicode and SQLite configured for UTF-8 support.
# #
if {"\u1234"!="u1234" && $::sqlite_encoding=="UTF-8"} {
test_expr expr-5.13 "t1='a\u0080c', t2='A_C'" {t1 LIKE t2} 1 test_expr expr-5.13 "t1='a\u0080c', t2='A_C'" {t1 LIKE t2} 1
test_expr expr-5.14 "t1='a\u07FFc', t2='A_C'" {t1 LIKE t2} 1 test_expr expr-5.14 "t1='a\u07FFc', t2='A_C'" {t1 LIKE t2} 1
test_expr expr-5.15 "t1='a\u0800c', t2='A_C'" {t1 LIKE t2} 1 test_expr expr-5.15 "t1='a\u0800c', t2='A_C'" {t1 LIKE t2} 1
@@ -174,6 +175,17 @@ test_expr expr-5.21 "t1='ax\uABCD', t2='A_\uABCD'" {t1 LIKE t2} 1
test_expr expr-5.22 "t1='ax\u1234', t2='A%\u1234'" {t1 LIKE t2} 1 test_expr expr-5.22 "t1='ax\u1234', t2='A%\u1234'" {t1 LIKE t2} 1
test_expr expr-5.23 "t1='ax\uFEDC', t2='A_%'" {t1 LIKE t2} 1 test_expr expr-5.23 "t1='ax\uFEDC', t2='A_%'" {t1 LIKE t2} 1
test_expr expr-5.24 "t1='ax\uFEDCy\uFEDC', t2='A%\uFEDC'" {t1 LIKE t2} 1 test_expr expr-5.24 "t1='ax\uFEDCy\uFEDC', t2='A%\uFEDC'" {t1 LIKE t2} 1
}
# Theses tests are for when SQLite assumes iso8859 characters.
#
if {$::sqlite_encoding=="iso8859"} {
catch {encoding system iso8859-1}
test_expr expr-5.50 "t1='a\266c', t2='A_C'" {t1 LIKE t2} 1
test_expr expr-5.51 "t1='a\347', t2='A_'" {t1 LIKE t2} 1
test_expr expr-5.52 "t1='ax\351', t2='A_\351'" {t1 LIKE t2} 1
test_expr expr-5.53 "t1='ax\241', t2='A_%'" {t1 LIKE t2} 1
}
test_expr expr-6.1 {t1='abc', t2='xyz'} {t1 GLOB t2} 0 test_expr expr-6.1 {t1='abc', t2='xyz'} {t1 GLOB t2} 0
test_expr expr-6.2 {t1='abc', t2='ABC'} {t1 GLOB t2} 0 test_expr expr-6.2 {t1='abc', t2='ABC'} {t1 GLOB t2} 0
@@ -203,6 +215,7 @@ test_expr expr-6.25 {t1='ac', t2='a*?c'} {t1 GLOB t2} 0
# These tests only work on versions of TCL that support Unicode # These tests only work on versions of TCL that support Unicode
# #
if {"\u1234"!="u1234" && $::sqlite_encoding=="UTF-8"} {
test_expr expr-6.26 "t1='a\u0080c', t2='a?c'" {t1 GLOB t2} 1 test_expr expr-6.26 "t1='a\u0080c', t2='a?c'" {t1 GLOB t2} 1
test_expr expr-6.27 "t1='a\u07ffc', t2='a?c'" {t1 GLOB t2} 1 test_expr expr-6.27 "t1='a\u07ffc', t2='a?c'" {t1 GLOB t2} 1
test_expr expr-6.28 "t1='a\u0800c', t2='a?c'" {t1 GLOB t2} 1 test_expr expr-6.28 "t1='a\u0800c', t2='a?c'" {t1 GLOB t2} 1
@@ -219,7 +232,26 @@ test_expr expr-6.38 "t1='a\u1234b', t2='a\[\u1235-\u124f\]b'" {t1 GLOB t2} 0
test_expr expr-6.39 "t1='a\u1234b', t2='a\[a-\u1235\]b'" {t1 GLOB t2} 1 test_expr expr-6.39 "t1='a\u1234b', t2='a\[a-\u1235\]b'" {t1 GLOB t2} 1
test_expr expr-6.40 "t1='a\u1234b', t2='a\[a-\u1234\]b'" {t1 GLOB t2} 1 test_expr expr-6.40 "t1='a\u1234b', t2='a\[a-\u1234\]b'" {t1 GLOB t2} 1
test_expr expr-6.41 "t1='a\u1234b', t2='a\[a-\u1233\]b'" {t1 GLOB t2} 0 test_expr expr-6.41 "t1='a\u1234b', t2='a\[a-\u1233\]b'" {t1 GLOB t2} 0
}
# Theses tests are for when SQLite assumes iso8859 characters.
#
if {$::sqlite_encoding=="iso8859"} {
catch {encoding system iso8859-1}
test_expr expr-6.50 "t1='a\266c', t2='a?c'" {t1 GLOB t2} 1
test_expr expr-6.51 "t1='a\266', t2='a?'" {t1 GLOB t2} 1
test_expr expr-6.52 "t1='a\266', t2='a??'" {t1 GLOB t2} 0
test_expr expr-6.53 "t1='ax\266', t2='a??'" {t1 GLOB t2} 1
test_expr expr-6.54 "t1='ax\266', t2='a?\266'" {t1 GLOB t2} 1
test_expr expr-6.55 "t1='ax\266y\266', t2='a*\266'" {t1 GLOB t2} 1
test_expr expr-6.56 "t1='a\266b', t2='a\[x\266y\]b'" {t1 GLOB t2} 1
test_expr expr-6.57 "t1='a\266b', t2='a\[\260-\270\]b'" {t1 GLOB t2} 1
test_expr expr-6.58 "t1='a\266b', t2='a\[\266-\270\]b'" {t1 GLOB t2} 1
test_expr expr-6.59 "t1='a\266b', t2='a\[\267-\270\]b'" {t1 GLOB t2} 0
test_expr expr-6.60 "t1='a\266b', t2='a\[x-\267\]b'" {t1 GLOB t2} 1
test_expr expr-6.61 "t1='a\266b', t2='a\[x-\266\]b'" {t1 GLOB t2} 1
test_expr expr-6.62 "t1='a\266b', t2='a\[x-\265\]b'" {t1 GLOB t2} 0
}
# The sqliteExprIfFalse and sqliteExprIfTrue routines are only # The sqliteExprIfFalse and sqliteExprIfTrue routines are only
# executed as part of a WHERE clause. Create a table suitable # executed as part of a WHERE clause. Create a table suitable

View File

@@ -23,21 +23,18 @@
# This file implements regression tests for SQLite library. The # This file implements regression tests for SQLite library. The
# focus of this file is testing built-in functions. # focus of this file is testing built-in functions.
# #
# $Id: func.test,v 1.1 2000/08/28 16:22:00 drh Exp $ # $Id: func.test,v 1.2 2001/04/05 15:57:14 drh Exp $
set testdir [file dirname $argv0] set testdir [file dirname $argv0]
source $testdir/tester.tcl source $testdir/tester.tcl
# Create a table to work with. # Create a table to work with.
# #
do_test func-0.0 {
execsql {CREATE TABLE tbl1(t1 text)} execsql {CREATE TABLE tbl1(t1 text)}
foreach word {this program is free software} { foreach word {this program is free software} {
execsql "INSERT INTO tbl1 VALUES('$word')" execsql "INSERT INTO tbl1 VALUES('$word')"
} }
# Make sure the table was created properly.
#
do_test func-0.0 {
execsql {SELECT t1 FROM tbl1 ORDER BY t1} execsql {SELECT t1 FROM tbl1 ORDER BY t1}
} {free is program software this} } {free is program software this}
@@ -89,4 +86,51 @@ do_test func-2.8 {
execsql {SELECT t1 FROM tbl1 ORDER BY substr(t1,2,20)} execsql {SELECT t1 FROM tbl1 ORDER BY substr(t1,2,20)}
} {this software free program is} } {this software free program is}
# Only do the following tests if TCL has UTF-8 capabilities and
# the UTF-8 encoding is turned on in the SQLite library.
#
if {$::sqlite_encoding=="UTF-8" && "\u1234"!="u1234"} {
# Put some UTF-8 characters in the database
#
do_test func-3.0 {
execsql {DELETE FROM tbl1}
foreach word "contains UTF-8 characters hi\u1234ho" {
execsql "INSERT INTO tbl1 VALUES('$word')"
}
execsql {SELECT t1 FROM tbl1 ORDER BY t1}
} "characters contains hi\u1234ho UTF-8"
do_test func-3.1 {
execsql {SELECT length(t1) FROM tbl1 ORDER BY t1}
} {10 8 5 5}
do_test func-3.2 {
execsql {SELECT substr(t1,1,2) FROM tbl1 ORDER BY t1}
} {ch co hi UT}
do_test func-3.3 {
execsql {SELECT substr(t1,1,3) FROM tbl1 ORDER BY t1}
} "cha con hi\u1234 UTF"
do_test func-3.4 {
execsql {SELECT substr(t1,2,2) FROM tbl1 ORDER BY t1}
} "ha on i\u1234 TF"
do_test func-3.5 {
execsql {SELECT substr(t1,2,3) FROM tbl1 ORDER BY t1}
} "har ont i\u1234h TF-"
do_test func-3.6 {
execsql {SELECT substr(t1,3,2) FROM tbl1 ORDER BY t1}
} "ar nt \u1234h F-"
do_test func-3.7 {
execsql {SELECT substr(t1,4,2) FROM tbl1 ORDER BY t1}
} "ra ta ho -8"
do_test func-3.8 {
execsql {SELECT substr(t1,-1,1) FROM tbl1 ORDER BY t1}
} "s s o 8"
do_test func-3.9 {
execsql {SELECT substr(t1,-3,2) FROM tbl1 ORDER BY t1}
} "er in \u1234h F-"
do_test func-3.10 {
execsql {SELECT substr(t1,-4,3) FROM tbl1 ORDER BY t1}
} "ter ain i\u1234h TF-"
} ;# End sqlite_encoding==UTF-8 and \u1234!=u1234
finish_test finish_test

View File

@@ -19,9 +19,10 @@ proc chng {date desc} {
chng {2001 Apr 5 (1.0.29)} { chng {2001 Apr 5 (1.0.29)} {
<li>The LIKE and GLOB operators now assume both operands are <li>The LIKE and GLOB operators now assume both operands are
UTF-8 strings. UTF-8 strings if the library is configured with the "--enable-utf8"
<font color="red">** This change could potentially option. If not configured for UTF-8 but using a version of TCL
break existing code **</font></li> that supports UTF-8, then a conversion from UTF-8 to iso8859 and
back again is done inside the TCL interface.</li>
} }
chng {2001 Apr 4 (1.0.28)} { chng {2001 Apr 4 (1.0.28)} {

View File

@@ -1,7 +1,7 @@
# #
# Run this TCL script to generate HTML for the index.html file. # Run this TCL script to generate HTML for the index.html file.
# #
set rcsid {$Id: index.tcl,v 1.34 2001/04/04 21:10:19 drh Exp $} set rcsid {$Id: index.tcl,v 1.35 2001/04/05 15:57:14 drh Exp $}
puts {<html> puts {<html>
<head><title>SQLite: An SQL Database Library Built Atop GDBM</title></head> <head><title>SQLite: An SQL Database Library Built Atop GDBM</title></head>
@@ -62,13 +62,6 @@ all code except for a few areas which are unreachable or which are
only reached when <tt>malloc()</tt> fails. The code has been tested only reached when <tt>malloc()</tt> fails. The code has been tested
for memory leaks and is found to be clean.</p> for memory leaks and is found to be clean.</p>
<p><b>Important Note:</b> Beginning with version 1.0.29, the LIKE and
GLOB operators assume both operands are UTF-8 strings. Prior to that,
both operators assumed plain ASCII strings. Users of earlier versions
of SQLite that invoke LIKE or GLOB to compare strings containing
characters greater than 127 may have problems when they upgrade to
version 1.0.29 or later.</p>
<p><b>Important Note:</b> Serious bugs have been found in versions <p><b>Important Note:</b> Serious bugs have been found in versions
1.0.22 on Unix and 1.0.26 on Windows. Users of these or earlier 1.0.22 on Unix and 1.0.26 on Windows. Users of these or earlier
versions of SQLite should upgrade.</p> versions of SQLite should upgrade.</p>