[DebianGIS-dev] r540 - in packages/gdal-grass/trunk: . debian

Francesco Lovergine frankie at costa.debian.org
Wed Aug 23 16:55:52 UTC 2006


Author: frankie
Date: 2006-08-23 16:55:51 +0000 (Wed, 23 Aug 2006)
New Revision: 540

Added:
   packages/gdal-grass/trunk/Makefile.in
   packages/gdal-grass/trunk/README
   packages/gdal-grass/trunk/aclocal.m4
   packages/gdal-grass/trunk/configure
   packages/gdal-grass/trunk/configure.in
   packages/gdal-grass/trunk/debian/
   packages/gdal-grass/trunk/debian/changelog
   packages/gdal-grass/trunk/debian/compat
   packages/gdal-grass/trunk/debian/control
   packages/gdal-grass/trunk/debian/copyright
   packages/gdal-grass/trunk/debian/dirs
   packages/gdal-grass/trunk/debian/rules
   packages/gdal-grass/trunk/grass57dataset.cpp
   packages/gdal-grass/trunk/ogrgrass.h
   packages/gdal-grass/trunk/ogrgrassdatasource.cpp
   packages/gdal-grass/trunk/ogrgrassdriver.cpp
   packages/gdal-grass/trunk/ogrgrasslayer.cpp
Log:
Adding current trunk (1.3.2)


Added: packages/gdal-grass/trunk/Makefile.in
===================================================================
--- packages/gdal-grass/trunk/Makefile.in	2006-08-23 16:55:12 UTC (rev 539)
+++ packages/gdal-grass/trunk/Makefile.in	2006-08-23 16:55:51 UTC (rev 540)
@@ -0,0 +1,49 @@
+                                                                                                                                                                                                                                                               
+CC	=	@CC@
+CXX	=	@CXX@
+LD	=	@CXX@
+
+CPPFLAGS = -DUSE_CPL -DGRASS_GISBASE=\"@GRASS_GISBASE@\" \
+	  @GDAL_INC@ @GRASS_INCLUDE@ @CPPFLAGS@ 
+CXXFLAGS = @CXX_WFLAGS@ @CXX_PIC@ 
+
+RANLIB		=	@RANLIB@
+SO_EXT		=	@SO_EXT@
+LD_SHARED	=	@LD_SHARED@
+
+LIBS	=	@LIBS@
+
+GRASSTABLES_DIR = @prefix@/share/gdal/grass
+
+AUTOLOAD_DIR	=	@AUTOLOAD_DIR@
+
+GLIBNAME =	gdal_GRASS.so
+OLIBNAME =	ogr_GRASS.so
+
+default:	$(GLIBNAME) $(OLIBNAME)
+
+install:	default
+	install -d $(AUTOLOAD_DIR)
+	cp $(GLIBNAME) $(AUTOLOAD_DIR)
+	cp $(OLIBNAME) $(AUTOLOAD_DIR)
+	test -d ${GRASSTABLES_DIR} || mkdir ${GRASSTABLES_DIR}
+	test -d ${GRASSTABLES_DIR}/etc || mkdir ${GRASSTABLES_DIR}/etc
+	cp @GRASS_GISBASE@/etc/ellipse.table ${GRASSTABLES_DIR}/etc
+	cp @GRASS_GISBASE@/etc/datum.table ${GRASSTABLES_DIR}/etc	
+
+clean:
+	rm -f $(OLIBNAME) $(GLIBNAME) *.o 
+
+distclean: clean
+	rm -fr Makefile config.status config.log autom*.cache
+
+
+$(GLIBNAME):	grass57dataset.o
+	$(LD_SHARED) grass57dataset.o $(LIBS) -o $(GLIBNAME)
+
+$(OLIBNAME):	ogrgrassdriver.o ogrgrassdatasource.o ogrgrasslayer.o 
+	$(LD_SHARED) ogrgrassdriver.o ogrgrassdatasource.o ogrgrasslayer.o $(LIBS) -o $(OLIBNAME)
+
+%.o:	%.cpp
+	$(CXX) $(CXXFLAGS) $(CPPFLAGS) -c -o $@ $<
+

Added: packages/gdal-grass/trunk/README
===================================================================
--- packages/gdal-grass/trunk/README	2006-08-23 16:55:12 UTC (rev 539)
+++ packages/gdal-grass/trunk/README	2006-08-23 16:55:51 UTC (rev 540)
@@ -0,0 +1,63 @@
+	Standalone GRASS 6 Drivers for GDAL and OGR
+	===========================================
+
+This package contains standalone drivers for GRASS raster and vector
+files that can be built after GDAL has been built and installed as an 
+"autoload" driver.  
+
+This is particularly useful in resolving problems with GRASS depending
+on GDAL, but GDAL with GRASS support depending on GRASS.  With this 
+package you can configure and install GDAL normally (--without-grass), then
+build and install GRASS normally and finally build and install this driver.
+
+To build this driver it is necessary for it to find GDAL and GRASS support
+files.  Typically the configure and build process would look something like:
+
+./configure --with-gdal=/usr/local/bin/gdal-config --with-grass=/usr/local/grass-6.0.0
+make
+sudo make install
+
+See also:
+
+  http://www.gdal.org/
+  http://grass.itc.it/
+
+
+---
+
+FAQs
+----
+
+
+Question:
+
+I am trying to install gdal-grass 1.3.1 on Red hat enterprise linux
+advanced server 3.0. I have previously installed gdal 1.3.1 without-
+grass, and Grass 6.0.1 with-gdal. I have tried to configure gdal-grass
+with:
+
+./configure --with-gdal=/usr/local/gdal/bin/gdal-config --with-
+grass=/usr/local/grass-6.0.1
+
+It seems to find gdal alright, but then balks at the Grass location. The
+Grass location specified above is indeed the correct location. I have
+also tried adding --with-grass=/usr/local/grass-6.0.1/lib, but with no
+success. My error is:
+
+...
+checking for G_asprintf in -lgrass_gis ... no
+configure: error: --with-grass=/usr/local/grass-6.0.1 requested, but
+libraries not found?
+
+
+Answer:
+
+Your problem is likely to be solved by editing /etc/ld.so.conf to 
+include the locations of proj, gdal, grass, and geos. Specifically, 
+the full path to both gdal-config and geos-config, and the full paths 
+to the library locations of proj (often /usr/local/lib) and grass (/
+usr/local/grass-6.0.1/lib). After editing ld.so.conf, run ldconfig, 
+and you should be good to go.
+
+I ran into this problem this weekend (and posted for help to this 
+list), so it seems to be a pretty common issue. 

Added: packages/gdal-grass/trunk/aclocal.m4
===================================================================
--- packages/gdal-grass/trunk/aclocal.m4	2006-08-23 16:55:12 UTC (rev 539)
+++ packages/gdal-grass/trunk/aclocal.m4	2006-08-23 16:55:51 UTC (rev 540)
@@ -0,0 +1,202 @@
+AC_DEFUN(AC_COMPILER_LOCALHACK,
+[
+  AC_MSG_CHECKING([if local/include already standard])
+
+  rm -f comp.out
+  echo 'int main() { int i = 1; if( *((unsigned char *) &i) == 0 ) printf( "BIGENDIAN"); return 0; }' >> conftest.c
+  ${CC} $CPPFLAGS $EXTRA_INCLUDES -o conftest conftest.c 2> comp.out
+  COMP_CHECK=`grep "system directory" comp.out | grep /usr/local/include`
+  if test -z "$COMP_CHECK" ; then 
+     AC_MSG_RESULT([no, everything is ok])
+  else
+     AC_MSG_RESULT([yes, stripping extras])
+     CXXFLAGS=`echo "$CXXFLAGS " | sed "s/-I\/usr\/local\/include //"`
+     CFLAGS=`echo "$CFLAGS " | sed "s/-I\/usr\/local\/include //"`
+     EXTRA_INCLUDES=`echo "$EXTRA_INCLUDES " | sed "s/-I\/usr\/local\/include //"`
+  fi 
+  rm -f comp.out
+])
+
+AC_DEFUN(AC_COMPILER_WFLAGS,
+[
+	# Remove -g from compile flags, we will add via CFG variable if
+	# we need it.
+	CXXFLAGS=`echo "$CXXFLAGS " | sed "s/-g //"`
+	CFLAGS=`echo "$CFLAGS " | sed "s/-g //"`
+
+	# check for GNU compiler, and use -Wall
+	if test "$GCC" = "yes"; then
+		C_WFLAGS="-Wall"
+		AC_DEFINE(USE_GNUCC, 1, [Define to 1, if you have GNU C
+		compiler])
+	fi
+	if test "$GXX" = "yes"; then
+		CXX_WFLAGS="-Wall"
+		AC_DEFINE(USE_GNUCC, 1, [Define to 1, if you have GNU C
+		compiler])
+	fi
+	AC_SUBST(CXX_WFLAGS,$CXX_WFLAGS)
+	AC_SUBST(C_WFLAGS,$C_WFLAGS)
+])
+
+AC_DEFUN(AC_COMPILER_PIC,
+[
+	echo 'void f(){}' > conftest.c
+	if test -z "`${CC-cc} -fPIC -c conftest.c 2>&1`"; then
+	  C_PIC=-fPIC
+	else
+	  C_PIC=
+	fi
+	if test -z "`${CXX-g++} -fPIC -c conftest.c 2>&1`"; then
+	  CXX_PIC=-fPIC
+	else
+	  CXX_PIC=
+	fi
+	rm -f conftest*
+
+	AC_SUBST(CXX_PIC,$CXX_PIC)
+	AC_SUBST(C_PIC,$C_PIC)
+])
+
+dnl
+dnl Try to find something to link shared libraries with.  Use "c++ -shared"
+dnl in preference to "ld -shared" because it will link in required c++
+dnl run time support for us. 
+dnl
+AC_DEFUN(AC_LD_SHARED,
+[
+  echo 'void g(); int main(){ g(); return 0; }' > conftest1.c
+
+  echo '#include <stdio.h>' > conftest2.c
+  echo 'void g(); void g(){printf("");}' >> conftest2.c
+  ${CC} ${C_PIC} -c conftest2.c
+
+  SO_EXT="so"
+  export SO_EXT
+  LD_SHARED="/bin/true"
+  if test ! -z "`uname -a | grep IRIX`" ; then
+    IRIX_ALL=-all
+  else
+    IRIX_ALL=
+  fi
+
+  AC_ARG_WITH(ld-shared,[  --with-ld-shared=cmd    provide shared library link],,)
+
+  if test "$with_ld_shared" != "" ; then
+    if test "$with_ld_shared" = "no" ; then
+      echo "user disabled shared library support."	
+    else
+      echo "using user supplied .so link command ... $with_ld_shared"	
+    fi
+    LD_SHARED="$with_ld_shared"
+  fi
+
+  dnl Check For Cygwin case.  Actually verify that the produced DLL works.
+
+  if test ! -z "`uname -a | grep CYGWIN`" \
+        -a "$LD_SHARED" = "/bin/true" \
+	-a -z "`gcc -shared conftest2.o -o libconftest.dll`" ; then
+    if test -z "`${CC} conftest1.c -L./ -lconftest -o conftest1 2>&1`"; then
+      LD_LIBRARY_PATH_OLD="$LD_LIBRARY_PATH"
+      if test -z "$LD_LIBRARY_PATH" ; then
+        LD_LIBRARY_PATH="`pwd`"
+      else
+        LD_LIBRARY_PATH="`pwd`:$LD_LIBRARY_PATH"
+      fi
+      export LD_LIBRARY_PATH
+      if test -z "`./conftest1 2>&1`" ; then
+        echo "checking for Cygwin gcc -shared ... yes"
+        LD_SHARED="c++ -shared"
+        SO_EXT="dll"
+      fi
+      LD_LIBRARY_PATH="$LD_LIBRARY_PATH_OLD"
+    fi
+  fi
+
+  dnl Test special MacOS (Darwin) case. 
+
+  if test ! -z "`uname | grep Darwin`" \
+          -a "$LD_SHARED" = "/bin/true" \
+          -a -z "`${CXX} -dynamiclib conftest2.o -o libconftest.so 2>&1`" ; then
+    ${CC} -c conftest1.c
+    if test -z "`${CXX} conftest1.o libconftest.so -o conftest1 2>&1`"; then
+      DYLD_LIBRARY_PATH_OLD="$DYLD_LIBRARY_PATH"
+      if test -z "$DYLD_LIBRARY_PATH" ; then
+        DYLD_LIBRARY_PATH="`pwd`"
+      else
+        DYLD_LIBRARY_PATH="`pwd`:$DYLD_LIBRARY_PATH"
+      fi
+      export DYLD_LIBRARY_PATH
+      if test -z "`./conftest1 2>&1`" ; then
+        echo "checking for ${CXX} -dynamiclib ... yes"
+        LD_SHARED="${CXX} -dynamiclib"
+	SO_EXT=dylib
+      fi
+      DYLD_LIBRARY_PATH="$DYLD_LIBRARY_PATH_OLD"
+    fi
+    rm -f conftest1.o
+  fi
+
+  if test "$LD_SHARED" = "/bin/true" \
+	-a -z "`${CXX} -shared $IRIX_ALL conftest2.o -o libconftest.so 2>&1|grep -v WARNING`" ; then
+    if test -z "`${CC} conftest1.c libconftest.so -o conftest1 2>&1`"; then
+      LD_LIBRARY_PATH_OLD="$LD_LIBRARY_PATH"
+      if test -z "$LD_LIBRARY_PATH" ; then
+        LD_LIBRARY_PATH="`pwd`"
+      else
+        LD_LIBRARY_PATH="`pwd`:$LD_LIBRARY_PATH"
+      fi
+      export LD_LIBRARY_PATH
+      if test -z "`./conftest1 2>&1`" ; then
+        echo "checking for ${CXX} -shared ... yes"
+        LD_SHARED="${CXX} -shared $IRIX_ALL"
+      else
+        echo "checking for ${CXX} -shared ... no(3)"
+      fi
+      LD_LIBRARY_PATH="$LD_LIBRARY_PATH_OLD"
+    else
+      echo "checking for ${CXX} -shared ... no(2)"
+    fi
+  else 
+    if test "$LD_SHARED" = "/bin/true" ; then
+      echo "checking for ${CXX} -shared ... no(1)"
+    fi
+  fi
+
+  if test "$LD_SHARED" = "/bin/true" \
+          -a -z "`ld -shared conftest2.o -o libconftest.so 2>&1`" ; then
+    if test -z "`${CC} conftest1.c libconftest.so -o conftest1 2>&1`"; then
+      LD_LIBRARY_PATH_OLD="$LD_LIBRARY_PATH"
+      if test -z "$LD_LIBRARY_PATH" ; then
+        LD_LIBRARY_PATH="`pwd`"
+      else
+        LD_LIBRARY_PATH="`pwd`:$LD_LIBRARY_PATH"
+      fi
+      export LD_LIBRARY_PATH
+      if test -z "`./conftest1 2>&1`" ; then
+        echo "checking for ld -shared ... yes"
+        LD_SHARED="ld -shared"
+      fi
+      LD_LIBRARY_PATH="$LD_LIBRARY_PATH_OLD"
+    fi
+  fi
+
+  if test "$LD_SHARED" = "/bin/true" ; then
+    echo "checking for ld -shared ... no"
+    if test ! -x /bin/true ; then
+      LD_SHARED=/usr/bin/true
+    fi
+  fi
+  if test "$LD_SHARED" = "no" ; then
+    if test -x /bin/true ; then
+      LD_SHARED=/bin/true
+    else
+      LD_SHARED=/usr/bin/true
+    fi
+  fi
+
+  rm -f conftest* libconftest* 
+
+  AC_SUBST(LD_SHARED,$LD_SHARED)
+  AC_SUBST(SO_EXT,$SO_EXT)
+])

Added: packages/gdal-grass/trunk/configure
===================================================================
--- packages/gdal-grass/trunk/configure	2006-08-23 16:55:12 UTC (rev 539)
+++ packages/gdal-grass/trunk/configure	2006-08-23 16:55:51 UTC (rev 540)
@@ -0,0 +1,3901 @@
+#! /bin/sh
+# Guess values for system-dependent variables and create Makefiles.
+# Generated by GNU Autoconf 2.59.
+#
+# Copyright (C) 2003 Free Software Foundation, Inc.
+# This configure script is free software; the Free Software Foundation
+# gives unlimited permission to copy, distribute and modify it.
+## --------------------- ##
+## M4sh Initialization.  ##
+## --------------------- ##
+
+# Be Bourne compatible
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+  emulate sh
+  NULLCMD=:
+  # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '${1+"$@"}'='"$@"'
+elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then
+  set -o posix
+fi
+DUALCASE=1; export DUALCASE # for MKS sh
+
+# Support unset when possible.
+if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
+  as_unset=unset
+else
+  as_unset=false
+fi
+
+
+# Work around bugs in pre-3.0 UWIN ksh.
+$as_unset ENV MAIL MAILPATH
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+for as_var in \
+  LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \
+  LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \
+  LC_TELEPHONE LC_TIME
+do
+  if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then
+    eval $as_var=C; export $as_var
+  else
+    $as_unset $as_var
+  fi
+done
+
+# Required to use basename.
+if expr a : '\(a\)' >/dev/null 2>&1; then
+  as_expr=expr
+else
+  as_expr=false
+fi
+
+if (basename /) >/dev/null 2>&1 && test "X`basename / 2>&1`" = "X/"; then
+  as_basename=basename
+else
+  as_basename=false
+fi
+
+
+# Name of the executable.
+as_me=`$as_basename "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+	 X"$0" : 'X\(//\)$' \| \
+	 X"$0" : 'X\(/\)$' \| \
+	 .     : '\(.\)' 2>/dev/null ||
+echo X/"$0" |
+    sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; }
+  	  /^X\/\(\/\/\)$/{ s//\1/; q; }
+  	  /^X\/\(\/\).*/{ s//\1/; q; }
+  	  s/.*/./; q'`
+
+
+# PATH needs CR, and LINENO needs CR and PATH.
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+  echo "#! /bin/sh" >conf$$.sh
+  echo  "exit 0"   >>conf$$.sh
+  chmod +x conf$$.sh
+  if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then
+    PATH_SEPARATOR=';'
+  else
+    PATH_SEPARATOR=:
+  fi
+  rm -f conf$$.sh
+fi
+
+
+  as_lineno_1=$LINENO
+  as_lineno_2=$LINENO
+  as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`
+  test "x$as_lineno_1" != "x$as_lineno_2" &&
+  test "x$as_lineno_3"  = "x$as_lineno_2"  || {
+  # Find who we are.  Look in the path if we contain no path at all
+  # relative or not.
+  case $0 in
+    *[\\/]* ) as_myself=$0 ;;
+    *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+done
+
+       ;;
+  esac
+  # We did not find ourselves, most probably we were run as `sh COMMAND'
+  # in which case we are not to be found in the path.
+  if test "x$as_myself" = x; then
+    as_myself=$0
+  fi
+  if test ! -f "$as_myself"; then
+    { echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2
+   { (exit 1); exit 1; }; }
+  fi
+  case $CONFIG_SHELL in
+  '')
+    as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for as_base in sh bash ksh sh5; do
+	 case $as_dir in
+	 /*)
+	   if ("$as_dir/$as_base" -c '
+  as_lineno_1=$LINENO
+  as_lineno_2=$LINENO
+  as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`
+  test "x$as_lineno_1" != "x$as_lineno_2" &&
+  test "x$as_lineno_3"  = "x$as_lineno_2" ') 2>/dev/null; then
+	     $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; }
+	     $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; }
+	     CONFIG_SHELL=$as_dir/$as_base
+	     export CONFIG_SHELL
+	     exec "$CONFIG_SHELL" "$0" ${1+"$@"}
+	   fi;;
+	 esac
+       done
+done
+;;
+  esac
+
+  # Create $as_me.lineno as a copy of $as_myself, but with $LINENO
+  # uniformly replaced by the line number.  The first 'sed' inserts a
+  # line-number line before each line; the second 'sed' does the real
+  # work.  The second script uses 'N' to pair each line-number line
+  # with the numbered line, and appends trailing '-' during
+  # substitution so that $LINENO is not a special case at line end.
+  # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the
+  # second 'sed' script.  Blame Lee E. McMahon for sed's syntax.  :-)
+  sed '=' <$as_myself |
+    sed '
+      N
+      s,$,-,
+      : loop
+      s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3,
+      t loop
+      s,-$,,
+      s,^['$as_cr_digits']*\n,,
+    ' >$as_me.lineno &&
+  chmod +x $as_me.lineno ||
+    { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2
+   { (exit 1); exit 1; }; }
+
+  # Don't try to exec as it changes $[0], causing all sort of problems
+  # (the dirname of $[0] is not the place where we might find the
+  # original and so on.  Autoconf is especially sensible to this).
+  . ./$as_me.lineno
+  # Exit status is that of the last command.
+  exit
+}
+
+
+case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in
+  *c*,-n*) ECHO_N= ECHO_C='
+' ECHO_T='	' ;;
+  *c*,*  ) ECHO_N=-n ECHO_C= ECHO_T= ;;
+  *)       ECHO_N= ECHO_C='\c' ECHO_T= ;;
+esac
+
+if expr a : '\(a\)' >/dev/null 2>&1; then
+  as_expr=expr
+else
+  as_expr=false
+fi
+
+rm -f conf$$ conf$$.exe conf$$.file
+echo >conf$$.file
+if ln -s conf$$.file conf$$ 2>/dev/null; then
+  # We could just check for DJGPP; but this test a) works b) is more generic
+  # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04).
+  if test -f conf$$.exe; then
+    # Don't use ln at all; we don't have any links
+    as_ln_s='cp -p'
+  else
+    as_ln_s='ln -s'
+  fi
+elif ln conf$$.file conf$$ 2>/dev/null; then
+  as_ln_s=ln
+else
+  as_ln_s='cp -p'
+fi
+rm -f conf$$ conf$$.exe conf$$.file
+
+if mkdir -p . 2>/dev/null; then
+  as_mkdir_p=:
+else
+  test -d ./-p && rmdir ./-p
+  as_mkdir_p=false
+fi
+
+as_executable_p="test -f"
+
+# 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'"
+
+
+# IFS
+# We need space, tab and new line, in precisely that order.
+as_nl='
+'
+IFS=" 	$as_nl"
+
+# CDPATH.
+$as_unset CDPATH
+
+
+# Name of the host.
+# hostname on some systems (SVR3.2, Linux) returns a bogus exit status,
+# so uname gets run too.
+ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q`
+
+exec 6>&1
+
+#
+# Initializations.
+#
+ac_default_prefix=/usr/local
+ac_config_libobj_dir=.
+cross_compiling=no
+subdirs=
+MFLAGS=
+MAKEFLAGS=
+SHELL=${CONFIG_SHELL-/bin/sh}
+
+# Maximum number of lines to put in a shell here document.
+# This variable seems obsolete.  It should probably be removed, and
+# only ac_max_sed_lines should be used.
+: ${ac_max_here_lines=38}
+
+# Identity of this package.
+PACKAGE_NAME=
+PACKAGE_TARNAME=
+PACKAGE_VERSION=
+PACKAGE_STRING=
+PACKAGE_BUGREPORT=
+
+ac_unique_file="Makefile.in"
+ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS CC CFLAGS LDFLAGS CPPFLAGS ac_ct_CC EXEEXT OBJEXT CXX CXXFLAGS ac_ct_CXX RANLIB ac_ct_RANLIB CXX_PIC C_PIC LD_SHARED SO_EXT CXX_WFLAGS C_WFLAGS GDAL_CONFIG GDAL_INC AUTOLOAD_DIR GRASS_INCLUDE GRASS_GISBASE LIBOBJS LTLIBOBJS'
+ac_subst_files=''
+
+# Initialize some variables set by options.
+ac_init_help=
+ac_init_version=false
+# The variables have the same names as the options, with
+# dashes changed to underlines.
+cache_file=/dev/null
+exec_prefix=NONE
+no_create=
+no_recursion=
+prefix=NONE
+program_prefix=NONE
+program_suffix=NONE
+program_transform_name=s,x,x,
+silent=
+site=
+srcdir=
+verbose=
+x_includes=NONE
+x_libraries=NONE
+
+# Installation directory options.
+# These are left unexpanded so users can "make install exec_prefix=/foo"
+# and all the variables that are supposed to be based on exec_prefix
+# by default will actually change.
+# Use braces instead of parens because sh, perl, etc. also accept them.
+bindir='${exec_prefix}/bin'
+sbindir='${exec_prefix}/sbin'
+libexecdir='${exec_prefix}/libexec'
+datadir='${prefix}/share'
+sysconfdir='${prefix}/etc'
+sharedstatedir='${prefix}/com'
+localstatedir='${prefix}/var'
+libdir='${exec_prefix}/lib'
+includedir='${prefix}/include'
+oldincludedir='/usr/include'
+infodir='${prefix}/info'
+mandir='${prefix}/man'
+
+ac_prev=
+for ac_option
+do
+  # If the previous option needs an argument, assign it.
+  if test -n "$ac_prev"; then
+    eval "$ac_prev=\$ac_option"
+    ac_prev=
+    continue
+  fi
+
+  ac_optarg=`expr "x$ac_option" : 'x[^=]*=\(.*\)'`
+
+  # Accept the important Cygnus configure options, so we can diagnose typos.
+
+  case $ac_option in
+
+  -bindir | --bindir | --bindi | --bind | --bin | --bi)
+    ac_prev=bindir ;;
+  -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)
+    bindir=$ac_optarg ;;
+
+  -build | --build | --buil | --bui | --bu)
+    ac_prev=build_alias ;;
+  -build=* | --build=* | --buil=* | --bui=* | --bu=*)
+    build_alias=$ac_optarg ;;
+
+  -cache-file | --cache-file | --cache-fil | --cache-fi \
+  | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
+    ac_prev=cache_file ;;
+  -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
+  | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
+    cache_file=$ac_optarg ;;
+
+  --config-cache | -C)
+    cache_file=config.cache ;;
+
+  -datadir | --datadir | --datadi | --datad | --data | --dat | --da)
+    ac_prev=datadir ;;
+  -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \
+  | --da=*)
+    datadir=$ac_optarg ;;
+
+  -disable-* | --disable-*)
+    ac_feature=`expr "x$ac_option" : 'x-*disable-\(.*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null &&
+      { echo "$as_me: error: invalid feature name: $ac_feature" >&2
+   { (exit 1); exit 1; }; }
+    ac_feature=`echo $ac_feature | sed 's/-/_/g'`
+    eval "enable_$ac_feature=no" ;;
+
+  -enable-* | --enable-*)
+    ac_feature=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null &&
+      { echo "$as_me: error: invalid feature name: $ac_feature" >&2
+   { (exit 1); exit 1; }; }
+    ac_feature=`echo $ac_feature | sed 's/-/_/g'`
+    case $ac_option in
+      *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;;
+      *) ac_optarg=yes ;;
+    esac
+    eval "enable_$ac_feature='$ac_optarg'" ;;
+
+  -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
+  | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
+  | --exec | --exe | --ex)
+    ac_prev=exec_prefix ;;
+  -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
+  | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
+  | --exec=* | --exe=* | --ex=*)
+    exec_prefix=$ac_optarg ;;
+
+  -gas | --gas | --ga | --g)
+    # Obsolete; use --with-gas.
+    with_gas=yes ;;
+
+  -help | --help | --hel | --he | -h)
+    ac_init_help=long ;;
+  -help=r* | --help=r* | --hel=r* | --he=r* | -hr*)
+    ac_init_help=recursive ;;
+  -help=s* | --help=s* | --hel=s* | --he=s* | -hs*)
+    ac_init_help=short ;;
+
+  -host | --host | --hos | --ho)
+    ac_prev=host_alias ;;
+  -host=* | --host=* | --hos=* | --ho=*)
+    host_alias=$ac_optarg ;;
+
+  -includedir | --includedir | --includedi | --included | --include \
+  | --includ | --inclu | --incl | --inc)
+    ac_prev=includedir ;;
+  -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \
+  | --includ=* | --inclu=* | --incl=* | --inc=*)
+    includedir=$ac_optarg ;;
+
+  -infodir | --infodir | --infodi | --infod | --info | --inf)
+    ac_prev=infodir ;;
+  -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)
+    infodir=$ac_optarg ;;
+
+  -libdir | --libdir | --libdi | --libd)
+    ac_prev=libdir ;;
+  -libdir=* | --libdir=* | --libdi=* | --libd=*)
+    libdir=$ac_optarg ;;
+
+  -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \
+  | --libexe | --libex | --libe)
+    ac_prev=libexecdir ;;
+  -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \
+  | --libexe=* | --libex=* | --libe=*)
+    libexecdir=$ac_optarg ;;
+
+  -localstatedir | --localstatedir | --localstatedi | --localstated \
+  | --localstate | --localstat | --localsta | --localst \
+  | --locals | --local | --loca | --loc | --lo)
+    ac_prev=localstatedir ;;
+  -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
+  | --localstate=* | --localstat=* | --localsta=* | --localst=* \
+  | --locals=* | --local=* | --loca=* | --loc=* | --lo=*)
+    localstatedir=$ac_optarg ;;
+
+  -mandir | --mandir | --mandi | --mand | --man | --ma | --m)
+    ac_prev=mandir ;;
+  -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)
+    mandir=$ac_optarg ;;
+
+  -nfp | --nfp | --nf)
+    # Obsolete; use --without-fp.
+    with_fp=no ;;
+
+  -no-create | --no-create | --no-creat | --no-crea | --no-cre \
+  | --no-cr | --no-c | -n)
+    no_create=yes ;;
+
+  -no-recursion | --no-recursion | --no-recursio | --no-recursi \
+  | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)
+    no_recursion=yes ;;
+
+  -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \
+  | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \
+  | --oldin | --oldi | --old | --ol | --o)
+    ac_prev=oldincludedir ;;
+  -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \
+  | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \
+  | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)
+    oldincludedir=$ac_optarg ;;
+
+  -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
+    ac_prev=prefix ;;
+  -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
+    prefix=$ac_optarg ;;
+
+  -program-prefix | --program-prefix | --program-prefi | --program-pref \
+  | --program-pre | --program-pr | --program-p)
+    ac_prev=program_prefix ;;
+  -program-prefix=* | --program-prefix=* | --program-prefi=* \
+  | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)
+    program_prefix=$ac_optarg ;;
+
+  -program-suffix | --program-suffix | --program-suffi | --program-suff \
+  | --program-suf | --program-su | --program-s)
+    ac_prev=program_suffix ;;
+  -program-suffix=* | --program-suffix=* | --program-suffi=* \
+  | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)
+    program_suffix=$ac_optarg ;;
+
+  -program-transform-name | --program-transform-name \
+  | --program-transform-nam | --program-transform-na \
+  | --program-transform-n | --program-transform- \
+  | --program-transform | --program-transfor \
+  | --program-transfo | --program-transf \
+  | --program-trans | --program-tran \
+  | --progr-tra | --program-tr | --program-t)
+    ac_prev=program_transform_name ;;
+  -program-transform-name=* | --program-transform-name=* \
+  | --program-transform-nam=* | --program-transform-na=* \
+  | --program-transform-n=* | --program-transform-=* \
+  | --program-transform=* | --program-transfor=* \
+  | --program-transfo=* | --program-transf=* \
+  | --program-trans=* | --program-tran=* \
+  | --progr-tra=* | --program-tr=* | --program-t=*)
+    program_transform_name=$ac_optarg ;;
+
+  -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+  | -silent | --silent | --silen | --sile | --sil)
+    silent=yes ;;
+
+  -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
+    ac_prev=sbindir ;;
+  -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
+  | --sbi=* | --sb=*)
+    sbindir=$ac_optarg ;;
+
+  -sharedstatedir | --sharedstatedir | --sharedstatedi \
+  | --sharedstated | --sharedstate | --sharedstat | --sharedsta \
+  | --sharedst | --shareds | --shared | --share | --shar \
+  | --sha | --sh)
+    ac_prev=sharedstatedir ;;
+  -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \
+  | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \
+  | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \
+  | --sha=* | --sh=*)
+    sharedstatedir=$ac_optarg ;;
+
+  -site | --site | --sit)
+    ac_prev=site ;;
+  -site=* | --site=* | --sit=*)
+    site=$ac_optarg ;;
+
+  -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
+    ac_prev=srcdir ;;
+  -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
+    srcdir=$ac_optarg ;;
+
+  -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \
+  | --syscon | --sysco | --sysc | --sys | --sy)
+    ac_prev=sysconfdir ;;
+  -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \
+  | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)
+    sysconfdir=$ac_optarg ;;
+
+  -target | --target | --targe | --targ | --tar | --ta | --t)
+    ac_prev=target_alias ;;
+  -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
+    target_alias=$ac_optarg ;;
+
+  -v | -verbose | --verbose | --verbos | --verbo | --verb)
+    verbose=yes ;;
+
+  -version | --version | --versio | --versi | --vers | -V)
+    ac_init_version=: ;;
+
+  -with-* | --with-*)
+    ac_package=`expr "x$ac_option" : 'x-*with-\([^=]*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null &&
+      { echo "$as_me: error: invalid package name: $ac_package" >&2
+   { (exit 1); exit 1; }; }
+    ac_package=`echo $ac_package| sed 's/-/_/g'`
+    case $ac_option in
+      *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;;
+      *) ac_optarg=yes ;;
+    esac
+    eval "with_$ac_package='$ac_optarg'" ;;
+
+  -without-* | --without-*)
+    ac_package=`expr "x$ac_option" : 'x-*without-\(.*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null &&
+      { echo "$as_me: error: invalid package name: $ac_package" >&2
+   { (exit 1); exit 1; }; }
+    ac_package=`echo $ac_package | sed 's/-/_/g'`
+    eval "with_$ac_package=no" ;;
+
+  --x)
+    # Obsolete; use --with-x.
+    with_x=yes ;;
+
+  -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \
+  | --x-incl | --x-inc | --x-in | --x-i)
+    ac_prev=x_includes ;;
+  -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \
+  | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)
+    x_includes=$ac_optarg ;;
+
+  -x-libraries | --x-libraries | --x-librarie | --x-librari \
+  | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)
+    ac_prev=x_libraries ;;
+  -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \
+  | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
+    x_libraries=$ac_optarg ;;
+
+  -*) { echo "$as_me: error: unrecognized option: $ac_option
+Try \`$0 --help' for more information." >&2
+   { (exit 1); exit 1; }; }
+    ;;
+
+  *=*)
+    ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_envvar" : ".*[^_$as_cr_alnum]" >/dev/null &&
+      { echo "$as_me: error: invalid variable name: $ac_envvar" >&2
+   { (exit 1); exit 1; }; }
+    ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`
+    eval "$ac_envvar='$ac_optarg'"
+    export $ac_envvar ;;
+
+  *)
+    # FIXME: should be removed in autoconf 3.0.
+    echo "$as_me: WARNING: you should use --build, --host, --target" >&2
+    expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null &&
+      echo "$as_me: WARNING: invalid host type: $ac_option" >&2
+    : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}
+    ;;
+
+  esac
+done
+
+if test -n "$ac_prev"; then
+  ac_option=--`echo $ac_prev | sed 's/_/-/g'`
+  { echo "$as_me: error: missing argument to $ac_option" >&2
+   { (exit 1); exit 1; }; }
+fi
+
+# Be sure to have absolute paths.
+for ac_var in exec_prefix prefix
+do
+  eval ac_val=$`echo $ac_var`
+  case $ac_val in
+    [\\/$]* | ?:[\\/]* | NONE | '' ) ;;
+    *)  { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2
+   { (exit 1); exit 1; }; };;
+  esac
+done
+
+# Be sure to have absolute paths.
+for ac_var in bindir sbindir libexecdir datadir sysconfdir sharedstatedir \
+	      localstatedir libdir includedir oldincludedir infodir mandir
+do
+  eval ac_val=$`echo $ac_var`
+  case $ac_val in
+    [\\/$]* | ?:[\\/]* ) ;;
+    *)  { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2
+   { (exit 1); exit 1; }; };;
+  esac
+done
+
+# There might be people who depend on the old broken behavior: `$host'
+# used to hold the argument of --host etc.
+# FIXME: To remove some day.
+build=$build_alias
+host=$host_alias
+target=$target_alias
+
+# FIXME: To remove some day.
+if test "x$host_alias" != x; then
+  if test "x$build_alias" = x; then
+    cross_compiling=maybe
+    echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host.
+    If a cross compiler is detected then cross compile mode will be used." >&2
+  elif test "x$build_alias" != "x$host_alias"; then
+    cross_compiling=yes
+  fi
+fi
+
+ac_tool_prefix=
+test -n "$host_alias" && ac_tool_prefix=$host_alias-
+
+test "$silent" = yes && exec 6>/dev/null
+
+
+# Find the source files, if location was not specified.
+if test -z "$srcdir"; then
+  ac_srcdir_defaulted=yes
+  # Try the directory containing this script, then its parent.
+  ac_confdir=`(dirname "$0") 2>/dev/null ||
+$as_expr X"$0" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$0" : 'X\(//\)[^/]' \| \
+	 X"$0" : 'X\(//\)$' \| \
+	 X"$0" : 'X\(/\)' \| \
+	 .     : '\(.\)' 2>/dev/null ||
+echo X"$0" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+  	  /^X\(\/\/\)$/{ s//\1/; q; }
+  	  /^X\(\/\).*/{ s//\1/; q; }
+  	  s/.*/./; q'`
+  srcdir=$ac_confdir
+  if test ! -r $srcdir/$ac_unique_file; then
+    srcdir=..
+  fi
+else
+  ac_srcdir_defaulted=no
+fi
+if test ! -r $srcdir/$ac_unique_file; then
+  if test "$ac_srcdir_defaulted" = yes; then
+    { echo "$as_me: error: cannot find sources ($ac_unique_file) in $ac_confdir or .." >&2
+   { (exit 1); exit 1; }; }
+  else
+    { echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2
+   { (exit 1); exit 1; }; }
+  fi
+fi
+(cd $srcdir && test -r ./$ac_unique_file) 2>/dev/null ||
+  { echo "$as_me: error: sources are in $srcdir, but \`cd $srcdir' does not work" >&2
+   { (exit 1); exit 1; }; }
+srcdir=`echo "$srcdir" | sed 's%\([^\\/]\)[\\/]*$%\1%'`
+ac_env_build_alias_set=${build_alias+set}
+ac_env_build_alias_value=$build_alias
+ac_cv_env_build_alias_set=${build_alias+set}
+ac_cv_env_build_alias_value=$build_alias
+ac_env_host_alias_set=${host_alias+set}
+ac_env_host_alias_value=$host_alias
+ac_cv_env_host_alias_set=${host_alias+set}
+ac_cv_env_host_alias_value=$host_alias
+ac_env_target_alias_set=${target_alias+set}
+ac_env_target_alias_value=$target_alias
+ac_cv_env_target_alias_set=${target_alias+set}
+ac_cv_env_target_alias_value=$target_alias
+ac_env_CC_set=${CC+set}
+ac_env_CC_value=$CC
+ac_cv_env_CC_set=${CC+set}
+ac_cv_env_CC_value=$CC
+ac_env_CFLAGS_set=${CFLAGS+set}
+ac_env_CFLAGS_value=$CFLAGS
+ac_cv_env_CFLAGS_set=${CFLAGS+set}
+ac_cv_env_CFLAGS_value=$CFLAGS
+ac_env_LDFLAGS_set=${LDFLAGS+set}
+ac_env_LDFLAGS_value=$LDFLAGS
+ac_cv_env_LDFLAGS_set=${LDFLAGS+set}
+ac_cv_env_LDFLAGS_value=$LDFLAGS
+ac_env_CPPFLAGS_set=${CPPFLAGS+set}
+ac_env_CPPFLAGS_value=$CPPFLAGS
+ac_cv_env_CPPFLAGS_set=${CPPFLAGS+set}
+ac_cv_env_CPPFLAGS_value=$CPPFLAGS
+ac_env_CXX_set=${CXX+set}
+ac_env_CXX_value=$CXX
+ac_cv_env_CXX_set=${CXX+set}
+ac_cv_env_CXX_value=$CXX
+ac_env_CXXFLAGS_set=${CXXFLAGS+set}
+ac_env_CXXFLAGS_value=$CXXFLAGS
+ac_cv_env_CXXFLAGS_set=${CXXFLAGS+set}
+ac_cv_env_CXXFLAGS_value=$CXXFLAGS
+
+#
+# Report the --help message.
+#
+if test "$ac_init_help" = "long"; then
+  # Omit some internal or obsolete options to make the list less imposing.
+  # This message is too long to be a string in the A/UX 3.1 sh.
+  cat <<_ACEOF
+\`configure' configures this package to adapt to many kinds of systems.
+
+Usage: $0 [OPTION]... [VAR=VALUE]...
+
+To assign environment variables (e.g., CC, CFLAGS...), specify them as
+VAR=VALUE.  See below for descriptions of some of the useful variables.
+
+Defaults for the options are specified in brackets.
+
+Configuration:
+  -h, --help              display this help and exit
+      --help=short        display options specific to this package
+      --help=recursive    display the short help of all the included packages
+  -V, --version           display version information and exit
+  -q, --quiet, --silent   do not print \`checking...' messages
+      --cache-file=FILE   cache test results in FILE [disabled]
+  -C, --config-cache      alias for \`--cache-file=config.cache'
+  -n, --no-create         do not create output files
+      --srcdir=DIR        find the sources in DIR [configure dir or \`..']
+
+_ACEOF
+
+  cat <<_ACEOF
+Installation directories:
+  --prefix=PREFIX         install architecture-independent files in PREFIX
+			  [$ac_default_prefix]
+  --exec-prefix=EPREFIX   install architecture-dependent files in EPREFIX
+			  [PREFIX]
+
+By default, \`make install' will install all the files in
+\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc.  You can specify
+an installation prefix other than \`$ac_default_prefix' using \`--prefix',
+for instance \`--prefix=\$HOME'.
+
+For better control, use the options below.
+
+Fine tuning of the installation directories:
+  --bindir=DIR           user executables [EPREFIX/bin]
+  --sbindir=DIR          system admin executables [EPREFIX/sbin]
+  --libexecdir=DIR       program executables [EPREFIX/libexec]
+  --datadir=DIR          read-only architecture-independent data [PREFIX/share]
+  --sysconfdir=DIR       read-only single-machine data [PREFIX/etc]
+  --sharedstatedir=DIR   modifiable architecture-independent data [PREFIX/com]
+  --localstatedir=DIR    modifiable single-machine data [PREFIX/var]
+  --libdir=DIR           object code libraries [EPREFIX/lib]
+  --includedir=DIR       C header files [PREFIX/include]
+  --oldincludedir=DIR    C header files for non-gcc [/usr/include]
+  --infodir=DIR          info documentation [PREFIX/info]
+  --mandir=DIR           man documentation [PREFIX/man]
+_ACEOF
+
+  cat <<\_ACEOF
+_ACEOF
+fi
+
+if test -n "$ac_init_help"; then
+
+  cat <<\_ACEOF
+
+Optional Packages:
+  --with-PACKAGE[=ARG]    use PACKAGE [ARG=yes]
+  --without-PACKAGE       do not use PACKAGE (same as --with-PACKAGE=no)
+  --with-ld-shared=cmd    provide shared library link
+  --with-gdal=PATH        GDAL (PATH is path to gdal-config)
+  --with-autoload=DIR      Directory for autoload drivers
+  --with-grass=ARG        Include GRASS support (ARG=GRASS install tree dir)
+
+Some influential environment variables:
+  CC          C compiler command
+  CFLAGS      C compiler flags
+  LDFLAGS     linker flags, e.g. -L<lib dir> if you have libraries in a
+              nonstandard directory <lib dir>
+  CPPFLAGS    C/C++ preprocessor flags, e.g. -I<include dir> if you have
+              headers in a nonstandard directory <include dir>
+  CXX         C++ compiler command
+  CXXFLAGS    C++ compiler flags
+
+Use these variables to override the choices made by `configure' or to help
+it to find libraries and programs with nonstandard names/locations.
+
+_ACEOF
+fi
+
+if test "$ac_init_help" = "recursive"; then
+  # If there are subdirs, report their specific --help.
+  ac_popdir=`pwd`
+  for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue
+    test -d $ac_dir || continue
+    ac_builddir=.
+
+if test "$ac_dir" != .; then
+  ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'`
+  # A "../" for each directory in $ac_dir_suffix.
+  ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'`
+else
+  ac_dir_suffix= ac_top_builddir=
+fi
+
+case $srcdir in
+  .)  # No --srcdir option.  We are building in place.
+    ac_srcdir=.
+    if test -z "$ac_top_builddir"; then
+       ac_top_srcdir=.
+    else
+       ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'`
+    fi ;;
+  [\\/]* | ?:[\\/]* )  # Absolute path.
+    ac_srcdir=$srcdir$ac_dir_suffix;
+    ac_top_srcdir=$srcdir ;;
+  *) # Relative path.
+    ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix
+    ac_top_srcdir=$ac_top_builddir$srcdir ;;
+esac
+
+# Do not use `cd foo && pwd` to compute absolute paths, because
+# the directories may not exist.
+case `pwd` in
+.) ac_abs_builddir="$ac_dir";;
+*)
+  case "$ac_dir" in
+  .) ac_abs_builddir=`pwd`;;
+  [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";;
+  *) ac_abs_builddir=`pwd`/"$ac_dir";;
+  esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_top_builddir=${ac_top_builddir}.;;
+*)
+  case ${ac_top_builddir}. in
+  .) ac_abs_top_builddir=$ac_abs_builddir;;
+  [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;;
+  *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;;
+  esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_srcdir=$ac_srcdir;;
+*)
+  case $ac_srcdir in
+  .) ac_abs_srcdir=$ac_abs_builddir;;
+  [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;;
+  *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;;
+  esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_top_srcdir=$ac_top_srcdir;;
+*)
+  case $ac_top_srcdir in
+  .) ac_abs_top_srcdir=$ac_abs_builddir;;
+  [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;;
+  *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;;
+  esac;;
+esac
+
+    cd $ac_dir
+    # Check for guested configure; otherwise get Cygnus style configure.
+    if test -f $ac_srcdir/configure.gnu; then
+      echo
+      $SHELL $ac_srcdir/configure.gnu  --help=recursive
+    elif test -f $ac_srcdir/configure; then
+      echo
+      $SHELL $ac_srcdir/configure  --help=recursive
+    elif test -f $ac_srcdir/configure.ac ||
+	   test -f $ac_srcdir/configure.in; then
+      echo
+      $ac_configure --help
+    else
+      echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2
+    fi
+    cd $ac_popdir
+  done
+fi
+
+test -n "$ac_init_help" && exit 0
+if $ac_init_version; then
+  cat <<\_ACEOF
+
+Copyright (C) 2003 Free Software Foundation, Inc.
+This configure script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it.
+_ACEOF
+  exit 0
+fi
+exec 5>config.log
+cat >&5 <<_ACEOF
+This file contains any messages produced by compilers while
+running configure, to aid debugging if configure makes a mistake.
+
+It was created by $as_me, which was
+generated by GNU Autoconf 2.59.  Invocation command line was
+
+  $ $0 $@
+
+_ACEOF
+{
+cat <<_ASUNAME
+## --------- ##
+## Platform. ##
+## --------- ##
+
+hostname = `(hostname || uname -n) 2>/dev/null | sed 1q`
+uname -m = `(uname -m) 2>/dev/null || echo unknown`
+uname -r = `(uname -r) 2>/dev/null || echo unknown`
+uname -s = `(uname -s) 2>/dev/null || echo unknown`
+uname -v = `(uname -v) 2>/dev/null || echo unknown`
+
+/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown`
+/bin/uname -X     = `(/bin/uname -X) 2>/dev/null     || echo unknown`
+
+/bin/arch              = `(/bin/arch) 2>/dev/null              || echo unknown`
+/usr/bin/arch -k       = `(/usr/bin/arch -k) 2>/dev/null       || echo unknown`
+/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown`
+hostinfo               = `(hostinfo) 2>/dev/null               || echo unknown`
+/bin/machine           = `(/bin/machine) 2>/dev/null           || echo unknown`
+/usr/bin/oslevel       = `(/usr/bin/oslevel) 2>/dev/null       || echo unknown`
+/bin/universe          = `(/bin/universe) 2>/dev/null          || echo unknown`
+
+_ASUNAME
+
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  echo "PATH: $as_dir"
+done
+
+} >&5
+
+cat >&5 <<_ACEOF
+
+
+## ----------- ##
+## Core tests. ##
+## ----------- ##
+
+_ACEOF
+
+
+# Keep a trace of the command line.
+# Strip out --no-create and --no-recursion so they do not pile up.
+# Strip out --silent because we don't want to record it for future runs.
+# Also quote any args containing shell meta-characters.
+# Make two passes to allow for proper duplicate-argument suppression.
+ac_configure_args=
+ac_configure_args0=
+ac_configure_args1=
+ac_sep=
+ac_must_keep_next=false
+for ac_pass in 1 2
+do
+  for ac_arg
+  do
+    case $ac_arg in
+    -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;;
+    -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+    | -silent | --silent | --silen | --sile | --sil)
+      continue ;;
+    *" "*|*"	"*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*)
+      ac_arg=`echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
+    esac
+    case $ac_pass in
+    1) ac_configure_args0="$ac_configure_args0 '$ac_arg'" ;;
+    2)
+      ac_configure_args1="$ac_configure_args1 '$ac_arg'"
+      if test $ac_must_keep_next = true; then
+	ac_must_keep_next=false # Got value, back to normal.
+      else
+	case $ac_arg in
+	  *=* | --config-cache | -C | -disable-* | --disable-* \
+	  | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \
+	  | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \
+	  | -with-* | --with-* | -without-* | --without-* | --x)
+	    case "$ac_configure_args0 " in
+	      "$ac_configure_args1"*" '$ac_arg' "* ) continue ;;
+	    esac
+	    ;;
+	  -* ) ac_must_keep_next=true ;;
+	esac
+      fi
+      ac_configure_args="$ac_configure_args$ac_sep'$ac_arg'"
+      # Get rid of the leading space.
+      ac_sep=" "
+      ;;
+    esac
+  done
+done
+$as_unset ac_configure_args0 || test "${ac_configure_args0+set}" != set || { ac_configure_args0=; export ac_configure_args0; }
+$as_unset ac_configure_args1 || test "${ac_configure_args1+set}" != set || { ac_configure_args1=; export ac_configure_args1; }
+
+# When interrupted or exit'd, cleanup temporary files, and complete
+# config.log.  We remove comments because anyway the quotes in there
+# would cause problems or look ugly.
+# WARNING: Be sure not to use single quotes in there, as some shells,
+# such as our DU 5.0 friend, will then `close' the trap.
+trap 'exit_status=$?
+  # Save into config.log some information that might help in debugging.
+  {
+    echo
+
+    cat <<\_ASBOX
+## ---------------- ##
+## Cache variables. ##
+## ---------------- ##
+_ASBOX
+    echo
+    # The following way of writing the cache mishandles newlines in values,
+{
+  (set) 2>&1 |
+    case `(ac_space='"'"' '"'"'; set | grep ac_space) 2>&1` in
+    *ac_space=\ *)
+      sed -n \
+	"s/'"'"'/'"'"'\\\\'"'"''"'"'/g;
+	  s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='"'"'\\2'"'"'/p"
+      ;;
+    *)
+      sed -n \
+	"s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p"
+      ;;
+    esac;
+}
+    echo
+
+    cat <<\_ASBOX
+## ----------------- ##
+## Output variables. ##
+## ----------------- ##
+_ASBOX
+    echo
+    for ac_var in $ac_subst_vars
+    do
+      eval ac_val=$`echo $ac_var`
+      echo "$ac_var='"'"'$ac_val'"'"'"
+    done | sort
+    echo
+
+    if test -n "$ac_subst_files"; then
+      cat <<\_ASBOX
+## ------------- ##
+## Output files. ##
+## ------------- ##
+_ASBOX
+      echo
+      for ac_var in $ac_subst_files
+      do
+	eval ac_val=$`echo $ac_var`
+	echo "$ac_var='"'"'$ac_val'"'"'"
+      done | sort
+      echo
+    fi
+
+    if test -s confdefs.h; then
+      cat <<\_ASBOX
+## ----------- ##
+## confdefs.h. ##
+## ----------- ##
+_ASBOX
+      echo
+      sed "/^$/d" confdefs.h | sort
+      echo
+    fi
+    test "$ac_signal" != 0 &&
+      echo "$as_me: caught signal $ac_signal"
+    echo "$as_me: exit $exit_status"
+  } >&5
+  rm -f core *.core &&
+  rm -rf conftest* confdefs* conf$$* $ac_clean_files &&
+    exit $exit_status
+     ' 0
+for ac_signal in 1 2 13 15; do
+  trap 'ac_signal='$ac_signal'; { (exit 1); exit 1; }' $ac_signal
+done
+ac_signal=0
+
+# confdefs.h avoids OS command line length limits that DEFS can exceed.
+rm -rf conftest* confdefs.h
+# AIX cpp loses on an empty file, so make sure it contains at least a newline.
+echo >confdefs.h
+
+# Predefined preprocessor variables.
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_NAME "$PACKAGE_NAME"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_TARNAME "$PACKAGE_TARNAME"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_VERSION "$PACKAGE_VERSION"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_STRING "$PACKAGE_STRING"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT"
+_ACEOF
+
+
+# Let the site file select an alternate cache file if it wants to.
+# Prefer explicitly selected file to automatically selected ones.
+if test -z "$CONFIG_SITE"; then
+  if test "x$prefix" != xNONE; then
+    CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site"
+  else
+    CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site"
+  fi
+fi
+for ac_site_file in $CONFIG_SITE; do
+  if test -r "$ac_site_file"; then
+    { echo "$as_me:$LINENO: loading site script $ac_site_file" >&5
+echo "$as_me: loading site script $ac_site_file" >&6;}
+    sed 's/^/| /' "$ac_site_file" >&5
+    . "$ac_site_file"
+  fi
+done
+
+
+# Check that the precious variables saved in the cache have kept the same
+# value.
+ac_cache_corrupted=false
+for ac_var in `(set) 2>&1 |
+	       sed -n 's/^ac_env_\([a-zA-Z_0-9]*\)_set=.*/\1/p'`; do
+  eval ac_old_set=\$ac_cv_env_${ac_var}_set
+  eval ac_new_set=\$ac_env_${ac_var}_set
+  eval ac_old_val="\$ac_cv_env_${ac_var}_value"
+  eval ac_new_val="\$ac_env_${ac_var}_value"
+  case $ac_old_set,$ac_new_set in
+    set,)
+      { echo "$as_me:$LINENO: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5
+echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;}
+      ac_cache_corrupted=: ;;
+    ,set)
+      { echo "$as_me:$LINENO: error: \`$ac_var' was not set in the previous run" >&5
+echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;}
+      ac_cache_corrupted=: ;;
+    ,);;
+    *)
+      if test "x$ac_old_val" != "x$ac_new_val"; then
+	{ echo "$as_me:$LINENO: error: \`$ac_var' has changed since the previous run:" >&5
+echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;}
+	{ echo "$as_me:$LINENO:   former value:  $ac_old_val" >&5
+echo "$as_me:   former value:  $ac_old_val" >&2;}
+	{ echo "$as_me:$LINENO:   current value: $ac_new_val" >&5
+echo "$as_me:   current value: $ac_new_val" >&2;}
+	ac_cache_corrupted=:
+      fi;;
+  esac
+  # Pass precious variables to config.status.
+  if test "$ac_new_set" = set; then
+    case $ac_new_val in
+    *" "*|*"	"*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*)
+      ac_arg=$ac_var=`echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;;
+    *) ac_arg=$ac_var=$ac_new_val ;;
+    esac
+    case " $ac_configure_args " in
+      *" '$ac_arg' "*) ;; # Avoid dups.  Use of quotes ensures accuracy.
+      *) ac_configure_args="$ac_configure_args '$ac_arg'" ;;
+    esac
+  fi
+done
+if $ac_cache_corrupted; then
+  { echo "$as_me:$LINENO: error: changes in the environment can compromise the build" >&5
+echo "$as_me: error: changes in the environment can compromise the build" >&2;}
+  { { echo "$as_me:$LINENO: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&5
+echo "$as_me: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}gcc; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_CC="${ac_tool_prefix}gcc"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+fi
+if test -z "$ac_cv_prog_CC"; then
+  ac_ct_CC=$CC
+  # Extract the first word of "gcc", so it can be a program name with args.
+set dummy gcc; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$ac_ct_CC"; then
+  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_CC="gcc"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+  echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
+echo "${ECHO_T}$ac_ct_CC" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+  CC=$ac_ct_CC
+else
+  CC="$ac_cv_prog_CC"
+fi
+
+if test -z "$CC"; then
+  if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}cc; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_CC="${ac_tool_prefix}cc"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+fi
+if test -z "$ac_cv_prog_CC"; then
+  ac_ct_CC=$CC
+  # Extract the first word of "cc", so it can be a program name with args.
+set dummy cc; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$ac_ct_CC"; then
+  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_CC="cc"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+  echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
+echo "${ECHO_T}$ac_ct_CC" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+  CC=$ac_ct_CC
+else
+  CC="$ac_cv_prog_CC"
+fi
+
+fi
+if test -z "$CC"; then
+  # Extract the first word of "cc", so it can be a program name with args.
+set dummy cc; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+  ac_prog_rejected=no
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then
+       ac_prog_rejected=yes
+       continue
+     fi
+    ac_cv_prog_CC="cc"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+if test $ac_prog_rejected = yes; then
+  # We found a bogon in the path, so make sure we never use it.
+  set dummy $ac_cv_prog_CC
+  shift
+  if test $# != 0; then
+    # We chose a different compiler from the bogus one.
+    # However, it has the same basename, so the bogon will be chosen
+    # first if we set CC to just the basename; use the full file name.
+    shift
+    ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@"
+  fi
+fi
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+fi
+if test -z "$CC"; then
+  if test -n "$ac_tool_prefix"; then
+  for ac_prog in cl
+  do
+    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+    test -n "$CC" && break
+  done
+fi
+if test -z "$CC"; then
+  ac_ct_CC=$CC
+  for ac_prog in cl
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$ac_ct_CC"; then
+  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_CC="$ac_prog"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+  echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
+echo "${ECHO_T}$ac_ct_CC" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+  test -n "$ac_ct_CC" && break
+done
+
+  CC=$ac_ct_CC
+fi
+
+fi
+
+
+test -z "$CC" && { { echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH
+See \`config.log' for more details." >&5
+echo "$as_me: error: no acceptable C compiler found in \$PATH
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }
+
+# Provide some information about the compiler.
+echo "$as_me:$LINENO:" \
+     "checking for C compiler version" >&5
+ac_compiler=`set X $ac_compile; echo $2`
+{ (eval echo "$as_me:$LINENO: \"$ac_compiler --version </dev/null >&5\"") >&5
+  (eval $ac_compiler --version </dev/null >&5) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }
+{ (eval echo "$as_me:$LINENO: \"$ac_compiler -v </dev/null >&5\"") >&5
+  (eval $ac_compiler -v </dev/null >&5) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }
+{ (eval echo "$as_me:$LINENO: \"$ac_compiler -V </dev/null >&5\"") >&5
+  (eval $ac_compiler -V </dev/null >&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[^ ]*//'`
+if { (eval echo "$as_me:$LINENO: \"$ac_link_default\"") >&5
+  (eval $ac_link_default) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+  # Find the output, starting from the most likely.  This scheme is
+# not robust to junk in `.', hence go to wildcards (a.*) only as a last
+# resort.
+
+# Be careful to initialize this variable, since it used to be cached.
+# Otherwise an old cache value of `no' led to `EXEEXT = no' in a Makefile.
+ac_cv_exeext=
+# b.out is created by i960 compilers.
+for ac_file in a_out.exe a.exe conftest.exe a.out conftest a.* conftest.* b.out
+do
+  test -f "$ac_file" || continue
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.o | *.obj )
+	;;
+    conftest.$ac_ext )
+	# This is the source file.
+	;;
+    [ab].out )
+	# We found the default executable, but exeext='' is most
+	# certainly right.
+	break;;
+    *.* )
+	ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+	# FIXME: I believe we export ac_cv_exeext for Libtool,
+	# but it would be cool to find out if it's true.  Does anybody
+	# maintain Libtool? --akim.
+	export ac_cv_exeext
+	break;;
+    * )
+	break;;
+  esac
+done
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+{ { echo "$as_me:$LINENO: error: C compiler cannot create executables
+See \`config.log' for more details." >&5
+echo "$as_me: error: C compiler cannot create executables
+See \`config.log' for more details." >&2;}
+   { (exit 77); exit 77; }; }
+fi
+
+ac_exeext=$ac_cv_exeext
+echo "$as_me:$LINENO: result: $ac_file" >&5
+echo "${ECHO_T}$ac_file" >&6
+
+# Check the compiler produces executables we can run.  If not, either
+# the compiler is broken, or we cross compile.
+echo "$as_me:$LINENO: checking whether the C compiler works" >&5
+echo $ECHO_N "checking whether the C compiler works... $ECHO_C" >&6
+# FIXME: These cross compiler hacks should be removed for Autoconf 3.0
+# If not cross compiling, check that we can run a simple program.
+if test "$cross_compiling" != yes; then
+  if { ac_try='./$ac_file'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+    cross_compiling=no
+  else
+    if test "$cross_compiling" = maybe; then
+	cross_compiling=yes
+    else
+	{ { echo "$as_me:$LINENO: error: cannot run C compiled programs.
+If you meant to cross compile, use \`--host'.
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot run C compiled programs.
+If you meant to cross compile, use \`--host'.
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }
+    fi
+  fi
+fi
+echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+
+rm -f a.out a.exe conftest$ac_cv_exeext b.out
+ac_clean_files=$ac_clean_files_save
+# Check the compiler produces executables we can run.  If not, either
+# the compiler is broken, or we cross compile.
+echo "$as_me:$LINENO: checking whether we are cross compiling" >&5
+echo $ECHO_N "checking whether we are cross compiling... $ECHO_C" >&6
+echo "$as_me:$LINENO: result: $cross_compiling" >&5
+echo "${ECHO_T}$cross_compiling" >&6
+
+echo "$as_me:$LINENO: checking for suffix of executables" >&5
+echo $ECHO_N "checking for suffix of executables... $ECHO_C" >&6
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+  # If both `conftest.exe' and `conftest' are `present' (well, observable)
+# catch `conftest.exe'.  For instance with Cygwin, `ls conftest' will
+# work properly (i.e., refer to `conftest.exe'), while it won't with
+# `rm'.
+for ac_file in conftest.exe conftest conftest.*; do
+  test -f "$ac_file" || continue
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.o | *.obj ) ;;
+    *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+	  export ac_cv_exeext
+	  break;;
+    * ) break;;
+  esac
+done
+else
+  { { echo "$as_me:$LINENO: error: cannot compute suffix of executables: cannot compile and link
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot compute suffix of executables: cannot compile and link
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+rm -f conftest$ac_cv_exeext
+echo "$as_me:$LINENO: result: $ac_cv_exeext" >&5
+echo "${ECHO_T}$ac_cv_exeext" >&6
+
+rm -f conftest.$ac_ext
+EXEEXT=$ac_cv_exeext
+ac_exeext=$EXEEXT
+echo "$as_me:$LINENO: checking for suffix of object files" >&5
+echo $ECHO_N "checking for suffix of object files... $ECHO_C" >&6
+if test "${ac_cv_objext+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.o conftest.obj
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+  for ac_file in `(ls conftest.o conftest.obj; ls conftest.*) 2>/dev/null`; do
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg ) ;;
+    *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'`
+       break;;
+  esac
+done
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+{ { echo "$as_me:$LINENO: error: cannot compute suffix of object files: cannot compile
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot compute suffix of object files: cannot compile
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+rm -f conftest.$ac_cv_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_objext" >&5
+echo "${ECHO_T}$ac_cv_objext" >&6
+OBJEXT=$ac_cv_objext
+ac_objext=$OBJEXT
+echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5
+echo $ECHO_N "checking whether we are using the GNU C compiler... $ECHO_C" >&6
+if test "${ac_cv_c_compiler_gnu+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+#ifndef __GNUC__
+       choke me
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>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); } &&
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_compiler_gnu=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_compiler_gnu=no
+fi
+rm -f conftest.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
+CFLAGS="-g"
+echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5
+echo $ECHO_N "checking whether $CC accepts -g... $ECHO_C" >&6
+if test "${ac_cv_prog_cc_g+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>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); } &&
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_prog_cc_g=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_prog_cc_g=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5
+echo "${ECHO_T}$ac_cv_prog_cc_g" >&6
+if test "$ac_test_CFLAGS" = set; then
+  CFLAGS=$ac_save_CFLAGS
+elif test $ac_cv_prog_cc_g = yes; then
+  if test "$GCC" = yes; then
+    CFLAGS="-g -O2"
+  else
+    CFLAGS="-g"
+  fi
+else
+  if test "$GCC" = yes; then
+    CFLAGS="-O2"
+  else
+    CFLAGS=
+  fi
+fi
+echo "$as_me:$LINENO: checking for $CC option to accept ANSI C" >&5
+echo $ECHO_N "checking for $CC option to accept ANSI C... $ECHO_C" >&6
+if test "${ac_cv_prog_cc_stdc+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_cv_prog_cc_stdc=no
+ac_save_CC=$CC
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <stdarg.h>
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+/* 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 -std1 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 -std1.  */
+int osf4_cc_array ['\x00' == 0 ? 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
+# Don't try gcc -ansi; that turns off useful extensions and
+# breaks some systems' header files.
+# AIX			-qlanglvl=ansi
+# Ultrix and OSF/1	-std1
+# HP-UX 10.20 and later	-Ae
+# HP-UX older versions	-Aa -D_HPUX_SOURCE
+# SVR4			-Xc -D__EXTENSIONS__
+for ac_arg in "" -qlanglvl=ansi -std1 -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
+do
+  CC="$ac_save_CC $ac_arg"
+  rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>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); } &&
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_prog_cc_stdc=$ac_arg
+break
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f conftest.err conftest.$ac_objext
+done
+rm -f conftest.$ac_ext conftest.$ac_objext
+CC=$ac_save_CC
+
+fi
+
+case "x$ac_cv_prog_cc_stdc" in
+  x|xno)
+    echo "$as_me:$LINENO: result: none needed" >&5
+echo "${ECHO_T}none needed" >&6 ;;
+  *)
+    echo "$as_me:$LINENO: result: $ac_cv_prog_cc_stdc" >&5
+echo "${ECHO_T}$ac_cv_prog_cc_stdc" >&6
+    CC="$CC $ac_cv_prog_cc_stdc" ;;
+esac
+
+# Some people use a C++ compiler to compile C.  Since we use `exit',
+# in C++ we need to declare it.  In case someone uses the same compiler
+# for both compiling C and C++ we need to have the C++ compiler decide
+# the declaration of exit, since it's the most demanding environment.
+cat >conftest.$ac_ext <<_ACEOF
+#ifndef __cplusplus
+  choke me
+#endif
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>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); } &&
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  for ac_declaration in \
+   '' \
+   'extern "C" void std::exit (int) throw (); using std::exit;' \
+   'extern "C" void std::exit (int); using std::exit;' \
+   'extern "C" void exit (int) throw ();' \
+   'extern "C" void exit (int);' \
+   'void exit (int);'
+do
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_declaration
+#include <stdlib.h>
+int
+main ()
+{
+exit (42);
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>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); } &&
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  :
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+continue
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_declaration
+int
+main ()
+{
+exit (42);
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>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); } &&
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  break
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+done
+rm -f conftest*
+if test -n "$ac_declaration"; then
+  echo '#ifdef __cplusplus' >>confdefs.h
+  echo $ac_declaration      >>confdefs.h
+  echo '#endif'             >>confdefs.h
+fi
+
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+ac_ext=cc
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+if test -n "$ac_tool_prefix"; then
+  for ac_prog in $CCC g++ c++ gpp aCC CC cxx cc++ cl FCC KCC RCC xlC_r xlC
+  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_CXX+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$CXX"; then
+  ac_cv_prog_CXX="$CXX" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_CXX="$ac_tool_prefix$ac_prog"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+fi
+fi
+CXX=$ac_cv_prog_CXX
+if test -n "$CXX"; then
+  echo "$as_me:$LINENO: result: $CXX" >&5
+echo "${ECHO_T}$CXX" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+    test -n "$CXX" && break
+  done
+fi
+if test -z "$CXX"; then
+  ac_ct_CXX=$CXX
+  for ac_prog in $CCC g++ c++ gpp aCC CC cxx cc++ cl FCC KCC RCC xlC_r xlC
+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_CXX+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$ac_ct_CXX"; then
+  ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_CXX="$ac_prog"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+fi
+fi
+ac_ct_CXX=$ac_cv_prog_ac_ct_CXX
+if test -n "$ac_ct_CXX"; then
+  echo "$as_me:$LINENO: result: $ac_ct_CXX" >&5
+echo "${ECHO_T}$ac_ct_CXX" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+  test -n "$ac_ct_CXX" && break
+done
+test -n "$ac_ct_CXX" || ac_ct_CXX="g++"
+
+  CXX=$ac_ct_CXX
+fi
+
+
+# Provide some information about the compiler.
+echo "$as_me:$LINENO:" \
+     "checking for C++ compiler version" >&5
+ac_compiler=`set X $ac_compile; echo $2`
+{ (eval echo "$as_me:$LINENO: \"$ac_compiler --version </dev/null >&5\"") >&5
+  (eval $ac_compiler --version </dev/null >&5) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }
+{ (eval echo "$as_me:$LINENO: \"$ac_compiler -v </dev/null >&5\"") >&5
+  (eval $ac_compiler -v </dev/null >&5) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }
+{ (eval echo "$as_me:$LINENO: \"$ac_compiler -V </dev/null >&5\"") >&5
+  (eval $ac_compiler -V </dev/null >&5) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }
+
+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_cxx_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 { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&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); } &&
+	 { ac_try='test -z "$ac_cxx_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_compiler_gnu=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_compiler_gnu=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+ac_cv_cxx_compiler_gnu=$ac_compiler_gnu
+
+fi
+echo "$as_me:$LINENO: result: $ac_cv_cxx_compiler_gnu" >&5
+echo "${ECHO_T}$ac_cv_cxx_compiler_gnu" >&6
+GXX=`test $ac_compiler_gnu = yes && echo yes`
+ac_test_CXXFLAGS=${CXXFLAGS+set}
+ac_save_CXXFLAGS=$CXXFLAGS
+CXXFLAGS="-g"
+echo "$as_me:$LINENO: checking whether $CXX accepts -g" >&5
+echo $ECHO_N "checking whether $CXX accepts -g... $ECHO_C" >&6
+if test "${ac_cv_prog_cxx_g+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.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&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); } &&
+	 { ac_try='test -z "$ac_cxx_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_prog_cxx_g=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_prog_cxx_g=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_prog_cxx_g" >&5
+echo "${ECHO_T}$ac_cv_prog_cxx_g" >&6
+if test "$ac_test_CXXFLAGS" = set; then
+  CXXFLAGS=$ac_save_CXXFLAGS
+elif test $ac_cv_prog_cxx_g = yes; then
+  if test "$GXX" = yes; then
+    CXXFLAGS="-g -O2"
+  else
+    CXXFLAGS="-g"
+  fi
+else
+  if test "$GXX" = yes; then
+    CXXFLAGS="-O2"
+  else
+    CXXFLAGS=
+  fi
+fi
+for ac_declaration in \
+   '' \
+   'extern "C" void std::exit (int) throw (); using std::exit;' \
+   'extern "C" void std::exit (int); using std::exit;' \
+   'extern "C" void exit (int) throw ();' \
+   'extern "C" void exit (int);' \
+   'void exit (int);'
+do
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_declaration
+#include <stdlib.h>
+int
+main ()
+{
+exit (42);
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>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); } &&
+	 { ac_try='test -z "$ac_cxx_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  :
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+continue
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_declaration
+int
+main ()
+{
+exit (42);
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>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); } &&
+	 { ac_try='test -z "$ac_cxx_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  break
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+done
+rm -f conftest*
+if test -n "$ac_declaration"; then
+  echo '#ifdef __cplusplus' >>confdefs.h
+  echo $ac_declaration      >>confdefs.h
+  echo '#endif'             >>confdefs.h
+fi
+
+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}ranlib", so it can be a program name with args.
+set dummy ${ac_tool_prefix}ranlib; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_RANLIB+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$RANLIB"; then
+  ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+fi
+fi
+RANLIB=$ac_cv_prog_RANLIB
+if test -n "$RANLIB"; then
+  echo "$as_me:$LINENO: result: $RANLIB" >&5
+echo "${ECHO_T}$RANLIB" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+fi
+if test -z "$ac_cv_prog_RANLIB"; then
+  ac_ct_RANLIB=$RANLIB
+  # Extract the first word of "ranlib", so it can be a program name with args.
+set dummy ranlib; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_RANLIB+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$ac_ct_RANLIB"; then
+  ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_RANLIB="ranlib"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+  test -z "$ac_cv_prog_ac_ct_RANLIB" && ac_cv_prog_ac_ct_RANLIB=":"
+fi
+fi
+ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB
+if test -n "$ac_ct_RANLIB"; then
+  echo "$as_me:$LINENO: result: $ac_ct_RANLIB" >&5
+echo "${ECHO_T}$ac_ct_RANLIB" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+  RANLIB=$ac_ct_RANLIB
+else
+  RANLIB="$ac_cv_prog_RANLIB"
+fi
+
+
+	echo 'void f(){}' > conftest.c
+	if test -z "`${CC-cc} -fPIC -c conftest.c 2>&1`"; then
+	  C_PIC=-fPIC
+	else
+	  C_PIC=
+	fi
+	if test -z "`${CXX-g++} -fPIC -c conftest.c 2>&1`"; then
+	  CXX_PIC=-fPIC
+	else
+	  CXX_PIC=
+	fi
+	rm -f conftest*
+
+	CXX_PIC=$CXX_PIC
+
+	C_PIC=$C_PIC
+
+
+
+  echo 'void g(); int main(){ g(); return 0; }' > conftest1.c
+
+  echo '#include <stdio.h>' > conftest2.c
+  echo 'void g(); void g(){printf("");}' >> conftest2.c
+  ${CC} ${C_PIC} -c conftest2.c
+
+  SO_EXT="so"
+  export SO_EXT
+  LD_SHARED="/bin/true"
+  if test ! -z "`uname -a | grep IRIX`" ; then
+    IRIX_ALL=-all
+  else
+    IRIX_ALL=
+  fi
+
+
+# Check whether --with-ld-shared or --without-ld-shared was given.
+if test "${with_ld_shared+set}" = set; then
+  withval="$with_ld_shared"
+
+fi;
+
+  if test "$with_ld_shared" != "" ; then
+    if test "$with_ld_shared" = "no" ; then
+      echo "user disabled shared library support."
+    else
+      echo "using user supplied .so link command ... $with_ld_shared"
+    fi
+    LD_SHARED="$with_ld_shared"
+  fi
+
+
+  if test ! -z "`uname -a | grep CYGWIN`" \
+        -a "$LD_SHARED" = "/bin/true" \
+	-a -z "`gcc -shared conftest2.o -o libconftest.dll`" ; then
+    if test -z "`${CC} conftest1.c -L./ -lconftest -o conftest1 2>&1`"; then
+      LD_LIBRARY_PATH_OLD="$LD_LIBRARY_PATH"
+      if test -z "$LD_LIBRARY_PATH" ; then
+        LD_LIBRARY_PATH="`pwd`"
+      else
+        LD_LIBRARY_PATH="`pwd`:$LD_LIBRARY_PATH"
+      fi
+      export LD_LIBRARY_PATH
+      if test -z "`./conftest1 2>&1`" ; then
+        echo "checking for Cygwin gcc -shared ... yes"
+        LD_SHARED="c++ -shared"
+        SO_EXT="dll"
+      fi
+      LD_LIBRARY_PATH="$LD_LIBRARY_PATH_OLD"
+    fi
+  fi
+
+
+  if test ! -z "`uname | grep Darwin`" \
+          -a "$LD_SHARED" = "/bin/true" \
+          -a -z "`${CXX} -dynamiclib conftest2.o -o libconftest.so 2>&1`" ; then
+    ${CC} -c conftest1.c
+    if test -z "`${CXX} conftest1.o libconftest.so -o conftest1 2>&1`"; then
+      DYLD_LIBRARY_PATH_OLD="$DYLD_LIBRARY_PATH"
+      if test -z "$DYLD_LIBRARY_PATH" ; then
+        DYLD_LIBRARY_PATH="`pwd`"
+      else
+        DYLD_LIBRARY_PATH="`pwd`:$DYLD_LIBRARY_PATH"
+      fi
+      export DYLD_LIBRARY_PATH
+      if test -z "`./conftest1 2>&1`" ; then
+        echo "checking for ${CXX} -dynamiclib ... yes"
+        LD_SHARED="${CXX} -dynamiclib"
+	SO_EXT=dylib
+      fi
+      DYLD_LIBRARY_PATH="$DYLD_LIBRARY_PATH_OLD"
+    fi
+    rm -f conftest1.o
+  fi
+
+  if test "$LD_SHARED" = "/bin/true" \
+	-a -z "`${CXX} -shared $IRIX_ALL conftest2.o -o libconftest.so 2>&1|grep -v WARNING`" ; then
+    if test -z "`${CC} conftest1.c libconftest.so -o conftest1 2>&1`"; then
+      LD_LIBRARY_PATH_OLD="$LD_LIBRARY_PATH"
+      if test -z "$LD_LIBRARY_PATH" ; then
+        LD_LIBRARY_PATH="`pwd`"
+      else
+        LD_LIBRARY_PATH="`pwd`:$LD_LIBRARY_PATH"
+      fi
+      export LD_LIBRARY_PATH
+      if test -z "`./conftest1 2>&1`" ; then
+        echo "checking for ${CXX} -shared ... yes"
+        LD_SHARED="${CXX} -shared $IRIX_ALL"
+      else
+        echo "checking for ${CXX} -shared ... no(3)"
+      fi
+      LD_LIBRARY_PATH="$LD_LIBRARY_PATH_OLD"
+    else
+      echo "checking for ${CXX} -shared ... no(2)"
+    fi
+  else
+    if test "$LD_SHARED" = "/bin/true" ; then
+      echo "checking for ${CXX} -shared ... no(1)"
+    fi
+  fi
+
+  if test "$LD_SHARED" = "/bin/true" \
+          -a -z "`ld -shared conftest2.o -o libconftest.so 2>&1`" ; then
+    if test -z "`${CC} conftest1.c libconftest.so -o conftest1 2>&1`"; then
+      LD_LIBRARY_PATH_OLD="$LD_LIBRARY_PATH"
+      if test -z "$LD_LIBRARY_PATH" ; then
+        LD_LIBRARY_PATH="`pwd`"
+      else
+        LD_LIBRARY_PATH="`pwd`:$LD_LIBRARY_PATH"
+      fi
+      export LD_LIBRARY_PATH
+      if test -z "`./conftest1 2>&1`" ; then
+        echo "checking for ld -shared ... yes"
+        LD_SHARED="ld -shared"
+      fi
+      LD_LIBRARY_PATH="$LD_LIBRARY_PATH_OLD"
+    fi
+  fi
+
+  if test "$LD_SHARED" = "/bin/true" ; then
+    echo "checking for ld -shared ... no"
+    if test ! -x /bin/true ; then
+      LD_SHARED=/usr/bin/true
+    fi
+  fi
+  if test "$LD_SHARED" = "no" ; then
+    if test -x /bin/true ; then
+      LD_SHARED=/bin/true
+    else
+      LD_SHARED=/usr/bin/true
+    fi
+  fi
+
+  rm -f conftest* libconftest*
+
+  LD_SHARED=$LD_SHARED
+
+  SO_EXT=$SO_EXT
+
+
+
+	# Remove -g from compile flags, we will add via CFG variable if
+	# we need it.
+	CXXFLAGS=`echo "$CXXFLAGS " | sed "s/-g //"`
+	CFLAGS=`echo "$CFLAGS " | sed "s/-g //"`
+
+	# check for GNU compiler, and use -Wall
+	if test "$GCC" = "yes"; then
+		C_WFLAGS="-Wall"
+
+cat >>confdefs.h <<\_ACEOF
+#define USE_GNUCC 1
+_ACEOF
+
+	fi
+	if test "$GXX" = "yes"; then
+		CXX_WFLAGS="-Wall"
+
+cat >>confdefs.h <<\_ACEOF
+#define USE_GNUCC 1
+_ACEOF
+
+	fi
+	CXX_WFLAGS=$CXX_WFLAGS
+
+	C_WFLAGS=$C_WFLAGS
+
+
+
+
+
+# Check whether --with-gdal or --without-gdal was given.
+if test "${with_gdal+set}" = set; then
+  withval="$with_gdal"
+
+fi;
+
+if test "$with_gdal" = "yes" -o "$with_gdal" = "" ; then
+
+  if test "`basename xx/$with_gdal`" = "gdal-config" ; then
+    GDAL_CONFIG="$with_gdal"
+  fi
+
+  if test -z "$GDAL_CONFIG" ; then
+    # Extract the first word of "gdal-config", so it can be a program name with args.
+set dummy gdal-config; 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_path_GDAL_CONFIG+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  case $GDAL_CONFIG in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_GDAL_CONFIG="$GDAL_CONFIG" # Let the user override the test with a path.
+  ;;
+  *)
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_path_GDAL_CONFIG="$as_dir/$ac_word$ac_exec_ext"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+  test -z "$ac_cv_path_GDAL_CONFIG" && ac_cv_path_GDAL_CONFIG="no"
+  ;;
+esac
+fi
+GDAL_CONFIG=$ac_cv_path_GDAL_CONFIG
+
+if test -n "$GDAL_CONFIG"; then
+  echo "$as_me:$LINENO: result: $GDAL_CONFIG" >&5
+echo "${ECHO_T}$GDAL_CONFIG" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+  fi
+
+  if test "$GDAL_CONFIG" = "no" ; then
+    { { echo "$as_me:$LINENO: error: couldn't find gdal-config" >&5
+echo "$as_me: error: couldn't find gdal-config" >&2;}
+   { (exit 1); exit 1; }; }
+  fi
+
+elif test -n "$with_gdal" -a "$with_gdal" != "no" ; then
+
+  GDAL_CONFIG=$with_gdal
+
+  if test -f "$GDAL_CONFIG" -a -x "$GDAL_CONFIG" ; then
+    echo "$as_me:$LINENO: result: user supplied gdal-config ($GDAL_CONFIG)" >&5
+echo "${ECHO_T}user supplied gdal-config ($GDAL_CONFIG)" >&6
+  else
+    { { echo "$as_me:$LINENO: error: '$GDAL_CONFIG' is not an executable.  Make sure you use --with-gdal=/path/to/gdal-config" >&5
+echo "$as_me: error: '$GDAL_CONFIG' is not an executable.  Make sure you use --with-gdal=/path/to/gdal-config" >&2;}
+   { (exit 1); exit 1; }; }
+  fi
+
+else
+
+  { { echo "$as_me:$LINENO: error: gdal required to build GDAL GRASS 5.7 driver" >&5
+echo "$as_me: error: gdal required to build GDAL GRASS 5.7 driver" >&2;}
+   { (exit 1); exit 1; }; }
+
+fi
+
+LIBS="`$GDAL_CONFIG --libs` $LIBS"
+GDAL_INC=`$GDAL_CONFIG --cflags`
+
+GDAL_INC=$GDAL_INC
+
+
+
+# Check whether --with-autoload or --without-autoload was given.
+if test "${with_autoload+set}" = set; then
+  withval="$with_autoload"
+
+fi;
+
+if test "$with_autoload" != "" ; then
+  AUTOLOAD_DIR=$with_autoload
+else
+  if $GDAL_CONFIG --autoload > /dev/null 2>&1 ; then
+    AUTOLOAD_DIR=`$GDAL_CONFIG --autoload`
+  else
+    AUTOLOAD_DIR=`$GDAL_CONFIG --prefix`/lib/gdalplugins
+  fi
+fi
+
+echo "$as_me:$LINENO: result: using $AUTOLOAD_DIR as GDAL shared library autoload directory" >&5
+echo "${ECHO_T}using $AUTOLOAD_DIR as GDAL shared library autoload directory" >&6
+AUTOLOAD_DIR=$AUTOLOAD_DIR
+
+
+
+GRASS_SETTING=no
+GRASS_INCLUDE=
+GRASS_GISBASE=
+export GRASS_INCLUDE GRASS_SETTING GRASS_GISBASE
+
+
+# Check whether --with-grass or --without-grass was given.
+if test "${with_grass+set}" = set; then
+  withval="$with_grass"
+
+fi;
+
+if test "$with_grass" = "no" ; then
+  { { echo "$as_me:$LINENO: error: grass required for this driver, please install GRASS 5.7 and rebuild" >&5
+echo "$as_me: error: grass required for this driver, please install GRASS 5.7 and rebuild" >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+if test "$with_grass" != "yes" ; then
+
+
+echo "$as_me:$LINENO: checking for G_asprintf in -lgrass_gis" >&5
+echo $ECHO_N "checking for G_asprintf in -lgrass_gis... $ECHO_C" >&6
+if test "${ac_cv_lib_grass_gis_G_asprintf+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lgrass_gis -L$with_grass/lib -lgrass_datetime -lgrass_gproj -lgrass_vect $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 gcc2 internal prototype to avoid an error.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+   builtin and then its argument prototype would still apply.  */
+char G_asprintf ();
+int
+main ()
+{
+G_asprintf ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&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); } &&
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest$ac_exeext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_lib_grass_gis_G_asprintf=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_lib_grass_gis_G_asprintf=no
+fi
+rm -f conftest.err conftest.$ac_objext \
+      conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:$LINENO: result: $ac_cv_lib_grass_gis_G_asprintf" >&5
+echo "${ECHO_T}$ac_cv_lib_grass_gis_G_asprintf" >&6
+if test $ac_cv_lib_grass_gis_G_asprintf = yes; then
+  GRASS_SETTING=grass57+
+else
+  GRASS_SETTING=no
+fi
+
+
+  if test "$GRASS_SETTING" = "grass57+" ; then
+    LIBS="-L$with_grass/lib -lgrass_I -lgrass_vask -lgrass_gmath -lgrass_gis -lgrass_datetime -lgrass_gproj -lgrass_vect -lgrass_dbmibase -lgrass_dbmiclient $LIBS"
+    GRASS_INCLUDE="-I$with_grass/include"
+    GRASS_GISBASE="$with_grass"
+  else
+    { { echo "$as_me:$LINENO: error: --with-grass=$with_grass requested, but libraries not found!" >&5
+echo "$as_me: error: --with-grass=$with_grass requested, but libraries not found!" >&2;}
+   { (exit 1); exit 1; }; }
+  fi
+fi
+
+GRASS_INCLUDE=$GRASS_INCLUDE
+
+GRASS_GISBASE=$GRASS_GISBASE
+
+
+
+rm -f conftest*
+
+          ac_config_files="$ac_config_files Makefile"
+
+
+test "x$prefix" = xNONE && prefix=$ac_default_prefix
+# Let make expand exec_prefix.
+test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
+
+# VPATH may cause trouble with some makes, so we remove $(srcdir),
+# ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and
+# trailing colons and then remove the whole line if VPATH becomes empty
+# (actually we leave an empty line to preserve line numbers).
+if test "x$srcdir" = x.; then
+  ac_vpsub='/^[	 ]*VPATH[	 ]*=/{
+s/:*\$(srcdir):*/:/;
+s/:*\${srcdir}:*/:/;
+s/:*@srcdir@:*/:/;
+s/^\([^=]*=[	 ]*\):*/\1/;
+s/:*$//;
+s/^[^=]*=[	 ]*$//;
+}'
+fi
+
+# Transform confdefs.h into DEFS.
+# Protect against shell expansion while executing Makefile rules.
+# Protect against Makefile macro expansion.
+#
+# If the first sed substitution is executed (which looks for macros that
+# take arguments), then we branch to the quote section.  Otherwise,
+# look for a macro that doesn't take arguments.
+cat >confdef2opt.sed <<\_ACEOF
+t clear
+: clear
+s,^[	 ]*#[	 ]*define[	 ][	 ]*\([^	 (][^	 (]*([^)]*)\)[	 ]*\(.*\),-D\1=\2,g
+t quote
+s,^[	 ]*#[	 ]*define[	 ][	 ]*\([^	 ][^	 ]*\)[	 ]*\(.*\),-D\1=\2,g
+t quote
+d
+: quote
+s,[	 `~#$^&*(){}\\|;'"<>?],\\&,g
+s,\[,\\&,g
+s,\],\\&,g
+s,\$,$$,g
+p
+_ACEOF
+# We use echo to avoid assuming a particular line-breaking character.
+# The extra dot is to prevent the shell from consuming trailing
+# line-breaks from the sub-command output.  A line-break within
+# single-quotes doesn't work because, if this script is created in a
+# platform that uses two characters for line-breaks (e.g., DOS), tr
+# would break.
+ac_LF_and_DOT=`echo; echo .`
+DEFS=`sed -n -f confdef2opt.sed confdefs.h | tr "$ac_LF_and_DOT" ' .'`
+rm -f confdef2opt.sed
+
+
+ac_libobjs=
+ac_ltlibobjs=
+for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue
+  # 1. Remove the extension, and $U if already installed.
+  ac_i=`echo "$ac_i" |
+	 sed 's/\$U\././;s/\.o$//;s/\.obj$//'`
+  # 2. Add them.
+  ac_libobjs="$ac_libobjs $ac_i\$U.$ac_objext"
+  ac_ltlibobjs="$ac_ltlibobjs $ac_i"'$U.lo'
+done
+LIBOBJS=$ac_libobjs
+
+LTLIBOBJS=$ac_ltlibobjs
+
+
+
+: ${CONFIG_STATUS=./config.status}
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files $CONFIG_STATUS"
+{ echo "$as_me:$LINENO: creating $CONFIG_STATUS" >&5
+echo "$as_me: creating $CONFIG_STATUS" >&6;}
+cat >$CONFIG_STATUS <<_ACEOF
+#! $SHELL
+# Generated by $as_me.
+# Run this file to recreate the current configuration.
+# Compiler output produced by configure, useful for debugging
+# configure, is in config.log if it exists.
+
+debug=false
+ac_cs_recheck=false
+ac_cs_silent=false
+SHELL=\${CONFIG_SHELL-$SHELL}
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+## --------------------- ##
+## M4sh Initialization.  ##
+## --------------------- ##
+
+# Be Bourne compatible
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+  emulate sh
+  NULLCMD=:
+  # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '${1+"$@"}'='"$@"'
+elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then
+  set -o posix
+fi
+DUALCASE=1; export DUALCASE # for MKS sh
+
+# Support unset when possible.
+if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
+  as_unset=unset
+else
+  as_unset=false
+fi
+
+
+# Work around bugs in pre-3.0 UWIN ksh.
+$as_unset ENV MAIL MAILPATH
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+for as_var in \
+  LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \
+  LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \
+  LC_TELEPHONE LC_TIME
+do
+  if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then
+    eval $as_var=C; export $as_var
+  else
+    $as_unset $as_var
+  fi
+done
+
+# Required to use basename.
+if expr a : '\(a\)' >/dev/null 2>&1; then
+  as_expr=expr
+else
+  as_expr=false
+fi
+
+if (basename /) >/dev/null 2>&1 && test "X`basename / 2>&1`" = "X/"; then
+  as_basename=basename
+else
+  as_basename=false
+fi
+
+
+# Name of the executable.
+as_me=`$as_basename "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+	 X"$0" : 'X\(//\)$' \| \
+	 X"$0" : 'X\(/\)$' \| \
+	 .     : '\(.\)' 2>/dev/null ||
+echo X/"$0" |
+    sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; }
+  	  /^X\/\(\/\/\)$/{ s//\1/; q; }
+  	  /^X\/\(\/\).*/{ s//\1/; q; }
+  	  s/.*/./; q'`
+
+
+# PATH needs CR, and LINENO needs CR and PATH.
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+  echo "#! /bin/sh" >conf$$.sh
+  echo  "exit 0"   >>conf$$.sh
+  chmod +x conf$$.sh
+  if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then
+    PATH_SEPARATOR=';'
+  else
+    PATH_SEPARATOR=:
+  fi
+  rm -f conf$$.sh
+fi
+
+
+  as_lineno_1=$LINENO
+  as_lineno_2=$LINENO
+  as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`
+  test "x$as_lineno_1" != "x$as_lineno_2" &&
+  test "x$as_lineno_3"  = "x$as_lineno_2"  || {
+  # Find who we are.  Look in the path if we contain no path at all
+  # relative or not.
+  case $0 in
+    *[\\/]* ) as_myself=$0 ;;
+    *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+done
+
+       ;;
+  esac
+  # We did not find ourselves, most probably we were run as `sh COMMAND'
+  # in which case we are not to be found in the path.
+  if test "x$as_myself" = x; then
+    as_myself=$0
+  fi
+  if test ! -f "$as_myself"; then
+    { { echo "$as_me:$LINENO: error: cannot find myself; rerun with an absolute path" >&5
+echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2;}
+   { (exit 1); exit 1; }; }
+  fi
+  case $CONFIG_SHELL in
+  '')
+    as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for as_base in sh bash ksh sh5; do
+	 case $as_dir in
+	 /*)
+	   if ("$as_dir/$as_base" -c '
+  as_lineno_1=$LINENO
+  as_lineno_2=$LINENO
+  as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`
+  test "x$as_lineno_1" != "x$as_lineno_2" &&
+  test "x$as_lineno_3"  = "x$as_lineno_2" ') 2>/dev/null; then
+	     $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; }
+	     $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; }
+	     CONFIG_SHELL=$as_dir/$as_base
+	     export CONFIG_SHELL
+	     exec "$CONFIG_SHELL" "$0" ${1+"$@"}
+	   fi;;
+	 esac
+       done
+done
+;;
+  esac
+
+  # Create $as_me.lineno as a copy of $as_myself, but with $LINENO
+  # uniformly replaced by the line number.  The first 'sed' inserts a
+  # line-number line before each line; the second 'sed' does the real
+  # work.  The second script uses 'N' to pair each line-number line
+  # with the numbered line, and appends trailing '-' during
+  # substitution so that $LINENO is not a special case at line end.
+  # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the
+  # second 'sed' script.  Blame Lee E. McMahon for sed's syntax.  :-)
+  sed '=' <$as_myself |
+    sed '
+      N
+      s,$,-,
+      : loop
+      s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3,
+      t loop
+      s,-$,,
+      s,^['$as_cr_digits']*\n,,
+    ' >$as_me.lineno &&
+  chmod +x $as_me.lineno ||
+    { { echo "$as_me:$LINENO: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&5
+echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2;}
+   { (exit 1); exit 1; }; }
+
+  # Don't try to exec as it changes $[0], causing all sort of problems
+  # (the dirname of $[0] is not the place where we might find the
+  # original and so on.  Autoconf is especially sensible to this).
+  . ./$as_me.lineno
+  # Exit status is that of the last command.
+  exit
+}
+
+
+case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in
+  *c*,-n*) ECHO_N= ECHO_C='
+' ECHO_T='	' ;;
+  *c*,*  ) ECHO_N=-n ECHO_C= ECHO_T= ;;
+  *)       ECHO_N= ECHO_C='\c' ECHO_T= ;;
+esac
+
+if expr a : '\(a\)' >/dev/null 2>&1; then
+  as_expr=expr
+else
+  as_expr=false
+fi
+
+rm -f conf$$ conf$$.exe conf$$.file
+echo >conf$$.file
+if ln -s conf$$.file conf$$ 2>/dev/null; then
+  # We could just check for DJGPP; but this test a) works b) is more generic
+  # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04).
+  if test -f conf$$.exe; then
+    # Don't use ln at all; we don't have any links
+    as_ln_s='cp -p'
+  else
+    as_ln_s='ln -s'
+  fi
+elif ln conf$$.file conf$$ 2>/dev/null; then
+  as_ln_s=ln
+else
+  as_ln_s='cp -p'
+fi
+rm -f conf$$ conf$$.exe conf$$.file
+
+if mkdir -p . 2>/dev/null; then
+  as_mkdir_p=:
+else
+  test -d ./-p && rmdir ./-p
+  as_mkdir_p=false
+fi
+
+as_executable_p="test -f"
+
+# 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'"
+
+
+# IFS
+# We need space, tab and new line, in precisely that order.
+as_nl='
+'
+IFS=" 	$as_nl"
+
+# CDPATH.
+$as_unset CDPATH
+
+exec 6>&1
+
+# Open the log real soon, to keep \$[0] and so on meaningful, and to
+# report actual input values of CONFIG_FILES etc. instead of their
+# values after options handling.  Logging --version etc. is OK.
+exec 5>>config.log
+{
+  echo
+  sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX
+## Running $as_me. ##
+_ASBOX
+} >&5
+cat >&5 <<_CSEOF
+
+This file was extended by $as_me, which was
+generated by GNU Autoconf 2.59.  Invocation command line was
+
+  CONFIG_FILES    = $CONFIG_FILES
+  CONFIG_HEADERS  = $CONFIG_HEADERS
+  CONFIG_LINKS    = $CONFIG_LINKS
+  CONFIG_COMMANDS = $CONFIG_COMMANDS
+  $ $0 $@
+
+_CSEOF
+echo "on `(hostname || uname -n) 2>/dev/null | sed 1q`" >&5
+echo >&5
+_ACEOF
+
+# Files that config.status was made for.
+if test -n "$ac_config_files"; then
+  echo "config_files=\"$ac_config_files\"" >>$CONFIG_STATUS
+fi
+
+if test -n "$ac_config_headers"; then
+  echo "config_headers=\"$ac_config_headers\"" >>$CONFIG_STATUS
+fi
+
+if test -n "$ac_config_links"; then
+  echo "config_links=\"$ac_config_links\"" >>$CONFIG_STATUS
+fi
+
+if test -n "$ac_config_commands"; then
+  echo "config_commands=\"$ac_config_commands\"" >>$CONFIG_STATUS
+fi
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+
+ac_cs_usage="\
+\`$as_me' instantiates files from templates according to the
+current configuration.
+
+Usage: $0 [OPTIONS] [FILE]...
+
+  -h, --help       print this help, then exit
+  -V, --version    print version number, then exit
+  -q, --quiet      do not print progress messages
+  -d, --debug      don't remove temporary files
+      --recheck    update $as_me by reconfiguring in the same conditions
+  --file=FILE[:TEMPLATE]
+		   instantiate the configuration file FILE
+
+Configuration files:
+$config_files
+
+Report bugs to <bug-autoconf at gnu.org>."
+_ACEOF
+
+cat >>$CONFIG_STATUS <<_ACEOF
+ac_cs_version="\\
+config.status
+configured by $0, generated by GNU Autoconf 2.59,
+  with options \\"`echo "$ac_configure_args" | sed 's/[\\""\`\$]/\\\\&/g'`\\"
+
+Copyright (C) 2003 Free Software Foundation, Inc.
+This config.status script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it."
+srcdir=$srcdir
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+# If no file are specified by the user, then we need to provide default
+# value.  By we need to know if files were specified by the user.
+ac_need_defaults=:
+while test $# != 0
+do
+  case $1 in
+  --*=*)
+    ac_option=`expr "x$1" : 'x\([^=]*\)='`
+    ac_optarg=`expr "x$1" : 'x[^=]*=\(.*\)'`
+    ac_shift=:
+    ;;
+  -*)
+    ac_option=$1
+    ac_optarg=$2
+    ac_shift=shift
+    ;;
+  *) # This is not an option, so the user has probably given explicit
+     # arguments.
+     ac_option=$1
+     ac_need_defaults=false;;
+  esac
+
+  case $ac_option in
+  # Handling of the options.
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF
+  -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
+    ac_cs_recheck=: ;;
+  --version | --vers* | -V )
+    echo "$ac_cs_version"; exit 0 ;;
+  --he | --h)
+    # Conflict between --help and --header
+    { { echo "$as_me:$LINENO: error: ambiguous option: $1
+Try \`$0 --help' for more information." >&5
+echo "$as_me: error: ambiguous option: $1
+Try \`$0 --help' for more information." >&2;}
+   { (exit 1); exit 1; }; };;
+  --help | --hel | -h )
+    echo "$ac_cs_usage"; exit 0 ;;
+  --debug | --d* | -d )
+    debug=: ;;
+  --file | --fil | --fi | --f )
+    $ac_shift
+    CONFIG_FILES="$CONFIG_FILES $ac_optarg"
+    ac_need_defaults=false;;
+  --header | --heade | --head | --hea )
+    $ac_shift
+    CONFIG_HEADERS="$CONFIG_HEADERS $ac_optarg"
+    ac_need_defaults=false;;
+  -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+  | -silent | --silent | --silen | --sile | --sil | --si | --s)
+    ac_cs_silent=: ;;
+
+  # This is an error.
+  -*) { { echo "$as_me:$LINENO: error: unrecognized option: $1
+Try \`$0 --help' for more information." >&5
+echo "$as_me: error: unrecognized option: $1
+Try \`$0 --help' for more information." >&2;}
+   { (exit 1); exit 1; }; } ;;
+
+  *) ac_config_targets="$ac_config_targets $1" ;;
+
+  esac
+  shift
+done
+
+ac_configure_extra_args=
+
+if $ac_cs_silent; then
+  exec 6>/dev/null
+  ac_configure_extra_args="$ac_configure_extra_args --silent"
+fi
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF
+if \$ac_cs_recheck; then
+  echo "running $SHELL $0 " $ac_configure_args \$ac_configure_extra_args " --no-create --no-recursion" >&6
+  exec $SHELL $0 $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion
+fi
+
+_ACEOF
+
+
+
+
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+for ac_config_target in $ac_config_targets
+do
+  case "$ac_config_target" in
+  # Handling of arguments.
+  "Makefile" ) CONFIG_FILES="$CONFIG_FILES Makefile" ;;
+  *) { { echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5
+echo "$as_me: error: invalid argument: $ac_config_target" >&2;}
+   { (exit 1); exit 1; }; };;
+  esac
+done
+
+# If the user did not use the arguments to specify the items to instantiate,
+# then the envvar interface is used.  Set only those that are not.
+# We use the long form for the default assignment because of an extremely
+# bizarre bug on SunOS 4.1.3.
+if $ac_need_defaults; then
+  test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files
+fi
+
+# Have a temporary directory for convenience.  Make it in the build tree
+# simply because there is no reason to put it here, and in addition,
+# creating and moving files from /tmp can sometimes cause problems.
+# Create a temporary directory, and hook for its removal unless debugging.
+$debug ||
+{
+  trap 'exit_status=$?; rm -rf $tmp && exit $exit_status' 0
+  trap '{ (exit 1); exit 1; }' 1 2 13 15
+}
+
+# Create a (secure) tmp directory for tmp files.
+
+{
+  tmp=`(umask 077 && mktemp -d -q "./confstatXXXXXX") 2>/dev/null` &&
+  test -n "$tmp" && test -d "$tmp"
+}  ||
+{
+  tmp=./confstat$$-$RANDOM
+  (umask 077 && mkdir $tmp)
+} ||
+{
+   echo "$me: cannot create a temporary directory in ." >&2
+   { (exit 1); exit 1; }
+}
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<_ACEOF
+
+#
+# CONFIG_FILES section.
+#
+
+# No need to generate the scripts if there are no CONFIG_FILES.
+# This happens for instance when ./config.status config.h
+if test -n "\$CONFIG_FILES"; then
+  # Protect against being on the right side of a sed subst in config.status.
+  sed 's/,@/@@/; s/@,/@@/; s/,;t t\$/@;t t/; /@;t t\$/s/[\\\\&,]/\\\\&/g;
+   s/@@/,@/; s/@@/@,/; s/@;t t\$/,;t t/' >\$tmp/subs.sed <<\\CEOF
+s, at SHELL@,$SHELL,;t t
+s, at PATH_SEPARATOR@,$PATH_SEPARATOR,;t t
+s, at PACKAGE_NAME@,$PACKAGE_NAME,;t t
+s, at PACKAGE_TARNAME@,$PACKAGE_TARNAME,;t t
+s, at PACKAGE_VERSION@,$PACKAGE_VERSION,;t t
+s, at PACKAGE_STRING@,$PACKAGE_STRING,;t t
+s, at PACKAGE_BUGREPORT@,$PACKAGE_BUGREPORT,;t t
+s, at exec_prefix@,$exec_prefix,;t t
+s, at prefix@,$prefix,;t t
+s, at program_transform_name@,$program_transform_name,;t t
+s, at bindir@,$bindir,;t t
+s, at sbindir@,$sbindir,;t t
+s, at libexecdir@,$libexecdir,;t t
+s, at datadir@,$datadir,;t t
+s, at sysconfdir@,$sysconfdir,;t t
+s, at sharedstatedir@,$sharedstatedir,;t t
+s, at localstatedir@,$localstatedir,;t t
+s, at libdir@,$libdir,;t t
+s, at includedir@,$includedir,;t t
+s, at oldincludedir@,$oldincludedir,;t t
+s, at infodir@,$infodir,;t t
+s, at mandir@,$mandir,;t t
+s, at build_alias@,$build_alias,;t t
+s, at host_alias@,$host_alias,;t t
+s, at target_alias@,$target_alias,;t t
+s, at DEFS@,$DEFS,;t t
+s, at ECHO_C@,$ECHO_C,;t t
+s, at ECHO_N@,$ECHO_N,;t t
+s, at ECHO_T@,$ECHO_T,;t t
+s, at LIBS@,$LIBS,;t t
+s, at CC@,$CC,;t t
+s, at CFLAGS@,$CFLAGS,;t t
+s, at LDFLAGS@,$LDFLAGS,;t t
+s, at CPPFLAGS@,$CPPFLAGS,;t t
+s, at ac_ct_CC@,$ac_ct_CC,;t t
+s, at EXEEXT@,$EXEEXT,;t t
+s, at OBJEXT@,$OBJEXT,;t t
+s, at CXX@,$CXX,;t t
+s, at CXXFLAGS@,$CXXFLAGS,;t t
+s, at ac_ct_CXX@,$ac_ct_CXX,;t t
+s, at RANLIB@,$RANLIB,;t t
+s, at ac_ct_RANLIB@,$ac_ct_RANLIB,;t t
+s, at CXX_PIC@,$CXX_PIC,;t t
+s, at C_PIC@,$C_PIC,;t t
+s, at LD_SHARED@,$LD_SHARED,;t t
+s, at SO_EXT@,$SO_EXT,;t t
+s, at CXX_WFLAGS@,$CXX_WFLAGS,;t t
+s, at C_WFLAGS@,$C_WFLAGS,;t t
+s, at GDAL_CONFIG@,$GDAL_CONFIG,;t t
+s, at GDAL_INC@,$GDAL_INC,;t t
+s, at AUTOLOAD_DIR@,$AUTOLOAD_DIR,;t t
+s, at GRASS_INCLUDE@,$GRASS_INCLUDE,;t t
+s, at GRASS_GISBASE@,$GRASS_GISBASE,;t t
+s, at LIBOBJS@,$LIBOBJS,;t t
+s, at LTLIBOBJS@,$LTLIBOBJS,;t t
+CEOF
+
+_ACEOF
+
+  cat >>$CONFIG_STATUS <<\_ACEOF
+  # Split the substitutions into bite-sized pieces for seds with
+  # small command number limits, like on Digital OSF/1 and HP-UX.
+  ac_max_sed_lines=48
+  ac_sed_frag=1 # Number of current file.
+  ac_beg=1 # First line for current file.
+  ac_end=$ac_max_sed_lines # Line after last line for current file.
+  ac_more_lines=:
+  ac_sed_cmds=
+  while $ac_more_lines; do
+    if test $ac_beg -gt 1; then
+      sed "1,${ac_beg}d; ${ac_end}q" $tmp/subs.sed >$tmp/subs.frag
+    else
+      sed "${ac_end}q" $tmp/subs.sed >$tmp/subs.frag
+    fi
+    if test ! -s $tmp/subs.frag; then
+      ac_more_lines=false
+    else
+      # The purpose of the label and of the branching condition is to
+      # speed up the sed processing (if there are no `@' at all, there
+      # is no need to browse any of the substitutions).
+      # These are the two extra sed commands mentioned above.
+      (echo ':t
+  /@[a-zA-Z_][a-zA-Z_0-9]*@/!b' && cat $tmp/subs.frag) >$tmp/subs-$ac_sed_frag.sed
+      if test -z "$ac_sed_cmds"; then
+	ac_sed_cmds="sed -f $tmp/subs-$ac_sed_frag.sed"
+      else
+	ac_sed_cmds="$ac_sed_cmds | sed -f $tmp/subs-$ac_sed_frag.sed"
+      fi
+      ac_sed_frag=`expr $ac_sed_frag + 1`
+      ac_beg=$ac_end
+      ac_end=`expr $ac_end + $ac_max_sed_lines`
+    fi
+  done
+  if test -z "$ac_sed_cmds"; then
+    ac_sed_cmds=cat
+  fi
+fi # test -n "$CONFIG_FILES"
+
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF
+for ac_file in : $CONFIG_FILES; do test "x$ac_file" = x: && continue
+  # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
+  case $ac_file in
+  - | *:- | *:-:* ) # input from stdin
+	cat >$tmp/stdin
+	ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
+	ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
+  *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
+	ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
+  * )   ac_file_in=$ac_file.in ;;
+  esac
+
+  # Compute @srcdir@, @top_srcdir@, and @INSTALL@ for subdirectories.
+  ac_dir=`(dirname "$ac_file") 2>/dev/null ||
+$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$ac_file" : 'X\(//\)[^/]' \| \
+	 X"$ac_file" : 'X\(//\)$' \| \
+	 X"$ac_file" : 'X\(/\)' \| \
+	 .     : '\(.\)' 2>/dev/null ||
+echo X"$ac_file" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+  	  /^X\(\/\/\)$/{ s//\1/; q; }
+  	  /^X\(\/\).*/{ s//\1/; q; }
+  	  s/.*/./; q'`
+  { if $as_mkdir_p; then
+    mkdir -p "$ac_dir"
+  else
+    as_dir="$ac_dir"
+    as_dirs=
+    while test ! -d "$as_dir"; do
+      as_dirs="$as_dir $as_dirs"
+      as_dir=`(dirname "$as_dir") 2>/dev/null ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$as_dir" : 'X\(//\)[^/]' \| \
+	 X"$as_dir" : 'X\(//\)$' \| \
+	 X"$as_dir" : 'X\(/\)' \| \
+	 .     : '\(.\)' 2>/dev/null ||
+echo X"$as_dir" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+  	  /^X\(\/\/\)$/{ s//\1/; q; }
+  	  /^X\(\/\).*/{ s//\1/; q; }
+  	  s/.*/./; q'`
+    done
+    test ! -n "$as_dirs" || mkdir $as_dirs
+  fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5
+echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;}
+   { (exit 1); exit 1; }; }; }
+
+  ac_builddir=.
+
+if test "$ac_dir" != .; then
+  ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'`
+  # A "../" for each directory in $ac_dir_suffix.
+  ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'`
+else
+  ac_dir_suffix= ac_top_builddir=
+fi
+
+case $srcdir in
+  .)  # No --srcdir option.  We are building in place.
+    ac_srcdir=.
+    if test -z "$ac_top_builddir"; then
+       ac_top_srcdir=.
+    else
+       ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'`
+    fi ;;
+  [\\/]* | ?:[\\/]* )  # Absolute path.
+    ac_srcdir=$srcdir$ac_dir_suffix;
+    ac_top_srcdir=$srcdir ;;
+  *) # Relative path.
+    ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix
+    ac_top_srcdir=$ac_top_builddir$srcdir ;;
+esac
+
+# Do not use `cd foo && pwd` to compute absolute paths, because
+# the directories may not exist.
+case `pwd` in
+.) ac_abs_builddir="$ac_dir";;
+*)
+  case "$ac_dir" in
+  .) ac_abs_builddir=`pwd`;;
+  [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";;
+  *) ac_abs_builddir=`pwd`/"$ac_dir";;
+  esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_top_builddir=${ac_top_builddir}.;;
+*)
+  case ${ac_top_builddir}. in
+  .) ac_abs_top_builddir=$ac_abs_builddir;;
+  [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;;
+  *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;;
+  esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_srcdir=$ac_srcdir;;
+*)
+  case $ac_srcdir in
+  .) ac_abs_srcdir=$ac_abs_builddir;;
+  [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;;
+  *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;;
+  esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_top_srcdir=$ac_top_srcdir;;
+*)
+  case $ac_top_srcdir in
+  .) ac_abs_top_srcdir=$ac_abs_builddir;;
+  [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;;
+  *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;;
+  esac;;
+esac
+
+
+
+  if test x"$ac_file" != x-; then
+    { echo "$as_me:$LINENO: creating $ac_file" >&5
+echo "$as_me: creating $ac_file" >&6;}
+    rm -f "$ac_file"
+  fi
+  # Let's still pretend it is `configure' which instantiates (i.e., don't
+  # use $as_me), people would be surprised to read:
+  #    /* config.h.  Generated by config.status.  */
+  if test x"$ac_file" = x-; then
+    configure_input=
+  else
+    configure_input="$ac_file.  "
+  fi
+  configure_input=$configure_input"Generated from `echo $ac_file_in |
+				     sed 's,.*/,,'` by configure."
+
+  # First look for the input files in the build tree, otherwise in the
+  # src tree.
+  ac_file_inputs=`IFS=:
+    for f in $ac_file_in; do
+      case $f in
+      -) echo $tmp/stdin ;;
+      [\\/$]*)
+	 # Absolute (can't be DOS-style, as IFS=:)
+	 test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5
+echo "$as_me: error: cannot find input file: $f" >&2;}
+   { (exit 1); exit 1; }; }
+	 echo "$f";;
+      *) # Relative
+	 if test -f "$f"; then
+	   # Build tree
+	   echo "$f"
+	 elif test -f "$srcdir/$f"; then
+	   # Source tree
+	   echo "$srcdir/$f"
+	 else
+	   # /dev/null tree
+	   { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5
+echo "$as_me: error: cannot find input file: $f" >&2;}
+   { (exit 1); exit 1; }; }
+	 fi;;
+      esac
+    done` || { (exit 1); exit 1; }
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF
+  sed "$ac_vpsub
+$extrasub
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF
+:t
+/@[a-zA-Z_][a-zA-Z_0-9]*@/!b
+s, at configure_input@,$configure_input,;t t
+s, at srcdir@,$ac_srcdir,;t t
+s, at abs_srcdir@,$ac_abs_srcdir,;t t
+s, at top_srcdir@,$ac_top_srcdir,;t t
+s, at abs_top_srcdir@,$ac_abs_top_srcdir,;t t
+s, at builddir@,$ac_builddir,;t t
+s, at abs_builddir@,$ac_abs_builddir,;t t
+s, at top_builddir@,$ac_top_builddir,;t t
+s, at abs_top_builddir@,$ac_abs_top_builddir,;t t
+" $ac_file_inputs | (eval "$ac_sed_cmds") >$tmp/out
+  rm -f $tmp/stdin
+  if test x"$ac_file" != x-; then
+    mv $tmp/out $ac_file
+  else
+    cat $tmp/out
+    rm -f $tmp/out
+  fi
+
+done
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+
+{ (exit 0); exit 0; }
+_ACEOF
+chmod +x $CONFIG_STATUS
+ac_clean_files=$ac_clean_files_save
+
+
+# configure is writing to config.log, and then calls config.status.
+# config.status does its own redirection, appending to config.log.
+# Unfortunately, on DOS this fails, as config.log is still kept open
+# by configure, so config.status won't be able to write to it; its
+# output is simply discarded.  So we exec the FD to /dev/null,
+# effectively closing config.log, so it can be properly (re)opened and
+# appended to by config.status.  When coming back to configure, we
+# need to make the FD available again.
+if test "$no_create" != yes; then
+  ac_cs_success=:
+  ac_config_status_args=
+  test "$silent" = yes &&
+    ac_config_status_args="$ac_config_status_args --quiet"
+  exec 5>/dev/null
+  $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false
+  exec 5>>config.log
+  # Use ||, not &&, to avoid exiting from the if with $? = 1, which
+  # would make configure fail if this is the last instruction.
+  $ac_cs_success || { (exit 1); exit 1; }
+fi
+
+
+
+


Property changes on: packages/gdal-grass/trunk/configure
___________________________________________________________________
Name: svn:executable
   + 

Added: packages/gdal-grass/trunk/configure.in
===================================================================
--- packages/gdal-grass/trunk/configure.in	2006-08-23 16:55:12 UTC (rev 539)
+++ packages/gdal-grass/trunk/configure.in	2006-08-23 16:55:51 UTC (rev 540)
@@ -0,0 +1,147 @@
+dnl ***************************************************************************
+dnl $Id: configure.in,v 1.8 2006/04/04 02:54:27 fwarmerdam Exp $
+dnl
+dnl Project:  GDAL GRASS Plugin
+dnl Purpose:  Configure source file.
+dnl Author:   Frank Warmerdam, warmerdam at pobox.com
+dnl
+dnl ***************************************************************************
+dnl Copyright (c) 2005, Frank Warmerdam
+dnl
+dnl Permission is hereby granted, free of charge, to any person obtaining a
+dnl copy of this software and associated documentation files (the "Software"),
+dnl to deal in the Software without restriction, including without limitation
+dnl the rights to use, copy, modify, merge, publish, distribute, sublicense,
+dnl and/or sell copies of the Software, and to permit persons to whom the
+dnl Software is furnished to do so, subject to the following conditions:
+dnl
+dnl The above copyright notice and this permission notice shall be included
+dnl in all copies or substantial portions of the Software.
+dnl
+dnl THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+dnl OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+dnl FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+dnl THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+dnl LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+dnl FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+dnl DEALINGS IN THE SOFTWARE.
+dnl ***************************************************************************
+
+dnl Disable configure caching ... it causes lots of hassles.
+define([AC_CACHE_LOAD], )
+define([AC_CACHE_SAVE], )
+
+dnl Process this file with autoconf to produce a configure script.
+AC_INIT(Makefile.in)
+
+dnl We require autoconf 2.52+ for libtool support on cygwin/mingw hosts
+AC_PREREQ(2.52)
+
+dnl Checks for programs.
+AC_PROG_CC
+AC_PROG_CXX
+
+AC_PROG_RANLIB
+AC_COMPILER_PIC
+AC_LD_SHARED
+AC_COMPILER_WFLAGS
+
+dnl ---------------------------------------------------------------------------
+dnl Find GDAL
+dnl ---------------------------------------------------------------------------
+
+AC_ARG_WITH(gdal,
+[  --with-gdal[=PATH]        GDAL (PATH is path to gdal-config)],,)
+
+if test "$with_gdal" = "yes" -o "$with_gdal" = "" ; then
+
+  if test "`basename xx/$with_gdal`" = "gdal-config" ; then
+    GDAL_CONFIG="$with_gdal"
+  fi
+
+  if test -z "$GDAL_CONFIG" ; then
+    AC_PATH_PROG(GDAL_CONFIG, gdal-config, no)
+  fi
+
+  if test "$GDAL_CONFIG" = "no" ; then
+    AC_MSG_ERROR([couldn't find gdal-config])
+  fi
+
+elif test -n "$with_gdal" -a "$with_gdal" != "no" ; then
+
+  GDAL_CONFIG=$with_gdal
+
+  if test -f "$GDAL_CONFIG" -a -x "$GDAL_CONFIG" ; then
+    AC_MSG_RESULT([user supplied gdal-config ($GDAL_CONFIG)])
+  else
+    AC_MSG_ERROR(['$GDAL_CONFIG' is not an executable.  Make sure you use --with-gdal=/path/to/gdal-config])
+  fi
+
+else
+
+  AC_MSG_ERROR([gdal required to build GDAL GRASS 5.7 driver])
+
+fi
+
+LIBS="`$GDAL_CONFIG --libs` $LIBS"
+GDAL_INC=`$GDAL_CONFIG --cflags`
+
+AC_SUBST(GDAL_INC,    $GDAL_INC)
+
+dnl ---------------------------------------------------------------------------
+dnl Where to put driver?
+dnl ---------------------------------------------------------------------------
+AC_ARG_WITH(autoload,[  --with-autoload[=DIR]      Directory for autoload drivers],,)
+
+if test "$with_autoload" != "" ; then
+  AUTOLOAD_DIR=$with_autoload
+else
+  if $GDAL_CONFIG --autoload > /dev/null 2>&1 ; then
+    AUTOLOAD_DIR=`$GDAL_CONFIG --autoload`
+  else
+    AUTOLOAD_DIR=`$GDAL_CONFIG --prefix`/lib/gdalplugins
+  fi
+fi
+
+AC_MSG_RESULT(using $AUTOLOAD_DIR as GDAL shared library autoload directory)
+AC_SUBST(AUTOLOAD_DIR,$AUTOLOAD_DIR)
+
+dnl ---------------------------------------------------------------------------
+dnl Find GRASS 5.7
+dnl ---------------------------------------------------------------------------
+
+GRASS_SETTING=no
+GRASS_INCLUDE=
+GRASS_GISBASE=
+export GRASS_INCLUDE GRASS_SETTING GRASS_GISBASE
+
+AC_ARG_WITH(grass,[  --with-grass[=ARG]        Include GRASS support (ARG=GRASS install tree dir)],,)
+
+if test "$with_grass" = "no" ; then
+  AC_MSG_ERROR([grass required for this driver, please install GRASS 5.7 and rebuild])
+fi
+
+if test "$with_grass" != "yes" ; then
+
+  AC_CHECK_LIB(grass_gis,G_asprintf,GRASS_SETTING=grass57+,GRASS_SETTING=no,-L$with_grass/lib -lgrass_datetime -lgrass_gproj -lgrass_vect)
+   
+  if test "$GRASS_SETTING" = "grass57+" ; then   
+    LIBS="-L$with_grass/lib -lgrass_I -lgrass_vask -lgrass_gmath -lgrass_gis -lgrass_datetime -lgrass_gproj -lgrass_vect -lgrass_dbmibase -lgrass_dbmiclient $LIBS"
+    GRASS_INCLUDE="-I$with_grass/include"
+    GRASS_GISBASE="$with_grass"
+  else
+    AC_MSG_ERROR([--with-grass=$with_grass requested, but libraries not found!])
+  fi
+fi
+
+AC_SUBST(GRASS_INCLUDE,$GRASS_INCLUDE)
+AC_SUBST(GRASS_GISBASE,$GRASS_GISBASE)
+
+dnl ---------------------------------------------------------------------------
+
+rm -f conftest*
+
+AC_OUTPUT(Makefile)
+
+
+

Added: packages/gdal-grass/trunk/debian/changelog
===================================================================
--- packages/gdal-grass/trunk/debian/changelog	2006-08-23 16:55:12 UTC (rev 539)
+++ packages/gdal-grass/trunk/debian/changelog	2006-08-23 16:55:51 UTC (rev 540)
@@ -0,0 +1,27 @@
+libgdal-grass (1.3.2-1) unstable; urgency=low
+
+  * New upstream release.
+  * Policy bumped to 3.7.2.
+  * Updated version dependecies for grass.
+  * Rules file revised to manage a now missing DESTDIR proper use in autoconfiscated Makefile :-/
+  * Moved to compatibility level 5 for debhelper and using compat file.
+
+ -- Francesco Paolo Lovergine <frankie at debian.org>  Wed, 23 Aug 2006 15:58:46 +0200
+
+libgdal-grass (1.3.1-1) unstable; urgency=high
+
+  * New upstream release, syncing with libgdal1-1.3.1. Package name changed as consequence.
+    (closes: #348865)
+  * Added me among Uploaders.
+  * Policy bumped to 3.6.2 (no changes)
+  * Changed a bit Makefile.in and reconfingured in place in order to honor DESTDIR.
+  * It needs grass build-dep in order to have available the grass etc dir.
+
+ -- Francesco Paolo Lovergine <frankie at debian.org>  Wed,  1 Feb 2006 22:57:38 +0100
+
+libgdal-grass (1.2.6-1) unstable; urgency=low
+
+  * Initial release (Closes: #248832)
+
+ -- Steve Halasz <debian at adkgis.org>  Mon, 13 Jun 2005 13:00:27 -0400
+

Added: packages/gdal-grass/trunk/debian/compat
===================================================================
--- packages/gdal-grass/trunk/debian/compat	2006-08-23 16:55:12 UTC (rev 539)
+++ packages/gdal-grass/trunk/debian/compat	2006-08-23 16:55:51 UTC (rev 540)
@@ -0,0 +1 @@
+5

Added: packages/gdal-grass/trunk/debian/control
===================================================================
--- packages/gdal-grass/trunk/debian/control	2006-08-23 16:55:12 UTC (rev 539)
+++ packages/gdal-grass/trunk/debian/control	2006-08-23 16:55:51 UTC (rev 540)
@@ -0,0 +1,18 @@
+Source: libgdal-grass
+Section: science
+Priority: extra
+Maintainer: Debian GIS Project <pkg-grass-devel at lists.alioth.debian.org>
+Uploaders: Steve Halasz <debian at adkgis.org>, Silke Reimer <Silke.Reimer at intevation.de>, Francesco Paolo Lovergine <frankie at debian.org>
+Build-Depends: debhelper (>> 4.1.25), d-shlibs, libgdal1-1.3.2-dev, grass-dev (>= 6.0.2-5), grass (>= 6.0.2-5)
+Standards-Version: 3.7.2
+
+Package: libgdal1-1.3.2-grass
+Section: libs
+Architecture: any
+Depends: ${shlibs:Depends}, grass (>= 6.0.2-5)
+Recommends: 
+Description: GRASS extension for the Geospatial Data Abstraction Library
+ GDAL is a translator library for raster geospatial data formats.
+ As a library, it presents a single abstract data model to the
+ calling application for all supported formats. This extension
+ provides access to GRASS raster data via GDAL.

Added: packages/gdal-grass/trunk/debian/copyright
===================================================================
--- packages/gdal-grass/trunk/debian/copyright	2006-08-23 16:55:12 UTC (rev 539)
+++ packages/gdal-grass/trunk/debian/copyright	2006-08-23 16:55:51 UTC (rev 540)
@@ -0,0 +1,34 @@
+
+This package was downloaded from  ftp://ftp.remotesensing.org/pub/gdal/
+
+The gdal-grass tarball is created from the main gdal tarball by doing:
+
+cd gdal-$(VERSION)
+./configure
+cd frmts/grass
+make dist
+
+Upstream Maintainer: Frank Warmerdam <warmerdam at pobox.com>
+
+Copyright:
+
+ Copyright (c) 2000, Frank Warmerdam
+
+ Permission is hereby granted, free of charge, to any person obtaining a
+ copy of this software and associated documentation files (the "Software"),
+ to deal in the Software without restriction, including without limitation
+ the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ and/or sell copies of the Software, and to permit persons to whom the
+ Software is furnished to do so, subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included
+ in all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ DEALINGS IN THE SOFTWARE.
+

Added: packages/gdal-grass/trunk/debian/dirs
===================================================================
--- packages/gdal-grass/trunk/debian/dirs	2006-08-23 16:55:12 UTC (rev 539)
+++ packages/gdal-grass/trunk/debian/dirs	2006-08-23 16:55:51 UTC (rev 540)
@@ -0,0 +1,3 @@
+usr/share
+usr/share/gdal
+usr/lib/gdalplugins

Added: packages/gdal-grass/trunk/debian/rules
===================================================================
--- packages/gdal-grass/trunk/debian/rules	2006-08-23 16:55:12 UTC (rev 539)
+++ packages/gdal-grass/trunk/debian/rules	2006-08-23 16:55:51 UTC (rev 540)
@@ -0,0 +1,60 @@
+#!/usr/bin/make -f
+# -*- makefile -*-
+#
+# debian package by Alessandro Amici 2002-2003.
+# Based on: GNU copyright 1997 to 1999 by Joey Hess.
+
+# Uncomment this to turn on verbose mode.
+#export DH_VERBOSE=1
+
+export PKGNAME=libgdal1-1.3.2-grass
+
+config.status:
+	dh_testdir
+
+	./configure --prefix=/usr --with-grass=/usr/lib/grass --with-autoload=/usr/lib/gdalplugins
+
+build: build-stamp
+build-stamp: config.status
+	dh_testdir
+
+	$(MAKE) 
+
+	touch build-stamp
+
+clean:
+
+	dh_testdir
+	dh_testroot
+
+	-$(MAKE) distclean
+
+	dh_clean build-stamp configure-stamp
+
+install: build
+	dh_testdir
+	dh_testroot
+	dh_clean -k
+	dh_installdirs
+
+	$(MAKE) install AUTOLOAD_DIR=$(CURDIR)/debian/$(PKGNAME)/usr/lib/gdalplugins \
+		        GRASSTABLES_DIR=$(CURDIR)/debian/$(PKGNAME)/usr/share/gdal/grass
+
+binary-arch: build install
+	dh_testdir
+	dh_testroot
+	dh_installdocs
+	dh_installchangelogs
+	dh_link
+	dh_strip
+	dh_compress
+	dh_fixperms
+	dh_makeshlibs
+	dh_installdeb
+	dh_shlibdeps -l.
+	dh_gencontrol
+	dh_md5sums
+	dh_builddeb
+
+binary: binary-arch
+.PHONY: build clean binary-arch binary install


Property changes on: packages/gdal-grass/trunk/debian/rules
___________________________________________________________________
Name: svn:executable
   + 

Added: packages/gdal-grass/trunk/grass57dataset.cpp
===================================================================
--- packages/gdal-grass/trunk/grass57dataset.cpp	2006-08-23 16:55:12 UTC (rev 539)
+++ packages/gdal-grass/trunk/grass57dataset.cpp	2006-08-23 16:55:51 UTC (rev 540)
@@ -0,0 +1,994 @@
+/******************************************************************************
+ * $Id: grass57dataset.cpp,v 1.6 2006/02/13 17:39:31 rblazek Exp $
+ *
+ * Project:  GRASS Driver
+ * Purpose:  Implement GRASS raster read/write support
+ *           This version is for GRASS 5.7+ and uses GRASS libraries
+ *           directly instead of using libgrass. 
+ * Author:   Frank Warmerdam <warmerdam at pobox.com>
+ *           Radim Blazek <blazek at itc.it>
+ *
+ ******************************************************************************
+ * Copyright (c) 2000 Frank Warmerdam <warmerdam at pobox.com>
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ ******************************************************************************
+ *
+ * $Log: grass57dataset.cpp,v $
+ * Revision 1.6  2006/02/13 17:39:31  rblazek
+ * header files moved to grass
+ *
+ * Revision 1.5  2005/09/30 21:07:57  fwarmerdam
+ * applied patches from bug 822, add georef support
+ *
+ * Revision 1.4  2005/05/06 18:21:14  fwarmerdam
+ * Applied patch from Radim.  Better logic to reset the region.
+ *
+ * Revision 1.3  2004/09/24 14:28:49  fwarmerdam
+ * fixed some typos with floating point (from Radim)
+ *
+ * Revision 1.2  2004/09/22 20:39:15  fwarmerdam
+ * some updates to reduce spurious error reports
+ *
+ * Revision 1.1  2004/09/13 18:18:26  fwarmerdam
+ * Variant code from Radim that works with GRASS 5.7 libraries directly.
+ * Currently coordinate system support is broken with this version.
+ *
+ */
+
+#include <stdlib.h>
+
+extern "C" {
+#ifdef __cplusplus
+#define class _class
+#endif
+#include <grass/imagery.h>
+#ifdef __cplusplus
+#undef class
+#endif
+    
+#include <grass/gprojects.h>
+#include <grass/gis.h>
+}
+
+#include "gdal_priv.h"
+#include "cpl_string.h"
+#include "ogr_spatialref.h"
+
+#define GRASS_MAX_COLORS 100000  // what is the right value
+
+CPL_CVSID("$Id: grass57dataset.cpp,v 1.6 2006/02/13 17:39:31 rblazek Exp $");
+
+CPL_C_START
+void	GDALRegister_GRASS(void);
+CPL_C_END
+
+/************************************************************************/
+/*                         Grass2CPLErrorHook()                         */
+/************************************************************************/
+
+int Grass2CPLErrorHook( char * pszMessage, int bFatal )
+
+{
+    if( !bFatal )
+        //CPLDebug( "GRASS", "%s", pszMessage );
+        CPLError( CE_Warning, CPLE_AppDefined, "GRASS warning: %s", pszMessage );
+    else
+        CPLError( CE_Warning, CPLE_AppDefined, "GRASS fatal error: %s", pszMessage );
+
+    return 0;
+}
+
+/************************************************************************/
+/* ==================================================================== */
+/*				GRASSDataset				*/
+/* ==================================================================== */
+/************************************************************************/
+
+class GRASSRasterBand;
+
+class GRASSDataset : public GDALDataset
+{
+    friend class GRASSRasterBand;
+
+    char	*pszGisdbase;  
+    char	*pszLocation;  /* LOCATION_NAME */
+    char	*pszElement;   /* cellhd or group */
+
+    struct Cell_head sCellInfo; /* raster region */ 
+    
+    char	*pszProjection;
+
+    double	adfGeoTransform[6];
+
+  public:
+                 GRASSDataset();
+                 ~GRASSDataset();
+
+    virtual const char *GetProjectionRef(void);
+    virtual CPLErr GetGeoTransform( double * );
+
+    static GDALDataset *Open( GDALOpenInfo * );
+
+  private:
+    static bool SplitPath ( char *, char **, char **, char **, char **, char ** );
+};
+
+/************************************************************************/
+/* ==================================================================== */
+/*                            GRASSRasterBand                           */
+/* ==================================================================== */
+/************************************************************************/
+
+class GRASSRasterBand : public GDALRasterBand
+{
+    friend class GRASSDataset;
+
+    char        *pszCellName;
+    char        *pszMapset;
+    int		hCell;
+    int         nGRSType; // GRASS raster type: CELL_TYPE, FCELL_TYPE, DCELL_TYPE
+    bool        nativeNulls; // use GRASS native NULL values
+
+    struct Colors sGrassColors;
+    GDALColorTable *poCT;
+
+    struct Cell_head sOpenWindow; /* the region when the raster was opened */ 
+
+    int		bHaveMinMax;
+    double	dfCellMin;
+    double	dfCellMax;
+
+    double	dfNoData;
+
+    bool        valid;
+
+  public:
+
+                   GRASSRasterBand( GRASSDataset *, int, 
+                                    const char *, const char * );
+    virtual        ~GRASSRasterBand();
+
+    virtual CPLErr IReadBlock( int, int, void * );
+    virtual CPLErr IRasterIO ( GDALRWFlag, int, int, int, int, void *, int, int, GDALDataType, int, int );
+    virtual GDALColorInterp GetColorInterpretation();
+    virtual GDALColorTable *GetColorTable();
+    virtual double GetMinimum( int *pbSuccess = NULL );
+    virtual double GetMaximum( int *pbSuccess = NULL );
+    virtual double GetNoDataValue( int *pbSuccess = NULL );
+
+  private:
+    CPLErr ResetReading( struct Cell_head * );
+    
+};
+
+
+/************************************************************************/
+/*                          GRASSRasterBand()                           */
+/************************************************************************/
+
+GRASSRasterBand::GRASSRasterBand( GRASSDataset *poDS, int nBand,
+                                  const char * pszMapset,
+                                  const char * pszCellName )
+
+{
+    struct Cell_head	sCellInfo;
+
+    // Note: GISDBASE, LOCATION_NAME ans MAPSET was set in GRASSDataset::Open
+
+    this->poDS = poDS;
+    this->nBand = nBand;
+    this->valid = false;
+
+    this->pszCellName = G_store ( (char *) pszCellName );
+    this->pszMapset = G_store ( (char *) pszMapset );
+
+    G_get_cellhd( (char *) pszCellName, (char *) pszMapset, &sCellInfo );
+    nGRSType = G_raster_map_type( (char *) pszCellName, (char *) pszMapset );
+
+/* -------------------------------------------------------------------- */
+/*      Get min/max values.                                             */
+/* -------------------------------------------------------------------- */
+    struct FPRange sRange;
+
+    if( G_read_fp_range( (char *) pszCellName, (char *) pszMapset, 
+                         &sRange ) == -1 )
+    {
+        bHaveMinMax = FALSE;
+    }
+    else
+    {
+        bHaveMinMax = TRUE;
+        G_get_fp_range_min_max( &sRange, &dfCellMin, &dfCellMax );
+    }
+
+/* -------------------------------------------------------------------- */
+/*      Setup band type, and preferred nodata value.                    */
+/* -------------------------------------------------------------------- */
+    // Negative values are also (?) stored as 4 bytes (format = 3) 
+    //       => raster with format < 3 has only positive values
+
+    // GRASS modules usually do not waste space and only the format necessary to keep 
+    // full raster values range is used -> no checks if shorter type could be used
+    
+    if( nGRSType == CELL_TYPE ) {
+	if ( sCellInfo.format == 0 ) {  // 1 byte / cell -> possible range 0,255
+	    if ( bHaveMinMax && dfCellMin > 0 ) {
+                this->eDataType = GDT_Byte;
+		dfNoData = 0.0;
+	    } else if ( bHaveMinMax && dfCellMax < 255 ) {
+                this->eDataType = GDT_Byte;
+		dfNoData = 255.0;
+	    } else { // maximum is not known or full range is used
+		this->eDataType = GDT_UInt16;
+		dfNoData = 256.0;
+	    }
+	    nativeNulls = false;
+	} else if ( sCellInfo.format == 1 ) {  // 2 bytes / cell -> possible range 0,65535
+	    if ( bHaveMinMax && dfCellMin > 0 ) {
+		this->eDataType = GDT_UInt16;
+		dfNoData = 0.0;
+	    } else if ( bHaveMinMax && dfCellMax < 65535 ) {
+                this->eDataType = GDT_UInt16;
+		dfNoData = 65535;
+	    } else { // maximum is not known or full range is used
+		CELL cval;
+		this->eDataType = GDT_Int32; 
+		G_set_c_null_value ( &cval, 1);
+		dfNoData = (double) cval;
+		nativeNulls = true;
+	    }
+	    nativeNulls = false;
+	} else {  // 3-4 bytes 
+	    CELL cval;
+	    this->eDataType = GDT_Int32;
+	    G_set_c_null_value ( &cval, 1);
+	    dfNoData = (double) cval;
+	    nativeNulls = true;
+	}
+    } 
+    else if( nGRSType == FCELL_TYPE ) {
+	FCELL fval;
+        this->eDataType = GDT_Float32;
+	G_set_f_null_value ( &fval, 1);
+	dfNoData = (double) fval;
+	nativeNulls = true;
+    }
+    else if( nGRSType == DCELL_TYPE )
+    {
+	DCELL dval;
+        this->eDataType = GDT_Float64;
+	G_set_d_null_value ( &dval, 1);
+	dfNoData = (double) dval;
+	nativeNulls = true;
+    }
+
+    nBlockXSize = poDS->nRasterXSize;;
+    nBlockYSize = 1;
+
+    G_set_window( &(((GRASSDataset *)poDS)->sCellInfo) );
+    if ( (hCell = G_open_cell_old((char *) pszCellName, (char *) pszMapset)) < 0 ) {
+	CPLError( CE_Warning, CPLE_AppDefined, "GRASS: Cannot open raster '%s'", pszCellName );
+	return;
+    }
+    G_copy((void *) &sOpenWindow, (void *) &(((GRASSDataset *)poDS)->sCellInfo), sizeof(struct Cell_head));
+
+/* -------------------------------------------------------------------- */
+/*      Do we have a color table?                                       */
+/* -------------------------------------------------------------------- */
+    poCT = NULL;
+    if( G_read_colors( (char *) pszCellName, (char *) pszMapset, &sGrassColors ) == 1 )
+    {
+	int maxcolor; 
+	CELL min, max;
+
+	G_get_color_range ( &min, &max, &sGrassColors);
+
+        if ( bHaveMinMax ) {
+	    if ( max < dfCellMax ) {
+	       maxcolor = max;
+            } else {
+	       maxcolor = (int) ceil ( dfCellMax );
+	    }
+	    if ( maxcolor > GRASS_MAX_COLORS ) { 
+		maxcolor = GRASS_MAX_COLORS;
+                CPLDebug( "GRASS", "Too many values, color table cut to %d entries.", maxcolor );
+	    }
+	} else {
+	    if ( max < GRASS_MAX_COLORS ) {
+	       maxcolor = max;
+            } else {
+	       maxcolor = GRASS_MAX_COLORS;
+               CPLDebug( "GRASS", "Too many values, color table set to %d entries.", maxcolor );
+	    }
+        }
+	    
+        poCT = new GDALColorTable();
+        for( int iColor = 0; iColor <= maxcolor; iColor++ )
+        {
+            int	nRed, nGreen, nBlue;
+            GDALColorEntry    sColor;
+
+            if( G_get_color( iColor, &nRed, &nGreen, &nBlue, &sGrassColors ) )
+            {
+                sColor.c1 = nRed;
+                sColor.c2 = nGreen;
+                sColor.c3 = nBlue;
+                sColor.c4 = 255;
+
+                poCT->SetColorEntry( iColor, &sColor );
+            }
+            else
+            {
+                sColor.c1 = 0;
+                sColor.c2 = 0;
+                sColor.c3 = 0;
+                sColor.c4 = 0;
+
+                poCT->SetColorEntry( iColor, &sColor );
+            }
+        }
+	    
+	/* Create metadata enries for color table rules */
+	char key[200], value[200];
+	int rcount = G_colors_count ( &sGrassColors );
+
+	sprintf ( value, "%d", rcount );
+	this->SetMetadataItem( "COLOR_TABLE_RULES_COUNT", value );
+
+	/* Add the rules in reverse order */
+	for ( int i = rcount-1; i >= 0; i-- ) {
+	    DCELL val1, val2;
+	    unsigned char r1, g1, b1, r2, g2, b2;
+
+	     G_get_f_color_rule ( &val1, &r1, &g1, &b1, &val2, &r2, &g2, &b2, &sGrassColors, i );
+		
+
+	     sprintf ( key, "COLOR_TABLE_RULE_RGB_%d", rcount-i-1 );
+	     sprintf ( value, "%e %e %d %d %d %d %d %d", val1, val2, r1, g1, b1, r2, g2, b2 );
+	     this->SetMetadataItem( key, value );
+	}
+    } else {
+	this->SetMetadataItem( "COLOR_TABLE_RULES_COUNT", "0" );
+    }
+    
+    this->valid = true;
+}
+
+/************************************************************************/
+/*                          ~GRASSRasterBand()                          */
+/************************************************************************/
+
+GRASSRasterBand::~GRASSRasterBand()
+{
+    if( poCT != NULL ) {
+        G_free_colors( &sGrassColors );
+        delete poCT;
+    }
+
+    if( hCell >= 0 )
+        G_close_cell( hCell );
+    
+    if ( pszCellName )
+        free ( pszCellName );
+
+    if ( pszMapset )
+        free ( pszMapset );
+}
+
+/************************************************************************/
+/*                             ResetReading                             */
+/*                                                                      */
+/* Reset current window and reopen cell if the window has changed,      */
+/* reset GRASS variables                                                */
+/*                                                                      */
+/* Returns CE_Failure if fails, otherwise CE_None                       */
+/************************************************************************/
+CPLErr GRASSRasterBand::ResetReading ( struct Cell_head *sNewWindow )
+{
+
+    /* Check if the window has changed */
+    if ( sNewWindow->north  != sOpenWindow.north  || sNewWindow->south  != sOpenWindow.south ||
+	 sNewWindow->east   != sOpenWindow.east   || sNewWindow->west   != sOpenWindow.west ||
+	 sNewWindow->ew_res != sOpenWindow.ew_res || sNewWindow->ns_res != sOpenWindow.ns_res ||
+	 sNewWindow->rows   != sOpenWindow.rows   || sNewWindow->cols   != sOpenWindow.cols )
+    {
+        G_close_cell( hCell );
+
+	/* Set window */
+	G_set_window( sNewWindow );
+
+	/* Open raster */
+	G__setenv( "GISDBASE", ((GRASSDataset *)poDS)->pszGisdbase );
+	G__setenv( "LOCATION_NAME", ((GRASSDataset *)poDS)->pszLocation );
+	G__setenv( "MAPSET", pszMapset); 
+	G_reset_mapsets();
+	G_add_mapset_to_search_path ( pszMapset );
+	
+	if ( (hCell = G_open_cell_old( pszCellName, pszMapset)) < 0 ) {
+	    CPLError( CE_Warning, CPLE_AppDefined, "GRASS: Cannot open raster '%s'", pszCellName );
+	    return CE_Failure;
+	}
+
+	G_copy((void *) &sOpenWindow, (void *) sNewWindow, sizeof(struct Cell_head));
+	
+    }
+    else
+    {
+        /* The windows are identical, check current window */
+        struct Cell_head sCurrentWindow;
+
+        G_get_window ( &sCurrentWindow );
+
+        if ( sNewWindow->north  != sCurrentWindow.north  || sNewWindow->south  != sCurrentWindow.south ||
+             sNewWindow->east   != sCurrentWindow.east   || sNewWindow->west   != sCurrentWindow.west ||
+             sNewWindow->ew_res != sCurrentWindow.ew_res || sNewWindow->ns_res != sCurrentWindow.ns_res ||
+             sNewWindow->rows   != sCurrentWindow.rows   || sNewWindow->cols   != sCurrentWindow.cols
+             )
+        {
+            /* Reset window */
+            G_set_window( sNewWindow );
+        }
+    }
+
+
+    return CE_None;
+}
+
+/************************************************************************/
+/*                             IReadBlock()                             */
+/*                                                                      */
+/************************************************************************/
+
+CPLErr GRASSRasterBand::IReadBlock( int nBlockXOff, int nBlockYOff, void * pImage )
+
+{
+    // Reset window because IRasterIO could be previosly called
+    if ( ResetReading ( &(((GRASSDataset *)poDS)->sCellInfo) ) != CE_None ) {
+       return CE_Failure;
+    }       
+    
+    if ( eDataType == GDT_Byte || eDataType == GDT_UInt16 ) {
+        CELL  *cbuf;
+
+	cbuf = G_allocate_c_raster_buf();
+	G_get_c_raster_row ( hCell, cbuf, nBlockYOff );	
+
+	/* Reset NULLs */
+	for ( int col = 0; col < nBlockXSize; col++ ) {
+	    if ( G_is_c_null_value(&(cbuf[col])) )
+		cbuf[col] = (CELL) dfNoData;
+	}
+
+	GDALCopyWords ( (void *) cbuf, GDT_Int32, sizeof(CELL), 
+	                pImage, eDataType, GDALGetDataTypeSize(eDataType)/8,
+			nBlockXSize );    
+
+	free ( cbuf );
+
+    } else if ( eDataType == GDT_Int32 ) {
+	G_get_c_raster_row ( hCell, (CELL *) pImage, nBlockYOff );
+    } else if ( eDataType == GDT_Float32 ) {
+	G_get_f_raster_row ( hCell, (FCELL *) pImage, nBlockYOff );
+    } else if ( eDataType == GDT_Float64 ) {
+	G_get_d_raster_row ( hCell, (DCELL *) pImage, nBlockYOff );
+    }
+	
+    return CE_None;
+}
+
+/************************************************************************/
+/*                             IRasterIO()                              */
+/*                                                                      */
+/************************************************************************/
+
+CPLErr GRASSRasterBand::IRasterIO ( GDALRWFlag eRWFlag,
+	                           int nXOff, int nYOff, int nXSize, int nYSize,
+				   void * pData, int nBufXSize, int nBufYSize,
+				   GDALDataType eBufType,
+				   int nPixelSpace, int nLineSpace )
+{
+    /* GRASS library does that, we have only calculate and reset the region in map units
+     * and if the region has changed, reopen the raster */
+    
+    /* Calculate the region */
+    struct Cell_head sWindow;
+    struct Cell_head *psDsWindow;
+
+    psDsWindow = &(((GRASSDataset *)poDS)->sCellInfo);
+    
+    sWindow.north = psDsWindow->north - nYOff * psDsWindow->ns_res; 
+    sWindow.south = sWindow.north - nYSize * psDsWindow->ns_res; 
+    sWindow.west = psDsWindow->west + nXOff * psDsWindow->ew_res; 
+    sWindow.east = sWindow.west + nXSize * psDsWindow->ew_res; 
+    sWindow.proj = psDsWindow->proj;
+    sWindow.zone = psDsWindow->zone;
+
+    sWindow.cols = nBufXSize;
+    sWindow.rows = nBufYSize;
+     
+    /* Reset resolution */
+    G_adjust_Cell_head ( &sWindow, 1, 1);
+
+    ResetReading ( &sWindow );
+    
+    /* Read Data */
+    CELL  *cbuf = NULL;
+    FCELL *fbuf = NULL;
+    DCELL *dbuf = NULL;
+    bool  direct = false;
+
+    /* Reset space if default (0) */
+    if ( nPixelSpace == 0 )
+	nPixelSpace = GDALGetDataTypeSize ( eBufType ) / 8;
+
+    if ( nLineSpace == 0 )
+	nLineSpace = nBufXSize * nPixelSpace;
+
+    if ( nGRSType == CELL_TYPE && ( !nativeNulls || eBufType != GDT_Int32 || sizeof(CELL) != 4 ||
+		                    nPixelSpace != sizeof(CELL) )  ) 
+    {
+	cbuf = G_allocate_c_raster_buf();
+    } else if( nGRSType == FCELL_TYPE && ( eBufType != GDT_Float32 || nPixelSpace != sizeof(FCELL) ) ) {
+	fbuf = G_allocate_f_raster_buf();
+    } else if( nGRSType == DCELL_TYPE && ( eBufType != GDT_Float64 || nPixelSpace != sizeof(DCELL) ) ) {
+	dbuf = G_allocate_d_raster_buf();
+    } else {
+	direct = true;
+    }
+
+    for ( int row = 0; row < nBufYSize; row++ ) {
+        char *pnt = (char *)pData + row * nLineSpace;
+	
+	if ( nGRSType == CELL_TYPE ) {
+	    if ( direct ) {
+		G_get_c_raster_row ( hCell, (CELL *) pnt, row );
+	    } else {
+		G_get_c_raster_row ( hCell, cbuf, row );
+		
+		/* Reset NULLs */
+		for ( int col = 0; col < nBufXSize; col++ ) {
+		    if ( G_is_c_null_value(&(cbuf[col])) ) 
+			cbuf[col] = (CELL) dfNoData;
+		}
+
+		GDALCopyWords ( (void *) cbuf, GDT_Int32, sizeof(CELL), 
+			        (void *)  pnt,  eBufType, nPixelSpace,
+				nBufXSize ); 
+	    }
+	} else if( nGRSType == FCELL_TYPE ) {
+	    if ( direct ) {
+		G_get_f_raster_row ( hCell, (FCELL *) pnt, row );
+	    } else {
+		G_get_f_raster_row ( hCell, fbuf, row );
+		
+		GDALCopyWords ( (void *) fbuf, GDT_Float32, sizeof(FCELL), 
+			        (void *)  pnt,  eBufType, nPixelSpace,
+				nBufXSize ); 
+	    }
+	} else if( nGRSType == DCELL_TYPE ) {
+	    if ( direct ) {
+		G_get_d_raster_row ( hCell, (DCELL *) pnt, row );
+	    } else {
+		G_get_d_raster_row ( hCell, dbuf, row );
+		
+		GDALCopyWords ( (void *) dbuf, GDT_Float64, sizeof(DCELL), 
+			        (void *)  pnt,  eBufType, nPixelSpace,
+				nBufXSize ); 
+	    }
+	}
+    }
+
+    if ( cbuf ) free ( cbuf );
+    if ( fbuf ) free ( fbuf );
+    if ( dbuf ) free ( dbuf );
+    
+    return CE_None;
+}
+
+/************************************************************************/
+/*                       GetColorInterpretation()                       */
+/************************************************************************/
+
+GDALColorInterp GRASSRasterBand::GetColorInterpretation()
+
+{
+    if( poCT != NULL )
+        return GCI_PaletteIndex;
+    else
+        return GCI_GrayIndex;
+}
+
+/************************************************************************/
+/*                           GetColorTable()                            */
+/************************************************************************/
+
+GDALColorTable *GRASSRasterBand::GetColorTable()
+
+{
+    return poCT;
+}
+
+/************************************************************************/
+/*                             GetMinimum()                             */
+/************************************************************************/
+
+double GRASSRasterBand::GetMinimum( int *pbSuccess )
+
+{
+    if( pbSuccess )
+        *pbSuccess = bHaveMinMax;
+
+    if( bHaveMinMax )
+        return dfCellMin;
+
+    else if( eDataType == GDT_Float32 || eDataType == GDT_Float64 )
+        return -4294967295.0;
+    else
+        return 0;
+}
+
+/************************************************************************/
+/*                             GetMaximum()                             */
+/************************************************************************/
+
+double GRASSRasterBand::GetMaximum( int *pbSuccess )
+
+{
+    if( pbSuccess )
+        *pbSuccess = bHaveMinMax;
+
+    if( bHaveMinMax )
+        return dfCellMax;
+
+    else if( eDataType == GDT_Float32 || eDataType == GDT_Float64 )
+        return 4294967295.0;
+    else if( eDataType == GDT_UInt32 )
+        return 4294967295.0;
+    else if( eDataType == GDT_UInt16 )
+        return 65535;
+    else 
+        return 255;
+}
+
+/************************************************************************/
+/*                           GetNoDataValue()                           */
+/************************************************************************/
+
+double GRASSRasterBand::GetNoDataValue( int *pbSuccess )
+
+{
+    if( pbSuccess )
+        *pbSuccess = TRUE;
+
+    return dfNoData;
+}
+
+/************************************************************************/
+/* ==================================================================== */
+/*                             GRASSDataset                             */
+/* ==================================================================== */
+/************************************************************************/
+
+
+/************************************************************************/
+/*                            GRASSDataset()                            */
+/************************************************************************/
+
+GRASSDataset::GRASSDataset()
+{
+    pszProjection = NULL;
+
+    adfGeoTransform[0] = 0.0;
+    adfGeoTransform[1] = 1.0;
+    adfGeoTransform[2] = 0.0;
+    adfGeoTransform[3] = 0.0;
+    adfGeoTransform[4] = 0.0;
+    adfGeoTransform[5] = 1.0;
+}
+
+/************************************************************************/
+/*                           ~GRASSDataset()                            */
+/************************************************************************/
+
+GRASSDataset::~GRASSDataset()
+{
+    
+    if ( pszGisdbase )
+	free ( pszGisdbase );
+    
+    if ( pszLocation )
+        free ( pszLocation );
+    
+    if ( pszElement )
+	free ( pszElement );
+
+    CPLFree( pszProjection );
+}
+
+/************************************************************************/
+/*                          GetProjectionRef()                          */
+/************************************************************************/
+
+const char *GRASSDataset::GetProjectionRef() 
+{
+    if( pszProjection == NULL )
+        return "";
+    else
+        return pszProjection;
+}
+
+/************************************************************************/
+/*                          GetGeoTransform()                           */
+/************************************************************************/
+
+CPLErr GRASSDataset::GetGeoTransform( double * padfGeoTransform ) 
+{
+    memcpy( padfGeoTransform, adfGeoTransform, sizeof(double) * 6 );
+    
+    return CE_None;
+}
+
+/************************************************************************/
+/*                            SplitPath()                               */
+/* Split full path to cell or group to:                                 */
+/*     gisdbase, location, mapset, element, name                        */
+/* New string are allocated and should be freed when no longer needed.  */
+/*                                                                      */
+/* Returns: true - OK                                                   */
+/*          false - failed                                              */
+/************************************************************************/
+bool GRASSDataset::SplitPath( char *path, char **gisdbase, char **location, 
+	                      char **mapset, char **element, char **name )
+{
+    char *p, *ptr[5], *tmp;
+    int  i = 0;
+    
+    *gisdbase = *location = *mapset = *element = *name = NULL;
+    
+    if ( !path || strlen(path) == 0 ) 
+	return false;
+
+    tmp = G_store ( path );
+
+    while ( (p = strrchr(tmp,'/')) != NULL  && i < 4 ) {
+	*p = '\0';
+	
+	if ( strlen(p+1) == 0 ) /* repeated '/' */
+	    continue;
+
+	ptr[i++] = p+1;
+    }
+
+    /* Note: empty GISDBASE == 0 is not accepted (relative path) */
+    if ( i != 4 ) {
+        free ( tmp );
+	return false;
+    }
+
+    *gisdbase = G_store ( tmp );
+    *location = G_store ( ptr[3] );
+    *mapset   = G_store ( ptr[2] );
+    *element  = G_store ( ptr[1] );
+    *name     = G_store ( ptr[0] );
+
+    free ( tmp );
+    return true;
+}
+
+/************************************************************************/
+/*                                Open()                                */
+/************************************************************************/
+
+typedef int (*GrassErrorHandler)(char *, int);
+
+GDALDataset *GRASSDataset::Open( GDALOpenInfo * poOpenInfo )
+
+{
+    char	*pszGisdb = NULL, *pszLoc = NULL;
+    char	*pszMapset = NULL, *pszElem = NULL, *pszName = NULL;
+    char        **papszCells = NULL;
+    char        **papszMapsets = NULL;
+    static char fake_gisbase[50];
+    static bool hasGisbase;
+
+/* -------------------------------------------------------------------- */
+/*      Does this even look like a grass file path?                     */
+/* -------------------------------------------------------------------- */
+    if( strstr(poOpenInfo->pszFilename,"/cellhd/") == NULL
+        && strstr(poOpenInfo->pszFilename,"/group/") == NULL )
+        return NULL;
+
+    /* Always init, if no rasters are opened G_no_gisinit resets the projection and 
+     * rasters in different projection may be then opened */
+
+    // Don't use GISRC file and read/write GRASS variables (from location G_VAR_GISRC) to memory only.
+    G_set_gisrc_mode ( G_GISRC_MODE_MEMORY );
+
+    // Init GRASS libraries (required)
+    G_no_gisinit();  // Doesn't check write permissions for mapset compare to G_gisinit
+
+    // Set error function
+    G_set_error_routine ( (GrassErrorHandler) Grass2CPLErrorHook );
+    
+    
+    if ( !getenv( "GISBASE" ) ) {
+	// we are outside a GRASS session
+	// TODO: use function instead of hardcoded path
+	sprintf(fake_gisbase, "GISBASE=/usr/local/share/gdal/grass/" );	
+        putenv( fake_gisbase );
+	hasGisbase = false;
+    } else {
+	hasGisbase = true;
+    }
+
+    if ( !SplitPath( poOpenInfo->pszFilename, &pszGisdb, &pszLoc, &pszMapset,
+                     &pszElem, &pszName) ) {
+	return NULL;
+    }
+
+/* -------------------------------------------------------------------- */
+/*      Check element name                                              */
+/* -------------------------------------------------------------------- */
+    if ( strcmp(pszElem,"cellhd") != 0 && strcmp(pszElem,"group") != 0 ) { 
+	free(pszGisdb); 
+        free(pszLoc); 
+        free(pszMapset); 
+        free(pszElem); 
+        free(pszName);
+	return NULL;
+    }
+    
+/* -------------------------------------------------------------------- */
+/*      Set GRASS variables                                             */
+/* -------------------------------------------------------------------- */
+
+    G__setenv( "GISDBASE", pszGisdb );
+    G__setenv( "LOCATION_NAME", pszLoc );
+    G__setenv( "MAPSET", pszMapset); // group is searched only in current mapset 
+    G_reset_mapsets();
+    G_add_mapset_to_search_path ( pszMapset );
+
+/* -------------------------------------------------------------------- */
+/*      Check if this is a valid grass cell.                            */
+/* -------------------------------------------------------------------- */
+    if ( strcmp(pszElem,"cellhd") == 0 ) {
+	
+        if ( G_find_file2("cell", pszName, pszMapset) == NULL ) {
+	    free(pszGisdb); free(pszLoc); free(pszMapset); free(pszElem); free(pszName);
+	    return NULL;
+	}
+
+	papszMapsets = CSLAddString( papszMapsets, pszMapset );
+	papszCells = CSLAddString( papszCells, pszName );
+    }
+/* -------------------------------------------------------------------- */
+/*      Check if this is a valid GRASS imagery group.                   */
+/* -------------------------------------------------------------------- */
+    else {
+        struct Ref ref;
+
+        I_init_group_ref( &ref );
+        if ( I_get_group_ref( pszName, &ref ) == 0 ) {
+	    free(pszGisdb); free(pszLoc); free(pszMapset); free(pszElem); free(pszName);
+	    return NULL;
+	}
+        
+        for( int iRef = 0; iRef < ref.nfiles; iRef++ ) 
+	{
+            papszCells = CSLAddString( papszCells, ref.file[iRef].name );
+            papszMapsets = CSLAddString( papszMapsets, ref.file[iRef].mapset );
+            G_add_mapset_to_search_path ( ref.file[iRef].mapset );
+        }
+
+        I_free_group_ref( &ref );
+    }
+    
+    free( pszMapset );
+    free( pszName );
+
+/* -------------------------------------------------------------------- */
+/*      Create a corresponding GDALDataset.                             */
+/* -------------------------------------------------------------------- */
+    GRASSDataset 	*poDS;
+
+    poDS = new GRASSDataset();
+
+    /* notdef: should only allow read access to an existing cell, right? */
+    poDS->eAccess = poOpenInfo->eAccess;
+
+    poDS->pszGisdbase = pszGisdb;
+    poDS->pszLocation = pszLoc;
+    poDS->pszElement = pszElem;
+    
+/* -------------------------------------------------------------------- */
+/*      Capture some information from the file that is of interest.     */
+/* -------------------------------------------------------------------- */
+    
+    if( G_get_cellhd( papszCells[0], papszMapsets[0], &(poDS->sCellInfo) ) != 0 ) {
+	CPLError( CE_Warning, CPLE_AppDefined, "GRASS: Cannot open raster header");
+	/* TODO: delete poDS ? */
+	return NULL;
+    }
+
+    poDS->nRasterXSize = poDS->sCellInfo.cols;
+    poDS->nRasterYSize = poDS->sCellInfo.rows;
+
+    poDS->adfGeoTransform[0] = poDS->sCellInfo.west;
+    poDS->adfGeoTransform[1] = poDS->sCellInfo.ew_res;
+    poDS->adfGeoTransform[2] = 0.0;
+    poDS->adfGeoTransform[3] = poDS->sCellInfo.north;
+    poDS->adfGeoTransform[4] = 0.0;
+    poDS->adfGeoTransform[5] = -1 * poDS->sCellInfo.ns_res;
+    
+/* -------------------------------------------------------------------- */
+/*      Try to get a projection definition.                             */
+/* -------------------------------------------------------------------- */
+    struct Key_Value *projinfo, *projunits;
+
+    if ( hasGisbase ) {
+	projinfo = G_get_projinfo();
+	projunits = G_get_projunits();
+        poDS->pszProjection = GPJ_grass_to_wkt ( projinfo, projunits, 0, 0);
+    }
+
+/* -------------------------------------------------------------------- */
+/*      Create band information objects.                                */
+/* -------------------------------------------------------------------- */
+    for( int iBand = 0; papszCells[iBand] != NULL; iBand++ )
+    {
+	GRASSRasterBand *rb = new GRASSRasterBand( poDS, iBand+1, papszMapsets[iBand], 
+                                                                  papszCells[iBand] );
+
+	if ( !rb->valid ) {
+	    CPLError( CE_Warning, CPLE_AppDefined, "GRASS: Cannot open raster band %d", iBand);
+	    // TODO: delete poDS ?
+	    return NULL;
+	}
+
+        poDS->SetBand( iBand+1, rb );
+    }
+
+    return poDS;
+}
+
+/************************************************************************/
+/*                          GDALRegister_GRASS()                        */
+/************************************************************************/
+
+void GDALRegister_GRASS()
+{
+    GDALDriver	*poDriver;
+
+    if( GDALGetDriverByName( "GRASS" ) == NULL )
+    {
+        poDriver = new GDALDriver();
+        
+        poDriver->SetDescription( "GRASS" );
+        poDriver->SetMetadataItem( GDAL_DMD_LONGNAME, 
+                                   "GRASS Database Rasters (5.7+)" );
+        poDriver->SetMetadataItem( GDAL_DMD_HELPTOPIC, 
+                                   "frmt_grass.html" );
+        
+        poDriver->pfnOpen = GRASSDataset::Open;
+
+        GetGDALDriverManager()->RegisterDriver( poDriver );
+    }
+}
+

Added: packages/gdal-grass/trunk/ogrgrass.h
===================================================================
--- packages/gdal-grass/trunk/ogrgrass.h	2006-08-23 16:55:12 UTC (rev 539)
+++ packages/gdal-grass/trunk/ogrgrass.h	2006-08-23 16:55:51 UTC (rev 540)
@@ -0,0 +1,186 @@
+/******************************************************************************
+ * $Id: ogrgrass.h,v 1.1 2005/08/05 15:32:43 fwarmerdam Exp $
+ *
+ * Project:  OpenGIS Simple Features Reference Implementation
+ * Purpose:  Private definitions for OGR/GRASS driver.
+ * Author:   Radim Blazek, radim.blazek at gmail.com
+ *
+ ******************************************************************************
+ * Copyright (c) 2005, Radim Blazek <radim.blazek at gmail.com>
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ ******************************************************************************
+ *
+ * $Log: ogrgrass.h,v $
+ * Revision 1.1  2005/08/05 15:32:43  fwarmerdam
+ * New
+ *
+ *
+ */
+
+#ifndef _OGRGRASS_H_INCLUDED
+#define _OGRGRASS_H_INLLUDED
+
+#include "ogrsf_frmts.h"
+
+extern "C" {
+    #include <grass/gprojects.h>
+    #include <grass/gis.h>
+    #include <grass/dbmi.h>
+    #include <grass/Vect.h>
+}
+
+/************************************************************************/
+/*                            OGRGRASSLayer                             */
+/************************************************************************/
+class OGRGRASSLayer : public OGRLayer
+{
+  public:
+                        OGRGRASSLayer(	int layer, struct Map_info * map );
+                        ~OGRGRASSLayer();
+
+    // Layer info
+    OGRFeatureDefn *    GetLayerDefn() { return poFeatureDefn; }
+    int                 GetFeatureCount( int );
+    OGRErr              GetExtent(OGREnvelope *psExtent, int bForce);
+    virtual OGRSpatialReference *GetSpatialRef();
+    int                 TestCapability( const char * );
+
+    // Reading
+    void                ResetReading();
+    virtual OGRErr      SetNextByIndex( long nIndex );
+    OGRFeature *        GetNextFeature();
+    OGRFeature         *GetFeature( long nFeatureId );
+
+    // Filters
+    virtual OGRErr 	SetAttributeFilter( const char *query );
+    virtual void 	SetSpatialFilter( OGRGeometry * poGeomIn );
+
+    // Write access, not supported:
+    virtual OGRErr      CreateField( OGRFieldDefn *poField, int bApproxOK = TRUE );
+    OGRErr              SetFeature( OGRFeature *poFeature );
+    OGRErr              CreateFeature( OGRFeature *poFeature );
+    
+  private:
+    char		*pszName;
+    OGRSpatialReference *poSRS;
+    OGRFeatureDefn	*poFeatureDefn;
+    char		*pszQuery;	// Attribute filter string
+
+    int			iNextId;
+    int			nTotalCount;
+    int			iLayer;		// Layer number 
+    int			iLayerIndex;	// Layer index (in GRASS category index)
+    int			iCatField;	// Field where category (key) is stored
+    int			nFields;
+    int 		*paFeatureIndex; // Array of indexes to category index array
+
+    // Vector map
+    struct Map_info 	*poMap;
+    struct field_info   *poLink;
+
+    // Database connection
+    bool 		bHaveAttributes;
+
+    dbString		*poDbString;
+    dbDriver		*poDriver;
+    dbCursor		*poCursor;
+    
+    bool		bCursorOpened;	// Sequential database cursor opened
+    int 		iCurrentCat;	// Current category in select cursor
+
+    struct line_pnts	*poPoints; 
+    struct line_cats	*poCats;
+
+    bool		StartDbDriver ();
+    bool		StopDbDriver ();
+
+    OGRGeometry		*GetFeatureGeometry ( long nFeatureId, int *cat );
+    bool		SetAttributes ( OGRFeature *feature, dbTable *table );
+
+    // Features matching spatial filter for ALL features/elements in GRASS
+    char 		*paSpatialMatch;
+    bool 		SetSpatialMatch();
+
+    // Features matching attribute filter for ALL features/elements in GRASS
+    char 		*paQueryMatch;
+    bool 		OpenSequentialCursor();
+    bool 		ResetSequentialCursor();
+    bool 		SetQueryMatch();
+};
+
+/************************************************************************/
+/*                          OGRGRASSDataSource                          */
+/************************************************************************/
+class OGRGRASSDataSource : public OGRDataSource
+{
+  public:
+                        OGRGRASSDataSource();
+                        ~OGRGRASSDataSource();
+
+    int                 Open( const char *, int bUpdate, int bTestOpen,
+                              int bSingleNewFile = FALSE );
+
+    const char          *GetName() { return pszName; }
+    int                 GetLayerCount() { return nLayers; }
+    OGRLayer            *GetLayer( int );
+
+    int                 TestCapability( const char * );
+
+    // Not implemented (returns NULL):
+    virtual OGRLayer    *CreateLayer( const char *, 
+                                      OGRSpatialReference * = NULL,
+                                      OGRwkbGeometryType = wkbUnknown,
+                                      char ** = NULL );
+
+
+  private:
+    OGRGRASSLayer     **papoLayers;
+    char                *pszName;	// Date source name
+    char		*pszGisdbase;	// GISBASE
+    char		*pszLocation;	// location name
+    char		*pszMapset;	// mapset name
+    char		*pszMap;	// name of vector map
+
+    struct Map_info 	map;
+    int                 nLayers;
+
+    static bool SplitPath ( char *, char **, char **, char **, char ** );
+};
+
+/************************************************************************/
+/*                            OGRGRASSDriver                            */
+/************************************************************************/
+class OGRGRASSDriver : public OGRSFDriver
+{
+  public:
+			~OGRGRASSDriver();
+                
+    const char 		*GetName();
+    OGRDataSource 	*Open( const char *, int );
+
+    int                 TestCapability( const char * );
+
+    // Not implemented (return error/NULL):
+    virtual OGRDataSource *CreateDataSource( const char *pszName, 
+	    				     char ** = NULL );
+    OGRErr              DeleteDataSource( const char *pszDataSource );
+};
+
+#endif /* ndef _OGRGRASS_H_INCLUDED */

Added: packages/gdal-grass/trunk/ogrgrassdatasource.cpp
===================================================================
--- packages/gdal-grass/trunk/ogrgrassdatasource.cpp	2006-08-23 16:55:12 UTC (rev 539)
+++ packages/gdal-grass/trunk/ogrgrassdatasource.cpp	2006-08-23 16:55:51 UTC (rev 540)
@@ -0,0 +1,309 @@
+/******************************************************************************
+ * $Id: ogrgrassdatasource.cpp,v 1.1 2005/08/05 15:32:43 fwarmerdam Exp $
+ *
+ * Project:  OpenGIS Simple Features Reference Implementation
+ * Purpose:  Implements OGRGRASSDataSource class.
+ * Author:   Radim Blazek, radim.blazek at gmail.com 
+ *
+ ******************************************************************************
+ * Copyright (c) 2005, Radim Blazek <radim.blazek at gmail.com>
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ ******************************************************************************
+ *
+ * $Log: ogrgrassdatasource.cpp,v $
+ * Revision 1.1  2005/08/05 15:32:43  fwarmerdam
+ * New
+ *
+ *
+ */
+
+#include "ogrgrass.h"
+#include "cpl_conv.h"
+#include "cpl_string.h"
+
+CPL_CVSID("$Id: ogrgrassdatasource.cpp,v 1.1 2005/08/05 15:32:43 fwarmerdam Exp $");
+
+/************************************************************************/
+/*                         Grass2CPLErrorHook()                         */
+/************************************************************************/
+int Grass2OGRErrorHook( char * pszMessage, int bFatal )
+{
+    if( !bFatal )
+        CPLError( CE_Warning, CPLE_AppDefined, "GRASS warning: %s", pszMessage );
+    else
+        CPLError( CE_Warning, CPLE_AppDefined, "GRASS fatal error: %s", pszMessage );
+
+    return 0;
+}
+
+/************************************************************************/
+/*                         OGRGRASSDataSource()                         */
+/************************************************************************/
+OGRGRASSDataSource::OGRGRASSDataSource()
+{
+    pszName = NULL;
+    pszGisdbase = NULL;
+    pszLocation = NULL;
+    pszMapset = NULL;
+    pszMap = NULL;
+    papoLayers = NULL;
+    nLayers = 0;
+}
+
+/************************************************************************/
+/*                        ~OGRGRASSDataSource()                         */
+/************************************************************************/
+OGRGRASSDataSource::~OGRGRASSDataSource()
+{
+    CPLDebug ( "GRASS", "OGRGRASSDataSource::~OGRGRASSDataSource()" );
+
+    for( int i = 0; i < nLayers; i++ )
+        delete papoLayers[i];
+    
+    if ( pszName ) CPLFree( pszName );
+    if ( papoLayers ) CPLFree( papoLayers );
+    if ( pszGisdbase ) CPLFree( pszGisdbase );
+    if ( pszLocation ) CPLFree( pszLocation );
+    if ( pszMapset ) CPLFree( pszMapset );
+    if ( pszMap ) CPLFree( pszMap );
+}
+
+/************************************************************************/
+/*                                Open()                                */
+/************************************************************************/
+typedef int (*GrassErrorHandler)(char *, int);
+
+int OGRGRASSDataSource::Open( const char * pszNewName, int bUpdate,
+                              int bTestOpen, int bSingleNewFileIn )
+{
+    CPLDebug ( "GRASS", "OGRGRASSDataSource::Open" );
+
+    VSIStatBuf  stat;
+    
+    CPLAssert( nLayers == 0 );
+    
+    pszName = CPLStrdup( pszNewName ); // Released by destructor
+
+/* -------------------------------------------------------------------- */
+/*      Do the given path contains 'vector' and 'head'?                 */
+/* -------------------------------------------------------------------- */
+    if ( strstr(pszName,"vector") == NULL || strstr(pszName,"head") == NULL )
+    {
+        if( !bTestOpen )
+	{
+            CPLError( CE_Failure, CPLE_AppDefined,
+                 "%s is not GRASS vector, access failed.\n", pszName );
+	}
+	return FALSE;
+    }
+    
+/* -------------------------------------------------------------------- */
+/*      Is the given a regular file?                                    */
+/* -------------------------------------------------------------------- */
+    if( CPLStat( pszName, &stat ) != 0 || !VSI_ISREG(stat.st_mode) )
+    {
+        if( !bTestOpen )
+	{
+            CPLError( CE_Failure, CPLE_AppDefined,
+                 "%s is not GRASS vector, access failed.\n", pszName );
+	}
+
+        return FALSE;
+    }
+
+/* -------------------------------------------------------------------- */
+/*      Parse datasource name                                           */
+/* -------------------------------------------------------------------- */
+    if ( !SplitPath(pszName, &pszGisdbase, &pszLocation, 
+		    &pszMapset, &pszMap) ) 
+    {
+        if( !bTestOpen )
+	{
+            CPLError( CE_Failure, CPLE_AppDefined,
+                      "%s is not GRASS datasource name, access failed.\n", 
+		      pszName );
+	}
+	return FALSE;
+    }
+			
+    CPLDebug ( "GRASS", "Gisdbase: %s", pszGisdbase );
+    CPLDebug ( "GRASS", "Location: %s", pszLocation );
+    CPLDebug ( "GRASS", "Mapset: %s", pszMapset );
+    CPLDebug ( "GRASS", "Map: %s", pszMap );
+
+/* -------------------------------------------------------------------- */
+/*      Init GRASS library                                              */
+/* -------------------------------------------------------------------- */
+    // GISBASE is path to the directory where GRASS is installed,
+    // it is necessary because there are database drivers.
+    if ( !getenv( "GISBASE" ) ) {
+	char *gisbase = GRASS_GISBASE;
+        CPLError( CE_Warning, CPLE_AppDefined, "GRASS warning: GISBASE "
+		  "enviroment variable was not set, using:\n%s", gisbase );
+	char buf[2000];
+	sprintf ( buf, "GISBASE=%s", gisbase );
+
+ 	char *gisbaseEnv = CPLStrdup ( buf );
+	putenv( gisbaseEnv );
+    }
+
+    // Don't use GISRC file and read/write GRASS variables 
+    // (from location G_VAR_GISRC) to memory only.
+    G_set_gisrc_mode ( G_GISRC_MODE_MEMORY );
+
+    // Init GRASS libraries (required). G_no_gisinit() doesn't check 
+    // write permissions for mapset compare to G_gisinit()
+    G_no_gisinit();  
+
+    // Set error function
+    G_set_error_routine ( (GrassErrorHandler) Grass2OGRErrorHook );
+
+/* -------------------------------------------------------------------- */
+/*      Set GRASS variables                                             */
+/* -------------------------------------------------------------------- */
+     G__setenv( "GISDBASE", pszGisdbase );
+     G__setenv( "LOCATION_NAME", pszLocation );
+     G__setenv( "MAPSET", pszMapset); 
+     G_reset_mapsets();
+     G_add_mapset_to_search_path ( pszMapset );
+
+/* -------------------------------------------------------------------- */
+/*      Open GRASS vector map                                           */
+/* -------------------------------------------------------------------- */
+    Vect_set_fatal_error ( GV_FATAL_PRINT ); // Print error and continue
+    Vect_set_open_level (2);
+    int level = Vect_open_old ( &map, pszMap, pszMapset);
+
+    if ( level < 2 ) {
+        CPLError( CE_Failure, CPLE_AppDefined,
+                 "Cannot open GRASS vector %s on level 2.\n", pszName );
+	return FALSE;
+    }
+
+    CPLDebug ( "GRASS", "Num lines = %d", Vect_get_num_lines(&map) );
+    
+/* -------------------------------------------------------------------- */
+/*      Build a list of layers.                                         */
+/* -------------------------------------------------------------------- */
+    int ncidx = Vect_cidx_get_num_fields ( &map );
+    CPLDebug ( "GRASS", "Num layers = %d", ncidx );
+
+    for ( int i = 0; i < ncidx; i++ ) {
+	// Create the layer object
+	OGRGRASSLayer       *poLayer;
+
+        poLayer = new OGRGRASSLayer( i, &map );
+	
+        // Add layer to data source layer list
+	papoLayers = (OGRGRASSLayer **)
+	    CPLRealloc( papoLayers,  sizeof(OGRGRASSLayer *) * (nLayers+1) );
+	papoLayers[nLayers++] = poLayer;
+    }
+    
+    return TRUE;
+}
+
+/************************************************************************/
+/*                            CreateLayer()                             */
+/************************************************************************/
+OGRLayer *
+OGRGRASSDataSource::CreateLayer( const char * pszLayerName,
+                                 OGRSpatialReference *poSRS,
+                                 OGRwkbGeometryType eType,
+                                 char ** papszOptions )
+
+{
+    CPLError( CE_Failure, CPLE_NoWriteAccess,
+	      "CreateLayer is not supported by GRASS driver" );
+
+    return NULL;
+}
+
+/************************************************************************/
+/*                           TestCapability()                           */
+/************************************************************************/
+int OGRGRASSDataSource::TestCapability( const char * pszCap )
+{
+    return FALSE;
+}
+
+/************************************************************************/
+/*                              GetLayer()                              */
+/************************************************************************/
+OGRLayer *OGRGRASSDataSource::GetLayer( int iLayer )
+{
+    if( iLayer < 0 || iLayer >= nLayers )
+        return NULL;
+    else
+        return papoLayers[iLayer];
+}
+
+/************************************************************************/
+/*                            SplitPath()                               */
+/* Split full path to cell or group to:                                 */
+/*     gisdbase, location, mapset, name                                 */
+/* New string are allocated and should be freed when no longer needed.  */
+/*                                                                      */
+/* Returns: true - OK                                                   */
+/*          false - failed                                              */
+/************************************************************************/
+bool OGRGRASSDataSource::SplitPath( char *path, char **gisdbase, 
+	                     char **location, char **mapset, char **map )
+{
+    char *p, *ptr[5], *tmp;
+    int  i = 0;
+    
+    CPLDebug ( "GRASS", "OGRGRASSDataSource::SplitPath" );
+    
+    *gisdbase = *location = *mapset = *map = NULL;
+    
+    if ( !path || strlen(path) == 0 ) 
+	return false;
+
+    tmp = G_store ( path );
+
+    while ( (p = strrchr(tmp,'/')) != NULL  && i < 5 ) {
+	*p = '\0';
+	
+	if ( strlen(p+1) == 0 ) /* repeated '/' */
+	    continue;
+
+	ptr[i++] = p+1;
+    }
+
+    /* Note: empty GISDBASE == 0 is not accepted (relative path) */
+    if ( i != 5 ) {
+        free ( tmp );
+	return false;
+    }
+
+    if ( strcmp(ptr[0],"head") != 0 || strcmp(ptr[2],"vector") != 0 ) {
+       return false;
+    }       
+
+    *gisdbase = G_store ( tmp );
+    *location = G_store ( ptr[4] );
+    *mapset   = G_store ( ptr[3] );
+    *map      = G_store ( ptr[1] );
+
+    free ( tmp );
+    return true;
+}
+

Added: packages/gdal-grass/trunk/ogrgrassdriver.cpp
===================================================================
--- packages/gdal-grass/trunk/ogrgrassdriver.cpp	2006-08-23 16:55:12 UTC (rev 539)
+++ packages/gdal-grass/trunk/ogrgrassdriver.cpp	2006-08-23 16:55:51 UTC (rev 540)
@@ -0,0 +1,117 @@
+/******************************************************************************
+ * $Id: ogrgrassdriver.cpp,v 1.1 2005/08/05 15:32:43 fwarmerdam Exp $
+ *
+ * Project:  OpenGIS Simple Features Reference Implementation
+ * Purpose:  Implements OGRGRASSDriver class.
+ * Author:   Radim Blazek, radim.blazek at gmail.com
+ *
+ ******************************************************************************
+ * Copyright (c) 2005, Radim Blazek <radim.blazek at gmail.com>
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ ******************************************************************************
+ *
+ * $Log: ogrgrassdriver.cpp,v $
+ * Revision 1.1  2005/08/05 15:32:43  fwarmerdam
+ * New
+ *
+ *
+ */
+
+#include "ogrgrass.h"
+#include "cpl_conv.h"
+#include "cpl_string.h"
+
+CPL_CVSID("$Id: ogrgrassdriver.cpp,v 1.1 2005/08/05 15:32:43 fwarmerdam Exp $");
+
+/************************************************************************/
+/*                          ~OGRGRASSDriver()                           */
+/************************************************************************/
+OGRGRASSDriver::~OGRGRASSDriver()
+{
+}
+
+/************************************************************************/
+/*                              GetName()                               */
+/************************************************************************/
+const char *OGRGRASSDriver::GetName()
+{
+    return "GRASS";
+}
+
+/************************************************************************/
+/*                                Open()                                */
+/************************************************************************/
+OGRDataSource *OGRGRASSDriver::Open( const char * pszFilename,
+                                     int bUpdate )
+{
+    OGRGRASSDataSource  *poDS;
+
+    poDS = new OGRGRASSDataSource();
+
+    if( !poDS->Open( pszFilename, bUpdate, TRUE ) )
+    {
+        delete poDS;
+        return NULL;
+    }
+    else
+    {
+        return poDS;
+    }
+}
+
+/************************************************************************/
+/*                          CreateDataSource()                          */
+/************************************************************************/
+OGRDataSource *OGRGRASSDriver::CreateDataSource( const char * pszName,
+                                                 char **papszOptions )
+{
+    CPLError( CE_Failure, CPLE_AppDefined, 
+	      "CreateDataSource is not supported by GRASS driver.\n" );
+            
+    return NULL;
+}
+
+/************************************************************************/
+/*                          DeleteDataSource()                          */
+/************************************************************************/
+OGRErr OGRGRASSDriver::DeleteDataSource( const char *pszDataSource )
+{
+    CPLError( CE_Failure, CPLE_AppDefined,
+	      "DeleteDataSource is not supported by GRASS driver" );
+
+    return OGRERR_FAILURE;
+}
+
+/************************************************************************/
+/*                           TestCapability()                           */
+/************************************************************************/
+int OGRGRASSDriver::TestCapability( const char * pszCap )
+{
+    return FALSE;
+}
+
+/************************************************************************/
+/*                          RegisterOGRGRASS()                          */
+/************************************************************************/
+void RegisterOGRGRASS()
+{
+    OGRSFDriverRegistrar::GetRegistrar()->RegisterDriver( new OGRGRASSDriver );
+}
+

Added: packages/gdal-grass/trunk/ogrgrasslayer.cpp
===================================================================
--- packages/gdal-grass/trunk/ogrgrasslayer.cpp	2006-08-23 16:55:12 UTC (rev 539)
+++ packages/gdal-grass/trunk/ogrgrasslayer.cpp	2006-08-23 16:55:51 UTC (rev 540)
@@ -0,0 +1,1071 @@
+/******************************************************************************
+ * $Id: ogrgrasslayer.cpp,v 1.3 2006/02/14 13:01:49 rblazek Exp $
+ *
+ * Project:  OpenGIS Simple Features Reference Implementation
+ * Purpose:  Implements OGRGRASSLayer class.
+ * Author:   Radim Blazek, radim.blazek at gmail.com 
+ *
+ ******************************************************************************
+ * Copyright (c) 2005, Radim Blazek <radim.blazek at gmail.com>
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ ******************************************************************************
+ *
+ * $Log: ogrgrasslayer.cpp,v $
+ * Revision 1.3  2006/02/14 13:01:49  rblazek
+ * dont kill on win
+ *
+ * Revision 1.2  2005/09/21 00:59:36  fwarmerdam
+ * fixup OGRFeatureDefn and OGRSpatialReference refcount handling
+ *
+ * Revision 1.1  2005/08/05 15:32:43  fwarmerdam
+ * New
+ *
+ *
+ */
+
+#include <signal.h>
+#include "ogrgrass.h"
+#include "cpl_conv.h"
+
+CPL_CVSID("$Id: ogrgrasslayer.cpp,v 1.3 2006/02/14 13:01:49 rblazek Exp $");
+
+/************************************************************************/
+/*                           OGRGRASSLayer()                            */
+/************************************************************************/
+OGRGRASSLayer::OGRGRASSLayer( int layerIndex,  struct Map_info * map )
+{
+    CPLDebug ( "GRASS", "OGRGRASSLayer::OGRGRASSLayer layerIndex = %d", layerIndex );
+    
+    iLayerIndex = layerIndex;
+    poMap = map; 
+    poSRS = NULL;
+    iNextId = 0;
+    poPoints = Vect_new_line_struct();
+    poCats = Vect_new_cats_struct();
+    pszQuery = NULL;
+    paQueryMatch = NULL;
+    paSpatialMatch = NULL;
+
+    iLayer = Vect_cidx_get_field_number ( poMap, iLayerIndex);
+    CPLDebug ( "GRASS", "iLayer = %d", iLayer );
+    
+    poLink = Vect_get_field ( poMap, iLayer ); // May be NULL if not defined
+
+    // Layer name
+    if ( poLink && poLink->name )
+    {
+	pszName = CPLStrdup( poLink->name );	
+    }
+    else
+    {	
+	char buf[20]; 
+	sprintf ( buf, "%d", iLayer ); 
+	pszName = CPLStrdup( buf );
+    }
+
+    // Because we don't represent centroids as any simple feature, we have to scan
+    // category index and create index of feature IDs pointing to category index
+    nTotalCount = Vect_cidx_get_type_count(poMap,iLayer, GV_POINT|GV_LINES|GV_AREA);
+    CPLDebug ( "GRASS", "nTotalCount = %d", nTotalCount );
+    paFeatureIndex = (int *) CPLMalloc ( nTotalCount * sizeof(int) );
+    
+    int n = Vect_cidx_get_type_count(poMap,iLayer, GV_POINTS|GV_LINES|GV_AREA);
+    int cnt = 0;
+    for ( int i = 0; i < n; i++ ) 
+    {
+	int cat,type, id;
+	
+	Vect_cidx_get_cat_by_index ( poMap, iLayerIndex, i, &cat, &type, &id );
+    
+	if ( !( type & (GV_POINT|GV_LINES|GV_AREA) ) ) continue;
+	paFeatureIndex[cnt++] = i;
+    }
+
+    poFeatureDefn = new OGRFeatureDefn( pszName );
+    poFeatureDefn->Reference();
+
+    // Get type definition
+    int nTypes = Vect_cidx_get_num_types_by_index ( poMap, iLayerIndex );
+    int types = 0;
+    for ( int i = 0; i < nTypes; i++ ) {
+	int type, count;
+	Vect_cidx_get_type_count_by_index ( poMap, iLayerIndex, i, &type, &count);
+	if ( !(type & (GV_POINT|GV_LINES|GV_AREA) ) ) continue;
+	types |= type;
+        CPLDebug ( "GRASS", "type = %d types = %d", type, types );
+    }
+    if ( types == GV_LINE || types == GV_BOUNDARY || types == GV_LINES ) 
+    {
+        poFeatureDefn->SetGeomType ( wkbLineString );
+    } 
+    else if ( types == GV_POINT )
+    {
+	poFeatureDefn->SetGeomType ( wkbPoint );
+    }
+    else if ( types == GV_AREA )
+    {
+        CPLDebug ( "GRASS", "set wkbPolygon" );
+	poFeatureDefn->SetGeomType ( wkbPolygon );
+    }
+
+    // Get attributes definition
+    poDbString = (dbString*) CPLMalloc ( sizeof(dbString) );
+    poCursor = (dbCursor*) CPLMalloc ( sizeof(dbCursor) );
+    bCursorOpened = FALSE;
+
+    poDriver = NULL;
+    bHaveAttributes = false;
+    db_init_string ( poDbString );
+    if ( poLink ) 
+    {
+	if ( StartDbDriver() ) 
+	{
+	    db_set_string ( poDbString, poLink->table );
+	    dbTable *table;
+	    if ( db_describe_table ( poDriver, poDbString, &table) == DB_OK )
+	    {
+		nFields = db_get_table_number_of_columns ( table );
+		iCatField = -1;
+		for ( int i = 0; i < nFields; i++) 
+		{
+		    dbColumn *column = db_get_table_column ( table, i );
+		    int ctype = db_sqltype_to_Ctype ( db_get_column_sqltype(column) );
+    
+		    OGRFieldType ogrFtype = OFTInteger;
+ 	     	    switch ( ctype ) {
+			 case DB_C_TYPE_INT:
+			    ogrFtype = OFTInteger;
+			    break; 
+			 case DB_C_TYPE_DOUBLE:
+			    ogrFtype = OFTReal;
+			    break; 
+			 case DB_C_TYPE_STRING:
+			    ogrFtype = OFTString;
+			    break; 
+			 case DB_C_TYPE_DATETIME:
+			    ogrFtype = OFTString;
+			    break; 
+		    }
+
+		    CPLDebug ( "GRASS", "column = %s type = %d", 
+			       db_get_column_name(column), ctype );
+		    
+		    OGRFieldDefn oField ( db_get_column_name(column), ogrFtype );
+		    poFeatureDefn->AddFieldDefn( &oField );
+
+		    if ( G_strcasecmp(db_get_column_name(column),poLink->key) == 0 )
+		    {
+			iCatField = i;
+		    }
+		}
+		if ( iCatField >= 0  ) 
+		{
+    		    bHaveAttributes = true;
+		}
+		else
+		{
+		    CPLError( CE_Failure, CPLE_AppDefined, "Cannot find key field" );
+		    db_close_database_shutdown_driver ( poDriver );
+		    poDriver = NULL;
+		}
+	    }
+	    else
+	    {
+		CPLError( CE_Failure, CPLE_AppDefined, "Cannot describe table %s", 
+			  poLink->table );
+
+	    }
+	    db_close_database_shutdown_driver ( poDriver );
+	    poDriver = NULL;
+	}
+    } 
+	
+    if ( !bHaveAttributes && iLayer > 0 ) // Because features in layer 0 have no cats  
+    {
+	OGRFieldDefn oField("cat", OFTInteger);
+	poFeatureDefn->AddFieldDefn( &oField );
+    }
+
+    if ( getenv("GISBASE") )  // We have some projection info in GISBASE
+    {
+        struct Key_Value *projinfo, *projunits;
+
+	// Note: we dont have to reset GISDBASE and LOCATION_NAME because 
+	// OGRGRASSLayer constructor is called from OGRGRASSDataSource::Open
+	// where those variables are set
+
+        projinfo = G_get_projinfo();
+	projunits = G_get_projunits();
+
+	char *srsWkt = GPJ_grass_to_wkt ( projinfo, projunits, 0, 0);
+	if ( srsWkt ) 
+	{
+	    poSRS = new OGRSpatialReference ( srsWkt );
+	    CPLFree ( srsWkt );
+	}
+    }
+}
+
+/************************************************************************/
+/*                           ~OGRGRASSLayer()                           */
+/************************************************************************/
+OGRGRASSLayer::~OGRGRASSLayer()
+{
+    if ( bCursorOpened ) 
+    {
+	db_close_cursor ( poCursor);
+    }
+
+    if ( poDriver ) 
+    {
+	StopDbDriver();
+    }
+    
+    if ( pszName ) CPLFree ( pszName );
+    if ( poFeatureDefn )
+        poFeatureDefn->Release();
+    if ( poSRS )
+        poSRS->Release();
+
+    if ( pszQuery ) CPLFree ( pszQuery );
+    
+    if ( paFeatureIndex ) CPLFree ( paFeatureIndex );
+    
+    if ( poLink ) CPLFree ( poLink );
+    
+    Vect_destroy_line_struct ( poPoints );
+    Vect_destroy_cats_struct ( poCats );
+
+    db_free_string ( poDbString );
+    CPLFree ( poDbString );
+    CPLFree ( poCursor );
+
+    if ( paSpatialMatch ) CPLFree ( paSpatialMatch );
+    if ( paQueryMatch ) CPLFree ( paQueryMatch );
+}
+
+/************************************************************************/
+/*                            StartDbDriver                             */
+/************************************************************************/
+bool OGRGRASSLayer::StartDbDriver()
+{
+    CPLDebug ( "GRASS", "StartDbDriver()" ); 
+
+    bCursorOpened = false;
+	    
+    if ( !poLink ) 
+    {
+	return false;
+    }
+    poDriver = db_start_driver_open_database ( poLink->driver, poLink->database );
+    
+    if ( poDriver == NULL) 
+    {
+	CPLError( CE_Failure, CPLE_AppDefined, "Cannot open database %s by driver %s, "
+		  "check if GISBASE enviroment variable is set, the driver is available "
+		  " and the database is accessible.", poLink->driver, poLink->database );
+	return false;
+    } 
+    return true;
+}
+
+/************************************************************************/
+/*                            StopDbDriver                              */
+/************************************************************************/
+bool OGRGRASSLayer::StopDbDriver()
+{
+    if ( !poDriver ) 
+    {
+	CPLError( CE_Failure, CPLE_AppDefined, "Driver is not started" );
+	return true; // I think that true is OK here
+    }
+
+    // TODO!!!: Because of bug in GRASS library it is impossible 
+    // to stop drivers in FIFO order. Until this is fixed 
+    // we have to use kill
+    CPLDebug ( "GRASS", "driver PID = %d", poDriver->pid ); 
+
+#if defined(_WIN32) || defined(__WIN32__)
+    db_close_database_shutdown_driver ( poDriver );
+#else
+    if ( kill (poDriver->pid, SIGINT) != 0 ) 
+    {
+	if ( kill (poDriver->pid, SIGKILL) != 0 ) 
+	{
+	    CPLError( CE_Failure, CPLE_AppDefined, "Cannot stop database "
+		      "driver pid = %d", poDriver->pid );
+	}
+    }
+#endif
+	    
+    bCursorOpened = false;
+    
+    return true;
+}
+
+/************************************************************************/
+/*                            ResetReading()                            */
+/************************************************************************/
+void OGRGRASSLayer::ResetReading()
+{
+    iNextId = 0;
+    
+    if ( bCursorOpened ) {
+	ResetSequentialCursor();
+    }
+}
+
+/************************************************************************/
+/*                           SetNextByIndex()                           */
+/*                                                                      */
+/*      If we already have an FID list, we can easily resposition       */
+/*      ourselves in it.                                                */
+/************************************************************************/
+OGRErr OGRGRASSLayer::SetNextByIndex( long nIndex )
+{
+    if( m_poFilterGeom != NULL || m_poAttrQuery != NULL ) 
+    {
+	iNextId = 0;
+	int count = 0;
+	
+	while ( true ) {
+	    if( iNextId >= nTotalCount ) break;
+	    if ( count == nIndex ) break;
+
+	    // Attributes
+	    if( pszQuery != NULL && !paQueryMatch[iNextId] ) {
+		iNextId++;
+		continue;
+	    }
+
+	    // Spatial
+	    if( m_poFilterGeom && !paSpatialMatch[iNextId] ) {
+		iNextId++;
+		continue;
+	    }
+	    count++;
+	}
+    }
+
+    iNextId = nIndex;
+
+    return OGRERR_NONE;
+}
+
+/************************************************************************/
+/*                           SetAttributeFilter                         */
+/************************************************************************/
+OGRErr OGRGRASSLayer::SetAttributeFilter( const char *query )
+{
+    CPLDebug ( "GRASS", "SetAttributeFilter: %s", query  );
+
+    if ( query == NULL ) {
+	// Release old if any
+	if ( pszQuery ) {
+	    CPLFree ( pszQuery );
+	    pszQuery = NULL;
+	}
+	if ( paQueryMatch ) {
+	    CPLFree ( paQueryMatch );
+	    paQueryMatch = NULL;
+	}
+	return OGRERR_NONE;
+    }
+
+    paQueryMatch = (char *) CPLMalloc ( nTotalCount );
+    memset ( paQueryMatch, 0x0, nTotalCount );
+    pszQuery = strdup ( query );
+
+    OGRLayer::SetAttributeFilter(query); // Otherwise crash on delete
+
+    if ( bHaveAttributes ) {
+
+	if ( !poDriver ) 
+	{
+	    StartDbDriver();
+	}
+
+	if ( poDriver ) 
+	{
+	    if ( bCursorOpened )
+	    {
+		db_close_cursor ( poCursor ); 
+		bCursorOpened = false;
+	    }
+	    OpenSequentialCursor();
+	    if ( bCursorOpened )
+	    {
+		SetQueryMatch();
+		db_close_cursor ( poCursor );
+		bCursorOpened = false;
+	    }
+	    else
+	    {
+		CPLFree ( pszQuery );
+		pszQuery = NULL;
+		return OGRERR_FAILURE;
+	    }
+	    db_close_database_shutdown_driver ( poDriver );
+	    poDriver = NULL;
+	}
+	else
+	{
+	    CPLFree ( pszQuery );
+	    pszQuery = NULL;
+	    return OGRERR_FAILURE;
+	}
+    }
+    else
+    {
+	// Use OGR to evaluate category match
+	for ( int i = 0; i < nTotalCount; i++ ) 
+	{
+	    OGRFeature *feature = GetFeature(i); 
+	    CPLDebug ( "GRASS", "i = %d eval = %d", i, m_poAttrQuery->Evaluate ( feature ) );
+	    if ( m_poAttrQuery->Evaluate ( feature ) )
+	    {
+		paQueryMatch[i] = 1;
+	    }
+	}
+    }
+    
+    return OGRERR_NONE;
+}
+
+/************************************************************************/
+/*                           SetQueryMatch                              */
+/************************************************************************/
+bool OGRGRASSLayer::SetQueryMatch()
+{
+    CPLDebug ( "GRASS", "SetQueryMatch" );
+
+    // NOTE: we don't have to call ResetSequentialCursor() first because
+    // this method is called immediately after OpenSequentialCursor()
+    
+    if ( !bCursorOpened ) {
+	CPLError( CE_Failure, CPLE_AppDefined, "Cursor is not opened.");
+	return false;
+    }
+
+    int more;
+    int cidx = 0; // index to category index
+    int fidx = 0; // index to feature index (paFeatureIndex)
+    // number of categories in category index
+    int ncats = Vect_cidx_get_num_cats_by_index ( poMap, iLayerIndex );
+    dbTable *table = db_get_cursor_table ( poCursor );
+    while ( true ) {
+	if( db_fetch ( poCursor, DB_NEXT, &more) != DB_OK ) 
+	{
+	    CPLError( CE_Failure, CPLE_AppDefined, "Cannot fetch attributes.");
+	    return false;
+	}
+	if ( !more ) break;
+
+	dbColumn *column = db_get_table_column ( table, iCatField );
+	dbValue *value = db_get_column_value ( column );
+	int cat = db_get_value_int ( value );
+
+	// NOTE: because of bug in GRASS library it is impossible to use
+	//       Vect_cidx_find_next
+	
+	// Go through category index until first record of current category 
+	// is found or a category > current is found
+	int cidxcat, type, id;
+	while ( cidx < ncats ) {
+	    Vect_cidx_get_cat_by_index ( poMap, iLayerIndex, cidx, 
+		                         &cidxcat, &type, &id );
+
+	    if ( cidxcat < cat ) {
+	    	cidx++;
+		continue;
+	    }
+	    if ( cidxcat > cat ) break; // Not found
+	    
+	    // We have the category we want, check type
+	    if ( !(type & (GV_POINT|GV_LINES|GV_AREA)) )
+	    {
+	    	cidx++;
+		continue;
+	    }
+
+	    // Both category and type match -> find feature and set it on
+	    while ( true ) {
+		if ( fidx > nTotalCount || paFeatureIndex[fidx] > cidx ) { 
+		    // should not happen
+		    break;
+		}
+		    
+		if ( paFeatureIndex[fidx] == cidx ) {
+		    paQueryMatch[fidx] = 1;
+		    fidx++;
+		    break;
+		}
+		fidx++;
+	    }
+	    cidx++;
+	}
+
+	if ( id < 0 ) continue; // not found
+    }
+
+    return true;
+}
+    
+/************************************************************************/
+/*                           OpenSequentialCursor                       */
+/************************************************************************/
+bool OGRGRASSLayer::OpenSequentialCursor()
+{
+    CPLDebug ( "GRASS", "OpenSequentialCursor: %s", pszQuery  );
+
+    if ( !poDriver ) 
+    {
+	CPLError( CE_Failure, CPLE_AppDefined, "Driver not opened.");
+	return false;
+    }
+
+    if ( bCursorOpened )
+    {
+	db_close_cursor ( poCursor );
+	bCursorOpened = false;
+    }
+
+    char buf[2000];
+    sprintf ( buf, "SELECT * FROM %s ", poLink->table );
+    db_set_string ( poDbString, buf);
+
+    if ( pszQuery ) {
+	sprintf ( buf, "WHERE %s ", pszQuery );
+	db_append_string ( poDbString, buf);
+    }
+
+    sprintf ( buf, "ORDER BY %s", poLink->key);
+    db_append_string ( poDbString, buf);
+
+    CPLDebug ( "GRASS", "Query: %s", db_get_string(poDbString) );
+    
+    if ( db_open_select_cursor ( poDriver, poDbString, 
+		poCursor, DB_SCROLL) == DB_OK ) 
+    {
+	iCurrentCat = -1;
+	bCursorOpened = true;
+	CPLDebug ( "GRASS", "num rows = %d", db_get_num_rows ( poCursor ) );
+    } 
+    else 
+    {
+	CPLError( CE_Failure, CPLE_AppDefined, "Cannot open cursor.");
+	return false;
+    }
+    return true;
+}
+
+/************************************************************************/
+/*                           ResetSequentialCursor                      */
+/************************************************************************/
+bool OGRGRASSLayer::ResetSequentialCursor()
+{
+    CPLDebug ( "GRASS", "ResetSequentialCursor" );
+
+    int more;
+    if( db_fetch ( poCursor, DB_FIRST, &more) != DB_OK ) 
+    {
+	CPLError( CE_Failure, CPLE_AppDefined, "Cannot reset cursor.");
+	return false;
+    }
+    if( db_fetch ( poCursor, DB_PREVIOUS, &more) != DB_OK ) 
+    {
+	CPLError( CE_Failure, CPLE_AppDefined, "Cannot reset cursor.");
+	return false;
+    }
+    return true;
+}
+
+/************************************************************************/
+/*                           SetSpatialFilter                           */
+/************************************************************************/
+void OGRGRASSLayer::SetSpatialFilter( OGRGeometry * poGeomIn )
+{
+    CPLDebug ( "GRASS", "SetSpatialFilter" );
+
+    OGRLayer::SetSpatialFilter ( poGeomIn );
+
+    if ( poGeomIn == NULL ) {
+	// Release old if any
+    	if ( paSpatialMatch ) {
+	    CPLFree ( paSpatialMatch );
+	    paSpatialMatch = NULL;
+	}
+	return;
+    }
+
+    SetSpatialMatch();
+}
+
+/************************************************************************/
+/*                           SetSpatialMatch                            */
+/************************************************************************/
+bool OGRGRASSLayer::SetSpatialMatch()
+{
+    CPLDebug ( "GRASS", "SetSpatialMatch" );
+
+    if ( !paSpatialMatch ) 
+    {
+	paSpatialMatch = (char *) CPLMalloc ( nTotalCount );
+    }
+    memset ( paSpatialMatch, 0x0, nTotalCount );
+
+    OGRGeometry *geom; 
+    OGRLineString *lstring = new OGRLineString();
+    lstring->setNumPoints ( 5 );
+    geom = lstring;
+
+    for ( int i = 0; i < nTotalCount; i++ ) {
+	int cidx = paFeatureIndex[i];
+
+	int cat, type, id;
+	
+	Vect_cidx_get_cat_by_index ( poMap, iLayerIndex, cidx, &cat, &type, &id );
+
+	BOUND_BOX box;
+
+	switch ( type ) 
+	{
+	    case GV_POINT:
+	    case GV_LINE:
+	    case GV_BOUNDARY:
+		Vect_get_line_box ( poMap, id, &box );
+		break;
+
+	    case GV_AREA:
+		Vect_get_area_box ( poMap, id, &box );
+		break;
+	}
+		
+	lstring->setPoint( 0, box.W, box.N, 0. );
+	lstring->setPoint( 1, box.W, box.S, 0. );
+	lstring->setPoint( 2, box.E, box.S, 0. );
+	lstring->setPoint( 3, box.E, box.N, 0. );
+	lstring->setPoint( 4, box.W, box.N, 0. );
+
+	if ( FilterGeometry(geom) ) {
+    	    CPLDebug ( "GRASS", "Feature %d in filter", i );
+	    paSpatialMatch[i] = 1;
+	}
+    }
+    delete lstring;
+    return true;
+}
+    
+/************************************************************************/
+/*                           GetNextFeature()                           */
+/************************************************************************/
+OGRFeature *OGRGRASSLayer::GetNextFeature()
+{
+    CPLDebug ( "GRASS", "OGRGRASSLayer::GetNextFeature" );
+    OGRFeature  *poFeature = NULL;
+
+    int cat;
+
+    // Get next iNextId
+    while ( true ) {
+	if( iNextId >= nTotalCount ) // No more features
+	{ 
+	    // Close cursor / driver if opened 
+	    if ( bCursorOpened ) 
+	    {
+	    	db_close_cursor ( poCursor);
+	    	bCursorOpened = false;
+	    }
+	    if ( poDriver ) 
+	    {
+    	    	db_close_database_shutdown_driver ( poDriver );
+		poDriver = NULL;
+	    }
+
+	    return NULL;
+	}
+
+	// Attributes
+	if( pszQuery != NULL && !paQueryMatch[iNextId] ) {
+	    iNextId++;
+	    continue;
+	}
+
+	// Spatial
+	if( m_poFilterGeom && !paSpatialMatch[iNextId] ) {
+	    iNextId++;
+	    continue;
+	}
+	
+	break; // Attributes & spatial filter match
+    }
+
+    OGRGeometry *poOGR = GetFeatureGeometry ( iNextId, &cat );
+
+    poFeature = new OGRFeature( poFeatureDefn );
+    poFeature->SetGeometryDirectly( poOGR );
+    poFeature->SetFID ( iNextId );
+    iNextId++;
+    
+    // Get attributes
+    CPLDebug ( "GRASS", "bHaveAttributes = %d", bHaveAttributes );
+    if ( bHaveAttributes ) 
+    {
+	if ( !poDriver ) 
+	{
+	    StartDbDriver();
+	}
+	if ( poDriver ) {
+	    if ( !bCursorOpened ) 
+	    {
+		OpenSequentialCursor();
+	    }
+	    if ( bCursorOpened ) 
+	    {
+		dbTable  *table = db_get_cursor_table ( poCursor );
+		if ( iCurrentCat < cat ) 
+		{
+		    while ( true ) {
+			int more;
+			if( db_fetch ( poCursor, DB_NEXT, &more) != DB_OK ) 
+			{
+			    CPLError( CE_Failure, CPLE_AppDefined, 
+				      "Cannot fetch attributes.");
+			    break;
+			}
+			if ( !more ) break;
+
+			dbColumn *column = db_get_table_column ( table, iCatField );
+			dbValue *value = db_get_column_value ( column );
+			iCurrentCat = db_get_value_int ( value );
+
+			if ( iCurrentCat >= cat ) break;
+		    }
+		}
+		if ( cat == iCurrentCat )
+		{
+		    SetAttributes ( poFeature, table );
+		} 
+		else 
+		{
+		    CPLError( CE_Failure, CPLE_AppDefined, "Attributes not found.");
+		}
+	    }
+	}
+    } 
+    else if ( iLayer > 0 ) // Add category
+    {
+	poFeature->SetField( 0, cat );
+    }	
+    
+    m_nFeaturesRead++;
+    return poFeature;
+}
+/************************************************************************/
+/*                             GetFeature()                             */
+/************************************************************************/
+OGRFeature *OGRGRASSLayer::GetFeature( long nFeatureId )
+
+{
+    CPLDebug ( "GRASS", "OGRGRASSLayer::GetFeature nFeatureId = %d", nFeatureId );
+
+    int cat;
+    OGRFeature *poFeature = NULL;
+
+    OGRGeometry *poOGR = GetFeatureGeometry ( nFeatureId, &cat );
+
+    poFeature = new OGRFeature( poFeatureDefn );
+    poFeature->SetGeometryDirectly( poOGR );
+    poFeature->SetFID ( nFeatureId );
+
+    // Get attributes
+    if ( bHaveAttributes && !poDriver ) 
+    {
+	StartDbDriver();
+    }
+    if ( poDriver ) 
+    {
+	if ( bCursorOpened ) 
+	{
+	    db_close_cursor ( poCursor);
+	    bCursorOpened = false;
+	}
+	CPLDebug ( "GRASS", "Open cursor for key = %d", cat );
+	char buf[2000];
+	sprintf ( buf, "SELECT * FROM %s WHERE %s = %d", 
+		       poLink->table, poLink->key, cat );
+	db_set_string ( poDbString, buf);
+	if ( db_open_select_cursor ( poDriver, poDbString, 
+		    poCursor, DB_SEQUENTIAL) == DB_OK ) 
+	{
+	    iCurrentCat = cat; // Not important
+	    bCursorOpened = true;
+	} 
+	else 
+	{
+	    CPLError( CE_Failure, CPLE_AppDefined, "Cannot open cursor.");
+	}
+
+	if ( bCursorOpened ) 
+	{
+	    int more;
+	    if( db_fetch ( poCursor, DB_NEXT, &more) != DB_OK ) 
+	    {
+		CPLError( CE_Failure, CPLE_AppDefined, "Cannot fetch attributes.");
+	    } 
+	    else 
+	    {
+		if ( !more ) 
+		{
+		    CPLError( CE_Failure, CPLE_AppDefined, "Attributes not found.");
+		} 
+		else 
+		{
+	    	    dbTable *table = db_get_cursor_table ( poCursor );
+		    SetAttributes ( poFeature, table );
+		}
+	    }
+	    db_close_cursor ( poCursor);
+	    bCursorOpened = false;
+	}
+    } 
+    else if ( iLayer > 0 ) // Add category
+    {
+	poFeature->SetField( 0, cat );
+    }	
+    
+    m_nFeaturesRead++;
+    return poFeature;
+}
+
+/************************************************************************/
+/*                             GetFeatureGeometry()                     */
+/************************************************************************/
+OGRGeometry *OGRGRASSLayer::GetFeatureGeometry ( long nFeatureId, int *cat )
+{
+    CPLDebug ( "GRASS", "OGRGRASSLayer::GetFeatureGeometry nFeatureId = %d", nFeatureId );
+
+    int cidx = paFeatureIndex[(int)nFeatureId];
+
+    int type, id;
+    Vect_cidx_get_cat_by_index ( poMap, iLayerIndex, cidx, cat, &type, &id );
+
+    //CPLDebug ( "GRASS", "cat = %d type = %d id = %d", *cat, type, id );
+
+    OGRGeometry *poOGR = NULL;
+
+    switch ( type ) {
+	case GV_POINT:
+        {
+	    Vect_read_line ( poMap, poPoints, poCats, id);
+	    poOGR = new OGRPoint( poPoints->x[0], poPoints->y[0], poPoints->z[0] );
+        }
+        break;
+	    
+	case GV_LINE:
+	case GV_BOUNDARY:
+        {
+	    Vect_read_line ( poMap, poPoints, poCats, id);
+	    OGRLineString *poOGRLine = new OGRLineString();
+            poOGRLine->setPoints( poPoints->n_points, 
+		                  poPoints->x, poPoints->y, poPoints->z );
+
+            poOGR = poOGRLine;
+        }
+        break;
+
+	case GV_AREA:
+        {
+	    Vect_get_area_points ( poMap, id, poPoints );
+	    
+	    OGRPolygon 		*poOGRPoly;
+	    poOGRPoly = new OGRPolygon();
+
+	    OGRLinearRing       *poRing;
+	    poRing = new OGRLinearRing();
+	    poRing->setPoints( poPoints->n_points,
+		               poPoints->x, poPoints->y, poPoints->z ); 
+
+	    poOGRPoly->addRingDirectly( poRing );
+
+	    // Islands
+	    int nisles = Vect_get_area_num_isles ( poMap, id );
+	    for ( int i = 0; i < nisles; i++ ) {
+		int isle =  Vect_get_area_isle ( poMap, id, i );
+		Vect_get_isle_points ( poMap, isle, poPoints );
+
+		poRing = new OGRLinearRing();
+		poRing->setPoints( poPoints->n_points,
+				   poPoints->x, poPoints->y, poPoints->z ); 
+
+		poOGRPoly->addRingDirectly( poRing );
+	    }
+	    
+	    poOGR = poOGRPoly;
+        }   
+        break;
+
+	default: // Should not happen
+        {
+	    CPLError( CE_Failure, CPLE_AppDefined, "Unknown GRASS feature type.");
+	    return NULL;
+        }
+    }
+	    
+    return poOGR;
+}
+
+/************************************************************************/
+/*                          SetAttributes()                             */
+/************************************************************************/
+bool OGRGRASSLayer::SetAttributes ( OGRFeature *poFeature, dbTable *table )
+{
+    CPLDebug ( "GRASS", "OGRGRASSLayer::SetAttributes" );
+
+    for ( int i = 0; i < nFields; i++) 
+    {
+	dbColumn *column = db_get_table_column ( table, i );
+	dbValue *value = db_get_column_value ( column );
+
+	int ctype = db_sqltype_to_Ctype ( db_get_column_sqltype(column) );
+
+	if ( !db_test_value_isnull(value) )
+	{
+	    switch ( ctype ) {
+		case DB_C_TYPE_INT:
+		    poFeature->SetField( i, db_get_value_int ( value ));
+		    break; 
+		case DB_C_TYPE_DOUBLE:
+		    poFeature->SetField( i, db_get_value_double ( value ));
+		    break; 
+		case DB_C_TYPE_STRING:
+		    poFeature->SetField( i, db_get_value_string ( value ));
+		    break; 
+		case DB_C_TYPE_DATETIME:
+		    db_convert_column_value_to_string ( column, poDbString );
+		    poFeature->SetField( i, db_get_string ( poDbString ));
+		    break; 
+	    }
+	}
+	
+	db_convert_column_value_to_string ( column, poDbString );
+	//CPLDebug ( "GRASS", "val = %s", db_get_string ( poDbString ));
+    }
+    return true;
+}
+
+/************************************************************************/
+/*                             SetFeature()                             */
+/************************************************************************/
+OGRErr OGRGRASSLayer::SetFeature( OGRFeature *poFeature )
+{
+    return OGRERR_FAILURE;
+}
+
+/************************************************************************/
+/*                           CreateFeature()                            */
+/************************************************************************/
+OGRErr OGRGRASSLayer::CreateFeature( OGRFeature *poFeature )
+{
+    return OGRERR_FAILURE;
+}
+
+/************************************************************************/
+/*                          GetFeatureCount()                           */
+/*                                                                      */
+/*      If a spatial filter is in effect, we turn control over to       */
+/*      the generic counter.  Otherwise we return the total count.      */
+/*      Eventually we should consider implementing a more efficient     */
+/*      way of counting features matching a spatial query.              */
+/************************************************************************/
+int OGRGRASSLayer::GetFeatureCount( int bForce )
+{
+    if( m_poFilterGeom != NULL || m_poAttrQuery != NULL )
+        return OGRLayer::GetFeatureCount( bForce );
+        
+    return nTotalCount;
+}
+
+/************************************************************************/
+/*                             GetExtent()                              */
+/*                                                                      */
+/*      Fetch extent of the data currently stored in the dataset.       */
+/*      The bForce flag has no effect on SHO files since that value     */
+/*      is always in the header.                                        */
+/*                                                                      */
+/*      Returns OGRERR_NONE/OGRRERR_FAILURE.                            */
+/************************************************************************/
+OGRErr OGRGRASSLayer::GetExtent (OGREnvelope *psExtent, int bForce)
+{
+    BOUND_BOX box;
+
+    Vect_get_map_box ( poMap, &box );
+
+    psExtent->MinX = box.W;
+    psExtent->MinY = box.S;
+    psExtent->MaxX = box.E;
+    psExtent->MaxY = box.N;
+
+    return OGRERR_NONE;
+}
+
+/************************************************************************/
+/*                           TestCapability()                           */
+/************************************************************************/
+int OGRGRASSLayer::TestCapability( const char * pszCap )
+{
+    if( EQUAL(pszCap,OLCRandomRead) )
+        return TRUE;
+
+    else if( EQUAL(pszCap,OLCFastFeatureCount) )
+        return TRUE;
+
+    else if( EQUAL(pszCap,OLCFastSpatialFilter) )
+        return FALSE;
+
+    else if( EQUAL(pszCap,OLCFastGetExtent) )
+        return TRUE;
+
+    else if( EQUAL(pszCap,OLCFastSetNextByIndex) )
+        return TRUE;
+
+    else 
+        return FALSE;
+}
+
+/************************************************************************/
+/*                            CreateField()                             */
+/************************************************************************/
+OGRErr OGRGRASSLayer::CreateField( OGRFieldDefn *poField, int bApproxOK )
+{
+    CPLError( CE_Failure, CPLE_NotSupported,
+                  "Can't create fields on a GRASS layer.\n");
+    
+    return OGRERR_FAILURE;
+}
+
+/************************************************************************/
+/*                           GetSpatialRef()                            */
+/************************************************************************/
+OGRSpatialReference *OGRGRASSLayer::GetSpatialRef()
+{
+    return poSRS;
+}
+




More information about the Pkg-grass-devel mailing list