[netcdf-fortran] 01/03: Imported Upstream version 4.4.1

Ross Gammon ross-guest at moszumanska.debian.org
Fri Jan 16 20:11:54 UTC 2015


This is an automated email from the git hooks/post-receive script.

ross-guest pushed a commit to branch master
in repository netcdf-fortran.

commit 53727d01d4ff2804854a7e8a61f2dcc5f76086b1
Author: Ross Gammon <rossgammon at mail.dk>
Date:   Fri Jan 16 20:17:29 2015 +0100

    Imported Upstream version 4.4.1
---
 CMakeExtras/Makefile.am                       |     1 +
 CMakeExtras/Makefile.in                       |   450 +
 CMakeExtras/sizeof_ptrdiff_t.c                |    17 +
 CMakeExtras/test_c_ptrdiff_t.f90              |     3 +
 CMakeLists.txt                                |   643 +
 COPYRIGHT                                     |    53 +
 CTestConfig.cmake.in                          |    17 +
 F03Interfaces_LICENSE                         |    13 +
 Makefile.am                                   |    78 +
 Makefile.in                                   |   994 +
 README.md                                     |    56 +
 RELEASE_NOTES.md                              |   111 +
 acinclude.m4                                  |   752 +
 aclocal.m4                                    |  1191 ++
 compile                                       |   347 +
 config.guess                                  |  1568 ++
 config.h.cmake.in                             |   265 +
 config.h.in                                   |   293 +
 config.sub                                    |  1793 ++
 configure                                     | 24557 ++++++++++++++++++++++++
 configure.ac                                  |   609 +
 depcomp                                       |   791 +
 docs/CMakeLists.txt                           |    28 +
 docs/Doxyfile.in                              |  2318 +++
 docs/Makefile.am                              |    95 +
 docs/Makefile.in                              |   624 +
 docs/netcdf-50x50.png                         |   Bin 0 -> 2059 bytes
 docs/netcdf.m4                                |  1514 ++
 docs/netcdf_fortran.3                         |  1370 ++
 docs/texinfo.tex                              | 10079 ++++++++++
 examples/CMakeLists.txt                       |    12 +
 examples/F77/CMakeLists.txt                   |    29 +
 examples/F77/Makefile.am                      |    41 +
 examples/F77/Makefile.in                      |  1091 ++
 examples/F77/do_comps.sh                      |    18 +
 examples/F77/pres_temp_4D_rd.f                |   169 +
 examples/F77/pres_temp_4D_wr.f                |   215 +
 examples/F77/sfc_pres_temp_rd.f               |   186 +
 examples/F77/sfc_pres_temp_wr.f               |   176 +
 examples/F77/simple_xy_nc4_rd.f               |    74 +
 examples/F77/simple_xy_nc4_wr.f               |    97 +
 examples/F77/simple_xy_rd.f                   |    74 +
 examples/F77/simple_xy_wr.f                   |   104 +
 examples/F90/CMakeLists.txt                   |    28 +
 examples/F90/Makefile.am                      |    99 +
 examples/F90/Makefile.in                      |  1257 ++
 examples/F90/do_comps.sh                      |    18 +
 examples/F90/nc4_pres_temp_4D_wr.f90          |   175 +
 examples/F90/nc4_sfc_pres_temp_wr.f90         |   144 +
 examples/F90/nc4_simple_xy_wr.f90             |    97 +
 examples/F90/pres_temp_4D_rd.f90              |   143 +
 examples/F90/pres_temp_4D_wr.f90              |   175 +
 examples/F90/run_f90_par_examples.sh          |     3 +
 examples/F90/run_nc4_comps.sh                 |    23 +
 examples/F90/sfc_pres_temp_rd.f90             |   158 +
 examples/F90/sfc_pres_temp_wr.f90             |   144 +
 examples/F90/simple_xy_nc4_rd.f90             |    89 +
 examples/F90/simple_xy_nc4_wr.f90             |    90 +
 examples/F90/simple_xy_par_rd.f90             |    96 +
 examples/F90/simple_xy_par_wr.f90             |   116 +
 examples/F90/simple_xy_par_wr2.f90            |   140 +
 examples/F90/simple_xy_rd.f90                 |    72 +
 examples/F90/simple_xy_wr.f90                 |    97 +
 examples/Makefile.am                          |     7 +
 examples/Makefile.in                          |   635 +
 fortran/CMakeLists.txt                        |   180 +
 fortran/Makefile.am                           |   233 +
 fortran/Makefile.in                           |   930 +
 fortran/module_netcdf4_f03.f90                |    42 +
 fortran/module_netcdf4_nc_interfaces.f90      |  1173 ++
 fortran/module_netcdf4_nf_interfaces.F90      |   929 +
 fortran/module_netcdf_f03.f90                 |    39 +
 fortran/module_netcdf_fortv2_c_interfaces.f90 |   690 +
 fortran/module_netcdf_nc_data.F90             |   338 +
 fortran/module_netcdf_nc_interfaces.f90       |  2315 +++
 fortran/module_netcdf_nf_data.F90             |   315 +
 fortran/module_netcdf_nf_interfaces.F90       |  1660 ++
 fortran/netcdf.f90                            |    59 +
 fortran/netcdf.inc                            |  1740 ++
 fortran/netcdf2.inc                           |   224 +
 fortran/netcdf3.inc                           |  1118 ++
 fortran/netcdf3_file.f90                      |    43 +
 fortran/netcdf4.f90                           |    67 +
 fortran/netcdf4.inc                           |   393 +
 fortran/netcdf4_eightbyte.f90                 |   808 +
 fortran/netcdf4_externals.f90                 |    32 +
 fortran/netcdf4_file.f90                      |   155 +
 fortran/netcdf4_func.f90                      |   781 +
 fortran/netcdf4_overloads.f90                 |    20 +
 fortran/netcdf4_variables.f90                 |   358 +
 fortran/netcdf4_visibility.f90                |    24 +
 fortran/netcdf_attributes.f90                 |   330 +
 fortran/netcdf_constants.f90                  |   243 +
 fortran/netcdf_dims.f90                       |    46 +
 fortran/netcdf_eightbyte.f90                  |   540 +
 fortran/netcdf_expanded.f90                   |  2638 +++
 fortran/netcdf_externals.f90                  |    50 +
 fortran/netcdf_file.f90                       |   155 +
 fortran/netcdf_overloads.f90                  |    95 +
 fortran/netcdf_text_variables.f90             |   489 +
 fortran/netcdf_variables.f90                  |    88 +
 fortran/netcdf_visibility.f90                 |    25 +
 fortran/nf_attio.F90                          |   559 +
 fortran/nf_control.F90                        |   610 +
 fortran/nf_dim.f90                            |   243 +
 fortran/nf_fortv2.f90                         |  1520 ++
 fortran/nf_genatt.f90                         |   304 +
 fortran/nf_geninq.f90                         |   207 +
 fortran/nf_genvar.f90                         |   384 +
 fortran/nf_lib.c                              |   171 +
 fortran/nf_logging.F90                        |    32 +
 fortran/nf_misc.f90                           |   133 +
 fortran/nf_nc4.f90                            |  2554 +++
 fortran/nf_v2compat.c                         |  1840 ++
 fortran/nf_var1io.F90                         |   694 +
 fortran/nf_varaio.F90                         |   827 +
 fortran/nf_vario.F90                          |   430 +
 fortran/nf_varmio.F90                         |   908 +
 fortran/nf_varsio.F90                         |   955 +
 fortran/typeSizes.f90                         |    65 +
 install-sh                                    |   527 +
 libsrc/CMakeLists.txt                         |    48 +
 libsrc/Makefile.am                            |    84 +
 libsrc/Makefile.in                            |   820 +
 libsrc/cfortran.h                             |  2526 +++
 libsrc/fort-attio.c                           |   150 +
 libsrc/fort-control.c                         |   137 +
 libsrc/fort-dim.c                             |    56 +
 libsrc/fort-genatt.c                          |    70 +
 libsrc/fort-geninq.c                          |    55 +
 libsrc/fort-genvar.c                          |    84 +
 libsrc/fort-lib.c                             |   276 +
 libsrc/fort-lib.h                             |   109 +
 libsrc/fort-misc.c                            |    53 +
 libsrc/fort-nc4.c                             |   241 +
 libsrc/fort-v2compat.c                        |  1965 ++
 libsrc/fort-var1io.c                          |   166 +
 libsrc/fort-varaio.c                          |   164 +
 libsrc/fort-vario.c                           |   168 +
 libsrc/fort-varmio.c                          |   158 +
 libsrc/fort-varsio.c                          |   167 +
 libsrc/ncfortran.h                            |   896 +
 libsrc/netcdf_f.h                             |    63 +
 libsrc/netcdf_f77.3                           |  1370 ++
 libsrc/nfconfig.in                            |   103 +
 libsrc/nfconfig.in.cmake                      |    97 +
 libsrc/nfconfig.inc                           |   103 +
 ltmain.sh                                     |  9655 ++++++++++
 m4/libtool.m4                                 |  7982 ++++++++
 m4/ltoptions.m4                               |   384 +
 m4/ltsugar.m4                                 |   123 +
 m4/ltversion.m4                               |    23 +
 m4/lt~obsolete.m4                             |    98 +
 missing                                       |   215 +
 netcdf-fortran.pc.in                          |    15 +
 nf-config.cmake.in                            |   162 +
 nf-config.in                                  |   158 +
 nf03_test/CMakeLists.txt                      |   103 +
 nf03_test/Makefile.am                         |   121 +
 nf03_test/Makefile.in                         |  1446 ++
 nf03_test/create_fills.sh                     |    11 +
 nf03_test/f03lib.c                            |   116 +
 nf03_test/f03lib_f_interfaces.f90             |   349 +
 nf03_test/f03test.F                           |  1458 ++
 nf03_test/f03tst_groups.F                     |   152 +
 nf03_test/f03tst_parallel.F                   |   135 +
 nf03_test/f03tst_types.F                      |   178 +
 nf03_test/f03tst_types2.F                     |    98 +
 nf03_test/f03tst_types3.F                     |   121 +
 nf03_test/f03tst_v2.F                         |    94 +
 nf03_test/f03tst_vars.F                       |   172 +
 nf03_test/f03tst_vars2.F                      |   137 +
 nf03_test/f03tst_vars3.F                      |   189 +
 nf03_test/f03tst_vars4.F                      |   120 +
 nf03_test/f03tst_vars5.F                      |   117 +
 nf03_test/f03tst_vars6.F                      |   204 +
 nf03_test/fills.cdl                           |    21 +
 nf03_test/handle_err.F                        |    20 +
 nf03_test/module_tests.F90                    |   255 +
 nf03_test/nf03_error.F                        |    75 +
 nf03_test/nf03_test.F                         |   388 +
 nf03_test/run_f77_par_test.sh                 |     2 +
 nf03_test/test03_get.F                        |  5600 ++++++
 nf03_test/test03_put.F                        |  6647 +++++++
 nf03_test/test03_read.F                       |  1069 ++
 nf03_test/test03_write.F                      |  1436 ++
 nf03_test/tst03_f77_v2.F                      |    73 +
 nf03_test/util03.F                            |  1496 ++
 nf_test/CMakeLists.txt                        |   199 +
 nf_test/Makefile.am                           |   179 +
 nf_test/Makefile.in                           |  1948 ++
 nf_test/create_fills.sh                       |    11 +
 nf_test/f03lib.c                              |   116 +
 nf_test/f03lib_f_interfaces.f90               |   349 +
 nf_test/f90tst_fill.f90                       |   147 +
 nf_test/f90tst_fill2.f90                      |   156 +
 nf_test/f90tst_grps.f90                       |   158 +
 nf_test/f90tst_nc4_par.f90                    |    82 +
 nf_test/f90tst_parallel.f90                   |   165 +
 nf_test/f90tst_parallel2.f90                  |   170 +
 nf_test/f90tst_parallel3.f90                  |   206 +
 nf_test/f90tst_path.f90                       |    88 +
 nf_test/f90tst_rengrps.f90                    |    99 +
 nf_test/f90tst_vars.f90                       |   106 +
 nf_test/f90tst_vars2.f90                      |   183 +
 nf_test/f90tst_vars3.f90                      |   195 +
 nf_test/f90tst_vars4.f90                      |   111 +
 nf_test/f90tst_vars_vlen.f90                  |   132 +
 nf_test/fills.cdl                             |    21 +
 nf_test/fortlib.c                             |   147 +
 nf_test/ftest.F                               |  1458 ++
 nf_test/ftst_groups.F                         |   152 +
 nf_test/ftst_parallel.F                       |   138 +
 nf_test/ftst_parallel_nasa.F                  |   142 +
 nf_test/ftst_path.F                           |    92 +
 nf_test/ftst_rengrps.F                        |   110 +
 nf_test/ftst_types.F                          |   178 +
 nf_test/ftst_types2.F                         |    98 +
 nf_test/ftst_types3.F                         |   121 +
 nf_test/ftst_v2.F                             |    94 +
 nf_test/ftst_vars.F                           |   172 +
 nf_test/ftst_vars2.F                          |   137 +
 nf_test/ftst_vars3.F                          |   189 +
 nf_test/ftst_vars4.F                          |   120 +
 nf_test/ftst_vars5.F                          |   117 +
 nf_test/ftst_vars6.F                          |   204 +
 nf_test/handle_err.F                          |    20 +
 nf_test/nf_error.F                            |    75 +
 nf_test/nf_test.F                             |   387 +
 nf_test/ref_fills.nc                          |   Bin 0 -> 264 bytes
 nf_test/run_f77_par_test.sh                   |    12 +
 nf_test/run_f90_par_test.sh                   |    16 +
 nf_test/test_get.F                            |  5599 ++++++
 nf_test/test_get.m4                           |  1073 ++
 nf_test/test_put.F                            |  6641 +++++++
 nf_test/test_put.m4                           |  1374 ++
 nf_test/test_read.F                           |  1068 ++
 nf_test/test_write.F                          |  1434 ++
 nf_test/tests.inc                             |   233 +
 nf_test/tst_f77_v2.F                          |    74 +
 nf_test/tst_f90.f90                           |   151 +
 nf_test/tst_f90_nc4.f90                       |    54 +
 nf_test/tst_flarge.f90                        |    64 +
 nf_test/tst_io.f90                            |   185 +
 nf_test/tst_types.f90                         |    93 +
 nf_test/tst_types2.f90                        |   259 +
 nf_test/util.F                                |  1449 ++
 test-driver                                   |   139 +
 248 files changed, 169287 insertions(+)

diff --git a/CMakeExtras/Makefile.am b/CMakeExtras/Makefile.am
new file mode 100644
index 0000000..ae6faf5
--- /dev/null
+++ b/CMakeExtras/Makefile.am
@@ -0,0 +1 @@
+EXTRA_DIST = sizeof_ptrdiff_t.c test_c_ptrdiff_t.f90
diff --git a/CMakeExtras/Makefile.in b/CMakeExtras/Makefile.in
new file mode 100644
index 0000000..4d8ff80
--- /dev/null
+++ b/CMakeExtras/Makefile.in
@@ -0,0 +1,450 @@
+# Makefile.in generated by automake 1.14.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2013 Free Software Foundation, Inc.
+
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+ at SET_MAKE@
+VPATH = @srcdir@
+am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
+am__make_running_with_option = \
+  case $${target_option-} in \
+      ?) ;; \
+      *) echo "am__make_running_with_option: internal error: invalid" \
+              "target option '$${target_option-}' specified" >&2; \
+         exit 1;; \
+  esac; \
+  has_opt=no; \
+  sane_makeflags=$$MAKEFLAGS; \
+  if $(am__is_gnu_make); then \
+    sane_makeflags=$$MFLAGS; \
+  else \
+    case $$MAKEFLAGS in \
+      *\\[\ \	]*) \
+        bs=\\; \
+        sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+          | sed "s/$$bs$$bs[$$bs $$bs	]*//g"`;; \
+    esac; \
+  fi; \
+  skip_next=no; \
+  strip_trailopt () \
+  { \
+    flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+  }; \
+  for flg in $$sane_makeflags; do \
+    test $$skip_next = yes && { skip_next=no; continue; }; \
+    case $$flg in \
+      *=*|--*) continue;; \
+        -*I) strip_trailopt 'I'; skip_next=yes;; \
+      -*I?*) strip_trailopt 'I';; \
+        -*O) strip_trailopt 'O'; skip_next=yes;; \
+      -*O?*) strip_trailopt 'O';; \
+        -*l) strip_trailopt 'l'; skip_next=yes;; \
+      -*l?*) strip_trailopt 'l';; \
+      -[dEDm]) skip_next=yes;; \
+      -[JT]) skip_next=yes;; \
+    esac; \
+    case $$flg in \
+      *$$target_option*) has_opt=yes; break;; \
+    esac; \
+  done; \
+  test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+target_triplet = @target@
+subdir = CMakeExtras
+DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \
+	$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+	$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+	$(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/config.h \
+	$(top_builddir)/libsrc/nfconfig1.inc
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+AM_V_P = $(am__v_P_ at AM_V@)
+am__v_P_ = $(am__v_P_ at AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_ at AM_V@)
+am__v_GEN_ = $(am__v_GEN_ at AM_DEFAULT_V@)
+am__v_GEN_0 = @echo "  GEN     " $@;
+am__v_GEN_1 = 
+AM_V_at = $(am__v_at_ at AM_V@)
+am__v_at_ = $(am__v_at_ at AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 = 
+SOURCES =
+DIST_SOURCES =
+am__can_run_installinfo = \
+  case $$AM_UPDATE_INFO_DIR in \
+    n|no|NO) false;; \
+    *) (install-info --version) >/dev/null 2>&1;; \
+  esac
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+ALLOCA = @ALLOCA@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BUILD_INTERNAL_DOCS = @BUILD_INTERNAL_DOCS@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+DOT = @DOT@
+DOXYGEN = @DOXYGEN@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+F77 = @F77@
+FC = @FC@
+FCFLAGS = @FCFLAGS@
+FCFLAGS_f90 = @FCFLAGS_f90@
+FFLAGS = @FFLAGS@
+FGREP = @FGREP@
+GREP = @GREP@
+HAS_DAP = @HAS_DAP@
+HAS_F03 = @HAS_F03@
+HAS_F90 = @HAS_F90@
+HAS_NC2 = @HAS_NC2@
+HAS_NC4 = @HAS_NC4@
+HAVE_DOT = @HAVE_DOT@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MKDIR_P = @MKDIR_P@
+MOD_FLAG = @MOD_FLAG@
+NC_FLIBS = @NC_FLIBS@
+NC_LIBS = @NC_LIBS@
+NM = @NM@
+NMEDIT = @NMEDIT@
+NMFLAGS = @NMFLAGS@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+VERSION = @VERSION@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+ac_ct_F77 = @ac_ct_F77@
+ac_ct_FC = @ac_ct_FC@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target = @target@
+target_alias = @target_alias@
+target_cpu = @target_cpu@
+target_os = @target_os@
+target_vendor = @target_vendor@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+EXTRA_DIST = sizeof_ptrdiff_t.c test_c_ptrdiff_t.f90
+all: all-am
+
+.SUFFIXES:
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign CMakeExtras/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign CMakeExtras/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+
+mostlyclean-libtool:
+	-rm -f *.lo
+
+clean-libtool:
+	-rm -rf .libs _libs
+tags TAGS:
+
+ctags CTAGS:
+
+cscope cscopelist:
+
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+	  else \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
+	    || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+check: check-am
+all-am: Makefile
+installdirs:
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	if test -z '$(STRIP)'; then \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	      install; \
+	else \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	    "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+	fi
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic clean-libtool mostlyclean-am
+
+distclean: distclean-am
+	-rm -f Makefile
+distclean-am: clean-am distclean-generic
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-generic mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am:
+
+.MAKE: install-am install-strip
+
+.PHONY: all all-am check check-am clean clean-generic clean-libtool \
+	cscopelist-am ctags-am distclean distclean-generic \
+	distclean-libtool distdir dvi dvi-am html html-am info info-am \
+	install install-am install-data install-data-am install-dvi \
+	install-dvi-am install-exec install-exec-am install-html \
+	install-html-am install-info install-info-am install-man \
+	install-pdf install-pdf-am install-ps install-ps-am \
+	install-strip installcheck installcheck-am installdirs \
+	maintainer-clean maintainer-clean-generic mostlyclean \
+	mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+	tags-am uninstall uninstall-am
+
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/CMakeExtras/sizeof_ptrdiff_t.c b/CMakeExtras/sizeof_ptrdiff_t.c
new file mode 100644
index 0000000..758008c
--- /dev/null
+++ b/CMakeExtras/sizeof_ptrdiff_t.c
@@ -0,0 +1,17 @@
+#include <stddef.h>
+#include <stdio.h>
+int main ()
+{
+  switch(sizeof(ptrdiff_t))
+  {
+    case 4:
+      printf("%1d",4);
+      break;
+    case 8:
+      printf("%1d",8);
+      break;
+    default:
+      return 1;
+  }
+  return 0;
+}
diff --git a/CMakeExtras/test_c_ptrdiff_t.f90 b/CMakeExtras/test_c_ptrdiff_t.f90
new file mode 100644
index 0000000..92ab8c9
--- /dev/null
+++ b/CMakeExtras/test_c_ptrdiff_t.f90
@@ -0,0 +1,3 @@
+program test
+   use iso_c_binding, only: c_ptrdiff_t
+end program
\ No newline at end of file
diff --git a/CMakeLists.txt b/CMakeLists.txt
new file mode 100644
index 0000000..cb78533
--- /dev/null
+++ b/CMakeLists.txt
@@ -0,0 +1,643 @@
+## This is a CMake file, part of Unidata's netCDF Fortran package.
+# Copyright 2012-2014, see the COPYRIGHT file for more information.
+
+##################################
+# Set Project Properties
+##################################
+
+#Minimum required CMake Version
+cmake_minimum_required(VERSION 2.8.9)
+
+#Project Name for netCDF-Fortran
+PROJECT (NC4F Fortran C)
+set(PACKAGE "netcdf-fortran" CACHE STRING "")
+#Project Version
+SET(NC4F_VERSION_MAJOR 4)
+SET(NC4F_VERSION_MINOR 4)
+SET(NC4F_VERSION_PATCH 1)
+SET(NC4F_VERSION_NOTE "")
+SET(NC4F_VERSION ${NC4F_VERSION_MAJOR}.${NC4F_VERSION_MINOR}.${NC4F_VERSION_PATCH}${NC4F_VERSION_NOTE})
+SET(VERSION ${NC4F_VERSION})
+SET(NC4F_LIB_VERSION 6.0.1)
+SET(NC4F_SO_VERSION 6)
+SET(PACKAGE_VERSION ${VERSION})
+
+# Set known dependencies.
+SET(EXTRA_DEPS "")
+# Get system configuration,
+# Use it to determine osname,
+# os release, cpu. These will be used
+# when committing to CDash.
+find_program(UNAME NAMES uname)
+IF(UNAME)
+  macro(getuname name flag)
+    exec_program("${UNAME}" ARGS "${flag}" OUTPUT_VARIABLE "${name}")
+  endmacro(getuname)
+  getuname(osname -s)
+  getuname(osrel  -r)
+  getuname(cpu    -m)
+  set(BUILDNAME        "${osname}-${osrel}-${cpu}" CACHE STRING "Build name variable for CDash")
+ENDIF()
+
+# Determine if DOXYGEN and DOT are available. These will be used
+# when building the documentation.
+
+FIND_PACKAGE(Doxygen)
+FIND_PROGRAM(NC_DOT NAMES dot)
+
+
+# For CMAKE_INSTALL_LIBDIR
+INCLUDE(GNUInstallDirs)
+
+IF(MSVC)
+  SET(GLOBAL PROPERTY USE_FOLDERS ON)
+ENDIF()
+
+# auto-configure style checks, other CMake modules.
+INCLUDE (${CMAKE_ROOT}/Modules/CheckLibraryExists.cmake)
+INCLUDE (${CMAKE_ROOT}/Modules/CheckIncludeFile.cmake)
+INCLUDE (${CMAKE_ROOT}/Modules/CheckTypeSize.cmake)
+INCLUDE (${CMAKE_ROOT}/Modules/CheckFunctionExists.cmake)
+INCLUDE (${CMAKE_ROOT}/Modules/CheckCXXSourceCompiles.cmake)
+INCLUDE (${CMAKE_ROOT}/Modules/TestBigEndian.cmake)
+INCLUDE (${CMAKE_ROOT}/Modules/CheckSymbolExists.cmake)
+INCLUDE (${CMAKE_ROOT}/Modules/GetPrerequisites.cmake)
+FIND_PACKAGE(PkgConfig QUIET)
+
+# Enable 'dist and distcheck'.
+# File adapted from http://ensc.de/cmake/FindMakeDist.cmake
+# TODO: this can't currently be found, need
+# FIND_PACKAGE(MakeDist)
+# End 'enable dist and distcheck'
+
+# Set the build type.
+IF (NOT CMAKE_BUILD_TYPE)
+  SET (CMAKE_BUILD_TYPE DEBUG CACHE STRING "Choose the type of build, options are: None, Debug, Release."
+    FORCE)
+ENDIF()
+
+get_filename_component (Fortran_COMPILER_NAME ${CMAKE_Fortran_COMPILER} NAME)
+
+################################
+# End Project Properties
+################################
+
+
+################################
+# Set CTest Properties
+################################
+
+ENABLE_TESTING()
+INCLUDE(CTest)
+
+# Copy the CTest customization file into binary directory, as required.
+# TODO: need to provide suitable CTestCustom.cmake
+
+
+# Set Memory test program for non-MSVC based builds.
+# Assume valgrind for now.
+IF(NOT MSVC)
+  SET (CTEST_MEMORYCHECK_COMMAND valgrind CACHE STRING "")
+ENDIF()
+
+# Set variable to define the build type.
+INCLUDE(GenerateExportHeader)
+
+################################
+# End CTest Properties
+################################
+
+
+################################
+# Compiler Configuration
+################################
+
+
+# Default to shared libs on.
+OPTION(BUILD_SHARED_LIBS "Configure netCDF as a shared library." ON)
+SET (LIB_TYPE STATIC)
+IF (BUILD_SHARED_LIBS)
+  SET(LIB_TYPE SHARED)
+  IF(CMAKE_COMPILER_IS_GNUCC OR APPLE)
+    SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fPIC")
+  ENDIF()
+ENDIF()
+
+# Supress unused variable and parameter warnings, for the time being,
+# on GCC.
+#
+# Also, set some other default compiler flags.
+IF(CMAKE_COMPILER_IS_GNUCC OR APPLE)
+  SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -g -Wall -Wno-unused-variable -Wno-unused-parameter")
+ENDIF()
+
+IF(NOT ENABLE_COVERAGE_TESTS)
+  SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O2")
+ENDIF()
+
+
+ADD_DEFINITIONS()
+
+# Supress CRT Warnings.
+# Only necessary for Windows
+IF(MSVC)
+  ADD_DEFINITIONS(-D_CRT_SECURE_NO_WARNINGS)
+ENDIF()
+
+
+################################
+# End Compiler Configuration
+################################
+
+
+################################
+# Define Utility Macros
+################################
+
+# Macro to append files to the EXTRA_DIST files.
+SET(EXTRA_DIST "")
+MACRO(ADD_EXTRA_DIST files)
+  FOREACH(F ${files})
+    SET(EXTRA_DIST ${EXTRA_DIST} ${CMAKE_CURRENT_SOURCE_DIR}/${F})
+    SET(EXTRA_DIST ${EXTRA_DIST} PARENT_SCOPE)
+  ENDFOREACH()
+ENDMACRO()
+
+# A basic script used to convert m4 files
+FIND_PROGRAM(NC4F_M4 NAMES m4)
+MACRO(GEN_m4 filename)
+  IF(NOT EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${filename}.c)
+    ADD_CUSTOM_COMMAND(
+      OUTPUT ${CMAKE_CURRENT_SOURCE_DIR}/${filename}.c
+      COMMAND ${NC4F_M4}
+      ARGS ${CMAKE_CURRENT_SOURCE_DIR}/${filename}.m4 > ${CMAKE_CURRENT_SOURCE_DIR}/${filename}.c
+      VERBATIM
+      )
+  ENDIF()
+ENDMACRO(GEN_m4)
+
+# [LEFT OFF HERE] replacing macros with ones from netcdf-c macros using NC4F_prefix
+
+# Binary tests, but ones which depend on value of 'TEMP_LARGE' being defined.
+MACRO(add_bin_env_temp_large_test prefix F)
+  ADD_EXECUTABLE(${prefix}_${F} ${F}.c)
+  TARGET_LINK_LIBRARIES(${prefix}_${F} netcdff)
+  IF(MSVC)
+    SET_TARGET_PROPERTIES(${prefix}_${F}
+      PROPERTIES LINK_FLAGS_DEBUG " /NODEFAULTLIB:MSVCRT"
+      )
+  ENDIF()
+
+
+  ADD_TEST(${prefix}_${F} bash "-c" "TEMP_LARGE=${CMAKE_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR}/${prefix}_${F}")
+  IF(MSVC)
+    SET_PROPERTY(TARGET ${prefix}_${F} PROPERTY FOLDER "tests")
+  ENDIF()
+ENDMACRO()
+
+
+# Tests which are binary, but depend on a particular environmental variable.
+MACRO(add_bin_env_test prefix F)
+  ADD_EXECUTABLE(${prefix}_${F} ${F}.c)
+  TARGET_LINK_LIBRARIES(${prefix}_${F} netcdff)
+  IF(MSVC)
+    SET_TARGET_PROPERTIES(${prefix}_${F}
+      PROPERTIES LINK_FLAGS_DEBUG " /NODEFAULTLIB:MSVCRT"
+      )
+  ENDIF()
+
+
+  ADD_TEST(${prefix}_${F} bash "-c" "TOPSRCDIR=${CMAKE_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR}/${prefix}_${F}")
+  IF(MSVC)
+    SET_PROPERTY(TARGET ${prefix}_${F} PROPERTY FOLDER "tests")
+  ENDIF()
+ENDMACRO()
+
+# Build a binary used by a script, but don't make a test out of it.
+MACRO(build_bin_test F)
+  ADD_EXECUTABLE(${F} ${F}.c)
+  TARGET_LINK_LIBRARIES(${F} netcdff)
+  IF(MSVC)
+    SET_TARGET_PROPERTIES(${F}
+      PROPERTIES LINK_FLAGS_DEBUG " /NODEFAULTLIB:MSVCRT"
+      )
+  ENDIF()
+ENDMACRO()
+
+# Binary tests which are used by a script looking for a specific name.
+MACRO(add_bin_test_no_prefix F)
+  build_bin_test(${F})
+  ADD_TEST(${F} ${EXECUTABLE_OUTPUT_PATH}/${F})
+  IF(MSVC)
+    SET_PROPERTY(TEST ${F} PROPERTY FOLDER "tests/")
+  ENDIF()
+ENDMACRO()
+
+MACRO(add_bin_test prefix F)
+
+  IF(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${F}.F)
+    set(ext ".F")
+  ELSE()
+    set(ext ".f90")
+  ENDIF()
+
+  ADD_EXECUTABLE(${prefix}_${F} ${F}${ext})
+  TARGET_LINK_LIBRARIES(${prefix}_${F} netcdff)
+  IF(MSVC)
+    SET_TARGET_PROPERTIES(${prefix}_${F}
+      PROPERTIES LINK_FLAGS_DEBUG " /NODEFAULTLIB:MSVCRT"
+      )
+  ENDIF()
+  ADD_TEST(${prefix}_${F} ${EXECUTABLE_OUTPUT_PATH}/${prefix}_${F})
+  IF(MSVC)
+    SET_PROPERTY(TEST ${prefix}_${F} PROPERTY FOLDER "tests/")
+  ENDIF()
+ENDMACRO()
+
+# A script to print out information at the end of the configuration step.
+MACRO(print_conf_summary)
+  MESSAGE("")
+  MESSAGE("")
+  MESSAGE(STATUS "CMake Summary:")
+  MESSAGE("")
+  MESSAGE(STATUS "\tBuild Type:\t\t\t" ${CMAKE_BUILD_TYPE})
+  MESSAGE(STATUS "\tBuilding Shared Libraries:\t" ${BUILD_SHARED_LIBS})
+  MESSAGE(STATUS "\tBuilding netCDF-4:\t\t" ${ENABLE_NETCDF_4})
+  MESSAGE(STATUS "\tBuilding DAP Support:\t\t" ${ENABLE_DAP})
+  MESSAGE(STATUS "\tBuilding Utilities:\t\t" ${BUILD_UTILITIES})
+  IF(CMAKE_PREFIX_PATH)
+    MESSAGE(STATUS "\tCMake Prefix Path:\t\t" "${CMAKE_PREFIX_PATH}")
+  ENDIF()
+  MESSAGE(STATUS "\tUsing pnetcdf:\t\t\t" ${STATUS_PNETCDF})
+  MESSAGE(STATUS "\tUsing Parallel IO:\t\t" ${STATUS_PARALLEL})
+
+  SET(ALL_DEP_LIBS "${NETCDF_C_LIBRARY};${EXTRA_DEPS}")
+  MESSAGE(STATUS "\tLinking against:\t\t" "${ALL_DEP_LIBS}")
+  FOREACH(_LIB ${EXTRA_DEPS})
+    GET_FILENAME_COMPONENT(_LIB_NAME ${_LIB} NAME_WE)
+    STRING(REGEX REPLACE "^lib" "" _NAME ${_LIB_NAME})
+    LIST(APPEND NCF_LIBS "-l${_NAME}")
+  ENDFOREACH()
+  MESSAGE("")
+
+ENDMACRO()
+# Shell script Macro
+MACRO(add_sh_test prefix F)
+  IF(NOT MSVC)
+    ADD_TEST(${prefix}_${F} bash "-c" "export srcdir=${CMAKE_CURRENT_SOURCE_DIR};export TOPSRCDIR=${CMAKE_SOURCE_DIR};${CMAKE_CURRENT_BINARY_DIR}/${F}.sh")
+  ENDIF()
+
+ENDMACRO()
+
+
+# Macro for replacing '/MD' with '/MT'.
+# Used only on Windows, /MD tells VS to use the shared
+# CRT libs, MT tells VS to use the static CRT libs.
+#
+# Taken From:
+# 	http://www.cmake.org/Wiki/CMake_FAQ#How_can_I_build_my_MSVC_application_with_a_static_runtime.3F
+#
+MACRO(specify_static_crt_flag)
+
+  SET(vars
+    CMAKE_C_FLAGS
+    CMAKE_C_FLAGS_DEBUG
+    CMAKE_C_FLAGS_MINSIZEREL
+    CMAKE_C_FLAGS_RELWITHDEBINFO
+    CMAKE_CXX_FLAGS CMAKE_CXX_FLAGS_DEBUG
+    CMAKE_CXX_FLAGS_RELEASE CMAKE_CXX_FLAGS_MINSIZEREL
+    CMAKE_CXX_FLAGS_RELWITHDEBINFO)
+
+  FOREACH(flag_var ${vars})
+    IF(${flag_var} MATCHES "/MD")
+      STRING(REGEX REPLACE "/MD" "/MT" ${flag_var} "${${flag_var}}")
+    ENDIF()
+  ENDFOREACH()
+
+  FOREACH(flag_var ${vars})
+    MESSAGE(STATUS " '${flag_var}': ${${flag_var}}")
+  ENDFOREACH()
+  MESSAGE(STATUS "")
+
+ENDMACRO()
+
+################################
+# End Macro Definitions
+################################
+
+
+#Add custom CMake Module
+SET (CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake/modules/"
+  CACHE INTERNAL "Location of our custom CMake modules.")
+
+SET(USE_LOGGING "ON")
+
+#####
+# Some utility macros/scripts.
+
+# Tests which are binary, but depend on a particular environmental variable.
+MACRO(add_bin_env_test prefix F)
+  ADD_EXECUTABLE(${prefix}_${F} ${F}.c)
+  TARGET_LINK_LIBRARIES(${prefix}_${F} netcdff)
+  IF(MSVC)
+    SET_TARGET_PROPERTIES(${prefix}_${F}
+      PROPERTIES LINK_FLAGS_DEBUG " /NODEFAULTLIB:MSVCRT"
+      )
+  ENDIF()
+
+
+  ADD_TEST(${prefix}_${F} bash "-c" "TOPSRCDIR=${CMAKE_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR}/${prefix}_${F}")
+  IF(MSVC)
+    SET_PROPERTY(TARGET ${prefix}_${F} PROPERTY FOLDER "tests")
+  ENDIF()
+ENDMACRO()
+
+# Build a binary used by a script, but don't make a test out of it.
+MACRO(build_bin_test F ext)
+  ADD_EXECUTABLE(${F} ${F}${ext})
+  TARGET_LINK_LIBRARIES(${F} ncfortran netcdff ${NETCDF_C_LIBRARY})
+  IF(MSVC)
+    SET_TARGET_PROPERTIES(${F}
+      PROPERTIES LINK_FLAGS_DEBUG " /NODEFAULTLIB:MSVCRT"
+      )
+  ENDIF()
+ENDMACRO()
+
+OPTION(LARGE_FILE_TESTS "Run large file tests, which are slow and take lots of disk." OFF)
+OPTION(BUILD_BENCHMARKS "Run F90 I/O Benchmarks" OFF)
+OPTION(TEST_WITH_VALGRIND "Run extra tests with valgrind" OFF)
+OPTION(TEST_PARALLEL "Run parallel I/O tests for F90 and F77" OFF)
+IF(TEST_PARALLEL)
+  SET(STATUS_PARALLEL ON)
+ENDIF()
+OPTION (ENABLE_NETCDF_4 "Enable netCDF-4" ON)
+IF(ENABLE_NETCDF_4)  # TODO: Seems like we should just use one of these
+  SET(USE_NETCDF4 ON CACHE BOOL "")
+
+  ADD_DEFINITIONS(-DUSE_NETCDF4)
+  SET(ENABLE_NETCDF_4 ON CACHE BOOL "")
+  SET(ENABLE_NETCDF4 ON CACHE BOOL "")
+
+ENDIF()
+IF (UNIX AND ${CMAKE_SIZEOF_VOID_P} MATCHES "8")
+  ADD_DEFINITIONS(-DLONGLONG_IS_LONG)
+  # for easier debugging of cfortran.h
+  IF (APPLE)
+    SET (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fmacro-backtrace-limit=0")
+  endif ()
+ENDIF()
+
+# Determine C/Fortran pointer compatibility.
+try_compile(COMPILE_SUCCESS ${CMAKE_CURRENT_BINARY_DIR}
+  "${CMAKE_CURRENT_SOURCE_DIR}/CMakeExtras/test_c_ptrdiff_t.f90"
+  )
+IF (COMPILE_SUCCESS)
+  ADD_DEFINITIONS(-DHAVE_TS29113_SUPPORT)
+ELSE ()
+  # If the compile fails, PTRDIFF_T is not defined.
+  # Get sizeof of ptrdiff_t.
+  SET(EXEC_NAME "${CMAKE_CURRENT_BINARY_DIR}/sizeof_ptrdiff_t")
+  try_compile(COMPILE_SUCCESS2 ${CMAKE_CURRENT_BINARY_DIR}
+    "${CMAKE_CURRENT_SOURCE_DIR}/CMakeExtras/sizeof_ptrdiff_t.c"
+    COPY_FILE ${EXEC_NAME}
+    )
+  IF (COMPILE_SUCCESS2)
+    EXECUTE_PROCESS(
+      COMMAND ${EXEC_NAME}
+      OUTPUT_VARIABLE SIZEOF_PTRDIFF_T
+      RESULT_VARIABLE SIZEOF_RESULT
+      )
+    IF (SIZEOF_RESULT)
+      MESSAGE (FATAL_ERROR "UNABLE TO DETERMINE SIZEOF PTRDIFF_T")
+    ELSE (SIZEOF_RESULT)
+      ADD_DEFINITIONS(-DSIZEOF_PTRDIFF_T=${SIZEOF_PTRDIFF_T})
+    ENDIF (SIZEOF_RESULT)
+  ELSE()
+    MESSAGE(FATAL_ERROR "Unable to compile ptrdiff")
+  ENDIF()
+endif()
+
+OPTION (ENABLE_NETCDF_V2 "Support old netCDF version-2 Fortran API" OFF)
+IF(ENABLE_NETCDF_V2) # TODO: Can we just use one of these?
+  SET(BUILD_V2 ON CACHE BOOL "")
+ENDIF()
+# Turn this on by default when it's working
+OPTION(ENABLE_FORTRAN_TYPE_CHECKS
+  "Determine Fortran types corresponding to netCDF types" OFF)
+
+# Toggle whether or not to run tests.
+OPTION(ENABLE_TESTS "Enable netcdf-fortran tests." ON)
+
+# Support old version-2 API for backward compatibility
+SET (ENABLE_LOGGING "ON")
+IF(ENABLE_LOGGING)
+  SET(USE_LOGGING ON CACHE BOOL "")
+ENDIF()
+
+# Set the default fortran builds; default is to build f03
+SET(BUILD_F90 "ON")
+SET(BUILD_V2 "ON")
+SET(BUILD_F03 "OFF")
+
+IF(ENABLE_FORTRAN_TYPE_CHECKS)
+  # Do tests to determine which Fortran types correspond to NCBYTE, NCSHORT, ...
+  # The configure file got these by testing an F77 program, invoking
+  # UD_FORTRAN_TYPES defined in acinclude.m4.  TODO: check the types
+  # from the test program instead of assuming these defaults.
+ELSE()
+  # Set Fortran types to default.
+  SET(NCBYTE_T "byte")
+  SET(NCBYTE_T "byte")
+  SET(NCSHORT_T "integer*2")
+  SET(NF_INT1_T "byte")
+  SET(NF_INT2_T "integer*2")
+  # Default is for following to be true.  TODO: test instead
+  SET(NF_INT1_IS_C_SIGNED_CHAR "1")
+  SET(NF_INT2_IS_C_SHORT "1")
+  SET(NF_INT_IS_C_INT "1")
+  SET(NF_REAL_IS_C_FLOAT "1")
+  SET(NF_DOUBLEPRECISION_IS_C_DOUBLE "1")
+ENDIF(ENABLE_FORTRAN_TYPE_CHECKS)
+
+# Create libsrc/nfconfig.inc (don't need nfconfig1.inc temporary file used with autoconf)
+configure_file("${NC4F_SOURCE_DIR}/libsrc/nfconfig.in.cmake"
+  "${NC4F_BINARY_DIR}/libsrc/nfconfig.inc")
+# Create config.h file
+configure_file("${NC4F_SOURCE_DIR}/config.h.cmake.in"
+  "${NC4F_BINARY_DIR}/config.h")
+
+# For now, just copy a stub file
+FILE(COPY "${NC4F_SOURCE_DIR}/nf-config.cmake.in"
+  DESTINATION "${NC4F_BINARY_DIR}"
+  FILE_PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE)
+FILE(RENAME "${NC4F_BINARY_DIR}/nf-config.cmake.in" "${NC4F_BINARY_DIR}/nf-config")
+
+# make sure previous two files get cleaned up...
+SET_DIRECTORY_PROPERTIES (DIRECTORY PROPERTY ADDITIONAL_MAKE_CLEAN_FILES ${netcdf-fortran_BINARY_DIR}/config.h ${netcdf-fortran_BINARY_DIR}/nf-config)
+
+##
+# Configuration for post-install RPath
+# Adapted from http://www.cmake.org/Wiki/CMake_RPATH_handling
+##
+IF(NOT MSVC)
+  # use, i.e. don't skip the full RPATH for the build tree
+  SET(CMAKE_SKIP_BUILD_RPATH  FALSE)
+
+  # when building, don't use the install RPATH already
+  # (but later on when installing)
+  SET(CMAKE_BUILD_WITH_INSTALL_RPATH FALSE)
+
+  IF(APPLE)
+    SET(CMAKE_MACOSX_RPATH ON)
+  ENDIF()
+
+  SET(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib")
+
+  # add the automatically determined parts of the RPATH
+  # which point to directories outside the build tree to the install RPATH
+  SET(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
+
+  # the RPATH to be used when installing, but only if it's not a system directory
+  LIST(FIND CMAKE_PLATFORM_IMPLICIT_LINK_DIRECTORIES "${CMAKE_INSTALL_PREFIX}/lib" isSystemDir)
+  IF("${isSystemDir}" STREQUAL "-1")
+    SET(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib")
+  ENDIF("${isSystemDir}" STREQUAL "-1")
+ENDIF()
+
+##
+# End configuration for post-install RPath
+##
+
+###
+# Test-related options
+###
+
+# Set CDash-related options.
+SET(NC_CTEST_PROJECT_NAME "netcdf-fortran" CACHE STRING "Project Name for CTest-based testing purposes.")
+SET(NC_CTEST_DROP_SITE "my.cdash.org" CACHE STRING "Dashboard location for CTest-based testing purposes.")
+SET(NC_CTEST_DROP_LOC_PREFIX "" CACHE STRING "Prefix for Dashboard location on remote server when using CTest-based testing.")
+
+# Generate CTestConfig file from template.
+CONFIGURE_FILE("${CMAKE_SOURCE_DIR}/CTestConfig.cmake.in"
+  "${CMAKE_SOURCE_DIR}/CTestConfig.cmake"
+  @ONLY)
+
+
+###
+# Allow the user to specify libraries
+# to link against, similar to automakes 'LIBS' variable.
+###
+SET(NC_EXTRA_DEPS "" CACHE STRING "Additional libraries to link against.")
+IF(NC_EXTRA_DEPS)
+  STRING(REPLACE " " ";" DEPS_LIST ${NC_EXTRA_DEPS})
+  FOREACH(_DEP ${DEPS_LIST})
+    STRING(REGEX REPLACE "^-l" "" _LIB ${_DEP})
+    FIND_LIBRARY("${_LIB}_DEP" NAMES "${_LIB}" "lib${_LIB}")
+    MESSAGE(${${_LIB}_DEP})
+    IF(NOT "${_LIB}_DEP")
+      MESSAGE(FATAL_ERROR "Error finding ${_LIB}.")
+    ELSE()
+      MESSAGE(STATUS "Found ${_LIB}: ${${_LIB}_DEP}")
+    ENDIF()
+    SET(EXTRA_DEPS ${EXTRA_DEPS} "${${_LIB}_DEP}")
+  ENDFOREACH()
+  MESSAGE("Extra deps: ${EXTRA_DEPS}")
+  LIST(REMOVE_DUPLICATES EXTRA_DEPS)
+ENDIF()
+###
+# End user-specified dependent libraries.
+###
+
+###
+# Seek out dependent libraries.
+###
+
+# We need the
+FIND_PACKAGE(netCDF REQUIRED)
+IF (netCDF_FOUND)
+  INCLUDE_DIRECTORIES(SYSTEM ${netCDF_INCLUDE_DIR})
+  SET(NETCDF_C_LIBRARY ${netCDF_LIBRARIES})
+ELSE()
+  # netCDF not properly packaged. Try to find it manually.
+  FIND_LIBRARY(NETCDF_C_LIBRARY NAMES netcdf libnetcdf)
+  IF(NOT NETCDF_C_LIBRARY)
+    MESSAGE(FATAL_ERROR "libnetcdf not found. Please reinstall and try again.")
+  ELSE()
+    MESSAGE(STATUS "Found netcdf: ${NETCDF_C_LIBRARY}")
+    FIND_PATH(NC_H_INCLUDE_DIR "netcdf.h")
+    IF(NOT NC_H_INCLUDE_DIR)
+      MESSAGE(FATAL_ERROR "Directory containing netcdf.h cannot be found. Please reinstall and try again.")
+    ELSE()
+      INCLUDE_DIRECTORIES(SYSTEM ${NC_H_INCLUDE_DIR})
+    ENDIF()
+  ENDIF()
+ENDIF()
+
+###
+# End 'seek out dependent libraries'
+###
+
+# Determine whether or not to generate documentation.
+OPTION(ENABLE_DOXYGEN "Enable generation of doxygen-based documentation." OFF)
+IF(ENABLE_DOXYGEN)
+  IF(DOXYGEN_FOUND)
+    # Offer the option to build internal documentation.
+    OPTION(ENABLE_INTERNAL_DOCS "Build internal documentation. This is of interest to developers only." OFF)
+    IF(ENABLE_INTERNAL_DOCS)
+      SET(BUILD_INTERNAL_DOCS YES CACHE STRING "")
+    ELSE()
+      SET(BUILD_INTERNAL_DOCS NO CACHE STRING "")
+    ENDIF()
+
+    # Option to turn on the TODO list in the doxygen-generated documentation.
+    OPTION(ENABLE_DOXYGEN_TASKS "Turn on test, todo, bug lists in documentation. This is of interest to developers only." OFF)
+    IF(ENABLE_DOXYGEN_TASKS)
+      SET(SHOW_DOXYGEN_TAG_LIST YES CACHE STRING "")
+    ELSE(ENABLE_DOXYGEN_TASKS)
+      SET(SHOW_DOXYGEN_TODO_LIST NO CACHE STRING "")
+    ENDIF(ENABLE_DOXYGEN_TASKS)
+
+    # Specify whether or not 'dot' was found on the system path.
+    IF(NC_DOT)
+      SET(HAVE_DOT YES CACHE STRING "")
+    ELSE(NC_DOT)
+      SET(HAVE_DOT NO CACHE_STRING "")
+    ENDIF(NC_DOT)
+
+  ELSE(DOXYGEN_FOUND)
+    MESSAGE(STATUS "Unable to build internal documentation.  Doxygen does not appear to be on your executable path. Install doxygen and configure the project again.")
+    SET(ENABLE_DOXYGEN OFF)
+  ENDIF(DOXYGEN_FOUND)
+ENDIF()
+
+###
+# Set global linker flags
+###
+IF(CMAKE_LINK_FLAGS)
+  SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${CMAKE_LINK_FLAGS}")
+  SET(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} ${CMAKE_LINK_FLAGS}")
+  SET(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} ${CMAKE_LINK_FLAGS}")
+ENDIF()
+
+
+INSTALL(PROGRAMS ${NC4F_BINARY_DIR}/nf-config
+        DESTINATION "${CMAKE_INSTALL_BINDIR}"
+        COMPONENT utilities)
+
+INCLUDE_DIRECTORIES(${NC4F_BINARY_DIR})
+# End autotools-style checks for config.h
+
+# Recurse into other subdirectories.
+ADD_SUBDIRECTORY(fortran)
+
+ADD_SUBDIRECTORY(libsrc)
+
+IF(ENABLE_TESTS)
+  ADD_SUBDIRECTORY(nf_test)
+  ADD_SUBDIRECTORY(nf03_test)
+ENDIF()
+
+# Build the Fortran examples
+ADD_SUBDIRECTORY(examples)
+ADD_SUBDIRECTORY(docs)
+print_conf_summary()
diff --git a/COPYRIGHT b/COPYRIGHT
new file mode 100644
index 0000000..de05b28
--- /dev/null
+++ b/COPYRIGHT
@@ -0,0 +1,53 @@
+/*! \file
+The NetCDF Copyright.
+
+\page copyright Copyright
+
+Copyright 1993-2014 University Corporation for Atmospheric
+Research/Unidata.
+
+Portions of this software were developed by the Unidata Program at the 
+University Corporation for Atmospheric Research.
+
+Access and use of this software shall impose the following obligations
+and understandings on the user. The user is granted the right, without
+any fee or cost, to use, copy, modify, alter, enhance and distribute
+this software, and any derivative works thereof, and its supporting
+documentation for any purpose whatsoever, provided that this entire
+notice appears in all copies of the software, derivative works and
+supporting documentation.  Further, UCAR requests that the user credit
+UCAR/Unidata in any publications that result from the use of this
+software or in any product that includes this software, although this
+is not an obligation. The names UCAR and/or Unidata, however, may not
+be used in any advertising or publicity to endorse or promote any
+products or commercial entity unless specific written permission is
+obtained from UCAR/Unidata. The user also understands that
+UCAR/Unidata is not obligated to provide the user with any support,
+consulting, training or assistance of any kind with regard to the use,
+operation and performance of this software nor to provide the user
+with any updates, revisions, new versions or "bug fixes."
+
+THIS SOFTWARE IS PROVIDED BY UCAR/UNIDATA "AS IS" AND ANY EXPRESS OR
+IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL UCAR/UNIDATA BE LIABLE FOR ANY SPECIAL,
+INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING
+FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
+NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
+WITH THE ACCESS, USE OR PERFORMANCE OF THIS SOFTWARE.
+
+Richard Weed's Fortran 2003 code is released under this license agreement.
+
+! This software is released under the Apache 2.0 Open Source License. The
+! full text of the License can be viewed at :
+!
+!   http:www.apache.org/licenses/LICENSE-2.0.html
+!
+! The author grants to UCAR the right to revise and extend the software
+! without restriction. However, the author retains all copyrights and
+! intellectual property rights explicit or implied by the Apache license
+
+*/
+
+
+
diff --git a/CTestConfig.cmake.in b/CTestConfig.cmake.in
new file mode 100644
index 0000000..c2f7e09
--- /dev/null
+++ b/CTestConfig.cmake.in
@@ -0,0 +1,17 @@
+## This file should be placed in the root directory of your project.
+## Then modify the CMakeLists.txt file in the root directory of your
+## project to incorporate the testing dashboard.
+##
+## # The following are required to submit to the CDash dashboard:
+##   ENABLE_TESTING()
+##   INCLUDE(CTest)
+
+set(DART_TESTING_TIMEOUT "4800")
+
+set(CTEST_PROJECT_NAME "@NC_CTEST_PROJECT_NAME@")
+set(CTEST_NIGHTLY_START_TIME "00:00:00 EST")
+
+set(CTEST_DROP_METHOD "http")
+set(CTEST_DROP_SITE "@NC_CTEST_DROP_SITE@") 
+set(CTEST_DROP_LOCATION "@NC_CTEST_DROP_LOC_PREFIX@/submit.php?project=@NC_CTEST_PROJECT_NAME@")
+set(CTEST_DROP_SITE_CDASH TRUE)
diff --git a/F03Interfaces_LICENSE b/F03Interfaces_LICENSE
new file mode 100644
index 0000000..5375ece
--- /dev/null
+++ b/F03Interfaces_LICENSE
@@ -0,0 +1,13 @@
+
+! License (and other Lawyer Language)
+ 
+! This software is released under the Apache 2.0 Open Source License. The
+! full text of the License can be viewed at :
+!
+!   http:www.apache.org/licenses/LICENSE-2.0.html
+!
+! The author grants to the University Corporation for Atmospheric Research
+! (UCAR), Boulder, CO, USA the right to revise and extend the software
+! without restriction. However, the author retains all copyrights and
+! intellectual property rights explicitly stated in or implied by the
+! Apache license
diff --git a/Makefile.am b/Makefile.am
new file mode 100644
index 0000000..fc45318
--- /dev/null
+++ b/Makefile.am
@@ -0,0 +1,78 @@
+## This is a automake file, part of Unidata's netCDF package.
+# Copyright 2012, see the COPYRIGHT file for more information.
+
+# This is the main automake file for netCDF-Fortran. It builds the
+# different netcdf directories. Not all directories are built,
+# depending on the options selected during configure.
+
+# This directory stores libtool macros, put there by aclocal.
+ACLOCAL_AMFLAGS = -I m4
+
+# These files get added to the distribution.
+EXTRA_DIST = README.md RELEASE_NOTES.md netcdf-fortran.pc.in F03Interfaces_LICENSE CMakeLists.txt COPYRIGHT nf-config.in config.h.cmake.in CTestConfig.cmake.in nf-config.cmake.in
+
+pkgconfigdir=$(libdir)/pkgconfig
+pkgconfig_DATA = netcdf-fortran.pc
+
+# All the fortran source
+FTN_DIR = fortran
+
+if BUILD_F03
+F03_TESTS = nf03_test
+else
+# All the C/H source
+LIBSRC_DIR = libsrc
+endif
+
+# This is the list of subdirs for which Makefiles will be constructed
+# and run.
+SUBDIRS = $(LIBSRC_DIR) $(FTN_DIR) nf_test $(F03_TESTS) docs examples \
+	CMakeExtras
+
+# Remove these generated files, for a distclean.
+DISTCLEANFILES = VERSION comps.txt test_prog
+
+# The nf-config script helps the user build programs with netCDF.
+bin_SCRIPTS = nf-config
+
+check_nc_config:
+	$(F90) `./nf-config --fflags` test_prog.f90 -o test_prog `./nf-config --libs`
+	./test_prog
+if BUILD_F03
+	$(F03) `./nf-config --fflags` test_prog.f03 -o test_prog `./nf-config --libs`
+	./test_prog
+endif
+
+install-data-hook:
+	@echo ''
+	@echo '+-------------------------------------------------------------+'
+	@echo '| Congratulations! You have successfully installed the netCDF |'
+	@echo '| Fortran libraries.                                          |'
+	@echo '|                                                             |'
+	@echo '| You can use script "nf-config" to find out the relevant     |'
+	@echo '| compiler options to build your application. Enter           |'
+	@echo '|                                                             |'
+	@echo '|     nf-config --help                                        |'
+	@echo '|                                                             |'
+	@echo '| for additional information.                                 |'
+	@echo '|                                                             |'
+	@echo '| CAUTION:                                                    |'
+	@echo '|                                                             |'
+	@echo '| If you have not already run "make check", then we strongly  |'
+	@echo '| recommend you do so. It does not take very long.            |'
+	@echo '|                                                             |'
+	@echo '| Before using netCDF to store important data, test your      |'
+	@echo '| build with "make check".                                    |'
+	@echo '|                                                             |'
+	@echo '| NetCDF is tested nightly on many platforms at Unidata       |'
+	@echo '| but your platform is probably different in some ways.       |'
+	@echo '|                                                             |'
+	@echo '| If any tests fail, please see the netCDF web site:          |'
+	@echo '| http://www.unidata.ucar.edu/software/netcdf/                |'
+	@echo '|                                                             |'
+	@echo '| NetCDF is developed and maintained at the Unidata Program   |'
+	@echo '| Center. Unidata provides a broad array of data and software |'
+	@echo '| tools for use in geoscience education and research.         |'
+	@echo '| http://www.unidata.ucar.edu                                 |'
+	@echo '+-------------------------------------------------------------+'
+	@echo ''
diff --git a/Makefile.in b/Makefile.in
new file mode 100644
index 0000000..7815b07
--- /dev/null
+++ b/Makefile.in
@@ -0,0 +1,994 @@
+# Makefile.in generated by automake 1.14.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2013 Free Software Foundation, Inc.
+
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+ at SET_MAKE@
+
+# Copyright 2012, see the COPYRIGHT file for more information.
+
+# This is the main automake file for netCDF-Fortran. It builds the
+# different netcdf directories. Not all directories are built,
+# depending on the options selected during configure.
+
+
+VPATH = @srcdir@
+am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
+am__make_running_with_option = \
+  case $${target_option-} in \
+      ?) ;; \
+      *) echo "am__make_running_with_option: internal error: invalid" \
+              "target option '$${target_option-}' specified" >&2; \
+         exit 1;; \
+  esac; \
+  has_opt=no; \
+  sane_makeflags=$$MAKEFLAGS; \
+  if $(am__is_gnu_make); then \
+    sane_makeflags=$$MFLAGS; \
+  else \
+    case $$MAKEFLAGS in \
+      *\\[\ \	]*) \
+        bs=\\; \
+        sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+          | sed "s/$$bs$$bs[$$bs $$bs	]*//g"`;; \
+    esac; \
+  fi; \
+  skip_next=no; \
+  strip_trailopt () \
+  { \
+    flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+  }; \
+  for flg in $$sane_makeflags; do \
+    test $$skip_next = yes && { skip_next=no; continue; }; \
+    case $$flg in \
+      *=*|--*) continue;; \
+        -*I) strip_trailopt 'I'; skip_next=yes;; \
+      -*I?*) strip_trailopt 'I';; \
+        -*O) strip_trailopt 'O'; skip_next=yes;; \
+      -*O?*) strip_trailopt 'O';; \
+        -*l) strip_trailopt 'l'; skip_next=yes;; \
+      -*l?*) strip_trailopt 'l';; \
+      -[dEDm]) skip_next=yes;; \
+      -[JT]) skip_next=yes;; \
+    esac; \
+    case $$flg in \
+      *$$target_option*) has_opt=yes; break;; \
+    esac; \
+  done; \
+  test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+target_triplet = @target@
+subdir = .
+DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \
+	$(top_srcdir)/configure $(am__configure_deps) \
+	$(srcdir)/config.h.in $(srcdir)/nf-config.in \
+	$(srcdir)/netcdf-fortran.pc.in compile config.guess config.sub \
+	install-sh missing ltmain.sh
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \
+	$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+	$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+	$(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \
+ configure.lineno config.status.lineno
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = config.h $(top_builddir)/libsrc/nfconfig1.inc
+CONFIG_CLEAN_FILES = nf-config netcdf-fortran.pc
+CONFIG_CLEAN_VPATH_FILES =
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+  for p in $$list; do echo "$$p $$p"; done | \
+  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+    if (++n[$$2] == $(am__install_max)) \
+      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+    END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__uninstall_files_from_dir = { \
+  test -z "$$files" \
+    || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+    || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+         $(am__cd) "$$dir" && rm -f $$files; }; \
+  }
+am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(pkgconfigdir)"
+SCRIPTS = $(bin_SCRIPTS)
+AM_V_P = $(am__v_P_ at AM_V@)
+am__v_P_ = $(am__v_P_ at AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_ at AM_V@)
+am__v_GEN_ = $(am__v_GEN_ at AM_DEFAULT_V@)
+am__v_GEN_0 = @echo "  GEN     " $@;
+am__v_GEN_1 = 
+AM_V_at = $(am__v_at_ at AM_V@)
+am__v_at_ = $(am__v_at_ at AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 = 
+SOURCES =
+DIST_SOURCES =
+RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \
+	ctags-recursive dvi-recursive html-recursive info-recursive \
+	install-data-recursive install-dvi-recursive \
+	install-exec-recursive install-html-recursive \
+	install-info-recursive install-pdf-recursive \
+	install-ps-recursive install-recursive installcheck-recursive \
+	installdirs-recursive pdf-recursive ps-recursive \
+	tags-recursive uninstall-recursive
+am__can_run_installinfo = \
+  case $$AM_UPDATE_INFO_DIR in \
+    n|no|NO) false;; \
+    *) (install-info --version) >/dev/null 2>&1;; \
+  esac
+DATA = $(pkgconfig_DATA)
+RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive	\
+  distclean-recursive maintainer-clean-recursive
+am__recursive_targets = \
+  $(RECURSIVE_TARGETS) \
+  $(RECURSIVE_CLEAN_TARGETS) \
+  $(am__extra_recursive_targets)
+AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \
+	cscope distdir dist dist-all distcheck
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) \
+	$(LISP)config.h.in
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates.  Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+  BEGIN { nonempty = 0; } \
+  { items[$$0] = 1; nonempty = 1; } \
+  END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique.  This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+  list='$(am__tagged_files)'; \
+  unique=`for i in $$list; do \
+    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+  done | $(am__uniquify_input)`
+ETAGS = etags
+CTAGS = ctags
+CSCOPE = cscope
+DIST_SUBDIRS = libsrc fortran nf_test nf03_test docs examples \
+	CMakeExtras
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+distdir = $(PACKAGE)-$(VERSION)
+top_distdir = $(distdir)
+am__remove_distdir = \
+  if test -d "$(distdir)"; then \
+    find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \
+      && rm -rf "$(distdir)" \
+      || { sleep 5 && rm -rf "$(distdir)"; }; \
+  else :; fi
+am__post_remove_distdir = $(am__remove_distdir)
+am__relativize = \
+  dir0=`pwd`; \
+  sed_first='s,^\([^/]*\)/.*$$,\1,'; \
+  sed_rest='s,^[^/]*/*,,'; \
+  sed_last='s,^.*/\([^/]*\)$$,\1,'; \
+  sed_butlast='s,/*[^/]*$$,,'; \
+  while test -n "$$dir1"; do \
+    first=`echo "$$dir1" | sed -e "$$sed_first"`; \
+    if test "$$first" != "."; then \
+      if test "$$first" = ".."; then \
+        dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \
+        dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \
+      else \
+        first2=`echo "$$dir2" | sed -e "$$sed_first"`; \
+        if test "$$first2" = "$$first"; then \
+          dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \
+        else \
+          dir2="../$$dir2"; \
+        fi; \
+        dir0="$$dir0"/"$$first"; \
+      fi; \
+    fi; \
+    dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \
+  done; \
+  reldir="$$dir2"
+DIST_ARCHIVES = $(distdir).tar.gz $(distdir).zip
+GZIP_ENV = --best
+DIST_TARGETS = dist-gzip dist-zip
+distuninstallcheck_listfiles = find . -type f -print
+am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \
+  | sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$'
+distcleancheck_listfiles = find . -type f -print
+ACLOCAL = @ACLOCAL@
+ALLOCA = @ALLOCA@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BUILD_INTERNAL_DOCS = @BUILD_INTERNAL_DOCS@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+DOT = @DOT@
+DOXYGEN = @DOXYGEN@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+F77 = @F77@
+FC = @FC@
+FCFLAGS = @FCFLAGS@
+FCFLAGS_f90 = @FCFLAGS_f90@
+FFLAGS = @FFLAGS@
+FGREP = @FGREP@
+GREP = @GREP@
+HAS_DAP = @HAS_DAP@
+HAS_F03 = @HAS_F03@
+HAS_F90 = @HAS_F90@
+HAS_NC2 = @HAS_NC2@
+HAS_NC4 = @HAS_NC4@
+HAVE_DOT = @HAVE_DOT@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MKDIR_P = @MKDIR_P@
+MOD_FLAG = @MOD_FLAG@
+NC_FLIBS = @NC_FLIBS@
+NC_LIBS = @NC_LIBS@
+NM = @NM@
+NMEDIT = @NMEDIT@
+NMFLAGS = @NMFLAGS@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+VERSION = @VERSION@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+ac_ct_F77 = @ac_ct_F77@
+ac_ct_FC = @ac_ct_FC@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target = @target@
+target_alias = @target_alias@
+target_cpu = @target_cpu@
+target_os = @target_os@
+target_vendor = @target_vendor@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+
+# This directory stores libtool macros, put there by aclocal.
+ACLOCAL_AMFLAGS = -I m4
+
+# These files get added to the distribution.
+EXTRA_DIST = README.md RELEASE_NOTES.md netcdf-fortran.pc.in F03Interfaces_LICENSE CMakeLists.txt COPYRIGHT nf-config.in config.h.cmake.in CTestConfig.cmake.in nf-config.cmake.in
+pkgconfigdir = $(libdir)/pkgconfig
+pkgconfig_DATA = netcdf-fortran.pc
+
+# All the fortran source
+FTN_DIR = fortran
+ at BUILD_F03_TRUE@F03_TESTS = nf03_test
+# All the C/H source
+ at BUILD_F03_FALSE@LIBSRC_DIR = libsrc
+
+# This is the list of subdirs for which Makefiles will be constructed
+# and run.
+SUBDIRS = $(LIBSRC_DIR) $(FTN_DIR) nf_test $(F03_TESTS) docs examples \
+	CMakeExtras
+
+
+# Remove these generated files, for a distclean.
+DISTCLEANFILES = VERSION comps.txt test_prog
+
+# The nf-config script helps the user build programs with netCDF.
+bin_SCRIPTS = nf-config
+all: config.h
+	$(MAKE) $(AM_MAKEFLAGS) all-recursive
+
+.SUFFIXES:
+am--refresh: Makefile
+	@:
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      echo ' cd $(srcdir) && $(AUTOMAKE) --foreign'; \
+	      $(am__cd) $(srcdir) && $(AUTOMAKE) --foreign \
+		&& exit 0; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    echo ' $(SHELL) ./config.status'; \
+	    $(SHELL) ./config.status;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	$(SHELL) ./config.status --recheck
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+	$(am__cd) $(srcdir) && $(AUTOCONF)
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+	$(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS)
+$(am__aclocal_m4_deps):
+
+config.h: stamp-h1
+	@test -f $@ || rm -f stamp-h1
+	@test -f $@ || $(MAKE) $(AM_MAKEFLAGS) stamp-h1
+
+stamp-h1: $(srcdir)/config.h.in $(top_builddir)/config.status
+	@rm -f stamp-h1
+	cd $(top_builddir) && $(SHELL) ./config.status config.h
+$(srcdir)/config.h.in: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) 
+	($(am__cd) $(top_srcdir) && $(AUTOHEADER))
+	rm -f stamp-h1
+	touch $@
+
+distclean-hdr:
+	-rm -f config.h stamp-h1
+nf-config: $(top_builddir)/config.status $(srcdir)/nf-config.in
+	cd $(top_builddir) && $(SHELL) ./config.status $@
+netcdf-fortran.pc: $(top_builddir)/config.status $(srcdir)/netcdf-fortran.pc.in
+	cd $(top_builddir) && $(SHELL) ./config.status $@
+install-binSCRIPTS: $(bin_SCRIPTS)
+	@$(NORMAL_INSTALL)
+	@list='$(bin_SCRIPTS)'; test -n "$(bindir)" || list=; \
+	if test -n "$$list"; then \
+	  echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \
+	  $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \
+	fi; \
+	for p in $$list; do \
+	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+	  if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \
+	done | \
+	sed -e 'p;s,.*/,,;n' \
+	    -e 'h;s|.*|.|' \
+	    -e 'p;x;s,.*/,,;$(transform)' | sed 'N;N;N;s,\n, ,g' | \
+	$(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1; } \
+	  { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \
+	    if ($$2 == $$4) { files[d] = files[d] " " $$1; \
+	      if (++n[d] == $(am__install_max)) { \
+		print "f", d, files[d]; n[d] = 0; files[d] = "" } } \
+	    else { print "f", d "/" $$4, $$1 } } \
+	  END { for (d in files) print "f", d, files[d] }' | \
+	while read type dir files; do \
+	     if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \
+	     test -z "$$files" || { \
+	       echo " $(INSTALL_SCRIPT) $$files '$(DESTDIR)$(bindir)$$dir'"; \
+	       $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \
+	     } \
+	; done
+
+uninstall-binSCRIPTS:
+	@$(NORMAL_UNINSTALL)
+	@list='$(bin_SCRIPTS)'; test -n "$(bindir)" || exit 0; \
+	files=`for p in $$list; do echo "$$p"; done | \
+	       sed -e 's,.*/,,;$(transform)'`; \
+	dir='$(DESTDIR)$(bindir)'; $(am__uninstall_files_from_dir)
+
+mostlyclean-libtool:
+	-rm -f *.lo
+
+clean-libtool:
+	-rm -rf .libs _libs
+
+distclean-libtool:
+	-rm -f libtool config.lt
+install-pkgconfigDATA: $(pkgconfig_DATA)
+	@$(NORMAL_INSTALL)
+	@list='$(pkgconfig_DATA)'; test -n "$(pkgconfigdir)" || list=; \
+	if test -n "$$list"; then \
+	  echo " $(MKDIR_P) '$(DESTDIR)$(pkgconfigdir)'"; \
+	  $(MKDIR_P) "$(DESTDIR)$(pkgconfigdir)" || exit 1; \
+	fi; \
+	for p in $$list; do \
+	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+	  echo "$$d$$p"; \
+	done | $(am__base_list) | \
+	while read files; do \
+	  echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(pkgconfigdir)'"; \
+	  $(INSTALL_DATA) $$files "$(DESTDIR)$(pkgconfigdir)" || exit $$?; \
+	done
+
+uninstall-pkgconfigDATA:
+	@$(NORMAL_UNINSTALL)
+	@list='$(pkgconfig_DATA)'; test -n "$(pkgconfigdir)" || list=; \
+	files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+	dir='$(DESTDIR)$(pkgconfigdir)'; $(am__uninstall_files_from_dir)
+
+# This directory's subdirectories are mostly independent; you can cd
+# into them and run 'make' without going through this Makefile.
+# To change the values of 'make' variables: instead of editing Makefiles,
+# (1) if the variable is set in 'config.status', edit 'config.status'
+#     (which will cause the Makefiles to be regenerated when you run 'make');
+# (2) otherwise, pass the desired values on the 'make' command line.
+$(am__recursive_targets):
+	@fail=; \
+	if $(am__make_keepgoing); then \
+	  failcom='fail=yes'; \
+	else \
+	  failcom='exit 1'; \
+	fi; \
+	dot_seen=no; \
+	target=`echo $@ | sed s/-recursive//`; \
+	case "$@" in \
+	  distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
+	  *) list='$(SUBDIRS)' ;; \
+	esac; \
+	for subdir in $$list; do \
+	  echo "Making $$target in $$subdir"; \
+	  if test "$$subdir" = "."; then \
+	    dot_seen=yes; \
+	    local_target="$$target-am"; \
+	  else \
+	    local_target="$$target"; \
+	  fi; \
+	  ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+	  || eval $$failcom; \
+	done; \
+	if test "$$dot_seen" = "no"; then \
+	  $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
+	fi; test -z "$$fail"
+
+ID: $(am__tagged_files)
+	$(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-recursive
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+	set x; \
+	here=`pwd`; \
+	if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
+	  include_option=--etags-include; \
+	  empty_fix=.; \
+	else \
+	  include_option=--include; \
+	  empty_fix=; \
+	fi; \
+	list='$(SUBDIRS)'; for subdir in $$list; do \
+	  if test "$$subdir" = .; then :; else \
+	    test ! -f $$subdir/TAGS || \
+	      set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \
+	  fi; \
+	done; \
+	$(am__define_uniq_tagged_files); \
+	shift; \
+	if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+	  test -n "$$unique" || unique=$$empty_fix; \
+	  if test $$# -gt 0; then \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      "$$@" $$unique; \
+	  else \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      $$unique; \
+	  fi; \
+	fi
+ctags: ctags-recursive
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+	$(am__define_uniq_tagged_files); \
+	test -z "$(CTAGS_ARGS)$$unique" \
+	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+	     $$unique
+
+GTAGS:
+	here=`$(am__cd) $(top_builddir) && pwd` \
+	  && $(am__cd) $(top_srcdir) \
+	  && gtags -i $(GTAGS_ARGS) "$$here"
+cscope: cscope.files
+	test ! -s cscope.files \
+	  || $(CSCOPE) -b -q $(AM_CSCOPEFLAGS) $(CSCOPEFLAGS) -i cscope.files $(CSCOPE_ARGS)
+clean-cscope:
+	-rm -f cscope.files
+cscope.files: clean-cscope cscopelist
+cscopelist: cscopelist-recursive
+
+cscopelist-am: $(am__tagged_files)
+	list='$(am__tagged_files)'; \
+	case "$(srcdir)" in \
+	  [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+	  *) sdir=$(subdir)/$(srcdir) ;; \
+	esac; \
+	for i in $$list; do \
+	  if test -f "$$i"; then \
+	    echo "$(subdir)/$$i"; \
+	  else \
+	    echo "$$sdir/$$i"; \
+	  fi; \
+	done >> $(top_builddir)/cscope.files
+
+distclean-tags:
+	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+	-rm -f cscope.out cscope.in.out cscope.po.out cscope.files
+
+distdir: $(DISTFILES)
+	$(am__remove_distdir)
+	test -d "$(distdir)" || mkdir "$(distdir)"
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+	  else \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
+	    || exit 1; \
+	  fi; \
+	done
+	@list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
+	  if test "$$subdir" = .; then :; else \
+	    $(am__make_dryrun) \
+	      || test -d "$(distdir)/$$subdir" \
+	      || $(MKDIR_P) "$(distdir)/$$subdir" \
+	      || exit 1; \
+	    dir1=$$subdir; dir2="$(distdir)/$$subdir"; \
+	    $(am__relativize); \
+	    new_distdir=$$reldir; \
+	    dir1=$$subdir; dir2="$(top_distdir)"; \
+	    $(am__relativize); \
+	    new_top_distdir=$$reldir; \
+	    echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \
+	    echo "     am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \
+	    ($(am__cd) $$subdir && \
+	      $(MAKE) $(AM_MAKEFLAGS) \
+	        top_distdir="$$new_top_distdir" \
+	        distdir="$$new_distdir" \
+		am__remove_distdir=: \
+		am__skip_length_check=: \
+		am__skip_mode_fix=: \
+	        distdir) \
+	      || exit 1; \
+	  fi; \
+	done
+	-test -n "$(am__skip_mode_fix)" \
+	|| find "$(distdir)" -type d ! -perm -755 \
+		-exec chmod u+rwx,go+rx {} \; -o \
+	  ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \
+	  ! -type d ! -perm -400 -exec chmod a+r {} \; -o \
+	  ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \
+	|| chmod -R a+r "$(distdir)"
+dist-gzip: distdir
+	tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz
+	$(am__post_remove_distdir)
+
+dist-bzip2: distdir
+	tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2
+	$(am__post_remove_distdir)
+
+dist-lzip: distdir
+	tardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz
+	$(am__post_remove_distdir)
+
+dist-xz: distdir
+	tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz
+	$(am__post_remove_distdir)
+
+dist-tarZ: distdir
+	@echo WARNING: "Support for shar distribution archives is" \
+	               "deprecated." >&2
+	@echo WARNING: "It will be removed altogether in Automake 2.0" >&2
+	tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z
+	$(am__post_remove_distdir)
+
+dist-shar: distdir
+	@echo WARNING: "Support for distribution archives compressed with" \
+		       "legacy program 'compress' is deprecated." >&2
+	@echo WARNING: "It will be removed altogether in Automake 2.0" >&2
+	shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz
+	$(am__post_remove_distdir)
+dist-zip: distdir
+	-rm -f $(distdir).zip
+	zip -rq $(distdir).zip $(distdir)
+	$(am__post_remove_distdir)
+
+dist dist-all:
+	$(MAKE) $(AM_MAKEFLAGS) $(DIST_TARGETS) am__post_remove_distdir='@:'
+	$(am__post_remove_distdir)
+
+# This target untars the dist file and tries a VPATH configuration.  Then
+# it guarantees that the distribution is self-contained by making another
+# tarfile.
+distcheck: dist
+	case '$(DIST_ARCHIVES)' in \
+	*.tar.gz*) \
+	  GZIP=$(GZIP_ENV) gzip -dc $(distdir).tar.gz | $(am__untar) ;;\
+	*.tar.bz2*) \
+	  bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\
+	*.tar.lz*) \
+	  lzip -dc $(distdir).tar.lz | $(am__untar) ;;\
+	*.tar.xz*) \
+	  xz -dc $(distdir).tar.xz | $(am__untar) ;;\
+	*.tar.Z*) \
+	  uncompress -c $(distdir).tar.Z | $(am__untar) ;;\
+	*.shar.gz*) \
+	  GZIP=$(GZIP_ENV) gzip -dc $(distdir).shar.gz | unshar ;;\
+	*.zip*) \
+	  unzip $(distdir).zip ;;\
+	esac
+	chmod -R a-w $(distdir)
+	chmod u+w $(distdir)
+	mkdir $(distdir)/_build $(distdir)/_inst
+	chmod a-w $(distdir)
+	test -d $(distdir)/_build || exit 0; \
+	dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \
+	  && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \
+	  && am__cwd=`pwd` \
+	  && $(am__cd) $(distdir)/_build \
+	  && ../configure \
+	    $(AM_DISTCHECK_CONFIGURE_FLAGS) \
+	    $(DISTCHECK_CONFIGURE_FLAGS) \
+	    --srcdir=.. --prefix="$$dc_install_base" \
+	  && $(MAKE) $(AM_MAKEFLAGS) \
+	  && $(MAKE) $(AM_MAKEFLAGS) dvi \
+	  && $(MAKE) $(AM_MAKEFLAGS) check \
+	  && $(MAKE) $(AM_MAKEFLAGS) install \
+	  && $(MAKE) $(AM_MAKEFLAGS) installcheck \
+	  && $(MAKE) $(AM_MAKEFLAGS) uninstall \
+	  && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \
+	        distuninstallcheck \
+	  && chmod -R a-w "$$dc_install_base" \
+	  && ({ \
+	       (cd ../.. && umask 077 && mkdir "$$dc_destdir") \
+	       && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \
+	       && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \
+	       && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \
+	            distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \
+	      } || { rm -rf "$$dc_destdir"; exit 1; }) \
+	  && rm -rf "$$dc_destdir" \
+	  && $(MAKE) $(AM_MAKEFLAGS) dist \
+	  && rm -rf $(DIST_ARCHIVES) \
+	  && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \
+	  && cd "$$am__cwd" \
+	  || exit 1
+	$(am__post_remove_distdir)
+	@(echo "$(distdir) archives ready for distribution: "; \
+	  list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \
+	  sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x'
+distuninstallcheck:
+	@test -n '$(distuninstallcheck_dir)' || { \
+	  echo 'ERROR: trying to run $@ with an empty' \
+	       '$$(distuninstallcheck_dir)' >&2; \
+	  exit 1; \
+	}; \
+	$(am__cd) '$(distuninstallcheck_dir)' || { \
+	  echo 'ERROR: cannot chdir into $(distuninstallcheck_dir)' >&2; \
+	  exit 1; \
+	}; \
+	test `$(am__distuninstallcheck_listfiles) | wc -l` -eq 0 \
+	   || { echo "ERROR: files left after uninstall:" ; \
+	        if test -n "$(DESTDIR)"; then \
+	          echo "  (check DESTDIR support)"; \
+	        fi ; \
+	        $(distuninstallcheck_listfiles) ; \
+	        exit 1; } >&2
+distcleancheck: distclean
+	@if test '$(srcdir)' = . ; then \
+	  echo "ERROR: distcleancheck can only run from a VPATH build" ; \
+	  exit 1 ; \
+	fi
+	@test `$(distcleancheck_listfiles) | wc -l` -eq 0 \
+	  || { echo "ERROR: files left in build directory after distclean:" ; \
+	       $(distcleancheck_listfiles) ; \
+	       exit 1; } >&2
+check-am: all-am
+check: check-recursive
+all-am: Makefile $(SCRIPTS) $(DATA) config.h
+installdirs: installdirs-recursive
+installdirs-am:
+	for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(pkgconfigdir)"; do \
+	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
+	done
+install: install-recursive
+install-exec: install-exec-recursive
+install-data: install-data-recursive
+uninstall: uninstall-recursive
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-recursive
+install-strip:
+	if test -z '$(STRIP)'; then \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	      install; \
+	else \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	    "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+	fi
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+	-test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-recursive
+
+clean-am: clean-generic clean-libtool mostlyclean-am
+
+distclean: distclean-recursive
+	-rm -f $(am__CONFIG_DISTCLEAN_FILES)
+	-rm -f Makefile
+distclean-am: clean-am distclean-generic distclean-hdr \
+	distclean-libtool distclean-tags
+
+dvi: dvi-recursive
+
+dvi-am:
+
+html: html-recursive
+
+html-am:
+
+info: info-recursive
+
+info-am:
+
+install-data-am: install-pkgconfigDATA
+	@$(NORMAL_INSTALL)
+	$(MAKE) $(AM_MAKEFLAGS) install-data-hook
+install-dvi: install-dvi-recursive
+
+install-dvi-am:
+
+install-exec-am: install-binSCRIPTS
+
+install-html: install-html-recursive
+
+install-html-am:
+
+install-info: install-info-recursive
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-recursive
+
+install-pdf-am:
+
+install-ps: install-ps-recursive
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-recursive
+	-rm -f $(am__CONFIG_DISTCLEAN_FILES)
+	-rm -rf $(top_srcdir)/autom4te.cache
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-recursive
+
+mostlyclean-am: mostlyclean-generic mostlyclean-libtool
+
+pdf: pdf-recursive
+
+pdf-am:
+
+ps: ps-recursive
+
+ps-am:
+
+uninstall-am: uninstall-binSCRIPTS uninstall-pkgconfigDATA
+
+.MAKE: $(am__recursive_targets) all install-am install-data-am \
+	install-strip
+
+.PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am \
+	am--refresh check check-am clean clean-cscope clean-generic \
+	clean-libtool cscope cscopelist-am ctags ctags-am dist \
+	dist-all dist-bzip2 dist-gzip dist-lzip dist-shar dist-tarZ \
+	dist-xz dist-zip distcheck distclean distclean-generic \
+	distclean-hdr distclean-libtool distclean-tags distcleancheck \
+	distdir distuninstallcheck dvi dvi-am html html-am info \
+	info-am install install-am install-binSCRIPTS install-data \
+	install-data-am install-data-hook install-dvi install-dvi-am \
+	install-exec install-exec-am install-html install-html-am \
+	install-info install-info-am install-man install-pdf \
+	install-pdf-am install-pkgconfigDATA install-ps install-ps-am \
+	install-strip installcheck installcheck-am installdirs \
+	installdirs-am maintainer-clean maintainer-clean-generic \
+	mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \
+	ps ps-am tags tags-am uninstall uninstall-am \
+	uninstall-binSCRIPTS uninstall-pkgconfigDATA
+
+
+check_nc_config:
+	$(F90) `./nf-config --fflags` test_prog.f90 -o test_prog `./nf-config --libs`
+	./test_prog
+ at BUILD_F03_TRUE@	$(F03) `./nf-config --fflags` test_prog.f03 -o test_prog `./nf-config --libs`
+ at BUILD_F03_TRUE@	./test_prog
+
+install-data-hook:
+	@echo ''
+	@echo '+-------------------------------------------------------------+'
+	@echo '| Congratulations! You have successfully installed the netCDF |'
+	@echo '| Fortran libraries.                                          |'
+	@echo '|                                                             |'
+	@echo '| You can use script "nf-config" to find out the relevant     |'
+	@echo '| compiler options to build your application. Enter           |'
+	@echo '|                                                             |'
+	@echo '|     nf-config --help                                        |'
+	@echo '|                                                             |'
+	@echo '| for additional information.                                 |'
+	@echo '|                                                             |'
+	@echo '| CAUTION:                                                    |'
+	@echo '|                                                             |'
+	@echo '| If you have not already run "make check", then we strongly  |'
+	@echo '| recommend you do so. It does not take very long.            |'
+	@echo '|                                                             |'
+	@echo '| Before using netCDF to store important data, test your      |'
+	@echo '| build with "make check".                                    |'
+	@echo '|                                                             |'
+	@echo '| NetCDF is tested nightly on many platforms at Unidata       |'
+	@echo '| but your platform is probably different in some ways.       |'
+	@echo '|                                                             |'
+	@echo '| If any tests fail, please see the netCDF web site:          |'
+	@echo '| http://www.unidata.ucar.edu/software/netcdf/                |'
+	@echo '|                                                             |'
+	@echo '| NetCDF is developed and maintained at the Unidata Program   |'
+	@echo '| Center. Unidata provides a broad array of data and software |'
+	@echo '| tools for use in geoscience education and research.         |'
+	@echo '| http://www.unidata.ucar.edu                                 |'
+	@echo '+-------------------------------------------------------------+'
+	@echo ''
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..e4c7872
--- /dev/null
+++ b/README.md
@@ -0,0 +1,56 @@
+Unidata NetCDF Fortran Library
+========================================
+
+
+Overview 
+--------
+
+
+The Unidata network Common Data Form (netCDF) is an interface for scientific data access and a set of freely-distributed software libraries that provide an implementation of the interface.  The netCDF library also defines a machine-independent format for representing scientific data.  Together, the interface, library, and format support the creation, access, and sharing of scientific data.  This software package provides Fortran application interfaces for accessing netCDF data.  It depen [...]
+
+NetCDF files are self-describing, network-transparent, directly accessible, and extendible.  `Self-describing` means that a netCDF file includes information about the data it contains.  `Network-transparent` means that a netCDF file is represented in a form that can be accessed by computers with different ways of storing integers, characters, and floating-point numbers.  `Direct-access` means that a small subset of a large dataset may be accessed efficiently, without first reading throug [...]
+
+NetCDF is useful for supporting access to diverse kinds of scientific data in heterogeneous networking environments and for writing application software that does not depend on application-specific formats.  For information about a variety of analysis and display packages that have been developed to analyze and display data in netCDF form, see 
+
+* http://www.unidata.ucar.edu/netcdf/software.html
+
+For more information about netCDF, see the netCDF Web page at
+
+* http://www.unidata.ucar.edu/netcdf/
+
+Getting NetCDF
+--------------
+
+You can obtain a copy of the latest released versions of netCDF software from
+
+* http://github.com/Unidata/netcdf-c 
+* http://github.com/Unidata/netcdf-fortran
+* http://github.com/Unidata/netcdf-cxx4
+* http://github.com/Unidata/netcdf4-python
+
+Copyright and licensing information can be found here, as well as in the COPYRIGHT file accompanying the software
+
+* http://www.unidata.ucar.edu/software/netcdf/copyright.html
+
+To install this package, please see the file INSTALL in the distribution, or the (usually more up-to-date) document:
+
+* http://www.unidata.ucar.edu/netcdf/docs/netcdf-fortran-install.html
+
+Additional Documentation
+------------------------
+
+The netCDF-3 C and FORTRAN-77 interfaces are documented in man(1) pages at
+
+* http://www.unidata.ucar.edu/netcdf/docs/netcdf-man-3.html
+* http://www.unidata.ucar.edu/netcdf/docs/netcdf-man-3f.html 
+
+User's Guides are also available in several forms from the same location.
+
+Mailing List
+------------
+
+A mailing list, netcdfgroup at unidata.ucar.edu, exists for discussion of the netCDF interface and announcements about netCDF bugs, fixes, and enhancements.  For information about how to subscribe, see the URL
+
+* http://www.unidata.ucar.edu/netcdf/mailing-lists.html
+
+We appreciate feedback from users of this package.  Please send comments, suggestions, and bug reports to <support-netcdf at unidata.ucar.edu>.  Please identify the version of the package.
diff --git a/RELEASE_NOTES.md b/RELEASE_NOTES.md
new file mode 100644
index 0000000..99c59c0
--- /dev/null
+++ b/RELEASE_NOTES.md
@@ -0,0 +1,111 @@
+Release Notes {#release_notes}
+==============================
+
+\brief Release notes file for the netcdf-fortran package.
+
+This file contains a high-level description of this package's evolution.
+Entries are in reverse chronological order (most recent first).
+
+## 4.4.1 Released 2014-09-09
+
+* No significant changes from RC1.
+
+### 4.4.1-RC1 Released 2014-08-05
+
+* Added a new variable for cmake-based builds, `NC_EXTRA_DEPS`.  Use this to specify additional dependencies when linking against a static `netcdf-c` library, e.g.
+
+```
+   netcdf-fortran/build$ cmake .. -DNC_EXTRA_DEPS="-lhdf5 -lhdf5_hl -lcurl"
+```
+
+* Fixed to build correctly with netCDF-3-only C library, for example C library configured with --disable-netcdf-4 (R. Weed).
+
+## 4.4 Released 2014-07-08
+
+* For 32-bit platforms fixed integer fill parameters, initialized potentially
+  unitialized variables, and provided some missing defaults (R. Weed).
+
+* Fixed CMake builds on 32-bit platforms.
+
+* Added new `inq_path` and `rename_grps` functions analogous to
+  corresponding C functions. Added associated tests (R. Weed).
+
+* Added support for NF\_MPIIO, `NF_MPIPOSIX`, `NF_PNETCDF` flags and
+  `NF_FILL_UINT`. (R. Weed)
+
+* Fixed potential bug in attribute functions for integer values when
+  Fortran `INTEGER*1` or `INTEGER*2` types are the same size as C
+  long (R. Weed).
+
+* Added test for compiler support of Fortran 2008 `ISO_FORTRAN_ENV`
+  additions and TS29113 standard extension.
+
+* Fixed `C_PTR_DIFF_T` issue reported by Orion Poplowski (R. Weed).
+
+### 4.4-rc1 	Released 2013-10-06
+
+* Added doxygen-generated documentation, using the `--enable-doxygen` and `-DENABLE_DOXYGEN` flags for autotools and cmake-based builds, respectively.
+
+* Added missing error codes for DAP and some netCDF-4 errors
+
+* Fixed some documentation for F77 API, added make rule for creating netcdf-f77 HTML files.
+
+### 4.4-beta5 	Released 2013-08-27
+
+* Added configuration files to github distribution.
+
+### 4.4-beta4      
+
+* Moved to GitHub from Subversion, the location of the new GitHub repository is at: http://github.com/Unidata/netCDF-Fortran
+
+* Parallel-build portability fixes, particularly for
+		OpenMPI and gcc/gfortran-4.8.x on the Mac.  Also added
+		test from Reto Stöckli for NCF-250 bug, demonstrating
+		it was fixed in previous commit.
+		
+* Add support for NF\_MPIIO, NF\_MPIPOSIX, NF\_PNETCDF, and
+		NF\_FILL\_UINT in the data files.
+
+* Add support for nf\_inq\_path.
+
+* Add a pre-processor macro that can be used to bypass
+		the home-brew C_PTRDIFF_T definition and use the
+		standard one for compilers that support it.
+
+* Fix a potential bug in nf\_attio to call the \_long
+		version of some puts/gets instead of the \_int
+		version. These were inside INT1\_IS\_C\_LONG and
+		INT2\_IS\_C\_LONG ifdef blocks so they would have only
+		showed up when those macros were true.
+
+### 4.4-beta3	Released 2012-12-07
+
+* Fixed bug that "make -j check" fails, but "make check" works fine.
+
+* Fixed build problems resulting from syncing with separate C distribution.
+
+* Synchronize with all changes made to version 4.2 since ts release.
+
+### 4.4-beta2	Released 2012-06-29
+
+* Made handling of --disable-f03 more transparent.
+
+* Fixed adding flags for parallel I/O for MPI from David Warren.
+
+* Removed all the old C code that's not needed for this separate distribution.
+
+* Inadvertently broke the build until syncing with C distribution in later beta release.
+
+### 4.4-beta1	Released 2012-03-02
+
+* `Fortran 2003 Support`
+       
+    Version 4.4 is the first release to support fortran 2003 and to use the ISO C Bindings available in fortran 2003 to replace the older C code wrappers.
+
+    Congratulations and thanks to Richard Weed at Mississippi State University, who is the author of new code.
+	        
+    See the file `README_F03_MODS` for a more complete description of the changes. Many changes to the build structure have been made at the same time as the new 2003 code has been inserted.
+
+    As part of the fortran 2003 refactor, the directory structure has been significantly modified.  All the previous F90 C wrapper code has been moved to the "libsrc" directory. 
+
+    All of the fortran code has been moved to the "fortran" directory. The directories names F77 and F90 have been removed. The most important consequence of this refactor is that pure Fortran77 compilers are no longer supported. It is assumed that the compiler supports at least Fortran 90 and also Fortran 77.  If it also supports the ISO C Bindings, then the new 2003 code is used instead of the older C wrappers.
diff --git a/acinclude.m4 b/acinclude.m4
new file mode 100644
index 0000000..cefd145
--- /dev/null
+++ b/acinclude.m4
@@ -0,0 +1,752 @@
+dnl $Id: acinclude.m4,v 1.34 2009/10/14 21:12:01 dmh Exp $
+dnl UD macros for netcdf configure
+
+
+dnl Convert a string to all uppercase.
+dnl
+define([uppercase],
+[translit($1, abcdefghijklmnopqrstuvwxyz, ABCDEFGHIJKLMNOPQRSTUVWXYZ)])
+
+dnl
+dnl Check for an nm(1) utility.
+dnl
+AC_DEFUN([UD_PROG_NM],
+[
+    case "${NM-unset}" in
+	unset) AC_CHECK_PROGS(NM, nm, nm) ;;
+	*) AC_CHECK_PROGS(NM, $NM nm, nm) ;;
+    esac
+    AC_MSG_CHECKING(nm flags)
+    case "${NMFLAGS-unset}" in
+	unset) NMFLAGS= ;;
+    esac
+    AC_MSG_RESULT($NMFLAGS)
+    AC_SUBST(NMFLAGS)
+])
+
+dnl
+dnl Check for an m4(1) preprocessor utility.
+dnl
+AC_DEFUN([UD_PROG_M4],
+[
+    case "${M4-unset}" in
+	unset) AC_CHECK_PROGS(M4, m4 gm4, m4) ;;
+	*) AC_CHECK_PROGS(M4, $M4 m4 gm4, m4) ;;
+    esac
+    AC_MSG_CHECKING(m4 flags)
+    case "${M4FLAGS-unset}" in
+	unset) M4FLAGS=-B10000 ;;
+    esac
+    AC_MSG_RESULT($M4FLAGS)
+    AC_SUBST(M4FLAGS)
+])
+
+dnl
+dnl Set the top-level source-directory.
+dnl
+AC_DEFUN([UD_SRCDIR],
+[
+    AC_MSG_CHECKING(for top-level source-directory)
+    SRCDIR=`(cd $srcdir && pwd)`
+    AC_MSG_RESULT($SRCDIR)
+    AC_SUBST(SRCDIR)
+])
+
+
+dnl
+dnl like AC_LONG_DOUBLE, except checks for 'long long'
+dnl
+AC_DEFUN([UD_C_LONG_LONG],
+[AC_MSG_CHECKING(for long long)
+AC_CACHE_VAL(ac_cv_c_long_long,
+[if test "$GCC" = yes; then
+  ac_cv_c_long_long=yes
+else
+AC_TRY_RUN([int main() {
+long long foo = 0;
+exit(sizeof(long long) < sizeof(long)); }],
+ac_cv_c_long_long=yes, ac_cv_c_long_long=no, :)
+fi])dnl
+AC_MSG_RESULT($ac_cv_c_long_long)
+if test "$ac_cv_c_long_long" = yes; then
+  AC_DEFINE([HAVE_LONG_LONG], [], [have long long type])
+fi
+])
+
+dnl UD_CHECK_SIZEOF(TYPE)
+AC_DEFUN([UD_CHECK_SIZEOF],
+[changequote(<<, >>)dnl
+dnl The name to #define.
+define(<<AC_TYPE_NAME>>, translit(sizeof_$1, [a-z *], [A-Z_P]))dnl
+dnl The cache variable name.
+define(<<AC_CV_NAME>>, translit(ac_cv_sizeof_$1, [ *], [_p]))dnl
+changequote([, ])dnl
+AC_MSG_CHECKING(size of $1)
+AC_CACHE_VAL(AC_CV_NAME,
+[AC_TRY_RUN([#include <stdio.h>
+#include <sys/types.h>
+#if STDC_HEADERS
+#include <stdlib.h>
+#endif
+main()
+{
+  FILE *f=fopen("conftestval", "w");
+  if (!f) exit(1);
+  fprintf(f, "%d\n", sizeof($1));
+  exit(0);
+}], AC_CV_NAME=`cat conftestval`, AC_CV_NAME=0, AC_CV_NAME=0)])dnl
+AC_MSG_RESULT($AC_CV_NAME)
+AC_DEFINE_UNQUOTED(AC_TYPE_NAME, $AC_CV_NAME, [type size])
+undefine([AC_TYPE_NAME])dnl
+undefine([AC_CV_NAME])dnl
+])
+
+
+dnl 
+dnl UD_CHECK_IEEE
+dnl If the 'double' is not an IEEE double
+dnl or the 'float' is not and IEEE single,
+dnl define NO_IEEE_FLOAT
+dnl
+AC_DEFUN([UD_CHECK_IEEE],
+[
+AC_MSG_CHECKING(for IEEE floating point format)
+AC_TRY_RUN([#ifndef NO_FLOAT_H
+#include <float.h>
+#endif
+
+#define EXIT_NOTIEEE	1
+#define EXIT_MAYBEIEEE	0
+
+int
+main()
+{
+#if	defined(FLT_RADIX)	&& FLT_RADIX != 2
+		return EXIT_NOTIEEE;
+#elif	defined(DBL_MAX_EXP)	&& DBL_MAX_EXP != 1024
+		return EXIT_NOTIEEE;
+#elif	defined(DBL_MANT_DIG)	&& DBL_MANT_DIG != 53
+		return EXIT_NOTIEEE;
+#elif 	defined(FLT_MAX_EXP)	&& !(FLT_MAX_EXP == 1024 || FLT_MAX_EXP == 128)
+		return EXIT_NOTIEEE;
+#elif	defined(FLT_MANT_DIG)	&& !(FLT_MANT_DIG == 53 || FLT_MANT_DIG == 24)
+		return EXIT_NOTIEEE;
+#else
+	/* (assuming eight bit char) */
+	if(sizeof(double) != 8)
+		return EXIT_NOTIEEE;
+	if(!(sizeof(float) == 4 || sizeof(float) == 8))
+		return EXIT_NOTIEEE;
+
+	return EXIT_MAYBEIEEE;
+#endif
+}],ac_cv_c_ieeefloat=yes, ac_cv_c_ieeefloat=no, :)
+AC_MSG_RESULT($ac_cv_c_ieeefloat)
+if test "$ac_cv_c_ieeefloat" = no; then
+  AC_DEFINE([NO_IEEE_FLOAT], [], [no IEEE float on this platform])
+fi
+])
+
+dnl Check for utility for generating makefile dependencies.
+dnl Should only be used at the UPC.
+dnl
+AC_DEFUN([UD_PROG_CC_MAKEDEPEND],
+[
+    AC_MSG_CHECKING(how to make dependencies)
+    case `uname -s` in
+	IRIX*|OSF1)
+	    CC_MAKEDEPEND='cc -M'
+	    ;;
+	SunOS)
+	    case `uname -r` in
+		4*)
+		    CC_MAKEDEPEND='cc -M'
+		    ;;
+		5*|*)
+		    CC_MAKEDEPEND='cc -xM'
+		    ;;
+	    esac
+	    ;;
+	ULTRIX)
+	    case `uname -m` in
+		RISC)
+		    CC_MAKEDEPEND='cc -M'
+		    ;;
+		VAX)	# Can't handle prototypes in netcdf.h
+		    ;;
+	    esac
+	    ;;
+	AIX)	# Writes to .u files rather than standard out
+	    ;;
+	HP-UX)	# Writes escaped newlines to standard error
+	    ;;
+    esac
+    case "${CC_MAKEDEPEND}" in
+	'')
+	    CC_MAKEDEPEND=false
+	    ;;
+    esac
+    AC_MSG_RESULT($CC_MAKEDEPEND)
+    AC_SUBST(CC_MAKEDEPEND)
+])
+
+dnl Check for a Fortran type equivalent to a netCDF type.
+dnl
+dnl UD_CHECK_FORTRAN_NCTYPE(forttype, possibs, nctype)
+dnl
+AC_DEFUN([UD_CHECK_FORTRAN_NCTYPE],
+[
+    AC_MSG_CHECKING(for Fortran-equivalent to netCDF \"$3\")
+    for type in $2; do
+	cat >conftest.f <<EOF
+               $type foo
+               end
+EOF
+	doit='$FC -c ${FFLAGS} conftest.f'
+	if AC_TRY_EVAL(doit); then
+	    break;
+	fi
+    done
+    rm -f conftest.f conftest.o
+    AC_DEFINE_UNQUOTED($1, $type, [type definition])
+    AC_MSG_RESULT($type)
+    $1=$type
+])
+
+
+dnl Check for a Fortran type equivalent to a C type.
+dnl
+dnl UD_CHECK_FORTRAN_CTYPE(v3forttype, v2forttype, ctype, min, max)
+dnl
+AC_DEFUN([UD_CHECK_FORTRAN_CTYPE],
+[
+    AC_MSG_CHECKING(for Fortran-equivalent to C \"$3\")
+    cat >conftest.f <<EOF
+        subroutine sub(values, minval, maxval)
+        implicit        none
+        $2              values(5), minval, maxval
+        minval = values(2)
+        maxval = values(4)
+        if (values(2) .ge. values(4)) then
+            minval = values(4)
+            maxval = values(2)
+        endif
+        end
+EOF
+    doit='$FC -c ${FFLAGS conftest.f'
+    if AC_TRY_EVAL(doit); then
+	mv conftest.o conftestf.o
+	cat >conftest.c <<EOF
+#include <limits.h>
+#include <float.h>
+void main()
+{
+$3		values[[]] = {0, $4, 0, $5, 0};
+$3		minval, maxval;
+void	$FCALLSCSUB($3*, $3*, $3*);
+$FCALLSCSUB(values, &minval, &maxval);
+exit(!(minval == $4 && maxval == $5));
+}
+EOF
+	doit='$CC -o conftest ${CPPFLAGS} ${CFLAGS} ${LDFLAGS} conftest.c conftestf.o ${LIBS}'
+	if AC_TRY_EVAL(doit); then
+	    doit=./conftest
+	    if AC_TRY_EVAL(doit); then
+		AC_MSG_RESULT($2)
+		$1=$2
+		AC_DEFINE_UNQUOTED($1,$2, [take a guess])
+	    else
+		AC_MSG_RESULT(no equivalent type)
+		unset $1
+	    fi
+	else
+	    AC_MSG_ERROR(Could not compile-and-link conftest.c and conftestf.o)
+	fi
+    else
+	AC_MSG_ERROR(Could not compile conftest.f)
+    fi
+    rm -f conftest*
+])
+
+
+dnl Check for a Fortran data type.
+dnl
+dnl UD_CHECK_FORTRAN_TYPE(varname, ftypes)
+dnl
+AC_DEFUN([UD_CHECK_FORTRAN_TYPE],
+[
+    for ftype in $2; do
+	AC_MSG_CHECKING(for Fortran \"$ftype\")
+	cat >conftest.f <<EOF
+      subroutine sub(value)
+      $ftype value
+      end
+EOF
+	doit='$FC -c ${FFLAGS} conftest.f'
+	if AC_TRY_EVAL(doit); then
+	    AC_MSG_RESULT(yes)
+	    $1=$ftype
+	    AC_DEFINE_UNQUOTED($1, $ftype, [type thing])
+	    break
+	else
+	    AC_MSG_RESULT(no)
+	fi
+    done
+    rm -f conftest*
+])
+
+
+dnl Check for the name format of a Fortran-callable C routine.
+dnl
+dnl UD_CHECK_FCALLSCSUB
+AC_DEFUN([UD_CHECK_FCALLSCSUB],
+[
+#    AC_REQUIRE([UD_PROG_FC])
+    case "$FC" in
+	'') ;;
+	*)
+	    AC_REQUIRE([UD_PROG_NM])
+	    AC_BEFORE([UD_CHECK_FORTRAN_CTYPE])
+	    AC_BEFORE([UD_CHECK_CTYPE_FORTRAN])
+	    AC_MSG_CHECKING(for C-equivalent to Fortran routine \"SUB\")
+	    cat >conftest.f <<\EOF
+              call sub()
+              end
+EOF
+	    doit='$FC -c ${FFLAGS} conftest.f'
+	    if AC_TRY_EVAL(doit); then
+		FCALLSCSUB=`$NM $NMFLAGS conftest.o | awk '
+		    /SUB_/{print "SUB_";exit}
+		    /SUB/ {print "SUB"; exit}
+		    /sub_/{print "sub_";exit}
+		    /sub/ {print "sub"; exit}'`
+		case "$FCALLSCSUB" in
+		    '') AC_MSG_ERROR(not found)
+			;;
+		    *)  AC_MSG_RESULT($FCALLSCSUB)
+			;;
+		esac
+	    else
+		AC_MSG_ERROR(Could not compile conftest.f)
+	    fi
+	    rm -f conftest*
+	    ;;
+    esac
+])
+
+
+dnl Check for a C type equivalent to a Fortran type.
+dnl
+dnl UD_CHECK_CTYPE_FORTRAN(ftype, ctypes, fmacro_root)
+dnl
+AC_DEFUN([UD_CHECK_CTYPE_FORTRAN],
+[
+    cat >conftestf.f <<EOF
+           $1 values(4)
+           data values /-1, -2, -3, -4/
+           call sub(values)
+           end
+EOF
+    for ctype in $2; do
+	AC_MSG_CHECKING(if Fortran \"$1\" is C \"$ctype\")
+	cat >conftest.c <<EOF
+	    void $FCALLSCSUB(values)
+		$ctype values[[4]];
+	    {
+		exit(values[[1]] != -2 || values[[2]] != -3);
+	    }
+EOF
+	doit='$CC -c ${CPPFLAGS} ${CFLAGS} conftest.c'
+	if AC_TRY_EVAL(doit); then
+	    doit='$FC ${FFLAGS} -c conftestf.f'
+	    if AC_TRY_EVAL(doit); then
+	        doit='$FC -o conftest ${FFLAGS} ${LDFLAGS} conftestf.o conftest.o ${FLIBS} ${LIBS}'
+	        if AC_TRY_EVAL(doit); then
+		    doit=./conftest
+		    if AC_TRY_EVAL(doit); then
+		        AC_MSG_RESULT(yes)
+		        cname=`echo $ctype | tr ' abcdefghijklmnopqrstuvwxyz' \
+			    _ABCDEFGHIJKLMNOPQRSTUVWXYZ`
+		        AC_DEFINE_UNQUOTED(NF_$3[]_IS_C_$cname, [1], [fortran to c conversion])
+		        break
+		    else
+		        AC_MSG_RESULT(no)
+		    fi
+	        else
+		    AC_MSG_ERROR(Could not link conftestf.o and conftest.o)
+	        fi
+	    else
+		AC_MSG_ERROR(Could not compile conftestf.f)
+	    fi
+	else
+	    AC_MSG_ERROR(Could not compile conftest.c)
+	fi
+    done
+    rm -f conftest*
+])
+
+
+dnl Get information about Fortran data types.
+dnl
+AC_DEFUN([UD_FORTRAN_TYPES],
+[
+#    AC_REQUIRE([UD_PROG_FC])
+    case "$FC" in
+    '')
+	;;
+    *)
+	AC_REQUIRE([UD_CHECK_FCALLSCSUB])
+dnl	UD_CHECK_FORTRAN_TYPE(NF_INT1_T, byte integer*1 "integer(kind(1))")
+dnl	UD_CHECK_FORTRAN_TYPE(NF_INT2_T, integer*2 "integer(kind(2))")
+	UD_CHECK_FORTRAN_TYPE(NF_INT1_T, byte integer*1 "integer(kind=1)" "integer(selected_int_kind(2))")
+	UD_CHECK_FORTRAN_TYPE(NF_INT2_T, integer*2 "integer(kind=2)" "integer(selected_int_kind(4))")
+
+	case "${NF_INT1_T}" in
+	    '') ;;
+	    *)  UD_CHECK_CTYPE_FORTRAN($NF_INT1_T, "signed char", INT1)
+		UD_CHECK_CTYPE_FORTRAN($NF_INT1_T, "short", INT1)
+		UD_CHECK_CTYPE_FORTRAN($NF_INT1_T, "int", INT1)
+		UD_CHECK_CTYPE_FORTRAN($NF_INT1_T, "long", INT1)
+		;;
+	esac
+	case "${NF_INT2_T}" in
+	    '') ;;
+	    *)  UD_CHECK_CTYPE_FORTRAN($NF_INT2_T, short, INT2)
+		UD_CHECK_CTYPE_FORTRAN($NF_INT2_T, int, INT2)
+		UD_CHECK_CTYPE_FORTRAN($NF_INT2_T, long, INT2)
+		;;
+	esac
+	UD_CHECK_CTYPE_FORTRAN(integer, int long, INT)
+	UD_CHECK_CTYPE_FORTRAN(real, float double, REAL)
+	UD_CHECK_CTYPE_FORTRAN(doubleprecision, double float, DOUBLEPRECISION)
+
+dnl	UD_CHECK_FORTRAN_NCTYPE(NCBYTE_T, byte integer*1 integer, byte)
+	UD_CHECK_FORTRAN_NCTYPE(NCBYTE_T, byte integer*1 "integer(kind=1)" "integer(selected_int_kind(2))" integer, byte)
+
+dnl	UD_CHECK_FORTRAN_NCTYPE(NCSHORT_T, integer*2 integer, short)
+	UD_CHECK_FORTRAN_NCTYPE(NCSHORT_T, integer*2 "integer(kind=2)" "integer(selected_int_kind(4))" integer, short)
+dnl	UD_CHECK_FORTRAN_CTYPE(NF_SHORT_T, $NCSHORT_T, short, SHRT_MIN, SHRT_MAX)
+
+dnl	UD_CHECK_FORTRAN_NCTYPE(NCLONG_T, integer*4 integer, long)
+dnl	UD_CHECK_FORTRAN_CTYPE(NF_INT_T, integer, int, INT_MIN, INT_MAX)
+
+dnl	UD_CHECK_FORTRAN_NCTYPE(NCFLOAT_T, real*4 real, float)
+dnl	UD_CHECK_FORTRAN_CTYPE(NF_FLOAT_T, $NCFLOAT_T, float, FLT_MIN, FLT_MAX)
+
+dnl	UD_CHECK_FORTRAN_NCTYPE(NCDOUBLE_T, real*8 doubleprecision real, double)
+dnl	UD_CHECK_FORTRAN_CTYPE(NF_DOUBLE_T, $NCDOUBLE_T, double, DBL_MIN, DBL_MAX)
+	;;
+    esac
+])
+
+
+dnl Setup for making a manual-page database.
+dnl
+AC_DEFUN([UD_MAKEWHATIS],
+[
+    #
+    # NB: We always want to define WHATIS to prevent the
+    # $(MANDIR)/$(WHATIS) make(1) target from being just $(MANDIR)/ and
+    # conflicting with the (directory creation) target with the same name.
+    #
+    WHATIS=whatis
+    case `uname -sr` in
+	BSD/OS*|FreeBSD*)
+	    # Can't generate a user-database -- only /usr/share/man/whatis.db.
+	    MAKEWHATIS_CMD=
+	    ;;
+	'IRIX64 6.5'|'IRIX 6.5')
+	    MAKEWHATIS_CMD='/usr/lib/makewhatis -M $(MANDIR) $(MANDIR)/whatis'
+	    ;;
+	'IRIX 6'*)
+	    # Can't generate a user-database.
+	    MAKEWHATIS_CMD=
+	    ;;
+	HP-UX*)
+	    # Can't generate a user-database -- only /usr/lib/whatis.
+	    MAKEWHATIS_CMD=
+	    ;;
+	'Linux '*)
+	    # /usr/sbin/makewhatis doesn't work
+	    MAKEWHATIS_CMD=
+	    ;;
+	ULTRIX*)
+	    # Can't generate a user-database -- only /usr/lib/whatis.
+	    MAKEWHATIS_CMD=
+	    ;;
+	*)
+	    if test -r /usr/man/windex; then
+		WHATIS=windex
+	    fi
+	    AC_CHECK_PROGS(prog, catman makewhatis /usr/lib/makewhatis)
+	    case "$prog" in
+		*catman*)
+		    MAKEWHATIS_CMD=$prog' -w -M $(MANDIR)'
+		    ;;
+		*makewhatis*)
+		    MAKEWHATIS_CMD=$prog' $(MANDIR)'
+		    ;;
+	    esac
+	    ;;
+    esac
+    AC_SUBST(WHATIS)
+    AC_SUBST(MAKEWHATIS_CMD)
+    AC_MSG_CHECKING(for manual-page index command)
+    AC_MSG_RESULT($MAKEWHATIS_CMD)
+])
+
+
+dnl Check for the math library.
+dnl
+AC_DEFUN([UD_CHECK_LIB_MATH],
+[
+    case "${MATHLIB}" in
+	'')
+	    AC_CHECK_LIB(c, tanh, MATHLIB=,
+		    AC_CHECK_LIB(m, tanh, MATHLIB=-lm, MATHLIB=))
+	    ;;
+	*)
+	    ;;
+    esac 
+   AC_SUBST(MATHLIB)
+])
+
+
+dnl Set the binary distribution directory.
+dnl
+AC_DEFUN([UD_FTPBINDIR], [dnl
+    AC_MSG_CHECKING([binary distribution directory])
+    case ${FTPBINDIR-unset} in
+	unset)
+	    system=`(system) 2>/dev/null || echo dummy_system`
+	    FTPBINDIR=${FTPDIR-/home/ftp}/pub/binary/$system
+	    ;;
+    esac
+    AC_SUBST(FTPBINDIR)dnl
+    AC_MSG_RESULT($FTPBINDIR)
+])
+
+
+dnl
+dnl
+dnl
+
+dnl
+dnl These headers won't get C style comments
+dnl
+dnl UD_CONFIG_HEADER(HEADER-TO-CREATE ...)
+AC_DEFUN([UD_CONFIG_HEADER],
+[define(UD_LIST_HEADER, $1)])
+
+
+dnl
+dnl Print which compilers are going to be used, the flags, and their
+dnl locations. This is all to assist in debugging, and help with
+dnl support questions.
+dnl
+AC_DEFUN([UD_DISPLAY_RESULTS],
+[
+AC_MSG_CHECKING(CPPFLAGS)
+AC_MSG_RESULT($CPPFLAGS)
+AC_MSG_CHECKING(CC CFLAGS)
+AC_MSG_RESULT($CC $CFLAGS)
+ud_type_cc=`type $CC`
+AC_MSG_CHECKING(type $CC)
+AC_MSG_RESULT($ud_type_cc)
+
+AC_MSG_CHECKING(CXX)
+if test -n "$CXX"; then
+	AC_MSG_RESULT($CXX)
+	AC_MSG_CHECKING(CXXFLAGS)
+	AC_MSG_RESULT($CXXFLAGS)
+	ud_type_CXX=`type $CXX`
+	AC_MSG_CHECKING(type $CXX)
+	AC_MSG_RESULT($ud_type_CXX)
+else
+	AC_MSG_RESULT(unset)
+fi
+
+AC_MSG_CHECKING(FC)
+if test -n "$FC"; then
+	AC_MSG_RESULT($FC)
+	AC_MSG_CHECKING(FFLAGS)
+	AC_MSG_RESULT($FFLAGS)
+	ud_type_fc=`type $FC`
+	AC_MSG_CHECKING(type $FC)
+	AC_MSG_RESULT($ud_type_fc)
+else
+	AC_MSG_RESULT(unset)
+fi
+
+AC_MSG_CHECKING(F90)
+if test -n "$F90"; then
+	AC_MSG_RESULT($F90)
+	AC_MSG_CHECKING(FCFLAGS)
+	AC_MSG_RESULT($FCFLAGS)
+	ud_type_F90=`type $F90`
+	AC_MSG_CHECKING(type $F90)
+	AC_MSG_RESULT($ud_type_F90)
+else
+	AC_MSG_RESULT(unset)
+fi
+
+AC_MSG_CHECKING(AR)
+if test -n "$AR"; then
+	AC_MSG_RESULT($AR)
+	AC_MSG_CHECKING(AR_FLAGS)
+	AC_MSG_RESULT($AR_FLAGS)
+	ud_type_AR=`type $AR`
+	AC_MSG_CHECKING(type $AR)
+	AC_MSG_RESULT($ud_type_AR)
+else
+	AC_MSG_RESULT(unset)
+fi
+
+AC_MSG_CHECKING(NM)
+if test -n "$NM"; then
+	AC_MSG_RESULT($NM)
+	AC_MSG_CHECKING(NMFLAGS)
+	AC_MSG_RESULT($NMFLAGS)
+#	ud_type_NM=`type $NM`
+#	AC_MSG_CHECKING(type $NM)
+#	AC_MSG_RESULT($ud_type_NM)
+else
+	AC_MSG_RESULT(unset)
+fi
+
+])
+
+# AC_PROG_FC_MOD
+# ---------------
+AC_DEFUN([AC_PROG_FC_UPPERCASE_MOD],
+[
+AC_LANG_PUSH(Fortran)
+AC_MSG_CHECKING([if Fortran 90 compiler capitalizes .mod filenames])
+		    cat <<EOF >conftest.f90
+		      module conftest
+		      end module conftest
+EOF
+ac_try='$F90 ${F90FLAGS} conftest.f90 -c ${F90LIBS}>&AS_MESSAGE_LOG_FD'
+AC_TRY_EVAL(ac_try)
+# Following changed from "test -f" to adapt to OSX case-insensitive filesystems
+if test `ls *.mod` CONFTEST.mod ; then
+   ac_cv_prog_f90_uppercase_mod=yes
+   rm -f CONFTEST.mod
+else
+   ac_cv_prog_f90_uppercase_mod=no
+fi
+AC_MSG_RESULT($ac_cv_prog_f90_uppercase_mod)
+#rm -f conftest*
+AC_LANG_POP(Fortran)
+])
+
+# [AC_LANG_CONFTEST([AC_LANG_SOURCE([      module conftest
+#       end module])])
+# ac_try='$F90 -o conftest ${F90FLAGS} conftest.f90 ${F90LIBS}>&AS_MESSAGE_LOG_FD'
+# if AC_TRY_EVAL(ac_try) &&
+#    test -f CONFTEST.mod ; then
+#         ac_cv_prog_f90_uppercase_mod=yes
+# 	rm -f CONFTEST.mod
+# else
+#   ac_cv_prog_f90_uppercase_mod=no
+# fi
+# rm -f conftest*
+
+
+AC_DEFUN([AX_F90_MODULE_FLAG],[
+AC_CACHE_CHECK([fortran 90 modules inclusion flag],
+ax_cv_f90_modflag,
+[AC_LANG_PUSH(Fortran)
+i=0
+while test \( -f tmpdir_$i \) -o \( -d tmpdir_$i \) ; do
+  i=`expr $i + 1`
+done
+mkdir tmpdir_$i
+cd tmpdir_$i
+AC_COMPILE_IFELSE([AC_LANG_SOURCE([module conftest_module
+   contains
+   subroutine conftest_routine
+   write(*,'(a)') 'gotcha!'
+   end subroutine conftest_routine
+   end module conftest_module])
+  ],[],[])
+cd ..
+ax_cv_f90_modflag="not found"
+for ax_flag in "-I" "-M" "-p"; do
+  if test "$ax_cv_f90_modflag" = "not found" ; then
+    ax_save_FCFLAGS="$FCFLAGS"
+    FCFLAGS="$ax_save_FCFLAGS ${ax_flag}tmpdir_$i"
+    AC_COMPILE_IFELSE([AC_LANG_SOURCE([program conftest_program
+       use conftest_module
+       call conftest_routine
+       end program conftest_program])
+      ],[ax_cv_f90_modflag="$ax_flag"],[])
+    FCFLAGS="$ax_save_FCFLAGS"
+  fi
+done
+rm -fr tmpdir_$i
+if test "$ax_flag" = "not found" ; then
+  AC_MSG_ERROR([unable to find compiler flag for modules inclusion])
+fi
+AC_LANG_POP(Fortran)
+])])
+
+# AX_C_FLOAT_WORDS_BIGENDIAN
+# added by:
+#   Warren Turkal <wt at penguintechs.org>
+#
+# Copyright © 2006 Daniel Amelang <dan at amelang.net>
+#
+# Copying and distribution of this file, with or without modification, are
+# permitted in any medium without royalty provided the copyright notice and
+# this notice are preserved.
+#
+# This macro will detect if double variables are words packed in big endian
+# order while the bits in the words are arranged in little endian order. This
+# macro was added to support the ARM architecture. The FLOAT_WORDS_BIGENDIAN
+# macro will be set to 1 if the word order is big endian. If the word order is
+# not big endian, FLOAT_WORDS_BIGENDIAN will be not be set.
+AC_DEFUN([AX_C_FLOAT_WORDS_BIGENDIAN],
+  [AC_CACHE_CHECK(whether float word ordering is bigendian,
+                  ax_cv_c_float_words_bigendian, [
+
+ax_cv_c_float_words_bigendian=unknown
+AC_COMPILE_IFELSE([AC_LANG_SOURCE([[
+
+double d = 90904234967036810337470478905505011476211692735615632014797120844053488865816695273723469097858056257517020191247487429516932130503560650002327564517570778480236724525140520121371739201496540132640109977779420565776568942592.0;
+
+]])], [
+
+if grep noonsees conftest.$ac_objext >/dev/null ; then
+  ax_cv_c_float_words_bigendian=yes
+fi
+if grep seesnoon conftest.$ac_objext >/dev/null ; then
+  if test "$ax_cv_c_float_words_bigendian" = unknown; then
+    ax_cv_c_float_words_bigendian=no
+  else
+    ax_cv_c_float_words_bigendian=unknown
+  fi
+fi
+
+])])
+
+case $ax_cv_c_float_words_bigendian in
+  yes)
+    m4_default([$1],
+      [AC_DEFINE([FLOAT_WORDS_BIGENDIAN], 1,
+                 [Define to 1 if your system stores words within floats
+                  with the most significant word first])]) ;;
+  no)
+    $2 ;;
+  *)
+    m4_default([$3],
+      [AC_MSG_ERROR([
+
+Unknown float word ordering. You need to manually preset
+ax_cv_c_float_words_bigendian=no (or yes) according to your system.
+
+    ])]) ;;
+esac
+
+])# AX_C_FLOAT_WORDS_BIGENDIAN
+
diff --git a/aclocal.m4 b/aclocal.m4
new file mode 100644
index 0000000..0af6916
--- /dev/null
+++ b/aclocal.m4
@@ -0,0 +1,1191 @@
+# generated automatically by aclocal 1.14.1 -*- Autoconf -*-
+
+# Copyright (C) 1996-2013 Free Software Foundation, Inc.
+
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+m4_ifndef([AC_CONFIG_MACRO_DIRS], [m4_defun([_AM_CONFIG_MACRO_DIRS], [])m4_defun([AC_CONFIG_MACRO_DIRS], [_AM_CONFIG_MACRO_DIRS($@)])])
+m4_ifndef([AC_AUTOCONF_VERSION],
+  [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
+m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.69],,
+[m4_warning([this file was generated for autoconf 2.69.
+You have another version of autoconf.  It may work, but is not guaranteed to.
+If you have problems, you may need to regenerate the build system entirely.
+To do so, use the procedure documented by the package, typically 'autoreconf'.])])
+
+# Copyright (C) 2002-2013 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_AUTOMAKE_VERSION(VERSION)
+# ----------------------------
+# Automake X.Y traces this macro to ensure aclocal.m4 has been
+# generated from the m4 files accompanying Automake X.Y.
+# (This private macro should not be called outside this file.)
+AC_DEFUN([AM_AUTOMAKE_VERSION],
+[am__api_version='1.14'
+dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to
+dnl require some minimum version.  Point them to the right macro.
+m4_if([$1], [1.14.1], [],
+      [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl
+])
+
+# _AM_AUTOCONF_VERSION(VERSION)
+# -----------------------------
+# aclocal traces this macro to find the Autoconf version.
+# This is a private macro too.  Using m4_define simplifies
+# the logic in aclocal, which can simply ignore this definition.
+m4_define([_AM_AUTOCONF_VERSION], [])
+
+# AM_SET_CURRENT_AUTOMAKE_VERSION
+# -------------------------------
+# Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced.
+# This function is AC_REQUIREd by AM_INIT_AUTOMAKE.
+AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION],
+[AM_AUTOMAKE_VERSION([1.14.1])dnl
+m4_ifndef([AC_AUTOCONF_VERSION],
+  [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
+_AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))])
+
+# AM_AUX_DIR_EXPAND                                         -*- Autoconf -*-
+
+# Copyright (C) 2001-2013 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets
+# $ac_aux_dir to '$srcdir/foo'.  In other projects, it is set to
+# '$srcdir', '$srcdir/..', or '$srcdir/../..'.
+#
+# Of course, Automake must honor this variable whenever it calls a
+# tool from the auxiliary directory.  The problem is that $srcdir (and
+# therefore $ac_aux_dir as well) can be either absolute or relative,
+# depending on how configure is run.  This is pretty annoying, since
+# it makes $ac_aux_dir quite unusable in subdirectories: in the top
+# source directory, any form will work fine, but in subdirectories a
+# relative path needs to be adjusted first.
+#
+# $ac_aux_dir/missing
+#    fails when called from a subdirectory if $ac_aux_dir is relative
+# $top_srcdir/$ac_aux_dir/missing
+#    fails if $ac_aux_dir is absolute,
+#    fails when called from a subdirectory in a VPATH build with
+#          a relative $ac_aux_dir
+#
+# The reason of the latter failure is that $top_srcdir and $ac_aux_dir
+# are both prefixed by $srcdir.  In an in-source build this is usually
+# harmless because $srcdir is '.', but things will broke when you
+# start a VPATH build or use an absolute $srcdir.
+#
+# So we could use something similar to $top_srcdir/$ac_aux_dir/missing,
+# iff we strip the leading $srcdir from $ac_aux_dir.  That would be:
+#   am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"`
+# and then we would define $MISSING as
+#   MISSING="\${SHELL} $am_aux_dir/missing"
+# This will work as long as MISSING is not called from configure, because
+# unfortunately $(top_srcdir) has no meaning in configure.
+# However there are other variables, like CC, which are often used in
+# configure, and could therefore not use this "fixed" $ac_aux_dir.
+#
+# Another solution, used here, is to always expand $ac_aux_dir to an
+# absolute PATH.  The drawback is that using absolute paths prevent a
+# configured tree to be moved without reconfiguration.
+
+AC_DEFUN([AM_AUX_DIR_EXPAND],
+[dnl Rely on autoconf to set up CDPATH properly.
+AC_PREREQ([2.50])dnl
+# expand $ac_aux_dir to an absolute path
+am_aux_dir=`cd $ac_aux_dir && pwd`
+])
+
+# AM_CONDITIONAL                                            -*- Autoconf -*-
+
+# Copyright (C) 1997-2013 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_CONDITIONAL(NAME, SHELL-CONDITION)
+# -------------------------------------
+# Define a conditional.
+AC_DEFUN([AM_CONDITIONAL],
+[AC_PREREQ([2.52])dnl
+ m4_if([$1], [TRUE],  [AC_FATAL([$0: invalid condition: $1])],
+       [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl
+AC_SUBST([$1_TRUE])dnl
+AC_SUBST([$1_FALSE])dnl
+_AM_SUBST_NOTMAKE([$1_TRUE])dnl
+_AM_SUBST_NOTMAKE([$1_FALSE])dnl
+m4_define([_AM_COND_VALUE_$1], [$2])dnl
+if $2; then
+  $1_TRUE=
+  $1_FALSE='#'
+else
+  $1_TRUE='#'
+  $1_FALSE=
+fi
+AC_CONFIG_COMMANDS_PRE(
+[if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then
+  AC_MSG_ERROR([[conditional "$1" was never defined.
+Usually this means the macro was only invoked conditionally.]])
+fi])])
+
+# Copyright (C) 1999-2013 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+
+# There are a few dirty hacks below to avoid letting 'AC_PROG_CC' be
+# written in clear, in which case automake, when reading aclocal.m4,
+# will think it sees a *use*, and therefore will trigger all it's
+# C support machinery.  Also note that it means that autoscan, seeing
+# CC etc. in the Makefile, will ask for an AC_PROG_CC use...
+
+
+# _AM_DEPENDENCIES(NAME)
+# ----------------------
+# See how the compiler implements dependency checking.
+# NAME is "CC", "CXX", "OBJC", "OBJCXX", "UPC", or "GJC".
+# We try a few techniques and use that to set a single cache variable.
+#
+# We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was
+# modified to invoke _AM_DEPENDENCIES(CC); we would have a circular
+# dependency, and given that the user is not expected to run this macro,
+# just rely on AC_PROG_CC.
+AC_DEFUN([_AM_DEPENDENCIES],
+[AC_REQUIRE([AM_SET_DEPDIR])dnl
+AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl
+AC_REQUIRE([AM_MAKE_INCLUDE])dnl
+AC_REQUIRE([AM_DEP_TRACK])dnl
+
+m4_if([$1], [CC],   [depcc="$CC"   am_compiler_list=],
+      [$1], [CXX],  [depcc="$CXX"  am_compiler_list=],
+      [$1], [OBJC], [depcc="$OBJC" am_compiler_list='gcc3 gcc'],
+      [$1], [OBJCXX], [depcc="$OBJCXX" am_compiler_list='gcc3 gcc'],
+      [$1], [UPC],  [depcc="$UPC"  am_compiler_list=],
+      [$1], [GCJ],  [depcc="$GCJ"  am_compiler_list='gcc3 gcc'],
+                    [depcc="$$1"   am_compiler_list=])
+
+AC_CACHE_CHECK([dependency style of $depcc],
+               [am_cv_$1_dependencies_compiler_type],
+[if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
+  # We make a subdir and do the tests there.  Otherwise we can end up
+  # making bogus files that we don't know about and never remove.  For
+  # instance it was reported that on HP-UX the gcc test will end up
+  # making a dummy file named 'D' -- because '-MD' means "put the output
+  # in D".
+  rm -rf conftest.dir
+  mkdir conftest.dir
+  # Copy depcomp to subdir because otherwise we won't find it if we're
+  # using a relative directory.
+  cp "$am_depcomp" conftest.dir
+  cd conftest.dir
+  # We will build objects and dependencies in a subdirectory because
+  # it helps to detect inapplicable dependency modes.  For instance
+  # both Tru64's cc and ICC support -MD to output dependencies as a
+  # side effect of compilation, but ICC will put the dependencies in
+  # the current directory while Tru64 will put them in the object
+  # directory.
+  mkdir sub
+
+  am_cv_$1_dependencies_compiler_type=none
+  if test "$am_compiler_list" = ""; then
+     am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp`
+  fi
+  am__universal=false
+  m4_case([$1], [CC],
+    [case " $depcc " in #(
+     *\ -arch\ *\ -arch\ *) am__universal=true ;;
+     esac],
+    [CXX],
+    [case " $depcc " in #(
+     *\ -arch\ *\ -arch\ *) am__universal=true ;;
+     esac])
+
+  for depmode in $am_compiler_list; do
+    # Setup a source with many dependencies, because some compilers
+    # like to wrap large dependency lists on column 80 (with \), and
+    # we should not choose a depcomp mode which is confused by this.
+    #
+    # We need to recreate these files for each test, as the compiler may
+    # overwrite some of them when testing with obscure command lines.
+    # This happens at least with the AIX C compiler.
+    : > sub/conftest.c
+    for i in 1 2 3 4 5 6; do
+      echo '#include "conftst'$i'.h"' >> sub/conftest.c
+      # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with
+      # Solaris 10 /bin/sh.
+      echo '/* dummy */' > sub/conftst$i.h
+    done
+    echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
+
+    # We check with '-c' and '-o' for the sake of the "dashmstdout"
+    # mode.  It turns out that the SunPro C++ compiler does not properly
+    # handle '-M -o', and we need to detect this.  Also, some Intel
+    # versions had trouble with output in subdirs.
+    am__obj=sub/conftest.${OBJEXT-o}
+    am__minus_obj="-o $am__obj"
+    case $depmode in
+    gcc)
+      # This depmode causes a compiler race in universal mode.
+      test "$am__universal" = false || continue
+      ;;
+    nosideeffect)
+      # After this tag, mechanisms are not by side-effect, so they'll
+      # only be used when explicitly requested.
+      if test "x$enable_dependency_tracking" = xyes; then
+	continue
+      else
+	break
+      fi
+      ;;
+    msvc7 | msvc7msys | msvisualcpp | msvcmsys)
+      # This compiler won't grok '-c -o', but also, the minuso test has
+      # not run yet.  These depmodes are late enough in the game, and
+      # so weak that their functioning should not be impacted.
+      am__obj=conftest.${OBJEXT-o}
+      am__minus_obj=
+      ;;
+    none) break ;;
+    esac
+    if depmode=$depmode \
+       source=sub/conftest.c object=$am__obj \
+       depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+       $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \
+         >/dev/null 2>conftest.err &&
+       grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep $am__obj sub/conftest.Po > /dev/null 2>&1 &&
+       ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
+      # icc doesn't choke on unknown options, it will just issue warnings
+      # or remarks (even with -Werror).  So we grep stderr for any message
+      # that says an option was ignored or not supported.
+      # When given -MP, icc 7.0 and 7.1 complain thusly:
+      #   icc: Command line warning: ignoring option '-M'; no argument required
+      # The diagnosis changed in icc 8.0:
+      #   icc: Command line remark: option '-MP' not supported
+      if (grep 'ignoring option' conftest.err ||
+          grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
+        am_cv_$1_dependencies_compiler_type=$depmode
+        break
+      fi
+    fi
+  done
+
+  cd ..
+  rm -rf conftest.dir
+else
+  am_cv_$1_dependencies_compiler_type=none
+fi
+])
+AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type])
+AM_CONDITIONAL([am__fastdep$1], [
+  test "x$enable_dependency_tracking" != xno \
+  && test "$am_cv_$1_dependencies_compiler_type" = gcc3])
+])
+
+
+# AM_SET_DEPDIR
+# -------------
+# Choose a directory name for dependency files.
+# This macro is AC_REQUIREd in _AM_DEPENDENCIES.
+AC_DEFUN([AM_SET_DEPDIR],
+[AC_REQUIRE([AM_SET_LEADING_DOT])dnl
+AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl
+])
+
+
+# AM_DEP_TRACK
+# ------------
+AC_DEFUN([AM_DEP_TRACK],
+[AC_ARG_ENABLE([dependency-tracking], [dnl
+AS_HELP_STRING(
+  [--enable-dependency-tracking],
+  [do not reject slow dependency extractors])
+AS_HELP_STRING(
+  [--disable-dependency-tracking],
+  [speeds up one-time build])])
+if test "x$enable_dependency_tracking" != xno; then
+  am_depcomp="$ac_aux_dir/depcomp"
+  AMDEPBACKSLASH='\'
+  am__nodep='_no'
+fi
+AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno])
+AC_SUBST([AMDEPBACKSLASH])dnl
+_AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl
+AC_SUBST([am__nodep])dnl
+_AM_SUBST_NOTMAKE([am__nodep])dnl
+])
+
+# Generate code to set up dependency tracking.              -*- Autoconf -*-
+
+# Copyright (C) 1999-2013 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+
+# _AM_OUTPUT_DEPENDENCY_COMMANDS
+# ------------------------------
+AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS],
+[{
+  # Older Autoconf quotes --file arguments for eval, but not when files
+  # are listed without --file.  Let's play safe and only enable the eval
+  # if we detect the quoting.
+  case $CONFIG_FILES in
+  *\'*) eval set x "$CONFIG_FILES" ;;
+  *)   set x $CONFIG_FILES ;;
+  esac
+  shift
+  for mf
+  do
+    # Strip MF so we end up with the name of the file.
+    mf=`echo "$mf" | sed -e 's/:.*$//'`
+    # Check whether this is an Automake generated Makefile or not.
+    # We used to match only the files named 'Makefile.in', but
+    # some people rename them; so instead we look at the file content.
+    # Grep'ing the first line is not enough: some people post-process
+    # each Makefile.in and add a new line on top of each file to say so.
+    # Grep'ing the whole file is not good either: AIX grep has a line
+    # limit of 2048, but all sed's we know have understand at least 4000.
+    if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then
+      dirpart=`AS_DIRNAME("$mf")`
+    else
+      continue
+    fi
+    # Extract the definition of DEPDIR, am__include, and am__quote
+    # from the Makefile without running 'make'.
+    DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"`
+    test -z "$DEPDIR" && continue
+    am__include=`sed -n 's/^am__include = //p' < "$mf"`
+    test -z "$am__include" && continue
+    am__quote=`sed -n 's/^am__quote = //p' < "$mf"`
+    # Find all dependency output files, they are included files with
+    # $(DEPDIR) in their names.  We invoke sed twice because it is the
+    # simplest approach to changing $(DEPDIR) to its actual value in the
+    # expansion.
+    for file in `sed -n "
+      s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \
+	 sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do
+      # Make sure the directory exists.
+      test -f "$dirpart/$file" && continue
+      fdir=`AS_DIRNAME(["$file"])`
+      AS_MKDIR_P([$dirpart/$fdir])
+      # echo "creating $dirpart/$file"
+      echo '# dummy' > "$dirpart/$file"
+    done
+  done
+}
+])# _AM_OUTPUT_DEPENDENCY_COMMANDS
+
+
+# AM_OUTPUT_DEPENDENCY_COMMANDS
+# -----------------------------
+# This macro should only be invoked once -- use via AC_REQUIRE.
+#
+# This code is only required when automatic dependency tracking
+# is enabled.  FIXME.  This creates each '.P' file that we will
+# need in order to bootstrap the dependency handling code.
+AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS],
+[AC_CONFIG_COMMANDS([depfiles],
+     [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS],
+     [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"])
+])
+
+# Do all the work for Automake.                             -*- Autoconf -*-
+
+# Copyright (C) 1996-2013 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This macro actually does too much.  Some checks are only needed if
+# your package does certain things.  But this isn't really a big deal.
+
+dnl Redefine AC_PROG_CC to automatically invoke _AM_PROG_CC_C_O.
+m4_define([AC_PROG_CC],
+m4_defn([AC_PROG_CC])
+[_AM_PROG_CC_C_O
+])
+
+# AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE])
+# AM_INIT_AUTOMAKE([OPTIONS])
+# -----------------------------------------------
+# The call with PACKAGE and VERSION arguments is the old style
+# call (pre autoconf-2.50), which is being phased out.  PACKAGE
+# and VERSION should now be passed to AC_INIT and removed from
+# the call to AM_INIT_AUTOMAKE.
+# We support both call styles for the transition.  After
+# the next Automake release, Autoconf can make the AC_INIT
+# arguments mandatory, and then we can depend on a new Autoconf
+# release and drop the old call support.
+AC_DEFUN([AM_INIT_AUTOMAKE],
+[AC_PREREQ([2.65])dnl
+dnl Autoconf wants to disallow AM_ names.  We explicitly allow
+dnl the ones we care about.
+m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl
+AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl
+AC_REQUIRE([AC_PROG_INSTALL])dnl
+if test "`cd $srcdir && pwd`" != "`pwd`"; then
+  # Use -I$(srcdir) only when $(srcdir) != ., so that make's output
+  # is not polluted with repeated "-I."
+  AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl
+  # test to see if srcdir already configured
+  if test -f $srcdir/config.status; then
+    AC_MSG_ERROR([source directory already configured; run "make distclean" there first])
+  fi
+fi
+
+# test whether we have cygpath
+if test -z "$CYGPATH_W"; then
+  if (cygpath --version) >/dev/null 2>/dev/null; then
+    CYGPATH_W='cygpath -w'
+  else
+    CYGPATH_W=echo
+  fi
+fi
+AC_SUBST([CYGPATH_W])
+
+# Define the identity of the package.
+dnl Distinguish between old-style and new-style calls.
+m4_ifval([$2],
+[AC_DIAGNOSE([obsolete],
+             [$0: two- and three-arguments forms are deprecated.])
+m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl
+ AC_SUBST([PACKAGE], [$1])dnl
+ AC_SUBST([VERSION], [$2])],
+[_AM_SET_OPTIONS([$1])dnl
+dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT.
+m4_if(
+  m4_ifdef([AC_PACKAGE_NAME], [ok]):m4_ifdef([AC_PACKAGE_VERSION], [ok]),
+  [ok:ok],,
+  [m4_fatal([AC_INIT should be called with package and version arguments])])dnl
+ AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl
+ AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl
+
+_AM_IF_OPTION([no-define],,
+[AC_DEFINE_UNQUOTED([PACKAGE], ["$PACKAGE"], [Name of package])
+ AC_DEFINE_UNQUOTED([VERSION], ["$VERSION"], [Version number of package])])dnl
+
+# Some tools Automake needs.
+AC_REQUIRE([AM_SANITY_CHECK])dnl
+AC_REQUIRE([AC_ARG_PROGRAM])dnl
+AM_MISSING_PROG([ACLOCAL], [aclocal-${am__api_version}])
+AM_MISSING_PROG([AUTOCONF], [autoconf])
+AM_MISSING_PROG([AUTOMAKE], [automake-${am__api_version}])
+AM_MISSING_PROG([AUTOHEADER], [autoheader])
+AM_MISSING_PROG([MAKEINFO], [makeinfo])
+AC_REQUIRE([AM_PROG_INSTALL_SH])dnl
+AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl
+AC_REQUIRE([AC_PROG_MKDIR_P])dnl
+# For better backward compatibility.  To be removed once Automake 1.9.x
+# dies out for good.  For more background, see:
+# <http://lists.gnu.org/archive/html/automake/2012-07/msg00001.html>
+# <http://lists.gnu.org/archive/html/automake/2012-07/msg00014.html>
+AC_SUBST([mkdir_p], ['$(MKDIR_P)'])
+# We need awk for the "check" target.  The system "awk" is bad on
+# some platforms.
+AC_REQUIRE([AC_PROG_AWK])dnl
+AC_REQUIRE([AC_PROG_MAKE_SET])dnl
+AC_REQUIRE([AM_SET_LEADING_DOT])dnl
+_AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])],
+	      [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])],
+			     [_AM_PROG_TAR([v7])])])
+_AM_IF_OPTION([no-dependencies],,
+[AC_PROVIDE_IFELSE([AC_PROG_CC],
+		  [_AM_DEPENDENCIES([CC])],
+		  [m4_define([AC_PROG_CC],
+			     m4_defn([AC_PROG_CC])[_AM_DEPENDENCIES([CC])])])dnl
+AC_PROVIDE_IFELSE([AC_PROG_CXX],
+		  [_AM_DEPENDENCIES([CXX])],
+		  [m4_define([AC_PROG_CXX],
+			     m4_defn([AC_PROG_CXX])[_AM_DEPENDENCIES([CXX])])])dnl
+AC_PROVIDE_IFELSE([AC_PROG_OBJC],
+		  [_AM_DEPENDENCIES([OBJC])],
+		  [m4_define([AC_PROG_OBJC],
+			     m4_defn([AC_PROG_OBJC])[_AM_DEPENDENCIES([OBJC])])])dnl
+AC_PROVIDE_IFELSE([AC_PROG_OBJCXX],
+		  [_AM_DEPENDENCIES([OBJCXX])],
+		  [m4_define([AC_PROG_OBJCXX],
+			     m4_defn([AC_PROG_OBJCXX])[_AM_DEPENDENCIES([OBJCXX])])])dnl
+])
+AC_REQUIRE([AM_SILENT_RULES])dnl
+dnl The testsuite driver may need to know about EXEEXT, so add the
+dnl 'am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen.  This
+dnl macro is hooked onto _AC_COMPILER_EXEEXT early, see below.
+AC_CONFIG_COMMANDS_PRE(dnl
+[m4_provide_if([_AM_COMPILER_EXEEXT],
+  [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl
+
+# POSIX will say in a future version that running "rm -f" with no argument
+# is OK; and we want to be able to make that assumption in our Makefile
+# recipes.  So use an aggressive probe to check that the usage we want is
+# actually supported "in the wild" to an acceptable degree.
+# See automake bug#10828.
+# To make any issue more visible, cause the running configure to be aborted
+# by default if the 'rm' program in use doesn't match our expectations; the
+# user can still override this though.
+if rm -f && rm -fr && rm -rf; then : OK; else
+  cat >&2 <<'END'
+Oops!
+
+Your 'rm' program seems unable to run without file operands specified
+on the command line, even when the '-f' option is present.  This is contrary
+to the behaviour of most rm programs out there, and not conforming with
+the upcoming POSIX standard: <http://austingroupbugs.net/view.php?id=542>
+
+Please tell bug-automake at gnu.org about your system, including the value
+of your $PATH and any error possibly output before this message.  This
+can help us improve future automake versions.
+
+END
+  if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then
+    echo 'Configuration will proceed anyway, since you have set the' >&2
+    echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2
+    echo >&2
+  else
+    cat >&2 <<'END'
+Aborting the configuration process, to ensure you take notice of the issue.
+
+You can download and install GNU coreutils to get an 'rm' implementation
+that behaves properly: <http://www.gnu.org/software/coreutils/>.
+
+If you want to complete the configuration process using your problematic
+'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM
+to "yes", and re-run configure.
+
+END
+    AC_MSG_ERROR([Your 'rm' program is bad, sorry.])
+  fi
+fi])
+
+dnl Hook into '_AC_COMPILER_EXEEXT' early to learn its expansion.  Do not
+dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further
+dnl mangled by Autoconf and run in a shell conditional statement.
+m4_define([_AC_COMPILER_EXEEXT],
+m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])])
+
+# When config.status generates a header, we must update the stamp-h file.
+# This file resides in the same directory as the config header
+# that is generated.  The stamp files are numbered to have different names.
+
+# Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the
+# loop where config.status creates the headers, so we can generate
+# our stamp files there.
+AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK],
+[# Compute $1's index in $config_headers.
+_am_arg=$1
+_am_stamp_count=1
+for _am_header in $config_headers :; do
+  case $_am_header in
+    $_am_arg | $_am_arg:* )
+      break ;;
+    * )
+      _am_stamp_count=`expr $_am_stamp_count + 1` ;;
+  esac
+done
+echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count])
+
+# Copyright (C) 2001-2013 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_PROG_INSTALL_SH
+# ------------------
+# Define $install_sh.
+AC_DEFUN([AM_PROG_INSTALL_SH],
+[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
+if test x"${install_sh}" != xset; then
+  case $am_aux_dir in
+  *\ * | *\	*)
+    install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;;
+  *)
+    install_sh="\${SHELL} $am_aux_dir/install-sh"
+  esac
+fi
+AC_SUBST([install_sh])])
+
+# Copyright (C) 2003-2013 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# Check whether the underlying file-system supports filenames
+# with a leading dot.  For instance MS-DOS doesn't.
+AC_DEFUN([AM_SET_LEADING_DOT],
+[rm -rf .tst 2>/dev/null
+mkdir .tst 2>/dev/null
+if test -d .tst; then
+  am__leading_dot=.
+else
+  am__leading_dot=_
+fi
+rmdir .tst 2>/dev/null
+AC_SUBST([am__leading_dot])])
+
+# Add --enable-maintainer-mode option to configure.         -*- Autoconf -*-
+# From Jim Meyering
+
+# Copyright (C) 1996-2013 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_MAINTAINER_MODE([DEFAULT-MODE])
+# ----------------------------------
+# Control maintainer-specific portions of Makefiles.
+# Default is to disable them, unless 'enable' is passed literally.
+# For symmetry, 'disable' may be passed as well.  Anyway, the user
+# can override the default with the --enable/--disable switch.
+AC_DEFUN([AM_MAINTAINER_MODE],
+[m4_case(m4_default([$1], [disable]),
+       [enable], [m4_define([am_maintainer_other], [disable])],
+       [disable], [m4_define([am_maintainer_other], [enable])],
+       [m4_define([am_maintainer_other], [enable])
+        m4_warn([syntax], [unexpected argument to AM@&t at _MAINTAINER_MODE: $1])])
+AC_MSG_CHECKING([whether to enable maintainer-specific portions of Makefiles])
+  dnl maintainer-mode's default is 'disable' unless 'enable' is passed
+  AC_ARG_ENABLE([maintainer-mode],
+    [AS_HELP_STRING([--]am_maintainer_other[-maintainer-mode],
+      am_maintainer_other[ make rules and dependencies not useful
+      (and sometimes confusing) to the casual installer])],
+    [USE_MAINTAINER_MODE=$enableval],
+    [USE_MAINTAINER_MODE=]m4_if(am_maintainer_other, [enable], [no], [yes]))
+  AC_MSG_RESULT([$USE_MAINTAINER_MODE])
+  AM_CONDITIONAL([MAINTAINER_MODE], [test $USE_MAINTAINER_MODE = yes])
+  MAINT=$MAINTAINER_MODE_TRUE
+  AC_SUBST([MAINT])dnl
+]
+)
+
+# Check to see how 'make' treats includes.	            -*- Autoconf -*-
+
+# Copyright (C) 2001-2013 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_MAKE_INCLUDE()
+# -----------------
+# Check to see how make treats includes.
+AC_DEFUN([AM_MAKE_INCLUDE],
+[am_make=${MAKE-make}
+cat > confinc << 'END'
+am__doit:
+	@echo this is the am__doit target
+.PHONY: am__doit
+END
+# If we don't find an include directive, just comment out the code.
+AC_MSG_CHECKING([for style of include used by $am_make])
+am__include="#"
+am__quote=
+_am_result=none
+# First try GNU make style include.
+echo "include confinc" > confmf
+# Ignore all kinds of additional output from 'make'.
+case `$am_make -s -f confmf 2> /dev/null` in #(
+*the\ am__doit\ target*)
+  am__include=include
+  am__quote=
+  _am_result=GNU
+  ;;
+esac
+# Now try BSD make style include.
+if test "$am__include" = "#"; then
+   echo '.include "confinc"' > confmf
+   case `$am_make -s -f confmf 2> /dev/null` in #(
+   *the\ am__doit\ target*)
+     am__include=.include
+     am__quote="\""
+     _am_result=BSD
+     ;;
+   esac
+fi
+AC_SUBST([am__include])
+AC_SUBST([am__quote])
+AC_MSG_RESULT([$_am_result])
+rm -f confinc confmf
+])
+
+# Fake the existence of programs that GNU maintainers use.  -*- Autoconf -*-
+
+# Copyright (C) 1997-2013 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_MISSING_PROG(NAME, PROGRAM)
+# ------------------------------
+AC_DEFUN([AM_MISSING_PROG],
+[AC_REQUIRE([AM_MISSING_HAS_RUN])
+$1=${$1-"${am_missing_run}$2"}
+AC_SUBST($1)])
+
+# AM_MISSING_HAS_RUN
+# ------------------
+# Define MISSING if not defined so far and test if it is modern enough.
+# If it is, set am_missing_run to use it, otherwise, to nothing.
+AC_DEFUN([AM_MISSING_HAS_RUN],
+[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
+AC_REQUIRE_AUX_FILE([missing])dnl
+if test x"${MISSING+set}" != xset; then
+  case $am_aux_dir in
+  *\ * | *\	*)
+    MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;;
+  *)
+    MISSING="\${SHELL} $am_aux_dir/missing" ;;
+  esac
+fi
+# Use eval to expand $SHELL
+if eval "$MISSING --is-lightweight"; then
+  am_missing_run="$MISSING "
+else
+  am_missing_run=
+  AC_MSG_WARN(['missing' script is too old or missing])
+fi
+])
+
+# Helper functions for option handling.                     -*- Autoconf -*-
+
+# Copyright (C) 2001-2013 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# _AM_MANGLE_OPTION(NAME)
+# -----------------------
+AC_DEFUN([_AM_MANGLE_OPTION],
+[[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])])
+
+# _AM_SET_OPTION(NAME)
+# --------------------
+# Set option NAME.  Presently that only means defining a flag for this option.
+AC_DEFUN([_AM_SET_OPTION],
+[m4_define(_AM_MANGLE_OPTION([$1]), [1])])
+
+# _AM_SET_OPTIONS(OPTIONS)
+# ------------------------
+# OPTIONS is a space-separated list of Automake options.
+AC_DEFUN([_AM_SET_OPTIONS],
+[m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])])
+
+# _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET])
+# -------------------------------------------
+# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise.
+AC_DEFUN([_AM_IF_OPTION],
+[m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])])
+
+# Copyright (C) 1999-2013 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# _AM_PROG_CC_C_O
+# ---------------
+# Like AC_PROG_CC_C_O, but changed for automake.  We rewrite AC_PROG_CC
+# to automatically call this.
+AC_DEFUN([_AM_PROG_CC_C_O],
+[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
+AC_REQUIRE_AUX_FILE([compile])dnl
+AC_LANG_PUSH([C])dnl
+AC_CACHE_CHECK(
+  [whether $CC understands -c and -o together],
+  [am_cv_prog_cc_c_o],
+  [AC_LANG_CONFTEST([AC_LANG_PROGRAM([])])
+  # Make sure it works both with $CC and with simple cc.
+  # Following AC_PROG_CC_C_O, we do the test twice because some
+  # compilers refuse to overwrite an existing .o file with -o,
+  # though they will create one.
+  am_cv_prog_cc_c_o=yes
+  for am_i in 1 2; do
+    if AM_RUN_LOG([$CC -c conftest.$ac_ext -o conftest2.$ac_objext]) \
+         && test -f conftest2.$ac_objext; then
+      : OK
+    else
+      am_cv_prog_cc_c_o=no
+      break
+    fi
+  done
+  rm -f core conftest*
+  unset am_i])
+if test "$am_cv_prog_cc_c_o" != yes; then
+   # Losing compiler, so override with the script.
+   # FIXME: It is wrong to rewrite CC.
+   # But if we don't then we get into trouble of one sort or another.
+   # A longer-term fix would be to have automake use am__CC in this case,
+   # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)"
+   CC="$am_aux_dir/compile $CC"
+fi
+AC_LANG_POP([C])])
+
+# For backward compatibility.
+AC_DEFUN_ONCE([AM_PROG_CC_C_O], [AC_REQUIRE([AC_PROG_CC])])
+
+# Copyright (C) 2001-2013 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_RUN_LOG(COMMAND)
+# -------------------
+# Run COMMAND, save the exit status in ac_status, and log it.
+# (This has been adapted from Autoconf's _AC_RUN_LOG macro.)
+AC_DEFUN([AM_RUN_LOG],
+[{ echo "$as_me:$LINENO: $1" >&AS_MESSAGE_LOG_FD
+   ($1) >&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD
+   ac_status=$?
+   echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD
+   (exit $ac_status); }])
+
+# Check to make sure that the build environment is sane.    -*- Autoconf -*-
+
+# Copyright (C) 1996-2013 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_SANITY_CHECK
+# ---------------
+AC_DEFUN([AM_SANITY_CHECK],
+[AC_MSG_CHECKING([whether build environment is sane])
+# Reject unsafe characters in $srcdir or the absolute working directory
+# name.  Accept space and tab only in the latter.
+am_lf='
+'
+case `pwd` in
+  *[[\\\"\#\$\&\'\`$am_lf]]*)
+    AC_MSG_ERROR([unsafe absolute working directory name]);;
+esac
+case $srcdir in
+  *[[\\\"\#\$\&\'\`$am_lf\ \	]]*)
+    AC_MSG_ERROR([unsafe srcdir value: '$srcdir']);;
+esac
+
+# Do 'set' in a subshell so we don't clobber the current shell's
+# arguments.  Must try -L first in case configure is actually a
+# symlink; some systems play weird games with the mod time of symlinks
+# (eg FreeBSD returns the mod time of the symlink's containing
+# directory).
+if (
+   am_has_slept=no
+   for am_try in 1 2; do
+     echo "timestamp, slept: $am_has_slept" > conftest.file
+     set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null`
+     if test "$[*]" = "X"; then
+	# -L didn't work.
+	set X `ls -t "$srcdir/configure" conftest.file`
+     fi
+     if test "$[*]" != "X $srcdir/configure conftest.file" \
+	&& test "$[*]" != "X conftest.file $srcdir/configure"; then
+
+	# If neither matched, then we have a broken ls.  This can happen
+	# if, for instance, CONFIG_SHELL is bash and it inherits a
+	# broken ls alias from the environment.  This has actually
+	# happened.  Such a system could not be considered "sane".
+	AC_MSG_ERROR([ls -t appears to fail.  Make sure there is not a broken
+  alias in your environment])
+     fi
+     if test "$[2]" = conftest.file || test $am_try -eq 2; then
+       break
+     fi
+     # Just in case.
+     sleep 1
+     am_has_slept=yes
+   done
+   test "$[2]" = conftest.file
+   )
+then
+   # Ok.
+   :
+else
+   AC_MSG_ERROR([newly created file is older than distributed files!
+Check your system clock])
+fi
+AC_MSG_RESULT([yes])
+# If we didn't sleep, we still need to ensure time stamps of config.status and
+# generated files are strictly newer.
+am_sleep_pid=
+if grep 'slept: no' conftest.file >/dev/null 2>&1; then
+  ( sleep 1 ) &
+  am_sleep_pid=$!
+fi
+AC_CONFIG_COMMANDS_PRE(
+  [AC_MSG_CHECKING([that generated files are newer than configure])
+   if test -n "$am_sleep_pid"; then
+     # Hide warnings about reused PIDs.
+     wait $am_sleep_pid 2>/dev/null
+   fi
+   AC_MSG_RESULT([done])])
+rm -f conftest.file
+])
+
+# Copyright (C) 2009-2013 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_SILENT_RULES([DEFAULT])
+# --------------------------
+# Enable less verbose build rules; with the default set to DEFAULT
+# ("yes" being less verbose, "no" or empty being verbose).
+AC_DEFUN([AM_SILENT_RULES],
+[AC_ARG_ENABLE([silent-rules], [dnl
+AS_HELP_STRING(
+  [--enable-silent-rules],
+  [less verbose build output (undo: "make V=1")])
+AS_HELP_STRING(
+  [--disable-silent-rules],
+  [verbose build output (undo: "make V=0")])dnl
+])
+case $enable_silent_rules in @%:@ (((
+  yes) AM_DEFAULT_VERBOSITY=0;;
+   no) AM_DEFAULT_VERBOSITY=1;;
+    *) AM_DEFAULT_VERBOSITY=m4_if([$1], [yes], [0], [1]);;
+esac
+dnl
+dnl A few 'make' implementations (e.g., NonStop OS and NextStep)
+dnl do not support nested variable expansions.
+dnl See automake bug#9928 and bug#10237.
+am_make=${MAKE-make}
+AC_CACHE_CHECK([whether $am_make supports nested variables],
+   [am_cv_make_support_nested_variables],
+   [if AS_ECHO([['TRUE=$(BAR$(V))
+BAR0=false
+BAR1=true
+V=1
+am__doit:
+	@$(TRUE)
+.PHONY: am__doit']]) | $am_make -f - >/dev/null 2>&1; then
+  am_cv_make_support_nested_variables=yes
+else
+  am_cv_make_support_nested_variables=no
+fi])
+if test $am_cv_make_support_nested_variables = yes; then
+  dnl Using '$V' instead of '$(V)' breaks IRIX make.
+  AM_V='$(V)'
+  AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)'
+else
+  AM_V=$AM_DEFAULT_VERBOSITY
+  AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY
+fi
+AC_SUBST([AM_V])dnl
+AM_SUBST_NOTMAKE([AM_V])dnl
+AC_SUBST([AM_DEFAULT_V])dnl
+AM_SUBST_NOTMAKE([AM_DEFAULT_V])dnl
+AC_SUBST([AM_DEFAULT_VERBOSITY])dnl
+AM_BACKSLASH='\'
+AC_SUBST([AM_BACKSLASH])dnl
+_AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl
+])
+
+# Copyright (C) 2001-2013 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_PROG_INSTALL_STRIP
+# ---------------------
+# One issue with vendor 'install' (even GNU) is that you can't
+# specify the program used to strip binaries.  This is especially
+# annoying in cross-compiling environments, where the build's strip
+# is unlikely to handle the host's binaries.
+# Fortunately install-sh will honor a STRIPPROG variable, so we
+# always use install-sh in "make install-strip", and initialize
+# STRIPPROG with the value of the STRIP variable (set by the user).
+AC_DEFUN([AM_PROG_INSTALL_STRIP],
+[AC_REQUIRE([AM_PROG_INSTALL_SH])dnl
+# Installed binaries are usually stripped using 'strip' when the user
+# run "make install-strip".  However 'strip' might not be the right
+# tool to use in cross-compilation environments, therefore Automake
+# will honor the 'STRIP' environment variable to overrule this program.
+dnl Don't test for $cross_compiling = yes, because it might be 'maybe'.
+if test "$cross_compiling" != no; then
+  AC_CHECK_TOOL([STRIP], [strip], :)
+fi
+INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s"
+AC_SUBST([INSTALL_STRIP_PROGRAM])])
+
+# Copyright (C) 2006-2013 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# _AM_SUBST_NOTMAKE(VARIABLE)
+# ---------------------------
+# Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in.
+# This macro is traced by Automake.
+AC_DEFUN([_AM_SUBST_NOTMAKE])
+
+# AM_SUBST_NOTMAKE(VARIABLE)
+# --------------------------
+# Public sister of _AM_SUBST_NOTMAKE.
+AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)])
+
+# Check how to create a tarball.                            -*- Autoconf -*-
+
+# Copyright (C) 2004-2013 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# _AM_PROG_TAR(FORMAT)
+# --------------------
+# Check how to create a tarball in format FORMAT.
+# FORMAT should be one of 'v7', 'ustar', or 'pax'.
+#
+# Substitute a variable $(am__tar) that is a command
+# writing to stdout a FORMAT-tarball containing the directory
+# $tardir.
+#     tardir=directory && $(am__tar) > result.tar
+#
+# Substitute a variable $(am__untar) that extract such
+# a tarball read from stdin.
+#     $(am__untar) < result.tar
+#
+AC_DEFUN([_AM_PROG_TAR],
+[# Always define AMTAR for backward compatibility.  Yes, it's still used
+# in the wild :-(  We should find a proper way to deprecate it ...
+AC_SUBST([AMTAR], ['$${TAR-tar}'])
+
+# We'll loop over all known methods to create a tar archive until one works.
+_am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none'
+
+m4_if([$1], [v7],
+  [am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'],
+
+  [m4_case([$1],
+    [ustar],
+     [# The POSIX 1988 'ustar' format is defined with fixed-size fields.
+      # There is notably a 21 bits limit for the UID and the GID.  In fact,
+      # the 'pax' utility can hang on bigger UID/GID (see automake bug#8343
+      # and bug#13588).
+      am_max_uid=2097151 # 2^21 - 1
+      am_max_gid=$am_max_uid
+      # The $UID and $GID variables are not portable, so we need to resort
+      # to the POSIX-mandated id(1) utility.  Errors in the 'id' calls
+      # below are definitely unexpected, so allow the users to see them
+      # (that is, avoid stderr redirection).
+      am_uid=`id -u || echo unknown`
+      am_gid=`id -g || echo unknown`
+      AC_MSG_CHECKING([whether UID '$am_uid' is supported by ustar format])
+      if test $am_uid -le $am_max_uid; then
+         AC_MSG_RESULT([yes])
+      else
+         AC_MSG_RESULT([no])
+         _am_tools=none
+      fi
+      AC_MSG_CHECKING([whether GID '$am_gid' is supported by ustar format])
+      if test $am_gid -le $am_max_gid; then
+         AC_MSG_RESULT([yes])
+      else
+        AC_MSG_RESULT([no])
+        _am_tools=none
+      fi],
+
+  [pax],
+    [],
+
+  [m4_fatal([Unknown tar format])])
+
+  AC_MSG_CHECKING([how to create a $1 tar archive])
+
+  # Go ahead even if we have the value already cached.  We do so because we
+  # need to set the values for the 'am__tar' and 'am__untar' variables.
+  _am_tools=${am_cv_prog_tar_$1-$_am_tools}
+
+  for _am_tool in $_am_tools; do
+    case $_am_tool in
+    gnutar)
+      for _am_tar in tar gnutar gtar; do
+        AM_RUN_LOG([$_am_tar --version]) && break
+      done
+      am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"'
+      am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"'
+      am__untar="$_am_tar -xf -"
+      ;;
+    plaintar)
+      # Must skip GNU tar: if it does not support --format= it doesn't create
+      # ustar tarball either.
+      (tar --version) >/dev/null 2>&1 && continue
+      am__tar='tar chf - "$$tardir"'
+      am__tar_='tar chf - "$tardir"'
+      am__untar='tar xf -'
+      ;;
+    pax)
+      am__tar='pax -L -x $1 -w "$$tardir"'
+      am__tar_='pax -L -x $1 -w "$tardir"'
+      am__untar='pax -r'
+      ;;
+    cpio)
+      am__tar='find "$$tardir" -print | cpio -o -H $1 -L'
+      am__tar_='find "$tardir" -print | cpio -o -H $1 -L'
+      am__untar='cpio -i -H $1 -d'
+      ;;
+    none)
+      am__tar=false
+      am__tar_=false
+      am__untar=false
+      ;;
+    esac
+
+    # If the value was cached, stop now.  We just wanted to have am__tar
+    # and am__untar set.
+    test -n "${am_cv_prog_tar_$1}" && break
+
+    # tar/untar a dummy directory, and stop if the command works.
+    rm -rf conftest.dir
+    mkdir conftest.dir
+    echo GrepMe > conftest.dir/file
+    AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar])
+    rm -rf conftest.dir
+    if test -s conftest.tar; then
+      AM_RUN_LOG([$am__untar <conftest.tar])
+      AM_RUN_LOG([cat conftest.dir/file])
+      grep GrepMe conftest.dir/file >/dev/null 2>&1 && break
+    fi
+  done
+  rm -rf conftest.dir
+
+  AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool])
+  AC_MSG_RESULT([$am_cv_prog_tar_$1])])
+
+AC_SUBST([am__tar])
+AC_SUBST([am__untar])
+]) # _AM_PROG_TAR
+
+m4_include([m4/libtool.m4])
+m4_include([m4/ltoptions.m4])
+m4_include([m4/ltsugar.m4])
+m4_include([m4/ltversion.m4])
+m4_include([m4/lt~obsolete.m4])
+m4_include([acinclude.m4])
diff --git a/compile b/compile
new file mode 100755
index 0000000..531136b
--- /dev/null
+++ b/compile
@@ -0,0 +1,347 @@
+#! /bin/sh
+# Wrapper for compilers which do not understand '-c -o'.
+
+scriptversion=2012-10-14.11; # UTC
+
+# Copyright (C) 1999-2013 Free Software Foundation, Inc.
+# Written by Tom Tromey <tromey at cygnus.com>.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# This file is maintained in Automake, please report
+# bugs to <bug-automake at gnu.org> or send patches to
+# <automake-patches at gnu.org>.
+
+nl='
+'
+
+# We need space, tab and new line, in precisely that order.  Quoting is
+# there to prevent tools from complaining about whitespace usage.
+IFS=" ""	$nl"
+
+file_conv=
+
+# func_file_conv build_file lazy
+# Convert a $build file to $host form and store it in $file
+# Currently only supports Windows hosts. If the determined conversion
+# type is listed in (the comma separated) LAZY, no conversion will
+# take place.
+func_file_conv ()
+{
+  file=$1
+  case $file in
+    / | /[!/]*) # absolute file, and not a UNC file
+      if test -z "$file_conv"; then
+	# lazily determine how to convert abs files
+	case `uname -s` in
+	  MINGW*)
+	    file_conv=mingw
+	    ;;
+	  CYGWIN*)
+	    file_conv=cygwin
+	    ;;
+	  *)
+	    file_conv=wine
+	    ;;
+	esac
+      fi
+      case $file_conv/,$2, in
+	*,$file_conv,*)
+	  ;;
+	mingw/*)
+	  file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'`
+	  ;;
+	cygwin/*)
+	  file=`cygpath -m "$file" || echo "$file"`
+	  ;;
+	wine/*)
+	  file=`winepath -w "$file" || echo "$file"`
+	  ;;
+      esac
+      ;;
+  esac
+}
+
+# func_cl_dashL linkdir
+# Make cl look for libraries in LINKDIR
+func_cl_dashL ()
+{
+  func_file_conv "$1"
+  if test -z "$lib_path"; then
+    lib_path=$file
+  else
+    lib_path="$lib_path;$file"
+  fi
+  linker_opts="$linker_opts -LIBPATH:$file"
+}
+
+# func_cl_dashl library
+# Do a library search-path lookup for cl
+func_cl_dashl ()
+{
+  lib=$1
+  found=no
+  save_IFS=$IFS
+  IFS=';'
+  for dir in $lib_path $LIB
+  do
+    IFS=$save_IFS
+    if $shared && test -f "$dir/$lib.dll.lib"; then
+      found=yes
+      lib=$dir/$lib.dll.lib
+      break
+    fi
+    if test -f "$dir/$lib.lib"; then
+      found=yes
+      lib=$dir/$lib.lib
+      break
+    fi
+    if test -f "$dir/lib$lib.a"; then
+      found=yes
+      lib=$dir/lib$lib.a
+      break
+    fi
+  done
+  IFS=$save_IFS
+
+  if test "$found" != yes; then
+    lib=$lib.lib
+  fi
+}
+
+# func_cl_wrapper cl arg...
+# Adjust compile command to suit cl
+func_cl_wrapper ()
+{
+  # Assume a capable shell
+  lib_path=
+  shared=:
+  linker_opts=
+  for arg
+  do
+    if test -n "$eat"; then
+      eat=
+    else
+      case $1 in
+	-o)
+	  # configure might choose to run compile as 'compile cc -o foo foo.c'.
+	  eat=1
+	  case $2 in
+	    *.o | *.[oO][bB][jJ])
+	      func_file_conv "$2"
+	      set x "$@" -Fo"$file"
+	      shift
+	      ;;
+	    *)
+	      func_file_conv "$2"
+	      set x "$@" -Fe"$file"
+	      shift
+	      ;;
+	  esac
+	  ;;
+	-I)
+	  eat=1
+	  func_file_conv "$2" mingw
+	  set x "$@" -I"$file"
+	  shift
+	  ;;
+	-I*)
+	  func_file_conv "${1#-I}" mingw
+	  set x "$@" -I"$file"
+	  shift
+	  ;;
+	-l)
+	  eat=1
+	  func_cl_dashl "$2"
+	  set x "$@" "$lib"
+	  shift
+	  ;;
+	-l*)
+	  func_cl_dashl "${1#-l}"
+	  set x "$@" "$lib"
+	  shift
+	  ;;
+	-L)
+	  eat=1
+	  func_cl_dashL "$2"
+	  ;;
+	-L*)
+	  func_cl_dashL "${1#-L}"
+	  ;;
+	-static)
+	  shared=false
+	  ;;
+	-Wl,*)
+	  arg=${1#-Wl,}
+	  save_ifs="$IFS"; IFS=','
+	  for flag in $arg; do
+	    IFS="$save_ifs"
+	    linker_opts="$linker_opts $flag"
+	  done
+	  IFS="$save_ifs"
+	  ;;
+	-Xlinker)
+	  eat=1
+	  linker_opts="$linker_opts $2"
+	  ;;
+	-*)
+	  set x "$@" "$1"
+	  shift
+	  ;;
+	*.cc | *.CC | *.cxx | *.CXX | *.[cC]++)
+	  func_file_conv "$1"
+	  set x "$@" -Tp"$file"
+	  shift
+	  ;;
+	*.c | *.cpp | *.CPP | *.lib | *.LIB | *.Lib | *.OBJ | *.obj | *.[oO])
+	  func_file_conv "$1" mingw
+	  set x "$@" "$file"
+	  shift
+	  ;;
+	*)
+	  set x "$@" "$1"
+	  shift
+	  ;;
+      esac
+    fi
+    shift
+  done
+  if test -n "$linker_opts"; then
+    linker_opts="-link$linker_opts"
+  fi
+  exec "$@" $linker_opts
+  exit 1
+}
+
+eat=
+
+case $1 in
+  '')
+     echo "$0: No command.  Try '$0 --help' for more information." 1>&2
+     exit 1;
+     ;;
+  -h | --h*)
+    cat <<\EOF
+Usage: compile [--help] [--version] PROGRAM [ARGS]
+
+Wrapper for compilers which do not understand '-c -o'.
+Remove '-o dest.o' from ARGS, run PROGRAM with the remaining
+arguments, and rename the output as expected.
+
+If you are trying to build a whole package this is not the
+right script to run: please start by reading the file 'INSTALL'.
+
+Report bugs to <bug-automake at gnu.org>.
+EOF
+    exit $?
+    ;;
+  -v | --v*)
+    echo "compile $scriptversion"
+    exit $?
+    ;;
+  cl | *[/\\]cl | cl.exe | *[/\\]cl.exe )
+    func_cl_wrapper "$@"      # Doesn't return...
+    ;;
+esac
+
+ofile=
+cfile=
+
+for arg
+do
+  if test -n "$eat"; then
+    eat=
+  else
+    case $1 in
+      -o)
+	# configure might choose to run compile as 'compile cc -o foo foo.c'.
+	# So we strip '-o arg' only if arg is an object.
+	eat=1
+	case $2 in
+	  *.o | *.obj)
+	    ofile=$2
+	    ;;
+	  *)
+	    set x "$@" -o "$2"
+	    shift
+	    ;;
+	esac
+	;;
+      *.c)
+	cfile=$1
+	set x "$@" "$1"
+	shift
+	;;
+      *)
+	set x "$@" "$1"
+	shift
+	;;
+    esac
+  fi
+  shift
+done
+
+if test -z "$ofile" || test -z "$cfile"; then
+  # If no '-o' option was seen then we might have been invoked from a
+  # pattern rule where we don't need one.  That is ok -- this is a
+  # normal compilation that the losing compiler can handle.  If no
+  # '.c' file was seen then we are probably linking.  That is also
+  # ok.
+  exec "$@"
+fi
+
+# Name of file we expect compiler to create.
+cofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'`
+
+# Create the lock directory.
+# Note: use '[/\\:.-]' here to ensure that we don't use the same name
+# that we are using for the .o file.  Also, base the name on the expected
+# object file name, since that is what matters with a parallel build.
+lockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d
+while true; do
+  if mkdir "$lockdir" >/dev/null 2>&1; then
+    break
+  fi
+  sleep 1
+done
+# FIXME: race condition here if user kills between mkdir and trap.
+trap "rmdir '$lockdir'; exit 1" 1 2 15
+
+# Run the compile.
+"$@"
+ret=$?
+
+if test -f "$cofile"; then
+  test "$cofile" = "$ofile" || mv "$cofile" "$ofile"
+elif test -f "${cofile}bj"; then
+  test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile"
+fi
+
+rmdir "$lockdir"
+exit $ret
+
+# Local Variables:
+# mode: shell-script
+# sh-indentation: 2
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-time-zone: "UTC"
+# time-stamp-end: "; # UTC"
+# End:
diff --git a/config.guess b/config.guess
new file mode 100755
index 0000000..9afd676
--- /dev/null
+++ b/config.guess
@@ -0,0 +1,1568 @@
+#! /bin/sh
+# Attempt to guess a canonical system name.
+#   Copyright 1992-2013 Free Software Foundation, Inc.
+
+timestamp='2013-11-29'
+
+# This file is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, see <http://www.gnu.org/licenses/>.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that
+# program.  This Exception is an additional permission under section 7
+# of the GNU General Public License, version 3 ("GPLv3").
+#
+# Originally written by Per Bothner.
+#
+# You can get the latest version of this script from:
+# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD
+#
+# Please send patches with a ChangeLog entry to config-patches at gnu.org.
+
+
+me=`echo "$0" | sed -e 's,.*/,,'`
+
+usage="\
+Usage: $0 [OPTION]
+
+Output the configuration name of the system \`$me' is run on.
+
+Operation modes:
+  -h, --help         print this help, then exit
+  -t, --time-stamp   print date of last modification, then exit
+  -v, --version      print version number, then exit
+
+Report bugs and patches to <config-patches at gnu.org>."
+
+version="\
+GNU config.guess ($timestamp)
+
+Originally written by Per Bothner.
+Copyright 1992-2013 Free Software Foundation, Inc.
+
+This is free software; see the source for copying conditions.  There is NO
+warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
+
+help="
+Try \`$me --help' for more information."
+
+# Parse command line
+while test $# -gt 0 ; do
+  case $1 in
+    --time-stamp | --time* | -t )
+       echo "$timestamp" ; exit ;;
+    --version | -v )
+       echo "$version" ; exit ;;
+    --help | --h* | -h )
+       echo "$usage"; exit ;;
+    -- )     # Stop option processing
+       shift; break ;;
+    - )	# Use stdin as input.
+       break ;;
+    -* )
+       echo "$me: invalid option $1$help" >&2
+       exit 1 ;;
+    * )
+       break ;;
+  esac
+done
+
+if test $# != 0; then
+  echo "$me: too many arguments$help" >&2
+  exit 1
+fi
+
+trap 'exit 1' 1 2 15
+
+# CC_FOR_BUILD -- compiler used by this script. Note that the use of a
+# compiler to aid in system detection is discouraged as it requires
+# temporary files to be created and, as you can see below, it is a
+# headache to deal with in a portable fashion.
+
+# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still
+# use `HOST_CC' if defined, but it is deprecated.
+
+# Portable tmp directory creation inspired by the Autoconf team.
+
+set_cc_for_build='
+trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ;
+trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ;
+: ${TMPDIR=/tmp} ;
+ { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } ||
+ { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } ||
+ { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } ||
+ { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ;
+dummy=$tmp/dummy ;
+tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ;
+case $CC_FOR_BUILD,$HOST_CC,$CC in
+ ,,)    echo "int x;" > $dummy.c ;
+	for c in cc gcc c89 c99 ; do
+	  if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then
+	     CC_FOR_BUILD="$c"; break ;
+	  fi ;
+	done ;
+	if test x"$CC_FOR_BUILD" = x ; then
+	  CC_FOR_BUILD=no_compiler_found ;
+	fi
+	;;
+ ,,*)   CC_FOR_BUILD=$CC ;;
+ ,*,*)  CC_FOR_BUILD=$HOST_CC ;;
+esac ; set_cc_for_build= ;'
+
+# This is needed to find uname on a Pyramid OSx when run in the BSD universe.
+# (ghazi at noc.rutgers.edu 1994-08-24)
+if (test -f /.attbin/uname) >/dev/null 2>&1 ; then
+	PATH=$PATH:/.attbin ; export PATH
+fi
+
+UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown
+UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown
+UNAME_SYSTEM=`(uname -s) 2>/dev/null`  || UNAME_SYSTEM=unknown
+UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown
+
+case "${UNAME_SYSTEM}" in
+Linux|GNU|GNU/*)
+	# If the system lacks a compiler, then just pick glibc.
+	# We could probably try harder.
+	LIBC=gnu
+
+	eval $set_cc_for_build
+	cat <<-EOF > $dummy.c
+	#include <features.h>
+	#if defined(__UCLIBC__)
+	LIBC=uclibc
+	#elif defined(__dietlibc__)
+	LIBC=dietlibc
+	#else
+	LIBC=gnu
+	#endif
+	EOF
+	eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC'`
+	;;
+esac
+
+# Note: order is significant - the case branches are not exclusive.
+
+case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
+    *:NetBSD:*:*)
+	# NetBSD (nbsd) targets should (where applicable) match one or
+	# more of the tuples: *-*-netbsdelf*, *-*-netbsdaout*,
+	# *-*-netbsdecoff* and *-*-netbsd*.  For targets that recently
+	# switched to ELF, *-*-netbsd* would select the old
+	# object file format.  This provides both forward
+	# compatibility and a consistent mechanism for selecting the
+	# object file format.
+	#
+	# Note: NetBSD doesn't particularly care about the vendor
+	# portion of the name.  We always set it to "unknown".
+	sysctl="sysctl -n hw.machine_arch"
+	UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \
+	    /usr/sbin/$sysctl 2>/dev/null || echo unknown)`
+	case "${UNAME_MACHINE_ARCH}" in
+	    armeb) machine=armeb-unknown ;;
+	    arm*) machine=arm-unknown ;;
+	    sh3el) machine=shl-unknown ;;
+	    sh3eb) machine=sh-unknown ;;
+	    sh5el) machine=sh5le-unknown ;;
+	    *) machine=${UNAME_MACHINE_ARCH}-unknown ;;
+	esac
+	# The Operating System including object format, if it has switched
+	# to ELF recently, or will in the future.
+	case "${UNAME_MACHINE_ARCH}" in
+	    arm*|i386|m68k|ns32k|sh3*|sparc|vax)
+		eval $set_cc_for_build
+		if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \
+			| grep -q __ELF__
+		then
+		    # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout).
+		    # Return netbsd for either.  FIX?
+		    os=netbsd
+		else
+		    os=netbsdelf
+		fi
+		;;
+	    *)
+		os=netbsd
+		;;
+	esac
+	# The OS release
+	# Debian GNU/NetBSD machines have a different userland, and
+	# thus, need a distinct triplet. However, they do not need
+	# kernel version information, so it can be replaced with a
+	# suitable tag, in the style of linux-gnu.
+	case "${UNAME_VERSION}" in
+	    Debian*)
+		release='-gnu'
+		;;
+	    *)
+		release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'`
+		;;
+	esac
+	# Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM:
+	# contains redundant information, the shorter form:
+	# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used.
+	echo "${machine}-${os}${release}"
+	exit ;;
+    *:Bitrig:*:*)
+	UNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'`
+	echo ${UNAME_MACHINE_ARCH}-unknown-bitrig${UNAME_RELEASE}
+	exit ;;
+    *:OpenBSD:*:*)
+	UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'`
+	echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE}
+	exit ;;
+    *:ekkoBSD:*:*)
+	echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE}
+	exit ;;
+    *:SolidBSD:*:*)
+	echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE}
+	exit ;;
+    macppc:MirBSD:*:*)
+	echo powerpc-unknown-mirbsd${UNAME_RELEASE}
+	exit ;;
+    *:MirBSD:*:*)
+	echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE}
+	exit ;;
+    alpha:OSF1:*:*)
+	case $UNAME_RELEASE in
+	*4.0)
+		UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'`
+		;;
+	*5.*)
+		UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'`
+		;;
+	esac
+	# According to Compaq, /usr/sbin/psrinfo has been available on
+	# OSF/1 and Tru64 systems produced since 1995.  I hope that
+	# covers most systems running today.  This code pipes the CPU
+	# types through head -n 1, so we only detect the type of CPU 0.
+	ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^  The alpha \(.*\) processor.*$/\1/p' | head -n 1`
+	case "$ALPHA_CPU_TYPE" in
+	    "EV4 (21064)")
+		UNAME_MACHINE="alpha" ;;
+	    "EV4.5 (21064)")
+		UNAME_MACHINE="alpha" ;;
+	    "LCA4 (21066/21068)")
+		UNAME_MACHINE="alpha" ;;
+	    "EV5 (21164)")
+		UNAME_MACHINE="alphaev5" ;;
+	    "EV5.6 (21164A)")
+		UNAME_MACHINE="alphaev56" ;;
+	    "EV5.6 (21164PC)")
+		UNAME_MACHINE="alphapca56" ;;
+	    "EV5.7 (21164PC)")
+		UNAME_MACHINE="alphapca57" ;;
+	    "EV6 (21264)")
+		UNAME_MACHINE="alphaev6" ;;
+	    "EV6.7 (21264A)")
+		UNAME_MACHINE="alphaev67" ;;
+	    "EV6.8CB (21264C)")
+		UNAME_MACHINE="alphaev68" ;;
+	    "EV6.8AL (21264B)")
+		UNAME_MACHINE="alphaev68" ;;
+	    "EV6.8CX (21264D)")
+		UNAME_MACHINE="alphaev68" ;;
+	    "EV6.9A (21264/EV69A)")
+		UNAME_MACHINE="alphaev69" ;;
+	    "EV7 (21364)")
+		UNAME_MACHINE="alphaev7" ;;
+	    "EV7.9 (21364A)")
+		UNAME_MACHINE="alphaev79" ;;
+	esac
+	# A Pn.n version is a patched version.
+	# A Vn.n version is a released version.
+	# A Tn.n version is a released field test version.
+	# A Xn.n version is an unreleased experimental baselevel.
+	# 1.2 uses "1.2" for uname -r.
+	echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
+	# Reset EXIT trap before exiting to avoid spurious non-zero exit code.
+	exitcode=$?
+	trap '' 0
+	exit $exitcode ;;
+    Alpha\ *:Windows_NT*:*)
+	# How do we know it's Interix rather than the generic POSIX subsystem?
+	# Should we change UNAME_MACHINE based on the output of uname instead
+	# of the specific Alpha model?
+	echo alpha-pc-interix
+	exit ;;
+    21064:Windows_NT:50:3)
+	echo alpha-dec-winnt3.5
+	exit ;;
+    Amiga*:UNIX_System_V:4.0:*)
+	echo m68k-unknown-sysv4
+	exit ;;
+    *:[Aa]miga[Oo][Ss]:*:*)
+	echo ${UNAME_MACHINE}-unknown-amigaos
+	exit ;;
+    *:[Mm]orph[Oo][Ss]:*:*)
+	echo ${UNAME_MACHINE}-unknown-morphos
+	exit ;;
+    *:OS/390:*:*)
+	echo i370-ibm-openedition
+	exit ;;
+    *:z/VM:*:*)
+	echo s390-ibm-zvmoe
+	exit ;;
+    *:OS400:*:*)
+	echo powerpc-ibm-os400
+	exit ;;
+    arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*)
+	echo arm-acorn-riscix${UNAME_RELEASE}
+	exit ;;
+    arm*:riscos:*:*|arm*:RISCOS:*:*)
+	echo arm-unknown-riscos
+	exit ;;
+    SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*)
+	echo hppa1.1-hitachi-hiuxmpp
+	exit ;;
+    Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*)
+	# akee at wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE.
+	if test "`(/bin/universe) 2>/dev/null`" = att ; then
+		echo pyramid-pyramid-sysv3
+	else
+		echo pyramid-pyramid-bsd
+	fi
+	exit ;;
+    NILE*:*:*:dcosx)
+	echo pyramid-pyramid-svr4
+	exit ;;
+    DRS?6000:unix:4.0:6*)
+	echo sparc-icl-nx6
+	exit ;;
+    DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*)
+	case `/usr/bin/uname -p` in
+	    sparc) echo sparc-icl-nx7; exit ;;
+	esac ;;
+    s390x:SunOS:*:*)
+	echo ${UNAME_MACHINE}-ibm-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+	exit ;;
+    sun4H:SunOS:5.*:*)
+	echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+	exit ;;
+    sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*)
+	echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+	exit ;;
+    i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*)
+	echo i386-pc-auroraux${UNAME_RELEASE}
+	exit ;;
+    i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*)
+	eval $set_cc_for_build
+	SUN_ARCH="i386"
+	# If there is a compiler, see if it is configured for 64-bit objects.
+	# Note that the Sun cc does not turn __LP64__ into 1 like gcc does.
+	# This test works for both compilers.
+	if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then
+	    if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \
+		(CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \
+		grep IS_64BIT_ARCH >/dev/null
+	    then
+		SUN_ARCH="x86_64"
+	    fi
+	fi
+	echo ${SUN_ARCH}-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+	exit ;;
+    sun4*:SunOS:6*:*)
+	# According to config.sub, this is the proper way to canonicalize
+	# SunOS6.  Hard to guess exactly what SunOS6 will be like, but
+	# it's likely to be more like Solaris than SunOS4.
+	echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+	exit ;;
+    sun4*:SunOS:*:*)
+	case "`/usr/bin/arch -k`" in
+	    Series*|S4*)
+		UNAME_RELEASE=`uname -v`
+		;;
+	esac
+	# Japanese Language versions have a version number like `4.1.3-JL'.
+	echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'`
+	exit ;;
+    sun3*:SunOS:*:*)
+	echo m68k-sun-sunos${UNAME_RELEASE}
+	exit ;;
+    sun*:*:4.2BSD:*)
+	UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null`
+	test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3
+	case "`/bin/arch`" in
+	    sun3)
+		echo m68k-sun-sunos${UNAME_RELEASE}
+		;;
+	    sun4)
+		echo sparc-sun-sunos${UNAME_RELEASE}
+		;;
+	esac
+	exit ;;
+    aushp:SunOS:*:*)
+	echo sparc-auspex-sunos${UNAME_RELEASE}
+	exit ;;
+    # The situation for MiNT is a little confusing.  The machine name
+    # can be virtually everything (everything which is not
+    # "atarist" or "atariste" at least should have a processor
+    # > m68000).  The system name ranges from "MiNT" over "FreeMiNT"
+    # to the lowercase version "mint" (or "freemint").  Finally
+    # the system name "TOS" denotes a system which is actually not
+    # MiNT.  But MiNT is downward compatible to TOS, so this should
+    # be no problem.
+    atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*)
+	echo m68k-atari-mint${UNAME_RELEASE}
+	exit ;;
+    atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*)
+	echo m68k-atari-mint${UNAME_RELEASE}
+	exit ;;
+    *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*)
+	echo m68k-atari-mint${UNAME_RELEASE}
+	exit ;;
+    milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*)
+	echo m68k-milan-mint${UNAME_RELEASE}
+	exit ;;
+    hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*)
+	echo m68k-hades-mint${UNAME_RELEASE}
+	exit ;;
+    *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*)
+	echo m68k-unknown-mint${UNAME_RELEASE}
+	exit ;;
+    m68k:machten:*:*)
+	echo m68k-apple-machten${UNAME_RELEASE}
+	exit ;;
+    powerpc:machten:*:*)
+	echo powerpc-apple-machten${UNAME_RELEASE}
+	exit ;;
+    RISC*:Mach:*:*)
+	echo mips-dec-mach_bsd4.3
+	exit ;;
+    RISC*:ULTRIX:*:*)
+	echo mips-dec-ultrix${UNAME_RELEASE}
+	exit ;;
+    VAX*:ULTRIX*:*:*)
+	echo vax-dec-ultrix${UNAME_RELEASE}
+	exit ;;
+    2020:CLIX:*:* | 2430:CLIX:*:*)
+	echo clipper-intergraph-clix${UNAME_RELEASE}
+	exit ;;
+    mips:*:*:UMIPS | mips:*:*:RISCos)
+	eval $set_cc_for_build
+	sed 's/^	//' << EOF >$dummy.c
+#ifdef __cplusplus
+#include <stdio.h>  /* for printf() prototype */
+	int main (int argc, char *argv[]) {
+#else
+	int main (argc, argv) int argc; char *argv[]; {
+#endif
+	#if defined (host_mips) && defined (MIPSEB)
+	#if defined (SYSTYPE_SYSV)
+	  printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0);
+	#endif
+	#if defined (SYSTYPE_SVR4)
+	  printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0);
+	#endif
+	#if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD)
+	  printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0);
+	#endif
+	#endif
+	  exit (-1);
+	}
+EOF
+	$CC_FOR_BUILD -o $dummy $dummy.c &&
+	  dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` &&
+	  SYSTEM_NAME=`$dummy $dummyarg` &&
+	    { echo "$SYSTEM_NAME"; exit; }
+	echo mips-mips-riscos${UNAME_RELEASE}
+	exit ;;
+    Motorola:PowerMAX_OS:*:*)
+	echo powerpc-motorola-powermax
+	exit ;;
+    Motorola:*:4.3:PL8-*)
+	echo powerpc-harris-powermax
+	exit ;;
+    Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*)
+	echo powerpc-harris-powermax
+	exit ;;
+    Night_Hawk:Power_UNIX:*:*)
+	echo powerpc-harris-powerunix
+	exit ;;
+    m88k:CX/UX:7*:*)
+	echo m88k-harris-cxux7
+	exit ;;
+    m88k:*:4*:R4*)
+	echo m88k-motorola-sysv4
+	exit ;;
+    m88k:*:3*:R3*)
+	echo m88k-motorola-sysv3
+	exit ;;
+    AViiON:dgux:*:*)
+	# DG/UX returns AViiON for all architectures
+	UNAME_PROCESSOR=`/usr/bin/uname -p`
+	if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ]
+	then
+	    if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \
+	       [ ${TARGET_BINARY_INTERFACE}x = x ]
+	    then
+		echo m88k-dg-dgux${UNAME_RELEASE}
+	    else
+		echo m88k-dg-dguxbcs${UNAME_RELEASE}
+	    fi
+	else
+	    echo i586-dg-dgux${UNAME_RELEASE}
+	fi
+	exit ;;
+    M88*:DolphinOS:*:*)	# DolphinOS (SVR3)
+	echo m88k-dolphin-sysv3
+	exit ;;
+    M88*:*:R3*:*)
+	# Delta 88k system running SVR3
+	echo m88k-motorola-sysv3
+	exit ;;
+    XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3)
+	echo m88k-tektronix-sysv3
+	exit ;;
+    Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD)
+	echo m68k-tektronix-bsd
+	exit ;;
+    *:IRIX*:*:*)
+	echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'`
+	exit ;;
+    ????????:AIX?:[12].1:2)   # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX.
+	echo romp-ibm-aix     # uname -m gives an 8 hex-code CPU id
+	exit ;;               # Note that: echo "'`uname -s`'" gives 'AIX '
+    i*86:AIX:*:*)
+	echo i386-ibm-aix
+	exit ;;
+    ia64:AIX:*:*)
+	if [ -x /usr/bin/oslevel ] ; then
+		IBM_REV=`/usr/bin/oslevel`
+	else
+		IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
+	fi
+	echo ${UNAME_MACHINE}-ibm-aix${IBM_REV}
+	exit ;;
+    *:AIX:2:3)
+	if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then
+		eval $set_cc_for_build
+		sed 's/^		//' << EOF >$dummy.c
+		#include <sys/systemcfg.h>
+
+		main()
+			{
+			if (!__power_pc())
+				exit(1);
+			puts("powerpc-ibm-aix3.2.5");
+			exit(0);
+			}
+EOF
+		if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy`
+		then
+			echo "$SYSTEM_NAME"
+		else
+			echo rs6000-ibm-aix3.2.5
+		fi
+	elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then
+		echo rs6000-ibm-aix3.2.4
+	else
+		echo rs6000-ibm-aix3.2
+	fi
+	exit ;;
+    *:AIX:*:[4567])
+	IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'`
+	if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then
+		IBM_ARCH=rs6000
+	else
+		IBM_ARCH=powerpc
+	fi
+	if [ -x /usr/bin/oslevel ] ; then
+		IBM_REV=`/usr/bin/oslevel`
+	else
+		IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
+	fi
+	echo ${IBM_ARCH}-ibm-aix${IBM_REV}
+	exit ;;
+    *:AIX:*:*)
+	echo rs6000-ibm-aix
+	exit ;;
+    ibmrt:4.4BSD:*|romp-ibm:BSD:*)
+	echo romp-ibm-bsd4.4
+	exit ;;
+    ibmrt:*BSD:*|romp-ibm:BSD:*)            # covers RT/PC BSD and
+	echo romp-ibm-bsd${UNAME_RELEASE}   # 4.3 with uname added to
+	exit ;;                             # report: romp-ibm BSD 4.3
+    *:BOSX:*:*)
+	echo rs6000-bull-bosx
+	exit ;;
+    DPX/2?00:B.O.S.:*:*)
+	echo m68k-bull-sysv3
+	exit ;;
+    9000/[34]??:4.3bsd:1.*:*)
+	echo m68k-hp-bsd
+	exit ;;
+    hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*)
+	echo m68k-hp-bsd4.4
+	exit ;;
+    9000/[34678]??:HP-UX:*:*)
+	HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
+	case "${UNAME_MACHINE}" in
+	    9000/31? )            HP_ARCH=m68000 ;;
+	    9000/[34]?? )         HP_ARCH=m68k ;;
+	    9000/[678][0-9][0-9])
+		if [ -x /usr/bin/getconf ]; then
+		    sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null`
+		    sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null`
+		    case "${sc_cpu_version}" in
+		      523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0
+		      528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1
+		      532)                      # CPU_PA_RISC2_0
+			case "${sc_kernel_bits}" in
+			  32) HP_ARCH="hppa2.0n" ;;
+			  64) HP_ARCH="hppa2.0w" ;;
+			  '') HP_ARCH="hppa2.0" ;;   # HP-UX 10.20
+			esac ;;
+		    esac
+		fi
+		if [ "${HP_ARCH}" = "" ]; then
+		    eval $set_cc_for_build
+		    sed 's/^		//' << EOF >$dummy.c
+
+		#define _HPUX_SOURCE
+		#include <stdlib.h>
+		#include <unistd.h>
+
+		int main ()
+		{
+		#if defined(_SC_KERNEL_BITS)
+		    long bits = sysconf(_SC_KERNEL_BITS);
+		#endif
+		    long cpu  = sysconf (_SC_CPU_VERSION);
+
+		    switch (cpu)
+			{
+			case CPU_PA_RISC1_0: puts ("hppa1.0"); break;
+			case CPU_PA_RISC1_1: puts ("hppa1.1"); break;
+			case CPU_PA_RISC2_0:
+		#if defined(_SC_KERNEL_BITS)
+			    switch (bits)
+				{
+				case 64: puts ("hppa2.0w"); break;
+				case 32: puts ("hppa2.0n"); break;
+				default: puts ("hppa2.0"); break;
+				} break;
+		#else  /* !defined(_SC_KERNEL_BITS) */
+			    puts ("hppa2.0"); break;
+		#endif
+			default: puts ("hppa1.0"); break;
+			}
+		    exit (0);
+		}
+EOF
+		    (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy`
+		    test -z "$HP_ARCH" && HP_ARCH=hppa
+		fi ;;
+	esac
+	if [ ${HP_ARCH} = "hppa2.0w" ]
+	then
+	    eval $set_cc_for_build
+
+	    # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating
+	    # 32-bit code.  hppa64-hp-hpux* has the same kernel and a compiler
+	    # generating 64-bit code.  GNU and HP use different nomenclature:
+	    #
+	    # $ CC_FOR_BUILD=cc ./config.guess
+	    # => hppa2.0w-hp-hpux11.23
+	    # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess
+	    # => hppa64-hp-hpux11.23
+
+	    if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) |
+		grep -q __LP64__
+	    then
+		HP_ARCH="hppa2.0w"
+	    else
+		HP_ARCH="hppa64"
+	    fi
+	fi
+	echo ${HP_ARCH}-hp-hpux${HPUX_REV}
+	exit ;;
+    ia64:HP-UX:*:*)
+	HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
+	echo ia64-hp-hpux${HPUX_REV}
+	exit ;;
+    3050*:HI-UX:*:*)
+	eval $set_cc_for_build
+	sed 's/^	//' << EOF >$dummy.c
+	#include <unistd.h>
+	int
+	main ()
+	{
+	  long cpu = sysconf (_SC_CPU_VERSION);
+	  /* The order matters, because CPU_IS_HP_MC68K erroneously returns
+	     true for CPU_PA_RISC1_0.  CPU_IS_PA_RISC returns correct
+	     results, however.  */
+	  if (CPU_IS_PA_RISC (cpu))
+	    {
+	      switch (cpu)
+		{
+		  case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break;
+		  case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break;
+		  case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break;
+		  default: puts ("hppa-hitachi-hiuxwe2"); break;
+		}
+	    }
+	  else if (CPU_IS_HP_MC68K (cpu))
+	    puts ("m68k-hitachi-hiuxwe2");
+	  else puts ("unknown-hitachi-hiuxwe2");
+	  exit (0);
+	}
+EOF
+	$CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` &&
+		{ echo "$SYSTEM_NAME"; exit; }
+	echo unknown-hitachi-hiuxwe2
+	exit ;;
+    9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* )
+	echo hppa1.1-hp-bsd
+	exit ;;
+    9000/8??:4.3bsd:*:*)
+	echo hppa1.0-hp-bsd
+	exit ;;
+    *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*)
+	echo hppa1.0-hp-mpeix
+	exit ;;
+    hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* )
+	echo hppa1.1-hp-osf
+	exit ;;
+    hp8??:OSF1:*:*)
+	echo hppa1.0-hp-osf
+	exit ;;
+    i*86:OSF1:*:*)
+	if [ -x /usr/sbin/sysversion ] ; then
+	    echo ${UNAME_MACHINE}-unknown-osf1mk
+	else
+	    echo ${UNAME_MACHINE}-unknown-osf1
+	fi
+	exit ;;
+    parisc*:Lites*:*:*)
+	echo hppa1.1-hp-lites
+	exit ;;
+    C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*)
+	echo c1-convex-bsd
+	exit ;;
+    C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*)
+	if getsysinfo -f scalar_acc
+	then echo c32-convex-bsd
+	else echo c2-convex-bsd
+	fi
+	exit ;;
+    C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*)
+	echo c34-convex-bsd
+	exit ;;
+    C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*)
+	echo c38-convex-bsd
+	exit ;;
+    C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*)
+	echo c4-convex-bsd
+	exit ;;
+    CRAY*Y-MP:*:*:*)
+	echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+	exit ;;
+    CRAY*[A-Z]90:*:*:*)
+	echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \
+	| sed -e 's/CRAY.*\([A-Z]90\)/\1/' \
+	      -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \
+	      -e 's/\.[^.]*$/.X/'
+	exit ;;
+    CRAY*TS:*:*:*)
+	echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+	exit ;;
+    CRAY*T3E:*:*:*)
+	echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+	exit ;;
+    CRAY*SV1:*:*:*)
+	echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+	exit ;;
+    *:UNICOS/mp:*:*)
+	echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+	exit ;;
+    F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*)
+	FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
+	FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
+	FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'`
+	echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
+	exit ;;
+    5000:UNIX_System_V:4.*:*)
+	FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
+	FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'`
+	echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
+	exit ;;
+    i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*)
+	echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE}
+	exit ;;
+    sparc*:BSD/OS:*:*)
+	echo sparc-unknown-bsdi${UNAME_RELEASE}
+	exit ;;
+    *:BSD/OS:*:*)
+	echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE}
+	exit ;;
+    *:FreeBSD:*:*)
+	UNAME_PROCESSOR=`/usr/bin/uname -p`
+	case ${UNAME_PROCESSOR} in
+	    amd64)
+		echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
+	    *)
+		echo ${UNAME_PROCESSOR}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
+	esac
+	exit ;;
+    i*:CYGWIN*:*)
+	echo ${UNAME_MACHINE}-pc-cygwin
+	exit ;;
+    *:MINGW64*:*)
+	echo ${UNAME_MACHINE}-pc-mingw64
+	exit ;;
+    *:MINGW*:*)
+	echo ${UNAME_MACHINE}-pc-mingw32
+	exit ;;
+    i*:MSYS*:*)
+	echo ${UNAME_MACHINE}-pc-msys
+	exit ;;
+    i*:windows32*:*)
+	# uname -m includes "-pc" on this system.
+	echo ${UNAME_MACHINE}-mingw32
+	exit ;;
+    i*:PW*:*)
+	echo ${UNAME_MACHINE}-pc-pw32
+	exit ;;
+    *:Interix*:*)
+	case ${UNAME_MACHINE} in
+	    x86)
+		echo i586-pc-interix${UNAME_RELEASE}
+		exit ;;
+	    authenticamd | genuineintel | EM64T)
+		echo x86_64-unknown-interix${UNAME_RELEASE}
+		exit ;;
+	    IA64)
+		echo ia64-unknown-interix${UNAME_RELEASE}
+		exit ;;
+	esac ;;
+    [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*)
+	echo i${UNAME_MACHINE}-pc-mks
+	exit ;;
+    8664:Windows_NT:*)
+	echo x86_64-pc-mks
+	exit ;;
+    i*:Windows_NT*:* | Pentium*:Windows_NT*:*)
+	# How do we know it's Interix rather than the generic POSIX subsystem?
+	# It also conflicts with pre-2.0 versions of AT&T UWIN. Should we
+	# UNAME_MACHINE based on the output of uname instead of i386?
+	echo i586-pc-interix
+	exit ;;
+    i*:UWIN*:*)
+	echo ${UNAME_MACHINE}-pc-uwin
+	exit ;;
+    amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*)
+	echo x86_64-unknown-cygwin
+	exit ;;
+    p*:CYGWIN*:*)
+	echo powerpcle-unknown-cygwin
+	exit ;;
+    prep*:SunOS:5.*:*)
+	echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+	exit ;;
+    *:GNU:*:*)
+	# the GNU system
+	echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-${LIBC}`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'`
+	exit ;;
+    *:GNU/*:*:*)
+	# other systems with GNU libc and userland
+	echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-${LIBC}
+	exit ;;
+    i*86:Minix:*:*)
+	echo ${UNAME_MACHINE}-pc-minix
+	exit ;;
+    aarch64:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+	exit ;;
+    aarch64_be:Linux:*:*)
+	UNAME_MACHINE=aarch64_be
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+	exit ;;
+    alpha:Linux:*:*)
+	case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in
+	  EV5)   UNAME_MACHINE=alphaev5 ;;
+	  EV56)  UNAME_MACHINE=alphaev56 ;;
+	  PCA56) UNAME_MACHINE=alphapca56 ;;
+	  PCA57) UNAME_MACHINE=alphapca56 ;;
+	  EV6)   UNAME_MACHINE=alphaev6 ;;
+	  EV67)  UNAME_MACHINE=alphaev67 ;;
+	  EV68*) UNAME_MACHINE=alphaev68 ;;
+	esac
+	objdump --private-headers /bin/sh | grep -q ld.so.1
+	if test "$?" = 0 ; then LIBC="gnulibc1" ; fi
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+	exit ;;
+    arc:Linux:*:* | arceb:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+	exit ;;
+    arm*:Linux:*:*)
+	eval $set_cc_for_build
+	if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \
+	    | grep -q __ARM_EABI__
+	then
+	    echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+	else
+	    if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \
+		| grep -q __ARM_PCS_VFP
+	    then
+		echo ${UNAME_MACHINE}-unknown-linux-${LIBC}eabi
+	    else
+		echo ${UNAME_MACHINE}-unknown-linux-${LIBC}eabihf
+	    fi
+	fi
+	exit ;;
+    avr32*:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+	exit ;;
+    cris:Linux:*:*)
+	echo ${UNAME_MACHINE}-axis-linux-${LIBC}
+	exit ;;
+    crisv32:Linux:*:*)
+	echo ${UNAME_MACHINE}-axis-linux-${LIBC}
+	exit ;;
+    frv:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+	exit ;;
+    hexagon:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+	exit ;;
+    i*86:Linux:*:*)
+	echo ${UNAME_MACHINE}-pc-linux-${LIBC}
+	exit ;;
+    ia64:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+	exit ;;
+    m32r*:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+	exit ;;
+    m68*:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+	exit ;;
+    mips:Linux:*:* | mips64:Linux:*:*)
+	eval $set_cc_for_build
+	sed 's/^	//' << EOF >$dummy.c
+	#undef CPU
+	#undef ${UNAME_MACHINE}
+	#undef ${UNAME_MACHINE}el
+	#if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL)
+	CPU=${UNAME_MACHINE}el
+	#else
+	#if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB)
+	CPU=${UNAME_MACHINE}
+	#else
+	CPU=
+	#endif
+	#endif
+EOF
+	eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'`
+	test x"${CPU}" != x && { echo "${CPU}-unknown-linux-${LIBC}"; exit; }
+	;;
+    or1k:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+	exit ;;
+    or32:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+	exit ;;
+    padre:Linux:*:*)
+	echo sparc-unknown-linux-${LIBC}
+	exit ;;
+    parisc64:Linux:*:* | hppa64:Linux:*:*)
+	echo hppa64-unknown-linux-${LIBC}
+	exit ;;
+    parisc:Linux:*:* | hppa:Linux:*:*)
+	# Look for CPU level
+	case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in
+	  PA7*) echo hppa1.1-unknown-linux-${LIBC} ;;
+	  PA8*) echo hppa2.0-unknown-linux-${LIBC} ;;
+	  *)    echo hppa-unknown-linux-${LIBC} ;;
+	esac
+	exit ;;
+    ppc64:Linux:*:*)
+	echo powerpc64-unknown-linux-${LIBC}
+	exit ;;
+    ppc:Linux:*:*)
+	echo powerpc-unknown-linux-${LIBC}
+	exit ;;
+    ppc64le:Linux:*:*)
+	echo powerpc64le-unknown-linux-${LIBC}
+	exit ;;
+    ppcle:Linux:*:*)
+	echo powerpcle-unknown-linux-${LIBC}
+	exit ;;
+    s390:Linux:*:* | s390x:Linux:*:*)
+	echo ${UNAME_MACHINE}-ibm-linux-${LIBC}
+	exit ;;
+    sh64*:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+	exit ;;
+    sh*:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+	exit ;;
+    sparc:Linux:*:* | sparc64:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+	exit ;;
+    tile*:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+	exit ;;
+    vax:Linux:*:*)
+	echo ${UNAME_MACHINE}-dec-linux-${LIBC}
+	exit ;;
+    x86_64:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+	exit ;;
+    xtensa*:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+	exit ;;
+    i*86:DYNIX/ptx:4*:*)
+	# ptx 4.0 does uname -s correctly, with DYNIX/ptx in there.
+	# earlier versions are messed up and put the nodename in both
+	# sysname and nodename.
+	echo i386-sequent-sysv4
+	exit ;;
+    i*86:UNIX_SV:4.2MP:2.*)
+	# Unixware is an offshoot of SVR4, but it has its own version
+	# number series starting with 2...
+	# I am not positive that other SVR4 systems won't match this,
+	# I just have to hope.  -- rms.
+	# Use sysv4.2uw... so that sysv4* matches it.
+	echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION}
+	exit ;;
+    i*86:OS/2:*:*)
+	# If we were able to find `uname', then EMX Unix compatibility
+	# is probably installed.
+	echo ${UNAME_MACHINE}-pc-os2-emx
+	exit ;;
+    i*86:XTS-300:*:STOP)
+	echo ${UNAME_MACHINE}-unknown-stop
+	exit ;;
+    i*86:atheos:*:*)
+	echo ${UNAME_MACHINE}-unknown-atheos
+	exit ;;
+    i*86:syllable:*:*)
+	echo ${UNAME_MACHINE}-pc-syllable
+	exit ;;
+    i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*)
+	echo i386-unknown-lynxos${UNAME_RELEASE}
+	exit ;;
+    i*86:*DOS:*:*)
+	echo ${UNAME_MACHINE}-pc-msdosdjgpp
+	exit ;;
+    i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*)
+	UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'`
+	if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then
+		echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL}
+	else
+		echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL}
+	fi
+	exit ;;
+    i*86:*:5:[678]*)
+	# UnixWare 7.x, OpenUNIX and OpenServer 6.
+	case `/bin/uname -X | grep "^Machine"` in
+	    *486*)	     UNAME_MACHINE=i486 ;;
+	    *Pentium)	     UNAME_MACHINE=i586 ;;
+	    *Pent*|*Celeron) UNAME_MACHINE=i686 ;;
+	esac
+	echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION}
+	exit ;;
+    i*86:*:3.2:*)
+	if test -f /usr/options/cb.name; then
+		UNAME_REL=`sed -n 's/.*Version //p' </usr/options/cb.name`
+		echo ${UNAME_MACHINE}-pc-isc$UNAME_REL
+	elif /bin/uname -X 2>/dev/null >/dev/null ; then
+		UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')`
+		(/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486
+		(/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \
+			&& UNAME_MACHINE=i586
+		(/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \
+			&& UNAME_MACHINE=i686
+		(/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \
+			&& UNAME_MACHINE=i686
+		echo ${UNAME_MACHINE}-pc-sco$UNAME_REL
+	else
+		echo ${UNAME_MACHINE}-pc-sysv32
+	fi
+	exit ;;
+    pc:*:*:*)
+	# Left here for compatibility:
+	# uname -m prints for DJGPP always 'pc', but it prints nothing about
+	# the processor, so we play safe by assuming i586.
+	# Note: whatever this is, it MUST be the same as what config.sub
+	# prints for the "djgpp" host, or else GDB configury will decide that
+	# this is a cross-build.
+	echo i586-pc-msdosdjgpp
+	exit ;;
+    Intel:Mach:3*:*)
+	echo i386-pc-mach3
+	exit ;;
+    paragon:*:*:*)
+	echo i860-intel-osf1
+	exit ;;
+    i860:*:4.*:*) # i860-SVR4
+	if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then
+	  echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4
+	else # Add other i860-SVR4 vendors below as they are discovered.
+	  echo i860-unknown-sysv${UNAME_RELEASE}  # Unknown i860-SVR4
+	fi
+	exit ;;
+    mini*:CTIX:SYS*5:*)
+	# "miniframe"
+	echo m68010-convergent-sysv
+	exit ;;
+    mc68k:UNIX:SYSTEM5:3.51m)
+	echo m68k-convergent-sysv
+	exit ;;
+    M680?0:D-NIX:5.3:*)
+	echo m68k-diab-dnix
+	exit ;;
+    M68*:*:R3V[5678]*:*)
+	test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;;
+    3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0)
+	OS_REL=''
+	test -r /etc/.relid \
+	&& OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid`
+	/bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+	  && { echo i486-ncr-sysv4.3${OS_REL}; exit; }
+	/bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
+	  && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;;
+    3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*)
+	/bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+	  && { echo i486-ncr-sysv4; exit; } ;;
+    NCR*:*:4.2:* | MPRAS*:*:4.2:*)
+	OS_REL='.3'
+	test -r /etc/.relid \
+	    && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid`
+	/bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+	    && { echo i486-ncr-sysv4.3${OS_REL}; exit; }
+	/bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
+	    && { echo i586-ncr-sysv4.3${OS_REL}; exit; }
+	/bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \
+	    && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;;
+    m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*)
+	echo m68k-unknown-lynxos${UNAME_RELEASE}
+	exit ;;
+    mc68030:UNIX_System_V:4.*:*)
+	echo m68k-atari-sysv4
+	exit ;;
+    TSUNAMI:LynxOS:2.*:*)
+	echo sparc-unknown-lynxos${UNAME_RELEASE}
+	exit ;;
+    rs6000:LynxOS:2.*:*)
+	echo rs6000-unknown-lynxos${UNAME_RELEASE}
+	exit ;;
+    PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*)
+	echo powerpc-unknown-lynxos${UNAME_RELEASE}
+	exit ;;
+    SM[BE]S:UNIX_SV:*:*)
+	echo mips-dde-sysv${UNAME_RELEASE}
+	exit ;;
+    RM*:ReliantUNIX-*:*:*)
+	echo mips-sni-sysv4
+	exit ;;
+    RM*:SINIX-*:*:*)
+	echo mips-sni-sysv4
+	exit ;;
+    *:SINIX-*:*:*)
+	if uname -p 2>/dev/null >/dev/null ; then
+		UNAME_MACHINE=`(uname -p) 2>/dev/null`
+		echo ${UNAME_MACHINE}-sni-sysv4
+	else
+		echo ns32k-sni-sysv
+	fi
+	exit ;;
+    PENTIUM:*:4.0*:*)	# Unisys `ClearPath HMP IX 4000' SVR4/MP effort
+			# says <Richard.M.Bartel at ccMail.Census.GOV>
+	echo i586-unisys-sysv4
+	exit ;;
+    *:UNIX_System_V:4*:FTX*)
+	# From Gerald Hewes <hewes at openmarket.com>.
+	# How about differentiating between stratus architectures? -djm
+	echo hppa1.1-stratus-sysv4
+	exit ;;
+    *:*:*:FTX*)
+	# From seanf at swdc.stratus.com.
+	echo i860-stratus-sysv4
+	exit ;;
+    i*86:VOS:*:*)
+	# From Paul.Green at stratus.com.
+	echo ${UNAME_MACHINE}-stratus-vos
+	exit ;;
+    *:VOS:*:*)
+	# From Paul.Green at stratus.com.
+	echo hppa1.1-stratus-vos
+	exit ;;
+    mc68*:A/UX:*:*)
+	echo m68k-apple-aux${UNAME_RELEASE}
+	exit ;;
+    news*:NEWS-OS:6*:*)
+	echo mips-sony-newsos6
+	exit ;;
+    R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*)
+	if [ -d /usr/nec ]; then
+		echo mips-nec-sysv${UNAME_RELEASE}
+	else
+		echo mips-unknown-sysv${UNAME_RELEASE}
+	fi
+	exit ;;
+    BeBox:BeOS:*:*)	# BeOS running on hardware made by Be, PPC only.
+	echo powerpc-be-beos
+	exit ;;
+    BeMac:BeOS:*:*)	# BeOS running on Mac or Mac clone, PPC only.
+	echo powerpc-apple-beos
+	exit ;;
+    BePC:BeOS:*:*)	# BeOS running on Intel PC compatible.
+	echo i586-pc-beos
+	exit ;;
+    BePC:Haiku:*:*)	# Haiku running on Intel PC compatible.
+	echo i586-pc-haiku
+	exit ;;
+    x86_64:Haiku:*:*)
+	echo x86_64-unknown-haiku
+	exit ;;
+    SX-4:SUPER-UX:*:*)
+	echo sx4-nec-superux${UNAME_RELEASE}
+	exit ;;
+    SX-5:SUPER-UX:*:*)
+	echo sx5-nec-superux${UNAME_RELEASE}
+	exit ;;
+    SX-6:SUPER-UX:*:*)
+	echo sx6-nec-superux${UNAME_RELEASE}
+	exit ;;
+    SX-7:SUPER-UX:*:*)
+	echo sx7-nec-superux${UNAME_RELEASE}
+	exit ;;
+    SX-8:SUPER-UX:*:*)
+	echo sx8-nec-superux${UNAME_RELEASE}
+	exit ;;
+    SX-8R:SUPER-UX:*:*)
+	echo sx8r-nec-superux${UNAME_RELEASE}
+	exit ;;
+    Power*:Rhapsody:*:*)
+	echo powerpc-apple-rhapsody${UNAME_RELEASE}
+	exit ;;
+    *:Rhapsody:*:*)
+	echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE}
+	exit ;;
+    *:Darwin:*:*)
+	UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown
+	eval $set_cc_for_build
+	if test "$UNAME_PROCESSOR" = unknown ; then
+	    UNAME_PROCESSOR=powerpc
+	fi
+	if test `echo "$UNAME_RELEASE" | sed -e 's/\..*//'` -le 10 ; then
+	    if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then
+		if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \
+		    (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \
+		    grep IS_64BIT_ARCH >/dev/null
+		then
+		    case $UNAME_PROCESSOR in
+			i386) UNAME_PROCESSOR=x86_64 ;;
+			powerpc) UNAME_PROCESSOR=powerpc64 ;;
+		    esac
+		fi
+	    fi
+	elif test "$UNAME_PROCESSOR" = i386 ; then
+	    # Avoid executing cc on OS X 10.9, as it ships with a stub
+	    # that puts up a graphical alert prompting to install
+	    # developer tools.  Any system running Mac OS X 10.7 or
+	    # later (Darwin 11 and later) is required to have a 64-bit
+	    # processor. This is not true of the ARM version of Darwin
+	    # that Apple uses in portable devices.
+	    UNAME_PROCESSOR=x86_64
+	fi
+	echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE}
+	exit ;;
+    *:procnto*:*:* | *:QNX:[0123456789]*:*)
+	UNAME_PROCESSOR=`uname -p`
+	if test "$UNAME_PROCESSOR" = "x86"; then
+		UNAME_PROCESSOR=i386
+		UNAME_MACHINE=pc
+	fi
+	echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE}
+	exit ;;
+    *:QNX:*:4*)
+	echo i386-pc-qnx
+	exit ;;
+    NEO-?:NONSTOP_KERNEL:*:*)
+	echo neo-tandem-nsk${UNAME_RELEASE}
+	exit ;;
+    NSE-*:NONSTOP_KERNEL:*:*)
+	echo nse-tandem-nsk${UNAME_RELEASE}
+	exit ;;
+    NSR-?:NONSTOP_KERNEL:*:*)
+	echo nsr-tandem-nsk${UNAME_RELEASE}
+	exit ;;
+    *:NonStop-UX:*:*)
+	echo mips-compaq-nonstopux
+	exit ;;
+    BS2000:POSIX*:*:*)
+	echo bs2000-siemens-sysv
+	exit ;;
+    DS/*:UNIX_System_V:*:*)
+	echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE}
+	exit ;;
+    *:Plan9:*:*)
+	# "uname -m" is not consistent, so use $cputype instead. 386
+	# is converted to i386 for consistency with other x86
+	# operating systems.
+	if test "$cputype" = "386"; then
+	    UNAME_MACHINE=i386
+	else
+	    UNAME_MACHINE="$cputype"
+	fi
+	echo ${UNAME_MACHINE}-unknown-plan9
+	exit ;;
+    *:TOPS-10:*:*)
+	echo pdp10-unknown-tops10
+	exit ;;
+    *:TENEX:*:*)
+	echo pdp10-unknown-tenex
+	exit ;;
+    KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*)
+	echo pdp10-dec-tops20
+	exit ;;
+    XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*)
+	echo pdp10-xkl-tops20
+	exit ;;
+    *:TOPS-20:*:*)
+	echo pdp10-unknown-tops20
+	exit ;;
+    *:ITS:*:*)
+	echo pdp10-unknown-its
+	exit ;;
+    SEI:*:*:SEIUX)
+	echo mips-sei-seiux${UNAME_RELEASE}
+	exit ;;
+    *:DragonFly:*:*)
+	echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`
+	exit ;;
+    *:*VMS:*:*)
+	UNAME_MACHINE=`(uname -p) 2>/dev/null`
+	case "${UNAME_MACHINE}" in
+	    A*) echo alpha-dec-vms ; exit ;;
+	    I*) echo ia64-dec-vms ; exit ;;
+	    V*) echo vax-dec-vms ; exit ;;
+	esac ;;
+    *:XENIX:*:SysV)
+	echo i386-pc-xenix
+	exit ;;
+    i*86:skyos:*:*)
+	echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//'
+	exit ;;
+    i*86:rdos:*:*)
+	echo ${UNAME_MACHINE}-pc-rdos
+	exit ;;
+    i*86:AROS:*:*)
+	echo ${UNAME_MACHINE}-pc-aros
+	exit ;;
+    x86_64:VMkernel:*:*)
+	echo ${UNAME_MACHINE}-unknown-esx
+	exit ;;
+esac
+
+eval $set_cc_for_build
+cat >$dummy.c <<EOF
+#ifdef _SEQUENT_
+# include <sys/types.h>
+# include <sys/utsname.h>
+#endif
+main ()
+{
+#if defined (sony)
+#if defined (MIPSEB)
+  /* BFD wants "bsd" instead of "newsos".  Perhaps BFD should be changed,
+     I don't know....  */
+  printf ("mips-sony-bsd\n"); exit (0);
+#else
+#include <sys/param.h>
+  printf ("m68k-sony-newsos%s\n",
+#ifdef NEWSOS4
+	"4"
+#else
+	""
+#endif
+	); exit (0);
+#endif
+#endif
+
+#if defined (__arm) && defined (__acorn) && defined (__unix)
+  printf ("arm-acorn-riscix\n"); exit (0);
+#endif
+
+#if defined (hp300) && !defined (hpux)
+  printf ("m68k-hp-bsd\n"); exit (0);
+#endif
+
+#if defined (NeXT)
+#if !defined (__ARCHITECTURE__)
+#define __ARCHITECTURE__ "m68k"
+#endif
+  int version;
+  version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`;
+  if (version < 4)
+    printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version);
+  else
+    printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version);
+  exit (0);
+#endif
+
+#if defined (MULTIMAX) || defined (n16)
+#if defined (UMAXV)
+  printf ("ns32k-encore-sysv\n"); exit (0);
+#else
+#if defined (CMU)
+  printf ("ns32k-encore-mach\n"); exit (0);
+#else
+  printf ("ns32k-encore-bsd\n"); exit (0);
+#endif
+#endif
+#endif
+
+#if defined (__386BSD__)
+  printf ("i386-pc-bsd\n"); exit (0);
+#endif
+
+#if defined (sequent)
+#if defined (i386)
+  printf ("i386-sequent-dynix\n"); exit (0);
+#endif
+#if defined (ns32000)
+  printf ("ns32k-sequent-dynix\n"); exit (0);
+#endif
+#endif
+
+#if defined (_SEQUENT_)
+    struct utsname un;
+
+    uname(&un);
+
+    if (strncmp(un.version, "V2", 2) == 0) {
+	printf ("i386-sequent-ptx2\n"); exit (0);
+    }
+    if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */
+	printf ("i386-sequent-ptx1\n"); exit (0);
+    }
+    printf ("i386-sequent-ptx\n"); exit (0);
+
+#endif
+
+#if defined (vax)
+# if !defined (ultrix)
+#  include <sys/param.h>
+#  if defined (BSD)
+#   if BSD == 43
+      printf ("vax-dec-bsd4.3\n"); exit (0);
+#   else
+#    if BSD == 199006
+      printf ("vax-dec-bsd4.3reno\n"); exit (0);
+#    else
+      printf ("vax-dec-bsd\n"); exit (0);
+#    endif
+#   endif
+#  else
+    printf ("vax-dec-bsd\n"); exit (0);
+#  endif
+# else
+    printf ("vax-dec-ultrix\n"); exit (0);
+# endif
+#endif
+
+#if defined (alliant) && defined (i860)
+  printf ("i860-alliant-bsd\n"); exit (0);
+#endif
+
+  exit (1);
+}
+EOF
+
+$CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` &&
+	{ echo "$SYSTEM_NAME"; exit; }
+
+# Apollos put the system type in the environment.
+
+test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; }
+
+# Convex versions that predate uname can use getsysinfo(1)
+
+if [ -x /usr/convex/getsysinfo ]
+then
+    case `getsysinfo -f cpu_type` in
+    c1*)
+	echo c1-convex-bsd
+	exit ;;
+    c2*)
+	if getsysinfo -f scalar_acc
+	then echo c32-convex-bsd
+	else echo c2-convex-bsd
+	fi
+	exit ;;
+    c34*)
+	echo c34-convex-bsd
+	exit ;;
+    c38*)
+	echo c38-convex-bsd
+	exit ;;
+    c4*)
+	echo c4-convex-bsd
+	exit ;;
+    esac
+fi
+
+cat >&2 <<EOF
+$0: unable to guess system type
+
+This script, last modified $timestamp, has failed to recognize
+the operating system you are using. It is advised that you
+download the most up to date version of the config scripts from
+
+  http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD
+and
+  http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD
+
+If the version you run ($0) is already up to date, please
+send the following data and any information you think might be
+pertinent to <config-patches at gnu.org> in order to provide the needed
+information to handle your system.
+
+config.guess timestamp = $timestamp
+
+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`
+/bin/uname -X     = `(/bin/uname -X) 2>/dev/null`
+
+hostinfo               = `(hostinfo) 2>/dev/null`
+/bin/universe          = `(/bin/universe) 2>/dev/null`
+/usr/bin/arch -k       = `(/usr/bin/arch -k) 2>/dev/null`
+/bin/arch              = `(/bin/arch) 2>/dev/null`
+/usr/bin/oslevel       = `(/usr/bin/oslevel) 2>/dev/null`
+/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null`
+
+UNAME_MACHINE = ${UNAME_MACHINE}
+UNAME_RELEASE = ${UNAME_RELEASE}
+UNAME_SYSTEM  = ${UNAME_SYSTEM}
+UNAME_VERSION = ${UNAME_VERSION}
+EOF
+
+exit 1
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "timestamp='"
+# time-stamp-format: "%:y-%02m-%02d"
+# time-stamp-end: "'"
+# End:
diff --git a/config.h.cmake.in b/config.h.cmake.in
new file mode 100644
index 0000000..855b8cf
--- /dev/null
+++ b/config.h.cmake.in
@@ -0,0 +1,265 @@
+/* Define to one of `_getb67', `GETB67', `getb67' for Cray-2 and Cray-YMP
+   systems. This function is required for `alloca.c' support on those systems.
+   */
+#cmakedefine CRAY_STACKSEG_END
+
+/* Define to 1 if using `alloca.c'. */
+#cmakedefine C_ALLOCA
+
+/* set this only when building a DLL under MinGW */
+#cmakedefine DLL_NETCDF
+
+/* if true, run extra tests which may not work yet */
+#cmakedefine EXTRA_TESTS
+
+/* Define to 1 if you have `alloca', as a function or macro. */
+#cmakedefine HAVE_ALLOCA
+
+/* Define to 1 if you have <alloca.h> and it should be used (not on Ultrix).
+   */
+#cmakedefine HAVE_ALLOCA_H
+
+/* Define to 1 if you have the <ctype.h> header file. */
+#cmakedefine HAVE_CTYPE_H
+
+/* Define to 1 if you have the <dirent.h> header file, and it defines `DIR'.
+   */
+#cmakedefine HAVE_DIRENT_H
+
+/* Define to 1 if you have the <dlfcn.h> header file. */
+#cmakedefine HAVE_DLFCN_H
+
+/* Define to 1 if you don't have `vprintf' but do have `_doprnt.' */
+#cmakedefine HAVE_DOPRNT
+
+/* Define to 1 if you have the <errno.h> header file. */
+#cmakedefine HAVE_ERRNO_H
+
+/* if true, use Fortran 2008 ISO_FORTRAN_ENV additions */
+#cmakedefine HAVE_F2008
+
+/* Define to 1 if you have the <fcntl.h> header file. */
+#cmakedefine HAVE_FCNTL_H
+
+/* Define to 1 if you have the <getopt.h> header file. */
+#cmakedefine HAVE_GETOPT_H
+
+/* Define to 1 if you have the <inttypes.h> header file. */
+#cmakedefine HAVE_INTTYPES_H
+
+/* Define to 1 if you have the <locale.h> header file. */
+#cmakedefine HAVE_LOCALE_H
+
+/* Define to 1 if the system has the type `longlong'. */
+#cmakedefine HAVE_LONGLONG
+
+/* Define to 1 if you have the <malloc.h> header file. */
+#cmakedefine HAVE_MALLOC_H
+
+/* Define to 1 if you have the <memory.h> header file. */
+#cmakedefine HAVE_MEMORY_H
+
+/* Define to 1 if you have the `nccreate' function. */
+#cmakedefine HAVE_NCCREATE
+
+/* Define to 1 if you have the `nc_def_opaque' function. */
+#cmakedefine HAVE_NC_DEF_OPAQUE
+
+/* Define to 1 if you have the `nc_set_log_level' function. */
+#cmakedefine HAVE_NC_SET_LOG_LEVEL
+
+/* Define to 1 if you have the `nc_use_parallel_enabled' function. */
+#cmakedefine HAVE_NC_USE_PARALLEL_ENABLED
+
+/* Define to 1 if you have the <ndir.h> header file, and it defines `DIR'. */
+#cmakedefine HAVE_NDIR_H
+
+/* Define to 1 if you have the <netcdf.h> header file. */
+#cmakedefine HAVE_NETCDF_H
+
+/* Define to 1 if you have the `oc_open' function. */
+#cmakedefine HAVE_OC_OPEN
+
+/* Define to 1 if the system has the type `ptrdiff_t'. */
+#cmakedefine HAVE_PTRDIFF_T
+
+/* Define to 1 if the system has the type `ssize_t'. */
+#cmakedefine HAVE_SSIZE_T
+
+/* Define to 1 if you have the <stdarg.h> header file. */
+#cmakedefine HAVE_STDARG_H
+
+/* Define to 1 if stdbool.h conforms to C99. */
+#cmakedefine HAVE_STDBOOL_H
+
+/* Define to 1 if you have the <stdint.h> header file. */
+#cmakedefine HAVE_STDINT_H
+
+/* Define to 1 if you have the <stdio.h> header file. */
+#cmakedefine HAVE_STDIO_H
+
+/* Define to 1 if you have the <stdlib.h> header file. */
+#cmakedefine HAVE_STDLIB_H
+
+/* Define to 1 if you have the <strings.h> header file. */
+#cmakedefine HAVE_STRINGS_H
+
+/* Define to 1 if you have the <string.h> header file. */
+#cmakedefine HAVE_STRING_H
+
+/* Define to 1 if you have the <sys/dir.h> header file, and it defines `DIR'.
+   */
+#cmakedefine HAVE_SYS_DIR_H
+
+/* Define to 1 if you have the <sys/ndir.h> header file, and it defines `DIR'.
+   */
+#cmakedefine HAVE_SYS_NDIR_H
+
+/* Define to 1 if you have the <sys/param.h> header file. */
+#cmakedefine HAVE_SYS_PARAM_H
+
+/* Define to 1 if you have the <sys/resource.h> header file. */
+#cmakedefine HAVE_SYS_RESOURCE_H
+
+/* Define to 1 if you have the <sys/stat.h> header file. */
+#cmakedefine HAVE_SYS_STAT_H
+
+/* Define to 1 if you have the <sys/time.h> header file. */
+#cmakedefine HAVE_SYS_TIME_H
+
+/* Define to 1 if you have the <sys/types.h> header file. */
+#cmakedefine HAVE_SYS_TYPES_H
+
+/* Define to 1 if you have <sys/wait.h> that is POSIX.1 compatible. */
+#cmakedefine HAVE_SYS_WAIT_H
+
+/* if true, Fortran compiler supports TS29113 extension */
+#cmakedefine HAVE_TS29113_SUPPORT
+
+/* Define to 1 if the system has the type `uchar'. */
+#cmakedefine HAVE_UCHAR
+
+/* Define to 1 if you have the <unistd.h> header file. */
+#cmakedefine HAVE_UNISTD_H
+
+/* Define to 1 if you have the `vprintf' function. */
+#cmakedefine HAVE_VPRINTF
+
+/* Define to 1 if the system has the type `_Bool'. */
+#cmakedefine HAVE__BOOL
+
+/* do large file tests */
+#cmakedefine LARGE_FILE_TESTS
+
+/* Define to the sub-directory in which libtool stores uninstalled libraries.
+   */
+#cmakedefine LT_OBJDIR
+
+/* Define to 1 if your C compiler doesn't accept -c and -o together. */
+#cmakedefine NO_MINUS_C_MINUS_O
+
+/* no stdlib.h */
+#cmakedefine NO_STDLIB_H
+
+/* no sys_types.h */
+#cmakedefine NO_SYS_TYPES_H
+
+/* Name of package */
+#cmakedefine PACKAGE
+
+/* Define to the address where bug reports for this package should be sent. */
+#cmakedefine PACKAGE_BUGREPORT
+
+/* Define to the full name of this package. */
+#cmakedefine PACKAGE_NAME
+
+/* Define to the full name and version of this package. */
+#cmakedefine PACKAGE_STRING
+
+/* Define to the one symbol short name of this package. */
+#cmakedefine PACKAGE_TARNAME
+
+/* Define to the home page for this package. */
+#cmakedefine PACKAGE_URL
+
+/* Define to the version of this package. */
+#cmakedefine PACKAGE_VERSION
+
+/* The size of `double', as computed by sizeof. */
+#cmakedefine SIZEOF_DOUBLE
+
+/* The size of `float', as computed by sizeof. */
+#cmakedefine SIZEOF_FLOAT
+
+/* The size of `int', as computed by sizeof. */
+#cmakedefine SIZEOF_INT
+
+/* The size of `long', as computed by sizeof. */
+#cmakedefine SIZEOF_LONG
+
+/* The size of `off_t', as computed by sizeof. */
+#cmakedefine SIZEOF_OFF_T
+
+/* The size of `short', as computed by sizeof. */
+#cmakedefine SIZEOF_SHORT
+
+/* The size of `size_t', as computed by sizeof. */
+#cmakedefine SIZEOF_SIZE_T
+
+/* If using the C implementation of alloca, define if you know the
+   direction of stack growth for your system; otherwise it will be
+   automatically deduced at runtime.
+	STACK_DIRECTION > 0 => grows toward higher addresses
+	STACK_DIRECTION < 0 => grows toward lower addresses
+	STACK_DIRECTION = 0 => direction of growth unknown */
+#cmakedefine STACK_DIRECTION
+
+/* Define to 1 if you have the ANSI C header files. */
+#cmakedefine STDC_HEADERS
+
+/* Place to put very large netCDF test files. */
+#cmakedefine TEMP_LARGE
+
+/* Define to 1 if you can safely include both <sys/time.h> and <time.h>. */
+#cmakedefine TIME_WITH_SYS_TIME
+
+/* Version number of package */
+#cmakedefine VERSION
+
+/* Enable large inode numbers on Mac OS X 10.5.  */
+#ifndef _DARWIN_USE_64_BIT_INODE
+#cmakedefine _DARWIN_USE_64_BIT_INODE 1
+#endif
+
+/* Number of bits in a file offset, on hosts where this is settable. */
+#cmakedefine _FILE_OFFSET_BITS
+
+/* Define for large files, on AIX-style hosts. */
+#cmakedefine _LARGE_FILES
+
+/* Define to 1 if type `char' is unsigned and you are not using gcc.  */
+#ifndef __CHAR_UNSIGNED__
+#cmakedefine __CHAR_UNSIGNED__
+#endif
+
+/* Define to empty if `const' does not conform to ANSI C. */
+#cmakedefine const
+
+/* Turned on by netCDF configure. */
+#cmakedefine f2cFortran
+
+/* Turned on by netCDF configure. */
+#cmakedefine gFortran
+
+/* Define to `long int' if <sys/types.h> does not define. */
+#cmakedefine off_t
+
+/* Turned on by netCDF configure. */
+#cmakedefine pgiFortran
+
+/* Define to `unsigned int' if <sys/types.h> does not define. */
+#cmakedefine size_t
+
+/* Other various options */
+#cmakedefine ENABLE_DOXYGEN
+#cmakedefine ENABLE_INTERNAL_DOCS
diff --git a/config.h.in b/config.h.in
new file mode 100644
index 0000000..2b5b8c8
--- /dev/null
+++ b/config.h.in
@@ -0,0 +1,293 @@
+/* config.h.in.  Generated from configure.ac by autoheader.  */
+
+/* Define to one of `_getb67', `GETB67', `getb67' for Cray-2 and Cray-YMP
+   systems. This function is required for `alloca.c' support on those systems.
+   */
+#undef CRAY_STACKSEG_END
+
+/* Define to 1 if using `alloca.c'. */
+#undef C_ALLOCA
+
+/* set this only when building a DLL under MinGW */
+#undef DLL_NETCDF
+
+/* if true, run extra tests which may not work yet */
+#undef EXTRA_TESTS
+
+/* Define to 1 if you have `alloca', as a function or macro. */
+#undef HAVE_ALLOCA
+
+/* Define to 1 if you have <alloca.h> and it should be used (not on Ultrix).
+   */
+#undef HAVE_ALLOCA_H
+
+/* Define to 1 if you have the <ctype.h> header file. */
+#undef HAVE_CTYPE_H
+
+/* Define to 1 if you have the <dirent.h> header file, and it defines `DIR'.
+   */
+#undef HAVE_DIRENT_H
+
+/* Define to 1 if you have the <dlfcn.h> header file. */
+#undef HAVE_DLFCN_H
+
+/* Define to 1 if you don't have `vprintf' but do have `_doprnt.' */
+#undef HAVE_DOPRNT
+
+/* Define to 1 if you have the <errno.h> header file. */
+#undef HAVE_ERRNO_H
+
+/* if true, use Fortran 2008 ISO_FORTRAN_ENV additions */
+#undef HAVE_F2008
+
+/* Define to 1 if you have the <fcntl.h> header file. */
+#undef HAVE_FCNTL_H
+
+/* Define to 1 if you have the <getopt.h> header file. */
+#undef HAVE_GETOPT_H
+
+/* Define to 1 if you have the <inttypes.h> header file. */
+#undef HAVE_INTTYPES_H
+
+/* Define to 1 if you have the <locale.h> header file. */
+#undef HAVE_LOCALE_H
+
+/* Define to 1 if the system has the type `longlong'. */
+#undef HAVE_LONGLONG
+
+/* Define to 1 if you have the <malloc.h> header file. */
+#undef HAVE_MALLOC_H
+
+/* Define to 1 if you have the <memory.h> header file. */
+#undef HAVE_MEMORY_H
+
+/* Define to 1 if you have the `nccreate' function. */
+#undef HAVE_NCCREATE
+
+/* Define to 1 if you have the `nc_def_opaque' function. */
+#undef HAVE_NC_DEF_OPAQUE
+
+/* Define to 1 if you have the `nc_set_log_level' function. */
+#undef HAVE_NC_SET_LOG_LEVEL
+
+/* Define to 1 if you have the `nc_use_parallel_enabled' function. */
+#undef HAVE_NC_USE_PARALLEL_ENABLED
+
+/* Define to 1 if you have the <ndir.h> header file, and it defines `DIR'. */
+#undef HAVE_NDIR_H
+
+/* Define to 1 if you have the <netcdf.h> header file. */
+#undef HAVE_NETCDF_H
+
+/* Define to 1 if you have the `oc_open' function. */
+#undef HAVE_OC_OPEN
+
+/* Define to 1 if the system has the type `ptrdiff_t'. */
+#undef HAVE_PTRDIFF_T
+
+/* Define to 1 if the system has the type `ssize_t'. */
+#undef HAVE_SSIZE_T
+
+/* Define to 1 if you have the <stdarg.h> header file. */
+#undef HAVE_STDARG_H
+
+/* Define to 1 if stdbool.h conforms to C99. */
+#undef HAVE_STDBOOL_H
+
+/* Define to 1 if you have the <stdint.h> header file. */
+#undef HAVE_STDINT_H
+
+/* Define to 1 if you have the <stdio.h> header file. */
+#undef HAVE_STDIO_H
+
+/* Define to 1 if you have the <stdlib.h> header file. */
+#undef HAVE_STDLIB_H
+
+/* Define to 1 if you have the <strings.h> header file. */
+#undef HAVE_STRINGS_H
+
+/* Define to 1 if you have the <string.h> header file. */
+#undef HAVE_STRING_H
+
+/* Define to 1 if you have the <sys/dir.h> header file, and it defines `DIR'.
+   */
+#undef HAVE_SYS_DIR_H
+
+/* Define to 1 if you have the <sys/ndir.h> header file, and it defines `DIR'.
+   */
+#undef HAVE_SYS_NDIR_H
+
+/* Define to 1 if you have the <sys/param.h> header file. */
+#undef HAVE_SYS_PARAM_H
+
+/* Define to 1 if you have the <sys/resource.h> header file. */
+#undef HAVE_SYS_RESOURCE_H
+
+/* Define to 1 if you have the <sys/stat.h> header file. */
+#undef HAVE_SYS_STAT_H
+
+/* Define to 1 if you have the <sys/time.h> header file. */
+#undef HAVE_SYS_TIME_H
+
+/* Define to 1 if you have the <sys/types.h> header file. */
+#undef HAVE_SYS_TYPES_H
+
+/* Define to 1 if you have <sys/wait.h> that is POSIX.1 compatible. */
+#undef HAVE_SYS_WAIT_H
+
+/* if true, Fortran compiler supports TS29113 extension */
+#undef HAVE_TS29113_SUPPORT
+
+/* Define to 1 if the system has the type `uchar'. */
+#undef HAVE_UCHAR
+
+/* Define to 1 if you have the <unistd.h> header file. */
+#undef HAVE_UNISTD_H
+
+/* Define to 1 if you have the `vprintf' function. */
+#undef HAVE_VPRINTF
+
+/* Define to 1 if the system has the type `_Bool'. */
+#undef HAVE__BOOL
+
+/* do large file tests */
+#undef LARGE_FILE_TESTS
+
+/* Define to the sub-directory in which libtool stores uninstalled libraries.
+   */
+#undef LT_OBJDIR
+
+/* type definition */
+#undef NCBYTE_T
+
+/* type definition */
+#undef NCSHORT_T
+
+/* default */
+#undef NF_DOUBLEPRECISION_IS_C_DOUBLE
+
+/* default */
+#undef NF_INT1_IS_C_SIGNED_CHAR
+
+/* type thing */
+#undef NF_INT1_T
+
+/* default */
+#undef NF_INT2_IS_C_SHORT
+
+/* type thing */
+#undef NF_INT2_T
+
+/* default */
+#undef NF_INT_IS_C_INT
+
+/* default */
+#undef NF_REAL_IS_C_FLOAT
+
+/* no stdlib.h */
+#undef NO_STDLIB_H
+
+/* no sys_types.h */
+#undef NO_SYS_TYPES_H
+
+/* Name of package */
+#undef PACKAGE
+
+/* Define to the address where bug reports for this package should be sent. */
+#undef PACKAGE_BUGREPORT
+
+/* Define to the full name of this package. */
+#undef PACKAGE_NAME
+
+/* Define to the full name and version of this package. */
+#undef PACKAGE_STRING
+
+/* Define to the one symbol short name of this package. */
+#undef PACKAGE_TARNAME
+
+/* Define to the home page for this package. */
+#undef PACKAGE_URL
+
+/* Define to the version of this package. */
+#undef PACKAGE_VERSION
+
+/* The size of `double', as computed by sizeof. */
+#undef SIZEOF_DOUBLE
+
+/* The size of `float', as computed by sizeof. */
+#undef SIZEOF_FLOAT
+
+/* The size of `int', as computed by sizeof. */
+#undef SIZEOF_INT
+
+/* The size of `long', as computed by sizeof. */
+#undef SIZEOF_LONG
+
+/* The size of `off_t', as computed by sizeof. */
+#undef SIZEOF_OFF_T
+
+/* The size of `ptrdiff_t', as computed by sizeof. */
+#undef SIZEOF_PTRDIFF_T
+
+/* The size of `short', as computed by sizeof. */
+#undef SIZEOF_SHORT
+
+/* The size of `size_t', as computed by sizeof. */
+#undef SIZEOF_SIZE_T
+
+/* If using the C implementation of alloca, define if you know the
+   direction of stack growth for your system; otherwise it will be
+   automatically deduced at runtime.
+	STACK_DIRECTION > 0 => grows toward higher addresses
+	STACK_DIRECTION < 0 => grows toward lower addresses
+	STACK_DIRECTION = 0 => direction of growth unknown */
+#undef STACK_DIRECTION
+
+/* Define to 1 if you have the ANSI C header files. */
+#undef STDC_HEADERS
+
+/* Place to put very large netCDF test files. */
+#undef TEMP_LARGE
+
+/* Define to 1 if you can safely include both <sys/time.h> and <time.h>. */
+#undef TIME_WITH_SYS_TIME
+
+/* if true, build netCDF-4 */
+#undef USE_NETCDF4
+
+/* Version number of package */
+#undef VERSION
+
+/* Enable large inode numbers on Mac OS X 10.5.  */
+#ifndef _DARWIN_USE_64_BIT_INODE
+# define _DARWIN_USE_64_BIT_INODE 1
+#endif
+
+/* Number of bits in a file offset, on hosts where this is settable. */
+#undef _FILE_OFFSET_BITS
+
+/* Define for large files, on AIX-style hosts. */
+#undef _LARGE_FILES
+
+/* Define to 1 if type `char' is unsigned and you are not using gcc.  */
+#ifndef __CHAR_UNSIGNED__
+# undef __CHAR_UNSIGNED__
+#endif
+
+/* Define to empty if `const' does not conform to ANSI C. */
+#undef const
+
+/* Turned on by netCDF configure. */
+#undef f2cFortran
+
+/* Turned on by netCDF configure. */
+#undef gFortran
+
+/* Define to `long int' if <sys/types.h> does not define. */
+#undef off_t
+
+/* Turned on by netCDF configure. */
+#undef pgiFortran
+
+/* Define to `unsigned int' if <sys/types.h> does not define. */
+#undef size_t
diff --git a/config.sub b/config.sub
new file mode 100755
index 0000000..61cb4bc
--- /dev/null
+++ b/config.sub
@@ -0,0 +1,1793 @@
+#! /bin/sh
+# Configuration validation subroutine script.
+#   Copyright 1992-2013 Free Software Foundation, Inc.
+
+timestamp='2013-10-01'
+
+# This file is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, see <http://www.gnu.org/licenses/>.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that
+# program.  This Exception is an additional permission under section 7
+# of the GNU General Public License, version 3 ("GPLv3").
+
+
+# Please send patches with a ChangeLog entry to config-patches at gnu.org.
+#
+# Configuration subroutine to validate and canonicalize a configuration type.
+# Supply the specified configuration type as an argument.
+# If it is invalid, we print an error message on stderr and exit with code 1.
+# Otherwise, we print the canonical config type on stdout and succeed.
+
+# You can get the latest version of this script from:
+# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD
+
+# This file is supposed to be the same for all GNU packages
+# and recognize all the CPU types, system types and aliases
+# that are meaningful with *any* GNU software.
+# Each package is responsible for reporting which valid configurations
+# it does not support.  The user should be able to distinguish
+# a failure to support a valid configuration from a meaningless
+# configuration.
+
+# The goal of this file is to map all the various variations of a given
+# machine specification into a single specification in the form:
+#	CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM
+# or in some cases, the newer four-part form:
+#	CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM
+# It is wrong to echo any other type of specification.
+
+me=`echo "$0" | sed -e 's,.*/,,'`
+
+usage="\
+Usage: $0 [OPTION] CPU-MFR-OPSYS
+       $0 [OPTION] ALIAS
+
+Canonicalize a configuration name.
+
+Operation modes:
+  -h, --help         print this help, then exit
+  -t, --time-stamp   print date of last modification, then exit
+  -v, --version      print version number, then exit
+
+Report bugs and patches to <config-patches at gnu.org>."
+
+version="\
+GNU config.sub ($timestamp)
+
+Copyright 1992-2013 Free Software Foundation, Inc.
+
+This is free software; see the source for copying conditions.  There is NO
+warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
+
+help="
+Try \`$me --help' for more information."
+
+# Parse command line
+while test $# -gt 0 ; do
+  case $1 in
+    --time-stamp | --time* | -t )
+       echo "$timestamp" ; exit ;;
+    --version | -v )
+       echo "$version" ; exit ;;
+    --help | --h* | -h )
+       echo "$usage"; exit ;;
+    -- )     # Stop option processing
+       shift; break ;;
+    - )	# Use stdin as input.
+       break ;;
+    -* )
+       echo "$me: invalid option $1$help"
+       exit 1 ;;
+
+    *local*)
+       # First pass through any local machine types.
+       echo $1
+       exit ;;
+
+    * )
+       break ;;
+  esac
+done
+
+case $# in
+ 0) echo "$me: missing argument$help" >&2
+    exit 1;;
+ 1) ;;
+ *) echo "$me: too many arguments$help" >&2
+    exit 1;;
+esac
+
+# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any).
+# Here we must recognize all the valid KERNEL-OS combinations.
+maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'`
+case $maybe_os in
+  nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \
+  linux-musl* | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \
+  knetbsd*-gnu* | netbsd*-gnu* | \
+  kopensolaris*-gnu* | \
+  storm-chaos* | os2-emx* | rtmk-nova*)
+    os=-$maybe_os
+    basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`
+    ;;
+  android-linux)
+    os=-linux-android
+    basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`-unknown
+    ;;
+  *)
+    basic_machine=`echo $1 | sed 's/-[^-]*$//'`
+    if [ $basic_machine != $1 ]
+    then os=`echo $1 | sed 's/.*-/-/'`
+    else os=; fi
+    ;;
+esac
+
+### Let's recognize common machines as not being operating systems so
+### that things like config.sub decstation-3100 work.  We also
+### recognize some manufacturers as not being operating systems, so we
+### can provide default operating systems below.
+case $os in
+	-sun*os*)
+		# Prevent following clause from handling this invalid input.
+		;;
+	-dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \
+	-att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \
+	-unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \
+	-convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\
+	-c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \
+	-harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \
+	-apple | -axis | -knuth | -cray | -microblaze*)
+		os=
+		basic_machine=$1
+		;;
+	-bluegene*)
+		os=-cnk
+		;;
+	-sim | -cisco | -oki | -wec | -winbond)
+		os=
+		basic_machine=$1
+		;;
+	-scout)
+		;;
+	-wrs)
+		os=-vxworks
+		basic_machine=$1
+		;;
+	-chorusos*)
+		os=-chorusos
+		basic_machine=$1
+		;;
+	-chorusrdb)
+		os=-chorusrdb
+		basic_machine=$1
+		;;
+	-hiux*)
+		os=-hiuxwe2
+		;;
+	-sco6)
+		os=-sco5v6
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-sco5)
+		os=-sco3.2v5
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-sco4)
+		os=-sco3.2v4
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-sco3.2.[4-9]*)
+		os=`echo $os | sed -e 's/sco3.2./sco3.2v/'`
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-sco3.2v[4-9]*)
+		# Don't forget version if it is 3.2v4 or newer.
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-sco5v6*)
+		# Don't forget version if it is 3.2v4 or newer.
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-sco*)
+		os=-sco3.2v2
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-udk*)
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-isc)
+		os=-isc2.2
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-clix*)
+		basic_machine=clipper-intergraph
+		;;
+	-isc*)
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-lynx*178)
+		os=-lynxos178
+		;;
+	-lynx*5)
+		os=-lynxos5
+		;;
+	-lynx*)
+		os=-lynxos
+		;;
+	-ptx*)
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'`
+		;;
+	-windowsnt*)
+		os=`echo $os | sed -e 's/windowsnt/winnt/'`
+		;;
+	-psos*)
+		os=-psos
+		;;
+	-mint | -mint[0-9]*)
+		basic_machine=m68k-atari
+		os=-mint
+		;;
+esac
+
+# Decode aliases for certain CPU-COMPANY combinations.
+case $basic_machine in
+	# Recognize the basic CPU types without company name.
+	# Some are omitted here because they have special meanings below.
+	1750a | 580 \
+	| a29k \
+	| aarch64 | aarch64_be \
+	| alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \
+	| alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \
+	| am33_2.0 \
+	| arc | arceb \
+	| arm | arm[bl]e | arme[lb] | armv[2-8] | armv[3-8][lb] | armv7[arm] \
+	| avr | avr32 \
+	| be32 | be64 \
+	| bfin \
+	| c4x | c8051 | clipper \
+	| d10v | d30v | dlx | dsp16xx \
+	| epiphany \
+	| fido | fr30 | frv \
+	| h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \
+	| hexagon \
+	| i370 | i860 | i960 | ia64 \
+	| ip2k | iq2000 \
+	| k1om \
+	| le32 | le64 \
+	| lm32 \
+	| m32c | m32r | m32rle | m68000 | m68k | m88k \
+	| maxq | mb | microblaze | microblazeel | mcore | mep | metag \
+	| mips | mipsbe | mipseb | mipsel | mipsle \
+	| mips16 \
+	| mips64 | mips64el \
+	| mips64octeon | mips64octeonel \
+	| mips64orion | mips64orionel \
+	| mips64r5900 | mips64r5900el \
+	| mips64vr | mips64vrel \
+	| mips64vr4100 | mips64vr4100el \
+	| mips64vr4300 | mips64vr4300el \
+	| mips64vr5000 | mips64vr5000el \
+	| mips64vr5900 | mips64vr5900el \
+	| mipsisa32 | mipsisa32el \
+	| mipsisa32r2 | mipsisa32r2el \
+	| mipsisa64 | mipsisa64el \
+	| mipsisa64r2 | mipsisa64r2el \
+	| mipsisa64sb1 | mipsisa64sb1el \
+	| mipsisa64sr71k | mipsisa64sr71kel \
+	| mipsr5900 | mipsr5900el \
+	| mipstx39 | mipstx39el \
+	| mn10200 | mn10300 \
+	| moxie \
+	| mt \
+	| msp430 \
+	| nds32 | nds32le | nds32be \
+	| nios | nios2 | nios2eb | nios2el \
+	| ns16k | ns32k \
+	| open8 \
+	| or1k | or32 \
+	| pdp10 | pdp11 | pj | pjl \
+	| powerpc | powerpc64 | powerpc64le | powerpcle \
+	| pyramid \
+	| rl78 | rx \
+	| score \
+	| sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \
+	| sh64 | sh64le \
+	| sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \
+	| sparcv8 | sparcv9 | sparcv9b | sparcv9v \
+	| spu \
+	| tahoe | tic4x | tic54x | tic55x | tic6x | tic80 | tron \
+	| ubicom32 \
+	| v850 | v850e | v850e1 | v850e2 | v850es | v850e2v3 \
+	| we32k \
+	| x86 | xc16x | xstormy16 | xtensa \
+	| z8k | z80)
+		basic_machine=$basic_machine-unknown
+		;;
+	c54x)
+		basic_machine=tic54x-unknown
+		;;
+	c55x)
+		basic_machine=tic55x-unknown
+		;;
+	c6x)
+		basic_machine=tic6x-unknown
+		;;
+	m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | nvptx | picochip)
+		basic_machine=$basic_machine-unknown
+		os=-none
+		;;
+	m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k)
+		;;
+	ms1)
+		basic_machine=mt-unknown
+		;;
+
+	strongarm | thumb | xscale)
+		basic_machine=arm-unknown
+		;;
+	xgate)
+		basic_machine=$basic_machine-unknown
+		os=-none
+		;;
+	xscaleeb)
+		basic_machine=armeb-unknown
+		;;
+
+	xscaleel)
+		basic_machine=armel-unknown
+		;;
+
+	# We use `pc' rather than `unknown'
+	# because (1) that's what they normally are, and
+	# (2) the word "unknown" tends to confuse beginning users.
+	i*86 | x86_64)
+	  basic_machine=$basic_machine-pc
+	  ;;
+	# Object if more than one company name word.
+	*-*-*)
+		echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
+		exit 1
+		;;
+	# Recognize the basic CPU types with company name.
+	580-* \
+	| a29k-* \
+	| aarch64-* | aarch64_be-* \
+	| alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \
+	| alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \
+	| alphapca5[67]-* | alpha64pca5[67]-* | arc-* | arceb-* \
+	| arm-*  | armbe-* | armle-* | armeb-* | armv*-* \
+	| avr-* | avr32-* \
+	| be32-* | be64-* \
+	| bfin-* | bs2000-* \
+	| c[123]* | c30-* | [cjt]90-* | c4x-* \
+	| c8051-* | clipper-* | craynv-* | cydra-* \
+	| d10v-* | d30v-* | dlx-* \
+	| elxsi-* \
+	| f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \
+	| h8300-* | h8500-* \
+	| hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \
+	| hexagon-* \
+	| i*86-* | i860-* | i960-* | ia64-* \
+	| ip2k-* | iq2000-* \
+	| k1om-* \
+	| le32-* | le64-* \
+	| lm32-* \
+	| m32c-* | m32r-* | m32rle-* \
+	| m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \
+	| m88110-* | m88k-* | maxq-* | mcore-* | metag-* \
+	| microblaze-* | microblazeel-* \
+	| mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \
+	| mips16-* \
+	| mips64-* | mips64el-* \
+	| mips64octeon-* | mips64octeonel-* \
+	| mips64orion-* | mips64orionel-* \
+	| mips64r5900-* | mips64r5900el-* \
+	| mips64vr-* | mips64vrel-* \
+	| mips64vr4100-* | mips64vr4100el-* \
+	| mips64vr4300-* | mips64vr4300el-* \
+	| mips64vr5000-* | mips64vr5000el-* \
+	| mips64vr5900-* | mips64vr5900el-* \
+	| mipsisa32-* | mipsisa32el-* \
+	| mipsisa32r2-* | mipsisa32r2el-* \
+	| mipsisa64-* | mipsisa64el-* \
+	| mipsisa64r2-* | mipsisa64r2el-* \
+	| mipsisa64sb1-* | mipsisa64sb1el-* \
+	| mipsisa64sr71k-* | mipsisa64sr71kel-* \
+	| mipsr5900-* | mipsr5900el-* \
+	| mipstx39-* | mipstx39el-* \
+	| mmix-* \
+	| mt-* \
+	| msp430-* \
+	| nds32-* | nds32le-* | nds32be-* \
+	| nios-* | nios2-* | nios2eb-* | nios2el-* \
+	| none-* | np1-* | ns16k-* | ns32k-* \
+	| open8-* \
+	| orion-* \
+	| pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \
+	| powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \
+	| pyramid-* \
+	| rl78-* | romp-* | rs6000-* | rx-* \
+	| sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \
+	| shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \
+	| sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \
+	| sparclite-* \
+	| sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx?-* \
+	| tahoe-* \
+	| tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \
+	| tile*-* \
+	| tron-* \
+	| ubicom32-* \
+	| v850-* | v850e-* | v850e1-* | v850es-* | v850e2-* | v850e2v3-* \
+	| vax-* \
+	| we32k-* \
+	| x86-* | x86_64-* | xc16x-* | xps100-* \
+	| xstormy16-* | xtensa*-* \
+	| ymp-* \
+	| z8k-* | z80-*)
+		;;
+	# Recognize the basic CPU types without company name, with glob match.
+	xtensa*)
+		basic_machine=$basic_machine-unknown
+		;;
+	# Recognize the various machine names and aliases which stand
+	# for a CPU type and a company and sometimes even an OS.
+	386bsd)
+		basic_machine=i386-unknown
+		os=-bsd
+		;;
+	3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc)
+		basic_machine=m68000-att
+		;;
+	3b*)
+		basic_machine=we32k-att
+		;;
+	a29khif)
+		basic_machine=a29k-amd
+		os=-udi
+		;;
+	abacus)
+		basic_machine=abacus-unknown
+		;;
+	adobe68k)
+		basic_machine=m68010-adobe
+		os=-scout
+		;;
+	alliant | fx80)
+		basic_machine=fx80-alliant
+		;;
+	altos | altos3068)
+		basic_machine=m68k-altos
+		;;
+	am29k)
+		basic_machine=a29k-none
+		os=-bsd
+		;;
+	amd64)
+		basic_machine=x86_64-pc
+		;;
+	amd64-*)
+		basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	amdahl)
+		basic_machine=580-amdahl
+		os=-sysv
+		;;
+	amiga | amiga-*)
+		basic_machine=m68k-unknown
+		;;
+	amigaos | amigados)
+		basic_machine=m68k-unknown
+		os=-amigaos
+		;;
+	amigaunix | amix)
+		basic_machine=m68k-unknown
+		os=-sysv4
+		;;
+	apollo68)
+		basic_machine=m68k-apollo
+		os=-sysv
+		;;
+	apollo68bsd)
+		basic_machine=m68k-apollo
+		os=-bsd
+		;;
+	aros)
+		basic_machine=i386-pc
+		os=-aros
+		;;
+	aux)
+		basic_machine=m68k-apple
+		os=-aux
+		;;
+	balance)
+		basic_machine=ns32k-sequent
+		os=-dynix
+		;;
+	blackfin)
+		basic_machine=bfin-unknown
+		os=-linux
+		;;
+	blackfin-*)
+		basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'`
+		os=-linux
+		;;
+	bluegene*)
+		basic_machine=powerpc-ibm
+		os=-cnk
+		;;
+	c54x-*)
+		basic_machine=tic54x-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	c55x-*)
+		basic_machine=tic55x-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	c6x-*)
+		basic_machine=tic6x-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	c90)
+		basic_machine=c90-cray
+		os=-unicos
+		;;
+	cegcc)
+		basic_machine=arm-unknown
+		os=-cegcc
+		;;
+	convex-c1)
+		basic_machine=c1-convex
+		os=-bsd
+		;;
+	convex-c2)
+		basic_machine=c2-convex
+		os=-bsd
+		;;
+	convex-c32)
+		basic_machine=c32-convex
+		os=-bsd
+		;;
+	convex-c34)
+		basic_machine=c34-convex
+		os=-bsd
+		;;
+	convex-c38)
+		basic_machine=c38-convex
+		os=-bsd
+		;;
+	cray | j90)
+		basic_machine=j90-cray
+		os=-unicos
+		;;
+	craynv)
+		basic_machine=craynv-cray
+		os=-unicosmp
+		;;
+	cr16 | cr16-*)
+		basic_machine=cr16-unknown
+		os=-elf
+		;;
+	crds | unos)
+		basic_machine=m68k-crds
+		;;
+	crisv32 | crisv32-* | etraxfs*)
+		basic_machine=crisv32-axis
+		;;
+	cris | cris-* | etrax*)
+		basic_machine=cris-axis
+		;;
+	crx)
+		basic_machine=crx-unknown
+		os=-elf
+		;;
+	da30 | da30-*)
+		basic_machine=m68k-da30
+		;;
+	decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn)
+		basic_machine=mips-dec
+		;;
+	decsystem10* | dec10*)
+		basic_machine=pdp10-dec
+		os=-tops10
+		;;
+	decsystem20* | dec20*)
+		basic_machine=pdp10-dec
+		os=-tops20
+		;;
+	delta | 3300 | motorola-3300 | motorola-delta \
+	      | 3300-motorola | delta-motorola)
+		basic_machine=m68k-motorola
+		;;
+	delta88)
+		basic_machine=m88k-motorola
+		os=-sysv3
+		;;
+	dicos)
+		basic_machine=i686-pc
+		os=-dicos
+		;;
+	djgpp)
+		basic_machine=i586-pc
+		os=-msdosdjgpp
+		;;
+	dpx20 | dpx20-*)
+		basic_machine=rs6000-bull
+		os=-bosx
+		;;
+	dpx2* | dpx2*-bull)
+		basic_machine=m68k-bull
+		os=-sysv3
+		;;
+	ebmon29k)
+		basic_machine=a29k-amd
+		os=-ebmon
+		;;
+	elxsi)
+		basic_machine=elxsi-elxsi
+		os=-bsd
+		;;
+	encore | umax | mmax)
+		basic_machine=ns32k-encore
+		;;
+	es1800 | OSE68k | ose68k | ose | OSE)
+		basic_machine=m68k-ericsson
+		os=-ose
+		;;
+	fx2800)
+		basic_machine=i860-alliant
+		;;
+	genix)
+		basic_machine=ns32k-ns
+		;;
+	gmicro)
+		basic_machine=tron-gmicro
+		os=-sysv
+		;;
+	go32)
+		basic_machine=i386-pc
+		os=-go32
+		;;
+	h3050r* | hiux*)
+		basic_machine=hppa1.1-hitachi
+		os=-hiuxwe2
+		;;
+	h8300hms)
+		basic_machine=h8300-hitachi
+		os=-hms
+		;;
+	h8300xray)
+		basic_machine=h8300-hitachi
+		os=-xray
+		;;
+	h8500hms)
+		basic_machine=h8500-hitachi
+		os=-hms
+		;;
+	harris)
+		basic_machine=m88k-harris
+		os=-sysv3
+		;;
+	hp300-*)
+		basic_machine=m68k-hp
+		;;
+	hp300bsd)
+		basic_machine=m68k-hp
+		os=-bsd
+		;;
+	hp300hpux)
+		basic_machine=m68k-hp
+		os=-hpux
+		;;
+	hp3k9[0-9][0-9] | hp9[0-9][0-9])
+		basic_machine=hppa1.0-hp
+		;;
+	hp9k2[0-9][0-9] | hp9k31[0-9])
+		basic_machine=m68000-hp
+		;;
+	hp9k3[2-9][0-9])
+		basic_machine=m68k-hp
+		;;
+	hp9k6[0-9][0-9] | hp6[0-9][0-9])
+		basic_machine=hppa1.0-hp
+		;;
+	hp9k7[0-79][0-9] | hp7[0-79][0-9])
+		basic_machine=hppa1.1-hp
+		;;
+	hp9k78[0-9] | hp78[0-9])
+		# FIXME: really hppa2.0-hp
+		basic_machine=hppa1.1-hp
+		;;
+	hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893)
+		# FIXME: really hppa2.0-hp
+		basic_machine=hppa1.1-hp
+		;;
+	hp9k8[0-9][13679] | hp8[0-9][13679])
+		basic_machine=hppa1.1-hp
+		;;
+	hp9k8[0-9][0-9] | hp8[0-9][0-9])
+		basic_machine=hppa1.0-hp
+		;;
+	hppa-next)
+		os=-nextstep3
+		;;
+	hppaosf)
+		basic_machine=hppa1.1-hp
+		os=-osf
+		;;
+	hppro)
+		basic_machine=hppa1.1-hp
+		os=-proelf
+		;;
+	i370-ibm* | ibm*)
+		basic_machine=i370-ibm
+		;;
+	i*86v32)
+		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+		os=-sysv32
+		;;
+	i*86v4*)
+		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+		os=-sysv4
+		;;
+	i*86v)
+		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+		os=-sysv
+		;;
+	i*86sol2)
+		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+		os=-solaris2
+		;;
+	i386mach)
+		basic_machine=i386-mach
+		os=-mach
+		;;
+	i386-vsta | vsta)
+		basic_machine=i386-unknown
+		os=-vsta
+		;;
+	iris | iris4d)
+		basic_machine=mips-sgi
+		case $os in
+		    -irix*)
+			;;
+		    *)
+			os=-irix4
+			;;
+		esac
+		;;
+	isi68 | isi)
+		basic_machine=m68k-isi
+		os=-sysv
+		;;
+	m68knommu)
+		basic_machine=m68k-unknown
+		os=-linux
+		;;
+	m68knommu-*)
+		basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'`
+		os=-linux
+		;;
+	m88k-omron*)
+		basic_machine=m88k-omron
+		;;
+	magnum | m3230)
+		basic_machine=mips-mips
+		os=-sysv
+		;;
+	merlin)
+		basic_machine=ns32k-utek
+		os=-sysv
+		;;
+	microblaze*)
+		basic_machine=microblaze-xilinx
+		;;
+	mingw64)
+		basic_machine=x86_64-pc
+		os=-mingw64
+		;;
+	mingw32)
+		basic_machine=i686-pc
+		os=-mingw32
+		;;
+	mingw32ce)
+		basic_machine=arm-unknown
+		os=-mingw32ce
+		;;
+	miniframe)
+		basic_machine=m68000-convergent
+		;;
+	*mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*)
+		basic_machine=m68k-atari
+		os=-mint
+		;;
+	mips3*-*)
+		basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`
+		;;
+	mips3*)
+		basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown
+		;;
+	monitor)
+		basic_machine=m68k-rom68k
+		os=-coff
+		;;
+	morphos)
+		basic_machine=powerpc-unknown
+		os=-morphos
+		;;
+	msdos)
+		basic_machine=i386-pc
+		os=-msdos
+		;;
+	ms1-*)
+		basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'`
+		;;
+	msys)
+		basic_machine=i686-pc
+		os=-msys
+		;;
+	mvs)
+		basic_machine=i370-ibm
+		os=-mvs
+		;;
+	nacl)
+		basic_machine=le32-unknown
+		os=-nacl
+		;;
+	ncr3000)
+		basic_machine=i486-ncr
+		os=-sysv4
+		;;
+	netbsd386)
+		basic_machine=i386-unknown
+		os=-netbsd
+		;;
+	netwinder)
+		basic_machine=armv4l-rebel
+		os=-linux
+		;;
+	news | news700 | news800 | news900)
+		basic_machine=m68k-sony
+		os=-newsos
+		;;
+	news1000)
+		basic_machine=m68030-sony
+		os=-newsos
+		;;
+	news-3600 | risc-news)
+		basic_machine=mips-sony
+		os=-newsos
+		;;
+	necv70)
+		basic_machine=v70-nec
+		os=-sysv
+		;;
+	next | m*-next )
+		basic_machine=m68k-next
+		case $os in
+		    -nextstep* )
+			;;
+		    -ns2*)
+		      os=-nextstep2
+			;;
+		    *)
+		      os=-nextstep3
+			;;
+		esac
+		;;
+	nh3000)
+		basic_machine=m68k-harris
+		os=-cxux
+		;;
+	nh[45]000)
+		basic_machine=m88k-harris
+		os=-cxux
+		;;
+	nindy960)
+		basic_machine=i960-intel
+		os=-nindy
+		;;
+	mon960)
+		basic_machine=i960-intel
+		os=-mon960
+		;;
+	nonstopux)
+		basic_machine=mips-compaq
+		os=-nonstopux
+		;;
+	np1)
+		basic_machine=np1-gould
+		;;
+	neo-tandem)
+		basic_machine=neo-tandem
+		;;
+	nse-tandem)
+		basic_machine=nse-tandem
+		;;
+	nsr-tandem)
+		basic_machine=nsr-tandem
+		;;
+	op50n-* | op60c-*)
+		basic_machine=hppa1.1-oki
+		os=-proelf
+		;;
+	openrisc | openrisc-*)
+		basic_machine=or32-unknown
+		;;
+	os400)
+		basic_machine=powerpc-ibm
+		os=-os400
+		;;
+	OSE68000 | ose68000)
+		basic_machine=m68000-ericsson
+		os=-ose
+		;;
+	os68k)
+		basic_machine=m68k-none
+		os=-os68k
+		;;
+	pa-hitachi)
+		basic_machine=hppa1.1-hitachi
+		os=-hiuxwe2
+		;;
+	paragon)
+		basic_machine=i860-intel
+		os=-osf
+		;;
+	parisc)
+		basic_machine=hppa-unknown
+		os=-linux
+		;;
+	parisc-*)
+		basic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'`
+		os=-linux
+		;;
+	pbd)
+		basic_machine=sparc-tti
+		;;
+	pbb)
+		basic_machine=m68k-tti
+		;;
+	pc532 | pc532-*)
+		basic_machine=ns32k-pc532
+		;;
+	pc98)
+		basic_machine=i386-pc
+		;;
+	pc98-*)
+		basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	pentium | p5 | k5 | k6 | nexgen | viac3)
+		basic_machine=i586-pc
+		;;
+	pentiumpro | p6 | 6x86 | athlon | athlon_*)
+		basic_machine=i686-pc
+		;;
+	pentiumii | pentium2 | pentiumiii | pentium3)
+		basic_machine=i686-pc
+		;;
+	pentium4)
+		basic_machine=i786-pc
+		;;
+	pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*)
+		basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	pentiumpro-* | p6-* | 6x86-* | athlon-*)
+		basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*)
+		basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	pentium4-*)
+		basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	pn)
+		basic_machine=pn-gould
+		;;
+	power)	basic_machine=power-ibm
+		;;
+	ppc | ppcbe)	basic_machine=powerpc-unknown
+		;;
+	ppc-* | ppcbe-*)
+		basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	ppcle | powerpclittle | ppc-le | powerpc-little)
+		basic_machine=powerpcle-unknown
+		;;
+	ppcle-* | powerpclittle-*)
+		basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	ppc64)	basic_machine=powerpc64-unknown
+		;;
+	ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	ppc64le | powerpc64little | ppc64-le | powerpc64-little)
+		basic_machine=powerpc64le-unknown
+		;;
+	ppc64le-* | powerpc64little-*)
+		basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	ps2)
+		basic_machine=i386-ibm
+		;;
+	pw32)
+		basic_machine=i586-unknown
+		os=-pw32
+		;;
+	rdos | rdos64)
+		basic_machine=x86_64-pc
+		os=-rdos
+		;;
+	rdos32)
+		basic_machine=i386-pc
+		os=-rdos
+		;;
+	rom68k)
+		basic_machine=m68k-rom68k
+		os=-coff
+		;;
+	rm[46]00)
+		basic_machine=mips-siemens
+		;;
+	rtpc | rtpc-*)
+		basic_machine=romp-ibm
+		;;
+	s390 | s390-*)
+		basic_machine=s390-ibm
+		;;
+	s390x | s390x-*)
+		basic_machine=s390x-ibm
+		;;
+	sa29200)
+		basic_machine=a29k-amd
+		os=-udi
+		;;
+	sb1)
+		basic_machine=mipsisa64sb1-unknown
+		;;
+	sb1el)
+		basic_machine=mipsisa64sb1el-unknown
+		;;
+	sde)
+		basic_machine=mipsisa32-sde
+		os=-elf
+		;;
+	sei)
+		basic_machine=mips-sei
+		os=-seiux
+		;;
+	sequent)
+		basic_machine=i386-sequent
+		;;
+	sh)
+		basic_machine=sh-hitachi
+		os=-hms
+		;;
+	sh5el)
+		basic_machine=sh5le-unknown
+		;;
+	sh64)
+		basic_machine=sh64-unknown
+		;;
+	sparclite-wrs | simso-wrs)
+		basic_machine=sparclite-wrs
+		os=-vxworks
+		;;
+	sps7)
+		basic_machine=m68k-bull
+		os=-sysv2
+		;;
+	spur)
+		basic_machine=spur-unknown
+		;;
+	st2000)
+		basic_machine=m68k-tandem
+		;;
+	stratus)
+		basic_machine=i860-stratus
+		os=-sysv4
+		;;
+	strongarm-* | thumb-*)
+		basic_machine=arm-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	sun2)
+		basic_machine=m68000-sun
+		;;
+	sun2os3)
+		basic_machine=m68000-sun
+		os=-sunos3
+		;;
+	sun2os4)
+		basic_machine=m68000-sun
+		os=-sunos4
+		;;
+	sun3os3)
+		basic_machine=m68k-sun
+		os=-sunos3
+		;;
+	sun3os4)
+		basic_machine=m68k-sun
+		os=-sunos4
+		;;
+	sun4os3)
+		basic_machine=sparc-sun
+		os=-sunos3
+		;;
+	sun4os4)
+		basic_machine=sparc-sun
+		os=-sunos4
+		;;
+	sun4sol2)
+		basic_machine=sparc-sun
+		os=-solaris2
+		;;
+	sun3 | sun3-*)
+		basic_machine=m68k-sun
+		;;
+	sun4)
+		basic_machine=sparc-sun
+		;;
+	sun386 | sun386i | roadrunner)
+		basic_machine=i386-sun
+		;;
+	sv1)
+		basic_machine=sv1-cray
+		os=-unicos
+		;;
+	symmetry)
+		basic_machine=i386-sequent
+		os=-dynix
+		;;
+	t3e)
+		basic_machine=alphaev5-cray
+		os=-unicos
+		;;
+	t90)
+		basic_machine=t90-cray
+		os=-unicos
+		;;
+	tile*)
+		basic_machine=$basic_machine-unknown
+		os=-linux-gnu
+		;;
+	tx39)
+		basic_machine=mipstx39-unknown
+		;;
+	tx39el)
+		basic_machine=mipstx39el-unknown
+		;;
+	toad1)
+		basic_machine=pdp10-xkl
+		os=-tops20
+		;;
+	tower | tower-32)
+		basic_machine=m68k-ncr
+		;;
+	tpf)
+		basic_machine=s390x-ibm
+		os=-tpf
+		;;
+	udi29k)
+		basic_machine=a29k-amd
+		os=-udi
+		;;
+	ultra3)
+		basic_machine=a29k-nyu
+		os=-sym1
+		;;
+	v810 | necv810)
+		basic_machine=v810-nec
+		os=-none
+		;;
+	vaxv)
+		basic_machine=vax-dec
+		os=-sysv
+		;;
+	vms)
+		basic_machine=vax-dec
+		os=-vms
+		;;
+	vpp*|vx|vx-*)
+		basic_machine=f301-fujitsu
+		;;
+	vxworks960)
+		basic_machine=i960-wrs
+		os=-vxworks
+		;;
+	vxworks68)
+		basic_machine=m68k-wrs
+		os=-vxworks
+		;;
+	vxworks29k)
+		basic_machine=a29k-wrs
+		os=-vxworks
+		;;
+	w65*)
+		basic_machine=w65-wdc
+		os=-none
+		;;
+	w89k-*)
+		basic_machine=hppa1.1-winbond
+		os=-proelf
+		;;
+	xbox)
+		basic_machine=i686-pc
+		os=-mingw32
+		;;
+	xps | xps100)
+		basic_machine=xps100-honeywell
+		;;
+	xscale-* | xscalee[bl]-*)
+		basic_machine=`echo $basic_machine | sed 's/^xscale/arm/'`
+		;;
+	ymp)
+		basic_machine=ymp-cray
+		os=-unicos
+		;;
+	z8k-*-coff)
+		basic_machine=z8k-unknown
+		os=-sim
+		;;
+	z80-*-coff)
+		basic_machine=z80-unknown
+		os=-sim
+		;;
+	none)
+		basic_machine=none-none
+		os=-none
+		;;
+
+# Here we handle the default manufacturer of certain CPU types.  It is in
+# some cases the only manufacturer, in others, it is the most popular.
+	w89k)
+		basic_machine=hppa1.1-winbond
+		;;
+	op50n)
+		basic_machine=hppa1.1-oki
+		;;
+	op60c)
+		basic_machine=hppa1.1-oki
+		;;
+	romp)
+		basic_machine=romp-ibm
+		;;
+	mmix)
+		basic_machine=mmix-knuth
+		;;
+	rs6000)
+		basic_machine=rs6000-ibm
+		;;
+	vax)
+		basic_machine=vax-dec
+		;;
+	pdp10)
+		# there are many clones, so DEC is not a safe bet
+		basic_machine=pdp10-unknown
+		;;
+	pdp11)
+		basic_machine=pdp11-dec
+		;;
+	we32k)
+		basic_machine=we32k-att
+		;;
+	sh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele)
+		basic_machine=sh-unknown
+		;;
+	sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v)
+		basic_machine=sparc-sun
+		;;
+	cydra)
+		basic_machine=cydra-cydrome
+		;;
+	orion)
+		basic_machine=orion-highlevel
+		;;
+	orion105)
+		basic_machine=clipper-highlevel
+		;;
+	mac | mpw | mac-mpw)
+		basic_machine=m68k-apple
+		;;
+	pmac | pmac-mpw)
+		basic_machine=powerpc-apple
+		;;
+	*-unknown)
+		# Make sure to match an already-canonicalized machine name.
+		;;
+	*)
+		echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
+		exit 1
+		;;
+esac
+
+# Here we canonicalize certain aliases for manufacturers.
+case $basic_machine in
+	*-digital*)
+		basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'`
+		;;
+	*-commodore*)
+		basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'`
+		;;
+	*)
+		;;
+esac
+
+# Decode manufacturer-specific aliases for certain operating systems.
+
+if [ x"$os" != x"" ]
+then
+case $os in
+	# First match some system type aliases
+	# that might get confused with valid system types.
+	# -solaris* is a basic system type, with this one exception.
+	-auroraux)
+		os=-auroraux
+		;;
+	-solaris1 | -solaris1.*)
+		os=`echo $os | sed -e 's|solaris1|sunos4|'`
+		;;
+	-solaris)
+		os=-solaris2
+		;;
+	-svr4*)
+		os=-sysv4
+		;;
+	-unixware*)
+		os=-sysv4.2uw
+		;;
+	-gnu/linux*)
+		os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'`
+		;;
+	# First accept the basic system types.
+	# The portable systems comes first.
+	# Each alternative MUST END IN A *, to match a version number.
+	# -sysv* is not here because it comes later, after sysvr4.
+	-gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \
+	      | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\
+	      | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \
+	      | -sym* | -kopensolaris* | -plan9* \
+	      | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \
+	      | -aos* | -aros* \
+	      | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \
+	      | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \
+	      | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \
+	      | -bitrig* | -openbsd* | -solidbsd* \
+	      | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \
+	      | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \
+	      | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \
+	      | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \
+	      | -chorusos* | -chorusrdb* | -cegcc* \
+	      | -cygwin* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
+	      | -mingw32* | -mingw64* | -linux-gnu* | -linux-android* \
+	      | -linux-newlib* | -linux-musl* | -linux-uclibc* \
+	      | -uxpv* | -beos* | -mpeix* | -udk* \
+	      | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \
+	      | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \
+	      | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \
+	      | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \
+	      | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \
+	      | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \
+	      | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es*)
+	# Remember, each alternative MUST END IN *, to match a version number.
+		;;
+	-qnx*)
+		case $basic_machine in
+		    x86-* | i*86-*)
+			;;
+		    *)
+			os=-nto$os
+			;;
+		esac
+		;;
+	-nto-qnx*)
+		;;
+	-nto*)
+		os=`echo $os | sed -e 's|nto|nto-qnx|'`
+		;;
+	-sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \
+	      | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \
+	      | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*)
+		;;
+	-mac*)
+		os=`echo $os | sed -e 's|mac|macos|'`
+		;;
+	-linux-dietlibc)
+		os=-linux-dietlibc
+		;;
+	-linux*)
+		os=`echo $os | sed -e 's|linux|linux-gnu|'`
+		;;
+	-sunos5*)
+		os=`echo $os | sed -e 's|sunos5|solaris2|'`
+		;;
+	-sunos6*)
+		os=`echo $os | sed -e 's|sunos6|solaris3|'`
+		;;
+	-opened*)
+		os=-openedition
+		;;
+	-os400*)
+		os=-os400
+		;;
+	-wince*)
+		os=-wince
+		;;
+	-osfrose*)
+		os=-osfrose
+		;;
+	-osf*)
+		os=-osf
+		;;
+	-utek*)
+		os=-bsd
+		;;
+	-dynix*)
+		os=-bsd
+		;;
+	-acis*)
+		os=-aos
+		;;
+	-atheos*)
+		os=-atheos
+		;;
+	-syllable*)
+		os=-syllable
+		;;
+	-386bsd)
+		os=-bsd
+		;;
+	-ctix* | -uts*)
+		os=-sysv
+		;;
+	-nova*)
+		os=-rtmk-nova
+		;;
+	-ns2 )
+		os=-nextstep2
+		;;
+	-nsk*)
+		os=-nsk
+		;;
+	# Preserve the version number of sinix5.
+	-sinix5.*)
+		os=`echo $os | sed -e 's|sinix|sysv|'`
+		;;
+	-sinix*)
+		os=-sysv4
+		;;
+	-tpf*)
+		os=-tpf
+		;;
+	-triton*)
+		os=-sysv3
+		;;
+	-oss*)
+		os=-sysv3
+		;;
+	-svr4)
+		os=-sysv4
+		;;
+	-svr3)
+		os=-sysv3
+		;;
+	-sysvr4)
+		os=-sysv4
+		;;
+	# This must come after -sysvr4.
+	-sysv*)
+		;;
+	-ose*)
+		os=-ose
+		;;
+	-es1800*)
+		os=-ose
+		;;
+	-xenix)
+		os=-xenix
+		;;
+	-*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
+		os=-mint
+		;;
+	-aros*)
+		os=-aros
+		;;
+	-zvmoe)
+		os=-zvmoe
+		;;
+	-dicos*)
+		os=-dicos
+		;;
+	-nacl*)
+		;;
+	-none)
+		;;
+	*)
+		# Get rid of the `-' at the beginning of $os.
+		os=`echo $os | sed 's/[^-]*-//'`
+		echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2
+		exit 1
+		;;
+esac
+else
+
+# Here we handle the default operating systems that come with various machines.
+# The value should be what the vendor currently ships out the door with their
+# machine or put another way, the most popular os provided with the machine.
+
+# Note that if you're going to try to match "-MANUFACTURER" here (say,
+# "-sun"), then you have to tell the case statement up towards the top
+# that MANUFACTURER isn't an operating system.  Otherwise, code above
+# will signal an error saying that MANUFACTURER isn't an operating
+# system, and we'll never get to this point.
+
+case $basic_machine in
+	score-*)
+		os=-elf
+		;;
+	spu-*)
+		os=-elf
+		;;
+	*-acorn)
+		os=-riscix1.2
+		;;
+	arm*-rebel)
+		os=-linux
+		;;
+	arm*-semi)
+		os=-aout
+		;;
+	c4x-* | tic4x-*)
+		os=-coff
+		;;
+	c8051-*)
+		os=-elf
+		;;
+	hexagon-*)
+		os=-elf
+		;;
+	tic54x-*)
+		os=-coff
+		;;
+	tic55x-*)
+		os=-coff
+		;;
+	tic6x-*)
+		os=-coff
+		;;
+	# This must come before the *-dec entry.
+	pdp10-*)
+		os=-tops20
+		;;
+	pdp11-*)
+		os=-none
+		;;
+	*-dec | vax-*)
+		os=-ultrix4.2
+		;;
+	m68*-apollo)
+		os=-domain
+		;;
+	i386-sun)
+		os=-sunos4.0.2
+		;;
+	m68000-sun)
+		os=-sunos3
+		;;
+	m68*-cisco)
+		os=-aout
+		;;
+	mep-*)
+		os=-elf
+		;;
+	mips*-cisco)
+		os=-elf
+		;;
+	mips*-*)
+		os=-elf
+		;;
+	or1k-*)
+		os=-elf
+		;;
+	or32-*)
+		os=-coff
+		;;
+	*-tti)	# must be before sparc entry or we get the wrong os.
+		os=-sysv3
+		;;
+	sparc-* | *-sun)
+		os=-sunos4.1.1
+		;;
+	*-be)
+		os=-beos
+		;;
+	*-haiku)
+		os=-haiku
+		;;
+	*-ibm)
+		os=-aix
+		;;
+	*-knuth)
+		os=-mmixware
+		;;
+	*-wec)
+		os=-proelf
+		;;
+	*-winbond)
+		os=-proelf
+		;;
+	*-oki)
+		os=-proelf
+		;;
+	*-hp)
+		os=-hpux
+		;;
+	*-hitachi)
+		os=-hiux
+		;;
+	i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent)
+		os=-sysv
+		;;
+	*-cbm)
+		os=-amigaos
+		;;
+	*-dg)
+		os=-dgux
+		;;
+	*-dolphin)
+		os=-sysv3
+		;;
+	m68k-ccur)
+		os=-rtu
+		;;
+	m88k-omron*)
+		os=-luna
+		;;
+	*-next )
+		os=-nextstep
+		;;
+	*-sequent)
+		os=-ptx
+		;;
+	*-crds)
+		os=-unos
+		;;
+	*-ns)
+		os=-genix
+		;;
+	i370-*)
+		os=-mvs
+		;;
+	*-next)
+		os=-nextstep3
+		;;
+	*-gould)
+		os=-sysv
+		;;
+	*-highlevel)
+		os=-bsd
+		;;
+	*-encore)
+		os=-bsd
+		;;
+	*-sgi)
+		os=-irix
+		;;
+	*-siemens)
+		os=-sysv4
+		;;
+	*-masscomp)
+		os=-rtu
+		;;
+	f30[01]-fujitsu | f700-fujitsu)
+		os=-uxpv
+		;;
+	*-rom68k)
+		os=-coff
+		;;
+	*-*bug)
+		os=-coff
+		;;
+	*-apple)
+		os=-macos
+		;;
+	*-atari*)
+		os=-mint
+		;;
+	*)
+		os=-none
+		;;
+esac
+fi
+
+# Here we handle the case where we know the os, and the CPU type, but not the
+# manufacturer.  We pick the logical manufacturer.
+vendor=unknown
+case $basic_machine in
+	*-unknown)
+		case $os in
+			-riscix*)
+				vendor=acorn
+				;;
+			-sunos*)
+				vendor=sun
+				;;
+			-cnk*|-aix*)
+				vendor=ibm
+				;;
+			-beos*)
+				vendor=be
+				;;
+			-hpux*)
+				vendor=hp
+				;;
+			-mpeix*)
+				vendor=hp
+				;;
+			-hiux*)
+				vendor=hitachi
+				;;
+			-unos*)
+				vendor=crds
+				;;
+			-dgux*)
+				vendor=dg
+				;;
+			-luna*)
+				vendor=omron
+				;;
+			-genix*)
+				vendor=ns
+				;;
+			-mvs* | -opened*)
+				vendor=ibm
+				;;
+			-os400*)
+				vendor=ibm
+				;;
+			-ptx*)
+				vendor=sequent
+				;;
+			-tpf*)
+				vendor=ibm
+				;;
+			-vxsim* | -vxworks* | -windiss*)
+				vendor=wrs
+				;;
+			-aux*)
+				vendor=apple
+				;;
+			-hms*)
+				vendor=hitachi
+				;;
+			-mpw* | -macos*)
+				vendor=apple
+				;;
+			-*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
+				vendor=atari
+				;;
+			-vos*)
+				vendor=stratus
+				;;
+		esac
+		basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"`
+		;;
+esac
+
+echo $basic_machine$os
+exit
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "timestamp='"
+# time-stamp-format: "%:y-%02m-%02d"
+# time-stamp-end: "'"
+# End:
diff --git a/configure b/configure
new file mode 100755
index 0000000..cf91f26
--- /dev/null
+++ b/configure
@@ -0,0 +1,24557 @@
+#! /bin/sh
+# Guess values for system-dependent variables and create Makefiles.
+# Generated by GNU Autoconf 2.69 for netCDF-Fortran 4.4.1.
+#
+# Report bugs to <support-netcdf at unidata.ucar.edu>.
+#
+#
+# Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc.
+#
+#
+# This configure script is free software; the Free Software Foundation
+# gives unlimited permission to copy, distribute and modify it.
+## -------------------- ##
+## M4sh Initialization. ##
+## -------------------- ##
+
+# Be more Bourne compatible
+DUALCASE=1; export DUALCASE # for MKS sh
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then :
+  emulate sh
+  NULLCMD=:
+  # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '${1+"$@"}'='"$@"'
+  setopt NO_GLOB_SUBST
+else
+  case `(set -o) 2>/dev/null` in #(
+  *posix*) :
+    set -o posix ;; #(
+  *) :
+     ;;
+esac
+fi
+
+
+as_nl='
+'
+export as_nl
+# Printing a long string crashes Solaris 7 /usr/bin/printf.
+as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo
+# Prefer a ksh shell builtin over an external printf program on Solaris,
+# but without wasting forks for bash or zsh.
+if test -z "$BASH_VERSION$ZSH_VERSION" \
+    && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then
+  as_echo='print -r --'
+  as_echo_n='print -rn --'
+elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then
+  as_echo='printf %s\n'
+  as_echo_n='printf %s'
+else
+  if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then
+    as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"'
+    as_echo_n='/usr/ucb/echo -n'
+  else
+    as_echo_body='eval expr "X$1" : "X\\(.*\\)"'
+    as_echo_n_body='eval
+      arg=$1;
+      case $arg in #(
+      *"$as_nl"*)
+	expr "X$arg" : "X\\(.*\\)$as_nl";
+	arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;;
+      esac;
+      expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl"
+    '
+    export as_echo_n_body
+    as_echo_n='sh -c $as_echo_n_body as_echo'
+  fi
+  export as_echo_body
+  as_echo='sh -c $as_echo_body as_echo'
+fi
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+  PATH_SEPARATOR=:
+  (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
+    (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
+      PATH_SEPARATOR=';'
+  }
+fi
+
+
+# IFS
+# We need space, tab and new line, in precisely that order.  Quoting is
+# there to prevent editors from complaining about space-tab.
+# (If _AS_PATH_WALK were called with IFS unset, it would disable word
+# splitting by setting IFS to empty value.)
+IFS=" ""	$as_nl"
+
+# Find who we are.  Look in the path if we contain no directory separator.
+as_myself=
+case $0 in #((
+  *[\\/]* ) as_myself=$0 ;;
+  *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+  done
+IFS=$as_save_IFS
+
+     ;;
+esac
+# We did not find ourselves, most probably we were run as `sh COMMAND'
+# in which case we are not to be found in the path.
+if test "x$as_myself" = x; then
+  as_myself=$0
+fi
+if test ! -f "$as_myself"; then
+  $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+  exit 1
+fi
+
+# Unset variables that we do not need and which cause bugs (e.g. in
+# pre-3.0 UWIN ksh).  But do not cause bugs in bash 2.01; the "|| exit 1"
+# suppresses any "Segmentation fault" message there.  '((' could
+# trigger a bug in pdksh 5.2.14.
+for as_var in BASH_ENV ENV MAIL MAILPATH
+do eval test x\${$as_var+set} = xset \
+  && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
+done
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+LC_ALL=C
+export LC_ALL
+LANGUAGE=C
+export LANGUAGE
+
+# CDPATH.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+# Use a proper internal environment variable to ensure we don't fall
+  # into an infinite loop, continuously re-executing ourselves.
+  if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then
+    _as_can_reexec=no; export _as_can_reexec;
+    # We cannot yet assume a decent shell, so we have to provide a
+# neutralization value for shells without unset; and this also
+# works around shells that cannot unset nonexistent variables.
+# Preserve -v and -x to the replacement shell.
+BASH_ENV=/dev/null
+ENV=/dev/null
+(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV
+case $- in # ((((
+  *v*x* | *x*v* ) as_opts=-vx ;;
+  *v* ) as_opts=-v ;;
+  *x* ) as_opts=-x ;;
+  * ) as_opts= ;;
+esac
+exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"}
+# Admittedly, this is quite paranoid, since all the known shells bail
+# out after a failed `exec'.
+$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2
+as_fn_exit 255
+  fi
+  # We don't want this to propagate to other subprocesses.
+          { _as_can_reexec=; unset _as_can_reexec;}
+if test "x$CONFIG_SHELL" = x; then
+  as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then :
+  emulate sh
+  NULLCMD=:
+  # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '\${1+\"\$@\"}'='\"\$@\"'
+  setopt NO_GLOB_SUBST
+else
+  case \`(set -o) 2>/dev/null\` in #(
+  *posix*) :
+    set -o posix ;; #(
+  *) :
+     ;;
+esac
+fi
+"
+  as_required="as_fn_return () { (exit \$1); }
+as_fn_success () { as_fn_return 0; }
+as_fn_failure () { as_fn_return 1; }
+as_fn_ret_success () { return 0; }
+as_fn_ret_failure () { return 1; }
+
+exitcode=0
+as_fn_success || { exitcode=1; echo as_fn_success failed.; }
+as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; }
+as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; }
+as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; }
+if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then :
+
+else
+  exitcode=1; echo positional parameters were not saved.
+fi
+test x\$exitcode = x0 || exit 1
+test -x / || exit 1"
+  as_suggested="  as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO
+  as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO
+  eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" &&
+  test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1
+
+  test -n \"\${ZSH_VERSION+set}\${BASH_VERSION+set}\" || (
+    ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+    ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO
+    ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO
+    PATH=/empty FPATH=/empty; export PATH FPATH
+    test \"X\`printf %s \$ECHO\`\" = \"X\$ECHO\" \\
+      || test \"X\`print -r -- \$ECHO\`\" = \"X\$ECHO\" ) || exit 1
+test \$(( 1 + 1 )) = 2 || exit 1"
+  if (eval "$as_required") 2>/dev/null; then :
+  as_have_required=yes
+else
+  as_have_required=no
+fi
+  if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then :
+
+else
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+as_found=false
+for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  as_found=:
+  case $as_dir in #(
+	 /*)
+	   for as_base in sh bash ksh sh5; do
+	     # Try only shells that exist, to save several forks.
+	     as_shell=$as_dir/$as_base
+	     if { test -f "$as_shell" || test -f "$as_shell.exe"; } &&
+		    { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then :
+  CONFIG_SHELL=$as_shell as_have_required=yes
+		   if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then :
+  break 2
+fi
+fi
+	   done;;
+       esac
+  as_found=false
+done
+$as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } &&
+	      { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then :
+  CONFIG_SHELL=$SHELL as_have_required=yes
+fi; }
+IFS=$as_save_IFS
+
+
+      if test "x$CONFIG_SHELL" != x; then :
+  export CONFIG_SHELL
+             # We cannot yet assume a decent shell, so we have to provide a
+# neutralization value for shells without unset; and this also
+# works around shells that cannot unset nonexistent variables.
+# Preserve -v and -x to the replacement shell.
+BASH_ENV=/dev/null
+ENV=/dev/null
+(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV
+case $- in # ((((
+  *v*x* | *x*v* ) as_opts=-vx ;;
+  *v* ) as_opts=-v ;;
+  *x* ) as_opts=-x ;;
+  * ) as_opts= ;;
+esac
+exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"}
+# Admittedly, this is quite paranoid, since all the known shells bail
+# out after a failed `exec'.
+$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2
+exit 255
+fi
+
+    if test x$as_have_required = xno; then :
+  $as_echo "$0: This script requires a shell more modern than all"
+  $as_echo "$0: the shells that I found on your system."
+  if test x${ZSH_VERSION+set} = xset ; then
+    $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should"
+    $as_echo "$0: be upgraded to zsh 4.3.4 or later."
+  else
+    $as_echo "$0: Please tell bug-autoconf at gnu.org and
+$0: support-netcdf at unidata.ucar.edu about your system,
+$0: including any error possibly output before this
+$0: message. Then install a modern shell, or manually run
+$0: the script under such a shell if you do have one."
+  fi
+  exit 1
+fi
+fi
+fi
+SHELL=${CONFIG_SHELL-/bin/sh}
+export SHELL
+# Unset more variables known to interfere with behavior of common tools.
+CLICOLOR_FORCE= GREP_OPTIONS=
+unset CLICOLOR_FORCE GREP_OPTIONS
+
+## --------------------- ##
+## M4sh Shell Functions. ##
+## --------------------- ##
+# as_fn_unset VAR
+# ---------------
+# Portably unset VAR.
+as_fn_unset ()
+{
+  { eval $1=; unset $1;}
+}
+as_unset=as_fn_unset
+
+# as_fn_set_status STATUS
+# -----------------------
+# Set $? to STATUS, without forking.
+as_fn_set_status ()
+{
+  return $1
+} # as_fn_set_status
+
+# as_fn_exit STATUS
+# -----------------
+# Exit the shell with STATUS, even in a "trap 0" or "set -e" context.
+as_fn_exit ()
+{
+  set +e
+  as_fn_set_status $1
+  exit $1
+} # as_fn_exit
+
+# as_fn_mkdir_p
+# -------------
+# Create "$as_dir" as a directory, including parents if necessary.
+as_fn_mkdir_p ()
+{
+
+  case $as_dir in #(
+  -*) as_dir=./$as_dir;;
+  esac
+  test -d "$as_dir" || eval $as_mkdir_p || {
+    as_dirs=
+    while :; do
+      case $as_dir in #(
+      *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
+      *) as_qdir=$as_dir;;
+      esac
+      as_dirs="'$as_qdir' $as_dirs"
+      as_dir=`$as_dirname -- "$as_dir" ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$as_dir" : 'X\(//\)[^/]' \| \
+	 X"$as_dir" : 'X\(//\)$' \| \
+	 X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$as_dir" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)[^/].*/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+      test -d "$as_dir" && break
+    done
+    test -z "$as_dirs" || eval "mkdir $as_dirs"
+  } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir"
+
+
+} # as_fn_mkdir_p
+
+# as_fn_executable_p FILE
+# -----------------------
+# Test if FILE is an executable regular file.
+as_fn_executable_p ()
+{
+  test -f "$1" && test -x "$1"
+} # as_fn_executable_p
+# as_fn_append VAR VALUE
+# ----------------------
+# Append the text in VALUE to the end of the definition contained in VAR. Take
+# advantage of any shell optimizations that allow amortized linear growth over
+# repeated appends, instead of the typical quadratic growth present in naive
+# implementations.
+if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then :
+  eval 'as_fn_append ()
+  {
+    eval $1+=\$2
+  }'
+else
+  as_fn_append ()
+  {
+    eval $1=\$$1\$2
+  }
+fi # as_fn_append
+
+# as_fn_arith ARG...
+# ------------------
+# Perform arithmetic evaluation on the ARGs, and store the result in the
+# global $as_val. Take advantage of shells that can avoid forks. The arguments
+# must be portable across $(()) and expr.
+if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then :
+  eval 'as_fn_arith ()
+  {
+    as_val=$(( $* ))
+  }'
+else
+  as_fn_arith ()
+  {
+    as_val=`expr "$@" || test $? -eq 1`
+  }
+fi # as_fn_arith
+
+
+# as_fn_error STATUS ERROR [LINENO LOG_FD]
+# ----------------------------------------
+# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are
+# provided, also output the error to LOG_FD, referencing LINENO. Then exit the
+# script with STATUS, using 1 if that was 0.
+as_fn_error ()
+{
+  as_status=$1; test $as_status -eq 0 && as_status=1
+  if test "$4"; then
+    as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+    $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
+  fi
+  $as_echo "$as_me: error: $2" >&2
+  as_fn_exit $as_status
+} # as_fn_error
+
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+   test "X`expr 00001 : '.*\(...\)'`" = X001; then
+  as_expr=expr
+else
+  as_expr=false
+fi
+
+if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
+  as_basename=basename
+else
+  as_basename=false
+fi
+
+if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
+  as_dirname=dirname
+else
+  as_dirname=false
+fi
+
+as_me=`$as_basename -- "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+	 X"$0" : 'X\(//\)$' \| \
+	 X"$0" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X/"$0" |
+    sed '/^.*\/\([^/][^/]*\)\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\/\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\/\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+
+# 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
+
+
+  as_lineno_1=$LINENO as_lineno_1a=$LINENO
+  as_lineno_2=$LINENO as_lineno_2a=$LINENO
+  eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" &&
+  test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || {
+  # Blame Lee E. McMahon (1931-1989) for sed's syntax.  :-)
+  sed -n '
+    p
+    /[$]LINENO/=
+  ' <$as_myself |
+    sed '
+      s/[$]LINENO.*/&-/
+      t lineno
+      b
+      :lineno
+      N
+      :loop
+      s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/
+      t loop
+      s/-\n.*//
+    ' >$as_me.lineno &&
+  chmod +x "$as_me.lineno" ||
+    { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; }
+
+  # If we had to re-execute with $CONFIG_SHELL, we're ensured to have
+  # already done that, so ensure we don't try to do so again and fall
+  # in an infinite loop.  This has already happened in practice.
+  _as_can_reexec=no; export _as_can_reexec
+  # Don't try to exec as it changes $[0], causing all sort of problems
+  # (the dirname of $[0] is not the place where we might find the
+  # original and so on.  Autoconf is especially sensitive to this).
+  . "./$as_me.lineno"
+  # Exit status is that of the last command.
+  exit
+}
+
+ECHO_C= ECHO_N= ECHO_T=
+case `echo -n x` in #(((((
+-n*)
+  case `echo 'xy\c'` in
+  *c*) ECHO_T='	';;	# ECHO_T is single tab character.
+  xy)  ECHO_C='\c';;
+  *)   echo `echo ksh88 bug on AIX 6.1` > /dev/null
+       ECHO_T='	';;
+  esac;;
+*)
+  ECHO_N='-n';;
+esac
+
+rm -f conf$$ conf$$.exe conf$$.file
+if test -d conf$$.dir; then
+  rm -f conf$$.dir/conf$$.file
+else
+  rm -f conf$$.dir
+  mkdir conf$$.dir 2>/dev/null
+fi
+if (echo >conf$$.file) 2>/dev/null; then
+  if ln -s conf$$.file conf$$ 2>/dev/null; then
+    as_ln_s='ln -s'
+    # ... but there are two gotchas:
+    # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
+    # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
+    # In both cases, we have to default to `cp -pR'.
+    ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
+      as_ln_s='cp -pR'
+  elif ln conf$$.file conf$$ 2>/dev/null; then
+    as_ln_s=ln
+  else
+    as_ln_s='cp -pR'
+  fi
+else
+  as_ln_s='cp -pR'
+fi
+rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
+rmdir conf$$.dir 2>/dev/null
+
+if mkdir -p . 2>/dev/null; then
+  as_mkdir_p='mkdir -p "$as_dir"'
+else
+  test -d ./-p && rmdir ./-p
+  as_mkdir_p=false
+fi
+
+as_test_x='test -x'
+as_executable_p=as_fn_executable_p
+
+# 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'"
+
+SHELL=${CONFIG_SHELL-/bin/sh}
+
+
+test -n "$DJDIR" || exec 7<&0 </dev/null
+exec 6>&1
+
+# Name of the host.
+# hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status,
+# so uname gets run too.
+ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q`
+
+#
+# Initializations.
+#
+ac_default_prefix=/usr/local
+ac_clean_files=
+ac_config_libobj_dir=.
+LIBOBJS=
+cross_compiling=no
+subdirs=
+MFLAGS=
+MAKEFLAGS=
+
+# Identity of this package.
+PACKAGE_NAME='netCDF-Fortran'
+PACKAGE_TARNAME='netcdf-fortran'
+PACKAGE_VERSION='4.4.1'
+PACKAGE_STRING='netCDF-Fortran 4.4.1'
+PACKAGE_BUGREPORT='support-netcdf at unidata.ucar.edu'
+PACKAGE_URL=''
+
+ac_unique_file="libsrc/fort-attio.c"
+# Factoring default headers for most tests.
+ac_includes_default="\
+#include <stdio.h>
+#ifdef HAVE_SYS_TYPES_H
+# include <sys/types.h>
+#endif
+#ifdef HAVE_SYS_STAT_H
+# include <sys/stat.h>
+#endif
+#ifdef STDC_HEADERS
+# include <stdlib.h>
+# include <stddef.h>
+#else
+# ifdef HAVE_STDLIB_H
+#  include <stdlib.h>
+# endif
+#endif
+#ifdef HAVE_STRING_H
+# if !defined STDC_HEADERS && defined HAVE_MEMORY_H
+#  include <memory.h>
+# endif
+# include <string.h>
+#endif
+#ifdef HAVE_STRINGS_H
+# include <strings.h>
+#endif
+#ifdef HAVE_INTTYPES_H
+# include <inttypes.h>
+#endif
+#ifdef HAVE_STDINT_H
+# include <stdint.h>
+#endif
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif"
+
+ac_subst_vars='am__EXEEXT_FALSE
+am__EXEEXT_TRUE
+LTLIBOBJS
+LIBOBJS
+HAS_NC4
+HAS_NC2
+HAS_DAP
+HAS_F03
+HAS_F90
+NC_FLIBS
+NC_LIBS
+USE_VALGRIND_TESTS_FALSE
+USE_VALGRIND_TESTS_TRUE
+TEST_PARALLEL_FALSE
+TEST_PARALLEL_TRUE
+ALLOCA
+BUILD_PARALLEL_FALSE
+BUILD_PARALLEL_TRUE
+BUILD_DAP_FALSE
+BUILD_DAP_TRUE
+USE_LOGGING_FALSE
+USE_LOGGING_TRUE
+BUILD_V2_FALSE
+BUILD_V2_TRUE
+USE_NETCDF4_FALSE
+USE_NETCDF4_TRUE
+BUILD_DLL_FALSE
+BUILD_DLL_TRUE
+EXTRA_EXAMPLE_TESTS_FALSE
+EXTRA_EXAMPLE_TESTS_TRUE
+UPPER_CASE_MOD_FALSE
+UPPER_CASE_MOD_TRUE
+NMFLAGS
+USING_PGI_FALSE
+USING_PGI_TRUE
+CPP
+OTOOL64
+OTOOL
+LIPO
+NMEDIT
+DSYMUTIL
+MANIFEST_TOOL
+RANLIB
+ac_ct_AR
+AR
+DLLTOOL
+OBJDUMP
+LN_S
+NM
+ac_ct_DUMPBIN
+DUMPBIN
+LD
+FGREP
+EGREP
+GREP
+SED
+LIBTOOL
+BUILD_F03_FALSE
+BUILD_F03_TRUE
+BUILD_BENCHMARKS_FALSE
+BUILD_BENCHMARKS_TRUE
+LARGE_FILE_TESTS_FALSE
+LARGE_FILE_TESTS_TRUE
+MOD_FLAG
+FCFLAGS_f90
+ac_ct_F77
+FFLAGS
+F77
+ac_ct_FC
+FCFLAGS
+FC
+am__fastdepCC_FALSE
+am__fastdepCC_TRUE
+CCDEPMODE
+am__nodep
+AMDEPBACKSLASH
+AMDEP_FALSE
+AMDEP_TRUE
+am__quote
+am__include
+DEPDIR
+OBJEXT
+EXEEXT
+ac_ct_CC
+CPPFLAGS
+LDFLAGS
+CFLAGS
+CC
+HAVE_DOT
+DOT
+DOXYGEN
+BUILD_INTERNAL_DOCS
+BUILD_DOCS_FALSE
+BUILD_DOCS_TRUE
+EXTRA_TESTS_FALSE
+EXTRA_TESTS_TRUE
+MAINT
+MAINTAINER_MODE_FALSE
+MAINTAINER_MODE_TRUE
+AM_BACKSLASH
+AM_DEFAULT_VERBOSITY
+AM_DEFAULT_V
+AM_V
+am__untar
+am__tar
+AMTAR
+am__leading_dot
+SET_MAKE
+AWK
+mkdir_p
+MKDIR_P
+INSTALL_STRIP_PROGRAM
+STRIP
+install_sh
+MAKEINFO
+AUTOHEADER
+AUTOMAKE
+AUTOCONF
+ACLOCAL
+VERSION
+PACKAGE
+CYGPATH_W
+am__isrc
+INSTALL_DATA
+INSTALL_SCRIPT
+INSTALL_PROGRAM
+target_os
+target_vendor
+target_cpu
+target
+host_os
+host_vendor
+host_cpu
+host
+build_os
+build_vendor
+build_cpu
+build
+target_alias
+host_alias
+build_alias
+LIBS
+ECHO_T
+ECHO_N
+ECHO_C
+DEFS
+mandir
+localedir
+libdir
+psdir
+pdfdir
+dvidir
+htmldir
+infodir
+docdir
+oldincludedir
+includedir
+localstatedir
+sharedstatedir
+sysconfdir
+datadir
+datarootdir
+libexecdir
+sbindir
+bindir
+program_transform_name
+prefix
+exec_prefix
+PACKAGE_URL
+PACKAGE_BUGREPORT
+PACKAGE_STRING
+PACKAGE_VERSION
+PACKAGE_TARNAME
+PACKAGE_NAME
+PATH_SEPARATOR
+SHELL'
+ac_subst_files=''
+ac_user_opts='
+enable_option_checking
+enable_silent_rules
+enable_maintainer_mode
+enable_valgrind_tests
+enable_parallel_tests
+enable_extra_tests
+enable_doxygen
+enable_dot
+enable_internal_docs
+enable_dependency_tracking
+enable_f03_compiler_check
+enable_f03
+enable_fortran_type_check
+enable_large_file_tests
+enable_benchmarks
+with_temp_large
+enable_shared
+enable_static
+with_pic
+enable_fast_install
+with_gnu_ld
+with_sysroot
+enable_libtool_lock
+enable_largefile
+enable_extra_example_tests
+enable_dll
+'
+      ac_precious_vars='build_alias
+host_alias
+target_alias
+CC
+CFLAGS
+LDFLAGS
+LIBS
+CPPFLAGS
+FC
+FCFLAGS
+F77
+FFLAGS
+CPP'
+
+
+# Initialize some variables set by options.
+ac_init_help=
+ac_init_version=false
+ac_unrecognized_opts=
+ac_unrecognized_sep=
+# The variables have the same names as the options, with
+# dashes changed to underlines.
+cache_file=/dev/null
+exec_prefix=NONE
+no_create=
+no_recursion=
+prefix=NONE
+program_prefix=NONE
+program_suffix=NONE
+program_transform_name=s,x,x,
+silent=
+site=
+srcdir=
+verbose=
+x_includes=NONE
+x_libraries=NONE
+
+# Installation directory options.
+# These are left unexpanded so users can "make install exec_prefix=/foo"
+# and all the variables that are supposed to be based on exec_prefix
+# by default will actually change.
+# Use braces instead of parens because sh, perl, etc. also accept them.
+# (The list follows the same order as the GNU Coding Standards.)
+bindir='${exec_prefix}/bin'
+sbindir='${exec_prefix}/sbin'
+libexecdir='${exec_prefix}/libexec'
+datarootdir='${prefix}/share'
+datadir='${datarootdir}'
+sysconfdir='${prefix}/etc'
+sharedstatedir='${prefix}/com'
+localstatedir='${prefix}/var'
+includedir='${prefix}/include'
+oldincludedir='/usr/include'
+docdir='${datarootdir}/doc/${PACKAGE_TARNAME}'
+infodir='${datarootdir}/info'
+htmldir='${docdir}'
+dvidir='${docdir}'
+pdfdir='${docdir}'
+psdir='${docdir}'
+libdir='${exec_prefix}/lib'
+localedir='${datarootdir}/locale'
+mandir='${datarootdir}/man'
+
+ac_prev=
+ac_dashdash=
+for ac_option
+do
+  # If the previous option needs an argument, assign it.
+  if test -n "$ac_prev"; then
+    eval $ac_prev=\$ac_option
+    ac_prev=
+    continue
+  fi
+
+  case $ac_option in
+  *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;;
+  *=)   ac_optarg= ;;
+  *)    ac_optarg=yes ;;
+  esac
+
+  # Accept the important Cygnus configure options, so we can diagnose typos.
+
+  case $ac_dashdash$ac_option in
+  --)
+    ac_dashdash=yes ;;
+
+  -bindir | --bindir | --bindi | --bind | --bin | --bi)
+    ac_prev=bindir ;;
+  -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)
+    bindir=$ac_optarg ;;
+
+  -build | --build | --buil | --bui | --bu)
+    ac_prev=build_alias ;;
+  -build=* | --build=* | --buil=* | --bui=* | --bu=*)
+    build_alias=$ac_optarg ;;
+
+  -cache-file | --cache-file | --cache-fil | --cache-fi \
+  | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
+    ac_prev=cache_file ;;
+  -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
+  | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
+    cache_file=$ac_optarg ;;
+
+  --config-cache | -C)
+    cache_file=config.cache ;;
+
+  -datadir | --datadir | --datadi | --datad)
+    ac_prev=datadir ;;
+  -datadir=* | --datadir=* | --datadi=* | --datad=*)
+    datadir=$ac_optarg ;;
+
+  -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \
+  | --dataroo | --dataro | --datar)
+    ac_prev=datarootdir ;;
+  -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \
+  | --dataroot=* | --dataroo=* | --dataro=* | --datar=*)
+    datarootdir=$ac_optarg ;;
+
+  -disable-* | --disable-*)
+    ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+      as_fn_error $? "invalid feature name: $ac_useropt"
+    ac_useropt_orig=$ac_useropt
+    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+    case $ac_user_opts in
+      *"
+"enable_$ac_useropt"
+"*) ;;
+      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig"
+	 ac_unrecognized_sep=', ';;
+    esac
+    eval enable_$ac_useropt=no ;;
+
+  -docdir | --docdir | --docdi | --doc | --do)
+    ac_prev=docdir ;;
+  -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*)
+    docdir=$ac_optarg ;;
+
+  -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv)
+    ac_prev=dvidir ;;
+  -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*)
+    dvidir=$ac_optarg ;;
+
+  -enable-* | --enable-*)
+    ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+      as_fn_error $? "invalid feature name: $ac_useropt"
+    ac_useropt_orig=$ac_useropt
+    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+    case $ac_user_opts in
+      *"
+"enable_$ac_useropt"
+"*) ;;
+      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig"
+	 ac_unrecognized_sep=', ';;
+    esac
+    eval enable_$ac_useropt=\$ac_optarg ;;
+
+  -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
+  | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
+  | --exec | --exe | --ex)
+    ac_prev=exec_prefix ;;
+  -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
+  | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
+  | --exec=* | --exe=* | --ex=*)
+    exec_prefix=$ac_optarg ;;
+
+  -gas | --gas | --ga | --g)
+    # Obsolete; use --with-gas.
+    with_gas=yes ;;
+
+  -help | --help | --hel | --he | -h)
+    ac_init_help=long ;;
+  -help=r* | --help=r* | --hel=r* | --he=r* | -hr*)
+    ac_init_help=recursive ;;
+  -help=s* | --help=s* | --hel=s* | --he=s* | -hs*)
+    ac_init_help=short ;;
+
+  -host | --host | --hos | --ho)
+    ac_prev=host_alias ;;
+  -host=* | --host=* | --hos=* | --ho=*)
+    host_alias=$ac_optarg ;;
+
+  -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht)
+    ac_prev=htmldir ;;
+  -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \
+  | --ht=*)
+    htmldir=$ac_optarg ;;
+
+  -includedir | --includedir | --includedi | --included | --include \
+  | --includ | --inclu | --incl | --inc)
+    ac_prev=includedir ;;
+  -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \
+  | --includ=* | --inclu=* | --incl=* | --inc=*)
+    includedir=$ac_optarg ;;
+
+  -infodir | --infodir | --infodi | --infod | --info | --inf)
+    ac_prev=infodir ;;
+  -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)
+    infodir=$ac_optarg ;;
+
+  -libdir | --libdir | --libdi | --libd)
+    ac_prev=libdir ;;
+  -libdir=* | --libdir=* | --libdi=* | --libd=*)
+    libdir=$ac_optarg ;;
+
+  -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \
+  | --libexe | --libex | --libe)
+    ac_prev=libexecdir ;;
+  -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \
+  | --libexe=* | --libex=* | --libe=*)
+    libexecdir=$ac_optarg ;;
+
+  -localedir | --localedir | --localedi | --localed | --locale)
+    ac_prev=localedir ;;
+  -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*)
+    localedir=$ac_optarg ;;
+
+  -localstatedir | --localstatedir | --localstatedi | --localstated \
+  | --localstate | --localstat | --localsta | --localst | --locals)
+    ac_prev=localstatedir ;;
+  -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
+  | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*)
+    localstatedir=$ac_optarg ;;
+
+  -mandir | --mandir | --mandi | --mand | --man | --ma | --m)
+    ac_prev=mandir ;;
+  -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)
+    mandir=$ac_optarg ;;
+
+  -nfp | --nfp | --nf)
+    # Obsolete; use --without-fp.
+    with_fp=no ;;
+
+  -no-create | --no-create | --no-creat | --no-crea | --no-cre \
+  | --no-cr | --no-c | -n)
+    no_create=yes ;;
+
+  -no-recursion | --no-recursion | --no-recursio | --no-recursi \
+  | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)
+    no_recursion=yes ;;
+
+  -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \
+  | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \
+  | --oldin | --oldi | --old | --ol | --o)
+    ac_prev=oldincludedir ;;
+  -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \
+  | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \
+  | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)
+    oldincludedir=$ac_optarg ;;
+
+  -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
+    ac_prev=prefix ;;
+  -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
+    prefix=$ac_optarg ;;
+
+  -program-prefix | --program-prefix | --program-prefi | --program-pref \
+  | --program-pre | --program-pr | --program-p)
+    ac_prev=program_prefix ;;
+  -program-prefix=* | --program-prefix=* | --program-prefi=* \
+  | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)
+    program_prefix=$ac_optarg ;;
+
+  -program-suffix | --program-suffix | --program-suffi | --program-suff \
+  | --program-suf | --program-su | --program-s)
+    ac_prev=program_suffix ;;
+  -program-suffix=* | --program-suffix=* | --program-suffi=* \
+  | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)
+    program_suffix=$ac_optarg ;;
+
+  -program-transform-name | --program-transform-name \
+  | --program-transform-nam | --program-transform-na \
+  | --program-transform-n | --program-transform- \
+  | --program-transform | --program-transfor \
+  | --program-transfo | --program-transf \
+  | --program-trans | --program-tran \
+  | --progr-tra | --program-tr | --program-t)
+    ac_prev=program_transform_name ;;
+  -program-transform-name=* | --program-transform-name=* \
+  | --program-transform-nam=* | --program-transform-na=* \
+  | --program-transform-n=* | --program-transform-=* \
+  | --program-transform=* | --program-transfor=* \
+  | --program-transfo=* | --program-transf=* \
+  | --program-trans=* | --program-tran=* \
+  | --progr-tra=* | --program-tr=* | --program-t=*)
+    program_transform_name=$ac_optarg ;;
+
+  -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd)
+    ac_prev=pdfdir ;;
+  -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*)
+    pdfdir=$ac_optarg ;;
+
+  -psdir | --psdir | --psdi | --psd | --ps)
+    ac_prev=psdir ;;
+  -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*)
+    psdir=$ac_optarg ;;
+
+  -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+  | -silent | --silent | --silen | --sile | --sil)
+    silent=yes ;;
+
+  -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
+    ac_prev=sbindir ;;
+  -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
+  | --sbi=* | --sb=*)
+    sbindir=$ac_optarg ;;
+
+  -sharedstatedir | --sharedstatedir | --sharedstatedi \
+  | --sharedstated | --sharedstate | --sharedstat | --sharedsta \
+  | --sharedst | --shareds | --shared | --share | --shar \
+  | --sha | --sh)
+    ac_prev=sharedstatedir ;;
+  -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \
+  | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \
+  | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \
+  | --sha=* | --sh=*)
+    sharedstatedir=$ac_optarg ;;
+
+  -site | --site | --sit)
+    ac_prev=site ;;
+  -site=* | --site=* | --sit=*)
+    site=$ac_optarg ;;
+
+  -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
+    ac_prev=srcdir ;;
+  -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
+    srcdir=$ac_optarg ;;
+
+  -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \
+  | --syscon | --sysco | --sysc | --sys | --sy)
+    ac_prev=sysconfdir ;;
+  -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \
+  | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)
+    sysconfdir=$ac_optarg ;;
+
+  -target | --target | --targe | --targ | --tar | --ta | --t)
+    ac_prev=target_alias ;;
+  -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
+    target_alias=$ac_optarg ;;
+
+  -v | -verbose | --verbose | --verbos | --verbo | --verb)
+    verbose=yes ;;
+
+  -version | --version | --versio | --versi | --vers | -V)
+    ac_init_version=: ;;
+
+  -with-* | --with-*)
+    ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+      as_fn_error $? "invalid package name: $ac_useropt"
+    ac_useropt_orig=$ac_useropt
+    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+    case $ac_user_opts in
+      *"
+"with_$ac_useropt"
+"*) ;;
+      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig"
+	 ac_unrecognized_sep=', ';;
+    esac
+    eval with_$ac_useropt=\$ac_optarg ;;
+
+  -without-* | --without-*)
+    ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+      as_fn_error $? "invalid package name: $ac_useropt"
+    ac_useropt_orig=$ac_useropt
+    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+    case $ac_user_opts in
+      *"
+"with_$ac_useropt"
+"*) ;;
+      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig"
+	 ac_unrecognized_sep=', ';;
+    esac
+    eval with_$ac_useropt=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 ;;
+
+  -*) as_fn_error $? "unrecognized option: \`$ac_option'
+Try \`$0 --help' for more information"
+    ;;
+
+  *=*)
+    ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='`
+    # Reject names that are not valid shell variable names.
+    case $ac_envvar in #(
+      '' | [0-9]* | *[!_$as_cr_alnum]* )
+      as_fn_error $? "invalid variable name: \`$ac_envvar'" ;;
+    esac
+    eval $ac_envvar=\$ac_optarg
+    export $ac_envvar ;;
+
+  *)
+    # FIXME: should be removed in autoconf 3.0.
+    $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2
+    expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null &&
+      $as_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'`
+  as_fn_error $? "missing argument to $ac_option"
+fi
+
+if test -n "$ac_unrecognized_opts"; then
+  case $enable_option_checking in
+    no) ;;
+    fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;;
+    *)     $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;;
+  esac
+fi
+
+# Check all directory arguments for consistency.
+for ac_var in	exec_prefix prefix bindir sbindir libexecdir datarootdir \
+		datadir sysconfdir sharedstatedir localstatedir includedir \
+		oldincludedir docdir infodir htmldir dvidir pdfdir psdir \
+		libdir localedir mandir
+do
+  eval ac_val=\$$ac_var
+  # Remove trailing slashes.
+  case $ac_val in
+    */ )
+      ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'`
+      eval $ac_var=\$ac_val;;
+  esac
+  # Be sure to have absolute directory names.
+  case $ac_val in
+    [\\/$]* | ?:[\\/]* )  continue;;
+    NONE | '' ) case $ac_var in *prefix ) continue;; esac;;
+  esac
+  as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val"
+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
+  elif test "x$build_alias" != "x$host_alias"; then
+    cross_compiling=yes
+  fi
+fi
+
+ac_tool_prefix=
+test -n "$host_alias" && ac_tool_prefix=$host_alias-
+
+test "$silent" = yes && exec 6>/dev/null
+
+
+ac_pwd=`pwd` && test -n "$ac_pwd" &&
+ac_ls_di=`ls -di .` &&
+ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` ||
+  as_fn_error $? "working directory cannot be determined"
+test "X$ac_ls_di" = "X$ac_pwd_ls_di" ||
+  as_fn_error $? "pwd does not report name of working directory"
+
+
+# Find the source files, if location was not specified.
+if test -z "$srcdir"; then
+  ac_srcdir_defaulted=yes
+  # Try the directory containing this script, then the parent directory.
+  ac_confdir=`$as_dirname -- "$as_myself" ||
+$as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$as_myself" : 'X\(//\)[^/]' \| \
+	 X"$as_myself" : 'X\(//\)$' \| \
+	 X"$as_myself" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$as_myself" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)[^/].*/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+  srcdir=$ac_confdir
+  if test ! -r "$srcdir/$ac_unique_file"; then
+    srcdir=..
+  fi
+else
+  ac_srcdir_defaulted=no
+fi
+if test ! -r "$srcdir/$ac_unique_file"; then
+  test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .."
+  as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir"
+fi
+ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work"
+ac_abs_confdir=`(
+	cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg"
+	pwd)`
+# When building in place, set srcdir=.
+if test "$ac_abs_confdir" = "$ac_pwd"; then
+  srcdir=.
+fi
+# Remove unnecessary trailing slashes from srcdir.
+# Double slashes in file names in object file debugging info
+# mess up M-x gdb in Emacs.
+case $srcdir in
+*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;;
+esac
+for ac_var in $ac_precious_vars; do
+  eval ac_env_${ac_var}_set=\${${ac_var}+set}
+  eval ac_env_${ac_var}_value=\$${ac_var}
+  eval ac_cv_env_${ac_var}_set=\${${ac_var}+set}
+  eval ac_cv_env_${ac_var}_value=\$${ac_var}
+done
+
+#
+# Report the --help message.
+#
+if test "$ac_init_help" = "long"; then
+  # Omit some internal or obsolete options to make the list less imposing.
+  # This message is too long to be a string in the A/UX 3.1 sh.
+  cat <<_ACEOF
+\`configure' configures netCDF-Fortran 4.4.1 to adapt to many kinds of systems.
+
+Usage: $0 [OPTION]... [VAR=VALUE]...
+
+To assign environment variables (e.g., CC, CFLAGS...), specify them as
+VAR=VALUE.  See below for descriptions of some of the useful variables.
+
+Defaults for the options are specified in brackets.
+
+Configuration:
+  -h, --help              display this help and exit
+      --help=short        display options specific to this package
+      --help=recursive    display the short help of all the included packages
+  -V, --version           display version information and exit
+  -q, --quiet, --silent   do not print \`checking ...' messages
+      --cache-file=FILE   cache test results in FILE [disabled]
+  -C, --config-cache      alias for \`--cache-file=config.cache'
+  -n, --no-create         do not create output files
+      --srcdir=DIR        find the sources in DIR [configure dir or \`..']
+
+Installation directories:
+  --prefix=PREFIX         install architecture-independent files in PREFIX
+                          [$ac_default_prefix]
+  --exec-prefix=EPREFIX   install architecture-dependent files in EPREFIX
+                          [PREFIX]
+
+By default, \`make install' will install all the files in
+\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc.  You can specify
+an installation prefix other than \`$ac_default_prefix' using \`--prefix',
+for instance \`--prefix=\$HOME'.
+
+For better control, use the options below.
+
+Fine tuning of the installation directories:
+  --bindir=DIR            user executables [EPREFIX/bin]
+  --sbindir=DIR           system admin executables [EPREFIX/sbin]
+  --libexecdir=DIR        program executables [EPREFIX/libexec]
+  --sysconfdir=DIR        read-only single-machine data [PREFIX/etc]
+  --sharedstatedir=DIR    modifiable architecture-independent data [PREFIX/com]
+  --localstatedir=DIR     modifiable single-machine data [PREFIX/var]
+  --libdir=DIR            object code libraries [EPREFIX/lib]
+  --includedir=DIR        C header files [PREFIX/include]
+  --oldincludedir=DIR     C header files for non-gcc [/usr/include]
+  --datarootdir=DIR       read-only arch.-independent data root [PREFIX/share]
+  --datadir=DIR           read-only architecture-independent data [DATAROOTDIR]
+  --infodir=DIR           info documentation [DATAROOTDIR/info]
+  --localedir=DIR         locale-dependent data [DATAROOTDIR/locale]
+  --mandir=DIR            man documentation [DATAROOTDIR/man]
+  --docdir=DIR            documentation root [DATAROOTDIR/doc/netcdf-fortran]
+  --htmldir=DIR           html documentation [DOCDIR]
+  --dvidir=DIR            dvi documentation [DOCDIR]
+  --pdfdir=DIR            pdf documentation [DOCDIR]
+  --psdir=DIR             ps documentation [DOCDIR]
+_ACEOF
+
+  cat <<\_ACEOF
+
+Program names:
+  --program-prefix=PREFIX            prepend PREFIX to installed program names
+  --program-suffix=SUFFIX            append SUFFIX to installed program names
+  --program-transform-name=PROGRAM   run sed PROGRAM on installed program names
+
+System types:
+  --build=BUILD     configure for building on BUILD [guessed]
+  --host=HOST       cross-compile to build programs to run on HOST [BUILD]
+  --target=TARGET   configure for building compilers for TARGET [HOST]
+_ACEOF
+fi
+
+if test -n "$ac_init_help"; then
+  case $ac_init_help in
+     short | recursive ) echo "Configuration of netCDF-Fortran 4.4.1:";;
+   esac
+  cat <<\_ACEOF
+
+Optional Features:
+  --disable-option-checking  ignore unrecognized --enable/--with options
+  --disable-FEATURE       do not include FEATURE (same as --enable-FEATURE=no)
+  --enable-FEATURE[=ARG]  include FEATURE [ARG=yes]
+  --enable-silent-rules   less verbose build output (undo: "make V=1")
+  --disable-silent-rules  verbose build output (undo: "make V=0")
+  --enable-maintainer-mode
+                          enable make rules and dependencies not useful (and
+                          sometimes confusing) to the casual installer
+  --enable-valgrind-tests build with valgrind-tests (valgrind is required,
+                          static builds only)
+  --enable-parallel-tests Run extra parallel IO tests. Ignored if netCDF-4 is
+                          not enabled, or built on a system without parallel
+                          I/O support.
+  --enable-extra-tests    run some extra tests that may not pass because of
+                          known issues
+  --enable-doxygen        Enable generation of documentation with doxygen.
+  --enable-dot            Use dot (provided by graphviz) to generate charts
+                          and graphs in the doxygen-based documentation.
+  --enable-internal-docs  Include documentation of library internals. This is
+                          of interest only to those developing the netCDF
+                          library.
+  --enable-dependency-tracking
+                          do not reject slow dependency extractors
+  --disable-dependency-tracking
+                          speeds up one-time build
+  --disable-f03-compiler-check
+                          disable check of ISO_C_BINDING support in Fortran
+                          compiler
+  --disable-f03           suppress netCDF Fortran 2003 native code
+  --disable-fortran-type-check
+                          cause the Fortran type sizes checks to be skipped
+  --enable-large-file-tests
+                          Run tests which create very large data files (~13 GB
+                          disk space required, but it will be recovered when
+                          tests are complete). See option --with-temp-large to
+                          specify temporary directory
+  --enable-benchmarks     Run benchmarks. This is an experimental feature.
+  --enable-shared[=PKGS]  build shared libraries [default=yes]
+  --enable-static[=PKGS]  build static libraries [default=yes]
+  --enable-fast-install[=PKGS]
+                          optimize for fast installation [default=yes]
+  --disable-libtool-lock  avoid locking (might break parallel builds)
+  --disable-largefile     omit support for large files
+  --enable-extra-example-tests
+                          Run extra example tests; requires GNU sed. Ignored
+                          if netCDF-4 is not enabled.
+  --enable-dll            build a win32 DLL (only works on mingw)
+
+Optional Packages:
+  --with-PACKAGE[=ARG]    use PACKAGE [ARG=yes]
+  --without-PACKAGE       do not use PACKAGE (same as --with-PACKAGE=no)
+  --with-temp-large=<directory>
+                          specify directory where large files (i.e. >2 GB)
+                          will be written, if large files tests are run with
+                          --enable-large-file-tests
+  --with-pic[=PKGS]       try to use only PIC/non-PIC objects [default=use
+                          both]
+  --with-gnu-ld           assume the C compiler uses GNU ld [default=no]
+  --with-sysroot=DIR Search for dependent libraries within DIR
+                        (or the compiler's sysroot if not specified).
+
+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>
+  LIBS        libraries to pass to the linker, e.g. -l<library>
+  CPPFLAGS    (Objective) C/C++ preprocessor flags, e.g. -I<include dir> if
+              you have headers in a nonstandard directory <include dir>
+  FC          Fortran compiler command
+  FCFLAGS     Fortran compiler flags
+  F77         Fortran 77 compiler command
+  FFLAGS      Fortran 77 compiler flags
+  CPP         C preprocessor
+
+Use these variables to override the choices made by `configure' or to help
+it to find libraries and programs with nonstandard names/locations.
+
+Report bugs to <support-netcdf at unidata.ucar.edu>.
+_ACEOF
+ac_status=$?
+fi
+
+if test "$ac_init_help" = "recursive"; then
+  # If there are subdirs, report their specific --help.
+  for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue
+    test -d "$ac_dir" ||
+      { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } ||
+      continue
+    ac_builddir=.
+
+case "$ac_dir" in
+.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
+*)
+  ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'`
+  # A ".." for each directory in $ac_dir_suffix.
+  ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
+  case $ac_top_builddir_sub in
+  "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
+  *)  ac_top_build_prefix=$ac_top_builddir_sub/ ;;
+  esac ;;
+esac
+ac_abs_top_builddir=$ac_pwd
+ac_abs_builddir=$ac_pwd$ac_dir_suffix
+# for backward compatibility:
+ac_top_builddir=$ac_top_build_prefix
+
+case $srcdir in
+  .)  # We are building in place.
+    ac_srcdir=.
+    ac_top_srcdir=$ac_top_builddir_sub
+    ac_abs_top_srcdir=$ac_pwd ;;
+  [\\/]* | ?:[\\/]* )  # Absolute name.
+    ac_srcdir=$srcdir$ac_dir_suffix;
+    ac_top_srcdir=$srcdir
+    ac_abs_top_srcdir=$srcdir ;;
+  *) # Relative name.
+    ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
+    ac_top_srcdir=$ac_top_build_prefix$srcdir
+    ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
+esac
+ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
+
+    cd "$ac_dir" || { ac_status=$?; continue; }
+    # Check for guested configure.
+    if test -f "$ac_srcdir/configure.gnu"; then
+      echo &&
+      $SHELL "$ac_srcdir/configure.gnu" --help=recursive
+    elif test -f "$ac_srcdir/configure"; then
+      echo &&
+      $SHELL "$ac_srcdir/configure" --help=recursive
+    else
+      $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2
+    fi || ac_status=$?
+    cd "$ac_pwd" || { ac_status=$?; break; }
+  done
+fi
+
+test -n "$ac_init_help" && exit $ac_status
+if $ac_init_version; then
+  cat <<\_ACEOF
+netCDF-Fortran configure 4.4.1
+generated by GNU Autoconf 2.69
+
+Copyright (C) 2012 Free Software Foundation, Inc.
+This configure script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it.
+_ACEOF
+  exit
+fi
+
+## ------------------------ ##
+## Autoconf initialization. ##
+## ------------------------ ##
+
+# ac_fn_c_try_compile LINENO
+# --------------------------
+# Try to compile conftest.$ac_ext, and return whether this succeeded.
+ac_fn_c_try_compile ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  rm -f conftest.$ac_objext
+  if { { ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_compile") 2>conftest.err
+  ac_status=$?
+  if test -s conftest.err; then
+    grep -v '^ *+' conftest.err >conftest.er1
+    cat conftest.er1 >&5
+    mv -f conftest.er1 conftest.err
+  fi
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then :
+  ac_retval=0
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+	ac_retval=1
+fi
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+  as_fn_set_status $ac_retval
+
+} # ac_fn_c_try_compile
+
+# ac_fn_fc_try_compile LINENO
+# ---------------------------
+# Try to compile conftest.$ac_ext, and return whether this succeeded.
+ac_fn_fc_try_compile ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  rm -f conftest.$ac_objext
+  if { { ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_compile") 2>conftest.err
+  ac_status=$?
+  if test -s conftest.err; then
+    grep -v '^ *+' conftest.err >conftest.er1
+    cat conftest.er1 >&5
+    mv -f conftest.er1 conftest.err
+  fi
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && {
+	 test -z "$ac_fc_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then :
+  ac_retval=0
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+	ac_retval=1
+fi
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+  as_fn_set_status $ac_retval
+
+} # ac_fn_fc_try_compile
+
+# ac_fn_f77_try_compile LINENO
+# ----------------------------
+# Try to compile conftest.$ac_ext, and return whether this succeeded.
+ac_fn_f77_try_compile ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  rm -f conftest.$ac_objext
+  if { { ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_compile") 2>conftest.err
+  ac_status=$?
+  if test -s conftest.err; then
+    grep -v '^ *+' conftest.err >conftest.er1
+    cat conftest.er1 >&5
+    mv -f conftest.er1 conftest.err
+  fi
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && {
+	 test -z "$ac_f77_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then :
+  ac_retval=0
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+	ac_retval=1
+fi
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+  as_fn_set_status $ac_retval
+
+} # ac_fn_f77_try_compile
+
+# ac_fn_c_try_link LINENO
+# -----------------------
+# Try to link conftest.$ac_ext, and return whether this succeeded.
+ac_fn_c_try_link ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  rm -f conftest.$ac_objext conftest$ac_exeext
+  if { { ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_link") 2>conftest.err
+  ac_status=$?
+  if test -s conftest.err; then
+    grep -v '^ *+' conftest.err >conftest.er1
+    cat conftest.er1 >&5
+    mv -f conftest.er1 conftest.err
+  fi
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest$ac_exeext && {
+	 test "$cross_compiling" = yes ||
+	 test -x conftest$ac_exeext
+       }; then :
+  ac_retval=0
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+	ac_retval=1
+fi
+  # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information
+  # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would
+  # interfere with the next link command; also delete a directory that is
+  # left behind by Apple's compiler.  We do this before executing the actions.
+  rm -rf conftest.dSYM conftest_ipa8_conftest.oo
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+  as_fn_set_status $ac_retval
+
+} # ac_fn_c_try_link
+
+# ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES
+# -------------------------------------------------------
+# Tests whether HEADER exists and can be compiled using the include files in
+# INCLUDES, setting the cache variable VAR accordingly.
+ac_fn_c_check_header_compile ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+$as_echo_n "checking for $2... " >&6; }
+if eval \${$3+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$4
+#include <$2>
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  eval "$3=yes"
+else
+  eval "$3=no"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+eval ac_res=\$$3
+	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+
+} # ac_fn_c_check_header_compile
+
+# ac_fn_c_try_cpp LINENO
+# ----------------------
+# Try to preprocess conftest.$ac_ext, and return whether this succeeded.
+ac_fn_c_try_cpp ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  if { { ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err
+  ac_status=$?
+  if test -s conftest.err; then
+    grep -v '^ *+' conftest.err >conftest.er1
+    cat conftest.er1 >&5
+    mv -f conftest.er1 conftest.err
+  fi
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } > conftest.i && {
+	 test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       }; then :
+  ac_retval=0
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+    ac_retval=1
+fi
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+  as_fn_set_status $ac_retval
+
+} # ac_fn_c_try_cpp
+
+# ac_fn_c_try_run LINENO
+# ----------------------
+# Try to link conftest.$ac_ext, and return whether this succeeded. Assumes
+# that executables *can* be run.
+ac_fn_c_try_run ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  if { { ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_link") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && { ac_try='./conftest$ac_exeext'
+  { { case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; }; then :
+  ac_retval=0
+else
+  $as_echo "$as_me: program exited with status $ac_status" >&5
+       $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_retval=$ac_status
+fi
+  rm -rf conftest.dSYM conftest_ipa8_conftest.oo
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+  as_fn_set_status $ac_retval
+
+} # ac_fn_c_try_run
+
+# ac_fn_c_check_func LINENO FUNC VAR
+# ----------------------------------
+# Tests whether FUNC exists, setting the cache variable VAR accordingly
+ac_fn_c_check_func ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+$as_echo_n "checking for $2... " >&6; }
+if eval \${$3+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+/* Define $2 to an innocuous variant, in case <limits.h> declares $2.
+   For example, HP-UX 11i <limits.h> declares gettimeofday.  */
+#define $2 innocuous_$2
+
+/* System header to define __stub macros and hopefully few prototypes,
+    which can conflict with char $2 (); below.
+    Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+    <limits.h> exists even on freestanding compilers.  */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef $2
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char $2 ();
+/* The GNU C library defines this for functions which it implements
+    to always fail with ENOSYS.  Some functions are actually named
+    something starting with __ and the normal name is an alias.  */
+#if defined __stub_$2 || defined __stub___$2
+choke me
+#endif
+
+int
+main ()
+{
+return $2 ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  eval "$3=yes"
+else
+  eval "$3=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+fi
+eval ac_res=\$$3
+	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+
+} # ac_fn_c_check_func
+
+# ac_fn_f77_try_link LINENO
+# -------------------------
+# Try to link conftest.$ac_ext, and return whether this succeeded.
+ac_fn_f77_try_link ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  rm -f conftest.$ac_objext conftest$ac_exeext
+  if { { ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_link") 2>conftest.err
+  ac_status=$?
+  if test -s conftest.err; then
+    grep -v '^ *+' conftest.err >conftest.er1
+    cat conftest.er1 >&5
+    mv -f conftest.er1 conftest.err
+  fi
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && {
+	 test -z "$ac_f77_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest$ac_exeext && {
+	 test "$cross_compiling" = yes ||
+	 test -x conftest$ac_exeext
+       }; then :
+  ac_retval=0
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+	ac_retval=1
+fi
+  # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information
+  # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would
+  # interfere with the next link command; also delete a directory that is
+  # left behind by Apple's compiler.  We do this before executing the actions.
+  rm -rf conftest.dSYM conftest_ipa8_conftest.oo
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+  as_fn_set_status $ac_retval
+
+} # ac_fn_f77_try_link
+
+# ac_fn_fc_try_link LINENO
+# ------------------------
+# Try to link conftest.$ac_ext, and return whether this succeeded.
+ac_fn_fc_try_link ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  rm -f conftest.$ac_objext conftest$ac_exeext
+  if { { ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_link") 2>conftest.err
+  ac_status=$?
+  if test -s conftest.err; then
+    grep -v '^ *+' conftest.err >conftest.er1
+    cat conftest.er1 >&5
+    mv -f conftest.er1 conftest.err
+  fi
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && {
+	 test -z "$ac_fc_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest$ac_exeext && {
+	 test "$cross_compiling" = yes ||
+	 test -x conftest$ac_exeext
+       }; then :
+  ac_retval=0
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+	ac_retval=1
+fi
+  # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information
+  # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would
+  # interfere with the next link command; also delete a directory that is
+  # left behind by Apple's compiler.  We do this before executing the actions.
+  rm -rf conftest.dSYM conftest_ipa8_conftest.oo
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+  as_fn_set_status $ac_retval
+
+} # ac_fn_fc_try_link
+
+# ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES
+# -------------------------------------------------------
+# Tests whether HEADER exists, giving a warning if it cannot be compiled using
+# the include files in INCLUDES and setting the cache variable VAR
+# accordingly.
+ac_fn_c_check_header_mongrel ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  if eval \${$3+:} false; then :
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+$as_echo_n "checking for $2... " >&6; }
+if eval \${$3+:} false; then :
+  $as_echo_n "(cached) " >&6
+fi
+eval ac_res=\$$3
+	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+else
+  # Is the header compilable?
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5
+$as_echo_n "checking $2 usability... " >&6; }
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$4
+#include <$2>
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_header_compiler=yes
+else
+  ac_header_compiler=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5
+$as_echo "$ac_header_compiler" >&6; }
+
+# Is the header present?
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5
+$as_echo_n "checking $2 presence... " >&6; }
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <$2>
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+  ac_header_preproc=yes
+else
+  ac_header_preproc=no
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5
+$as_echo "$ac_header_preproc" >&6; }
+
+# So?  What about this header?
+case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #((
+  yes:no: )
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5
+$as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;}
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5
+$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;}
+    ;;
+  no:yes:* )
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5
+$as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;}
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2:     check for missing prerequisite headers?" >&5
+$as_echo "$as_me: WARNING: $2:     check for missing prerequisite headers?" >&2;}
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5
+$as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;}
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2:     section \"Present But Cannot Be Compiled\"" >&5
+$as_echo "$as_me: WARNING: $2:     section \"Present But Cannot Be Compiled\"" >&2;}
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5
+$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;}
+( $as_echo "## ---------------------------------------------- ##
+## Report this to support-netcdf at unidata.ucar.edu ##
+## ---------------------------------------------- ##"
+     ) | sed "s/^/$as_me: WARNING:     /" >&2
+    ;;
+esac
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+$as_echo_n "checking for $2... " >&6; }
+if eval \${$3+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  eval "$3=\$ac_header_compiler"
+fi
+eval ac_res=\$$3
+	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+fi
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+
+} # ac_fn_c_check_header_mongrel
+
+# ac_fn_c_check_type LINENO TYPE VAR INCLUDES
+# -------------------------------------------
+# Tests whether TYPE exists after having included INCLUDES, setting cache
+# variable VAR accordingly.
+ac_fn_c_check_type ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+$as_echo_n "checking for $2... " >&6; }
+if eval \${$3+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  eval "$3=no"
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$4
+int
+main ()
+{
+if (sizeof ($2))
+	 return 0;
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$4
+int
+main ()
+{
+if (sizeof (($2)))
+	    return 0;
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+
+else
+  eval "$3=yes"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+eval ac_res=\$$3
+	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+
+} # ac_fn_c_check_type
+
+# ac_fn_c_compute_int LINENO EXPR VAR INCLUDES
+# --------------------------------------------
+# Tries to find the compile-time value of EXPR in a program that includes
+# INCLUDES, setting VAR accordingly. Returns whether the value could be
+# computed
+ac_fn_c_compute_int ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  if test "$cross_compiling" = yes; then
+    # Depending upon the size, compute the lo and hi bounds.
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$4
+int
+main ()
+{
+static int test_array [1 - 2 * !(($2) >= 0)];
+test_array [0] = 0;
+return test_array [0];
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_lo=0 ac_mid=0
+  while :; do
+    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$4
+int
+main ()
+{
+static int test_array [1 - 2 * !(($2) <= $ac_mid)];
+test_array [0] = 0;
+return test_array [0];
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_hi=$ac_mid; break
+else
+  as_fn_arith $ac_mid + 1 && ac_lo=$as_val
+			if test $ac_lo -le $ac_mid; then
+			  ac_lo= ac_hi=
+			  break
+			fi
+			as_fn_arith 2 '*' $ac_mid + 1 && ac_mid=$as_val
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+  done
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$4
+int
+main ()
+{
+static int test_array [1 - 2 * !(($2) < 0)];
+test_array [0] = 0;
+return test_array [0];
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_hi=-1 ac_mid=-1
+  while :; do
+    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$4
+int
+main ()
+{
+static int test_array [1 - 2 * !(($2) >= $ac_mid)];
+test_array [0] = 0;
+return test_array [0];
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_lo=$ac_mid; break
+else
+  as_fn_arith '(' $ac_mid ')' - 1 && ac_hi=$as_val
+			if test $ac_mid -le $ac_hi; then
+			  ac_lo= ac_hi=
+			  break
+			fi
+			as_fn_arith 2 '*' $ac_mid && ac_mid=$as_val
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+  done
+else
+  ac_lo= ac_hi=
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+# Binary search between lo and hi bounds.
+while test "x$ac_lo" != "x$ac_hi"; do
+  as_fn_arith '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo && ac_mid=$as_val
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$4
+int
+main ()
+{
+static int test_array [1 - 2 * !(($2) <= $ac_mid)];
+test_array [0] = 0;
+return test_array [0];
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_hi=$ac_mid
+else
+  as_fn_arith '(' $ac_mid ')' + 1 && ac_lo=$as_val
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+done
+case $ac_lo in #((
+?*) eval "$3=\$ac_lo"; ac_retval=0 ;;
+'') ac_retval=1 ;;
+esac
+  else
+    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$4
+static long int longval () { return $2; }
+static unsigned long int ulongval () { return $2; }
+#include <stdio.h>
+#include <stdlib.h>
+int
+main ()
+{
+
+  FILE *f = fopen ("conftest.val", "w");
+  if (! f)
+    return 1;
+  if (($2) < 0)
+    {
+      long int i = longval ();
+      if (i != ($2))
+	return 1;
+      fprintf (f, "%ld", i);
+    }
+  else
+    {
+      unsigned long int i = ulongval ();
+      if (i != ($2))
+	return 1;
+      fprintf (f, "%lu", i);
+    }
+  /* Do not output a trailing newline, as this causes \r\n confusion
+     on some platforms.  */
+  return ferror (f) || fclose (f) != 0;
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"; then :
+  echo >>conftest.val; read $3 <conftest.val; ac_retval=0
+else
+  ac_retval=1
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+rm -f conftest.val
+
+  fi
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+  as_fn_set_status $ac_retval
+
+} # ac_fn_c_compute_int
+cat >config.log <<_ACEOF
+This file contains any messages produced by compilers while
+running configure, to aid debugging if configure makes a mistake.
+
+It was created by netCDF-Fortran $as_me 4.4.1, which was
+generated by GNU Autoconf 2.69.  Invocation command line was
+
+  $ $0 $@
+
+_ACEOF
+exec 5>>config.log
+{
+cat <<_ASUNAME
+## --------- ##
+## Platform. ##
+## --------- ##
+
+hostname = `(hostname || uname -n) 2>/dev/null | sed 1q`
+uname -m = `(uname -m) 2>/dev/null || echo unknown`
+uname -r = `(uname -r) 2>/dev/null || echo unknown`
+uname -s = `(uname -s) 2>/dev/null || echo unknown`
+uname -v = `(uname -v) 2>/dev/null || echo unknown`
+
+/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown`
+/bin/uname -X     = `(/bin/uname -X) 2>/dev/null     || echo unknown`
+
+/bin/arch              = `(/bin/arch) 2>/dev/null              || echo unknown`
+/usr/bin/arch -k       = `(/usr/bin/arch -k) 2>/dev/null       || echo unknown`
+/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown`
+/usr/bin/hostinfo      = `(/usr/bin/hostinfo) 2>/dev/null      || echo unknown`
+/bin/machine           = `(/bin/machine) 2>/dev/null           || echo unknown`
+/usr/bin/oslevel       = `(/usr/bin/oslevel) 2>/dev/null       || echo unknown`
+/bin/universe          = `(/bin/universe) 2>/dev/null          || echo unknown`
+
+_ASUNAME
+
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    $as_echo "PATH: $as_dir"
+  done
+IFS=$as_save_IFS
+
+} >&5
+
+cat >&5 <<_ACEOF
+
+
+## ----------- ##
+## Core tests. ##
+## ----------- ##
+
+_ACEOF
+
+
+# Keep a trace of the command line.
+# Strip out --no-create and --no-recursion so they do not pile up.
+# Strip out --silent because we don't want to record it for future runs.
+# Also quote any args containing shell meta-characters.
+# Make two passes to allow for proper duplicate-argument suppression.
+ac_configure_args=
+ac_configure_args0=
+ac_configure_args1=
+ac_must_keep_next=false
+for ac_pass in 1 2
+do
+  for ac_arg
+  do
+    case $ac_arg in
+    -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;;
+    -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+    | -silent | --silent | --silen | --sile | --sil)
+      continue ;;
+    *\'*)
+      ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
+    esac
+    case $ac_pass in
+    1) as_fn_append ac_configure_args0 " '$ac_arg'" ;;
+    2)
+      as_fn_append 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
+      as_fn_append ac_configure_args " '$ac_arg'"
+      ;;
+    esac
+  done
+done
+{ ac_configure_args0=; unset ac_configure_args0;}
+{ ac_configure_args1=; unset ac_configure_args1;}
+
+# When interrupted or exit'd, cleanup temporary files, and complete
+# config.log.  We remove comments because anyway the quotes in there
+# would cause problems or look ugly.
+# WARNING: Use '\'' to represent an apostrophe within the trap.
+# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug.
+trap 'exit_status=$?
+  # Save into config.log some information that might help in debugging.
+  {
+    echo
+
+    $as_echo "## ---------------- ##
+## Cache variables. ##
+## ---------------- ##"
+    echo
+    # The following way of writing the cache mishandles newlines in values,
+(
+  for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do
+    eval ac_val=\$$ac_var
+    case $ac_val in #(
+    *${as_nl}*)
+      case $ac_var in #(
+      *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
+$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
+      esac
+      case $ac_var in #(
+      _ | IFS | as_nl) ;; #(
+      BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(
+      *) { eval $ac_var=; unset $ac_var;} ;;
+      esac ;;
+    esac
+  done
+  (set) 2>&1 |
+    case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #(
+    *${as_nl}ac_space=\ *)
+      sed -n \
+	"s/'\''/'\''\\\\'\'''\''/g;
+	  s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p"
+      ;; #(
+    *)
+      sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
+      ;;
+    esac |
+    sort
+)
+    echo
+
+    $as_echo "## ----------------- ##
+## Output variables. ##
+## ----------------- ##"
+    echo
+    for ac_var in $ac_subst_vars
+    do
+      eval ac_val=\$$ac_var
+      case $ac_val in
+      *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
+      esac
+      $as_echo "$ac_var='\''$ac_val'\''"
+    done | sort
+    echo
+
+    if test -n "$ac_subst_files"; then
+      $as_echo "## ------------------- ##
+## File substitutions. ##
+## ------------------- ##"
+      echo
+      for ac_var in $ac_subst_files
+      do
+	eval ac_val=\$$ac_var
+	case $ac_val in
+	*\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
+	esac
+	$as_echo "$ac_var='\''$ac_val'\''"
+      done | sort
+      echo
+    fi
+
+    if test -s confdefs.h; then
+      $as_echo "## ----------- ##
+## confdefs.h. ##
+## ----------- ##"
+      echo
+      cat confdefs.h
+      echo
+    fi
+    test "$ac_signal" != 0 &&
+      $as_echo "$as_me: caught signal $ac_signal"
+    $as_echo "$as_me: exit $exit_status"
+  } >&5
+  rm -f core *.core core.conftest.* &&
+    rm -f -r conftest* confdefs* conf$$* $ac_clean_files &&
+    exit $exit_status
+' 0
+for ac_signal in 1 2 13 15; do
+  trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal
+done
+ac_signal=0
+
+# confdefs.h avoids OS command line length limits that DEFS can exceed.
+rm -f -r conftest* confdefs.h
+
+$as_echo "/* confdefs.h */" > 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
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_URL "$PACKAGE_URL"
+_ACEOF
+
+
+# Let the site file select an alternate cache file if it wants to.
+# Prefer an explicitly selected file to automatically selected ones.
+ac_site_file1=NONE
+ac_site_file2=NONE
+if test -n "$CONFIG_SITE"; then
+  # We do not want a PATH search for config.site.
+  case $CONFIG_SITE in #((
+    -*)  ac_site_file1=./$CONFIG_SITE;;
+    */*) ac_site_file1=$CONFIG_SITE;;
+    *)   ac_site_file1=./$CONFIG_SITE;;
+  esac
+elif test "x$prefix" != xNONE; then
+  ac_site_file1=$prefix/share/config.site
+  ac_site_file2=$prefix/etc/config.site
+else
+  ac_site_file1=$ac_default_prefix/share/config.site
+  ac_site_file2=$ac_default_prefix/etc/config.site
+fi
+for ac_site_file in "$ac_site_file1" "$ac_site_file2"
+do
+  test "x$ac_site_file" = xNONE && continue
+  if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5
+$as_echo "$as_me: loading site script $ac_site_file" >&6;}
+    sed 's/^/| /' "$ac_site_file" >&5
+    . "$ac_site_file" \
+      || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "failed to load site script $ac_site_file
+See \`config.log' for more details" "$LINENO" 5; }
+  fi
+done
+
+if test -r "$cache_file"; then
+  # Some versions of bash will fail to source /dev/null (special files
+  # actually), so we avoid doing that.  DJGPP emulates it as a regular file.
+  if test /dev/null != "$cache_file" && test -f "$cache_file"; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5
+$as_echo "$as_me: loading cache $cache_file" >&6;}
+    case $cache_file in
+      [\\/]* | ?:[\\/]* ) . "$cache_file";;
+      *)                      . "./$cache_file";;
+    esac
+  fi
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5
+$as_echo "$as_me: creating cache $cache_file" >&6;}
+  >$cache_file
+fi
+
+# Check that the precious variables saved in the cache have kept the same
+# value.
+ac_cache_corrupted=false
+for ac_var in $ac_precious_vars; do
+  eval ac_old_set=\$ac_cv_env_${ac_var}_set
+  eval ac_new_set=\$ac_env_${ac_var}_set
+  eval ac_old_val=\$ac_cv_env_${ac_var}_value
+  eval ac_new_val=\$ac_env_${ac_var}_value
+  case $ac_old_set,$ac_new_set in
+    set,)
+      { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5
+$as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;}
+      ac_cache_corrupted=: ;;
+    ,set)
+      { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5
+$as_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
+	# differences in whitespace do not lead to failure.
+	ac_old_val_w=`echo x $ac_old_val`
+	ac_new_val_w=`echo x $ac_new_val`
+	if test "$ac_old_val_w" != "$ac_new_val_w"; then
+	  { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5
+$as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;}
+	  ac_cache_corrupted=:
+	else
+	  { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5
+$as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;}
+	  eval $ac_var=\$ac_old_val
+	fi
+	{ $as_echo "$as_me:${as_lineno-$LINENO}:   former value:  \`$ac_old_val'" >&5
+$as_echo "$as_me:   former value:  \`$ac_old_val'" >&2;}
+	{ $as_echo "$as_me:${as_lineno-$LINENO}:   current value: \`$ac_new_val'" >&5
+$as_echo "$as_me:   current value: \`$ac_new_val'" >&2;}
+      fi;;
+  esac
+  # Pass precious variables to config.status.
+  if test "$ac_new_set" = set; then
+    case $ac_new_val in
+    *\'*) ac_arg=$ac_var=`$as_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.
+      *) as_fn_append ac_configure_args " '$ac_arg'" ;;
+    esac
+  fi
+done
+if $ac_cache_corrupted; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+  { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5
+$as_echo "$as_me: error: changes in the environment can compromise the build" >&2;}
+  as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5
+fi
+## -------------------- ##
+## Main body of script. ##
+## -------------------- ##
+
+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
+
+
+
+# Create the VERSION file, which contains the package version from
+# AC_INIT.
+echo -n 4.4.1>VERSION
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: netCDF-Fortran 4.4.1" >&5
+$as_echo "$as_me: netCDF-Fortran 4.4.1" >&6;}
+
+# Keep libtool macros in an m4 directory.
+
+
+# Find out about the host we're building on.
+ac_aux_dir=
+for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do
+  if test -f "$ac_dir/install-sh"; then
+    ac_aux_dir=$ac_dir
+    ac_install_sh="$ac_aux_dir/install-sh -c"
+    break
+  elif test -f "$ac_dir/install.sh"; then
+    ac_aux_dir=$ac_dir
+    ac_install_sh="$ac_aux_dir/install.sh -c"
+    break
+  elif test -f "$ac_dir/shtool"; then
+    ac_aux_dir=$ac_dir
+    ac_install_sh="$ac_aux_dir/shtool install -c"
+    break
+  fi
+done
+if test -z "$ac_aux_dir"; then
+  as_fn_error $? "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5
+fi
+
+# These three variables are undocumented and unsupported,
+# and are intended to be withdrawn in a future Autoconf release.
+# They can cause serious problems if a builder's source tree is in a directory
+# whose full name contains unusual characters.
+ac_config_guess="$SHELL $ac_aux_dir/config.guess"  # Please don't use this var.
+ac_config_sub="$SHELL $ac_aux_dir/config.sub"  # Please don't use this var.
+ac_configure="$SHELL $ac_aux_dir/configure"  # Please don't use this var.
+
+
+# Make sure we can run config.sub.
+$SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 ||
+  as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5
+$as_echo_n "checking build system type... " >&6; }
+if ${ac_cv_build+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_build_alias=$build_alias
+test "x$ac_build_alias" = x &&
+  ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"`
+test "x$ac_build_alias" = x &&
+  as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5
+ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` ||
+  as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5
+$as_echo "$ac_cv_build" >&6; }
+case $ac_cv_build in
+*-*-*) ;;
+*) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;;
+esac
+build=$ac_cv_build
+ac_save_IFS=$IFS; IFS='-'
+set x $ac_cv_build
+shift
+build_cpu=$1
+build_vendor=$2
+shift; shift
+# Remember, the first character of IFS is used to create $*,
+# except with old shells:
+build_os=$*
+IFS=$ac_save_IFS
+case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5
+$as_echo_n "checking host system type... " >&6; }
+if ${ac_cv_host+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test "x$host_alias" = x; then
+  ac_cv_host=$ac_cv_build
+else
+  ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` ||
+    as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5
+$as_echo "$ac_cv_host" >&6; }
+case $ac_cv_host in
+*-*-*) ;;
+*) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;;
+esac
+host=$ac_cv_host
+ac_save_IFS=$IFS; IFS='-'
+set x $ac_cv_host
+shift
+host_cpu=$1
+host_vendor=$2
+shift; shift
+# Remember, the first character of IFS is used to create $*,
+# except with old shells:
+host_os=$*
+IFS=$ac_save_IFS
+case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac
+
+
+
+# Find out about the target we're building for.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking target system type" >&5
+$as_echo_n "checking target system type... " >&6; }
+if ${ac_cv_target+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test "x$target_alias" = x; then
+  ac_cv_target=$ac_cv_host
+else
+  ac_cv_target=`$SHELL "$ac_aux_dir/config.sub" $target_alias` ||
+    as_fn_error $? "$SHELL $ac_aux_dir/config.sub $target_alias failed" "$LINENO" 5
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_target" >&5
+$as_echo "$ac_cv_target" >&6; }
+case $ac_cv_target in
+*-*-*) ;;
+*) as_fn_error $? "invalid value of canonical target" "$LINENO" 5;;
+esac
+target=$ac_cv_target
+ac_save_IFS=$IFS; IFS='-'
+set x $ac_cv_target
+shift
+target_cpu=$1
+target_vendor=$2
+shift; shift
+# Remember, the first character of IFS is used to create $*,
+# except with old shells:
+target_os=$*
+IFS=$ac_save_IFS
+case $target_os in *\ *) target_os=`echo "$target_os" | sed 's/ /-/g'`;; esac
+
+
+# The aliases save the names the user supplied, while $host etc.
+# will get canonicalized.
+test -n "$target_alias" &&
+  test "$program_prefix$program_suffix$program_transform_name" = \
+    NONENONEs,x,x, &&
+  program_prefix=${target_alias}-
+
+# This call is required by automake.
+am__api_version='1.14'
+
+# Find a good install program.  We prefer a C program (faster),
+# so one script is as good as another.  But avoid the broken or
+# incompatible versions:
+# SysV /etc/install, /usr/sbin/install
+# SunOS /usr/etc/install
+# IRIX /sbin/install
+# AIX /bin/install
+# AmigaOS /C/install, which installs bootblocks on floppy discs
+# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag
+# AFS /usr/afsws/bin/install, which mishandles nonexistent args
+# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
+# OS/2's system install, which has a completely different semantic
+# ./install, which can be erroneously created by make from ./install.sh.
+# Reject install programs that cannot install multiple files.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5
+$as_echo_n "checking for a BSD-compatible install... " >&6; }
+if test -z "$INSTALL"; then
+if ${ac_cv_path_install+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    # Account for people who put trailing slashes in PATH elements.
+case $as_dir/ in #((
+  ./ | .// | /[cC]/* | \
+  /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \
+  ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \
+  /usr/ucb/* ) ;;
+  *)
+    # OSF1 and SCO ODT 3.0 have their own names for install.
+    # Don't use installbsd from OSF since it installs stuff as root
+    # by default.
+    for ac_prog in ginstall scoinst install; do
+      for ac_exec_ext in '' $ac_executable_extensions; do
+	if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then
+	  if test $ac_prog = install &&
+	    grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+	    # AIX install.  It has an incompatible calling convention.
+	    :
+	  elif test $ac_prog = install &&
+	    grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+	    # program-specific install script used by HP pwplus--don't use.
+	    :
+	  else
+	    rm -rf conftest.one conftest.two conftest.dir
+	    echo one > conftest.one
+	    echo two > conftest.two
+	    mkdir conftest.dir
+	    if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" &&
+	      test -s conftest.one && test -s conftest.two &&
+	      test -s conftest.dir/conftest.one &&
+	      test -s conftest.dir/conftest.two
+	    then
+	      ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c"
+	      break 3
+	    fi
+	  fi
+	fi
+      done
+    done
+    ;;
+esac
+
+  done
+IFS=$as_save_IFS
+
+rm -rf conftest.one conftest.two conftest.dir
+
+fi
+  if test "${ac_cv_path_install+set}" = set; then
+    INSTALL=$ac_cv_path_install
+  else
+    # As a last resort, use the slow shell script.  Don't cache a
+    # value for INSTALL within a source directory, because that will
+    # break other packages using the cache if that directory is
+    # removed, or if the value is a relative name.
+    INSTALL=$ac_install_sh
+  fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5
+$as_echo "$INSTALL" >&6; }
+
+# Use test -z because SunOS4 sh mishandles braces in ${var-val}.
+# It thinks the first close brace ends the variable substitution.
+test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}'
+
+test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}'
+
+test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5
+$as_echo_n "checking whether build environment is sane... " >&6; }
+# Reject unsafe characters in $srcdir or the absolute working directory
+# name.  Accept space and tab only in the latter.
+am_lf='
+'
+case `pwd` in
+  *[\\\"\#\$\&\'\`$am_lf]*)
+    as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;;
+esac
+case $srcdir in
+  *[\\\"\#\$\&\'\`$am_lf\ \	]*)
+    as_fn_error $? "unsafe srcdir value: '$srcdir'" "$LINENO" 5;;
+esac
+
+# Do 'set' in a subshell so we don't clobber the current shell's
+# arguments.  Must try -L first in case configure is actually a
+# symlink; some systems play weird games with the mod time of symlinks
+# (eg FreeBSD returns the mod time of the symlink's containing
+# directory).
+if (
+   am_has_slept=no
+   for am_try in 1 2; do
+     echo "timestamp, slept: $am_has_slept" > conftest.file
+     set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null`
+     if test "$*" = "X"; then
+	# -L didn't work.
+	set X `ls -t "$srcdir/configure" conftest.file`
+     fi
+     if test "$*" != "X $srcdir/configure conftest.file" \
+	&& test "$*" != "X conftest.file $srcdir/configure"; then
+
+	# If neither matched, then we have a broken ls.  This can happen
+	# if, for instance, CONFIG_SHELL is bash and it inherits a
+	# broken ls alias from the environment.  This has actually
+	# happened.  Such a system could not be considered "sane".
+	as_fn_error $? "ls -t appears to fail.  Make sure there is not a broken
+  alias in your environment" "$LINENO" 5
+     fi
+     if test "$2" = conftest.file || test $am_try -eq 2; then
+       break
+     fi
+     # Just in case.
+     sleep 1
+     am_has_slept=yes
+   done
+   test "$2" = conftest.file
+   )
+then
+   # Ok.
+   :
+else
+   as_fn_error $? "newly created file is older than distributed files!
+Check your system clock" "$LINENO" 5
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+# If we didn't sleep, we still need to ensure time stamps of config.status and
+# generated files are strictly newer.
+am_sleep_pid=
+if grep 'slept: no' conftest.file >/dev/null 2>&1; then
+  ( sleep 1 ) &
+  am_sleep_pid=$!
+fi
+
+rm -f conftest.file
+
+test "$program_prefix" != NONE &&
+  program_transform_name="s&^&$program_prefix&;$program_transform_name"
+# Use a double $ so make ignores it.
+test "$program_suffix" != NONE &&
+  program_transform_name="s&\$&$program_suffix&;$program_transform_name"
+# Double any \ or $.
+# By default was `s,x,x', remove it if useless.
+ac_script='s/[\\$]/&&/g;s/;s,x,x,$//'
+program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"`
+
+# expand $ac_aux_dir to an absolute path
+am_aux_dir=`cd $ac_aux_dir && pwd`
+
+if test x"${MISSING+set}" != xset; then
+  case $am_aux_dir in
+  *\ * | *\	*)
+    MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;;
+  *)
+    MISSING="\${SHELL} $am_aux_dir/missing" ;;
+  esac
+fi
+# Use eval to expand $SHELL
+if eval "$MISSING --is-lightweight"; then
+  am_missing_run="$MISSING "
+else
+  am_missing_run=
+  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 'missing' script is too old or missing" >&5
+$as_echo "$as_me: WARNING: 'missing' script is too old or missing" >&2;}
+fi
+
+if test x"${install_sh}" != xset; then
+  case $am_aux_dir in
+  *\ * | *\	*)
+    install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;;
+  *)
+    install_sh="\${SHELL} $am_aux_dir/install-sh"
+  esac
+fi
+
+# Installed binaries are usually stripped using 'strip' when the user
+# run "make install-strip".  However 'strip' might not be the right
+# tool to use in cross-compilation environments, therefore Automake
+# will honor the 'STRIP' environment variable to overrule this program.
+if test "$cross_compiling" != no; then
+  if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args.
+set dummy ${ac_tool_prefix}strip; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_STRIP+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$STRIP"; then
+  ac_cv_prog_STRIP="$STRIP" # 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_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_STRIP="${ac_tool_prefix}strip"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+STRIP=$ac_cv_prog_STRIP
+if test -n "$STRIP"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5
+$as_echo "$STRIP" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_STRIP"; then
+  ac_ct_STRIP=$STRIP
+  # Extract the first word of "strip", so it can be a program name with args.
+set dummy strip; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_STRIP+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_STRIP"; then
+  ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # 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_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_STRIP="strip"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP
+if test -n "$ac_ct_STRIP"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5
+$as_echo "$ac_ct_STRIP" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_STRIP" = x; then
+    STRIP=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    STRIP=$ac_ct_STRIP
+  fi
+else
+  STRIP="$ac_cv_prog_STRIP"
+fi
+
+fi
+INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s"
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5
+$as_echo_n "checking for a thread-safe mkdir -p... " >&6; }
+if test -z "$MKDIR_P"; then
+  if ${ac_cv_path_mkdir+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_prog in mkdir gmkdir; do
+	 for ac_exec_ext in '' $ac_executable_extensions; do
+	   as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext" || continue
+	   case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #(
+	     'mkdir (GNU coreutils) '* | \
+	     'mkdir (coreutils) '* | \
+	     'mkdir (fileutils) '4.1*)
+	       ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext
+	       break 3;;
+	   esac
+	 done
+       done
+  done
+IFS=$as_save_IFS
+
+fi
+
+  test -d ./--version && rmdir ./--version
+  if test "${ac_cv_path_mkdir+set}" = set; then
+    MKDIR_P="$ac_cv_path_mkdir -p"
+  else
+    # As a last resort, use the slow shell script.  Don't cache a
+    # value for MKDIR_P within a source directory, because that will
+    # break other packages using the cache if that directory is
+    # removed, or if the value is a relative name.
+    MKDIR_P="$ac_install_sh -d"
+  fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5
+$as_echo "$MKDIR_P" >&6; }
+
+for ac_prog in gawk mawk nawk awk
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_AWK+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$AWK"; then
+  ac_cv_prog_AWK="$AWK" # 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_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_AWK="$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+AWK=$ac_cv_prog_AWK
+if test -n "$AWK"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5
+$as_echo "$AWK" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  test -n "$AWK" && break
+done
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5
+$as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; }
+set x ${MAKE-make}
+ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'`
+if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat >conftest.make <<\_ACEOF
+SHELL = /bin/sh
+all:
+	@echo '@@@%%%=$(MAKE)=@@@%%%'
+_ACEOF
+# GNU make sometimes prints "make[1]: Entering ...", which would confuse us.
+case `${MAKE-make} -f conftest.make 2>/dev/null` in
+  *@@@%%%=?*=@@@%%%*)
+    eval ac_cv_prog_make_${ac_make}_set=yes;;
+  *)
+    eval ac_cv_prog_make_${ac_make}_set=no;;
+esac
+rm -f conftest.make
+fi
+if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+  SET_MAKE=
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+  SET_MAKE="MAKE=${MAKE-make}"
+fi
+
+rm -rf .tst 2>/dev/null
+mkdir .tst 2>/dev/null
+if test -d .tst; then
+  am__leading_dot=.
+else
+  am__leading_dot=_
+fi
+rmdir .tst 2>/dev/null
+
+# Check whether --enable-silent-rules was given.
+if test "${enable_silent_rules+set}" = set; then :
+  enableval=$enable_silent_rules;
+fi
+
+case $enable_silent_rules in # (((
+  yes) AM_DEFAULT_VERBOSITY=0;;
+   no) AM_DEFAULT_VERBOSITY=1;;
+    *) AM_DEFAULT_VERBOSITY=1;;
+esac
+am_make=${MAKE-make}
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5
+$as_echo_n "checking whether $am_make supports nested variables... " >&6; }
+if ${am_cv_make_support_nested_variables+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if $as_echo 'TRUE=$(BAR$(V))
+BAR0=false
+BAR1=true
+V=1
+am__doit:
+	@$(TRUE)
+.PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then
+  am_cv_make_support_nested_variables=yes
+else
+  am_cv_make_support_nested_variables=no
+fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5
+$as_echo "$am_cv_make_support_nested_variables" >&6; }
+if test $am_cv_make_support_nested_variables = yes; then
+    AM_V='$(V)'
+  AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)'
+else
+  AM_V=$AM_DEFAULT_VERBOSITY
+  AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY
+fi
+AM_BACKSLASH='\'
+
+if test "`cd $srcdir && pwd`" != "`pwd`"; then
+  # Use -I$(srcdir) only when $(srcdir) != ., so that make's output
+  # is not polluted with repeated "-I."
+  am__isrc=' -I$(srcdir)'
+  # test to see if srcdir already configured
+  if test -f $srcdir/config.status; then
+    as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5
+  fi
+fi
+
+# test whether we have cygpath
+if test -z "$CYGPATH_W"; then
+  if (cygpath --version) >/dev/null 2>/dev/null; then
+    CYGPATH_W='cygpath -w'
+  else
+    CYGPATH_W=echo
+  fi
+fi
+
+
+# Define the identity of the package.
+ PACKAGE='netcdf-fortran'
+ VERSION='4.4.1'
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE "$PACKAGE"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define VERSION "$VERSION"
+_ACEOF
+
+# Some tools Automake needs.
+
+ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"}
+
+
+AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"}
+
+
+AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"}
+
+
+AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"}
+
+
+MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"}
+
+# For better backward compatibility.  To be removed once Automake 1.9.x
+# dies out for good.  For more background, see:
+# <http://lists.gnu.org/archive/html/automake/2012-07/msg00001.html>
+# <http://lists.gnu.org/archive/html/automake/2012-07/msg00014.html>
+mkdir_p='$(MKDIR_P)'
+
+# We need awk for the "check" target.  The system "awk" is bad on
+# some platforms.
+# Always define AMTAR for backward compatibility.  Yes, it's still used
+# in the wild :-(  We should find a proper way to deprecate it ...
+AMTAR='$${TAR-tar}'
+
+
+# We'll loop over all known methods to create a tar archive until one works.
+_am_tools='gnutar  pax cpio none'
+
+am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'
+
+
+
+
+
+
+# POSIX will say in a future version that running "rm -f" with no argument
+# is OK; and we want to be able to make that assumption in our Makefile
+# recipes.  So use an aggressive probe to check that the usage we want is
+# actually supported "in the wild" to an acceptable degree.
+# See automake bug#10828.
+# To make any issue more visible, cause the running configure to be aborted
+# by default if the 'rm' program in use doesn't match our expectations; the
+# user can still override this though.
+if rm -f && rm -fr && rm -rf; then : OK; else
+  cat >&2 <<'END'
+Oops!
+
+Your 'rm' program seems unable to run without file operands specified
+on the command line, even when the '-f' option is present.  This is contrary
+to the behaviour of most rm programs out there, and not conforming with
+the upcoming POSIX standard: <http://austingroupbugs.net/view.php?id=542>
+
+Please tell bug-automake at gnu.org about your system, including the value
+of your $PATH and any error possibly output before this message.  This
+can help us improve future automake versions.
+
+END
+  if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then
+    echo 'Configuration will proceed anyway, since you have set the' >&2
+    echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2
+    echo >&2
+  else
+    cat >&2 <<'END'
+Aborting the configuration process, to ensure you take notice of the issue.
+
+You can download and install GNU coreutils to get an 'rm' implementation
+that behaves properly: <http://www.gnu.org/software/coreutils/>.
+
+If you want to complete the configuration process using your problematic
+'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM
+to "yes", and re-run configure.
+
+END
+    as_fn_error $? "Your 'rm' program is bad, sorry." "$LINENO" 5
+  fi
+fi
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable maintainer-specific portions of Makefiles" >&5
+$as_echo_n "checking whether to enable maintainer-specific portions of Makefiles... " >&6; }
+    # Check whether --enable-maintainer-mode was given.
+if test "${enable_maintainer_mode+set}" = set; then :
+  enableval=$enable_maintainer_mode; USE_MAINTAINER_MODE=$enableval
+else
+  USE_MAINTAINER_MODE=no
+fi
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $USE_MAINTAINER_MODE" >&5
+$as_echo "$USE_MAINTAINER_MODE" >&6; }
+   if test $USE_MAINTAINER_MODE = yes; then
+  MAINTAINER_MODE_TRUE=
+  MAINTAINER_MODE_FALSE='#'
+else
+  MAINTAINER_MODE_TRUE='#'
+  MAINTAINER_MODE_FALSE=
+fi
+
+  MAINT=$MAINTAINER_MODE_TRUE
+
+
+# Check for the existence of this file before proceeding.
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking user options" >&5
+$as_echo "$as_me: checking user options" >&6;}
+
+# Does the user want to run extra tests with valgrind?
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether extra valgrind tests should be run" >&5
+$as_echo_n "checking whether extra valgrind tests should be run... " >&6; }
+# Check whether --enable-valgrind-tests was given.
+if test "${enable_valgrind_tests+set}" = set; then :
+  enableval=$enable_valgrind_tests;
+fi
+
+test "x$enable_valgrind_tests" = xyes || enable_valgrind_tests=no
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_valgrind_tests" >&5
+$as_echo "$enable_valgrind_tests" >&6; }
+
+# Does the user want to run extra parallel tests when parallel netCDF-4 is built?
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether parallel IO tests should be run" >&5
+$as_echo_n "checking whether parallel IO tests should be run... " >&6; }
+# Check whether --enable-parallel-tests was given.
+if test "${enable_parallel_tests+set}" = set; then :
+  enableval=$enable_parallel_tests;
+fi
+
+test "x$enable_parallel_tests" = xyes || enable_parallel_tests=no
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_parallel_tests" >&5
+$as_echo "$enable_parallel_tests" >&6; }
+
+# Does the user want to do some extra tests?
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether netCDF extra tests should be run (developers only)" >&5
+$as_echo_n "checking whether netCDF extra tests should be run (developers only)... " >&6; }
+# Check whether --enable-extra-tests was given.
+if test "${enable_extra_tests+set}" = set; then :
+  enableval=$enable_extra_tests;
+fi
+
+test "x$enable_extra_tests" = xyes || enable_extra_tests=no
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_extra_tests" >&5
+$as_echo "$enable_extra_tests" >&6; }
+if test "x$enable_extra_tests" = xyes; then
+
+$as_echo "#define EXTRA_TESTS 1" >>confdefs.h
+
+fi
+ if test x$enable_extra_tests = xyes; then
+  EXTRA_TESTS_TRUE=
+  EXTRA_TESTS_FALSE='#'
+else
+  EXTRA_TESTS_TRUE='#'
+  EXTRA_TESTS_FALSE=
+fi
+
+
+#####
+# Determine if we want to enable doxygen-generated documentation.
+#####
+# Check whether --enable-doxygen was given.
+if test "${enable_doxygen+set}" = set; then :
+  enableval=$enable_doxygen;
+fi
+
+    test "x$enable_doxygen" = xyes || enable_doxygen=no
+ if test "x$enable_doxygen" = xyes; then
+  BUILD_DOCS_TRUE=
+  BUILD_DOCS_FALSE='#'
+else
+  BUILD_DOCS_TRUE='#'
+  BUILD_DOCS_FALSE=
+fi
+
+
+# Does the user want to generate dot-based documentation?
+# Check whether --enable-dot was given.
+if test "${enable_dot+set}" = set; then :
+  enableval=$enable_dot;
+fi
+
+	test "x$enable_dot" = xyes || enable_dot=no
+
+# Does the user want to generate internal documentation?
+# Check whether --enable-internal-docs was given.
+if test "${enable_internal_docs+set}" = set; then :
+  enableval=$enable_internal_docs;
+fi
+
+test "x$enable_internal_docs" = xyes || enable_internal_docs=no
+BUILD_INTERNAL_DOCS=$enable_internal_docs
+
+
+# Is doxygen installed? If so, have configure construct the Doxyfile.
+for ac_prog in doxygen
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_DOXYGEN+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$DOXYGEN"; then
+  ac_cv_prog_DOXYGEN="$DOXYGEN" # 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_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_DOXYGEN="$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+DOXYGEN=$ac_cv_prog_DOXYGEN
+if test -n "$DOXYGEN"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DOXYGEN" >&5
+$as_echo "$DOXYGEN" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  test -n "$DOXYGEN" && break
+done
+
+if test -z "$DOXYGEN"; then
+   { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Doxygen not found - documentation will not be built" >&5
+$as_echo "$as_me: WARNING: Doxygen not found - documentation will not be built" >&2;}
+fi
+
+# Is graphviz/dot installed? If so, we'll use dot to create
+# graphs in the documentation.
+for ac_prog in dot
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_DOT+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$DOT"; then
+  ac_cv_prog_DOT="$DOT" # 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_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_DOT="$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+DOT=$ac_cv_prog_DOT
+if test -n "$DOT"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DOT" >&5
+$as_echo "$DOT" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  test -n "$DOT" && break
+done
+
+if test -z "$DOT"; then
+   { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: dot not found - will use simple charts in documentation" >&5
+$as_echo "$as_me: WARNING: dot not found - will use simple charts in documentation" >&2;}
+   HAVE_DOT=NO
+elif test "x$enable_dot" = xno; then
+   HAVE_DOT=NO
+else
+   HAVE_DOT=YES
+fi
+# If we have doxygen, and it's enabled, then process the file.
+if test "x$enable_doxygen" != xno; then
+   if test -n "$DOXYGEN"; then
+
+        ac_config_files="$ac_config_files docs/Doxyfile"
+
+   fi
+# Note: the list of files to input to doxygen
+# has been moved to docs/Doxyfile.in so
+# that make distcheck works correctly.
+# Any new inputs should be inserted into
+# docs/Doxyfile.in and possibley docs/Makefile.am
+fi
+
+#####
+# End doxygen-related documentation block.
+#####
+
+# Find the C compiler.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: finding C compiler" >&5
+$as_echo "$as_me: finding C compiler" >&6;}
+
+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
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CC+:} false; then :
+  $as_echo_n "(cached) " >&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_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_CC="${ac_tool_prefix}gcc"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "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
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_CC+:} false; then :
+  $as_echo_n "(cached) " >&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_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_CC="gcc"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
+$as_echo "$ac_ct_CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_CC" = x; then
+    CC=""
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    CC=$ac_ct_CC
+  fi
+else
+  CC="$ac_cv_prog_CC"
+fi
+
+if test -z "$CC"; then
+          if test -n "$ac_tool_prefix"; then
+    # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}cc; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CC+:} false; then :
+  $as_echo_n "(cached) " >&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_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_CC="${ac_tool_prefix}cc"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  fi
+fi
+if test -z "$CC"; then
+  # Extract the first word of "cc", so it can be a program name with args.
+set dummy cc; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CC+:} false; then :
+  $as_echo_n "(cached) " >&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_fn_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"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+if test $ac_prog_rejected = yes; then
+  # We found a bogon in the path, so make sure we never use it.
+  set dummy $ac_cv_prog_CC
+  shift
+  if test $# != 0; then
+    # We chose a different compiler from the bogus one.
+    # However, it has the same basename, so the bogon will be chosen
+    # first if we set CC to just the basename; use the full file name.
+    shift
+    ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@"
+  fi
+fi
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$CC"; then
+  if test -n "$ac_tool_prefix"; then
+  for ac_prog in cl.exe
+  do
+    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CC+:} false; then :
+  $as_echo_n "(cached) " >&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_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+    test -n "$CC" && break
+  done
+fi
+if test -z "$CC"; then
+  ac_ct_CC=$CC
+  for ac_prog in cl.exe
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_CC+:} false; then :
+  $as_echo_n "(cached) " >&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_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_CC="$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
+$as_echo "$ac_ct_CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  test -n "$ac_ct_CC" && break
+done
+
+  if test "x$ac_ct_CC" = x; then
+    CC=""
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    CC=$ac_ct_CC
+  fi
+fi
+
+fi
+
+
+test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "no acceptable C compiler found in \$PATH
+See \`config.log' for more details" "$LINENO" 5; }
+
+# Provide some information about the compiler.
+$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5
+set X $ac_compile
+ac_compiler=$2
+for ac_option in --version -v -V -qversion; do
+  { { ac_try="$ac_compiler $ac_option >&5"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_compiler $ac_option >&5") 2>conftest.err
+  ac_status=$?
+  if test -s conftest.err; then
+    sed '10a\
+... rest of stderr output deleted ...
+         10q' conftest.err >conftest.er1
+    cat conftest.er1 >&5
+  fi
+  rm -f conftest.er1 conftest.err
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }
+done
+
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files a.out a.out.dSYM 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.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5
+$as_echo_n "checking whether the C compiler works... " >&6; }
+ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'`
+
+# The possible output files:
+ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*"
+
+ac_rmfiles=
+for ac_file in $ac_files
+do
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;
+    * ) ac_rmfiles="$ac_rmfiles $ac_file";;
+  esac
+done
+rm -f $ac_rmfiles
+
+if { { ac_try="$ac_link_default"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_link_default") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then :
+  # Autoconf-2.13 could set the ac_cv_exeext variable to `no'.
+# So ignore a value of `no', otherwise this would lead to `EXEEXT = no'
+# in a Makefile.  We should not override ac_cv_exeext if it was cached,
+# so that the user can short-circuit this test for compilers unknown to
+# Autoconf.
+for ac_file in $ac_files ''
+do
+  test -f "$ac_file" || continue
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj )
+	;;
+    [ab].out )
+	# We found the default executable, but exeext='' is most
+	# certainly right.
+	break;;
+    *.* )
+	if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no;
+	then :; else
+	   ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+	fi
+	# We set ac_cv_exeext here because the later test for it is not
+	# safe: cross compilers may not add the suffix if given an `-o'
+	# argument, so we may need to know it at that point already.
+	# Even if this section looks crufty: it has the advantage of
+	# actually working.
+	break;;
+    * )
+	break;;
+  esac
+done
+test "$ac_cv_exeext" = no && ac_cv_exeext=
+
+else
+  ac_file=''
+fi
+if test -z "$ac_file"; then :
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+$as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error 77 "C compiler cannot create executables
+See \`config.log' for more details" "$LINENO" 5; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5
+$as_echo_n "checking for C compiler default output file name... " >&6; }
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5
+$as_echo "$ac_file" >&6; }
+ac_exeext=$ac_cv_exeext
+
+rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out
+ac_clean_files=$ac_clean_files_save
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5
+$as_echo_n "checking for suffix of executables... " >&6; }
+if { { ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_link") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then :
+  # If both `conftest.exe' and `conftest' are `present' (well, observable)
+# catch `conftest.exe'.  For instance with Cygwin, `ls conftest' will
+# work properly (i.e., refer to `conftest.exe'), while it won't with
+# `rm'.
+for ac_file in conftest.exe conftest conftest.*; do
+  test -f "$ac_file" || continue
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;
+    *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+	  break;;
+    * ) break;;
+  esac
+done
+else
+  { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "cannot compute suffix of executables: cannot compile and link
+See \`config.log' for more details" "$LINENO" 5; }
+fi
+rm -f conftest conftest$ac_cv_exeext
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5
+$as_echo "$ac_cv_exeext" >&6; }
+
+rm -f conftest.$ac_ext
+EXEEXT=$ac_cv_exeext
+ac_exeext=$EXEEXT
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <stdio.h>
+int
+main ()
+{
+FILE *f = fopen ("conftest.out", "w");
+ return ferror (f) || fclose (f) != 0;
+
+  ;
+  return 0;
+}
+_ACEOF
+ac_clean_files="$ac_clean_files conftest.out"
+# Check that the compiler produces executables we can run.  If not, either
+# the compiler is broken, or we cross compile.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5
+$as_echo_n "checking whether we are cross compiling... " >&6; }
+if test "$cross_compiling" != yes; then
+  { { ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_link") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }
+  if { ac_try='./conftest$ac_cv_exeext'
+  { { case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; }; then
+    cross_compiling=no
+  else
+    if test "$cross_compiling" = maybe; then
+	cross_compiling=yes
+    else
+	{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "cannot run C compiled programs.
+If you meant to cross compile, use \`--host'.
+See \`config.log' for more details" "$LINENO" 5; }
+    fi
+  fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5
+$as_echo "$cross_compiling" >&6; }
+
+rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out
+ac_clean_files=$ac_clean_files_save
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5
+$as_echo_n "checking for suffix of object files... " >&6; }
+if ${ac_cv_objext+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.o conftest.obj
+if { { ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_compile") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then :
+  for ac_file in conftest.o conftest.obj conftest.*; do
+  test -f "$ac_file" || continue;
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;;
+    *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'`
+       break;;
+  esac
+done
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "cannot compute suffix of object files: cannot compile
+See \`config.log' for more details" "$LINENO" 5; }
+fi
+rm -f conftest.$ac_cv_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5
+$as_echo "$ac_cv_objext" >&6; }
+OBJEXT=$ac_cv_objext
+ac_objext=$OBJEXT
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5
+$as_echo_n "checking whether we are using the GNU C compiler... " >&6; }
+if ${ac_cv_c_compiler_gnu+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+#ifndef __GNUC__
+       choke me
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_compiler_gnu=yes
+else
+  ac_compiler_gnu=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ac_cv_c_compiler_gnu=$ac_compiler_gnu
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5
+$as_echo "$ac_cv_c_compiler_gnu" >&6; }
+if test $ac_compiler_gnu = yes; then
+  GCC=yes
+else
+  GCC=
+fi
+ac_test_CFLAGS=${CFLAGS+set}
+ac_save_CFLAGS=$CFLAGS
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5
+$as_echo_n "checking whether $CC accepts -g... " >&6; }
+if ${ac_cv_prog_cc_g+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_save_c_werror_flag=$ac_c_werror_flag
+   ac_c_werror_flag=yes
+   ac_cv_prog_cc_g=no
+   CFLAGS="-g"
+   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_prog_cc_g=yes
+else
+  CFLAGS=""
+      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+
+else
+  ac_c_werror_flag=$ac_save_c_werror_flag
+	 CFLAGS="-g"
+	 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_prog_cc_g=yes
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+   ac_c_werror_flag=$ac_save_c_werror_flag
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5
+$as_echo "$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
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5
+$as_echo_n "checking for $CC option to accept ISO C89... " >&6; }
+if ${ac_cv_prog_cc_c89+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_cv_prog_cc_c89=no
+ac_save_CC=$CC
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <stdarg.h>
+#include <stdio.h>
+struct stat;
+/* Most of the following tests are stolen from RCS 5.7's src/conf.sh.  */
+struct buf { int x; };
+FILE * (*rcsopen) (struct buf *, struct stat *, int);
+static char *e (p, i)
+     char **p;
+     int i;
+{
+  return p[i];
+}
+static char *f (char * (*g) (char **, int), char **p, ...)
+{
+  char *s;
+  va_list v;
+  va_start (v,p);
+  s = g (p, va_arg (v,int));
+  va_end (v);
+  return s;
+}
+
+/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default.  It has
+   function prototypes and stuff, but not '\xHH' hex character constants.
+   These don't provoke an error unfortunately, instead are silently treated
+   as 'x'.  The following induces an error, until -std is added to get
+   proper ANSI mode.  Curiously '\x00'!='x' always comes out true, for an
+   array size at least.  It's necessary to write '\x00'==0 to get something
+   that's true only with -std.  */
+int osf4_cc_array ['\x00' == 0 ? 1 : -1];
+
+/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters
+   inside strings and character constants.  */
+#define FOO(x) 'x'
+int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1];
+
+int test (int i, double x);
+struct s1 {int (*f) (int a);};
+struct s2 {int (*f) (double a);};
+int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int);
+int argc;
+char **argv;
+int
+main ()
+{
+return f (e, argv, 0) != argv[0]  ||  f (e, argv, 1) != argv[1];
+  ;
+  return 0;
+}
+_ACEOF
+for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \
+	-Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
+do
+  CC="$ac_save_CC $ac_arg"
+  if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_prog_cc_c89=$ac_arg
+fi
+rm -f core conftest.err conftest.$ac_objext
+  test "x$ac_cv_prog_cc_c89" != "xno" && break
+done
+rm -f conftest.$ac_ext
+CC=$ac_save_CC
+
+fi
+# AC_CACHE_VAL
+case "x$ac_cv_prog_cc_c89" in
+  x)
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
+$as_echo "none needed" >&6; } ;;
+  xno)
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
+$as_echo "unsupported" >&6; } ;;
+  *)
+    CC="$CC $ac_cv_prog_cc_c89"
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5
+$as_echo "$ac_cv_prog_cc_c89" >&6; } ;;
+esac
+if test "x$ac_cv_prog_cc_c89" != xno; then :
+
+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
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC understands -c and -o together" >&5
+$as_echo_n "checking whether $CC understands -c and -o together... " >&6; }
+if ${am_cv_prog_cc_c_o+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+  # Make sure it works both with $CC and with simple cc.
+  # Following AC_PROG_CC_C_O, we do the test twice because some
+  # compilers refuse to overwrite an existing .o file with -o,
+  # though they will create one.
+  am_cv_prog_cc_c_o=yes
+  for am_i in 1 2; do
+    if { echo "$as_me:$LINENO: $CC -c conftest.$ac_ext -o conftest2.$ac_objext" >&5
+   ($CC -c conftest.$ac_ext -o conftest2.$ac_objext) >&5 2>&5
+   ac_status=$?
+   echo "$as_me:$LINENO: \$? = $ac_status" >&5
+   (exit $ac_status); } \
+         && test -f conftest2.$ac_objext; then
+      : OK
+    else
+      am_cv_prog_cc_c_o=no
+      break
+    fi
+  done
+  rm -f core conftest*
+  unset am_i
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5
+$as_echo "$am_cv_prog_cc_c_o" >&6; }
+if test "$am_cv_prog_cc_c_o" != yes; then
+   # Losing compiler, so override with the script.
+   # FIXME: It is wrong to rewrite CC.
+   # But if we don't then we get into trouble of one sort or another.
+   # A longer-term fix would be to have automake use am__CC in this case,
+   # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)"
+   CC="$am_aux_dir/compile $CC"
+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
+
+DEPDIR="${am__leading_dot}deps"
+
+ac_config_commands="$ac_config_commands depfiles"
+
+
+am_make=${MAKE-make}
+cat > confinc << 'END'
+am__doit:
+	@echo this is the am__doit target
+.PHONY: am__doit
+END
+# If we don't find an include directive, just comment out the code.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for style of include used by $am_make" >&5
+$as_echo_n "checking for style of include used by $am_make... " >&6; }
+am__include="#"
+am__quote=
+_am_result=none
+# First try GNU make style include.
+echo "include confinc" > confmf
+# Ignore all kinds of additional output from 'make'.
+case `$am_make -s -f confmf 2> /dev/null` in #(
+*the\ am__doit\ target*)
+  am__include=include
+  am__quote=
+  _am_result=GNU
+  ;;
+esac
+# Now try BSD make style include.
+if test "$am__include" = "#"; then
+   echo '.include "confinc"' > confmf
+   case `$am_make -s -f confmf 2> /dev/null` in #(
+   *the\ am__doit\ target*)
+     am__include=.include
+     am__quote="\""
+     _am_result=BSD
+     ;;
+   esac
+fi
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $_am_result" >&5
+$as_echo "$_am_result" >&6; }
+rm -f confinc confmf
+
+# Check whether --enable-dependency-tracking was given.
+if test "${enable_dependency_tracking+set}" = set; then :
+  enableval=$enable_dependency_tracking;
+fi
+
+if test "x$enable_dependency_tracking" != xno; then
+  am_depcomp="$ac_aux_dir/depcomp"
+  AMDEPBACKSLASH='\'
+  am__nodep='_no'
+fi
+ if test "x$enable_dependency_tracking" != xno; then
+  AMDEP_TRUE=
+  AMDEP_FALSE='#'
+else
+  AMDEP_TRUE='#'
+  AMDEP_FALSE=
+fi
+
+
+
+depcc="$CC"   am_compiler_list=
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5
+$as_echo_n "checking dependency style of $depcc... " >&6; }
+if ${am_cv_CC_dependencies_compiler_type+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
+  # We make a subdir and do the tests there.  Otherwise we can end up
+  # making bogus files that we don't know about and never remove.  For
+  # instance it was reported that on HP-UX the gcc test will end up
+  # making a dummy file named 'D' -- because '-MD' means "put the output
+  # in D".
+  rm -rf conftest.dir
+  mkdir conftest.dir
+  # Copy depcomp to subdir because otherwise we won't find it if we're
+  # using a relative directory.
+  cp "$am_depcomp" conftest.dir
+  cd conftest.dir
+  # We will build objects and dependencies in a subdirectory because
+  # it helps to detect inapplicable dependency modes.  For instance
+  # both Tru64's cc and ICC support -MD to output dependencies as a
+  # side effect of compilation, but ICC will put the dependencies in
+  # the current directory while Tru64 will put them in the object
+  # directory.
+  mkdir sub
+
+  am_cv_CC_dependencies_compiler_type=none
+  if test "$am_compiler_list" = ""; then
+     am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp`
+  fi
+  am__universal=false
+  case " $depcc " in #(
+     *\ -arch\ *\ -arch\ *) am__universal=true ;;
+     esac
+
+  for depmode in $am_compiler_list; do
+    # Setup a source with many dependencies, because some compilers
+    # like to wrap large dependency lists on column 80 (with \), and
+    # we should not choose a depcomp mode which is confused by this.
+    #
+    # We need to recreate these files for each test, as the compiler may
+    # overwrite some of them when testing with obscure command lines.
+    # This happens at least with the AIX C compiler.
+    : > sub/conftest.c
+    for i in 1 2 3 4 5 6; do
+      echo '#include "conftst'$i'.h"' >> sub/conftest.c
+      # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with
+      # Solaris 10 /bin/sh.
+      echo '/* dummy */' > sub/conftst$i.h
+    done
+    echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
+
+    # We check with '-c' and '-o' for the sake of the "dashmstdout"
+    # mode.  It turns out that the SunPro C++ compiler does not properly
+    # handle '-M -o', and we need to detect this.  Also, some Intel
+    # versions had trouble with output in subdirs.
+    am__obj=sub/conftest.${OBJEXT-o}
+    am__minus_obj="-o $am__obj"
+    case $depmode in
+    gcc)
+      # This depmode causes a compiler race in universal mode.
+      test "$am__universal" = false || continue
+      ;;
+    nosideeffect)
+      # After this tag, mechanisms are not by side-effect, so they'll
+      # only be used when explicitly requested.
+      if test "x$enable_dependency_tracking" = xyes; then
+	continue
+      else
+	break
+      fi
+      ;;
+    msvc7 | msvc7msys | msvisualcpp | msvcmsys)
+      # This compiler won't grok '-c -o', but also, the minuso test has
+      # not run yet.  These depmodes are late enough in the game, and
+      # so weak that their functioning should not be impacted.
+      am__obj=conftest.${OBJEXT-o}
+      am__minus_obj=
+      ;;
+    none) break ;;
+    esac
+    if depmode=$depmode \
+       source=sub/conftest.c object=$am__obj \
+       depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+       $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \
+         >/dev/null 2>conftest.err &&
+       grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep $am__obj sub/conftest.Po > /dev/null 2>&1 &&
+       ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
+      # icc doesn't choke on unknown options, it will just issue warnings
+      # or remarks (even with -Werror).  So we grep stderr for any message
+      # that says an option was ignored or not supported.
+      # When given -MP, icc 7.0 and 7.1 complain thusly:
+      #   icc: Command line warning: ignoring option '-M'; no argument required
+      # The diagnosis changed in icc 8.0:
+      #   icc: Command line remark: option '-MP' not supported
+      if (grep 'ignoring option' conftest.err ||
+          grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
+        am_cv_CC_dependencies_compiler_type=$depmode
+        break
+      fi
+    fi
+  done
+
+  cd ..
+  rm -rf conftest.dir
+else
+  am_cv_CC_dependencies_compiler_type=none
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5
+$as_echo "$am_cv_CC_dependencies_compiler_type" >&6; }
+CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type
+
+ if
+  test "x$enable_dependency_tracking" != xno \
+  && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then
+  am__fastdepCC_TRUE=
+  am__fastdepCC_FALSE='#'
+else
+  am__fastdepCC_TRUE='#'
+  am__fastdepCC_FALSE=
+fi
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for an ANSI C-conforming const" >&5
+$as_echo_n "checking for an ANSI C-conforming const... " >&6; }
+if ${ac_cv_c_const+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+#ifndef __cplusplus
+  /* Ultrix mips cc rejects this sort of thing.  */
+  typedef int charset[2];
+  const charset cs = { 0, 0 };
+  /* SunOS 4.1.1 cc rejects this.  */
+  char const *const *pcpcc;
+  char **ppc;
+  /* NEC SVR4.0.2 mips cc rejects this.  */
+  struct point {int x, y;};
+  static struct point const zero = {0,0};
+  /* AIX XL C 1.02.0.0 rejects this.
+     It does not let you subtract one const X* pointer from another in
+     an arm of an if-expression whose if-part is not a constant
+     expression */
+  const char *g = "string";
+  pcpcc = &g + (g ? g-g : 0);
+  /* HPUX 7.0 cc rejects these. */
+  ++pcpcc;
+  ppc = (char**) pcpcc;
+  pcpcc = (char const *const *) ppc;
+  { /* SCO 3.2v4 cc rejects this sort of thing.  */
+    char tx;
+    char *t = &tx;
+    char const *s = 0 ? (char *) 0 : (char const *) 0;
+
+    *t++ = 0;
+    if (s) return 0;
+  }
+  { /* Someone thinks the Sun supposedly-ANSI compiler will reject this.  */
+    int x[] = {25, 17};
+    const int *foo = &x[0];
+    ++foo;
+  }
+  { /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */
+    typedef const int *iptr;
+    iptr p = 0;
+    ++p;
+  }
+  { /* AIX XL C 1.02.0.0 rejects this sort of thing, saying
+       "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */
+    struct s { int j; const int *ap[3]; } bx;
+    struct s *b = &bx; b->j = 5;
+  }
+  { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */
+    const int foo = 10;
+    if (!foo) return 0;
+  }
+  return !cs[0] && !zero.x;
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_c_const=yes
+else
+  ac_cv_c_const=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_const" >&5
+$as_echo "$ac_cv_c_const" >&6; }
+if test $ac_cv_c_const = no; then
+
+$as_echo "#define const /**/" >>confdefs.h
+
+fi
+
+
+# If F03 is set, FC isn't, then set FC to whatever F03 was set
+if test "${F03+set}" = set -a "${FC+set}" != set; then
+   FC=$F03
+fi
+
+# If F90 is set, FC isn't, then set FC to whatever F90 was set to.
+if test "${F90+set}" = set -a "${FC+set}" != set; then
+   FC=$F90
+fi
+
+# Find fortran compiler. If FC isn't set after AC_PROG_FC, we couldn't
+# find a fortran compiler. If the user requested the fortran API, and
+# has told us not to recover from a missing compiler, then bail out
+# right here.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: finding Fortran compiler" >&5
+$as_echo "$as_me: finding Fortran compiler" >&6;}
+ac_ext=${ac_fc_srcext-f}
+ac_compile='$FC -c $FCFLAGS $ac_fcflags_srcext conftest.$ac_ext >&5'
+ac_link='$FC -o conftest$ac_exeext $FCFLAGS $LDFLAGS $ac_fcflags_srcext conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_fc_compiler_gnu
+if test -n "$ac_tool_prefix"; then
+  for ac_prog in gfortran g95 xlf95 f95 fort ifort ifc efc pgfortran pgf95 lf95 ftn nagfor xlf90 f90 pgf90 pghpf epcf90 g77 xlf f77 frt pgf77 cf77 fort77 fl32 af77
+  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
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_FC+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$FC"; then
+  ac_cv_prog_FC="$FC" # 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_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_FC="$ac_tool_prefix$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+FC=$ac_cv_prog_FC
+if test -n "$FC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $FC" >&5
+$as_echo "$FC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+    test -n "$FC" && break
+  done
+fi
+if test -z "$FC"; then
+  ac_ct_FC=$FC
+  for ac_prog in gfortran g95 xlf95 f95 fort ifort ifc efc pgfortran pgf95 lf95 ftn nagfor xlf90 f90 pgf90 pghpf epcf90 g77 xlf f77 frt pgf77 cf77 fort77 fl32 af77
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_FC+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_FC"; then
+  ac_cv_prog_ac_ct_FC="$ac_ct_FC" # 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_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_FC="$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_FC=$ac_cv_prog_ac_ct_FC
+if test -n "$ac_ct_FC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_FC" >&5
+$as_echo "$ac_ct_FC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  test -n "$ac_ct_FC" && break
+done
+
+  if test "x$ac_ct_FC" = x; then
+    FC=""
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    FC=$ac_ct_FC
+  fi
+fi
+
+
+# Provide some information about the compiler.
+$as_echo "$as_me:${as_lineno-$LINENO}: checking for Fortran compiler version" >&5
+set X $ac_compile
+ac_compiler=$2
+for ac_option in --version -v -V -qversion; do
+  { { ac_try="$ac_compiler $ac_option >&5"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_compiler $ac_option >&5") 2>conftest.err
+  ac_status=$?
+  if test -s conftest.err; then
+    sed '10a\
+... rest of stderr output deleted ...
+         10q' conftest.err >conftest.er1
+    cat conftest.er1 >&5
+  fi
+  rm -f conftest.er1 conftest.err
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }
+done
+rm -f a.out
+
+# If we don't use `.F' as extension, the preprocessor is not run on the
+# input file.  (Note that this only needs to work for GNU compilers.)
+ac_save_ext=$ac_ext
+ac_ext=F
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU Fortran compiler" >&5
+$as_echo_n "checking whether we are using the GNU Fortran compiler... " >&6; }
+if ${ac_cv_fc_compiler_gnu+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat > conftest.$ac_ext <<_ACEOF
+      program main
+#ifndef __GNUC__
+       choke me
+#endif
+
+      end
+_ACEOF
+if ac_fn_fc_try_compile "$LINENO"; then :
+  ac_compiler_gnu=yes
+else
+  ac_compiler_gnu=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ac_cv_fc_compiler_gnu=$ac_compiler_gnu
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_fc_compiler_gnu" >&5
+$as_echo "$ac_cv_fc_compiler_gnu" >&6; }
+ac_ext=$ac_save_ext
+ac_test_FCFLAGS=${FCFLAGS+set}
+ac_save_FCFLAGS=$FCFLAGS
+FCFLAGS=
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $FC accepts -g" >&5
+$as_echo_n "checking whether $FC accepts -g... " >&6; }
+if ${ac_cv_prog_fc_g+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  FCFLAGS=-g
+cat > conftest.$ac_ext <<_ACEOF
+      program main
+
+      end
+_ACEOF
+if ac_fn_fc_try_compile "$LINENO"; then :
+  ac_cv_prog_fc_g=yes
+else
+  ac_cv_prog_fc_g=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_fc_g" >&5
+$as_echo "$ac_cv_prog_fc_g" >&6; }
+if test "$ac_test_FCFLAGS" = set; then
+  FCFLAGS=$ac_save_FCFLAGS
+elif test $ac_cv_prog_fc_g = yes; then
+  if test "x$ac_cv_fc_compiler_gnu" = xyes; then
+    FCFLAGS="-g -O2"
+  else
+    FCFLAGS="-g"
+  fi
+else
+  if test "x$ac_cv_fc_compiler_gnu" = xyes; then
+    FCFLAGS="-O2"
+  else
+    FCFLAGS=
+  fi
+fi
+
+if test $ac_compiler_gnu = yes; then
+  GFC=yes
+else
+  GFC=
+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=f
+ac_compile='$F77 -c $FFLAGS conftest.$ac_ext >&5'
+ac_link='$F77 -o conftest$ac_exeext $FFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_f77_compiler_gnu
+if test -n "$ac_tool_prefix"; then
+  for ac_prog in $FC
+  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
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_F77+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$F77"; then
+  ac_cv_prog_F77="$F77" # 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_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_F77="$ac_tool_prefix$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+F77=$ac_cv_prog_F77
+if test -n "$F77"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $F77" >&5
+$as_echo "$F77" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+    test -n "$F77" && break
+  done
+fi
+if test -z "$F77"; then
+  ac_ct_F77=$F77
+  for ac_prog in $FC
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_F77+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_F77"; then
+  ac_cv_prog_ac_ct_F77="$ac_ct_F77" # 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_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_F77="$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_F77=$ac_cv_prog_ac_ct_F77
+if test -n "$ac_ct_F77"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_F77" >&5
+$as_echo "$ac_ct_F77" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  test -n "$ac_ct_F77" && break
+done
+
+  if test "x$ac_ct_F77" = x; then
+    F77=""
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    F77=$ac_ct_F77
+  fi
+fi
+
+
+# Provide some information about the compiler.
+$as_echo "$as_me:${as_lineno-$LINENO}: checking for Fortran 77 compiler version" >&5
+set X $ac_compile
+ac_compiler=$2
+for ac_option in --version -v -V -qversion; do
+  { { ac_try="$ac_compiler $ac_option >&5"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_compiler $ac_option >&5") 2>conftest.err
+  ac_status=$?
+  if test -s conftest.err; then
+    sed '10a\
+... rest of stderr output deleted ...
+         10q' conftest.err >conftest.er1
+    cat conftest.er1 >&5
+  fi
+  rm -f conftest.er1 conftest.err
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }
+done
+rm -f a.out
+
+# If we don't use `.F' as extension, the preprocessor is not run on the
+# input file.  (Note that this only needs to work for GNU compilers.)
+ac_save_ext=$ac_ext
+ac_ext=F
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU Fortran 77 compiler" >&5
+$as_echo_n "checking whether we are using the GNU Fortran 77 compiler... " >&6; }
+if ${ac_cv_f77_compiler_gnu+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat > conftest.$ac_ext <<_ACEOF
+      program main
+#ifndef __GNUC__
+       choke me
+#endif
+
+      end
+_ACEOF
+if ac_fn_f77_try_compile "$LINENO"; then :
+  ac_compiler_gnu=yes
+else
+  ac_compiler_gnu=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ac_cv_f77_compiler_gnu=$ac_compiler_gnu
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_f77_compiler_gnu" >&5
+$as_echo "$ac_cv_f77_compiler_gnu" >&6; }
+ac_ext=$ac_save_ext
+ac_test_FFLAGS=${FFLAGS+set}
+ac_save_FFLAGS=$FFLAGS
+FFLAGS=
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $F77 accepts -g" >&5
+$as_echo_n "checking whether $F77 accepts -g... " >&6; }
+if ${ac_cv_prog_f77_g+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  FFLAGS=-g
+cat > conftest.$ac_ext <<_ACEOF
+      program main
+
+      end
+_ACEOF
+if ac_fn_f77_try_compile "$LINENO"; then :
+  ac_cv_prog_f77_g=yes
+else
+  ac_cv_prog_f77_g=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_f77_g" >&5
+$as_echo "$ac_cv_prog_f77_g" >&6; }
+if test "$ac_test_FFLAGS" = set; then
+  FFLAGS=$ac_save_FFLAGS
+elif test $ac_cv_prog_f77_g = yes; then
+  if test "x$ac_cv_f77_compiler_gnu" = xyes; then
+    FFLAGS="-g -O2"
+  else
+    FFLAGS="-g"
+  fi
+else
+  if test "x$ac_cv_f77_compiler_gnu" = xyes; then
+    FFLAGS="-O2"
+  else
+    FFLAGS=
+  fi
+fi
+
+if test $ac_compiler_gnu = yes; then
+  G77=yes
+else
+  G77=
+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 we couldn't find an F90 compiler, deal with it.
+if test "${FC+set}" = set && test "x$FC" = x; then
+   { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "Can't find F90 compiler.
+See \`config.log' for more details" "$LINENO" 5; }
+fi
+
+# Set the default fortran builds; default is to build f03
+nc_build_f90=no
+nc_build_f03=yes
+
+# Does the user want to test for Fortran 2003 compiler.
+# Added to get around NAG evaluation compiler error turning off F03
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether Fortran compiler is checked for ISO_C_BINDING support" >&5
+$as_echo_n "checking whether Fortran compiler is checked for ISO_C_BINDING support... " >&6; }
+# Check whether --enable-f03-compiler-check was given.
+if test "${enable_f03_compiler_check+set}" = set; then :
+  enableval=$enable_f03_compiler_check;
+fi
+
+test "x$enable_f03_compiler_check" = xno || enable_f03_compiler_check=yes
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_f03_compiler_check" >&5
+$as_echo "$enable_f03_compiler_check" >&6; }
+
+# next check to see if the Fortran compiler will support
+# ISO_C_BINDING
+nc_iso_c_binding=yes
+
+# Some f90 compilers change the case of the mod file names. Others
+# require special flags to be set to deal with .f90 files. Find out
+# about this compiler.
+ac_ext=${ac_fc_srcext-f}
+ac_compile='$FC -c $FCFLAGS $ac_fcflags_srcext conftest.$ac_ext >&5'
+ac_link='$FC -o conftest$ac_exeext $FCFLAGS $LDFLAGS $ac_fcflags_srcext conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_fc_compiler_gnu
+
+
+ac_ext=${ac_fc_srcext-f}
+ac_compile='$FC -c $FCFLAGS $ac_fcflags_srcext conftest.$ac_ext >&5'
+ac_link='$FC -o conftest$ac_exeext $FCFLAGS $LDFLAGS $ac_fcflags_srcext conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_fc_compiler_gnu
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for Fortran flag to compile .f90 files" >&5
+$as_echo_n "checking for Fortran flag to compile .f90 files... " >&6; }
+if ${ac_cv_fc_srcext_f90+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_ext=f90
+ac_fcflags_srcext_save=$ac_fcflags_srcext
+ac_fcflags_srcext=
+ac_cv_fc_srcext_f90=unknown
+case $ac_ext in #(
+  [fF]77) ac_try=f77;; #(
+  *) ac_try=f95;;
+esac
+for ac_flag in none -qsuffix=f=f90 -Tf "-x $ac_try"; do
+  test "x$ac_flag" != xnone && ac_fcflags_srcext="$ac_flag"
+  cat > conftest.$ac_ext <<_ACEOF
+      program main
+
+      end
+_ACEOF
+if ac_fn_fc_try_compile "$LINENO"; then :
+  ac_cv_fc_srcext_f90=$ac_flag; break
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+done
+rm -f conftest.$ac_objext conftest.f90
+ac_fcflags_srcext=$ac_fcflags_srcext_save
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_fc_srcext_f90" >&5
+$as_echo "$ac_cv_fc_srcext_f90" >&6; }
+if test "x$ac_cv_fc_srcext_f90" = xunknown; then
+  as_fn_error $? "Fortran could not compile .f90 files" "$LINENO" 5
+else
+  ac_fc_srcext=f90
+  if test "x$ac_cv_fc_srcext_f90" = xnone; then
+    ac_fcflags_srcext=""
+    FCFLAGS_f90=""
+  else
+    ac_fcflags_srcext=$ac_cv_fc_srcext_f90
+    FCFLAGS_f90=$ac_cv_fc_srcext_f90
+  fi
+
+
+fi
+ac_ext=${ac_fc_srcext-f}
+ac_compile='$FC -c $FCFLAGS $ac_fcflags_srcext conftest.$ac_ext >&5'
+ac_link='$FC -o conftest$ac_exeext $FCFLAGS $LDFLAGS $ac_fcflags_srcext conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_fc_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
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking fortran 90 modules inclusion flag" >&5
+$as_echo_n "checking fortran 90 modules inclusion flag... " >&6; }
+if ${ax_cv_f90_modflag+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_ext=${ac_fc_srcext-f}
+ac_compile='$FC -c $FCFLAGS $ac_fcflags_srcext conftest.$ac_ext >&5'
+ac_link='$FC -o conftest$ac_exeext $FCFLAGS $LDFLAGS $ac_fcflags_srcext conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_fc_compiler_gnu
+
+i=0
+while test \( -f tmpdir_$i \) -o \( -d tmpdir_$i \) ; do
+  i=`expr $i + 1`
+done
+mkdir tmpdir_$i
+cd tmpdir_$i
+cat > conftest.$ac_ext <<_ACEOF
+module conftest_module
+   contains
+   subroutine conftest_routine
+   write(*,'(a)') 'gotcha!'
+   end subroutine conftest_routine
+   end module conftest_module
+
+_ACEOF
+if ac_fn_fc_try_compile "$LINENO"; then :
+
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+cd ..
+ax_cv_f90_modflag="not found"
+for ax_flag in "-I" "-M" "-p"; do
+  if test "$ax_cv_f90_modflag" = "not found" ; then
+    ax_save_FCFLAGS="$FCFLAGS"
+    FCFLAGS="$ax_save_FCFLAGS ${ax_flag}tmpdir_$i"
+    cat > conftest.$ac_ext <<_ACEOF
+program conftest_program
+       use conftest_module
+       call conftest_routine
+       end program conftest_program
+
+_ACEOF
+if ac_fn_fc_try_compile "$LINENO"; then :
+  ax_cv_f90_modflag="$ax_flag"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+    FCFLAGS="$ax_save_FCFLAGS"
+  fi
+done
+rm -fr tmpdir_$i
+if test "$ax_flag" = "not found" ; then
+  as_fn_error $? "unable to find compiler flag for modules inclusion" "$LINENO" 5
+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
+
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_f90_modflag" >&5
+$as_echo "$ax_cv_f90_modflag" >&6; }
+MOD_FLAG=${ax_cv_f90_modflag}
+
+if test "x$enable_f03_compiler_check" = xyes; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if Fortran compiler supports Fortran 2003 ISO_C_BINDING" >&5
+$as_echo_n "checking if Fortran compiler supports Fortran 2003 ISO_C_BINDING... " >&6; }
+  cat <<EOF >conftest.f90
+module conftest_module
+USE ISO_C_BINDING
+end module conftest_module
+EOF
+  doit='$FC -c ${FCFLAGS} ${FCFLAGS_f90} conftest.f90'
+  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$doit\""; } >&5
+  (eval $doit) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+     nc_iso_c_binding=yes
+  else
+     nc_iso_c_binding=no
+  fi
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $nc_iso_c_binding" >&5
+$as_echo "$nc_iso_c_binding" >&6; }
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if Fortran compiler supports Fortran 2008 ISO_FORTRAN_ENV additions" >&5
+$as_echo_n "checking if Fortran compiler supports Fortran 2008 ISO_FORTRAN_ENV additions... " >&6; }
+  cat <<EOF >conftest.f90
+Program test
+USE ISO_FORTRAN_ENV, ONLY: REAL32, REAL64, INT8, INT16, INT32, INT64
+End Program
+EOF
+  doit='$FC -c ${FCFLAGS} ${FCFLAGS_f90} conftest.f90'
+  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$doit\""; } >&5
+  (eval $doit) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+     nc_f2008_is0_env_additions=yes
+
+$as_echo "#define HAVE_F2008 1" >>confdefs.h
+
+  else
+     nc_f2008_is0_env_additions=no
+  fi
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $nc_f2008_is0_env_additions" >&5
+$as_echo "$nc_f2008_is0_env_additions" >&6; }
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if Fortran compiler supports TS29113 standard extension" >&5
+$as_echo_n "checking if Fortran compiler supports TS29113 standard extension... " >&6; }
+  cat <<EOF >conftest.f90
+Program test
+USE ISO_C_BINDING, ONLY: C_PTRDIFF_T
+End Program
+EOF
+  doit='$FC -c ${FCFLAGS} ${FCFLAGS_f90} conftest.f90'
+  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$doit\""; } >&5
+  (eval $doit) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+     nc_ts29113_support=yes
+
+$as_echo "#define HAVE_TS29113_SUPPORT 1" >>confdefs.h
+
+  else
+     nc_ts29113_support=no
+  fi
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $nc_ts29113_support" >&5
+$as_echo "$nc_ts29113_support" >&6; }
+
+  if test "x$nc_iso_c_binding" = xno; then
+    if test "x$enable_compiler_recover" = xyes; then
+      nc_build_f90=yes
+      { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: ISO_C_BINDING not supported - defaulting to F90 interfaces" >&5
+$as_echo "$as_me: WARNING: ISO_C_BINDING not supported - defaulting to F90 interfaces" >&2;}
+    else
+      { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "Can't use build F03 interfaces and cannot do compiler recovery
+See \`config.log' for more details" "$LINENO" 5; }
+    fi
+  fi
+fi
+
+
+## Do we want to use the fortran 90 wrappers instead of 2003 native code?
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether F03 native code is desired" >&5
+$as_echo_n "checking whether F03 native code is desired... " >&6; }
+# Check whether --enable-f03 was given.
+if test "${enable_f03+set}" = set; then :
+  enableval=$enable_f03;
+fi
+
+test "x$enable_f03" = xno || enable_f03=yes
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_f03" >&5
+$as_echo "$enable_f03" >&6; }
+
+if test "x$enable_f03" = xyes ; then nc_build_f03=yes; fi
+
+# Decide on f90 versus 2003
+if test "x$nc_iso_c_binding" = xno; then
+  #Cannot build f03 native code
+  { $as_echo "$as_me:${as_lineno-$LINENO}: Fortran 2003 interface not supported; Using fortran 90 interface" >&5
+$as_echo "$as_me: Fortran 2003 interface not supported; Using fortran 90 interface" >&6;}
+  nc_build_f90=yes
+fi
+
+# Guarantee build state; f90 currently overrides f03
+if test "x$nc_build_f90" = xyes ; then
+  nc_build_f03=no
+else
+  nc_build_f03=yes
+fi
+
+# Does the user want to check into fortran type information?
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether fortran type sizes should be checked" >&5
+$as_echo_n "checking whether fortran type sizes should be checked... " >&6; }
+# Check whether --enable-fortran-type-check was given.
+if test "${enable_fortran_type_check+set}" = set; then :
+  enableval=$enable_fortran_type_check;
+fi
+
+test "x$enable_fortran_type_check" = xno || enable_fortran_type_check=yes
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_fortran_type_check" >&5
+$as_echo "$enable_fortran_type_check" >&6; }
+
+# Does the user want to run tests for large files (> 2GiB)?
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether large file (> 2GB) tests should be run" >&5
+$as_echo_n "checking whether large file (> 2GB) tests should be run... " >&6; }
+# Check whether --enable-large-file-tests was given.
+if test "${enable_large_file_tests+set}" = set; then :
+  enableval=$enable_large_file_tests;
+fi
+
+test "x$enable_large_file_tests" = xyes || enable_large_file_tests=no
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_large_file_tests" >&5
+$as_echo "$enable_large_file_tests" >&6; }
+ if test x$enable_large_file_tests = xyes; then
+  LARGE_FILE_TESTS_TRUE=
+  LARGE_FILE_TESTS_FALSE='#'
+else
+  LARGE_FILE_TESTS_TRUE='#'
+  LARGE_FILE_TESTS_FALSE=
+fi
+
+if test "x$enable_large_file_tests" = xyes; then
+
+$as_echo "#define LARGE_FILE_TESTS 1" >>confdefs.h
+
+fi
+
+# Does the user want to run benchmarks?
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether benchmaks should be run (experimental)" >&5
+$as_echo_n "checking whether benchmaks should be run (experimental)... " >&6; }
+# Check whether --enable-benchmarks was given.
+if test "${enable_benchmarks+set}" = set; then :
+  enableval=$enable_benchmarks;
+fi
+
+test "x$enable_benchmarks" = xyes || enable_benchmarks=no
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_benchmarks" >&5
+$as_echo "$enable_benchmarks" >&6; }
+ if test x$enable_benchmarks = xyes; then
+  BUILD_BENCHMARKS_TRUE=
+  BUILD_BENCHMARKS_FALSE='#'
+else
+  BUILD_BENCHMARKS_TRUE='#'
+  BUILD_BENCHMARKS_FALSE=
+fi
+
+
+# If the env. variable TEMP_LARGE is set, or if
+# --with-temp-large=<directory>, use it as a place for the large
+# (i.e. > 2 GiB) files created during the large file testing.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking where to put large temp files if large file tests are run" >&5
+$as_echo_n "checking where to put large temp files if large file tests are run... " >&6; }
+
+# Check whether --with-temp-large was given.
+if test "${with_temp_large+set}" = set; then :
+  withval=$with_temp_large; TEMP_LARGE=$with_temp_large
+fi
+
+TEMP_LARGE=${TEMP_LARGE-.}
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $TEMP_LARGE" >&5
+$as_echo "$TEMP_LARGE" >&6; }
+#AC_SUBST(TEMP_LARGE)
+
+cat >>confdefs.h <<_ACEOF
+#define TEMP_LARGE "$TEMP_LARGE"
+_ACEOF
+
+
+
+# Turn off building old F77 interfaces if nc_build_f03 is still yes
+
+test "x$nc_build_f03" = xyes && nc_build_f77=no
+
+if test "x$nc_build_f90" = xno; then
+   F90=
+   # If F77 is set, and FC isn't, then set FC to whatever F77 was set to.
+   FC=$F77
+fi
+
+# See if the fortran 90 build is desired. If so, set some stuff
+if test "x$nc_build_f90" = xyes; then
+   { $as_echo "$as_me:${as_lineno-$LINENO}: setting up Fortran 90" >&5
+$as_echo "$as_me: setting up Fortran 90" >&6;}
+   if test "${F90+set}" != set; then
+      F90=$FC
+   fi
+   { $as_echo "$as_me:${as_lineno-$LINENO}: checking what FC is set to" >&5
+$as_echo_n "checking what FC is set to... " >&6; }
+   { $as_echo "$as_me:${as_lineno-$LINENO}: result: $FC" >&5
+$as_echo "$FC" >&6; }
+
+   if test "x$nc_build_f03" = xno; then
+     # Some f90 compilers change the case of the mod file names. Others
+     # require special flags to be set to deal with .f90 files. Find out
+     # about this compiler.
+     ac_ext=${ac_fc_srcext-f}
+ac_compile='$FC -c $FCFLAGS $ac_fcflags_srcext conftest.$ac_ext >&5'
+ac_link='$FC -o conftest$ac_exeext $FCFLAGS $LDFLAGS $ac_fcflags_srcext conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_fc_compiler_gnu
+
+     ac_ext=${ac_fc_srcext-f}
+ac_compile='$FC -c $FCFLAGS $ac_fcflags_srcext conftest.$ac_ext >&5'
+ac_link='$FC -o conftest$ac_exeext $FCFLAGS $LDFLAGS $ac_fcflags_srcext conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_fc_compiler_gnu
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for Fortran flag to compile .f90 files" >&5
+$as_echo_n "checking for Fortran flag to compile .f90 files... " >&6; }
+if ${ac_cv_fc_srcext_f90+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_ext=f90
+ac_fcflags_srcext_save=$ac_fcflags_srcext
+ac_fcflags_srcext=
+ac_cv_fc_srcext_f90=unknown
+case $ac_ext in #(
+  [fF]77) ac_try=f77;; #(
+  *) ac_try=f95;;
+esac
+for ac_flag in none -qsuffix=f=f90 -Tf "-x $ac_try"; do
+  test "x$ac_flag" != xnone && ac_fcflags_srcext="$ac_flag"
+  cat > conftest.$ac_ext <<_ACEOF
+      program main
+
+      end
+_ACEOF
+if ac_fn_fc_try_compile "$LINENO"; then :
+  ac_cv_fc_srcext_f90=$ac_flag; break
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+done
+rm -f conftest.$ac_objext conftest.f90
+ac_fcflags_srcext=$ac_fcflags_srcext_save
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_fc_srcext_f90" >&5
+$as_echo "$ac_cv_fc_srcext_f90" >&6; }
+if test "x$ac_cv_fc_srcext_f90" = xunknown; then
+  as_fn_error $? "Fortran could not compile .f90 files" "$LINENO" 5
+else
+  ac_fc_srcext=f90
+  if test "x$ac_cv_fc_srcext_f90" = xnone; then
+    ac_fcflags_srcext=""
+    FCFLAGS_f90=""
+  else
+    ac_fcflags_srcext=$ac_cv_fc_srcext_f90
+    FCFLAGS_f90=$ac_cv_fc_srcext_f90
+  fi
+
+
+fi
+ac_ext=${ac_fc_srcext-f}
+ac_compile='$FC -c $FCFLAGS $ac_fcflags_srcext conftest.$ac_ext >&5'
+ac_link='$FC -o conftest$ac_exeext $FCFLAGS $LDFLAGS $ac_fcflags_srcext conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_fc_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
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking fortran 90 modules inclusion flag" >&5
+$as_echo_n "checking fortran 90 modules inclusion flag... " >&6; }
+if ${ax_cv_f90_modflag+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_ext=${ac_fc_srcext-f}
+ac_compile='$FC -c $FCFLAGS $ac_fcflags_srcext conftest.$ac_ext >&5'
+ac_link='$FC -o conftest$ac_exeext $FCFLAGS $LDFLAGS $ac_fcflags_srcext conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_fc_compiler_gnu
+
+i=0
+while test \( -f tmpdir_$i \) -o \( -d tmpdir_$i \) ; do
+  i=`expr $i + 1`
+done
+mkdir tmpdir_$i
+cd tmpdir_$i
+cat > conftest.$ac_ext <<_ACEOF
+module conftest_module
+   contains
+   subroutine conftest_routine
+   write(*,'(a)') 'gotcha!'
+   end subroutine conftest_routine
+   end module conftest_module
+
+_ACEOF
+if ac_fn_fc_try_compile "$LINENO"; then :
+
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+cd ..
+ax_cv_f90_modflag="not found"
+for ax_flag in "-I" "-M" "-p"; do
+  if test "$ax_cv_f90_modflag" = "not found" ; then
+    ax_save_FCFLAGS="$FCFLAGS"
+    FCFLAGS="$ax_save_FCFLAGS ${ax_flag}tmpdir_$i"
+    cat > conftest.$ac_ext <<_ACEOF
+program conftest_program
+       use conftest_module
+       call conftest_routine
+       end program conftest_program
+
+_ACEOF
+if ac_fn_fc_try_compile "$LINENO"; then :
+  ax_cv_f90_modflag="$ax_flag"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+    FCFLAGS="$ax_save_FCFLAGS"
+  fi
+done
+rm -fr tmpdir_$i
+if test "$ax_flag" = "not found" ; then
+  as_fn_error $? "unable to find compiler flag for modules inclusion" "$LINENO" 5
+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
+
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_f90_modflag" >&5
+$as_echo "$ax_cv_f90_modflag" >&6; }
+     MOD_FLAG=${ax_cv_f90_modflag}
+
+   fi
+
+   # Set the FCLIBS flag to help with shared libraries.
+#   AC_FC_LIBRARY_LDFLAGS
+#   AC_F77_LIBRARY_LDFLAGS
+fi
+
+ if test "x$nc_build_f03" = xyes; then
+  BUILD_F03_TRUE=
+  BUILD_F03_FALSE='#'
+else
+  BUILD_F03_TRUE='#'
+  BUILD_F03_FALSE=
+fi
+
+
+# Set up libtool.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: setting up libtool" >&5
+$as_echo "$as_me: setting up libtool" >&6;}
+
+case `pwd` in
+  *\ * | *\	*)
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&5
+$as_echo "$as_me: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&2;} ;;
+esac
+
+
+
+macro_version='2.4.2'
+macro_revision='1.3337'
+
+
+
+
+
+
+
+
+
+
+
+
+
+ltmain="$ac_aux_dir/ltmain.sh"
+
+# Backslashify metacharacters that are still active within
+# double-quoted strings.
+sed_quote_subst='s/\(["`$\\]\)/\\\1/g'
+
+# Same as above, but do not quote variable references.
+double_quote_subst='s/\(["`\\]\)/\\\1/g'
+
+# Sed substitution to delay expansion of an escaped shell variable in a
+# double_quote_subst'ed string.
+delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g'
+
+# Sed substitution to delay expansion of an escaped single quote.
+delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g'
+
+# Sed substitution to avoid accidental globbing in evaled expressions
+no_glob_subst='s/\*/\\\*/g'
+
+ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO
+ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to print strings" >&5
+$as_echo_n "checking how to print strings... " >&6; }
+# Test print first, because it will be a builtin if present.
+if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \
+   test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then
+  ECHO='print -r --'
+elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then
+  ECHO='printf %s\n'
+else
+  # Use this function as a fallback that always works.
+  func_fallback_echo ()
+  {
+    eval 'cat <<_LTECHO_EOF
+$1
+_LTECHO_EOF'
+  }
+  ECHO='func_fallback_echo'
+fi
+
+# func_echo_all arg...
+# Invoke $ECHO with all args, space-separated.
+func_echo_all ()
+{
+    $ECHO ""
+}
+
+case "$ECHO" in
+  printf*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: printf" >&5
+$as_echo "printf" >&6; } ;;
+  print*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: print -r" >&5
+$as_echo "print -r" >&6; } ;;
+  *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: cat" >&5
+$as_echo "cat" >&6; } ;;
+esac
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5
+$as_echo_n "checking for a sed that does not truncate output... " >&6; }
+if ${ac_cv_path_SED+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+            ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/
+     for ac_i in 1 2 3 4 5 6 7; do
+       ac_script="$ac_script$as_nl$ac_script"
+     done
+     echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed
+     { ac_script=; unset ac_script;}
+     if test -z "$SED"; then
+  ac_path_SED_found=false
+  # Loop through the user's path and test for each of PROGNAME-LIST
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_prog in sed gsed; do
+    for ac_exec_ext in '' $ac_executable_extensions; do
+      ac_path_SED="$as_dir/$ac_prog$ac_exec_ext"
+      as_fn_executable_p "$ac_path_SED" || continue
+# Check for GNU ac_path_SED and select it if it is found.
+  # Check for GNU $ac_path_SED
+case `"$ac_path_SED" --version 2>&1` in
+*GNU*)
+  ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;;
+*)
+  ac_count=0
+  $as_echo_n 0123456789 >"conftest.in"
+  while :
+  do
+    cat "conftest.in" "conftest.in" >"conftest.tmp"
+    mv "conftest.tmp" "conftest.in"
+    cp "conftest.in" "conftest.nl"
+    $as_echo '' >> "conftest.nl"
+    "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break
+    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+    as_fn_arith $ac_count + 1 && ac_count=$as_val
+    if test $ac_count -gt ${ac_path_SED_max-0}; then
+      # Best one so far, save it but keep looking for a better one
+      ac_cv_path_SED="$ac_path_SED"
+      ac_path_SED_max=$ac_count
+    fi
+    # 10*(2^10) chars as input seems more than enough
+    test $ac_count -gt 10 && break
+  done
+  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+      $ac_path_SED_found && break 3
+    done
+  done
+  done
+IFS=$as_save_IFS
+  if test -z "$ac_cv_path_SED"; then
+    as_fn_error $? "no acceptable sed could be found in \$PATH" "$LINENO" 5
+  fi
+else
+  ac_cv_path_SED=$SED
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5
+$as_echo "$ac_cv_path_SED" >&6; }
+ SED="$ac_cv_path_SED"
+  rm -f conftest.sed
+
+test -z "$SED" && SED=sed
+Xsed="$SED -e 1s/^X//"
+
+
+
+
+
+
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5
+$as_echo_n "checking for grep that handles long lines and -e... " >&6; }
+if ${ac_cv_path_GREP+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -z "$GREP"; then
+  ac_path_GREP_found=false
+  # Loop through the user's path and test for each of PROGNAME-LIST
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_prog in grep ggrep; do
+    for ac_exec_ext in '' $ac_executable_extensions; do
+      ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext"
+      as_fn_executable_p "$ac_path_GREP" || continue
+# Check for GNU ac_path_GREP and select it if it is found.
+  # Check for GNU $ac_path_GREP
+case `"$ac_path_GREP" --version 2>&1` in
+*GNU*)
+  ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;;
+*)
+  ac_count=0
+  $as_echo_n 0123456789 >"conftest.in"
+  while :
+  do
+    cat "conftest.in" "conftest.in" >"conftest.tmp"
+    mv "conftest.tmp" "conftest.in"
+    cp "conftest.in" "conftest.nl"
+    $as_echo 'GREP' >> "conftest.nl"
+    "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break
+    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+    as_fn_arith $ac_count + 1 && ac_count=$as_val
+    if test $ac_count -gt ${ac_path_GREP_max-0}; then
+      # Best one so far, save it but keep looking for a better one
+      ac_cv_path_GREP="$ac_path_GREP"
+      ac_path_GREP_max=$ac_count
+    fi
+    # 10*(2^10) chars as input seems more than enough
+    test $ac_count -gt 10 && break
+  done
+  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+      $ac_path_GREP_found && break 3
+    done
+  done
+  done
+IFS=$as_save_IFS
+  if test -z "$ac_cv_path_GREP"; then
+    as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
+  fi
+else
+  ac_cv_path_GREP=$GREP
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5
+$as_echo "$ac_cv_path_GREP" >&6; }
+ GREP="$ac_cv_path_GREP"
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5
+$as_echo_n "checking for egrep... " >&6; }
+if ${ac_cv_path_EGREP+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if echo a | $GREP -E '(a|b)' >/dev/null 2>&1
+   then ac_cv_path_EGREP="$GREP -E"
+   else
+     if test -z "$EGREP"; then
+  ac_path_EGREP_found=false
+  # Loop through the user's path and test for each of PROGNAME-LIST
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_prog in egrep; do
+    for ac_exec_ext in '' $ac_executable_extensions; do
+      ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext"
+      as_fn_executable_p "$ac_path_EGREP" || continue
+# Check for GNU ac_path_EGREP and select it if it is found.
+  # Check for GNU $ac_path_EGREP
+case `"$ac_path_EGREP" --version 2>&1` in
+*GNU*)
+  ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;;
+*)
+  ac_count=0
+  $as_echo_n 0123456789 >"conftest.in"
+  while :
+  do
+    cat "conftest.in" "conftest.in" >"conftest.tmp"
+    mv "conftest.tmp" "conftest.in"
+    cp "conftest.in" "conftest.nl"
+    $as_echo 'EGREP' >> "conftest.nl"
+    "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break
+    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+    as_fn_arith $ac_count + 1 && ac_count=$as_val
+    if test $ac_count -gt ${ac_path_EGREP_max-0}; then
+      # Best one so far, save it but keep looking for a better one
+      ac_cv_path_EGREP="$ac_path_EGREP"
+      ac_path_EGREP_max=$ac_count
+    fi
+    # 10*(2^10) chars as input seems more than enough
+    test $ac_count -gt 10 && break
+  done
+  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+      $ac_path_EGREP_found && break 3
+    done
+  done
+  done
+IFS=$as_save_IFS
+  if test -z "$ac_cv_path_EGREP"; then
+    as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
+  fi
+else
+  ac_cv_path_EGREP=$EGREP
+fi
+
+   fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5
+$as_echo "$ac_cv_path_EGREP" >&6; }
+ EGREP="$ac_cv_path_EGREP"
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for fgrep" >&5
+$as_echo_n "checking for fgrep... " >&6; }
+if ${ac_cv_path_FGREP+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if echo 'ab*c' | $GREP -F 'ab*c' >/dev/null 2>&1
+   then ac_cv_path_FGREP="$GREP -F"
+   else
+     if test -z "$FGREP"; then
+  ac_path_FGREP_found=false
+  # Loop through the user's path and test for each of PROGNAME-LIST
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_prog in fgrep; do
+    for ac_exec_ext in '' $ac_executable_extensions; do
+      ac_path_FGREP="$as_dir/$ac_prog$ac_exec_ext"
+      as_fn_executable_p "$ac_path_FGREP" || continue
+# Check for GNU ac_path_FGREP and select it if it is found.
+  # Check for GNU $ac_path_FGREP
+case `"$ac_path_FGREP" --version 2>&1` in
+*GNU*)
+  ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_found=:;;
+*)
+  ac_count=0
+  $as_echo_n 0123456789 >"conftest.in"
+  while :
+  do
+    cat "conftest.in" "conftest.in" >"conftest.tmp"
+    mv "conftest.tmp" "conftest.in"
+    cp "conftest.in" "conftest.nl"
+    $as_echo 'FGREP' >> "conftest.nl"
+    "$ac_path_FGREP" FGREP < "conftest.nl" >"conftest.out" 2>/dev/null || break
+    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+    as_fn_arith $ac_count + 1 && ac_count=$as_val
+    if test $ac_count -gt ${ac_path_FGREP_max-0}; then
+      # Best one so far, save it but keep looking for a better one
+      ac_cv_path_FGREP="$ac_path_FGREP"
+      ac_path_FGREP_max=$ac_count
+    fi
+    # 10*(2^10) chars as input seems more than enough
+    test $ac_count -gt 10 && break
+  done
+  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+      $ac_path_FGREP_found && break 3
+    done
+  done
+  done
+IFS=$as_save_IFS
+  if test -z "$ac_cv_path_FGREP"; then
+    as_fn_error $? "no acceptable fgrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
+  fi
+else
+  ac_cv_path_FGREP=$FGREP
+fi
+
+   fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_FGREP" >&5
+$as_echo "$ac_cv_path_FGREP" >&6; }
+ FGREP="$ac_cv_path_FGREP"
+
+
+test -z "$GREP" && GREP=grep
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+# Check whether --with-gnu-ld was given.
+if test "${with_gnu_ld+set}" = set; then :
+  withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes
+else
+  with_gnu_ld=no
+fi
+
+ac_prog=ld
+if test "$GCC" = yes; then
+  # Check if gcc -print-prog-name=ld gives a path.
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5
+$as_echo_n "checking for ld used by $CC... " >&6; }
+  case $host in
+  *-*-mingw*)
+    # gcc leaves a trailing carriage return which upsets mingw
+    ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
+  *)
+    ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
+  esac
+  case $ac_prog in
+    # Accept absolute paths.
+    [\\/]* | ?:[\\/]*)
+      re_direlt='/[^/][^/]*/\.\./'
+      # Canonicalize the pathname of ld
+      ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'`
+      while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do
+	ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"`
+      done
+      test -z "$LD" && LD="$ac_prog"
+      ;;
+  "")
+    # If it fails, then pretend we aren't using GCC.
+    ac_prog=ld
+    ;;
+  *)
+    # If it is relative, then search for the first ld in PATH.
+    with_gnu_ld=unknown
+    ;;
+  esac
+elif test "$with_gnu_ld" = yes; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5
+$as_echo_n "checking for GNU ld... " >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5
+$as_echo_n "checking for non-GNU ld... " >&6; }
+fi
+if ${lt_cv_path_LD+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -z "$LD"; then
+  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+  for ac_dir in $PATH; do
+    IFS="$lt_save_ifs"
+    test -z "$ac_dir" && ac_dir=.
+    if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
+      lt_cv_path_LD="$ac_dir/$ac_prog"
+      # Check to see if the program is GNU ld.  I'd rather use --version,
+      # but apparently some variants of GNU ld only accept -v.
+      # Break only if it was the GNU/non-GNU ld that we prefer.
+      case `"$lt_cv_path_LD" -v 2>&1 </dev/null` in
+      *GNU* | *'with BFD'*)
+	test "$with_gnu_ld" != no && break
+	;;
+      *)
+	test "$with_gnu_ld" != yes && break
+	;;
+      esac
+    fi
+  done
+  IFS="$lt_save_ifs"
+else
+  lt_cv_path_LD="$LD" # Let the user override the test with a path.
+fi
+fi
+
+LD="$lt_cv_path_LD"
+if test -n "$LD"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LD" >&5
+$as_echo "$LD" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5
+$as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; }
+if ${lt_cv_prog_gnu_ld+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  # I'd rather use --version here, but apparently some GNU lds only accept -v.
+case `$LD -v 2>&1 </dev/null` in
+*GNU* | *'with BFD'*)
+  lt_cv_prog_gnu_ld=yes
+  ;;
+*)
+  lt_cv_prog_gnu_ld=no
+  ;;
+esac
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_gnu_ld" >&5
+$as_echo "$lt_cv_prog_gnu_ld" >&6; }
+with_gnu_ld=$lt_cv_prog_gnu_ld
+
+
+
+
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for BSD- or MS-compatible name lister (nm)" >&5
+$as_echo_n "checking for BSD- or MS-compatible name lister (nm)... " >&6; }
+if ${lt_cv_path_NM+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$NM"; then
+  # Let the user override the test.
+  lt_cv_path_NM="$NM"
+else
+  lt_nm_to_check="${ac_tool_prefix}nm"
+  if test -n "$ac_tool_prefix" && test "$build" = "$host"; then
+    lt_nm_to_check="$lt_nm_to_check nm"
+  fi
+  for lt_tmp_nm in $lt_nm_to_check; do
+    lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+    for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do
+      IFS="$lt_save_ifs"
+      test -z "$ac_dir" && ac_dir=.
+      tmp_nm="$ac_dir/$lt_tmp_nm"
+      if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then
+	# Check to see if the nm accepts a BSD-compat flag.
+	# Adding the `sed 1q' prevents false positives on HP-UX, which says:
+	#   nm: unknown option "B" ignored
+	# Tru64's nm complains that /dev/null is an invalid object file
+	case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in
+	*/dev/null* | *'Invalid file or object type'*)
+	  lt_cv_path_NM="$tmp_nm -B"
+	  break
+	  ;;
+	*)
+	  case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in
+	  */dev/null*)
+	    lt_cv_path_NM="$tmp_nm -p"
+	    break
+	    ;;
+	  *)
+	    lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but
+	    continue # so that we can try to find one that supports BSD flags
+	    ;;
+	  esac
+	  ;;
+	esac
+      fi
+    done
+    IFS="$lt_save_ifs"
+  done
+  : ${lt_cv_path_NM=no}
+fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_NM" >&5
+$as_echo "$lt_cv_path_NM" >&6; }
+if test "$lt_cv_path_NM" != "no"; then
+  NM="$lt_cv_path_NM"
+else
+  # Didn't find any BSD compatible name lister, look for dumpbin.
+  if test -n "$DUMPBIN"; then :
+    # Let the user override the test.
+  else
+    if test -n "$ac_tool_prefix"; then
+  for ac_prog in dumpbin "link -dump"
+  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
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_DUMPBIN+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$DUMPBIN"; then
+  ac_cv_prog_DUMPBIN="$DUMPBIN" # 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_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_DUMPBIN="$ac_tool_prefix$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+DUMPBIN=$ac_cv_prog_DUMPBIN
+if test -n "$DUMPBIN"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DUMPBIN" >&5
+$as_echo "$DUMPBIN" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+    test -n "$DUMPBIN" && break
+  done
+fi
+if test -z "$DUMPBIN"; then
+  ac_ct_DUMPBIN=$DUMPBIN
+  for ac_prog in dumpbin "link -dump"
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_DUMPBIN+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_DUMPBIN"; then
+  ac_cv_prog_ac_ct_DUMPBIN="$ac_ct_DUMPBIN" # 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_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_DUMPBIN="$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_DUMPBIN=$ac_cv_prog_ac_ct_DUMPBIN
+if test -n "$ac_ct_DUMPBIN"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DUMPBIN" >&5
+$as_echo "$ac_ct_DUMPBIN" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  test -n "$ac_ct_DUMPBIN" && break
+done
+
+  if test "x$ac_ct_DUMPBIN" = x; then
+    DUMPBIN=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    DUMPBIN=$ac_ct_DUMPBIN
+  fi
+fi
+
+    case `$DUMPBIN -symbols /dev/null 2>&1 | sed '1q'` in
+    *COFF*)
+      DUMPBIN="$DUMPBIN -symbols"
+      ;;
+    *)
+      DUMPBIN=:
+      ;;
+    esac
+  fi
+
+  if test "$DUMPBIN" != ":"; then
+    NM="$DUMPBIN"
+  fi
+fi
+test -z "$NM" && NM=nm
+
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the name lister ($NM) interface" >&5
+$as_echo_n "checking the name lister ($NM) interface... " >&6; }
+if ${lt_cv_nm_interface+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_nm_interface="BSD nm"
+  echo "int some_variable = 0;" > conftest.$ac_ext
+  (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&5)
+  (eval "$ac_compile" 2>conftest.err)
+  cat conftest.err >&5
+  (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&5)
+  (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out)
+  cat conftest.err >&5
+  (eval echo "\"\$as_me:$LINENO: output\"" >&5)
+  cat conftest.out >&5
+  if $GREP 'External.*some_variable' conftest.out > /dev/null; then
+    lt_cv_nm_interface="MS dumpbin"
+  fi
+  rm -f conftest*
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_nm_interface" >&5
+$as_echo "$lt_cv_nm_interface" >&6; }
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5
+$as_echo_n "checking whether ln -s works... " >&6; }
+LN_S=$as_ln_s
+if test "$LN_S" = "ln -s"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5
+$as_echo "no, using $LN_S" >&6; }
+fi
+
+# find the maximum length of command line arguments
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the maximum length of command line arguments" >&5
+$as_echo_n "checking the maximum length of command line arguments... " >&6; }
+if ${lt_cv_sys_max_cmd_len+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+    i=0
+  teststring="ABCD"
+
+  case $build_os in
+  msdosdjgpp*)
+    # On DJGPP, this test can blow up pretty badly due to problems in libc
+    # (any single argument exceeding 2000 bytes causes a buffer overrun
+    # during glob expansion).  Even if it were fixed, the result of this
+    # check would be larger than it should be.
+    lt_cv_sys_max_cmd_len=12288;    # 12K is about right
+    ;;
+
+  gnu*)
+    # Under GNU Hurd, this test is not required because there is
+    # no limit to the length of command line arguments.
+    # Libtool will interpret -1 as no limit whatsoever
+    lt_cv_sys_max_cmd_len=-1;
+    ;;
+
+  cygwin* | mingw* | cegcc*)
+    # On Win9x/ME, this test blows up -- it succeeds, but takes
+    # about 5 minutes as the teststring grows exponentially.
+    # Worse, since 9x/ME are not pre-emptively multitasking,
+    # you end up with a "frozen" computer, even though with patience
+    # the test eventually succeeds (with a max line length of 256k).
+    # Instead, let's just punt: use the minimum linelength reported by
+    # all of the supported platforms: 8192 (on NT/2K/XP).
+    lt_cv_sys_max_cmd_len=8192;
+    ;;
+
+  mint*)
+    # On MiNT this can take a long time and run out of memory.
+    lt_cv_sys_max_cmd_len=8192;
+    ;;
+
+  amigaos*)
+    # On AmigaOS with pdksh, this test takes hours, literally.
+    # So we just punt and use a minimum line length of 8192.
+    lt_cv_sys_max_cmd_len=8192;
+    ;;
+
+  netbsd* | freebsd* | openbsd* | darwin* | dragonfly*)
+    # This has been around since 386BSD, at least.  Likely further.
+    if test -x /sbin/sysctl; then
+      lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax`
+    elif test -x /usr/sbin/sysctl; then
+      lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax`
+    else
+      lt_cv_sys_max_cmd_len=65536	# usable default for all BSDs
+    fi
+    # And add a safety zone
+    lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
+    lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
+    ;;
+
+  interix*)
+    # We know the value 262144 and hardcode it with a safety zone (like BSD)
+    lt_cv_sys_max_cmd_len=196608
+    ;;
+
+  os2*)
+    # The test takes a long time on OS/2.
+    lt_cv_sys_max_cmd_len=8192
+    ;;
+
+  osf*)
+    # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure
+    # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not
+    # nice to cause kernel panics so lets avoid the loop below.
+    # First set a reasonable default.
+    lt_cv_sys_max_cmd_len=16384
+    #
+    if test -x /sbin/sysconfig; then
+      case `/sbin/sysconfig -q proc exec_disable_arg_limit` in
+        *1*) lt_cv_sys_max_cmd_len=-1 ;;
+      esac
+    fi
+    ;;
+  sco3.2v5*)
+    lt_cv_sys_max_cmd_len=102400
+    ;;
+  sysv5* | sco5v6* | sysv4.2uw2*)
+    kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null`
+    if test -n "$kargmax"; then
+      lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[	 ]//'`
+    else
+      lt_cv_sys_max_cmd_len=32768
+    fi
+    ;;
+  *)
+    lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null`
+    if test -n "$lt_cv_sys_max_cmd_len"; then
+      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
+      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
+    else
+      # Make teststring a little bigger before we do anything with it.
+      # a 1K string should be a reasonable start.
+      for i in 1 2 3 4 5 6 7 8 ; do
+        teststring=$teststring$teststring
+      done
+      SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}}
+      # If test is not a shell built-in, we'll probably end up computing a
+      # maximum length that is only half of the actual maximum length, but
+      # we can't tell.
+      while { test "X"`env echo "$teststring$teststring" 2>/dev/null` \
+	         = "X$teststring$teststring"; } >/dev/null 2>&1 &&
+	      test $i != 17 # 1/2 MB should be enough
+      do
+        i=`expr $i + 1`
+        teststring=$teststring$teststring
+      done
+      # Only check the string length outside the loop.
+      lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1`
+      teststring=
+      # Add a significant safety factor because C++ compilers can tack on
+      # massive amounts of additional arguments before passing them to the
+      # linker.  It appears as though 1/2 is a usable value.
+      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2`
+    fi
+    ;;
+  esac
+
+fi
+
+if test -n $lt_cv_sys_max_cmd_len ; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sys_max_cmd_len" >&5
+$as_echo "$lt_cv_sys_max_cmd_len" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: none" >&5
+$as_echo "none" >&6; }
+fi
+max_cmd_len=$lt_cv_sys_max_cmd_len
+
+
+
+
+
+
+: ${CP="cp -f"}
+: ${MV="mv -f"}
+: ${RM="rm -f"}
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands some XSI constructs" >&5
+$as_echo_n "checking whether the shell understands some XSI constructs... " >&6; }
+# Try some XSI features
+xsi_shell=no
+( _lt_dummy="a/b/c"
+  test "${_lt_dummy##*/},${_lt_dummy%/*},${_lt_dummy#??}"${_lt_dummy%"$_lt_dummy"}, \
+      = c,a/b,b/c, \
+    && eval 'test $(( 1 + 1 )) -eq 2 \
+    && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \
+  && xsi_shell=yes
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $xsi_shell" >&5
+$as_echo "$xsi_shell" >&6; }
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands \"+=\"" >&5
+$as_echo_n "checking whether the shell understands \"+=\"... " >&6; }
+lt_shell_append=no
+( foo=bar; set foo baz; eval "$1+=\$2" && test "$foo" = barbaz ) \
+    >/dev/null 2>&1 \
+  && lt_shell_append=yes
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_shell_append" >&5
+$as_echo "$lt_shell_append" >&6; }
+
+
+if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
+  lt_unset=unset
+else
+  lt_unset=false
+fi
+
+
+
+
+
+# test EBCDIC or ASCII
+case `echo X|tr X '\101'` in
+ A) # ASCII based system
+    # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr
+  lt_SP2NL='tr \040 \012'
+  lt_NL2SP='tr \015\012 \040\040'
+  ;;
+ *) # EBCDIC based system
+  lt_SP2NL='tr \100 \n'
+  lt_NL2SP='tr \r\n \100\100'
+  ;;
+esac
+
+
+
+
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to $host format" >&5
+$as_echo_n "checking how to convert $build file names to $host format... " >&6; }
+if ${lt_cv_to_host_file_cmd+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  case $host in
+  *-*-mingw* )
+    case $build in
+      *-*-mingw* ) # actually msys
+        lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32
+        ;;
+      *-*-cygwin* )
+        lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32
+        ;;
+      * ) # otherwise, assume *nix
+        lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32
+        ;;
+    esac
+    ;;
+  *-*-cygwin* )
+    case $build in
+      *-*-mingw* ) # actually msys
+        lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin
+        ;;
+      *-*-cygwin* )
+        lt_cv_to_host_file_cmd=func_convert_file_noop
+        ;;
+      * ) # otherwise, assume *nix
+        lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin
+        ;;
+    esac
+    ;;
+  * ) # unhandled hosts (and "normal" native builds)
+    lt_cv_to_host_file_cmd=func_convert_file_noop
+    ;;
+esac
+
+fi
+
+to_host_file_cmd=$lt_cv_to_host_file_cmd
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_host_file_cmd" >&5
+$as_echo "$lt_cv_to_host_file_cmd" >&6; }
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to toolchain format" >&5
+$as_echo_n "checking how to convert $build file names to toolchain format... " >&6; }
+if ${lt_cv_to_tool_file_cmd+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  #assume ordinary cross tools, or native build.
+lt_cv_to_tool_file_cmd=func_convert_file_noop
+case $host in
+  *-*-mingw* )
+    case $build in
+      *-*-mingw* ) # actually msys
+        lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32
+        ;;
+    esac
+    ;;
+esac
+
+fi
+
+to_tool_file_cmd=$lt_cv_to_tool_file_cmd
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_tool_file_cmd" >&5
+$as_echo "$lt_cv_to_tool_file_cmd" >&6; }
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $LD option to reload object files" >&5
+$as_echo_n "checking for $LD option to reload object files... " >&6; }
+if ${lt_cv_ld_reload_flag+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_ld_reload_flag='-r'
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_reload_flag" >&5
+$as_echo "$lt_cv_ld_reload_flag" >&6; }
+reload_flag=$lt_cv_ld_reload_flag
+case $reload_flag in
+"" | " "*) ;;
+*) reload_flag=" $reload_flag" ;;
+esac
+reload_cmds='$LD$reload_flag -o $output$reload_objs'
+case $host_os in
+  cygwin* | mingw* | pw32* | cegcc*)
+    if test "$GCC" != yes; then
+      reload_cmds=false
+    fi
+    ;;
+  darwin*)
+    if test "$GCC" = yes; then
+      reload_cmds='$LTCC $LTCFLAGS -nostdlib ${wl}-r -o $output$reload_objs'
+    else
+      reload_cmds='$LD$reload_flag -o $output$reload_objs'
+    fi
+    ;;
+esac
+
+
+
+
+
+
+
+
+
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args.
+set dummy ${ac_tool_prefix}objdump; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_OBJDUMP+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$OBJDUMP"; then
+  ac_cv_prog_OBJDUMP="$OBJDUMP" # 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_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+OBJDUMP=$ac_cv_prog_OBJDUMP
+if test -n "$OBJDUMP"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5
+$as_echo "$OBJDUMP" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_OBJDUMP"; then
+  ac_ct_OBJDUMP=$OBJDUMP
+  # Extract the first word of "objdump", so it can be a program name with args.
+set dummy objdump; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_OBJDUMP+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_OBJDUMP"; then
+  ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # 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_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_OBJDUMP="objdump"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP
+if test -n "$ac_ct_OBJDUMP"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5
+$as_echo "$ac_ct_OBJDUMP" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_OBJDUMP" = x; then
+    OBJDUMP="false"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    OBJDUMP=$ac_ct_OBJDUMP
+  fi
+else
+  OBJDUMP="$ac_cv_prog_OBJDUMP"
+fi
+
+test -z "$OBJDUMP" && OBJDUMP=objdump
+
+
+
+
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to recognize dependent libraries" >&5
+$as_echo_n "checking how to recognize dependent libraries... " >&6; }
+if ${lt_cv_deplibs_check_method+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_file_magic_cmd='$MAGIC_CMD'
+lt_cv_file_magic_test_file=
+lt_cv_deplibs_check_method='unknown'
+# Need to set the preceding variable on all platforms that support
+# interlibrary dependencies.
+# 'none' -- dependencies not supported.
+# `unknown' -- same as none, but documents that we really don't know.
+# 'pass_all' -- all dependencies passed with no checks.
+# 'test_compile' -- check by making test program.
+# 'file_magic [[regex]]' -- check by looking for files in library path
+# which responds to the $file_magic_cmd with a given extended regex.
+# If you have `file' or equivalent on your system and you're not sure
+# whether `pass_all' will *always* work, you probably want this one.
+
+case $host_os in
+aix[4-9]*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+beos*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+bsdi[45]*)
+  lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)'
+  lt_cv_file_magic_cmd='/usr/bin/file -L'
+  lt_cv_file_magic_test_file=/shlib/libc.so
+  ;;
+
+cygwin*)
+  # func_win32_libid is a shell function defined in ltmain.sh
+  lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
+  lt_cv_file_magic_cmd='func_win32_libid'
+  ;;
+
+mingw* | pw32*)
+  # Base MSYS/MinGW do not provide the 'file' command needed by
+  # func_win32_libid shell function, so use a weaker test based on 'objdump',
+  # unless we find 'file', for example because we are cross-compiling.
+  # func_win32_libid assumes BSD nm, so disallow it if using MS dumpbin.
+  if ( test "$lt_cv_nm_interface" = "BSD nm" && file / ) >/dev/null 2>&1; then
+    lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
+    lt_cv_file_magic_cmd='func_win32_libid'
+  else
+    # Keep this pattern in sync with the one in func_win32_libid.
+    lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)'
+    lt_cv_file_magic_cmd='$OBJDUMP -f'
+  fi
+  ;;
+
+cegcc*)
+  # use the weaker test based on 'objdump'. See mingw*.
+  lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?'
+  lt_cv_file_magic_cmd='$OBJDUMP -f'
+  ;;
+
+darwin* | rhapsody*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+freebsd* | dragonfly*)
+  if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then
+    case $host_cpu in
+    i*86 )
+      # Not sure whether the presence of OpenBSD here was a mistake.
+      # Let's accept both of them until this is cleared up.
+      lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[3-9]86 (compact )?demand paged shared library'
+      lt_cv_file_magic_cmd=/usr/bin/file
+      lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*`
+      ;;
+    esac
+  else
+    lt_cv_deplibs_check_method=pass_all
+  fi
+  ;;
+
+gnu*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+haiku*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+hpux10.20* | hpux11*)
+  lt_cv_file_magic_cmd=/usr/bin/file
+  case $host_cpu in
+  ia64*)
+    lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - IA64'
+    lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so
+    ;;
+  hppa*64*)
+    lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]'
+    lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl
+    ;;
+  *)
+    lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9]\.[0-9]) shared library'
+    lt_cv_file_magic_test_file=/usr/lib/libc.sl
+    ;;
+  esac
+  ;;
+
+interix[3-9]*)
+  # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here
+  lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|\.a)$'
+  ;;
+
+irix5* | irix6* | nonstopux*)
+  case $LD in
+  *-32|*"-32 ") libmagic=32-bit;;
+  *-n32|*"-n32 ") libmagic=N32;;
+  *-64|*"-64 ") libmagic=64-bit;;
+  *) libmagic=never-match;;
+  esac
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+# This must be glibc/ELF.
+linux* | k*bsd*-gnu | kopensolaris*-gnu)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+netbsd*)
+  if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then
+    lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$'
+  else
+    lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|_pic\.a)$'
+  fi
+  ;;
+
+newos6*)
+  lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (executable|dynamic lib)'
+  lt_cv_file_magic_cmd=/usr/bin/file
+  lt_cv_file_magic_test_file=/usr/lib/libnls.so
+  ;;
+
+*nto* | *qnx*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+openbsd*)
+  if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+    lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|\.so|_pic\.a)$'
+  else
+    lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$'
+  fi
+  ;;
+
+osf3* | osf4* | osf5*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+rdos*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+solaris*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+sysv4 | sysv4.3*)
+  case $host_vendor in
+  motorola)
+    lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]'
+    lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*`
+    ;;
+  ncr)
+    lt_cv_deplibs_check_method=pass_all
+    ;;
+  sequent)
+    lt_cv_file_magic_cmd='/bin/file'
+    lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )'
+    ;;
+  sni)
+    lt_cv_file_magic_cmd='/bin/file'
+    lt_cv_deplibs_check_method="file_magic ELF [0-9][0-9]*-bit [LM]SB dynamic lib"
+    lt_cv_file_magic_test_file=/lib/libc.so
+    ;;
+  siemens)
+    lt_cv_deplibs_check_method=pass_all
+    ;;
+  pc)
+    lt_cv_deplibs_check_method=pass_all
+    ;;
+  esac
+  ;;
+
+tpf*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+esac
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_deplibs_check_method" >&5
+$as_echo "$lt_cv_deplibs_check_method" >&6; }
+
+file_magic_glob=
+want_nocaseglob=no
+if test "$build" = "$host"; then
+  case $host_os in
+  mingw* | pw32*)
+    if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then
+      want_nocaseglob=yes
+    else
+      file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[\1]\/[\1]\/g;/g"`
+    fi
+    ;;
+  esac
+fi
+
+file_magic_cmd=$lt_cv_file_magic_cmd
+deplibs_check_method=$lt_cv_deplibs_check_method
+test -z "$deplibs_check_method" && deplibs_check_method=unknown
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args.
+set dummy ${ac_tool_prefix}dlltool; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_DLLTOOL+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$DLLTOOL"; then
+  ac_cv_prog_DLLTOOL="$DLLTOOL" # 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_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+DLLTOOL=$ac_cv_prog_DLLTOOL
+if test -n "$DLLTOOL"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5
+$as_echo "$DLLTOOL" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_DLLTOOL"; then
+  ac_ct_DLLTOOL=$DLLTOOL
+  # Extract the first word of "dlltool", so it can be a program name with args.
+set dummy dlltool; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_DLLTOOL+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_DLLTOOL"; then
+  ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # 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_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_DLLTOOL="dlltool"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL
+if test -n "$ac_ct_DLLTOOL"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5
+$as_echo "$ac_ct_DLLTOOL" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_DLLTOOL" = x; then
+    DLLTOOL="false"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    DLLTOOL=$ac_ct_DLLTOOL
+  fi
+else
+  DLLTOOL="$ac_cv_prog_DLLTOOL"
+fi
+
+test -z "$DLLTOOL" && DLLTOOL=dlltool
+
+
+
+
+
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to associate runtime and link libraries" >&5
+$as_echo_n "checking how to associate runtime and link libraries... " >&6; }
+if ${lt_cv_sharedlib_from_linklib_cmd+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_sharedlib_from_linklib_cmd='unknown'
+
+case $host_os in
+cygwin* | mingw* | pw32* | cegcc*)
+  # two different shell functions defined in ltmain.sh
+  # decide which to use based on capabilities of $DLLTOOL
+  case `$DLLTOOL --help 2>&1` in
+  *--identify-strict*)
+    lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib
+    ;;
+  *)
+    lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback
+    ;;
+  esac
+  ;;
+*)
+  # fallback: assume linklib IS sharedlib
+  lt_cv_sharedlib_from_linklib_cmd="$ECHO"
+  ;;
+esac
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sharedlib_from_linklib_cmd" >&5
+$as_echo "$lt_cv_sharedlib_from_linklib_cmd" >&6; }
+sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd
+test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO
+
+
+
+
+
+
+
+if test -n "$ac_tool_prefix"; then
+  for ac_prog in ar
+  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
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_AR+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$AR"; then
+  ac_cv_prog_AR="$AR" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_AR="$ac_tool_prefix$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+AR=$ac_cv_prog_AR
+if test -n "$AR"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5
+$as_echo "$AR" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+    test -n "$AR" && break
+  done
+fi
+if test -z "$AR"; then
+  ac_ct_AR=$AR
+  for ac_prog in ar
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_AR+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_AR"; then
+  ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_AR="$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_AR=$ac_cv_prog_ac_ct_AR
+if test -n "$ac_ct_AR"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5
+$as_echo "$ac_ct_AR" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  test -n "$ac_ct_AR" && break
+done
+
+  if test "x$ac_ct_AR" = x; then
+    AR="false"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    AR=$ac_ct_AR
+  fi
+fi
+
+: ${AR=ar}
+: ${AR_FLAGS=cru}
+
+
+
+
+
+
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for archiver @FILE support" >&5
+$as_echo_n "checking for archiver @FILE support... " >&6; }
+if ${lt_cv_ar_at_file+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_ar_at_file=no
+   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  echo conftest.$ac_objext > conftest.lst
+      lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&5'
+      { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5
+  (eval $lt_ar_try) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }
+      if test "$ac_status" -eq 0; then
+	# Ensure the archiver fails upon bogus file names.
+	rm -f conftest.$ac_objext libconftest.a
+	{ { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5
+  (eval $lt_ar_try) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }
+	if test "$ac_status" -ne 0; then
+          lt_cv_ar_at_file=@
+        fi
+      fi
+      rm -f conftest.* libconftest.a
+
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ar_at_file" >&5
+$as_echo "$lt_cv_ar_at_file" >&6; }
+
+if test "x$lt_cv_ar_at_file" = xno; then
+  archiver_list_spec=
+else
+  archiver_list_spec=$lt_cv_ar_at_file
+fi
+
+
+
+
+
+
+
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args.
+set dummy ${ac_tool_prefix}strip; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_STRIP+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$STRIP"; then
+  ac_cv_prog_STRIP="$STRIP" # 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_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_STRIP="${ac_tool_prefix}strip"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+STRIP=$ac_cv_prog_STRIP
+if test -n "$STRIP"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5
+$as_echo "$STRIP" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_STRIP"; then
+  ac_ct_STRIP=$STRIP
+  # Extract the first word of "strip", so it can be a program name with args.
+set dummy strip; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_STRIP+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_STRIP"; then
+  ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # 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_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_STRIP="strip"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP
+if test -n "$ac_ct_STRIP"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5
+$as_echo "$ac_ct_STRIP" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_STRIP" = x; then
+    STRIP=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    STRIP=$ac_ct_STRIP
+  fi
+else
+  STRIP="$ac_cv_prog_STRIP"
+fi
+
+test -z "$STRIP" && STRIP=:
+
+
+
+
+
+
+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
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_RANLIB+:} false; then :
+  $as_echo_n "(cached) " >&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_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+RANLIB=$ac_cv_prog_RANLIB
+if test -n "$RANLIB"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5
+$as_echo "$RANLIB" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "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
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_RANLIB+:} false; then :
+  $as_echo_n "(cached) " >&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_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_RANLIB="ranlib"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB
+if test -n "$ac_ct_RANLIB"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5
+$as_echo "$ac_ct_RANLIB" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_RANLIB" = x; then
+    RANLIB=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    RANLIB=$ac_ct_RANLIB
+  fi
+else
+  RANLIB="$ac_cv_prog_RANLIB"
+fi
+
+test -z "$RANLIB" && RANLIB=:
+
+
+
+
+
+
+# Determine commands to create old-style static archives.
+old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs'
+old_postinstall_cmds='chmod 644 $oldlib'
+old_postuninstall_cmds=
+
+if test -n "$RANLIB"; then
+  case $host_os in
+  openbsd*)
+    old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib"
+    ;;
+  *)
+    old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib"
+    ;;
+  esac
+  old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib"
+fi
+
+case $host_os in
+  darwin*)
+    lock_old_archive_extraction=yes ;;
+  *)
+    lock_old_archive_extraction=no ;;
+esac
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+# If no C compiler was specified, use CC.
+LTCC=${LTCC-"$CC"}
+
+# If no C compiler flags were specified, use CFLAGS.
+LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
+
+# Allow CC to be a program name with arguments.
+compiler=$CC
+
+
+# Check for command to grab the raw symbol name followed by C symbol from nm.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking command to parse $NM output from $compiler object" >&5
+$as_echo_n "checking command to parse $NM output from $compiler object... " >&6; }
+if ${lt_cv_sys_global_symbol_pipe+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+
+# These are sane defaults that work on at least a few old systems.
+# [They come from Ultrix.  What could be older than Ultrix?!! ;)]
+
+# Character class describing NM global symbol codes.
+symcode='[BCDEGRST]'
+
+# Regexp to match symbols that can be accessed directly from C.
+sympat='\([_A-Za-z][_A-Za-z0-9]*\)'
+
+# Define system-specific variables.
+case $host_os in
+aix*)
+  symcode='[BCDT]'
+  ;;
+cygwin* | mingw* | pw32* | cegcc*)
+  symcode='[ABCDGISTW]'
+  ;;
+hpux*)
+  if test "$host_cpu" = ia64; then
+    symcode='[ABCDEGRST]'
+  fi
+  ;;
+irix* | nonstopux*)
+  symcode='[BCDEGRST]'
+  ;;
+osf*)
+  symcode='[BCDEGQRST]'
+  ;;
+solaris*)
+  symcode='[BDRT]'
+  ;;
+sco3.2v5*)
+  symcode='[DT]'
+  ;;
+sysv4.2uw2*)
+  symcode='[DT]'
+  ;;
+sysv5* | sco5v6* | unixware* | OpenUNIX*)
+  symcode='[ABDT]'
+  ;;
+sysv4)
+  symcode='[DFNSTU]'
+  ;;
+esac
+
+# If we're using GNU nm, then use its standard symbol codes.
+case `$NM -V 2>&1` in
+*GNU* | *'with BFD'*)
+  symcode='[ABCDGIRSTW]' ;;
+esac
+
+# Transform an extracted symbol line into a proper C declaration.
+# Some systems (esp. on ia64) link data and code symbols differently,
+# so use this general approach.
+lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'"
+
+# Transform an extracted symbol line into symbol name and symbol address
+lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\)[ ]*$/  {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/  {\"\2\", (void *) \&\2},/p'"
+lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([^ ]*\)[ ]*$/  {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \(lib[^ ]*\)$/  {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/  {\"lib\2\", (void *) \&\2},/p'"
+
+# Handle CRLF in mingw tool chain
+opt_cr=
+case $build_os in
+mingw*)
+  opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp
+  ;;
+esac
+
+# Try without a prefix underscore, then with it.
+for ac_symprfx in "" "_"; do
+
+  # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol.
+  symxfrm="\\1 $ac_symprfx\\2 \\2"
+
+  # Write the raw and C identifiers.
+  if test "$lt_cv_nm_interface" = "MS dumpbin"; then
+    # Fake it for dumpbin and say T for any non-static function
+    # and D for any global variable.
+    # Also find C++ and __fastcall symbols from MSVC++,
+    # which start with @ or ?.
+    lt_cv_sys_global_symbol_pipe="$AWK '"\
+"     {last_section=section; section=\$ 3};"\
+"     /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\
+"     /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\
+"     \$ 0!~/External *\|/{next};"\
+"     / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\
+"     {if(hide[section]) next};"\
+"     {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\
+"     {split(\$ 0, a, /\||\r/); split(a[2], s)};"\
+"     s[1]~/^[@?]/{print s[1], s[1]; next};"\
+"     s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\
+"     ' prfx=^$ac_symprfx"
+  else
+    lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[	 ]\($symcode$symcode*\)[	 ][	 ]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'"
+  fi
+  lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'"
+
+  # Check to see that the pipe works correctly.
+  pipe_works=no
+
+  rm -f conftest*
+  cat > conftest.$ac_ext <<_LT_EOF
+#ifdef __cplusplus
+extern "C" {
+#endif
+char nm_test_var;
+void nm_test_func(void);
+void nm_test_func(void){}
+#ifdef __cplusplus
+}
+#endif
+int main(){nm_test_var='a';nm_test_func();return(0);}
+_LT_EOF
+
+  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+    # Now try to grab the symbols.
+    nlist=conftest.nm
+    if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist\""; } >&5
+  (eval $NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && test -s "$nlist"; then
+      # Try sorting and uniquifying the output.
+      if sort "$nlist" | uniq > "$nlist"T; then
+	mv -f "$nlist"T "$nlist"
+      else
+	rm -f "$nlist"T
+      fi
+
+      # Make sure that we snagged all the symbols we need.
+      if $GREP ' nm_test_var$' "$nlist" >/dev/null; then
+	if $GREP ' nm_test_func$' "$nlist" >/dev/null; then
+	  cat <<_LT_EOF > conftest.$ac_ext
+/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests.  */
+#if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE)
+/* DATA imports from DLLs on WIN32 con't be const, because runtime
+   relocations are performed -- see ld's documentation on pseudo-relocs.  */
+# define LT_DLSYM_CONST
+#elif defined(__osf__)
+/* This system does not cope well with relocations in const data.  */
+# define LT_DLSYM_CONST
+#else
+# define LT_DLSYM_CONST const
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+_LT_EOF
+	  # Now generate the symbol file.
+	  eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext'
+
+	  cat <<_LT_EOF >> conftest.$ac_ext
+
+/* The mapping between symbol names and symbols.  */
+LT_DLSYM_CONST struct {
+  const char *name;
+  void       *address;
+}
+lt__PROGRAM__LTX_preloaded_symbols[] =
+{
+  { "@PROGRAM@", (void *) 0 },
+_LT_EOF
+	  $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/  {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext
+	  cat <<\_LT_EOF >> conftest.$ac_ext
+  {0, (void *) 0}
+};
+
+/* This works around a problem in FreeBSD linker */
+#ifdef FREEBSD_WORKAROUND
+static const void *lt_preloaded_setup() {
+  return lt__PROGRAM__LTX_preloaded_symbols;
+}
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+_LT_EOF
+	  # Now try linking the two files.
+	  mv conftest.$ac_objext conftstm.$ac_objext
+	  lt_globsym_save_LIBS=$LIBS
+	  lt_globsym_save_CFLAGS=$CFLAGS
+	  LIBS="conftstm.$ac_objext"
+	  CFLAGS="$CFLAGS$lt_prog_compiler_no_builtin_flag"
+	  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && test -s conftest${ac_exeext}; then
+	    pipe_works=yes
+	  fi
+	  LIBS=$lt_globsym_save_LIBS
+	  CFLAGS=$lt_globsym_save_CFLAGS
+	else
+	  echo "cannot find nm_test_func in $nlist" >&5
+	fi
+      else
+	echo "cannot find nm_test_var in $nlist" >&5
+      fi
+    else
+      echo "cannot run $lt_cv_sys_global_symbol_pipe" >&5
+    fi
+  else
+    echo "$progname: failed program was:" >&5
+    cat conftest.$ac_ext >&5
+  fi
+  rm -rf conftest* conftst*
+
+  # Do not use the global_symbol_pipe unless it works.
+  if test "$pipe_works" = yes; then
+    break
+  else
+    lt_cv_sys_global_symbol_pipe=
+  fi
+done
+
+fi
+
+if test -z "$lt_cv_sys_global_symbol_pipe"; then
+  lt_cv_sys_global_symbol_to_cdecl=
+fi
+if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: failed" >&5
+$as_echo "failed" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5
+$as_echo "ok" >&6; }
+fi
+
+# Response file support.
+if test "$lt_cv_nm_interface" = "MS dumpbin"; then
+  nm_file_list_spec='@'
+elif $NM --help 2>/dev/null | grep '[@]FILE' >/dev/null; then
+  nm_file_list_spec='@'
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for sysroot" >&5
+$as_echo_n "checking for sysroot... " >&6; }
+
+# Check whether --with-sysroot was given.
+if test "${with_sysroot+set}" = set; then :
+  withval=$with_sysroot;
+else
+  with_sysroot=no
+fi
+
+
+lt_sysroot=
+case ${with_sysroot} in #(
+ yes)
+   if test "$GCC" = yes; then
+     lt_sysroot=`$CC --print-sysroot 2>/dev/null`
+   fi
+   ;; #(
+ /*)
+   lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"`
+   ;; #(
+ no|'')
+   ;; #(
+ *)
+   { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${with_sysroot}" >&5
+$as_echo "${with_sysroot}" >&6; }
+   as_fn_error $? "The sysroot must be an absolute path." "$LINENO" 5
+   ;;
+esac
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${lt_sysroot:-no}" >&5
+$as_echo "${lt_sysroot:-no}" >&6; }
+
+
+
+
+
+# Check whether --enable-libtool-lock was given.
+if test "${enable_libtool_lock+set}" = set; then :
+  enableval=$enable_libtool_lock;
+fi
+
+test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes
+
+# Some flags need to be propagated to the compiler or linker for good
+# libtool support.
+case $host in
+ia64-*-hpux*)
+  # Find out which ABI we are using.
+  echo 'int i;' > conftest.$ac_ext
+  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+    case `/usr/bin/file conftest.$ac_objext` in
+      *ELF-32*)
+	HPUX_IA64_MODE="32"
+	;;
+      *ELF-64*)
+	HPUX_IA64_MODE="64"
+	;;
+    esac
+  fi
+  rm -rf conftest*
+  ;;
+*-*-irix6*)
+  # Find out which ABI we are using.
+  echo '#line '$LINENO' "configure"' > conftest.$ac_ext
+  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+    if test "$lt_cv_prog_gnu_ld" = yes; then
+      case `/usr/bin/file conftest.$ac_objext` in
+	*32-bit*)
+	  LD="${LD-ld} -melf32bsmip"
+	  ;;
+	*N32*)
+	  LD="${LD-ld} -melf32bmipn32"
+	  ;;
+	*64-bit*)
+	  LD="${LD-ld} -melf64bmip"
+	;;
+      esac
+    else
+      case `/usr/bin/file conftest.$ac_objext` in
+	*32-bit*)
+	  LD="${LD-ld} -32"
+	  ;;
+	*N32*)
+	  LD="${LD-ld} -n32"
+	  ;;
+	*64-bit*)
+	  LD="${LD-ld} -64"
+	  ;;
+      esac
+    fi
+  fi
+  rm -rf conftest*
+  ;;
+
+x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \
+s390*-*linux*|s390*-*tpf*|sparc*-*linux*)
+  # Find out which ABI we are using.
+  echo 'int i;' > conftest.$ac_ext
+  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+    case `/usr/bin/file conftest.o` in
+      *32-bit*)
+	case $host in
+	  x86_64-*kfreebsd*-gnu)
+	    LD="${LD-ld} -m elf_i386_fbsd"
+	    ;;
+	  x86_64-*linux*)
+	    LD="${LD-ld} -m elf_i386"
+	    ;;
+	  ppc64-*linux*|powerpc64-*linux*)
+	    LD="${LD-ld} -m elf32ppclinux"
+	    ;;
+	  s390x-*linux*)
+	    LD="${LD-ld} -m elf_s390"
+	    ;;
+	  sparc64-*linux*)
+	    LD="${LD-ld} -m elf32_sparc"
+	    ;;
+	esac
+	;;
+      *64-bit*)
+	case $host in
+	  x86_64-*kfreebsd*-gnu)
+	    LD="${LD-ld} -m elf_x86_64_fbsd"
+	    ;;
+	  x86_64-*linux*)
+	    LD="${LD-ld} -m elf_x86_64"
+	    ;;
+	  ppc*-*linux*|powerpc*-*linux*)
+	    LD="${LD-ld} -m elf64ppc"
+	    ;;
+	  s390*-*linux*|s390*-*tpf*)
+	    LD="${LD-ld} -m elf64_s390"
+	    ;;
+	  sparc*-*linux*)
+	    LD="${LD-ld} -m elf64_sparc"
+	    ;;
+	esac
+	;;
+    esac
+  fi
+  rm -rf conftest*
+  ;;
+
+*-*-sco3.2v5*)
+  # On SCO OpenServer 5, we need -belf to get full-featured binaries.
+  SAVE_CFLAGS="$CFLAGS"
+  CFLAGS="$CFLAGS -belf"
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler needs -belf" >&5
+$as_echo_n "checking whether the C compiler needs -belf... " >&6; }
+if ${lt_cv_cc_needs_belf+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  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
+
+     cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  lt_cv_cc_needs_belf=yes
+else
+  lt_cv_cc_needs_belf=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext 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
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_cc_needs_belf" >&5
+$as_echo "$lt_cv_cc_needs_belf" >&6; }
+  if test x"$lt_cv_cc_needs_belf" != x"yes"; then
+    # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf
+    CFLAGS="$SAVE_CFLAGS"
+  fi
+  ;;
+*-*solaris*)
+  # Find out which ABI we are using.
+  echo 'int i;' > conftest.$ac_ext
+  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+    case `/usr/bin/file conftest.o` in
+    *64-bit*)
+      case $lt_cv_prog_gnu_ld in
+      yes*)
+        case $host in
+        i?86-*-solaris*)
+          LD="${LD-ld} -m elf_x86_64"
+          ;;
+        sparc*-*-solaris*)
+          LD="${LD-ld} -m elf64_sparc"
+          ;;
+        esac
+        # GNU ld 2.21 introduced _sol2 emulations.  Use them if available.
+        if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then
+          LD="${LD-ld}_sol2"
+        fi
+        ;;
+      *)
+	if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then
+	  LD="${LD-ld} -64"
+	fi
+	;;
+      esac
+      ;;
+    esac
+  fi
+  rm -rf conftest*
+  ;;
+esac
+
+need_locks="$enable_libtool_lock"
+
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}mt", so it can be a program name with args.
+set dummy ${ac_tool_prefix}mt; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_MANIFEST_TOOL+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$MANIFEST_TOOL"; then
+  ac_cv_prog_MANIFEST_TOOL="$MANIFEST_TOOL" # 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_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_MANIFEST_TOOL="${ac_tool_prefix}mt"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+MANIFEST_TOOL=$ac_cv_prog_MANIFEST_TOOL
+if test -n "$MANIFEST_TOOL"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MANIFEST_TOOL" >&5
+$as_echo "$MANIFEST_TOOL" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_MANIFEST_TOOL"; then
+  ac_ct_MANIFEST_TOOL=$MANIFEST_TOOL
+  # Extract the first word of "mt", so it can be a program name with args.
+set dummy mt; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_MANIFEST_TOOL+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_MANIFEST_TOOL"; then
+  ac_cv_prog_ac_ct_MANIFEST_TOOL="$ac_ct_MANIFEST_TOOL" # 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_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_MANIFEST_TOOL="mt"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_MANIFEST_TOOL=$ac_cv_prog_ac_ct_MANIFEST_TOOL
+if test -n "$ac_ct_MANIFEST_TOOL"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_MANIFEST_TOOL" >&5
+$as_echo "$ac_ct_MANIFEST_TOOL" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_MANIFEST_TOOL" = x; then
+    MANIFEST_TOOL=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    MANIFEST_TOOL=$ac_ct_MANIFEST_TOOL
+  fi
+else
+  MANIFEST_TOOL="$ac_cv_prog_MANIFEST_TOOL"
+fi
+
+test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $MANIFEST_TOOL is a manifest tool" >&5
+$as_echo_n "checking if $MANIFEST_TOOL is a manifest tool... " >&6; }
+if ${lt_cv_path_mainfest_tool+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_path_mainfest_tool=no
+  echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&5
+  $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out
+  cat conftest.err >&5
+  if $GREP 'Manifest Tool' conftest.out > /dev/null; then
+    lt_cv_path_mainfest_tool=yes
+  fi
+  rm -f conftest*
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_mainfest_tool" >&5
+$as_echo "$lt_cv_path_mainfest_tool" >&6; }
+if test "x$lt_cv_path_mainfest_tool" != xyes; then
+  MANIFEST_TOOL=:
+fi
+
+
+
+
+
+
+  case $host_os in
+    rhapsody* | darwin*)
+    if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}dsymutil", so it can be a program name with args.
+set dummy ${ac_tool_prefix}dsymutil; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_DSYMUTIL+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$DSYMUTIL"; then
+  ac_cv_prog_DSYMUTIL="$DSYMUTIL" # 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_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_DSYMUTIL="${ac_tool_prefix}dsymutil"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+DSYMUTIL=$ac_cv_prog_DSYMUTIL
+if test -n "$DSYMUTIL"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DSYMUTIL" >&5
+$as_echo "$DSYMUTIL" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_DSYMUTIL"; then
+  ac_ct_DSYMUTIL=$DSYMUTIL
+  # Extract the first word of "dsymutil", so it can be a program name with args.
+set dummy dsymutil; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_DSYMUTIL+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_DSYMUTIL"; then
+  ac_cv_prog_ac_ct_DSYMUTIL="$ac_ct_DSYMUTIL" # 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_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_DSYMUTIL="dsymutil"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_DSYMUTIL=$ac_cv_prog_ac_ct_DSYMUTIL
+if test -n "$ac_ct_DSYMUTIL"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DSYMUTIL" >&5
+$as_echo "$ac_ct_DSYMUTIL" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_DSYMUTIL" = x; then
+    DSYMUTIL=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    DSYMUTIL=$ac_ct_DSYMUTIL
+  fi
+else
+  DSYMUTIL="$ac_cv_prog_DSYMUTIL"
+fi
+
+    if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}nmedit", so it can be a program name with args.
+set dummy ${ac_tool_prefix}nmedit; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_NMEDIT+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$NMEDIT"; then
+  ac_cv_prog_NMEDIT="$NMEDIT" # 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_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_NMEDIT="${ac_tool_prefix}nmedit"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+NMEDIT=$ac_cv_prog_NMEDIT
+if test -n "$NMEDIT"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $NMEDIT" >&5
+$as_echo "$NMEDIT" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_NMEDIT"; then
+  ac_ct_NMEDIT=$NMEDIT
+  # Extract the first word of "nmedit", so it can be a program name with args.
+set dummy nmedit; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_NMEDIT+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_NMEDIT"; then
+  ac_cv_prog_ac_ct_NMEDIT="$ac_ct_NMEDIT" # 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_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_NMEDIT="nmedit"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_NMEDIT=$ac_cv_prog_ac_ct_NMEDIT
+if test -n "$ac_ct_NMEDIT"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_NMEDIT" >&5
+$as_echo "$ac_ct_NMEDIT" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_NMEDIT" = x; then
+    NMEDIT=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    NMEDIT=$ac_ct_NMEDIT
+  fi
+else
+  NMEDIT="$ac_cv_prog_NMEDIT"
+fi
+
+    if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}lipo", so it can be a program name with args.
+set dummy ${ac_tool_prefix}lipo; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_LIPO+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$LIPO"; then
+  ac_cv_prog_LIPO="$LIPO" # 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_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_LIPO="${ac_tool_prefix}lipo"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+LIPO=$ac_cv_prog_LIPO
+if test -n "$LIPO"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIPO" >&5
+$as_echo "$LIPO" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_LIPO"; then
+  ac_ct_LIPO=$LIPO
+  # Extract the first word of "lipo", so it can be a program name with args.
+set dummy lipo; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_LIPO+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_LIPO"; then
+  ac_cv_prog_ac_ct_LIPO="$ac_ct_LIPO" # 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_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_LIPO="lipo"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_LIPO=$ac_cv_prog_ac_ct_LIPO
+if test -n "$ac_ct_LIPO"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_LIPO" >&5
+$as_echo "$ac_ct_LIPO" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_LIPO" = x; then
+    LIPO=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    LIPO=$ac_ct_LIPO
+  fi
+else
+  LIPO="$ac_cv_prog_LIPO"
+fi
+
+    if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}otool", so it can be a program name with args.
+set dummy ${ac_tool_prefix}otool; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_OTOOL+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$OTOOL"; then
+  ac_cv_prog_OTOOL="$OTOOL" # 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_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_OTOOL="${ac_tool_prefix}otool"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+OTOOL=$ac_cv_prog_OTOOL
+if test -n "$OTOOL"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL" >&5
+$as_echo "$OTOOL" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_OTOOL"; then
+  ac_ct_OTOOL=$OTOOL
+  # Extract the first word of "otool", so it can be a program name with args.
+set dummy otool; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_OTOOL+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_OTOOL"; then
+  ac_cv_prog_ac_ct_OTOOL="$ac_ct_OTOOL" # 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_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_OTOOL="otool"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_OTOOL=$ac_cv_prog_ac_ct_OTOOL
+if test -n "$ac_ct_OTOOL"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL" >&5
+$as_echo "$ac_ct_OTOOL" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_OTOOL" = x; then
+    OTOOL=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    OTOOL=$ac_ct_OTOOL
+  fi
+else
+  OTOOL="$ac_cv_prog_OTOOL"
+fi
+
+    if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}otool64", so it can be a program name with args.
+set dummy ${ac_tool_prefix}otool64; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_OTOOL64+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$OTOOL64"; then
+  ac_cv_prog_OTOOL64="$OTOOL64" # 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_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_OTOOL64="${ac_tool_prefix}otool64"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+OTOOL64=$ac_cv_prog_OTOOL64
+if test -n "$OTOOL64"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL64" >&5
+$as_echo "$OTOOL64" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_OTOOL64"; then
+  ac_ct_OTOOL64=$OTOOL64
+  # Extract the first word of "otool64", so it can be a program name with args.
+set dummy otool64; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_OTOOL64+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_OTOOL64"; then
+  ac_cv_prog_ac_ct_OTOOL64="$ac_ct_OTOOL64" # 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_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_OTOOL64="otool64"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_OTOOL64=$ac_cv_prog_ac_ct_OTOOL64
+if test -n "$ac_ct_OTOOL64"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL64" >&5
+$as_echo "$ac_ct_OTOOL64" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_OTOOL64" = x; then
+    OTOOL64=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    OTOOL64=$ac_ct_OTOOL64
+  fi
+else
+  OTOOL64="$ac_cv_prog_OTOOL64"
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -single_module linker flag" >&5
+$as_echo_n "checking for -single_module linker flag... " >&6; }
+if ${lt_cv_apple_cc_single_mod+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_apple_cc_single_mod=no
+      if test -z "${LT_MULTI_MODULE}"; then
+	# By default we will add the -single_module flag. You can override
+	# by either setting the environment variable LT_MULTI_MODULE
+	# non-empty at configure time, or by adding -multi_module to the
+	# link flags.
+	rm -rf libconftest.dylib*
+	echo "int foo(void){return 1;}" > conftest.c
+	echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \
+-dynamiclib -Wl,-single_module conftest.c" >&5
+	$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \
+	  -dynamiclib -Wl,-single_module conftest.c 2>conftest.err
+        _lt_result=$?
+	# If there is a non-empty error log, and "single_module"
+	# appears in it, assume the flag caused a linker warning
+        if test -s conftest.err && $GREP single_module conftest.err; then
+	  cat conftest.err >&5
+	# Otherwise, if the output was created with a 0 exit code from
+	# the compiler, it worked.
+	elif test -f libconftest.dylib && test $_lt_result -eq 0; then
+	  lt_cv_apple_cc_single_mod=yes
+	else
+	  cat conftest.err >&5
+	fi
+	rm -rf libconftest.dylib*
+	rm -f conftest.*
+      fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_apple_cc_single_mod" >&5
+$as_echo "$lt_cv_apple_cc_single_mod" >&6; }
+
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -exported_symbols_list linker flag" >&5
+$as_echo_n "checking for -exported_symbols_list linker flag... " >&6; }
+if ${lt_cv_ld_exported_symbols_list+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_ld_exported_symbols_list=no
+      save_LDFLAGS=$LDFLAGS
+      echo "_main" > conftest.sym
+      LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym"
+      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  lt_cv_ld_exported_symbols_list=yes
+else
+  lt_cv_ld_exported_symbols_list=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+	LDFLAGS="$save_LDFLAGS"
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_exported_symbols_list" >&5
+$as_echo "$lt_cv_ld_exported_symbols_list" >&6; }
+
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -force_load linker flag" >&5
+$as_echo_n "checking for -force_load linker flag... " >&6; }
+if ${lt_cv_ld_force_load+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_ld_force_load=no
+      cat > conftest.c << _LT_EOF
+int forced_loaded() { return 2;}
+_LT_EOF
+      echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&5
+      $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&5
+      echo "$AR cru libconftest.a conftest.o" >&5
+      $AR cru libconftest.a conftest.o 2>&5
+      echo "$RANLIB libconftest.a" >&5
+      $RANLIB libconftest.a 2>&5
+      cat > conftest.c << _LT_EOF
+int main() { return 0;}
+_LT_EOF
+      echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&5
+      $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err
+      _lt_result=$?
+      if test -s conftest.err && $GREP force_load conftest.err; then
+	cat conftest.err >&5
+      elif test -f conftest && test $_lt_result -eq 0 && $GREP forced_load conftest >/dev/null 2>&1 ; then
+	lt_cv_ld_force_load=yes
+      else
+	cat conftest.err >&5
+      fi
+        rm -f conftest.err libconftest.a conftest conftest.c
+        rm -rf conftest.dSYM
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_force_load" >&5
+$as_echo "$lt_cv_ld_force_load" >&6; }
+    case $host_os in
+    rhapsody* | darwin1.[012])
+      _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;;
+    darwin1.*)
+      _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;;
+    darwin*) # darwin 5.x on
+      # if running on 10.5 or later, the deployment target defaults
+      # to the OS version, if on x86, and 10.4, the deployment
+      # target defaults to 10.4. Don't you love it?
+      case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in
+	10.0,*86*-darwin8*|10.0,*-darwin[91]*)
+	  _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;;
+	10.[012]*)
+	  _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;;
+	10.*)
+	  _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;;
+      esac
+    ;;
+  esac
+    if test "$lt_cv_apple_cc_single_mod" = "yes"; then
+      _lt_dar_single_mod='$single_module'
+    fi
+    if test "$lt_cv_ld_exported_symbols_list" = "yes"; then
+      _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym'
+    else
+      _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}'
+    fi
+    if test "$DSYMUTIL" != ":" && test "$lt_cv_ld_force_load" = "no"; then
+      _lt_dsymutil='~$DSYMUTIL $lib || :'
+    else
+      _lt_dsymutil=
+    fi
+    ;;
+  esac
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5
+$as_echo_n "checking how to run the C preprocessor... " >&6; }
+# On Suns, sometimes $CPP names a directory.
+if test -n "$CPP" && test -d "$CPP"; then
+  CPP=
+fi
+if test -z "$CPP"; then
+  if ${ac_cv_prog_CPP+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+      # Double quotes because CPP needs to be expanded
+    for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp"
+    do
+      ac_preproc_ok=false
+for ac_c_preproc_warn_flag in '' yes
+do
+  # Use a header file that comes with gcc, so configuring glibc
+  # with a fresh cross-compiler works.
+  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+  # <limits.h> exists even on freestanding compilers.
+  # On the NeXT, cc -E runs the code through the compiler's parser,
+  # not just through cpp. "Syntax error" is here to catch this case.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+		     Syntax error
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+
+else
+  # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+  # OK, works on sane cases.  Now check whether nonexistent headers
+  # can be detected and how.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <ac_nonexistent.h>
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+  # Broken: success on invalid input.
+continue
+else
+  # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.i conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then :
+  break
+fi
+
+    done
+    ac_cv_prog_CPP=$CPP
+
+fi
+  CPP=$ac_cv_prog_CPP
+else
+  ac_cv_prog_CPP=$CPP
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5
+$as_echo "$CPP" >&6; }
+ac_preproc_ok=false
+for ac_c_preproc_warn_flag in '' yes
+do
+  # Use a header file that comes with gcc, so configuring glibc
+  # with a fresh cross-compiler works.
+  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+  # <limits.h> exists even on freestanding compilers.
+  # On the NeXT, cc -E runs the code through the compiler's parser,
+  # not just through cpp. "Syntax error" is here to catch this case.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+		     Syntax error
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+
+else
+  # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+  # OK, works on sane cases.  Now check whether nonexistent headers
+  # can be detected and how.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <ac_nonexistent.h>
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+  # Broken: success on invalid input.
+continue
+else
+  # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.i conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then :
+
+else
+  { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "C preprocessor \"$CPP\" fails sanity check
+See \`config.log' for more details" "$LINENO" 5; }
+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
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5
+$as_echo_n "checking for ANSI C header files... " >&6; }
+if ${ac_cv_header_stdc+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <stdlib.h>
+#include <stdarg.h>
+#include <string.h>
+#include <float.h>
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_header_stdc=yes
+else
+  ac_cv_header_stdc=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+
+if test $ac_cv_header_stdc = yes; then
+  # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <string.h>
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "memchr" >/dev/null 2>&1; then :
+
+else
+  ac_cv_header_stdc=no
+fi
+rm -f conftest*
+
+fi
+
+if test $ac_cv_header_stdc = yes; then
+  # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <stdlib.h>
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "free" >/dev/null 2>&1; then :
+
+else
+  ac_cv_header_stdc=no
+fi
+rm -f conftest*
+
+fi
+
+if test $ac_cv_header_stdc = yes; then
+  # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.
+  if test "$cross_compiling" = yes; then :
+  :
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <ctype.h>
+#include <stdlib.h>
+#if ((' ' & 0x0FF) == 0x020)
+# define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
+# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
+#else
+# define ISLOWER(c) \
+		   (('a' <= (c) && (c) <= 'i') \
+		     || ('j' <= (c) && (c) <= 'r') \
+		     || ('s' <= (c) && (c) <= 'z'))
+# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c))
+#endif
+
+#define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))
+int
+main ()
+{
+  int i;
+  for (i = 0; i < 256; i++)
+    if (XOR (islower (i), ISLOWER (i))
+	|| toupper (i) != TOUPPER (i))
+      return 2;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"; then :
+
+else
+  ac_cv_header_stdc=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5
+$as_echo "$ac_cv_header_stdc" >&6; }
+if test $ac_cv_header_stdc = yes; then
+
+$as_echo "#define STDC_HEADERS 1" >>confdefs.h
+
+fi
+
+# On IRIX 5.3, sys/types and inttypes.h are conflicting.
+for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \
+		  inttypes.h stdint.h unistd.h
+do :
+  as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
+ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default
+"
+if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
+  cat >>confdefs.h <<_ACEOF
+#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+
+for ac_header in dlfcn.h
+do :
+  ac_fn_c_check_header_compile "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default
+"
+if test "x$ac_cv_header_dlfcn_h" = xyes; then :
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_DLFCN_H 1
+_ACEOF
+
+fi
+
+done
+
+
+
+
+func_stripname_cnf ()
+{
+  case ${2} in
+  .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;;
+  *)  func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;;
+  esac
+} # func_stripname_cnf
+
+
+
+
+
+# Set options
+
+
+
+        enable_dlopen=no
+
+
+  enable_win32_dll=no
+
+
+            # Check whether --enable-shared was given.
+if test "${enable_shared+set}" = set; then :
+  enableval=$enable_shared; p=${PACKAGE-default}
+    case $enableval in
+    yes) enable_shared=yes ;;
+    no) enable_shared=no ;;
+    *)
+      enable_shared=no
+      # Look at the argument we got.  We use all the common list separators.
+      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+      for pkg in $enableval; do
+	IFS="$lt_save_ifs"
+	if test "X$pkg" = "X$p"; then
+	  enable_shared=yes
+	fi
+      done
+      IFS="$lt_save_ifs"
+      ;;
+    esac
+else
+  enable_shared=yes
+fi
+
+
+
+
+
+
+
+
+
+  # Check whether --enable-static was given.
+if test "${enable_static+set}" = set; then :
+  enableval=$enable_static; p=${PACKAGE-default}
+    case $enableval in
+    yes) enable_static=yes ;;
+    no) enable_static=no ;;
+    *)
+     enable_static=no
+      # Look at the argument we got.  We use all the common list separators.
+      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+      for pkg in $enableval; do
+	IFS="$lt_save_ifs"
+	if test "X$pkg" = "X$p"; then
+	  enable_static=yes
+	fi
+      done
+      IFS="$lt_save_ifs"
+      ;;
+    esac
+else
+  enable_static=yes
+fi
+
+
+
+
+
+
+
+
+
+
+# Check whether --with-pic was given.
+if test "${with_pic+set}" = set; then :
+  withval=$with_pic; lt_p=${PACKAGE-default}
+    case $withval in
+    yes|no) pic_mode=$withval ;;
+    *)
+      pic_mode=default
+      # Look at the argument we got.  We use all the common list separators.
+      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+      for lt_pkg in $withval; do
+	IFS="$lt_save_ifs"
+	if test "X$lt_pkg" = "X$lt_p"; then
+	  pic_mode=yes
+	fi
+      done
+      IFS="$lt_save_ifs"
+      ;;
+    esac
+else
+  pic_mode=default
+fi
+
+
+test -z "$pic_mode" && pic_mode=default
+
+
+
+
+
+
+
+  # Check whether --enable-fast-install was given.
+if test "${enable_fast_install+set}" = set; then :
+  enableval=$enable_fast_install; p=${PACKAGE-default}
+    case $enableval in
+    yes) enable_fast_install=yes ;;
+    no) enable_fast_install=no ;;
+    *)
+      enable_fast_install=no
+      # Look at the argument we got.  We use all the common list separators.
+      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+      for pkg in $enableval; do
+	IFS="$lt_save_ifs"
+	if test "X$pkg" = "X$p"; then
+	  enable_fast_install=yes
+	fi
+      done
+      IFS="$lt_save_ifs"
+      ;;
+    esac
+else
+  enable_fast_install=yes
+fi
+
+
+
+
+
+
+
+
+
+
+
+# This can be used to rebuild libtool when needed
+LIBTOOL_DEPS="$ltmain"
+
+# Always use our own libtool.
+LIBTOOL='$(SHELL) $(top_builddir)/libtool'
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+test -z "$LN_S" && LN_S="ln -s"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+if test -n "${ZSH_VERSION+set}" ; then
+   setopt NO_GLOB_SUBST
+fi
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for objdir" >&5
+$as_echo_n "checking for objdir... " >&6; }
+if ${lt_cv_objdir+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  rm -f .libs 2>/dev/null
+mkdir .libs 2>/dev/null
+if test -d .libs; then
+  lt_cv_objdir=.libs
+else
+  # MS-DOS does not allow filenames that begin with a dot.
+  lt_cv_objdir=_libs
+fi
+rmdir .libs 2>/dev/null
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_objdir" >&5
+$as_echo "$lt_cv_objdir" >&6; }
+objdir=$lt_cv_objdir
+
+
+
+
+
+cat >>confdefs.h <<_ACEOF
+#define LT_OBJDIR "$lt_cv_objdir/"
+_ACEOF
+
+
+
+
+case $host_os in
+aix3*)
+  # AIX sometimes has problems with the GCC collect2 program.  For some
+  # reason, if we set the COLLECT_NAMES environment variable, the problems
+  # vanish in a puff of smoke.
+  if test "X${COLLECT_NAMES+set}" != Xset; then
+    COLLECT_NAMES=
+    export COLLECT_NAMES
+  fi
+  ;;
+esac
+
+# Global variables:
+ofile=libtool
+can_build_shared=yes
+
+# All known linkers require a `.a' archive for static linking (except MSVC,
+# which needs '.lib').
+libext=a
+
+with_gnu_ld="$lt_cv_prog_gnu_ld"
+
+old_CC="$CC"
+old_CFLAGS="$CFLAGS"
+
+# Set sane defaults for various variables
+test -z "$CC" && CC=cc
+test -z "$LTCC" && LTCC=$CC
+test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS
+test -z "$LD" && LD=ld
+test -z "$ac_objext" && ac_objext=o
+
+for cc_temp in $compiler""; do
+  case $cc_temp in
+    compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
+    distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
+    \-*) ;;
+    *) break;;
+  esac
+done
+cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"`
+
+
+# Only perform the check for file, if the check method requires it
+test -z "$MAGIC_CMD" && MAGIC_CMD=file
+case $deplibs_check_method in
+file_magic*)
+  if test "$file_magic_cmd" = '$MAGIC_CMD'; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ${ac_tool_prefix}file" >&5
+$as_echo_n "checking for ${ac_tool_prefix}file... " >&6; }
+if ${lt_cv_path_MAGIC_CMD+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  case $MAGIC_CMD in
+[\\/*] |  ?:[\\/]*)
+  lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path.
+  ;;
+*)
+  lt_save_MAGIC_CMD="$MAGIC_CMD"
+  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+  ac_dummy="/usr/bin$PATH_SEPARATOR$PATH"
+  for ac_dir in $ac_dummy; do
+    IFS="$lt_save_ifs"
+    test -z "$ac_dir" && ac_dir=.
+    if test -f $ac_dir/${ac_tool_prefix}file; then
+      lt_cv_path_MAGIC_CMD="$ac_dir/${ac_tool_prefix}file"
+      if test -n "$file_magic_test_file"; then
+	case $deplibs_check_method in
+	"file_magic "*)
+	  file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"`
+	  MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
+	  if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null |
+	    $EGREP "$file_magic_regex" > /dev/null; then
+	    :
+	  else
+	    cat <<_LT_EOF 1>&2
+
+*** Warning: the command libtool uses to detect shared libraries,
+*** $file_magic_cmd, produces output that libtool cannot recognize.
+*** The result is that libtool may fail to recognize shared libraries
+*** as such.  This will affect the creation of libtool libraries that
+*** depend on shared libraries, but programs linked with such libtool
+*** libraries will work regardless of this problem.  Nevertheless, you
+*** may want to report the problem to your system manager and/or to
+*** bug-libtool at gnu.org
+
+_LT_EOF
+	  fi ;;
+	esac
+      fi
+      break
+    fi
+  done
+  IFS="$lt_save_ifs"
+  MAGIC_CMD="$lt_save_MAGIC_CMD"
+  ;;
+esac
+fi
+
+MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
+if test -n "$MAGIC_CMD"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5
+$as_echo "$MAGIC_CMD" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+
+
+
+if test -z "$lt_cv_path_MAGIC_CMD"; then
+  if test -n "$ac_tool_prefix"; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for file" >&5
+$as_echo_n "checking for file... " >&6; }
+if ${lt_cv_path_MAGIC_CMD+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  case $MAGIC_CMD in
+[\\/*] |  ?:[\\/]*)
+  lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path.
+  ;;
+*)
+  lt_save_MAGIC_CMD="$MAGIC_CMD"
+  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+  ac_dummy="/usr/bin$PATH_SEPARATOR$PATH"
+  for ac_dir in $ac_dummy; do
+    IFS="$lt_save_ifs"
+    test -z "$ac_dir" && ac_dir=.
+    if test -f $ac_dir/file; then
+      lt_cv_path_MAGIC_CMD="$ac_dir/file"
+      if test -n "$file_magic_test_file"; then
+	case $deplibs_check_method in
+	"file_magic "*)
+	  file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"`
+	  MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
+	  if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null |
+	    $EGREP "$file_magic_regex" > /dev/null; then
+	    :
+	  else
+	    cat <<_LT_EOF 1>&2
+
+*** Warning: the command libtool uses to detect shared libraries,
+*** $file_magic_cmd, produces output that libtool cannot recognize.
+*** The result is that libtool may fail to recognize shared libraries
+*** as such.  This will affect the creation of libtool libraries that
+*** depend on shared libraries, but programs linked with such libtool
+*** libraries will work regardless of this problem.  Nevertheless, you
+*** may want to report the problem to your system manager and/or to
+*** bug-libtool at gnu.org
+
+_LT_EOF
+	  fi ;;
+	esac
+      fi
+      break
+    fi
+  done
+  IFS="$lt_save_ifs"
+  MAGIC_CMD="$lt_save_MAGIC_CMD"
+  ;;
+esac
+fi
+
+MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
+if test -n "$MAGIC_CMD"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5
+$as_echo "$MAGIC_CMD" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  else
+    MAGIC_CMD=:
+  fi
+fi
+
+  fi
+  ;;
+esac
+
+# Use C for the default configuration in the libtool script
+
+lt_save_CC="$CC"
+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
+
+
+# Source file extension for C test sources.
+ac_ext=c
+
+# Object file extension for compiled C test sources.
+objext=o
+objext=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code="int some_variable = 0;"
+
+# Code to be used in simple link tests
+lt_simple_link_test_code='int main(){return(0);}'
+
+
+
+
+
+
+
+# If no C compiler was specified, use CC.
+LTCC=${LTCC-"$CC"}
+
+# If no C compiler flags were specified, use CFLAGS.
+LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
+
+# Allow CC to be a program name with arguments.
+compiler=$CC
+
+# Save the default compiler, since it gets overwritten when the other
+# tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP.
+compiler_DEFAULT=$CC
+
+# save warnings/boilerplate of simple test code
+ac_outfile=conftest.$ac_objext
+echo "$lt_simple_compile_test_code" >conftest.$ac_ext
+eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_compiler_boilerplate=`cat conftest.err`
+$RM conftest*
+
+ac_outfile=conftest.$ac_objext
+echo "$lt_simple_link_test_code" >conftest.$ac_ext
+eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_linker_boilerplate=`cat conftest.err`
+$RM -r conftest*
+
+
+## CAVEAT EMPTOR:
+## There is no encapsulation within the following macros, do not change
+## the running order or otherwise move them around unless you know exactly
+## what you are doing...
+if test -n "$compiler"; then
+
+lt_prog_compiler_no_builtin_flag=
+
+if test "$GCC" = yes; then
+  case $cc_basename in
+  nvcc*)
+    lt_prog_compiler_no_builtin_flag=' -Xcompiler -fno-builtin' ;;
+  *)
+    lt_prog_compiler_no_builtin_flag=' -fno-builtin' ;;
+  esac
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -fno-rtti -fno-exceptions" >&5
+$as_echo_n "checking if $compiler supports -fno-rtti -fno-exceptions... " >&6; }
+if ${lt_cv_prog_compiler_rtti_exceptions+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_prog_compiler_rtti_exceptions=no
+   ac_outfile=conftest.$ac_objext
+   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+   lt_compiler_flag="-fno-rtti -fno-exceptions"
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   # The option is referenced via a variable to avoid confusing sed.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
+   (eval "$lt_compile" 2>conftest.err)
+   ac_status=$?
+   cat conftest.err >&5
+   echo "$as_me:$LINENO: \$? = $ac_status" >&5
+   if (exit $ac_status) && test -s "$ac_outfile"; then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings other than the usual output.
+     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp
+     $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+     if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
+       lt_cv_prog_compiler_rtti_exceptions=yes
+     fi
+   fi
+   $RM conftest*
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_rtti_exceptions" >&5
+$as_echo "$lt_cv_prog_compiler_rtti_exceptions" >&6; }
+
+if test x"$lt_cv_prog_compiler_rtti_exceptions" = xyes; then
+    lt_prog_compiler_no_builtin_flag="$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions"
+else
+    :
+fi
+
+fi
+
+
+
+
+
+
+  lt_prog_compiler_wl=
+lt_prog_compiler_pic=
+lt_prog_compiler_static=
+
+
+  if test "$GCC" = yes; then
+    lt_prog_compiler_wl='-Wl,'
+    lt_prog_compiler_static='-static'
+
+    case $host_os in
+      aix*)
+      # All AIX code is PIC.
+      if test "$host_cpu" = ia64; then
+	# AIX 5 now supports IA64 processor
+	lt_prog_compiler_static='-Bstatic'
+      fi
+      ;;
+
+    amigaos*)
+      case $host_cpu in
+      powerpc)
+            # see comment about AmigaOS4 .so support
+            lt_prog_compiler_pic='-fPIC'
+        ;;
+      m68k)
+            # FIXME: we need at least 68020 code to build shared libraries, but
+            # adding the `-m68020' flag to GCC prevents building anything better,
+            # like `-m68040'.
+            lt_prog_compiler_pic='-m68020 -resident32 -malways-restore-a4'
+        ;;
+      esac
+      ;;
+
+    beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
+      # PIC is the default for these OSes.
+      ;;
+
+    mingw* | cygwin* | pw32* | os2* | cegcc*)
+      # This hack is so that the source file can tell whether it is being
+      # built for inclusion in a dll (and should export symbols for example).
+      # Although the cygwin gcc ignores -fPIC, still need this for old-style
+      # (--disable-auto-import) libraries
+      lt_prog_compiler_pic='-DDLL_EXPORT'
+      ;;
+
+    darwin* | rhapsody*)
+      # PIC is the default on this platform
+      # Common symbols not allowed in MH_DYLIB files
+      lt_prog_compiler_pic='-fno-common'
+      ;;
+
+    haiku*)
+      # PIC is the default for Haiku.
+      # The "-static" flag exists, but is broken.
+      lt_prog_compiler_static=
+      ;;
+
+    hpux*)
+      # PIC is the default for 64-bit PA HP-UX, but not for 32-bit
+      # PA HP-UX.  On IA64 HP-UX, PIC is the default but the pic flag
+      # sets the default TLS model and affects inlining.
+      case $host_cpu in
+      hppa*64*)
+	# +Z the default
+	;;
+      *)
+	lt_prog_compiler_pic='-fPIC'
+	;;
+      esac
+      ;;
+
+    interix[3-9]*)
+      # Interix 3.x gcc -fpic/-fPIC options generate broken code.
+      # Instead, we relocate shared libraries at runtime.
+      ;;
+
+    msdosdjgpp*)
+      # Just because we use GCC doesn't mean we suddenly get shared libraries
+      # on systems that don't support them.
+      lt_prog_compiler_can_build_shared=no
+      enable_shared=no
+      ;;
+
+    *nto* | *qnx*)
+      # QNX uses GNU C++, but need to define -shared option too, otherwise
+      # it will coredump.
+      lt_prog_compiler_pic='-fPIC -shared'
+      ;;
+
+    sysv4*MP*)
+      if test -d /usr/nec; then
+	lt_prog_compiler_pic=-Kconform_pic
+      fi
+      ;;
+
+    *)
+      lt_prog_compiler_pic='-fPIC'
+      ;;
+    esac
+
+    case $cc_basename in
+    nvcc*) # Cuda Compiler Driver 2.2
+      lt_prog_compiler_wl='-Xlinker '
+      if test -n "$lt_prog_compiler_pic"; then
+        lt_prog_compiler_pic="-Xcompiler $lt_prog_compiler_pic"
+      fi
+      ;;
+    esac
+  else
+    # PORTME Check for flag to pass linker flags through the system compiler.
+    case $host_os in
+    aix*)
+      lt_prog_compiler_wl='-Wl,'
+      if test "$host_cpu" = ia64; then
+	# AIX 5 now supports IA64 processor
+	lt_prog_compiler_static='-Bstatic'
+      else
+	lt_prog_compiler_static='-bnso -bI:/lib/syscalls.exp'
+      fi
+      ;;
+
+    mingw* | cygwin* | pw32* | os2* | cegcc*)
+      # This hack is so that the source file can tell whether it is being
+      # built for inclusion in a dll (and should export symbols for example).
+      lt_prog_compiler_pic='-DDLL_EXPORT'
+      ;;
+
+    hpux9* | hpux10* | hpux11*)
+      lt_prog_compiler_wl='-Wl,'
+      # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but
+      # not for PA HP-UX.
+      case $host_cpu in
+      hppa*64*|ia64*)
+	# +Z the default
+	;;
+      *)
+	lt_prog_compiler_pic='+Z'
+	;;
+      esac
+      # Is there a better lt_prog_compiler_static that works with the bundled CC?
+      lt_prog_compiler_static='${wl}-a ${wl}archive'
+      ;;
+
+    irix5* | irix6* | nonstopux*)
+      lt_prog_compiler_wl='-Wl,'
+      # PIC (with -KPIC) is the default.
+      lt_prog_compiler_static='-non_shared'
+      ;;
+
+    linux* | k*bsd*-gnu | kopensolaris*-gnu)
+      case $cc_basename in
+      # old Intel for x86_64 which still supported -KPIC.
+      ecc*)
+	lt_prog_compiler_wl='-Wl,'
+	lt_prog_compiler_pic='-KPIC'
+	lt_prog_compiler_static='-static'
+        ;;
+      # icc used to be incompatible with GCC.
+      # ICC 10 doesn't accept -KPIC any more.
+      icc* | ifort*)
+	lt_prog_compiler_wl='-Wl,'
+	lt_prog_compiler_pic='-fPIC'
+	lt_prog_compiler_static='-static'
+        ;;
+      # Lahey Fortran 8.1.
+      lf95*)
+	lt_prog_compiler_wl='-Wl,'
+	lt_prog_compiler_pic='--shared'
+	lt_prog_compiler_static='--static'
+	;;
+      nagfor*)
+	# NAG Fortran compiler
+	lt_prog_compiler_wl='-Wl,-Wl,,'
+	lt_prog_compiler_pic='-PIC'
+	lt_prog_compiler_static='-Bstatic'
+	;;
+      pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*)
+        # Portland Group compilers (*not* the Pentium gcc compiler,
+	# which looks to be a dead project)
+	lt_prog_compiler_wl='-Wl,'
+	lt_prog_compiler_pic='-fpic'
+	lt_prog_compiler_static='-Bstatic'
+        ;;
+      ccc*)
+        lt_prog_compiler_wl='-Wl,'
+        # All Alpha code is PIC.
+        lt_prog_compiler_static='-non_shared'
+        ;;
+      xl* | bgxl* | bgf* | mpixl*)
+	# IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene
+	lt_prog_compiler_wl='-Wl,'
+	lt_prog_compiler_pic='-qpic'
+	lt_prog_compiler_static='-qstaticlink'
+	;;
+      *)
+	case `$CC -V 2>&1 | sed 5q` in
+	*Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [1-7].* | *Sun*Fortran*\ 8.[0-3]*)
+	  # Sun Fortran 8.3 passes all unrecognized flags to the linker
+	  lt_prog_compiler_pic='-KPIC'
+	  lt_prog_compiler_static='-Bstatic'
+	  lt_prog_compiler_wl=''
+	  ;;
+	*Sun\ F* | *Sun*Fortran*)
+	  lt_prog_compiler_pic='-KPIC'
+	  lt_prog_compiler_static='-Bstatic'
+	  lt_prog_compiler_wl='-Qoption ld '
+	  ;;
+	*Sun\ C*)
+	  # Sun C 5.9
+	  lt_prog_compiler_pic='-KPIC'
+	  lt_prog_compiler_static='-Bstatic'
+	  lt_prog_compiler_wl='-Wl,'
+	  ;;
+        *Intel*\ [CF]*Compiler*)
+	  lt_prog_compiler_wl='-Wl,'
+	  lt_prog_compiler_pic='-fPIC'
+	  lt_prog_compiler_static='-static'
+	  ;;
+	*Portland\ Group*)
+	  lt_prog_compiler_wl='-Wl,'
+	  lt_prog_compiler_pic='-fpic'
+	  lt_prog_compiler_static='-Bstatic'
+	  ;;
+	esac
+	;;
+      esac
+      ;;
+
+    newsos6)
+      lt_prog_compiler_pic='-KPIC'
+      lt_prog_compiler_static='-Bstatic'
+      ;;
+
+    *nto* | *qnx*)
+      # QNX uses GNU C++, but need to define -shared option too, otherwise
+      # it will coredump.
+      lt_prog_compiler_pic='-fPIC -shared'
+      ;;
+
+    osf3* | osf4* | osf5*)
+      lt_prog_compiler_wl='-Wl,'
+      # All OSF/1 code is PIC.
+      lt_prog_compiler_static='-non_shared'
+      ;;
+
+    rdos*)
+      lt_prog_compiler_static='-non_shared'
+      ;;
+
+    solaris*)
+      lt_prog_compiler_pic='-KPIC'
+      lt_prog_compiler_static='-Bstatic'
+      case $cc_basename in
+      f77* | f90* | f95* | sunf77* | sunf90* | sunf95*)
+	lt_prog_compiler_wl='-Qoption ld ';;
+      *)
+	lt_prog_compiler_wl='-Wl,';;
+      esac
+      ;;
+
+    sunos4*)
+      lt_prog_compiler_wl='-Qoption ld '
+      lt_prog_compiler_pic='-PIC'
+      lt_prog_compiler_static='-Bstatic'
+      ;;
+
+    sysv4 | sysv4.2uw2* | sysv4.3*)
+      lt_prog_compiler_wl='-Wl,'
+      lt_prog_compiler_pic='-KPIC'
+      lt_prog_compiler_static='-Bstatic'
+      ;;
+
+    sysv4*MP*)
+      if test -d /usr/nec ;then
+	lt_prog_compiler_pic='-Kconform_pic'
+	lt_prog_compiler_static='-Bstatic'
+      fi
+      ;;
+
+    sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
+      lt_prog_compiler_wl='-Wl,'
+      lt_prog_compiler_pic='-KPIC'
+      lt_prog_compiler_static='-Bstatic'
+      ;;
+
+    unicos*)
+      lt_prog_compiler_wl='-Wl,'
+      lt_prog_compiler_can_build_shared=no
+      ;;
+
+    uts4*)
+      lt_prog_compiler_pic='-pic'
+      lt_prog_compiler_static='-Bstatic'
+      ;;
+
+    *)
+      lt_prog_compiler_can_build_shared=no
+      ;;
+    esac
+  fi
+
+case $host_os in
+  # For platforms which do not support PIC, -DPIC is meaningless:
+  *djgpp*)
+    lt_prog_compiler_pic=
+    ;;
+  *)
+    lt_prog_compiler_pic="$lt_prog_compiler_pic -DPIC"
+    ;;
+esac
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5
+$as_echo_n "checking for $compiler option to produce PIC... " >&6; }
+if ${lt_cv_prog_compiler_pic+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_prog_compiler_pic=$lt_prog_compiler_pic
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic" >&5
+$as_echo "$lt_cv_prog_compiler_pic" >&6; }
+lt_prog_compiler_pic=$lt_cv_prog_compiler_pic
+
+#
+# Check to make sure the PIC flag actually works.
+#
+if test -n "$lt_prog_compiler_pic"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5
+$as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic works... " >&6; }
+if ${lt_cv_prog_compiler_pic_works+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_prog_compiler_pic_works=no
+   ac_outfile=conftest.$ac_objext
+   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+   lt_compiler_flag="$lt_prog_compiler_pic -DPIC"
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   # The option is referenced via a variable to avoid confusing sed.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
+   (eval "$lt_compile" 2>conftest.err)
+   ac_status=$?
+   cat conftest.err >&5
+   echo "$as_me:$LINENO: \$? = $ac_status" >&5
+   if (exit $ac_status) && test -s "$ac_outfile"; then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings other than the usual output.
+     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp
+     $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+     if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
+       lt_cv_prog_compiler_pic_works=yes
+     fi
+   fi
+   $RM conftest*
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works" >&5
+$as_echo "$lt_cv_prog_compiler_pic_works" >&6; }
+
+if test x"$lt_cv_prog_compiler_pic_works" = xyes; then
+    case $lt_prog_compiler_pic in
+     "" | " "*) ;;
+     *) lt_prog_compiler_pic=" $lt_prog_compiler_pic" ;;
+     esac
+else
+    lt_prog_compiler_pic=
+     lt_prog_compiler_can_build_shared=no
+fi
+
+fi
+
+
+
+
+
+
+
+
+
+
+
+#
+# Check to make sure the static flag actually works.
+#
+wl=$lt_prog_compiler_wl eval lt_tmp_static_flag=\"$lt_prog_compiler_static\"
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5
+$as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; }
+if ${lt_cv_prog_compiler_static_works+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_prog_compiler_static_works=no
+   save_LDFLAGS="$LDFLAGS"
+   LDFLAGS="$LDFLAGS $lt_tmp_static_flag"
+   echo "$lt_simple_link_test_code" > conftest.$ac_ext
+   if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
+     # The linker can only warn and ignore the option if not recognized
+     # So say no if there are warnings
+     if test -s conftest.err; then
+       # Append any errors to the config.log.
+       cat conftest.err 1>&5
+       $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp
+       $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+       if diff conftest.exp conftest.er2 >/dev/null; then
+         lt_cv_prog_compiler_static_works=yes
+       fi
+     else
+       lt_cv_prog_compiler_static_works=yes
+     fi
+   fi
+   $RM -r conftest*
+   LDFLAGS="$save_LDFLAGS"
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works" >&5
+$as_echo "$lt_cv_prog_compiler_static_works" >&6; }
+
+if test x"$lt_cv_prog_compiler_static_works" = xyes; then
+    :
+else
+    lt_prog_compiler_static=
+fi
+
+
+
+
+
+
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5
+$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; }
+if ${lt_cv_prog_compiler_c_o+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_prog_compiler_c_o=no
+   $RM -r conftest 2>/dev/null
+   mkdir conftest
+   cd conftest
+   mkdir out
+   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+   lt_compiler_flag="-o out/conftest2.$ac_objext"
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
+   (eval "$lt_compile" 2>out/conftest.err)
+   ac_status=$?
+   cat out/conftest.err >&5
+   echo "$as_me:$LINENO: \$? = $ac_status" >&5
+   if (exit $ac_status) && test -s out/conftest2.$ac_objext
+   then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings
+     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp
+     $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
+     if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
+       lt_cv_prog_compiler_c_o=yes
+     fi
+   fi
+   chmod u+w . 2>&5
+   $RM conftest*
+   # SGI C++ compiler will create directory out/ii_files/ for
+   # template instantiation
+   test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files
+   $RM out/* && rmdir out
+   cd ..
+   $RM -r conftest
+   $RM conftest*
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5
+$as_echo "$lt_cv_prog_compiler_c_o" >&6; }
+
+
+
+
+
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5
+$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; }
+if ${lt_cv_prog_compiler_c_o+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_prog_compiler_c_o=no
+   $RM -r conftest 2>/dev/null
+   mkdir conftest
+   cd conftest
+   mkdir out
+   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+   lt_compiler_flag="-o out/conftest2.$ac_objext"
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
+   (eval "$lt_compile" 2>out/conftest.err)
+   ac_status=$?
+   cat out/conftest.err >&5
+   echo "$as_me:$LINENO: \$? = $ac_status" >&5
+   if (exit $ac_status) && test -s out/conftest2.$ac_objext
+   then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings
+     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp
+     $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
+     if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
+       lt_cv_prog_compiler_c_o=yes
+     fi
+   fi
+   chmod u+w . 2>&5
+   $RM conftest*
+   # SGI C++ compiler will create directory out/ii_files/ for
+   # template instantiation
+   test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files
+   $RM out/* && rmdir out
+   cd ..
+   $RM -r conftest
+   $RM conftest*
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5
+$as_echo "$lt_cv_prog_compiler_c_o" >&6; }
+
+
+
+
+hard_links="nottested"
+if test "$lt_cv_prog_compiler_c_o" = no && test "$need_locks" != no; then
+  # do not overwrite the value of need_locks provided by the user
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5
+$as_echo_n "checking if we can lock with hard links... " >&6; }
+  hard_links=yes
+  $RM conftest*
+  ln conftest.a conftest.b 2>/dev/null && hard_links=no
+  touch conftest.a
+  ln conftest.a conftest.b 2>&5 || hard_links=no
+  ln conftest.a conftest.b 2>/dev/null && hard_links=no
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5
+$as_echo "$hard_links" >&6; }
+  if test "$hard_links" = no; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5
+$as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;}
+    need_locks=warn
+  fi
+else
+  need_locks=no
+fi
+
+
+
+
+
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5
+$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; }
+
+  runpath_var=
+  allow_undefined_flag=
+  always_export_symbols=no
+  archive_cmds=
+  archive_expsym_cmds=
+  compiler_needs_object=no
+  enable_shared_with_static_runtimes=no
+  export_dynamic_flag_spec=
+  export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+  hardcode_automatic=no
+  hardcode_direct=no
+  hardcode_direct_absolute=no
+  hardcode_libdir_flag_spec=
+  hardcode_libdir_separator=
+  hardcode_minus_L=no
+  hardcode_shlibpath_var=unsupported
+  inherit_rpath=no
+  link_all_deplibs=unknown
+  module_cmds=
+  module_expsym_cmds=
+  old_archive_from_new_cmds=
+  old_archive_from_expsyms_cmds=
+  thread_safe_flag_spec=
+  whole_archive_flag_spec=
+  # include_expsyms should be a list of space-separated symbols to be *always*
+  # included in the symbol list
+  include_expsyms=
+  # exclude_expsyms can be an extended regexp of symbols to exclude
+  # it will be wrapped by ` (' and `)$', so one must not match beginning or
+  # end of line.  Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc',
+  # as well as any symbol that contains `d'.
+  exclude_expsyms='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'
+  # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out
+  # platforms (ab)use it in PIC code, but their linkers get confused if
+  # the symbol is explicitly referenced.  Since portable code cannot
+  # rely on this symbol name, it's probably fine to never include it in
+  # preloaded symbol tables.
+  # Exclude shared library initialization/finalization symbols.
+  extract_expsyms_cmds=
+
+  case $host_os in
+  cygwin* | mingw* | pw32* | cegcc*)
+    # FIXME: the MSVC++ port hasn't been tested in a loooong time
+    # When not using gcc, we currently assume that we are using
+    # Microsoft Visual C++.
+    if test "$GCC" != yes; then
+      with_gnu_ld=no
+    fi
+    ;;
+  interix*)
+    # we just hope/assume this is gcc and not c89 (= MSVC++)
+    with_gnu_ld=yes
+    ;;
+  openbsd*)
+    with_gnu_ld=no
+    ;;
+  esac
+
+  ld_shlibs=yes
+
+  # On some targets, GNU ld is compatible enough with the native linker
+  # that we're better off using the native interface for both.
+  lt_use_gnu_ld_interface=no
+  if test "$with_gnu_ld" = yes; then
+    case $host_os in
+      aix*)
+	# The AIX port of GNU ld has always aspired to compatibility
+	# with the native linker.  However, as the warning in the GNU ld
+	# block says, versions before 2.19.5* couldn't really create working
+	# shared libraries, regardless of the interface used.
+	case `$LD -v 2>&1` in
+	  *\ \(GNU\ Binutils\)\ 2.19.5*) ;;
+	  *\ \(GNU\ Binutils\)\ 2.[2-9]*) ;;
+	  *\ \(GNU\ Binutils\)\ [3-9]*) ;;
+	  *)
+	    lt_use_gnu_ld_interface=yes
+	    ;;
+	esac
+	;;
+      *)
+	lt_use_gnu_ld_interface=yes
+	;;
+    esac
+  fi
+
+  if test "$lt_use_gnu_ld_interface" = yes; then
+    # If archive_cmds runs LD, not CC, wlarc should be empty
+    wlarc='${wl}'
+
+    # Set some defaults for GNU ld with shared library support. These
+    # are reset later if shared libraries are not supported. Putting them
+    # here allows them to be overridden if necessary.
+    runpath_var=LD_RUN_PATH
+    hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+    export_dynamic_flag_spec='${wl}--export-dynamic'
+    # ancient GNU ld didn't support --whole-archive et. al.
+    if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then
+      whole_archive_flag_spec="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
+    else
+      whole_archive_flag_spec=
+    fi
+    supports_anon_versioning=no
+    case `$LD -v 2>&1` in
+      *GNU\ gold*) supports_anon_versioning=yes ;;
+      *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11
+      *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ...
+      *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ...
+      *\ 2.11.*) ;; # other 2.11 versions
+      *) supports_anon_versioning=yes ;;
+    esac
+
+    # See if GNU ld supports shared libraries.
+    case $host_os in
+    aix[3-9]*)
+      # On AIX/PPC, the GNU linker is very broken
+      if test "$host_cpu" != ia64; then
+	ld_shlibs=no
+	cat <<_LT_EOF 1>&2
+
+*** Warning: the GNU linker, at least up to release 2.19, is reported
+*** to be unable to reliably create shared libraries on AIX.
+*** Therefore, libtool is disabling shared libraries support.  If you
+*** really care for shared libraries, you may want to install binutils
+*** 2.20 or above, or modify your PATH so that a non-GNU linker is found.
+*** You will then need to restart the configuration process.
+
+_LT_EOF
+      fi
+      ;;
+
+    amigaos*)
+      case $host_cpu in
+      powerpc)
+            # see comment about AmigaOS4 .so support
+            archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+            archive_expsym_cmds=''
+        ;;
+      m68k)
+            archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
+            hardcode_libdir_flag_spec='-L$libdir'
+            hardcode_minus_L=yes
+        ;;
+      esac
+      ;;
+
+    beos*)
+      if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+	allow_undefined_flag=unsupported
+	# Joseph Beckenbach <jrb3 at best.com> says some releases of gcc
+	# support --undefined.  This deserves some investigation.  FIXME
+	archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+      else
+	ld_shlibs=no
+      fi
+      ;;
+
+    cygwin* | mingw* | pw32* | cegcc*)
+      # _LT_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless,
+      # as there is no search path for DLLs.
+      hardcode_libdir_flag_spec='-L$libdir'
+      export_dynamic_flag_spec='${wl}--export-all-symbols'
+      allow_undefined_flag=unsupported
+      always_export_symbols=no
+      enable_shared_with_static_runtimes=yes
+      export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols'
+      exclude_expsyms='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'
+
+      if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then
+        archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+	# If the export-symbols file already is a .def file (1st line
+	# is EXPORTS), use it as is; otherwise, prepend...
+	archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
+	  cp $export_symbols $output_objdir/$soname.def;
+	else
+	  echo EXPORTS > $output_objdir/$soname.def;
+	  cat $export_symbols >> $output_objdir/$soname.def;
+	fi~
+	$CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+      else
+	ld_shlibs=no
+      fi
+      ;;
+
+    haiku*)
+      archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+      link_all_deplibs=yes
+      ;;
+
+    interix[3-9]*)
+      hardcode_direct=no
+      hardcode_shlibpath_var=no
+      hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
+      export_dynamic_flag_spec='${wl}-E'
+      # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
+      # Instead, shared libraries are loaded at an image base (0x10000000 by
+      # default) and relocated if they conflict, which is a slow very memory
+      # consuming and fragmenting process.  To avoid this, we pick a random,
+      # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
+      # time.  Moving up from 0x10000000 also allows more sbrk(2) space.
+      archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+      archive_expsym_cmds='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+      ;;
+
+    gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu)
+      tmp_diet=no
+      if test "$host_os" = linux-dietlibc; then
+	case $cc_basename in
+	  diet\ *) tmp_diet=yes;;	# linux-dietlibc with static linking (!diet-dyn)
+	esac
+      fi
+      if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \
+	 && test "$tmp_diet" = no
+      then
+	tmp_addflag=' $pic_flag'
+	tmp_sharedflag='-shared'
+	case $cc_basename,$host_cpu in
+        pgcc*)				# Portland Group C compiler
+	  whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+	  tmp_addflag=' $pic_flag'
+	  ;;
+	pgf77* | pgf90* | pgf95* | pgfortran*)
+					# Portland Group f77 and f90 compilers
+	  whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+	  tmp_addflag=' $pic_flag -Mnomain' ;;
+	ecc*,ia64* | icc*,ia64*)	# Intel C compiler on ia64
+	  tmp_addflag=' -i_dynamic' ;;
+	efc*,ia64* | ifort*,ia64*)	# Intel Fortran compiler on ia64
+	  tmp_addflag=' -i_dynamic -nofor_main' ;;
+	ifc* | ifort*)			# Intel Fortran compiler
+	  tmp_addflag=' -nofor_main' ;;
+	lf95*)				# Lahey Fortran 8.1
+	  whole_archive_flag_spec=
+	  tmp_sharedflag='--shared' ;;
+	xl[cC]* | bgxl[cC]* | mpixl[cC]*) # IBM XL C 8.0 on PPC (deal with xlf below)
+	  tmp_sharedflag='-qmkshrobj'
+	  tmp_addflag= ;;
+	nvcc*)	# Cuda Compiler Driver 2.2
+	  whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+	  compiler_needs_object=yes
+	  ;;
+	esac
+	case `$CC -V 2>&1 | sed 5q` in
+	*Sun\ C*)			# Sun C 5.9
+	  whole_archive_flag_spec='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+	  compiler_needs_object=yes
+	  tmp_sharedflag='-G' ;;
+	*Sun\ F*)			# Sun Fortran 8.3
+	  tmp_sharedflag='-G' ;;
+	esac
+	archive_cmds='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+
+        if test "x$supports_anon_versioning" = xyes; then
+          archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~
+	    cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+	    echo "local: *; };" >> $output_objdir/$libname.ver~
+	    $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'
+        fi
+
+	case $cc_basename in
+	xlf* | bgf* | bgxlf* | mpixlf*)
+	  # IBM XL Fortran 10.1 on PPC cannot create shared libs itself
+	  whole_archive_flag_spec='--whole-archive$convenience --no-whole-archive'
+	  hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+	  archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib'
+	  if test "x$supports_anon_versioning" = xyes; then
+	    archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~
+	      cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+	      echo "local: *; };" >> $output_objdir/$libname.ver~
+	      $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib'
+	  fi
+	  ;;
+	esac
+      else
+        ld_shlibs=no
+      fi
+      ;;
+
+    netbsd*)
+      if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+	archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib'
+	wlarc=
+      else
+	archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+      fi
+      ;;
+
+    solaris*)
+      if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then
+	ld_shlibs=no
+	cat <<_LT_EOF 1>&2
+
+*** Warning: The releases 2.8.* of the GNU linker cannot reliably
+*** create shared libraries on Solaris systems.  Therefore, libtool
+*** is disabling shared libraries support.  We urge you to upgrade GNU
+*** binutils to release 2.9.1 or newer.  Another option is to modify
+*** your PATH or compiler configuration so that the native linker is
+*** used, and then restart.
+
+_LT_EOF
+      elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+	archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+      else
+	ld_shlibs=no
+      fi
+      ;;
+
+    sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*)
+      case `$LD -v 2>&1` in
+        *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*)
+	ld_shlibs=no
+	cat <<_LT_EOF 1>&2
+
+*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not
+*** reliably create shared libraries on SCO systems.  Therefore, libtool
+*** is disabling shared libraries support.  We urge you to upgrade GNU
+*** binutils to release 2.16.91.0.3 or newer.  Another option is to modify
+*** your PATH or compiler configuration so that the native linker is
+*** used, and then restart.
+
+_LT_EOF
+	;;
+	*)
+	  # For security reasons, it is highly recommended that you always
+	  # use absolute paths for naming shared libraries, and exclude the
+	  # DT_RUNPATH tag from executables and libraries.  But doing so
+	  # requires that you compile everything twice, which is a pain.
+	  if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+	    hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+	    archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	    archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+	  else
+	    ld_shlibs=no
+	  fi
+	;;
+      esac
+      ;;
+
+    sunos4*)
+      archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+      wlarc=
+      hardcode_direct=yes
+      hardcode_shlibpath_var=no
+      ;;
+
+    *)
+      if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+	archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+      else
+	ld_shlibs=no
+      fi
+      ;;
+    esac
+
+    if test "$ld_shlibs" = no; then
+      runpath_var=
+      hardcode_libdir_flag_spec=
+      export_dynamic_flag_spec=
+      whole_archive_flag_spec=
+    fi
+  else
+    # PORTME fill in a description of your system's linker (not GNU ld)
+    case $host_os in
+    aix3*)
+      allow_undefined_flag=unsupported
+      always_export_symbols=yes
+      archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname'
+      # Note: this linker hardcodes the directories in LIBPATH if there
+      # are no directories specified by -L.
+      hardcode_minus_L=yes
+      if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then
+	# Neither direct hardcoding nor static linking is supported with a
+	# broken collect2.
+	hardcode_direct=unsupported
+      fi
+      ;;
+
+    aix[4-9]*)
+      if test "$host_cpu" = ia64; then
+	# On IA64, the linker does run time linking by default, so we don't
+	# have to do anything special.
+	aix_use_runtimelinking=no
+	exp_sym_flag='-Bexport'
+	no_entry_flag=""
+      else
+	# If we're using GNU nm, then we don't want the "-C" option.
+	# -C means demangle to AIX nm, but means don't demangle with GNU nm
+	# Also, AIX nm treats weak defined symbols like other global
+	# defined symbols, whereas GNU nm marks them as "W".
+	if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then
+	  export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
+	else
+	  export_symbols_cmds='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
+	fi
+	aix_use_runtimelinking=no
+
+	# Test if we are trying to use run time linking or normal
+	# AIX style linking. If -brtl is somewhere in LDFLAGS, we
+	# need to do runtime linking.
+	case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*)
+	  for ld_flag in $LDFLAGS; do
+	  if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then
+	    aix_use_runtimelinking=yes
+	    break
+	  fi
+	  done
+	  ;;
+	esac
+
+	exp_sym_flag='-bexport'
+	no_entry_flag='-bnoentry'
+      fi
+
+      # When large executables or shared objects are built, AIX ld can
+      # have problems creating the table of contents.  If linking a library
+      # or program results in "error TOC overflow" add -mminimal-toc to
+      # CXXFLAGS/CFLAGS for g++/gcc.  In the cases where that is not
+      # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
+
+      archive_cmds=''
+      hardcode_direct=yes
+      hardcode_direct_absolute=yes
+      hardcode_libdir_separator=':'
+      link_all_deplibs=yes
+      file_list_spec='${wl}-f,'
+
+      if test "$GCC" = yes; then
+	case $host_os in aix4.[012]|aix4.[012].*)
+	# We only want to do this on AIX 4.2 and lower, the check
+	# below for broken collect2 doesn't work under 4.3+
+	  collect2name=`${CC} -print-prog-name=collect2`
+	  if test -f "$collect2name" &&
+	   strings "$collect2name" | $GREP resolve_lib_name >/dev/null
+	  then
+	  # We have reworked collect2
+	  :
+	  else
+	  # We have old collect2
+	  hardcode_direct=unsupported
+	  # It fails to find uninstalled libraries when the uninstalled
+	  # path is not listed in the libpath.  Setting hardcode_minus_L
+	  # to unsupported forces relinking
+	  hardcode_minus_L=yes
+	  hardcode_libdir_flag_spec='-L$libdir'
+	  hardcode_libdir_separator=
+	  fi
+	  ;;
+	esac
+	shared_flag='-shared'
+	if test "$aix_use_runtimelinking" = yes; then
+	  shared_flag="$shared_flag "'${wl}-G'
+	fi
+      else
+	# not using gcc
+	if test "$host_cpu" = ia64; then
+	# VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
+	# chokes on -Wl,-G. The following line is correct:
+	  shared_flag='-G'
+	else
+	  if test "$aix_use_runtimelinking" = yes; then
+	    shared_flag='${wl}-G'
+	  else
+	    shared_flag='${wl}-bM:SRE'
+	  fi
+	fi
+      fi
+
+      export_dynamic_flag_spec='${wl}-bexpall'
+      # It seems that -bexpall does not export symbols beginning with
+      # underscore (_), so it is better to generate a list of symbols to export.
+      always_export_symbols=yes
+      if test "$aix_use_runtimelinking" = yes; then
+	# Warning - without using the other runtime loading flags (-brtl),
+	# -berok will link without error, but may produce a broken library.
+	allow_undefined_flag='-berok'
+        # Determine the default libpath from the value encoded in an
+        # empty executable.
+        if test "${lt_cv_aix_libpath+set}" = set; then
+  aix_libpath=$lt_cv_aix_libpath
+else
+  if ${lt_cv_aix_libpath_+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+
+  lt_aix_libpath_sed='
+      /Import File Strings/,/^$/ {
+	  /^0/ {
+	      s/^0  *\([^ ]*\) *$/\1/
+	      p
+	  }
+      }'
+  lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+  # Check for a 64-bit object if we didn't find anything.
+  if test -z "$lt_cv_aix_libpath_"; then
+    lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+  fi
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+  if test -z "$lt_cv_aix_libpath_"; then
+    lt_cv_aix_libpath_="/usr/lib:/lib"
+  fi
+
+fi
+
+  aix_libpath=$lt_cv_aix_libpath_
+fi
+
+        hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath"
+        archive_expsym_cmds='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
+      else
+	if test "$host_cpu" = ia64; then
+	  hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib'
+	  allow_undefined_flag="-z nodefs"
+	  archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols"
+	else
+	 # Determine the default libpath from the value encoded in an
+	 # empty executable.
+	 if test "${lt_cv_aix_libpath+set}" = set; then
+  aix_libpath=$lt_cv_aix_libpath
+else
+  if ${lt_cv_aix_libpath_+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+
+  lt_aix_libpath_sed='
+      /Import File Strings/,/^$/ {
+	  /^0/ {
+	      s/^0  *\([^ ]*\) *$/\1/
+	      p
+	  }
+      }'
+  lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+  # Check for a 64-bit object if we didn't find anything.
+  if test -z "$lt_cv_aix_libpath_"; then
+    lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+  fi
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+  if test -z "$lt_cv_aix_libpath_"; then
+    lt_cv_aix_libpath_="/usr/lib:/lib"
+  fi
+
+fi
+
+  aix_libpath=$lt_cv_aix_libpath_
+fi
+
+	 hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath"
+	  # Warning - without using the other run time loading flags,
+	  # -berok will link without error, but may produce a broken library.
+	  no_undefined_flag=' ${wl}-bernotok'
+	  allow_undefined_flag=' ${wl}-berok'
+	  if test "$with_gnu_ld" = yes; then
+	    # We only use this code for GNU lds that support --whole-archive.
+	    whole_archive_flag_spec='${wl}--whole-archive$convenience ${wl}--no-whole-archive'
+	  else
+	    # Exported symbols can be pulled into shared objects from archives
+	    whole_archive_flag_spec='$convenience'
+	  fi
+	  archive_cmds_need_lc=yes
+	  # This is similar to how AIX traditionally builds its shared libraries.
+	  archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'
+	fi
+      fi
+      ;;
+
+    amigaos*)
+      case $host_cpu in
+      powerpc)
+            # see comment about AmigaOS4 .so support
+            archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+            archive_expsym_cmds=''
+        ;;
+      m68k)
+            archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
+            hardcode_libdir_flag_spec='-L$libdir'
+            hardcode_minus_L=yes
+        ;;
+      esac
+      ;;
+
+    bsdi[45]*)
+      export_dynamic_flag_spec=-rdynamic
+      ;;
+
+    cygwin* | mingw* | pw32* | cegcc*)
+      # When not using gcc, we currently assume that we are using
+      # Microsoft Visual C++.
+      # hardcode_libdir_flag_spec is actually meaningless, as there is
+      # no search path for DLLs.
+      case $cc_basename in
+      cl*)
+	# Native MSVC
+	hardcode_libdir_flag_spec=' '
+	allow_undefined_flag=unsupported
+	always_export_symbols=yes
+	file_list_spec='@'
+	# Tell ltmain to make .lib files, not .a files.
+	libext=lib
+	# Tell ltmain to make .dll files, not .so files.
+	shrext_cmds=".dll"
+	# FIXME: Setting linknames here is a bad hack.
+	archive_cmds='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames='
+	archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
+	    sed -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp;
+	  else
+	    sed -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp;
+	  fi~
+	  $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~
+	  linknames='
+	# The linker will not automatically build a static lib if we build a DLL.
+	# _LT_TAGVAR(old_archive_from_new_cmds, )='true'
+	enable_shared_with_static_runtimes=yes
+	exclude_expsyms='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*'
+	export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1,DATA/'\'' | $SED -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols'
+	# Don't use ranlib
+	old_postinstall_cmds='chmod 644 $oldlib'
+	postlink_cmds='lt_outputfile="@OUTPUT@"~
+	  lt_tool_outputfile="@TOOL_OUTPUT@"~
+	  case $lt_outputfile in
+	    *.exe|*.EXE) ;;
+	    *)
+	      lt_outputfile="$lt_outputfile.exe"
+	      lt_tool_outputfile="$lt_tool_outputfile.exe"
+	      ;;
+	  esac~
+	  if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then
+	    $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1;
+	    $RM "$lt_outputfile.manifest";
+	  fi'
+	;;
+      *)
+	# Assume MSVC wrapper
+	hardcode_libdir_flag_spec=' '
+	allow_undefined_flag=unsupported
+	# Tell ltmain to make .lib files, not .a files.
+	libext=lib
+	# Tell ltmain to make .dll files, not .so files.
+	shrext_cmds=".dll"
+	# FIXME: Setting linknames here is a bad hack.
+	archive_cmds='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames='
+	# The linker will automatically build a .lib file if we build a DLL.
+	old_archive_from_new_cmds='true'
+	# FIXME: Should let the user specify the lib program.
+	old_archive_cmds='lib -OUT:$oldlib$oldobjs$old_deplibs'
+	enable_shared_with_static_runtimes=yes
+	;;
+      esac
+      ;;
+
+    darwin* | rhapsody*)
+
+
+  archive_cmds_need_lc=no
+  hardcode_direct=no
+  hardcode_automatic=yes
+  hardcode_shlibpath_var=unsupported
+  if test "$lt_cv_ld_force_load" = "yes"; then
+    whole_archive_flag_spec='`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`'
+
+  else
+    whole_archive_flag_spec=''
+  fi
+  link_all_deplibs=yes
+  allow_undefined_flag="$_lt_dar_allow_undefined"
+  case $cc_basename in
+     ifort*) _lt_dar_can_shared=yes ;;
+     *) _lt_dar_can_shared=$GCC ;;
+  esac
+  if test "$_lt_dar_can_shared" = "yes"; then
+    output_verbose_link_cmd=func_echo_all
+    archive_cmds="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}"
+    module_cmds="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}"
+    archive_expsym_cmds="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}"
+    module_expsym_cmds="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}"
+
+  else
+  ld_shlibs=no
+  fi
+
+      ;;
+
+    dgux*)
+      archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      hardcode_libdir_flag_spec='-L$libdir'
+      hardcode_shlibpath_var=no
+      ;;
+
+    # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor
+    # support.  Future versions do this automatically, but an explicit c++rt0.o
+    # does not break anything, and helps significantly (at the cost of a little
+    # extra space).
+    freebsd2.2*)
+      archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o'
+      hardcode_libdir_flag_spec='-R$libdir'
+      hardcode_direct=yes
+      hardcode_shlibpath_var=no
+      ;;
+
+    # Unfortunately, older versions of FreeBSD 2 do not have this feature.
+    freebsd2.*)
+      archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+      hardcode_direct=yes
+      hardcode_minus_L=yes
+      hardcode_shlibpath_var=no
+      ;;
+
+    # FreeBSD 3 and greater uses gcc -shared to do shared libraries.
+    freebsd* | dragonfly*)
+      archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+      hardcode_libdir_flag_spec='-R$libdir'
+      hardcode_direct=yes
+      hardcode_shlibpath_var=no
+      ;;
+
+    hpux9*)
+      if test "$GCC" = yes; then
+	archive_cmds='$RM $output_objdir/$soname~$CC -shared $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+      else
+	archive_cmds='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+      fi
+      hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
+      hardcode_libdir_separator=:
+      hardcode_direct=yes
+
+      # hardcode_minus_L: Not really in the search PATH,
+      # but as the default location of the library.
+      hardcode_minus_L=yes
+      export_dynamic_flag_spec='${wl}-E'
+      ;;
+
+    hpux10*)
+      if test "$GCC" = yes && test "$with_gnu_ld" = no; then
+	archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'
+      fi
+      if test "$with_gnu_ld" = no; then
+	hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
+	hardcode_libdir_separator=:
+	hardcode_direct=yes
+	hardcode_direct_absolute=yes
+	export_dynamic_flag_spec='${wl}-E'
+	# hardcode_minus_L: Not really in the search PATH,
+	# but as the default location of the library.
+	hardcode_minus_L=yes
+      fi
+      ;;
+
+    hpux11*)
+      if test "$GCC" = yes && test "$with_gnu_ld" = no; then
+	case $host_cpu in
+	hppa*64*)
+	  archive_cmds='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	ia64*)
+	  archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	*)
+	  archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	esac
+      else
+	case $host_cpu in
+	hppa*64*)
+	  archive_cmds='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	ia64*)
+	  archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	*)
+
+	  # Older versions of the 11.00 compiler do not understand -b yet
+	  # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does)
+	  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC understands -b" >&5
+$as_echo_n "checking if $CC understands -b... " >&6; }
+if ${lt_cv_prog_compiler__b+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_prog_compiler__b=no
+   save_LDFLAGS="$LDFLAGS"
+   LDFLAGS="$LDFLAGS -b"
+   echo "$lt_simple_link_test_code" > conftest.$ac_ext
+   if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
+     # The linker can only warn and ignore the option if not recognized
+     # So say no if there are warnings
+     if test -s conftest.err; then
+       # Append any errors to the config.log.
+       cat conftest.err 1>&5
+       $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp
+       $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+       if diff conftest.exp conftest.er2 >/dev/null; then
+         lt_cv_prog_compiler__b=yes
+       fi
+     else
+       lt_cv_prog_compiler__b=yes
+     fi
+   fi
+   $RM -r conftest*
+   LDFLAGS="$save_LDFLAGS"
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler__b" >&5
+$as_echo "$lt_cv_prog_compiler__b" >&6; }
+
+if test x"$lt_cv_prog_compiler__b" = xyes; then
+    archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+else
+    archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'
+fi
+
+	  ;;
+	esac
+      fi
+      if test "$with_gnu_ld" = no; then
+	hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
+	hardcode_libdir_separator=:
+
+	case $host_cpu in
+	hppa*64*|ia64*)
+	  hardcode_direct=no
+	  hardcode_shlibpath_var=no
+	  ;;
+	*)
+	  hardcode_direct=yes
+	  hardcode_direct_absolute=yes
+	  export_dynamic_flag_spec='${wl}-E'
+
+	  # hardcode_minus_L: Not really in the search PATH,
+	  # but as the default location of the library.
+	  hardcode_minus_L=yes
+	  ;;
+	esac
+      fi
+      ;;
+
+    irix5* | irix6* | nonstopux*)
+      if test "$GCC" = yes; then
+	archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+	# Try to use the -exported_symbol ld option, if it does not
+	# work, assume that -exports_file does not work either and
+	# implicitly export all symbols.
+	# This should be the same for all languages, so no per-tag cache variable.
+	{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $host_os linker accepts -exported_symbol" >&5
+$as_echo_n "checking whether the $host_os linker accepts -exported_symbol... " >&6; }
+if ${lt_cv_irix_exported_symbol+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  save_LDFLAGS="$LDFLAGS"
+	   LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null"
+	   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+int foo (void) { return 0; }
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  lt_cv_irix_exported_symbol=yes
+else
+  lt_cv_irix_exported_symbol=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+           LDFLAGS="$save_LDFLAGS"
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_irix_exported_symbol" >&5
+$as_echo "$lt_cv_irix_exported_symbol" >&6; }
+	if test "$lt_cv_irix_exported_symbol" = yes; then
+          archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib'
+	fi
+      else
+	archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
+	archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib'
+      fi
+      archive_cmds_need_lc='no'
+      hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+      hardcode_libdir_separator=:
+      inherit_rpath=yes
+      link_all_deplibs=yes
+      ;;
+
+    netbsd*)
+      if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+	archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'  # a.out
+      else
+	archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags'      # ELF
+      fi
+      hardcode_libdir_flag_spec='-R$libdir'
+      hardcode_direct=yes
+      hardcode_shlibpath_var=no
+      ;;
+
+    newsos6)
+      archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      hardcode_direct=yes
+      hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+      hardcode_libdir_separator=:
+      hardcode_shlibpath_var=no
+      ;;
+
+    *nto* | *qnx*)
+      ;;
+
+    openbsd*)
+      if test -f /usr/libexec/ld.so; then
+	hardcode_direct=yes
+	hardcode_shlibpath_var=no
+	hardcode_direct_absolute=yes
+	if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+	  archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+	  archive_expsym_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols'
+	  hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
+	  export_dynamic_flag_spec='${wl}-E'
+	else
+	  case $host_os in
+	   openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*)
+	     archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+	     hardcode_libdir_flag_spec='-R$libdir'
+	     ;;
+	   *)
+	     archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+	     hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
+	     ;;
+	  esac
+	fi
+      else
+	ld_shlibs=no
+      fi
+      ;;
+
+    os2*)
+      hardcode_libdir_flag_spec='-L$libdir'
+      hardcode_minus_L=yes
+      allow_undefined_flag=unsupported
+      archive_cmds='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~echo DATA >> $output_objdir/$libname.def~echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def'
+      old_archive_from_new_cmds='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def'
+      ;;
+
+    osf3*)
+      if test "$GCC" = yes; then
+	allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*'
+	archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+      else
+	allow_undefined_flag=' -expect_unresolved \*'
+	archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
+      fi
+      archive_cmds_need_lc='no'
+      hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+      hardcode_libdir_separator=:
+      ;;
+
+    osf4* | osf5*)	# as osf3* with the addition of -msym flag
+      if test "$GCC" = yes; then
+	allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*'
+	archive_cmds='$CC -shared${allow_undefined_flag} $pic_flag $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+	hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+      else
+	allow_undefined_flag=' -expect_unresolved \*'
+	archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
+	archive_expsym_cmds='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~
+	$CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp'
+
+	# Both c and cxx compiler support -rpath directly
+	hardcode_libdir_flag_spec='-rpath $libdir'
+      fi
+      archive_cmds_need_lc='no'
+      hardcode_libdir_separator=:
+      ;;
+
+    solaris*)
+      no_undefined_flag=' -z defs'
+      if test "$GCC" = yes; then
+	wlarc='${wl}'
+	archive_cmds='$CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+	archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+	  $CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
+      else
+	case `$CC -V 2>&1` in
+	*"Compilers 5.0"*)
+	  wlarc=''
+	  archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	  archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+	  $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp'
+	  ;;
+	*)
+	  wlarc='${wl}'
+	  archive_cmds='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags'
+	  archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+	  $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
+	  ;;
+	esac
+      fi
+      hardcode_libdir_flag_spec='-R$libdir'
+      hardcode_shlibpath_var=no
+      case $host_os in
+      solaris2.[0-5] | solaris2.[0-5].*) ;;
+      *)
+	# The compiler driver will combine and reorder linker options,
+	# but understands `-z linker_flag'.  GCC discards it without `$wl',
+	# but is careful enough not to reorder.
+	# Supported since Solaris 2.6 (maybe 2.5.1?)
+	if test "$GCC" = yes; then
+	  whole_archive_flag_spec='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract'
+	else
+	  whole_archive_flag_spec='-z allextract$convenience -z defaultextract'
+	fi
+	;;
+      esac
+      link_all_deplibs=yes
+      ;;
+
+    sunos4*)
+      if test "x$host_vendor" = xsequent; then
+	# Use $CC to link under sequent, because it throws in some extra .o
+	# files that make .init and .fini sections work.
+	archive_cmds='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags'
+      fi
+      hardcode_libdir_flag_spec='-L$libdir'
+      hardcode_direct=yes
+      hardcode_minus_L=yes
+      hardcode_shlibpath_var=no
+      ;;
+
+    sysv4)
+      case $host_vendor in
+	sni)
+	  archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	  hardcode_direct=yes # is this really true???
+	;;
+	siemens)
+	  ## LD is ld it makes a PLAMLIB
+	  ## CC just makes a GrossModule.
+	  archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags'
+	  reload_cmds='$CC -r -o $output$reload_objs'
+	  hardcode_direct=no
+        ;;
+	motorola)
+	  archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	  hardcode_direct=no #Motorola manual says yes, but my tests say they lie
+	;;
+      esac
+      runpath_var='LD_RUN_PATH'
+      hardcode_shlibpath_var=no
+      ;;
+
+    sysv4.3*)
+      archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      hardcode_shlibpath_var=no
+      export_dynamic_flag_spec='-Bexport'
+      ;;
+
+    sysv4*MP*)
+      if test -d /usr/nec; then
+	archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	hardcode_shlibpath_var=no
+	runpath_var=LD_RUN_PATH
+	hardcode_runpath_var=yes
+	ld_shlibs=yes
+      fi
+      ;;
+
+    sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*)
+      no_undefined_flag='${wl}-z,text'
+      archive_cmds_need_lc=no
+      hardcode_shlibpath_var=no
+      runpath_var='LD_RUN_PATH'
+
+      if test "$GCC" = yes; then
+	archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      fi
+      ;;
+
+    sysv5* | sco3.2v5* | sco5v6*)
+      # Note: We can NOT use -z defs as we might desire, because we do not
+      # link with -lc, and that would cause any symbols used from libc to
+      # always be unresolved, which means just about no library would
+      # ever link correctly.  If we're not using GNU ld we use -z text
+      # though, which does catch some bad symbols but isn't as heavy-handed
+      # as -z defs.
+      no_undefined_flag='${wl}-z,text'
+      allow_undefined_flag='${wl}-z,nodefs'
+      archive_cmds_need_lc=no
+      hardcode_shlibpath_var=no
+      hardcode_libdir_flag_spec='${wl}-R,$libdir'
+      hardcode_libdir_separator=':'
+      link_all_deplibs=yes
+      export_dynamic_flag_spec='${wl}-Bexport'
+      runpath_var='LD_RUN_PATH'
+
+      if test "$GCC" = yes; then
+	archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      fi
+      ;;
+
+    uts4*)
+      archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      hardcode_libdir_flag_spec='-L$libdir'
+      hardcode_shlibpath_var=no
+      ;;
+
+    *)
+      ld_shlibs=no
+      ;;
+    esac
+
+    if test x$host_vendor = xsni; then
+      case $host in
+      sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)
+	export_dynamic_flag_spec='${wl}-Blargedynsym'
+	;;
+      esac
+    fi
+  fi
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs" >&5
+$as_echo "$ld_shlibs" >&6; }
+test "$ld_shlibs" = no && can_build_shared=no
+
+with_gnu_ld=$with_gnu_ld
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#
+# Do we need to explicitly link libc?
+#
+case "x$archive_cmds_need_lc" in
+x|xyes)
+  # Assume -lc should be added
+  archive_cmds_need_lc=yes
+
+  if test "$enable_shared" = yes && test "$GCC" = yes; then
+    case $archive_cmds in
+    *'~'*)
+      # FIXME: we may have to deal with multi-command sequences.
+      ;;
+    '$CC '*)
+      # Test whether the compiler implicitly links with -lc since on some
+      # systems, -lgcc has to come before -lc. If gcc already passes -lc
+      # to ld, don't add -lc before -lgcc.
+      { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5
+$as_echo_n "checking whether -lc should be explicitly linked in... " >&6; }
+if ${lt_cv_archive_cmds_need_lc+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  $RM conftest*
+	echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+	if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } 2>conftest.err; then
+	  soname=conftest
+	  lib=conftest
+	  libobjs=conftest.$ac_objext
+	  deplibs=
+	  wl=$lt_prog_compiler_wl
+	  pic_flag=$lt_prog_compiler_pic
+	  compiler_flags=-v
+	  linker_flags=-v
+	  verstring=
+	  output_objdir=.
+	  libname=conftest
+	  lt_save_allow_undefined_flag=$allow_undefined_flag
+	  allow_undefined_flag=
+	  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5
+  (eval $archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }
+	  then
+	    lt_cv_archive_cmds_need_lc=no
+	  else
+	    lt_cv_archive_cmds_need_lc=yes
+	  fi
+	  allow_undefined_flag=$lt_save_allow_undefined_flag
+	else
+	  cat conftest.err 1>&5
+	fi
+	$RM conftest*
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc" >&5
+$as_echo "$lt_cv_archive_cmds_need_lc" >&6; }
+      archive_cmds_need_lc=$lt_cv_archive_cmds_need_lc
+      ;;
+    esac
+  fi
+  ;;
+esac
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5
+$as_echo_n "checking dynamic linker characteristics... " >&6; }
+
+if test "$GCC" = yes; then
+  case $host_os in
+    darwin*) lt_awk_arg="/^libraries:/,/LR/" ;;
+    *) lt_awk_arg="/^libraries:/" ;;
+  esac
+  case $host_os in
+    mingw* | cegcc*) lt_sed_strip_eq="s,=\([A-Za-z]:\),\1,g" ;;
+    *) lt_sed_strip_eq="s,=/,/,g" ;;
+  esac
+  lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq`
+  case $lt_search_path_spec in
+  *\;*)
+    # if the path contains ";" then we assume it to be the separator
+    # otherwise default to the standard path separator (i.e. ":") - it is
+    # assumed that no part of a normal pathname contains ";" but that should
+    # okay in the real world where ";" in dirpaths is itself problematic.
+    lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'`
+    ;;
+  *)
+    lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"`
+    ;;
+  esac
+  # Ok, now we have the path, separated by spaces, we can step through it
+  # and add multilib dir if necessary.
+  lt_tmp_lt_search_path_spec=
+  lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null`
+  for lt_sys_path in $lt_search_path_spec; do
+    if test -d "$lt_sys_path/$lt_multi_os_dir"; then
+      lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir"
+    else
+      test -d "$lt_sys_path" && \
+	lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path"
+    fi
+  done
+  lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk '
+BEGIN {RS=" "; FS="/|\n";} {
+  lt_foo="";
+  lt_count=0;
+  for (lt_i = NF; lt_i > 0; lt_i--) {
+    if ($lt_i != "" && $lt_i != ".") {
+      if ($lt_i == "..") {
+        lt_count++;
+      } else {
+        if (lt_count == 0) {
+          lt_foo="/" $lt_i lt_foo;
+        } else {
+          lt_count--;
+        }
+      }
+    }
+  }
+  if (lt_foo != "") { lt_freq[lt_foo]++; }
+  if (lt_freq[lt_foo] == 1) { print lt_foo; }
+}'`
+  # AWK program above erroneously prepends '/' to C:/dos/paths
+  # for these hosts.
+  case $host_os in
+    mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\
+      $SED 's,/\([A-Za-z]:\),\1,g'` ;;
+  esac
+  sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP`
+else
+  sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
+fi
+library_names_spec=
+libname_spec='lib$name'
+soname_spec=
+shrext_cmds=".so"
+postinstall_cmds=
+postuninstall_cmds=
+finish_cmds=
+finish_eval=
+shlibpath_var=
+shlibpath_overrides_runpath=unknown
+version_type=none
+dynamic_linker="$host_os ld.so"
+sys_lib_dlsearch_path_spec="/lib /usr/lib"
+need_lib_prefix=unknown
+hardcode_into_libs=no
+
+# when you set need_version to no, make sure it does not cause -set_version
+# flags to be left without arguments
+need_version=unknown
+
+case $host_os in
+aix3*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a'
+  shlibpath_var=LIBPATH
+
+  # AIX 3 has no versioning support, so we append a major version to the name.
+  soname_spec='${libname}${release}${shared_ext}$major'
+  ;;
+
+aix[4-9]*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  hardcode_into_libs=yes
+  if test "$host_cpu" = ia64; then
+    # AIX 5 supports IA64
+    library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}'
+    shlibpath_var=LD_LIBRARY_PATH
+  else
+    # With GCC up to 2.95.x, collect2 would create an import file
+    # for dependence libraries.  The import file would start with
+    # the line `#! .'.  This would cause the generated library to
+    # depend on `.', always an invalid library.  This was fixed in
+    # development snapshots of GCC prior to 3.0.
+    case $host_os in
+      aix4 | aix4.[01] | aix4.[01].*)
+      if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'
+	   echo ' yes '
+	   echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then
+	:
+      else
+	can_build_shared=no
+      fi
+      ;;
+    esac
+    # AIX (on Power*) has no versioning support, so currently we can not hardcode correct
+    # soname into executable. Probably we can add versioning support to
+    # collect2, so additional links can be useful in future.
+    if test "$aix_use_runtimelinking" = yes; then
+      # If using run time linking (on AIX 4.2 or later) use lib<name>.so
+      # instead of lib<name>.a to let people know that these are not
+      # typical AIX shared libraries.
+      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    else
+      # We preserve .a as extension for shared libraries through AIX4.2
+      # and later when we are not doing run time linking.
+      library_names_spec='${libname}${release}.a $libname.a'
+      soname_spec='${libname}${release}${shared_ext}$major'
+    fi
+    shlibpath_var=LIBPATH
+  fi
+  ;;
+
+amigaos*)
+  case $host_cpu in
+  powerpc)
+    # Since July 2007 AmigaOS4 officially supports .so libraries.
+    # When compiling the executable, add -use-dynld -Lsobjs: to the compileline.
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    ;;
+  m68k)
+    library_names_spec='$libname.ixlibrary $libname.a'
+    # Create ${libname}_ixlibrary.a entries in /sys/libs.
+    finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'
+    ;;
+  esac
+  ;;
+
+beos*)
+  library_names_spec='${libname}${shared_ext}'
+  dynamic_linker="$host_os ld.so"
+  shlibpath_var=LIBRARY_PATH
+  ;;
+
+bsdi[45]*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib"
+  sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib"
+  # the default ld.so.conf also contains /usr/contrib/lib and
+  # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow
+  # libtool to hard-code these into programs
+  ;;
+
+cygwin* | mingw* | pw32* | cegcc*)
+  version_type=windows
+  shrext_cmds=".dll"
+  need_version=no
+  need_lib_prefix=no
+
+  case $GCC,$cc_basename in
+  yes,*)
+    # gcc
+    library_names_spec='$libname.dll.a'
+    # DLL is installed to $(libdir)/../bin by postinstall_cmds
+    postinstall_cmds='base_file=`basename \${file}`~
+      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~
+      dldir=$destdir/`dirname \$dlpath`~
+      test -d \$dldir || mkdir -p \$dldir~
+      $install_prog $dir/$dlname \$dldir/$dlname~
+      chmod a+x \$dldir/$dlname~
+      if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then
+        eval '\''$striplib \$dldir/$dlname'\'' || exit \$?;
+      fi'
+    postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
+      dlpath=$dir/\$dldll~
+       $RM \$dlpath'
+    shlibpath_overrides_runpath=yes
+
+    case $host_os in
+    cygwin*)
+      # Cygwin DLLs use 'cyg' prefix rather than 'lib'
+      soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+
+      sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api"
+      ;;
+    mingw* | cegcc*)
+      # MinGW DLLs use traditional 'lib' prefix
+      soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+      ;;
+    pw32*)
+      # pw32 DLLs use 'pw' prefix rather than 'lib'
+      library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+      ;;
+    esac
+    dynamic_linker='Win32 ld.exe'
+    ;;
+
+  *,cl*)
+    # Native MSVC
+    libname_spec='$name'
+    soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+    library_names_spec='${libname}.dll.lib'
+
+    case $build_os in
+    mingw*)
+      sys_lib_search_path_spec=
+      lt_save_ifs=$IFS
+      IFS=';'
+      for lt_path in $LIB
+      do
+        IFS=$lt_save_ifs
+        # Let DOS variable expansion print the short 8.3 style file name.
+        lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"`
+        sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path"
+      done
+      IFS=$lt_save_ifs
+      # Convert to MSYS style.
+      sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'`
+      ;;
+    cygwin*)
+      # Convert to unix form, then to dos form, then back to unix form
+      # but this time dos style (no spaces!) so that the unix form looks
+      # like /cygdrive/c/PROGRA~1:/cygdr...
+      sys_lib_search_path_spec=`cygpath --path --unix "$LIB"`
+      sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null`
+      sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
+      ;;
+    *)
+      sys_lib_search_path_spec="$LIB"
+      if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then
+        # It is most probably a Windows format PATH.
+        sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
+      else
+        sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
+      fi
+      # FIXME: find the short name or the path components, as spaces are
+      # common. (e.g. "Program Files" -> "PROGRA~1")
+      ;;
+    esac
+
+    # DLL is installed to $(libdir)/../bin by postinstall_cmds
+    postinstall_cmds='base_file=`basename \${file}`~
+      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~
+      dldir=$destdir/`dirname \$dlpath`~
+      test -d \$dldir || mkdir -p \$dldir~
+      $install_prog $dir/$dlname \$dldir/$dlname'
+    postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
+      dlpath=$dir/\$dldll~
+       $RM \$dlpath'
+    shlibpath_overrides_runpath=yes
+    dynamic_linker='Win32 link.exe'
+    ;;
+
+  *)
+    # Assume MSVC wrapper
+    library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib'
+    dynamic_linker='Win32 ld.exe'
+    ;;
+  esac
+  # FIXME: first we should search . and the directory the executable is in
+  shlibpath_var=PATH
+  ;;
+
+darwin* | rhapsody*)
+  dynamic_linker="$host_os dyld"
+  version_type=darwin
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext'
+  soname_spec='${libname}${release}${major}$shared_ext'
+  shlibpath_overrides_runpath=yes
+  shlibpath_var=DYLD_LIBRARY_PATH
+  shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`'
+
+  sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib"
+  sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib'
+  ;;
+
+dgux*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  ;;
+
+freebsd* | dragonfly*)
+  # DragonFly does not have aout.  When/if they implement a new
+  # versioning mechanism, adjust this.
+  if test -x /usr/bin/objformat; then
+    objformat=`/usr/bin/objformat`
+  else
+    case $host_os in
+    freebsd[23].*) objformat=aout ;;
+    *) objformat=elf ;;
+    esac
+  fi
+  version_type=freebsd-$objformat
+  case $version_type in
+    freebsd-elf*)
+      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
+      need_version=no
+      need_lib_prefix=no
+      ;;
+    freebsd-*)
+      library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix'
+      need_version=yes
+      ;;
+  esac
+  shlibpath_var=LD_LIBRARY_PATH
+  case $host_os in
+  freebsd2.*)
+    shlibpath_overrides_runpath=yes
+    ;;
+  freebsd3.[01]* | freebsdelf3.[01]*)
+    shlibpath_overrides_runpath=yes
+    hardcode_into_libs=yes
+    ;;
+  freebsd3.[2-9]* | freebsdelf3.[2-9]* | \
+  freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1)
+    shlibpath_overrides_runpath=no
+    hardcode_into_libs=yes
+    ;;
+  *) # from 4.6 on, and DragonFly
+    shlibpath_overrides_runpath=yes
+    hardcode_into_libs=yes
+    ;;
+  esac
+  ;;
+
+gnu*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  ;;
+
+haiku*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  dynamic_linker="$host_os runtime_loader"
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib'
+  hardcode_into_libs=yes
+  ;;
+
+hpux9* | hpux10* | hpux11*)
+  # Give a soname corresponding to the major version so that dld.sl refuses to
+  # link against other versions.
+  version_type=sunos
+  need_lib_prefix=no
+  need_version=no
+  case $host_cpu in
+  ia64*)
+    shrext_cmds='.so'
+    hardcode_into_libs=yes
+    dynamic_linker="$host_os dld.so"
+    shlibpath_var=LD_LIBRARY_PATH
+    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    if test "X$HPUX_IA64_MODE" = X32; then
+      sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib"
+    else
+      sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64"
+    fi
+    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+    ;;
+  hppa*64*)
+    shrext_cmds='.sl'
+    hardcode_into_libs=yes
+    dynamic_linker="$host_os dld.sl"
+    shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH
+    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64"
+    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+    ;;
+  *)
+    shrext_cmds='.sl'
+    dynamic_linker="$host_os dld.sl"
+    shlibpath_var=SHLIB_PATH
+    shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    ;;
+  esac
+  # HP-UX runs *really* slowly unless shared libraries are mode 555, ...
+  postinstall_cmds='chmod 555 $lib'
+  # or fails outright, so override atomically:
+  install_override_mode=555
+  ;;
+
+interix[3-9]*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  ;;
+
+irix5* | irix6* | nonstopux*)
+  case $host_os in
+    nonstopux*) version_type=nonstopux ;;
+    *)
+	if test "$lt_cv_prog_gnu_ld" = yes; then
+		version_type=linux # correct to gnu/linux during the next big refactor
+	else
+		version_type=irix
+	fi ;;
+  esac
+  need_lib_prefix=no
+  need_version=no
+  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}'
+  case $host_os in
+  irix5* | nonstopux*)
+    libsuff= shlibsuff=
+    ;;
+  *)
+    case $LD in # libtool.m4 will add one of these switches to LD
+    *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ")
+      libsuff= shlibsuff= libmagic=32-bit;;
+    *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ")
+      libsuff=32 shlibsuff=N32 libmagic=N32;;
+    *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ")
+      libsuff=64 shlibsuff=64 libmagic=64-bit;;
+    *) libsuff= shlibsuff= libmagic=never-match;;
+    esac
+    ;;
+  esac
+  shlibpath_var=LD_LIBRARY${shlibsuff}_PATH
+  shlibpath_overrides_runpath=no
+  sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}"
+  sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}"
+  hardcode_into_libs=yes
+  ;;
+
+# No shared lib support for Linux oldld, aout, or coff.
+linux*oldld* | linux*aout* | linux*coff*)
+  dynamic_linker=no
+  ;;
+
+# This must be glibc/ELF.
+linux* | k*bsd*-gnu | kopensolaris*-gnu)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+
+  # Some binutils ld are patched to set DT_RUNPATH
+  if ${lt_cv_shlibpath_overrides_runpath+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_shlibpath_overrides_runpath=no
+    save_LDFLAGS=$LDFLAGS
+    save_libdir=$libdir
+    eval "libdir=/foo; wl=\"$lt_prog_compiler_wl\"; \
+	 LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec\""
+    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  if  ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then :
+  lt_cv_shlibpath_overrides_runpath=yes
+fi
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+    LDFLAGS=$save_LDFLAGS
+    libdir=$save_libdir
+
+fi
+
+  shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath
+
+  # This implies no fast_install, which is unacceptable.
+  # Some rework will be needed to allow for fast_install
+  # before this can be enabled.
+  hardcode_into_libs=yes
+
+  # Append ld.so.conf contents to the search path
+  if test -f /etc/ld.so.conf; then
+    lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[	 ]*hwcap[	 ]/d;s/[:,	]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '`
+    sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra"
+  fi
+
+  # We used to test for /lib/ld.so.1 and disable shared libraries on
+  # powerpc, because MkLinux only supported shared libraries with the
+  # GNU dynamic linker.  Since this was broken with cross compilers,
+  # most powerpc-linux boxes support dynamic linking these days and
+  # people can always --disable-shared, the test was removed, and we
+  # assume the GNU/Linux dynamic linker is in use.
+  dynamic_linker='GNU/Linux ld.so'
+  ;;
+
+netbsd*)
+  version_type=sunos
+  need_lib_prefix=no
+  need_version=no
+  if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+    finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+    dynamic_linker='NetBSD (a.out) ld.so'
+  else
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    dynamic_linker='NetBSD ld.elf_so'
+  fi
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  hardcode_into_libs=yes
+  ;;
+
+newsos6)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  ;;
+
+*nto* | *qnx*)
+  version_type=qnx
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  dynamic_linker='ldqnx.so'
+  ;;
+
+openbsd*)
+  version_type=sunos
+  sys_lib_dlsearch_path_spec="/usr/lib"
+  need_lib_prefix=no
+  # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs.
+  case $host_os in
+    openbsd3.3 | openbsd3.3.*)	need_version=yes ;;
+    *)				need_version=no  ;;
+  esac
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+    case $host_os in
+      openbsd2.[89] | openbsd2.[89].*)
+	shlibpath_overrides_runpath=no
+	;;
+      *)
+	shlibpath_overrides_runpath=yes
+	;;
+      esac
+  else
+    shlibpath_overrides_runpath=yes
+  fi
+  ;;
+
+os2*)
+  libname_spec='$name'
+  shrext_cmds=".dll"
+  need_lib_prefix=no
+  library_names_spec='$libname${shared_ext} $libname.a'
+  dynamic_linker='OS/2 ld.exe'
+  shlibpath_var=LIBPATH
+  ;;
+
+osf3* | osf4* | osf5*)
+  version_type=osf
+  need_lib_prefix=no
+  need_version=no
+  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  shlibpath_var=LD_LIBRARY_PATH
+  sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib"
+  sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec"
+  ;;
+
+rdos*)
+  dynamic_linker=no
+  ;;
+
+solaris*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  hardcode_into_libs=yes
+  # ldd complains unless libraries are executable
+  postinstall_cmds='chmod +x $lib'
+  ;;
+
+sunos4*)
+  version_type=sunos
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+  finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  if test "$with_gnu_ld" = yes; then
+    need_lib_prefix=no
+  fi
+  need_version=yes
+  ;;
+
+sysv4 | sysv4.3*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  case $host_vendor in
+    sni)
+      shlibpath_overrides_runpath=no
+      need_lib_prefix=no
+      runpath_var=LD_RUN_PATH
+      ;;
+    siemens)
+      need_lib_prefix=no
+      ;;
+    motorola)
+      need_lib_prefix=no
+      need_version=no
+      shlibpath_overrides_runpath=no
+      sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib'
+      ;;
+  esac
+  ;;
+
+sysv4*MP*)
+  if test -d /usr/nec ;then
+    version_type=linux # correct to gnu/linux during the next big refactor
+    library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}'
+    soname_spec='$libname${shared_ext}.$major'
+    shlibpath_var=LD_LIBRARY_PATH
+  fi
+  ;;
+
+sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
+  version_type=freebsd-elf
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  hardcode_into_libs=yes
+  if test "$with_gnu_ld" = yes; then
+    sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib'
+  else
+    sys_lib_search_path_spec='/usr/ccs/lib /usr/lib'
+    case $host_os in
+      sco3.2v5*)
+        sys_lib_search_path_spec="$sys_lib_search_path_spec /lib"
+	;;
+    esac
+  fi
+  sys_lib_dlsearch_path_spec='/usr/lib'
+  ;;
+
+tpf*)
+  # TPF is a cross-target only.  Preferred cross-host = GNU/Linux.
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  ;;
+
+uts4*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  ;;
+
+*)
+  dynamic_linker=no
+  ;;
+esac
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5
+$as_echo "$dynamic_linker" >&6; }
+test "$dynamic_linker" = no && can_build_shared=no
+
+variables_saved_for_relink="PATH $shlibpath_var $runpath_var"
+if test "$GCC" = yes; then
+  variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH"
+fi
+
+if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then
+  sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec"
+fi
+if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then
+  sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec"
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5
+$as_echo_n "checking how to hardcode library paths into programs... " >&6; }
+hardcode_action=
+if test -n "$hardcode_libdir_flag_spec" ||
+   test -n "$runpath_var" ||
+   test "X$hardcode_automatic" = "Xyes" ; then
+
+  # We can hardcode non-existent directories.
+  if test "$hardcode_direct" != no &&
+     # If the only mechanism to avoid hardcoding is shlibpath_var, we
+     # have to relink, otherwise we might link with an installed library
+     # when we should be linking with a yet-to-be-installed one
+     ## test "$_LT_TAGVAR(hardcode_shlibpath_var, )" != no &&
+     test "$hardcode_minus_L" != no; then
+    # Linking always hardcodes the temporary library directory.
+    hardcode_action=relink
+  else
+    # We can link without hardcoding, and we can hardcode nonexisting dirs.
+    hardcode_action=immediate
+  fi
+else
+  # We cannot hardcode anything, or else we can only hardcode existing
+  # directories.
+  hardcode_action=unsupported
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action" >&5
+$as_echo "$hardcode_action" >&6; }
+
+if test "$hardcode_action" = relink ||
+   test "$inherit_rpath" = yes; then
+  # Fast installation is not supported
+  enable_fast_install=no
+elif test "$shlibpath_overrides_runpath" = yes ||
+     test "$enable_shared" = no; then
+  # Fast installation is not necessary
+  enable_fast_install=needless
+fi
+
+
+
+
+
+
+  if test "x$enable_dlopen" != xyes; then
+  enable_dlopen=unknown
+  enable_dlopen_self=unknown
+  enable_dlopen_self_static=unknown
+else
+  lt_cv_dlopen=no
+  lt_cv_dlopen_libs=
+
+  case $host_os in
+  beos*)
+    lt_cv_dlopen="load_add_on"
+    lt_cv_dlopen_libs=
+    lt_cv_dlopen_self=yes
+    ;;
+
+  mingw* | pw32* | cegcc*)
+    lt_cv_dlopen="LoadLibrary"
+    lt_cv_dlopen_libs=
+    ;;
+
+  cygwin*)
+    lt_cv_dlopen="dlopen"
+    lt_cv_dlopen_libs=
+    ;;
+
+  darwin*)
+  # if libdl is installed we need to link against it
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5
+$as_echo_n "checking for dlopen in -ldl... " >&6; }
+if ${ac_cv_lib_dl_dlopen+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldl  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char dlopen ();
+int
+main ()
+{
+return dlopen ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_lib_dl_dlopen=yes
+else
+  ac_cv_lib_dl_dlopen=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5
+$as_echo "$ac_cv_lib_dl_dlopen" >&6; }
+if test "x$ac_cv_lib_dl_dlopen" = xyes; then :
+  lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"
+else
+
+    lt_cv_dlopen="dyld"
+    lt_cv_dlopen_libs=
+    lt_cv_dlopen_self=yes
+
+fi
+
+    ;;
+
+  *)
+    ac_fn_c_check_func "$LINENO" "shl_load" "ac_cv_func_shl_load"
+if test "x$ac_cv_func_shl_load" = xyes; then :
+  lt_cv_dlopen="shl_load"
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5
+$as_echo_n "checking for shl_load in -ldld... " >&6; }
+if ${ac_cv_lib_dld_shl_load+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldld  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char shl_load ();
+int
+main ()
+{
+return shl_load ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_lib_dld_shl_load=yes
+else
+  ac_cv_lib_dld_shl_load=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5
+$as_echo "$ac_cv_lib_dld_shl_load" >&6; }
+if test "x$ac_cv_lib_dld_shl_load" = xyes; then :
+  lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld"
+else
+  ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen"
+if test "x$ac_cv_func_dlopen" = xyes; then :
+  lt_cv_dlopen="dlopen"
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5
+$as_echo_n "checking for dlopen in -ldl... " >&6; }
+if ${ac_cv_lib_dl_dlopen+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldl  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char dlopen ();
+int
+main ()
+{
+return dlopen ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_lib_dl_dlopen=yes
+else
+  ac_cv_lib_dl_dlopen=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5
+$as_echo "$ac_cv_lib_dl_dlopen" >&6; }
+if test "x$ac_cv_lib_dl_dlopen" = xyes; then :
+  lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld" >&5
+$as_echo_n "checking for dlopen in -lsvld... " >&6; }
+if ${ac_cv_lib_svld_dlopen+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lsvld  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char dlopen ();
+int
+main ()
+{
+return dlopen ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_lib_svld_dlopen=yes
+else
+  ac_cv_lib_svld_dlopen=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_svld_dlopen" >&5
+$as_echo "$ac_cv_lib_svld_dlopen" >&6; }
+if test "x$ac_cv_lib_svld_dlopen" = xyes; then :
+  lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld" >&5
+$as_echo_n "checking for dld_link in -ldld... " >&6; }
+if ${ac_cv_lib_dld_dld_link+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldld  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char dld_link ();
+int
+main ()
+{
+return dld_link ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_lib_dld_dld_link=yes
+else
+  ac_cv_lib_dld_dld_link=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_dld_link" >&5
+$as_echo "$ac_cv_lib_dld_dld_link" >&6; }
+if test "x$ac_cv_lib_dld_dld_link" = xyes; then :
+  lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld"
+fi
+
+
+fi
+
+
+fi
+
+
+fi
+
+
+fi
+
+
+fi
+
+    ;;
+  esac
+
+  if test "x$lt_cv_dlopen" != xno; then
+    enable_dlopen=yes
+  else
+    enable_dlopen=no
+  fi
+
+  case $lt_cv_dlopen in
+  dlopen)
+    save_CPPFLAGS="$CPPFLAGS"
+    test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H"
+
+    save_LDFLAGS="$LDFLAGS"
+    wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\"
+
+    save_LIBS="$LIBS"
+    LIBS="$lt_cv_dlopen_libs $LIBS"
+
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a program can dlopen itself" >&5
+$as_echo_n "checking whether a program can dlopen itself... " >&6; }
+if ${lt_cv_dlopen_self+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  	  if test "$cross_compiling" = yes; then :
+  lt_cv_dlopen_self=cross
+else
+  lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
+  lt_status=$lt_dlunknown
+  cat > conftest.$ac_ext <<_LT_EOF
+#line $LINENO "configure"
+#include "confdefs.h"
+
+#if HAVE_DLFCN_H
+#include <dlfcn.h>
+#endif
+
+#include <stdio.h>
+
+#ifdef RTLD_GLOBAL
+#  define LT_DLGLOBAL		RTLD_GLOBAL
+#else
+#  ifdef DL_GLOBAL
+#    define LT_DLGLOBAL		DL_GLOBAL
+#  else
+#    define LT_DLGLOBAL		0
+#  endif
+#endif
+
+/* We may have to define LT_DLLAZY_OR_NOW in the command line if we
+   find out it does not work in some platform. */
+#ifndef LT_DLLAZY_OR_NOW
+#  ifdef RTLD_LAZY
+#    define LT_DLLAZY_OR_NOW		RTLD_LAZY
+#  else
+#    ifdef DL_LAZY
+#      define LT_DLLAZY_OR_NOW		DL_LAZY
+#    else
+#      ifdef RTLD_NOW
+#        define LT_DLLAZY_OR_NOW	RTLD_NOW
+#      else
+#        ifdef DL_NOW
+#          define LT_DLLAZY_OR_NOW	DL_NOW
+#        else
+#          define LT_DLLAZY_OR_NOW	0
+#        endif
+#      endif
+#    endif
+#  endif
+#endif
+
+/* When -fvisbility=hidden is used, assume the code has been annotated
+   correspondingly for the symbols needed.  */
+#if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3))
+int fnord () __attribute__((visibility("default")));
+#endif
+
+int fnord () { return 42; }
+int main ()
+{
+  void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);
+  int status = $lt_dlunknown;
+
+  if (self)
+    {
+      if (dlsym (self,"fnord"))       status = $lt_dlno_uscore;
+      else
+        {
+	  if (dlsym( self,"_fnord"))  status = $lt_dlneed_uscore;
+          else puts (dlerror ());
+	}
+      /* dlclose (self); */
+    }
+  else
+    puts (dlerror ());
+
+  return status;
+}
+_LT_EOF
+  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then
+    (./conftest; exit; ) >&5 2>/dev/null
+    lt_status=$?
+    case x$lt_status in
+      x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;;
+      x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;;
+      x$lt_dlunknown|x*) lt_cv_dlopen_self=no ;;
+    esac
+  else :
+    # compilation failed
+    lt_cv_dlopen_self=no
+  fi
+fi
+rm -fr conftest*
+
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self" >&5
+$as_echo "$lt_cv_dlopen_self" >&6; }
+
+    if test "x$lt_cv_dlopen_self" = xyes; then
+      wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\"
+      { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a statically linked program can dlopen itself" >&5
+$as_echo_n "checking whether a statically linked program can dlopen itself... " >&6; }
+if ${lt_cv_dlopen_self_static+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  	  if test "$cross_compiling" = yes; then :
+  lt_cv_dlopen_self_static=cross
+else
+  lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
+  lt_status=$lt_dlunknown
+  cat > conftest.$ac_ext <<_LT_EOF
+#line $LINENO "configure"
+#include "confdefs.h"
+
+#if HAVE_DLFCN_H
+#include <dlfcn.h>
+#endif
+
+#include <stdio.h>
+
+#ifdef RTLD_GLOBAL
+#  define LT_DLGLOBAL		RTLD_GLOBAL
+#else
+#  ifdef DL_GLOBAL
+#    define LT_DLGLOBAL		DL_GLOBAL
+#  else
+#    define LT_DLGLOBAL		0
+#  endif
+#endif
+
+/* We may have to define LT_DLLAZY_OR_NOW in the command line if we
+   find out it does not work in some platform. */
+#ifndef LT_DLLAZY_OR_NOW
+#  ifdef RTLD_LAZY
+#    define LT_DLLAZY_OR_NOW		RTLD_LAZY
+#  else
+#    ifdef DL_LAZY
+#      define LT_DLLAZY_OR_NOW		DL_LAZY
+#    else
+#      ifdef RTLD_NOW
+#        define LT_DLLAZY_OR_NOW	RTLD_NOW
+#      else
+#        ifdef DL_NOW
+#          define LT_DLLAZY_OR_NOW	DL_NOW
+#        else
+#          define LT_DLLAZY_OR_NOW	0
+#        endif
+#      endif
+#    endif
+#  endif
+#endif
+
+/* When -fvisbility=hidden is used, assume the code has been annotated
+   correspondingly for the symbols needed.  */
+#if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3))
+int fnord () __attribute__((visibility("default")));
+#endif
+
+int fnord () { return 42; }
+int main ()
+{
+  void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);
+  int status = $lt_dlunknown;
+
+  if (self)
+    {
+      if (dlsym (self,"fnord"))       status = $lt_dlno_uscore;
+      else
+        {
+	  if (dlsym( self,"_fnord"))  status = $lt_dlneed_uscore;
+          else puts (dlerror ());
+	}
+      /* dlclose (self); */
+    }
+  else
+    puts (dlerror ());
+
+  return status;
+}
+_LT_EOF
+  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then
+    (./conftest; exit; ) >&5 2>/dev/null
+    lt_status=$?
+    case x$lt_status in
+      x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;;
+      x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;;
+      x$lt_dlunknown|x*) lt_cv_dlopen_self_static=no ;;
+    esac
+  else :
+    # compilation failed
+    lt_cv_dlopen_self_static=no
+  fi
+fi
+rm -fr conftest*
+
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self_static" >&5
+$as_echo "$lt_cv_dlopen_self_static" >&6; }
+    fi
+
+    CPPFLAGS="$save_CPPFLAGS"
+    LDFLAGS="$save_LDFLAGS"
+    LIBS="$save_LIBS"
+    ;;
+  esac
+
+  case $lt_cv_dlopen_self in
+  yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;;
+  *) enable_dlopen_self=unknown ;;
+  esac
+
+  case $lt_cv_dlopen_self_static in
+  yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;;
+  *) enable_dlopen_self_static=unknown ;;
+  esac
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+striplib=
+old_striplib=
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stripping libraries is possible" >&5
+$as_echo_n "checking whether stripping libraries is possible... " >&6; }
+if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then
+  test -z "$old_striplib" && old_striplib="$STRIP --strip-debug"
+  test -z "$striplib" && striplib="$STRIP --strip-unneeded"
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+else
+# FIXME - insert some real tests, host_os isn't really good enough
+  case $host_os in
+  darwin*)
+    if test -n "$STRIP" ; then
+      striplib="$STRIP -x"
+      old_striplib="$STRIP -S"
+      { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+    else
+      { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+    fi
+    ;;
+  *)
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+    ;;
+  esac
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+  # Report which library types will actually be built
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if libtool supports shared libraries" >&5
+$as_echo_n "checking if libtool supports shared libraries... " >&6; }
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $can_build_shared" >&5
+$as_echo "$can_build_shared" >&6; }
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries" >&5
+$as_echo_n "checking whether to build shared libraries... " >&6; }
+  test "$can_build_shared" = "no" && enable_shared=no
+
+  # On AIX, shared libraries and static libraries use the same namespace, and
+  # are all built from PIC.
+  case $host_os in
+  aix3*)
+    test "$enable_shared" = yes && enable_static=no
+    if test -n "$RANLIB"; then
+      archive_cmds="$archive_cmds~\$RANLIB \$lib"
+      postinstall_cmds='$RANLIB $lib'
+    fi
+    ;;
+
+  aix[4-9]*)
+    if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then
+      test "$enable_shared" = yes && enable_static=no
+    fi
+    ;;
+  esac
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_shared" >&5
+$as_echo "$enable_shared" >&6; }
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build static libraries" >&5
+$as_echo_n "checking whether to build static libraries... " >&6; }
+  # Make sure either enable_shared or enable_static is yes.
+  test "$enable_shared" = yes || enable_static=yes
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_static" >&5
+$as_echo "$enable_static" >&6; }
+
+
+
+
+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
+
+CC="$lt_save_CC"
+
+
+
+      ac_ext=f
+ac_compile='$F77 -c $FFLAGS conftest.$ac_ext >&5'
+ac_link='$F77 -o conftest$ac_exeext $FFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_f77_compiler_gnu
+
+if test -z "$F77" || test "X$F77" = "Xno"; then
+  _lt_disable_F77=yes
+fi
+
+archive_cmds_need_lc_F77=no
+allow_undefined_flag_F77=
+always_export_symbols_F77=no
+archive_expsym_cmds_F77=
+export_dynamic_flag_spec_F77=
+hardcode_direct_F77=no
+hardcode_direct_absolute_F77=no
+hardcode_libdir_flag_spec_F77=
+hardcode_libdir_separator_F77=
+hardcode_minus_L_F77=no
+hardcode_automatic_F77=no
+inherit_rpath_F77=no
+module_cmds_F77=
+module_expsym_cmds_F77=
+link_all_deplibs_F77=unknown
+old_archive_cmds_F77=$old_archive_cmds
+reload_flag_F77=$reload_flag
+reload_cmds_F77=$reload_cmds
+no_undefined_flag_F77=
+whole_archive_flag_spec_F77=
+enable_shared_with_static_runtimes_F77=no
+
+# Source file extension for f77 test sources.
+ac_ext=f
+
+# Object file extension for compiled f77 test sources.
+objext=o
+objext_F77=$objext
+
+# No sense in running all these tests if we already determined that
+# the F77 compiler isn't working.  Some variables (like enable_shared)
+# are currently assumed to apply to all compilers on this platform,
+# and will be corrupted by setting them based on a non-working compiler.
+if test "$_lt_disable_F77" != yes; then
+  # Code to be used in simple compile tests
+  lt_simple_compile_test_code="\
+      subroutine t
+      return
+      end
+"
+
+  # Code to be used in simple link tests
+  lt_simple_link_test_code="\
+      program t
+      end
+"
+
+  # ltmain only uses $CC for tagged configurations so make sure $CC is set.
+
+
+
+
+
+
+# If no C compiler was specified, use CC.
+LTCC=${LTCC-"$CC"}
+
+# If no C compiler flags were specified, use CFLAGS.
+LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
+
+# Allow CC to be a program name with arguments.
+compiler=$CC
+
+
+  # save warnings/boilerplate of simple test code
+  ac_outfile=conftest.$ac_objext
+echo "$lt_simple_compile_test_code" >conftest.$ac_ext
+eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_compiler_boilerplate=`cat conftest.err`
+$RM conftest*
+
+  ac_outfile=conftest.$ac_objext
+echo "$lt_simple_link_test_code" >conftest.$ac_ext
+eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_linker_boilerplate=`cat conftest.err`
+$RM -r conftest*
+
+
+  # Allow CC to be a program name with arguments.
+  lt_save_CC="$CC"
+  lt_save_GCC=$GCC
+  lt_save_CFLAGS=$CFLAGS
+  CC=${F77-"f77"}
+  CFLAGS=$FFLAGS
+  compiler=$CC
+  compiler_F77=$CC
+  for cc_temp in $compiler""; do
+  case $cc_temp in
+    compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
+    distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
+    \-*) ;;
+    *) break;;
+  esac
+done
+cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"`
+
+  GCC=$G77
+  if test -n "$compiler"; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking if libtool supports shared libraries" >&5
+$as_echo_n "checking if libtool supports shared libraries... " >&6; }
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $can_build_shared" >&5
+$as_echo "$can_build_shared" >&6; }
+
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries" >&5
+$as_echo_n "checking whether to build shared libraries... " >&6; }
+    test "$can_build_shared" = "no" && enable_shared=no
+
+    # On AIX, shared libraries and static libraries use the same namespace, and
+    # are all built from PIC.
+    case $host_os in
+      aix3*)
+        test "$enable_shared" = yes && enable_static=no
+        if test -n "$RANLIB"; then
+          archive_cmds="$archive_cmds~\$RANLIB \$lib"
+          postinstall_cmds='$RANLIB $lib'
+        fi
+        ;;
+      aix[4-9]*)
+	if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then
+	  test "$enable_shared" = yes && enable_static=no
+	fi
+        ;;
+    esac
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_shared" >&5
+$as_echo "$enable_shared" >&6; }
+
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build static libraries" >&5
+$as_echo_n "checking whether to build static libraries... " >&6; }
+    # Make sure either enable_shared or enable_static is yes.
+    test "$enable_shared" = yes || enable_static=yes
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_static" >&5
+$as_echo "$enable_static" >&6; }
+
+    GCC_F77="$G77"
+    LD_F77="$LD"
+
+    ## CAVEAT EMPTOR:
+    ## There is no encapsulation within the following macros, do not change
+    ## the running order or otherwise move them around unless you know exactly
+    ## what you are doing...
+    lt_prog_compiler_wl_F77=
+lt_prog_compiler_pic_F77=
+lt_prog_compiler_static_F77=
+
+
+  if test "$GCC" = yes; then
+    lt_prog_compiler_wl_F77='-Wl,'
+    lt_prog_compiler_static_F77='-static'
+
+    case $host_os in
+      aix*)
+      # All AIX code is PIC.
+      if test "$host_cpu" = ia64; then
+	# AIX 5 now supports IA64 processor
+	lt_prog_compiler_static_F77='-Bstatic'
+      fi
+      ;;
+
+    amigaos*)
+      case $host_cpu in
+      powerpc)
+            # see comment about AmigaOS4 .so support
+            lt_prog_compiler_pic_F77='-fPIC'
+        ;;
+      m68k)
+            # FIXME: we need at least 68020 code to build shared libraries, but
+            # adding the `-m68020' flag to GCC prevents building anything better,
+            # like `-m68040'.
+            lt_prog_compiler_pic_F77='-m68020 -resident32 -malways-restore-a4'
+        ;;
+      esac
+      ;;
+
+    beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
+      # PIC is the default for these OSes.
+      ;;
+
+    mingw* | cygwin* | pw32* | os2* | cegcc*)
+      # This hack is so that the source file can tell whether it is being
+      # built for inclusion in a dll (and should export symbols for example).
+      # Although the cygwin gcc ignores -fPIC, still need this for old-style
+      # (--disable-auto-import) libraries
+      lt_prog_compiler_pic_F77='-DDLL_EXPORT'
+      ;;
+
+    darwin* | rhapsody*)
+      # PIC is the default on this platform
+      # Common symbols not allowed in MH_DYLIB files
+      lt_prog_compiler_pic_F77='-fno-common'
+      ;;
+
+    haiku*)
+      # PIC is the default for Haiku.
+      # The "-static" flag exists, but is broken.
+      lt_prog_compiler_static_F77=
+      ;;
+
+    hpux*)
+      # PIC is the default for 64-bit PA HP-UX, but not for 32-bit
+      # PA HP-UX.  On IA64 HP-UX, PIC is the default but the pic flag
+      # sets the default TLS model and affects inlining.
+      case $host_cpu in
+      hppa*64*)
+	# +Z the default
+	;;
+      *)
+	lt_prog_compiler_pic_F77='-fPIC'
+	;;
+      esac
+      ;;
+
+    interix[3-9]*)
+      # Interix 3.x gcc -fpic/-fPIC options generate broken code.
+      # Instead, we relocate shared libraries at runtime.
+      ;;
+
+    msdosdjgpp*)
+      # Just because we use GCC doesn't mean we suddenly get shared libraries
+      # on systems that don't support them.
+      lt_prog_compiler_can_build_shared_F77=no
+      enable_shared=no
+      ;;
+
+    *nto* | *qnx*)
+      # QNX uses GNU C++, but need to define -shared option too, otherwise
+      # it will coredump.
+      lt_prog_compiler_pic_F77='-fPIC -shared'
+      ;;
+
+    sysv4*MP*)
+      if test -d /usr/nec; then
+	lt_prog_compiler_pic_F77=-Kconform_pic
+      fi
+      ;;
+
+    *)
+      lt_prog_compiler_pic_F77='-fPIC'
+      ;;
+    esac
+
+    case $cc_basename in
+    nvcc*) # Cuda Compiler Driver 2.2
+      lt_prog_compiler_wl_F77='-Xlinker '
+      if test -n "$lt_prog_compiler_pic_F77"; then
+        lt_prog_compiler_pic_F77="-Xcompiler $lt_prog_compiler_pic_F77"
+      fi
+      ;;
+    esac
+  else
+    # PORTME Check for flag to pass linker flags through the system compiler.
+    case $host_os in
+    aix*)
+      lt_prog_compiler_wl_F77='-Wl,'
+      if test "$host_cpu" = ia64; then
+	# AIX 5 now supports IA64 processor
+	lt_prog_compiler_static_F77='-Bstatic'
+      else
+	lt_prog_compiler_static_F77='-bnso -bI:/lib/syscalls.exp'
+      fi
+      ;;
+
+    mingw* | cygwin* | pw32* | os2* | cegcc*)
+      # This hack is so that the source file can tell whether it is being
+      # built for inclusion in a dll (and should export symbols for example).
+      lt_prog_compiler_pic_F77='-DDLL_EXPORT'
+      ;;
+
+    hpux9* | hpux10* | hpux11*)
+      lt_prog_compiler_wl_F77='-Wl,'
+      # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but
+      # not for PA HP-UX.
+      case $host_cpu in
+      hppa*64*|ia64*)
+	# +Z the default
+	;;
+      *)
+	lt_prog_compiler_pic_F77='+Z'
+	;;
+      esac
+      # Is there a better lt_prog_compiler_static that works with the bundled CC?
+      lt_prog_compiler_static_F77='${wl}-a ${wl}archive'
+      ;;
+
+    irix5* | irix6* | nonstopux*)
+      lt_prog_compiler_wl_F77='-Wl,'
+      # PIC (with -KPIC) is the default.
+      lt_prog_compiler_static_F77='-non_shared'
+      ;;
+
+    linux* | k*bsd*-gnu | kopensolaris*-gnu)
+      case $cc_basename in
+      # old Intel for x86_64 which still supported -KPIC.
+      ecc*)
+	lt_prog_compiler_wl_F77='-Wl,'
+	lt_prog_compiler_pic_F77='-KPIC'
+	lt_prog_compiler_static_F77='-static'
+        ;;
+      # icc used to be incompatible with GCC.
+      # ICC 10 doesn't accept -KPIC any more.
+      icc* | ifort*)
+	lt_prog_compiler_wl_F77='-Wl,'
+	lt_prog_compiler_pic_F77='-fPIC'
+	lt_prog_compiler_static_F77='-static'
+        ;;
+      # Lahey Fortran 8.1.
+      lf95*)
+	lt_prog_compiler_wl_F77='-Wl,'
+	lt_prog_compiler_pic_F77='--shared'
+	lt_prog_compiler_static_F77='--static'
+	;;
+      nagfor*)
+	# NAG Fortran compiler
+	lt_prog_compiler_wl_F77='-Wl,-Wl,,'
+	lt_prog_compiler_pic_F77='-PIC'
+	lt_prog_compiler_static_F77='-Bstatic'
+	;;
+      pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*)
+        # Portland Group compilers (*not* the Pentium gcc compiler,
+	# which looks to be a dead project)
+	lt_prog_compiler_wl_F77='-Wl,'
+	lt_prog_compiler_pic_F77='-fpic'
+	lt_prog_compiler_static_F77='-Bstatic'
+        ;;
+      ccc*)
+        lt_prog_compiler_wl_F77='-Wl,'
+        # All Alpha code is PIC.
+        lt_prog_compiler_static_F77='-non_shared'
+        ;;
+      xl* | bgxl* | bgf* | mpixl*)
+	# IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene
+	lt_prog_compiler_wl_F77='-Wl,'
+	lt_prog_compiler_pic_F77='-qpic'
+	lt_prog_compiler_static_F77='-qstaticlink'
+	;;
+      *)
+	case `$CC -V 2>&1 | sed 5q` in
+	*Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [1-7].* | *Sun*Fortran*\ 8.[0-3]*)
+	  # Sun Fortran 8.3 passes all unrecognized flags to the linker
+	  lt_prog_compiler_pic_F77='-KPIC'
+	  lt_prog_compiler_static_F77='-Bstatic'
+	  lt_prog_compiler_wl_F77=''
+	  ;;
+	*Sun\ F* | *Sun*Fortran*)
+	  lt_prog_compiler_pic_F77='-KPIC'
+	  lt_prog_compiler_static_F77='-Bstatic'
+	  lt_prog_compiler_wl_F77='-Qoption ld '
+	  ;;
+	*Sun\ C*)
+	  # Sun C 5.9
+	  lt_prog_compiler_pic_F77='-KPIC'
+	  lt_prog_compiler_static_F77='-Bstatic'
+	  lt_prog_compiler_wl_F77='-Wl,'
+	  ;;
+        *Intel*\ [CF]*Compiler*)
+	  lt_prog_compiler_wl_F77='-Wl,'
+	  lt_prog_compiler_pic_F77='-fPIC'
+	  lt_prog_compiler_static_F77='-static'
+	  ;;
+	*Portland\ Group*)
+	  lt_prog_compiler_wl_F77='-Wl,'
+	  lt_prog_compiler_pic_F77='-fpic'
+	  lt_prog_compiler_static_F77='-Bstatic'
+	  ;;
+	esac
+	;;
+      esac
+      ;;
+
+    newsos6)
+      lt_prog_compiler_pic_F77='-KPIC'
+      lt_prog_compiler_static_F77='-Bstatic'
+      ;;
+
+    *nto* | *qnx*)
+      # QNX uses GNU C++, but need to define -shared option too, otherwise
+      # it will coredump.
+      lt_prog_compiler_pic_F77='-fPIC -shared'
+      ;;
+
+    osf3* | osf4* | osf5*)
+      lt_prog_compiler_wl_F77='-Wl,'
+      # All OSF/1 code is PIC.
+      lt_prog_compiler_static_F77='-non_shared'
+      ;;
+
+    rdos*)
+      lt_prog_compiler_static_F77='-non_shared'
+      ;;
+
+    solaris*)
+      lt_prog_compiler_pic_F77='-KPIC'
+      lt_prog_compiler_static_F77='-Bstatic'
+      case $cc_basename in
+      f77* | f90* | f95* | sunf77* | sunf90* | sunf95*)
+	lt_prog_compiler_wl_F77='-Qoption ld ';;
+      *)
+	lt_prog_compiler_wl_F77='-Wl,';;
+      esac
+      ;;
+
+    sunos4*)
+      lt_prog_compiler_wl_F77='-Qoption ld '
+      lt_prog_compiler_pic_F77='-PIC'
+      lt_prog_compiler_static_F77='-Bstatic'
+      ;;
+
+    sysv4 | sysv4.2uw2* | sysv4.3*)
+      lt_prog_compiler_wl_F77='-Wl,'
+      lt_prog_compiler_pic_F77='-KPIC'
+      lt_prog_compiler_static_F77='-Bstatic'
+      ;;
+
+    sysv4*MP*)
+      if test -d /usr/nec ;then
+	lt_prog_compiler_pic_F77='-Kconform_pic'
+	lt_prog_compiler_static_F77='-Bstatic'
+      fi
+      ;;
+
+    sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
+      lt_prog_compiler_wl_F77='-Wl,'
+      lt_prog_compiler_pic_F77='-KPIC'
+      lt_prog_compiler_static_F77='-Bstatic'
+      ;;
+
+    unicos*)
+      lt_prog_compiler_wl_F77='-Wl,'
+      lt_prog_compiler_can_build_shared_F77=no
+      ;;
+
+    uts4*)
+      lt_prog_compiler_pic_F77='-pic'
+      lt_prog_compiler_static_F77='-Bstatic'
+      ;;
+
+    *)
+      lt_prog_compiler_can_build_shared_F77=no
+      ;;
+    esac
+  fi
+
+case $host_os in
+  # For platforms which do not support PIC, -DPIC is meaningless:
+  *djgpp*)
+    lt_prog_compiler_pic_F77=
+    ;;
+  *)
+    lt_prog_compiler_pic_F77="$lt_prog_compiler_pic_F77"
+    ;;
+esac
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5
+$as_echo_n "checking for $compiler option to produce PIC... " >&6; }
+if ${lt_cv_prog_compiler_pic_F77+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_prog_compiler_pic_F77=$lt_prog_compiler_pic_F77
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_F77" >&5
+$as_echo "$lt_cv_prog_compiler_pic_F77" >&6; }
+lt_prog_compiler_pic_F77=$lt_cv_prog_compiler_pic_F77
+
+#
+# Check to make sure the PIC flag actually works.
+#
+if test -n "$lt_prog_compiler_pic_F77"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic_F77 works" >&5
+$as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic_F77 works... " >&6; }
+if ${lt_cv_prog_compiler_pic_works_F77+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_prog_compiler_pic_works_F77=no
+   ac_outfile=conftest.$ac_objext
+   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+   lt_compiler_flag="$lt_prog_compiler_pic_F77"
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   # The option is referenced via a variable to avoid confusing sed.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
+   (eval "$lt_compile" 2>conftest.err)
+   ac_status=$?
+   cat conftest.err >&5
+   echo "$as_me:$LINENO: \$? = $ac_status" >&5
+   if (exit $ac_status) && test -s "$ac_outfile"; then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings other than the usual output.
+     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp
+     $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+     if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
+       lt_cv_prog_compiler_pic_works_F77=yes
+     fi
+   fi
+   $RM conftest*
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works_F77" >&5
+$as_echo "$lt_cv_prog_compiler_pic_works_F77" >&6; }
+
+if test x"$lt_cv_prog_compiler_pic_works_F77" = xyes; then
+    case $lt_prog_compiler_pic_F77 in
+     "" | " "*) ;;
+     *) lt_prog_compiler_pic_F77=" $lt_prog_compiler_pic_F77" ;;
+     esac
+else
+    lt_prog_compiler_pic_F77=
+     lt_prog_compiler_can_build_shared_F77=no
+fi
+
+fi
+
+
+
+
+
+#
+# Check to make sure the static flag actually works.
+#
+wl=$lt_prog_compiler_wl_F77 eval lt_tmp_static_flag=\"$lt_prog_compiler_static_F77\"
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5
+$as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; }
+if ${lt_cv_prog_compiler_static_works_F77+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_prog_compiler_static_works_F77=no
+   save_LDFLAGS="$LDFLAGS"
+   LDFLAGS="$LDFLAGS $lt_tmp_static_flag"
+   echo "$lt_simple_link_test_code" > conftest.$ac_ext
+   if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
+     # The linker can only warn and ignore the option if not recognized
+     # So say no if there are warnings
+     if test -s conftest.err; then
+       # Append any errors to the config.log.
+       cat conftest.err 1>&5
+       $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp
+       $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+       if diff conftest.exp conftest.er2 >/dev/null; then
+         lt_cv_prog_compiler_static_works_F77=yes
+       fi
+     else
+       lt_cv_prog_compiler_static_works_F77=yes
+     fi
+   fi
+   $RM -r conftest*
+   LDFLAGS="$save_LDFLAGS"
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works_F77" >&5
+$as_echo "$lt_cv_prog_compiler_static_works_F77" >&6; }
+
+if test x"$lt_cv_prog_compiler_static_works_F77" = xyes; then
+    :
+else
+    lt_prog_compiler_static_F77=
+fi
+
+
+
+
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5
+$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; }
+if ${lt_cv_prog_compiler_c_o_F77+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_prog_compiler_c_o_F77=no
+   $RM -r conftest 2>/dev/null
+   mkdir conftest
+   cd conftest
+   mkdir out
+   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+   lt_compiler_flag="-o out/conftest2.$ac_objext"
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
+   (eval "$lt_compile" 2>out/conftest.err)
+   ac_status=$?
+   cat out/conftest.err >&5
+   echo "$as_me:$LINENO: \$? = $ac_status" >&5
+   if (exit $ac_status) && test -s out/conftest2.$ac_objext
+   then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings
+     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp
+     $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
+     if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
+       lt_cv_prog_compiler_c_o_F77=yes
+     fi
+   fi
+   chmod u+w . 2>&5
+   $RM conftest*
+   # SGI C++ compiler will create directory out/ii_files/ for
+   # template instantiation
+   test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files
+   $RM out/* && rmdir out
+   cd ..
+   $RM -r conftest
+   $RM conftest*
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_F77" >&5
+$as_echo "$lt_cv_prog_compiler_c_o_F77" >&6; }
+
+
+
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5
+$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; }
+if ${lt_cv_prog_compiler_c_o_F77+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_prog_compiler_c_o_F77=no
+   $RM -r conftest 2>/dev/null
+   mkdir conftest
+   cd conftest
+   mkdir out
+   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+   lt_compiler_flag="-o out/conftest2.$ac_objext"
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
+   (eval "$lt_compile" 2>out/conftest.err)
+   ac_status=$?
+   cat out/conftest.err >&5
+   echo "$as_me:$LINENO: \$? = $ac_status" >&5
+   if (exit $ac_status) && test -s out/conftest2.$ac_objext
+   then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings
+     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp
+     $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
+     if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
+       lt_cv_prog_compiler_c_o_F77=yes
+     fi
+   fi
+   chmod u+w . 2>&5
+   $RM conftest*
+   # SGI C++ compiler will create directory out/ii_files/ for
+   # template instantiation
+   test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files
+   $RM out/* && rmdir out
+   cd ..
+   $RM -r conftest
+   $RM conftest*
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_F77" >&5
+$as_echo "$lt_cv_prog_compiler_c_o_F77" >&6; }
+
+
+
+
+hard_links="nottested"
+if test "$lt_cv_prog_compiler_c_o_F77" = no && test "$need_locks" != no; then
+  # do not overwrite the value of need_locks provided by the user
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5
+$as_echo_n "checking if we can lock with hard links... " >&6; }
+  hard_links=yes
+  $RM conftest*
+  ln conftest.a conftest.b 2>/dev/null && hard_links=no
+  touch conftest.a
+  ln conftest.a conftest.b 2>&5 || hard_links=no
+  ln conftest.a conftest.b 2>/dev/null && hard_links=no
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5
+$as_echo "$hard_links" >&6; }
+  if test "$hard_links" = no; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5
+$as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;}
+    need_locks=warn
+  fi
+else
+  need_locks=no
+fi
+
+
+
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5
+$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; }
+
+  runpath_var=
+  allow_undefined_flag_F77=
+  always_export_symbols_F77=no
+  archive_cmds_F77=
+  archive_expsym_cmds_F77=
+  compiler_needs_object_F77=no
+  enable_shared_with_static_runtimes_F77=no
+  export_dynamic_flag_spec_F77=
+  export_symbols_cmds_F77='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+  hardcode_automatic_F77=no
+  hardcode_direct_F77=no
+  hardcode_direct_absolute_F77=no
+  hardcode_libdir_flag_spec_F77=
+  hardcode_libdir_separator_F77=
+  hardcode_minus_L_F77=no
+  hardcode_shlibpath_var_F77=unsupported
+  inherit_rpath_F77=no
+  link_all_deplibs_F77=unknown
+  module_cmds_F77=
+  module_expsym_cmds_F77=
+  old_archive_from_new_cmds_F77=
+  old_archive_from_expsyms_cmds_F77=
+  thread_safe_flag_spec_F77=
+  whole_archive_flag_spec_F77=
+  # include_expsyms should be a list of space-separated symbols to be *always*
+  # included in the symbol list
+  include_expsyms_F77=
+  # exclude_expsyms can be an extended regexp of symbols to exclude
+  # it will be wrapped by ` (' and `)$', so one must not match beginning or
+  # end of line.  Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc',
+  # as well as any symbol that contains `d'.
+  exclude_expsyms_F77='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'
+  # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out
+  # platforms (ab)use it in PIC code, but their linkers get confused if
+  # the symbol is explicitly referenced.  Since portable code cannot
+  # rely on this symbol name, it's probably fine to never include it in
+  # preloaded symbol tables.
+  # Exclude shared library initialization/finalization symbols.
+  extract_expsyms_cmds=
+
+  case $host_os in
+  cygwin* | mingw* | pw32* | cegcc*)
+    # FIXME: the MSVC++ port hasn't been tested in a loooong time
+    # When not using gcc, we currently assume that we are using
+    # Microsoft Visual C++.
+    if test "$GCC" != yes; then
+      with_gnu_ld=no
+    fi
+    ;;
+  interix*)
+    # we just hope/assume this is gcc and not c89 (= MSVC++)
+    with_gnu_ld=yes
+    ;;
+  openbsd*)
+    with_gnu_ld=no
+    ;;
+  esac
+
+  ld_shlibs_F77=yes
+
+  # On some targets, GNU ld is compatible enough with the native linker
+  # that we're better off using the native interface for both.
+  lt_use_gnu_ld_interface=no
+  if test "$with_gnu_ld" = yes; then
+    case $host_os in
+      aix*)
+	# The AIX port of GNU ld has always aspired to compatibility
+	# with the native linker.  However, as the warning in the GNU ld
+	# block says, versions before 2.19.5* couldn't really create working
+	# shared libraries, regardless of the interface used.
+	case `$LD -v 2>&1` in
+	  *\ \(GNU\ Binutils\)\ 2.19.5*) ;;
+	  *\ \(GNU\ Binutils\)\ 2.[2-9]*) ;;
+	  *\ \(GNU\ Binutils\)\ [3-9]*) ;;
+	  *)
+	    lt_use_gnu_ld_interface=yes
+	    ;;
+	esac
+	;;
+      *)
+	lt_use_gnu_ld_interface=yes
+	;;
+    esac
+  fi
+
+  if test "$lt_use_gnu_ld_interface" = yes; then
+    # If archive_cmds runs LD, not CC, wlarc should be empty
+    wlarc='${wl}'
+
+    # Set some defaults for GNU ld with shared library support. These
+    # are reset later if shared libraries are not supported. Putting them
+    # here allows them to be overridden if necessary.
+    runpath_var=LD_RUN_PATH
+    hardcode_libdir_flag_spec_F77='${wl}-rpath ${wl}$libdir'
+    export_dynamic_flag_spec_F77='${wl}--export-dynamic'
+    # ancient GNU ld didn't support --whole-archive et. al.
+    if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then
+      whole_archive_flag_spec_F77="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
+    else
+      whole_archive_flag_spec_F77=
+    fi
+    supports_anon_versioning=no
+    case `$LD -v 2>&1` in
+      *GNU\ gold*) supports_anon_versioning=yes ;;
+      *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11
+      *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ...
+      *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ...
+      *\ 2.11.*) ;; # other 2.11 versions
+      *) supports_anon_versioning=yes ;;
+    esac
+
+    # See if GNU ld supports shared libraries.
+    case $host_os in
+    aix[3-9]*)
+      # On AIX/PPC, the GNU linker is very broken
+      if test "$host_cpu" != ia64; then
+	ld_shlibs_F77=no
+	cat <<_LT_EOF 1>&2
+
+*** Warning: the GNU linker, at least up to release 2.19, is reported
+*** to be unable to reliably create shared libraries on AIX.
+*** Therefore, libtool is disabling shared libraries support.  If you
+*** really care for shared libraries, you may want to install binutils
+*** 2.20 or above, or modify your PATH so that a non-GNU linker is found.
+*** You will then need to restart the configuration process.
+
+_LT_EOF
+      fi
+      ;;
+
+    amigaos*)
+      case $host_cpu in
+      powerpc)
+            # see comment about AmigaOS4 .so support
+            archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+            archive_expsym_cmds_F77=''
+        ;;
+      m68k)
+            archive_cmds_F77='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
+            hardcode_libdir_flag_spec_F77='-L$libdir'
+            hardcode_minus_L_F77=yes
+        ;;
+      esac
+      ;;
+
+    beos*)
+      if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+	allow_undefined_flag_F77=unsupported
+	# Joseph Beckenbach <jrb3 at best.com> says some releases of gcc
+	# support --undefined.  This deserves some investigation.  FIXME
+	archive_cmds_F77='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+      else
+	ld_shlibs_F77=no
+      fi
+      ;;
+
+    cygwin* | mingw* | pw32* | cegcc*)
+      # _LT_TAGVAR(hardcode_libdir_flag_spec, F77) is actually meaningless,
+      # as there is no search path for DLLs.
+      hardcode_libdir_flag_spec_F77='-L$libdir'
+      export_dynamic_flag_spec_F77='${wl}--export-all-symbols'
+      allow_undefined_flag_F77=unsupported
+      always_export_symbols_F77=no
+      enable_shared_with_static_runtimes_F77=yes
+      export_symbols_cmds_F77='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols'
+      exclude_expsyms_F77='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'
+
+      if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then
+        archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+	# If the export-symbols file already is a .def file (1st line
+	# is EXPORTS), use it as is; otherwise, prepend...
+	archive_expsym_cmds_F77='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
+	  cp $export_symbols $output_objdir/$soname.def;
+	else
+	  echo EXPORTS > $output_objdir/$soname.def;
+	  cat $export_symbols >> $output_objdir/$soname.def;
+	fi~
+	$CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+      else
+	ld_shlibs_F77=no
+      fi
+      ;;
+
+    haiku*)
+      archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+      link_all_deplibs_F77=yes
+      ;;
+
+    interix[3-9]*)
+      hardcode_direct_F77=no
+      hardcode_shlibpath_var_F77=no
+      hardcode_libdir_flag_spec_F77='${wl}-rpath,$libdir'
+      export_dynamic_flag_spec_F77='${wl}-E'
+      # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
+      # Instead, shared libraries are loaded at an image base (0x10000000 by
+      # default) and relocated if they conflict, which is a slow very memory
+      # consuming and fragmenting process.  To avoid this, we pick a random,
+      # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
+      # time.  Moving up from 0x10000000 also allows more sbrk(2) space.
+      archive_cmds_F77='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+      archive_expsym_cmds_F77='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+      ;;
+
+    gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu)
+      tmp_diet=no
+      if test "$host_os" = linux-dietlibc; then
+	case $cc_basename in
+	  diet\ *) tmp_diet=yes;;	# linux-dietlibc with static linking (!diet-dyn)
+	esac
+      fi
+      if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \
+	 && test "$tmp_diet" = no
+      then
+	tmp_addflag=' $pic_flag'
+	tmp_sharedflag='-shared'
+	case $cc_basename,$host_cpu in
+        pgcc*)				# Portland Group C compiler
+	  whole_archive_flag_spec_F77='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+	  tmp_addflag=' $pic_flag'
+	  ;;
+	pgf77* | pgf90* | pgf95* | pgfortran*)
+					# Portland Group f77 and f90 compilers
+	  whole_archive_flag_spec_F77='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+	  tmp_addflag=' $pic_flag -Mnomain' ;;
+	ecc*,ia64* | icc*,ia64*)	# Intel C compiler on ia64
+	  tmp_addflag=' -i_dynamic' ;;
+	efc*,ia64* | ifort*,ia64*)	# Intel Fortran compiler on ia64
+	  tmp_addflag=' -i_dynamic -nofor_main' ;;
+	ifc* | ifort*)			# Intel Fortran compiler
+	  tmp_addflag=' -nofor_main' ;;
+	lf95*)				# Lahey Fortran 8.1
+	  whole_archive_flag_spec_F77=
+	  tmp_sharedflag='--shared' ;;
+	xl[cC]* | bgxl[cC]* | mpixl[cC]*) # IBM XL C 8.0 on PPC (deal with xlf below)
+	  tmp_sharedflag='-qmkshrobj'
+	  tmp_addflag= ;;
+	nvcc*)	# Cuda Compiler Driver 2.2
+	  whole_archive_flag_spec_F77='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+	  compiler_needs_object_F77=yes
+	  ;;
+	esac
+	case `$CC -V 2>&1 | sed 5q` in
+	*Sun\ C*)			# Sun C 5.9
+	  whole_archive_flag_spec_F77='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+	  compiler_needs_object_F77=yes
+	  tmp_sharedflag='-G' ;;
+	*Sun\ F*)			# Sun Fortran 8.3
+	  tmp_sharedflag='-G' ;;
+	esac
+	archive_cmds_F77='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+
+        if test "x$supports_anon_versioning" = xyes; then
+          archive_expsym_cmds_F77='echo "{ global:" > $output_objdir/$libname.ver~
+	    cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+	    echo "local: *; };" >> $output_objdir/$libname.ver~
+	    $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'
+        fi
+
+	case $cc_basename in
+	xlf* | bgf* | bgxlf* | mpixlf*)
+	  # IBM XL Fortran 10.1 on PPC cannot create shared libs itself
+	  whole_archive_flag_spec_F77='--whole-archive$convenience --no-whole-archive'
+	  hardcode_libdir_flag_spec_F77='${wl}-rpath ${wl}$libdir'
+	  archive_cmds_F77='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib'
+	  if test "x$supports_anon_versioning" = xyes; then
+	    archive_expsym_cmds_F77='echo "{ global:" > $output_objdir/$libname.ver~
+	      cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+	      echo "local: *; };" >> $output_objdir/$libname.ver~
+	      $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib'
+	  fi
+	  ;;
+	esac
+      else
+        ld_shlibs_F77=no
+      fi
+      ;;
+
+    netbsd*)
+      if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+	archive_cmds_F77='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib'
+	wlarc=
+      else
+	archive_cmds_F77='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	archive_expsym_cmds_F77='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+      fi
+      ;;
+
+    solaris*)
+      if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then
+	ld_shlibs_F77=no
+	cat <<_LT_EOF 1>&2
+
+*** Warning: The releases 2.8.* of the GNU linker cannot reliably
+*** create shared libraries on Solaris systems.  Therefore, libtool
+*** is disabling shared libraries support.  We urge you to upgrade GNU
+*** binutils to release 2.9.1 or newer.  Another option is to modify
+*** your PATH or compiler configuration so that the native linker is
+*** used, and then restart.
+
+_LT_EOF
+      elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+	archive_cmds_F77='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	archive_expsym_cmds_F77='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+      else
+	ld_shlibs_F77=no
+      fi
+      ;;
+
+    sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*)
+      case `$LD -v 2>&1` in
+        *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*)
+	ld_shlibs_F77=no
+	cat <<_LT_EOF 1>&2
+
+*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not
+*** reliably create shared libraries on SCO systems.  Therefore, libtool
+*** is disabling shared libraries support.  We urge you to upgrade GNU
+*** binutils to release 2.16.91.0.3 or newer.  Another option is to modify
+*** your PATH or compiler configuration so that the native linker is
+*** used, and then restart.
+
+_LT_EOF
+	;;
+	*)
+	  # For security reasons, it is highly recommended that you always
+	  # use absolute paths for naming shared libraries, and exclude the
+	  # DT_RUNPATH tag from executables and libraries.  But doing so
+	  # requires that you compile everything twice, which is a pain.
+	  if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+	    hardcode_libdir_flag_spec_F77='${wl}-rpath ${wl}$libdir'
+	    archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	    archive_expsym_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+	  else
+	    ld_shlibs_F77=no
+	  fi
+	;;
+      esac
+      ;;
+
+    sunos4*)
+      archive_cmds_F77='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+      wlarc=
+      hardcode_direct_F77=yes
+      hardcode_shlibpath_var_F77=no
+      ;;
+
+    *)
+      if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+	archive_cmds_F77='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	archive_expsym_cmds_F77='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+      else
+	ld_shlibs_F77=no
+      fi
+      ;;
+    esac
+
+    if test "$ld_shlibs_F77" = no; then
+      runpath_var=
+      hardcode_libdir_flag_spec_F77=
+      export_dynamic_flag_spec_F77=
+      whole_archive_flag_spec_F77=
+    fi
+  else
+    # PORTME fill in a description of your system's linker (not GNU ld)
+    case $host_os in
+    aix3*)
+      allow_undefined_flag_F77=unsupported
+      always_export_symbols_F77=yes
+      archive_expsym_cmds_F77='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname'
+      # Note: this linker hardcodes the directories in LIBPATH if there
+      # are no directories specified by -L.
+      hardcode_minus_L_F77=yes
+      if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then
+	# Neither direct hardcoding nor static linking is supported with a
+	# broken collect2.
+	hardcode_direct_F77=unsupported
+      fi
+      ;;
+
+    aix[4-9]*)
+      if test "$host_cpu" = ia64; then
+	# On IA64, the linker does run time linking by default, so we don't
+	# have to do anything special.
+	aix_use_runtimelinking=no
+	exp_sym_flag='-Bexport'
+	no_entry_flag=""
+      else
+	# If we're using GNU nm, then we don't want the "-C" option.
+	# -C means demangle to AIX nm, but means don't demangle with GNU nm
+	# Also, AIX nm treats weak defined symbols like other global
+	# defined symbols, whereas GNU nm marks them as "W".
+	if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then
+	  export_symbols_cmds_F77='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
+	else
+	  export_symbols_cmds_F77='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
+	fi
+	aix_use_runtimelinking=no
+
+	# Test if we are trying to use run time linking or normal
+	# AIX style linking. If -brtl is somewhere in LDFLAGS, we
+	# need to do runtime linking.
+	case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*)
+	  for ld_flag in $LDFLAGS; do
+	  if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then
+	    aix_use_runtimelinking=yes
+	    break
+	  fi
+	  done
+	  ;;
+	esac
+
+	exp_sym_flag='-bexport'
+	no_entry_flag='-bnoentry'
+      fi
+
+      # When large executables or shared objects are built, AIX ld can
+      # have problems creating the table of contents.  If linking a library
+      # or program results in "error TOC overflow" add -mminimal-toc to
+      # CXXFLAGS/CFLAGS for g++/gcc.  In the cases where that is not
+      # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
+
+      archive_cmds_F77=''
+      hardcode_direct_F77=yes
+      hardcode_direct_absolute_F77=yes
+      hardcode_libdir_separator_F77=':'
+      link_all_deplibs_F77=yes
+      file_list_spec_F77='${wl}-f,'
+
+      if test "$GCC" = yes; then
+	case $host_os in aix4.[012]|aix4.[012].*)
+	# We only want to do this on AIX 4.2 and lower, the check
+	# below for broken collect2 doesn't work under 4.3+
+	  collect2name=`${CC} -print-prog-name=collect2`
+	  if test -f "$collect2name" &&
+	   strings "$collect2name" | $GREP resolve_lib_name >/dev/null
+	  then
+	  # We have reworked collect2
+	  :
+	  else
+	  # We have old collect2
+	  hardcode_direct_F77=unsupported
+	  # It fails to find uninstalled libraries when the uninstalled
+	  # path is not listed in the libpath.  Setting hardcode_minus_L
+	  # to unsupported forces relinking
+	  hardcode_minus_L_F77=yes
+	  hardcode_libdir_flag_spec_F77='-L$libdir'
+	  hardcode_libdir_separator_F77=
+	  fi
+	  ;;
+	esac
+	shared_flag='-shared'
+	if test "$aix_use_runtimelinking" = yes; then
+	  shared_flag="$shared_flag "'${wl}-G'
+	fi
+      else
+	# not using gcc
+	if test "$host_cpu" = ia64; then
+	# VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
+	# chokes on -Wl,-G. The following line is correct:
+	  shared_flag='-G'
+	else
+	  if test "$aix_use_runtimelinking" = yes; then
+	    shared_flag='${wl}-G'
+	  else
+	    shared_flag='${wl}-bM:SRE'
+	  fi
+	fi
+      fi
+
+      export_dynamic_flag_spec_F77='${wl}-bexpall'
+      # It seems that -bexpall does not export symbols beginning with
+      # underscore (_), so it is better to generate a list of symbols to export.
+      always_export_symbols_F77=yes
+      if test "$aix_use_runtimelinking" = yes; then
+	# Warning - without using the other runtime loading flags (-brtl),
+	# -berok will link without error, but may produce a broken library.
+	allow_undefined_flag_F77='-berok'
+        # Determine the default libpath from the value encoded in an
+        # empty executable.
+        if test "${lt_cv_aix_libpath+set}" = set; then
+  aix_libpath=$lt_cv_aix_libpath
+else
+  if ${lt_cv_aix_libpath__F77+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat > conftest.$ac_ext <<_ACEOF
+      program main
+
+      end
+_ACEOF
+if ac_fn_f77_try_link "$LINENO"; then :
+
+  lt_aix_libpath_sed='
+      /Import File Strings/,/^$/ {
+	  /^0/ {
+	      s/^0  *\([^ ]*\) *$/\1/
+	      p
+	  }
+      }'
+  lt_cv_aix_libpath__F77=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+  # Check for a 64-bit object if we didn't find anything.
+  if test -z "$lt_cv_aix_libpath__F77"; then
+    lt_cv_aix_libpath__F77=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+  fi
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+  if test -z "$lt_cv_aix_libpath__F77"; then
+    lt_cv_aix_libpath__F77="/usr/lib:/lib"
+  fi
+
+fi
+
+  aix_libpath=$lt_cv_aix_libpath__F77
+fi
+
+        hardcode_libdir_flag_spec_F77='${wl}-blibpath:$libdir:'"$aix_libpath"
+        archive_expsym_cmds_F77='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
+      else
+	if test "$host_cpu" = ia64; then
+	  hardcode_libdir_flag_spec_F77='${wl}-R $libdir:/usr/lib:/lib'
+	  allow_undefined_flag_F77="-z nodefs"
+	  archive_expsym_cmds_F77="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols"
+	else
+	 # Determine the default libpath from the value encoded in an
+	 # empty executable.
+	 if test "${lt_cv_aix_libpath+set}" = set; then
+  aix_libpath=$lt_cv_aix_libpath
+else
+  if ${lt_cv_aix_libpath__F77+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat > conftest.$ac_ext <<_ACEOF
+      program main
+
+      end
+_ACEOF
+if ac_fn_f77_try_link "$LINENO"; then :
+
+  lt_aix_libpath_sed='
+      /Import File Strings/,/^$/ {
+	  /^0/ {
+	      s/^0  *\([^ ]*\) *$/\1/
+	      p
+	  }
+      }'
+  lt_cv_aix_libpath__F77=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+  # Check for a 64-bit object if we didn't find anything.
+  if test -z "$lt_cv_aix_libpath__F77"; then
+    lt_cv_aix_libpath__F77=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+  fi
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+  if test -z "$lt_cv_aix_libpath__F77"; then
+    lt_cv_aix_libpath__F77="/usr/lib:/lib"
+  fi
+
+fi
+
+  aix_libpath=$lt_cv_aix_libpath__F77
+fi
+
+	 hardcode_libdir_flag_spec_F77='${wl}-blibpath:$libdir:'"$aix_libpath"
+	  # Warning - without using the other run time loading flags,
+	  # -berok will link without error, but may produce a broken library.
+	  no_undefined_flag_F77=' ${wl}-bernotok'
+	  allow_undefined_flag_F77=' ${wl}-berok'
+	  if test "$with_gnu_ld" = yes; then
+	    # We only use this code for GNU lds that support --whole-archive.
+	    whole_archive_flag_spec_F77='${wl}--whole-archive$convenience ${wl}--no-whole-archive'
+	  else
+	    # Exported symbols can be pulled into shared objects from archives
+	    whole_archive_flag_spec_F77='$convenience'
+	  fi
+	  archive_cmds_need_lc_F77=yes
+	  # This is similar to how AIX traditionally builds its shared libraries.
+	  archive_expsym_cmds_F77="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'
+	fi
+      fi
+      ;;
+
+    amigaos*)
+      case $host_cpu in
+      powerpc)
+            # see comment about AmigaOS4 .so support
+            archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+            archive_expsym_cmds_F77=''
+        ;;
+      m68k)
+            archive_cmds_F77='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
+            hardcode_libdir_flag_spec_F77='-L$libdir'
+            hardcode_minus_L_F77=yes
+        ;;
+      esac
+      ;;
+
+    bsdi[45]*)
+      export_dynamic_flag_spec_F77=-rdynamic
+      ;;
+
+    cygwin* | mingw* | pw32* | cegcc*)
+      # When not using gcc, we currently assume that we are using
+      # Microsoft Visual C++.
+      # hardcode_libdir_flag_spec is actually meaningless, as there is
+      # no search path for DLLs.
+      case $cc_basename in
+      cl*)
+	# Native MSVC
+	hardcode_libdir_flag_spec_F77=' '
+	allow_undefined_flag_F77=unsupported
+	always_export_symbols_F77=yes
+	file_list_spec_F77='@'
+	# Tell ltmain to make .lib files, not .a files.
+	libext=lib
+	# Tell ltmain to make .dll files, not .so files.
+	shrext_cmds=".dll"
+	# FIXME: Setting linknames here is a bad hack.
+	archive_cmds_F77='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames='
+	archive_expsym_cmds_F77='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
+	    sed -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp;
+	  else
+	    sed -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp;
+	  fi~
+	  $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~
+	  linknames='
+	# The linker will not automatically build a static lib if we build a DLL.
+	# _LT_TAGVAR(old_archive_from_new_cmds, F77)='true'
+	enable_shared_with_static_runtimes_F77=yes
+	exclude_expsyms_F77='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*'
+	export_symbols_cmds_F77='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1,DATA/'\'' | $SED -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols'
+	# Don't use ranlib
+	old_postinstall_cmds_F77='chmod 644 $oldlib'
+	postlink_cmds_F77='lt_outputfile="@OUTPUT@"~
+	  lt_tool_outputfile="@TOOL_OUTPUT@"~
+	  case $lt_outputfile in
+	    *.exe|*.EXE) ;;
+	    *)
+	      lt_outputfile="$lt_outputfile.exe"
+	      lt_tool_outputfile="$lt_tool_outputfile.exe"
+	      ;;
+	  esac~
+	  if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then
+	    $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1;
+	    $RM "$lt_outputfile.manifest";
+	  fi'
+	;;
+      *)
+	# Assume MSVC wrapper
+	hardcode_libdir_flag_spec_F77=' '
+	allow_undefined_flag_F77=unsupported
+	# Tell ltmain to make .lib files, not .a files.
+	libext=lib
+	# Tell ltmain to make .dll files, not .so files.
+	shrext_cmds=".dll"
+	# FIXME: Setting linknames here is a bad hack.
+	archive_cmds_F77='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames='
+	# The linker will automatically build a .lib file if we build a DLL.
+	old_archive_from_new_cmds_F77='true'
+	# FIXME: Should let the user specify the lib program.
+	old_archive_cmds_F77='lib -OUT:$oldlib$oldobjs$old_deplibs'
+	enable_shared_with_static_runtimes_F77=yes
+	;;
+      esac
+      ;;
+
+    darwin* | rhapsody*)
+
+
+  archive_cmds_need_lc_F77=no
+  hardcode_direct_F77=no
+  hardcode_automatic_F77=yes
+  hardcode_shlibpath_var_F77=unsupported
+  if test "$lt_cv_ld_force_load" = "yes"; then
+    whole_archive_flag_spec_F77='`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`'
+    compiler_needs_object_F77=yes
+  else
+    whole_archive_flag_spec_F77=''
+  fi
+  link_all_deplibs_F77=yes
+  allow_undefined_flag_F77="$_lt_dar_allow_undefined"
+  case $cc_basename in
+     ifort*) _lt_dar_can_shared=yes ;;
+     *) _lt_dar_can_shared=$GCC ;;
+  esac
+  if test "$_lt_dar_can_shared" = "yes"; then
+    output_verbose_link_cmd=func_echo_all
+    archive_cmds_F77="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}"
+    module_cmds_F77="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}"
+    archive_expsym_cmds_F77="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}"
+    module_expsym_cmds_F77="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}"
+
+  else
+  ld_shlibs_F77=no
+  fi
+
+      ;;
+
+    dgux*)
+      archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      hardcode_libdir_flag_spec_F77='-L$libdir'
+      hardcode_shlibpath_var_F77=no
+      ;;
+
+    # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor
+    # support.  Future versions do this automatically, but an explicit c++rt0.o
+    # does not break anything, and helps significantly (at the cost of a little
+    # extra space).
+    freebsd2.2*)
+      archive_cmds_F77='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o'
+      hardcode_libdir_flag_spec_F77='-R$libdir'
+      hardcode_direct_F77=yes
+      hardcode_shlibpath_var_F77=no
+      ;;
+
+    # Unfortunately, older versions of FreeBSD 2 do not have this feature.
+    freebsd2.*)
+      archive_cmds_F77='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+      hardcode_direct_F77=yes
+      hardcode_minus_L_F77=yes
+      hardcode_shlibpath_var_F77=no
+      ;;
+
+    # FreeBSD 3 and greater uses gcc -shared to do shared libraries.
+    freebsd* | dragonfly*)
+      archive_cmds_F77='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+      hardcode_libdir_flag_spec_F77='-R$libdir'
+      hardcode_direct_F77=yes
+      hardcode_shlibpath_var_F77=no
+      ;;
+
+    hpux9*)
+      if test "$GCC" = yes; then
+	archive_cmds_F77='$RM $output_objdir/$soname~$CC -shared $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+      else
+	archive_cmds_F77='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+      fi
+      hardcode_libdir_flag_spec_F77='${wl}+b ${wl}$libdir'
+      hardcode_libdir_separator_F77=:
+      hardcode_direct_F77=yes
+
+      # hardcode_minus_L: Not really in the search PATH,
+      # but as the default location of the library.
+      hardcode_minus_L_F77=yes
+      export_dynamic_flag_spec_F77='${wl}-E'
+      ;;
+
+    hpux10*)
+      if test "$GCC" = yes && test "$with_gnu_ld" = no; then
+	archive_cmds_F77='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	archive_cmds_F77='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'
+      fi
+      if test "$with_gnu_ld" = no; then
+	hardcode_libdir_flag_spec_F77='${wl}+b ${wl}$libdir'
+	hardcode_libdir_separator_F77=:
+	hardcode_direct_F77=yes
+	hardcode_direct_absolute_F77=yes
+	export_dynamic_flag_spec_F77='${wl}-E'
+	# hardcode_minus_L: Not really in the search PATH,
+	# but as the default location of the library.
+	hardcode_minus_L_F77=yes
+      fi
+      ;;
+
+    hpux11*)
+      if test "$GCC" = yes && test "$with_gnu_ld" = no; then
+	case $host_cpu in
+	hppa*64*)
+	  archive_cmds_F77='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	ia64*)
+	  archive_cmds_F77='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	*)
+	  archive_cmds_F77='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	esac
+      else
+	case $host_cpu in
+	hppa*64*)
+	  archive_cmds_F77='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	ia64*)
+	  archive_cmds_F77='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	*)
+	archive_cmds_F77='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	esac
+      fi
+      if test "$with_gnu_ld" = no; then
+	hardcode_libdir_flag_spec_F77='${wl}+b ${wl}$libdir'
+	hardcode_libdir_separator_F77=:
+
+	case $host_cpu in
+	hppa*64*|ia64*)
+	  hardcode_direct_F77=no
+	  hardcode_shlibpath_var_F77=no
+	  ;;
+	*)
+	  hardcode_direct_F77=yes
+	  hardcode_direct_absolute_F77=yes
+	  export_dynamic_flag_spec_F77='${wl}-E'
+
+	  # hardcode_minus_L: Not really in the search PATH,
+	  # but as the default location of the library.
+	  hardcode_minus_L_F77=yes
+	  ;;
+	esac
+      fi
+      ;;
+
+    irix5* | irix6* | nonstopux*)
+      if test "$GCC" = yes; then
+	archive_cmds_F77='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+	# Try to use the -exported_symbol ld option, if it does not
+	# work, assume that -exports_file does not work either and
+	# implicitly export all symbols.
+	# This should be the same for all languages, so no per-tag cache variable.
+	{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $host_os linker accepts -exported_symbol" >&5
+$as_echo_n "checking whether the $host_os linker accepts -exported_symbol... " >&6; }
+if ${lt_cv_irix_exported_symbol+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  save_LDFLAGS="$LDFLAGS"
+	   LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null"
+	   cat > conftest.$ac_ext <<_ACEOF
+
+      subroutine foo
+      end
+_ACEOF
+if ac_fn_f77_try_link "$LINENO"; then :
+  lt_cv_irix_exported_symbol=yes
+else
+  lt_cv_irix_exported_symbol=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+           LDFLAGS="$save_LDFLAGS"
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_irix_exported_symbol" >&5
+$as_echo "$lt_cv_irix_exported_symbol" >&6; }
+	if test "$lt_cv_irix_exported_symbol" = yes; then
+          archive_expsym_cmds_F77='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib'
+	fi
+      else
+	archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
+	archive_expsym_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib'
+      fi
+      archive_cmds_need_lc_F77='no'
+      hardcode_libdir_flag_spec_F77='${wl}-rpath ${wl}$libdir'
+      hardcode_libdir_separator_F77=:
+      inherit_rpath_F77=yes
+      link_all_deplibs_F77=yes
+      ;;
+
+    netbsd*)
+      if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+	archive_cmds_F77='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'  # a.out
+      else
+	archive_cmds_F77='$LD -shared -o $lib $libobjs $deplibs $linker_flags'      # ELF
+      fi
+      hardcode_libdir_flag_spec_F77='-R$libdir'
+      hardcode_direct_F77=yes
+      hardcode_shlibpath_var_F77=no
+      ;;
+
+    newsos6)
+      archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      hardcode_direct_F77=yes
+      hardcode_libdir_flag_spec_F77='${wl}-rpath ${wl}$libdir'
+      hardcode_libdir_separator_F77=:
+      hardcode_shlibpath_var_F77=no
+      ;;
+
+    *nto* | *qnx*)
+      ;;
+
+    openbsd*)
+      if test -f /usr/libexec/ld.so; then
+	hardcode_direct_F77=yes
+	hardcode_shlibpath_var_F77=no
+	hardcode_direct_absolute_F77=yes
+	if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+	  archive_cmds_F77='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+	  archive_expsym_cmds_F77='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols'
+	  hardcode_libdir_flag_spec_F77='${wl}-rpath,$libdir'
+	  export_dynamic_flag_spec_F77='${wl}-E'
+	else
+	  case $host_os in
+	   openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*)
+	     archive_cmds_F77='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+	     hardcode_libdir_flag_spec_F77='-R$libdir'
+	     ;;
+	   *)
+	     archive_cmds_F77='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+	     hardcode_libdir_flag_spec_F77='${wl}-rpath,$libdir'
+	     ;;
+	  esac
+	fi
+      else
+	ld_shlibs_F77=no
+      fi
+      ;;
+
+    os2*)
+      hardcode_libdir_flag_spec_F77='-L$libdir'
+      hardcode_minus_L_F77=yes
+      allow_undefined_flag_F77=unsupported
+      archive_cmds_F77='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~echo DATA >> $output_objdir/$libname.def~echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def'
+      old_archive_from_new_cmds_F77='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def'
+      ;;
+
+    osf3*)
+      if test "$GCC" = yes; then
+	allow_undefined_flag_F77=' ${wl}-expect_unresolved ${wl}\*'
+	archive_cmds_F77='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+      else
+	allow_undefined_flag_F77=' -expect_unresolved \*'
+	archive_cmds_F77='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
+      fi
+      archive_cmds_need_lc_F77='no'
+      hardcode_libdir_flag_spec_F77='${wl}-rpath ${wl}$libdir'
+      hardcode_libdir_separator_F77=:
+      ;;
+
+    osf4* | osf5*)	# as osf3* with the addition of -msym flag
+      if test "$GCC" = yes; then
+	allow_undefined_flag_F77=' ${wl}-expect_unresolved ${wl}\*'
+	archive_cmds_F77='$CC -shared${allow_undefined_flag} $pic_flag $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+	hardcode_libdir_flag_spec_F77='${wl}-rpath ${wl}$libdir'
+      else
+	allow_undefined_flag_F77=' -expect_unresolved \*'
+	archive_cmds_F77='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
+	archive_expsym_cmds_F77='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~
+	$CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp'
+
+	# Both c and cxx compiler support -rpath directly
+	hardcode_libdir_flag_spec_F77='-rpath $libdir'
+      fi
+      archive_cmds_need_lc_F77='no'
+      hardcode_libdir_separator_F77=:
+      ;;
+
+    solaris*)
+      no_undefined_flag_F77=' -z defs'
+      if test "$GCC" = yes; then
+	wlarc='${wl}'
+	archive_cmds_F77='$CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+	archive_expsym_cmds_F77='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+	  $CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
+      else
+	case `$CC -V 2>&1` in
+	*"Compilers 5.0"*)
+	  wlarc=''
+	  archive_cmds_F77='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	  archive_expsym_cmds_F77='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+	  $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp'
+	  ;;
+	*)
+	  wlarc='${wl}'
+	  archive_cmds_F77='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags'
+	  archive_expsym_cmds_F77='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+	  $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
+	  ;;
+	esac
+      fi
+      hardcode_libdir_flag_spec_F77='-R$libdir'
+      hardcode_shlibpath_var_F77=no
+      case $host_os in
+      solaris2.[0-5] | solaris2.[0-5].*) ;;
+      *)
+	# The compiler driver will combine and reorder linker options,
+	# but understands `-z linker_flag'.  GCC discards it without `$wl',
+	# but is careful enough not to reorder.
+	# Supported since Solaris 2.6 (maybe 2.5.1?)
+	if test "$GCC" = yes; then
+	  whole_archive_flag_spec_F77='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract'
+	else
+	  whole_archive_flag_spec_F77='-z allextract$convenience -z defaultextract'
+	fi
+	;;
+      esac
+      link_all_deplibs_F77=yes
+      ;;
+
+    sunos4*)
+      if test "x$host_vendor" = xsequent; then
+	# Use $CC to link under sequent, because it throws in some extra .o
+	# files that make .init and .fini sections work.
+	archive_cmds_F77='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	archive_cmds_F77='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags'
+      fi
+      hardcode_libdir_flag_spec_F77='-L$libdir'
+      hardcode_direct_F77=yes
+      hardcode_minus_L_F77=yes
+      hardcode_shlibpath_var_F77=no
+      ;;
+
+    sysv4)
+      case $host_vendor in
+	sni)
+	  archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	  hardcode_direct_F77=yes # is this really true???
+	;;
+	siemens)
+	  ## LD is ld it makes a PLAMLIB
+	  ## CC just makes a GrossModule.
+	  archive_cmds_F77='$LD -G -o $lib $libobjs $deplibs $linker_flags'
+	  reload_cmds_F77='$CC -r -o $output$reload_objs'
+	  hardcode_direct_F77=no
+        ;;
+	motorola)
+	  archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	  hardcode_direct_F77=no #Motorola manual says yes, but my tests say they lie
+	;;
+      esac
+      runpath_var='LD_RUN_PATH'
+      hardcode_shlibpath_var_F77=no
+      ;;
+
+    sysv4.3*)
+      archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      hardcode_shlibpath_var_F77=no
+      export_dynamic_flag_spec_F77='-Bexport'
+      ;;
+
+    sysv4*MP*)
+      if test -d /usr/nec; then
+	archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	hardcode_shlibpath_var_F77=no
+	runpath_var=LD_RUN_PATH
+	hardcode_runpath_var=yes
+	ld_shlibs_F77=yes
+      fi
+      ;;
+
+    sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*)
+      no_undefined_flag_F77='${wl}-z,text'
+      archive_cmds_need_lc_F77=no
+      hardcode_shlibpath_var_F77=no
+      runpath_var='LD_RUN_PATH'
+
+      if test "$GCC" = yes; then
+	archive_cmds_F77='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	archive_expsym_cmds_F77='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	archive_cmds_F77='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	archive_expsym_cmds_F77='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      fi
+      ;;
+
+    sysv5* | sco3.2v5* | sco5v6*)
+      # Note: We can NOT use -z defs as we might desire, because we do not
+      # link with -lc, and that would cause any symbols used from libc to
+      # always be unresolved, which means just about no library would
+      # ever link correctly.  If we're not using GNU ld we use -z text
+      # though, which does catch some bad symbols but isn't as heavy-handed
+      # as -z defs.
+      no_undefined_flag_F77='${wl}-z,text'
+      allow_undefined_flag_F77='${wl}-z,nodefs'
+      archive_cmds_need_lc_F77=no
+      hardcode_shlibpath_var_F77=no
+      hardcode_libdir_flag_spec_F77='${wl}-R,$libdir'
+      hardcode_libdir_separator_F77=':'
+      link_all_deplibs_F77=yes
+      export_dynamic_flag_spec_F77='${wl}-Bexport'
+      runpath_var='LD_RUN_PATH'
+
+      if test "$GCC" = yes; then
+	archive_cmds_F77='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	archive_expsym_cmds_F77='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	archive_cmds_F77='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	archive_expsym_cmds_F77='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      fi
+      ;;
+
+    uts4*)
+      archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      hardcode_libdir_flag_spec_F77='-L$libdir'
+      hardcode_shlibpath_var_F77=no
+      ;;
+
+    *)
+      ld_shlibs_F77=no
+      ;;
+    esac
+
+    if test x$host_vendor = xsni; then
+      case $host in
+      sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)
+	export_dynamic_flag_spec_F77='${wl}-Blargedynsym'
+	;;
+      esac
+    fi
+  fi
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_F77" >&5
+$as_echo "$ld_shlibs_F77" >&6; }
+test "$ld_shlibs_F77" = no && can_build_shared=no
+
+with_gnu_ld_F77=$with_gnu_ld
+
+
+
+
+
+
+#
+# Do we need to explicitly link libc?
+#
+case "x$archive_cmds_need_lc_F77" in
+x|xyes)
+  # Assume -lc should be added
+  archive_cmds_need_lc_F77=yes
+
+  if test "$enable_shared" = yes && test "$GCC" = yes; then
+    case $archive_cmds_F77 in
+    *'~'*)
+      # FIXME: we may have to deal with multi-command sequences.
+      ;;
+    '$CC '*)
+      # Test whether the compiler implicitly links with -lc since on some
+      # systems, -lgcc has to come before -lc. If gcc already passes -lc
+      # to ld, don't add -lc before -lgcc.
+      { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5
+$as_echo_n "checking whether -lc should be explicitly linked in... " >&6; }
+if ${lt_cv_archive_cmds_need_lc_F77+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  $RM conftest*
+	echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+	if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } 2>conftest.err; then
+	  soname=conftest
+	  lib=conftest
+	  libobjs=conftest.$ac_objext
+	  deplibs=
+	  wl=$lt_prog_compiler_wl_F77
+	  pic_flag=$lt_prog_compiler_pic_F77
+	  compiler_flags=-v
+	  linker_flags=-v
+	  verstring=
+	  output_objdir=.
+	  libname=conftest
+	  lt_save_allow_undefined_flag=$allow_undefined_flag_F77
+	  allow_undefined_flag_F77=
+	  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds_F77 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5
+  (eval $archive_cmds_F77 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }
+	  then
+	    lt_cv_archive_cmds_need_lc_F77=no
+	  else
+	    lt_cv_archive_cmds_need_lc_F77=yes
+	  fi
+	  allow_undefined_flag_F77=$lt_save_allow_undefined_flag
+	else
+	  cat conftest.err 1>&5
+	fi
+	$RM conftest*
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc_F77" >&5
+$as_echo "$lt_cv_archive_cmds_need_lc_F77" >&6; }
+      archive_cmds_need_lc_F77=$lt_cv_archive_cmds_need_lc_F77
+      ;;
+    esac
+  fi
+  ;;
+esac
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5
+$as_echo_n "checking dynamic linker characteristics... " >&6; }
+
+library_names_spec=
+libname_spec='lib$name'
+soname_spec=
+shrext_cmds=".so"
+postinstall_cmds=
+postuninstall_cmds=
+finish_cmds=
+finish_eval=
+shlibpath_var=
+shlibpath_overrides_runpath=unknown
+version_type=none
+dynamic_linker="$host_os ld.so"
+sys_lib_dlsearch_path_spec="/lib /usr/lib"
+need_lib_prefix=unknown
+hardcode_into_libs=no
+
+# when you set need_version to no, make sure it does not cause -set_version
+# flags to be left without arguments
+need_version=unknown
+
+case $host_os in
+aix3*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a'
+  shlibpath_var=LIBPATH
+
+  # AIX 3 has no versioning support, so we append a major version to the name.
+  soname_spec='${libname}${release}${shared_ext}$major'
+  ;;
+
+aix[4-9]*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  hardcode_into_libs=yes
+  if test "$host_cpu" = ia64; then
+    # AIX 5 supports IA64
+    library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}'
+    shlibpath_var=LD_LIBRARY_PATH
+  else
+    # With GCC up to 2.95.x, collect2 would create an import file
+    # for dependence libraries.  The import file would start with
+    # the line `#! .'.  This would cause the generated library to
+    # depend on `.', always an invalid library.  This was fixed in
+    # development snapshots of GCC prior to 3.0.
+    case $host_os in
+      aix4 | aix4.[01] | aix4.[01].*)
+      if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'
+	   echo ' yes '
+	   echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then
+	:
+      else
+	can_build_shared=no
+      fi
+      ;;
+    esac
+    # AIX (on Power*) has no versioning support, so currently we can not hardcode correct
+    # soname into executable. Probably we can add versioning support to
+    # collect2, so additional links can be useful in future.
+    if test "$aix_use_runtimelinking" = yes; then
+      # If using run time linking (on AIX 4.2 or later) use lib<name>.so
+      # instead of lib<name>.a to let people know that these are not
+      # typical AIX shared libraries.
+      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    else
+      # We preserve .a as extension for shared libraries through AIX4.2
+      # and later when we are not doing run time linking.
+      library_names_spec='${libname}${release}.a $libname.a'
+      soname_spec='${libname}${release}${shared_ext}$major'
+    fi
+    shlibpath_var=LIBPATH
+  fi
+  ;;
+
+amigaos*)
+  case $host_cpu in
+  powerpc)
+    # Since July 2007 AmigaOS4 officially supports .so libraries.
+    # When compiling the executable, add -use-dynld -Lsobjs: to the compileline.
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    ;;
+  m68k)
+    library_names_spec='$libname.ixlibrary $libname.a'
+    # Create ${libname}_ixlibrary.a entries in /sys/libs.
+    finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'
+    ;;
+  esac
+  ;;
+
+beos*)
+  library_names_spec='${libname}${shared_ext}'
+  dynamic_linker="$host_os ld.so"
+  shlibpath_var=LIBRARY_PATH
+  ;;
+
+bsdi[45]*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib"
+  sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib"
+  # the default ld.so.conf also contains /usr/contrib/lib and
+  # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow
+  # libtool to hard-code these into programs
+  ;;
+
+cygwin* | mingw* | pw32* | cegcc*)
+  version_type=windows
+  shrext_cmds=".dll"
+  need_version=no
+  need_lib_prefix=no
+
+  case $GCC,$cc_basename in
+  yes,*)
+    # gcc
+    library_names_spec='$libname.dll.a'
+    # DLL is installed to $(libdir)/../bin by postinstall_cmds
+    postinstall_cmds='base_file=`basename \${file}`~
+      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~
+      dldir=$destdir/`dirname \$dlpath`~
+      test -d \$dldir || mkdir -p \$dldir~
+      $install_prog $dir/$dlname \$dldir/$dlname~
+      chmod a+x \$dldir/$dlname~
+      if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then
+        eval '\''$striplib \$dldir/$dlname'\'' || exit \$?;
+      fi'
+    postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
+      dlpath=$dir/\$dldll~
+       $RM \$dlpath'
+    shlibpath_overrides_runpath=yes
+
+    case $host_os in
+    cygwin*)
+      # Cygwin DLLs use 'cyg' prefix rather than 'lib'
+      soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+
+      ;;
+    mingw* | cegcc*)
+      # MinGW DLLs use traditional 'lib' prefix
+      soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+      ;;
+    pw32*)
+      # pw32 DLLs use 'pw' prefix rather than 'lib'
+      library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+      ;;
+    esac
+    dynamic_linker='Win32 ld.exe'
+    ;;
+
+  *,cl*)
+    # Native MSVC
+    libname_spec='$name'
+    soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+    library_names_spec='${libname}.dll.lib'
+
+    case $build_os in
+    mingw*)
+      sys_lib_search_path_spec=
+      lt_save_ifs=$IFS
+      IFS=';'
+      for lt_path in $LIB
+      do
+        IFS=$lt_save_ifs
+        # Let DOS variable expansion print the short 8.3 style file name.
+        lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"`
+        sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path"
+      done
+      IFS=$lt_save_ifs
+      # Convert to MSYS style.
+      sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'`
+      ;;
+    cygwin*)
+      # Convert to unix form, then to dos form, then back to unix form
+      # but this time dos style (no spaces!) so that the unix form looks
+      # like /cygdrive/c/PROGRA~1:/cygdr...
+      sys_lib_search_path_spec=`cygpath --path --unix "$LIB"`
+      sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null`
+      sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
+      ;;
+    *)
+      sys_lib_search_path_spec="$LIB"
+      if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then
+        # It is most probably a Windows format PATH.
+        sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
+      else
+        sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
+      fi
+      # FIXME: find the short name or the path components, as spaces are
+      # common. (e.g. "Program Files" -> "PROGRA~1")
+      ;;
+    esac
+
+    # DLL is installed to $(libdir)/../bin by postinstall_cmds
+    postinstall_cmds='base_file=`basename \${file}`~
+      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~
+      dldir=$destdir/`dirname \$dlpath`~
+      test -d \$dldir || mkdir -p \$dldir~
+      $install_prog $dir/$dlname \$dldir/$dlname'
+    postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
+      dlpath=$dir/\$dldll~
+       $RM \$dlpath'
+    shlibpath_overrides_runpath=yes
+    dynamic_linker='Win32 link.exe'
+    ;;
+
+  *)
+    # Assume MSVC wrapper
+    library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib'
+    dynamic_linker='Win32 ld.exe'
+    ;;
+  esac
+  # FIXME: first we should search . and the directory the executable is in
+  shlibpath_var=PATH
+  ;;
+
+darwin* | rhapsody*)
+  dynamic_linker="$host_os dyld"
+  version_type=darwin
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext'
+  soname_spec='${libname}${release}${major}$shared_ext'
+  shlibpath_overrides_runpath=yes
+  shlibpath_var=DYLD_LIBRARY_PATH
+  shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`'
+
+  sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib'
+  ;;
+
+dgux*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  ;;
+
+freebsd* | dragonfly*)
+  # DragonFly does not have aout.  When/if they implement a new
+  # versioning mechanism, adjust this.
+  if test -x /usr/bin/objformat; then
+    objformat=`/usr/bin/objformat`
+  else
+    case $host_os in
+    freebsd[23].*) objformat=aout ;;
+    *) objformat=elf ;;
+    esac
+  fi
+  version_type=freebsd-$objformat
+  case $version_type in
+    freebsd-elf*)
+      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
+      need_version=no
+      need_lib_prefix=no
+      ;;
+    freebsd-*)
+      library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix'
+      need_version=yes
+      ;;
+  esac
+  shlibpath_var=LD_LIBRARY_PATH
+  case $host_os in
+  freebsd2.*)
+    shlibpath_overrides_runpath=yes
+    ;;
+  freebsd3.[01]* | freebsdelf3.[01]*)
+    shlibpath_overrides_runpath=yes
+    hardcode_into_libs=yes
+    ;;
+  freebsd3.[2-9]* | freebsdelf3.[2-9]* | \
+  freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1)
+    shlibpath_overrides_runpath=no
+    hardcode_into_libs=yes
+    ;;
+  *) # from 4.6 on, and DragonFly
+    shlibpath_overrides_runpath=yes
+    hardcode_into_libs=yes
+    ;;
+  esac
+  ;;
+
+gnu*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  ;;
+
+haiku*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  dynamic_linker="$host_os runtime_loader"
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib'
+  hardcode_into_libs=yes
+  ;;
+
+hpux9* | hpux10* | hpux11*)
+  # Give a soname corresponding to the major version so that dld.sl refuses to
+  # link against other versions.
+  version_type=sunos
+  need_lib_prefix=no
+  need_version=no
+  case $host_cpu in
+  ia64*)
+    shrext_cmds='.so'
+    hardcode_into_libs=yes
+    dynamic_linker="$host_os dld.so"
+    shlibpath_var=LD_LIBRARY_PATH
+    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    if test "X$HPUX_IA64_MODE" = X32; then
+      sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib"
+    else
+      sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64"
+    fi
+    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+    ;;
+  hppa*64*)
+    shrext_cmds='.sl'
+    hardcode_into_libs=yes
+    dynamic_linker="$host_os dld.sl"
+    shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH
+    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64"
+    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+    ;;
+  *)
+    shrext_cmds='.sl'
+    dynamic_linker="$host_os dld.sl"
+    shlibpath_var=SHLIB_PATH
+    shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    ;;
+  esac
+  # HP-UX runs *really* slowly unless shared libraries are mode 555, ...
+  postinstall_cmds='chmod 555 $lib'
+  # or fails outright, so override atomically:
+  install_override_mode=555
+  ;;
+
+interix[3-9]*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  ;;
+
+irix5* | irix6* | nonstopux*)
+  case $host_os in
+    nonstopux*) version_type=nonstopux ;;
+    *)
+	if test "$lt_cv_prog_gnu_ld" = yes; then
+		version_type=linux # correct to gnu/linux during the next big refactor
+	else
+		version_type=irix
+	fi ;;
+  esac
+  need_lib_prefix=no
+  need_version=no
+  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}'
+  case $host_os in
+  irix5* | nonstopux*)
+    libsuff= shlibsuff=
+    ;;
+  *)
+    case $LD in # libtool.m4 will add one of these switches to LD
+    *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ")
+      libsuff= shlibsuff= libmagic=32-bit;;
+    *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ")
+      libsuff=32 shlibsuff=N32 libmagic=N32;;
+    *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ")
+      libsuff=64 shlibsuff=64 libmagic=64-bit;;
+    *) libsuff= shlibsuff= libmagic=never-match;;
+    esac
+    ;;
+  esac
+  shlibpath_var=LD_LIBRARY${shlibsuff}_PATH
+  shlibpath_overrides_runpath=no
+  sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}"
+  sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}"
+  hardcode_into_libs=yes
+  ;;
+
+# No shared lib support for Linux oldld, aout, or coff.
+linux*oldld* | linux*aout* | linux*coff*)
+  dynamic_linker=no
+  ;;
+
+# This must be glibc/ELF.
+linux* | k*bsd*-gnu | kopensolaris*-gnu)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+
+  # Some binutils ld are patched to set DT_RUNPATH
+  if ${lt_cv_shlibpath_overrides_runpath+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_shlibpath_overrides_runpath=no
+    save_LDFLAGS=$LDFLAGS
+    save_libdir=$libdir
+    eval "libdir=/foo; wl=\"$lt_prog_compiler_wl_F77\"; \
+	 LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec_F77\""
+    cat > conftest.$ac_ext <<_ACEOF
+      program main
+
+      end
+_ACEOF
+if ac_fn_f77_try_link "$LINENO"; then :
+  if  ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then :
+  lt_cv_shlibpath_overrides_runpath=yes
+fi
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+    LDFLAGS=$save_LDFLAGS
+    libdir=$save_libdir
+
+fi
+
+  shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath
+
+  # This implies no fast_install, which is unacceptable.
+  # Some rework will be needed to allow for fast_install
+  # before this can be enabled.
+  hardcode_into_libs=yes
+
+  # Append ld.so.conf contents to the search path
+  if test -f /etc/ld.so.conf; then
+    lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[	 ]*hwcap[	 ]/d;s/[:,	]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '`
+    sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra"
+  fi
+
+  # We used to test for /lib/ld.so.1 and disable shared libraries on
+  # powerpc, because MkLinux only supported shared libraries with the
+  # GNU dynamic linker.  Since this was broken with cross compilers,
+  # most powerpc-linux boxes support dynamic linking these days and
+  # people can always --disable-shared, the test was removed, and we
+  # assume the GNU/Linux dynamic linker is in use.
+  dynamic_linker='GNU/Linux ld.so'
+  ;;
+
+netbsd*)
+  version_type=sunos
+  need_lib_prefix=no
+  need_version=no
+  if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+    finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+    dynamic_linker='NetBSD (a.out) ld.so'
+  else
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    dynamic_linker='NetBSD ld.elf_so'
+  fi
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  hardcode_into_libs=yes
+  ;;
+
+newsos6)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  ;;
+
+*nto* | *qnx*)
+  version_type=qnx
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  dynamic_linker='ldqnx.so'
+  ;;
+
+openbsd*)
+  version_type=sunos
+  sys_lib_dlsearch_path_spec="/usr/lib"
+  need_lib_prefix=no
+  # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs.
+  case $host_os in
+    openbsd3.3 | openbsd3.3.*)	need_version=yes ;;
+    *)				need_version=no  ;;
+  esac
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+    case $host_os in
+      openbsd2.[89] | openbsd2.[89].*)
+	shlibpath_overrides_runpath=no
+	;;
+      *)
+	shlibpath_overrides_runpath=yes
+	;;
+      esac
+  else
+    shlibpath_overrides_runpath=yes
+  fi
+  ;;
+
+os2*)
+  libname_spec='$name'
+  shrext_cmds=".dll"
+  need_lib_prefix=no
+  library_names_spec='$libname${shared_ext} $libname.a'
+  dynamic_linker='OS/2 ld.exe'
+  shlibpath_var=LIBPATH
+  ;;
+
+osf3* | osf4* | osf5*)
+  version_type=osf
+  need_lib_prefix=no
+  need_version=no
+  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  shlibpath_var=LD_LIBRARY_PATH
+  sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib"
+  sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec"
+  ;;
+
+rdos*)
+  dynamic_linker=no
+  ;;
+
+solaris*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  hardcode_into_libs=yes
+  # ldd complains unless libraries are executable
+  postinstall_cmds='chmod +x $lib'
+  ;;
+
+sunos4*)
+  version_type=sunos
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+  finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  if test "$with_gnu_ld" = yes; then
+    need_lib_prefix=no
+  fi
+  need_version=yes
+  ;;
+
+sysv4 | sysv4.3*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  case $host_vendor in
+    sni)
+      shlibpath_overrides_runpath=no
+      need_lib_prefix=no
+      runpath_var=LD_RUN_PATH
+      ;;
+    siemens)
+      need_lib_prefix=no
+      ;;
+    motorola)
+      need_lib_prefix=no
+      need_version=no
+      shlibpath_overrides_runpath=no
+      sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib'
+      ;;
+  esac
+  ;;
+
+sysv4*MP*)
+  if test -d /usr/nec ;then
+    version_type=linux # correct to gnu/linux during the next big refactor
+    library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}'
+    soname_spec='$libname${shared_ext}.$major'
+    shlibpath_var=LD_LIBRARY_PATH
+  fi
+  ;;
+
+sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
+  version_type=freebsd-elf
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  hardcode_into_libs=yes
+  if test "$with_gnu_ld" = yes; then
+    sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib'
+  else
+    sys_lib_search_path_spec='/usr/ccs/lib /usr/lib'
+    case $host_os in
+      sco3.2v5*)
+        sys_lib_search_path_spec="$sys_lib_search_path_spec /lib"
+	;;
+    esac
+  fi
+  sys_lib_dlsearch_path_spec='/usr/lib'
+  ;;
+
+tpf*)
+  # TPF is a cross-target only.  Preferred cross-host = GNU/Linux.
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  ;;
+
+uts4*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  ;;
+
+*)
+  dynamic_linker=no
+  ;;
+esac
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5
+$as_echo "$dynamic_linker" >&6; }
+test "$dynamic_linker" = no && can_build_shared=no
+
+variables_saved_for_relink="PATH $shlibpath_var $runpath_var"
+if test "$GCC" = yes; then
+  variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH"
+fi
+
+if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then
+  sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec"
+fi
+if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then
+  sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec"
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5
+$as_echo_n "checking how to hardcode library paths into programs... " >&6; }
+hardcode_action_F77=
+if test -n "$hardcode_libdir_flag_spec_F77" ||
+   test -n "$runpath_var_F77" ||
+   test "X$hardcode_automatic_F77" = "Xyes" ; then
+
+  # We can hardcode non-existent directories.
+  if test "$hardcode_direct_F77" != no &&
+     # If the only mechanism to avoid hardcoding is shlibpath_var, we
+     # have to relink, otherwise we might link with an installed library
+     # when we should be linking with a yet-to-be-installed one
+     ## test "$_LT_TAGVAR(hardcode_shlibpath_var, F77)" != no &&
+     test "$hardcode_minus_L_F77" != no; then
+    # Linking always hardcodes the temporary library directory.
+    hardcode_action_F77=relink
+  else
+    # We can link without hardcoding, and we can hardcode nonexisting dirs.
+    hardcode_action_F77=immediate
+  fi
+else
+  # We cannot hardcode anything, or else we can only hardcode existing
+  # directories.
+  hardcode_action_F77=unsupported
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action_F77" >&5
+$as_echo "$hardcode_action_F77" >&6; }
+
+if test "$hardcode_action_F77" = relink ||
+   test "$inherit_rpath_F77" = yes; then
+  # Fast installation is not supported
+  enable_fast_install=no
+elif test "$shlibpath_overrides_runpath" = yes ||
+     test "$enable_shared" = no; then
+  # Fast installation is not necessary
+  enable_fast_install=needless
+fi
+
+
+
+
+
+
+
+  fi # test -n "$compiler"
+
+  GCC=$lt_save_GCC
+  CC="$lt_save_CC"
+  CFLAGS="$lt_save_CFLAGS"
+fi # test "$_lt_disable_F77" != yes
+
+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=${ac_fc_srcext-f}
+ac_compile='$FC -c $FCFLAGS $ac_fcflags_srcext conftest.$ac_ext >&5'
+ac_link='$FC -o conftest$ac_exeext $FCFLAGS $LDFLAGS $ac_fcflags_srcext conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_fc_compiler_gnu
+
+
+if test -z "$FC" || test "X$FC" = "Xno"; then
+  _lt_disable_FC=yes
+fi
+
+archive_cmds_need_lc_FC=no
+allow_undefined_flag_FC=
+always_export_symbols_FC=no
+archive_expsym_cmds_FC=
+export_dynamic_flag_spec_FC=
+hardcode_direct_FC=no
+hardcode_direct_absolute_FC=no
+hardcode_libdir_flag_spec_FC=
+hardcode_libdir_separator_FC=
+hardcode_minus_L_FC=no
+hardcode_automatic_FC=no
+inherit_rpath_FC=no
+module_cmds_FC=
+module_expsym_cmds_FC=
+link_all_deplibs_FC=unknown
+old_archive_cmds_FC=$old_archive_cmds
+reload_flag_FC=$reload_flag
+reload_cmds_FC=$reload_cmds
+no_undefined_flag_FC=
+whole_archive_flag_spec_FC=
+enable_shared_with_static_runtimes_FC=no
+
+# Source file extension for fc test sources.
+ac_ext=${ac_fc_srcext-f}
+
+# Object file extension for compiled fc test sources.
+objext=o
+objext_FC=$objext
+
+# No sense in running all these tests if we already determined that
+# the FC compiler isn't working.  Some variables (like enable_shared)
+# are currently assumed to apply to all compilers on this platform,
+# and will be corrupted by setting them based on a non-working compiler.
+if test "$_lt_disable_FC" != yes; then
+  # Code to be used in simple compile tests
+  lt_simple_compile_test_code="\
+      subroutine t
+      return
+      end
+"
+
+  # Code to be used in simple link tests
+  lt_simple_link_test_code="\
+      program t
+      end
+"
+
+  # ltmain only uses $CC for tagged configurations so make sure $CC is set.
+
+
+
+
+
+
+# If no C compiler was specified, use CC.
+LTCC=${LTCC-"$CC"}
+
+# If no C compiler flags were specified, use CFLAGS.
+LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
+
+# Allow CC to be a program name with arguments.
+compiler=$CC
+
+
+  # save warnings/boilerplate of simple test code
+  ac_outfile=conftest.$ac_objext
+echo "$lt_simple_compile_test_code" >conftest.$ac_ext
+eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_compiler_boilerplate=`cat conftest.err`
+$RM conftest*
+
+  ac_outfile=conftest.$ac_objext
+echo "$lt_simple_link_test_code" >conftest.$ac_ext
+eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_linker_boilerplate=`cat conftest.err`
+$RM -r conftest*
+
+
+  # Allow CC to be a program name with arguments.
+  lt_save_CC="$CC"
+  lt_save_GCC=$GCC
+  lt_save_CFLAGS=$CFLAGS
+  CC=${FC-"f95"}
+  CFLAGS=$FCFLAGS
+  compiler=$CC
+  GCC=$ac_cv_fc_compiler_gnu
+
+  compiler_FC=$CC
+  for cc_temp in $compiler""; do
+  case $cc_temp in
+    compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
+    distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
+    \-*) ;;
+    *) break;;
+  esac
+done
+cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"`
+
+
+  if test -n "$compiler"; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking if libtool supports shared libraries" >&5
+$as_echo_n "checking if libtool supports shared libraries... " >&6; }
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $can_build_shared" >&5
+$as_echo "$can_build_shared" >&6; }
+
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries" >&5
+$as_echo_n "checking whether to build shared libraries... " >&6; }
+    test "$can_build_shared" = "no" && enable_shared=no
+
+    # On AIX, shared libraries and static libraries use the same namespace, and
+    # are all built from PIC.
+    case $host_os in
+      aix3*)
+        test "$enable_shared" = yes && enable_static=no
+        if test -n "$RANLIB"; then
+          archive_cmds="$archive_cmds~\$RANLIB \$lib"
+          postinstall_cmds='$RANLIB $lib'
+        fi
+        ;;
+      aix[4-9]*)
+	if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then
+	  test "$enable_shared" = yes && enable_static=no
+	fi
+        ;;
+    esac
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_shared" >&5
+$as_echo "$enable_shared" >&6; }
+
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build static libraries" >&5
+$as_echo_n "checking whether to build static libraries... " >&6; }
+    # Make sure either enable_shared or enable_static is yes.
+    test "$enable_shared" = yes || enable_static=yes
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_static" >&5
+$as_echo "$enable_static" >&6; }
+
+    GCC_FC="$ac_cv_fc_compiler_gnu"
+    LD_FC="$LD"
+
+    ## CAVEAT EMPTOR:
+    ## There is no encapsulation within the following macros, do not change
+    ## the running order or otherwise move them around unless you know exactly
+    ## what you are doing...
+    # Dependencies to place before and after the object being linked:
+predep_objects_FC=
+postdep_objects_FC=
+predeps_FC=
+postdeps_FC=
+compiler_lib_search_path_FC=
+
+cat > conftest.$ac_ext <<_LT_EOF
+      subroutine foo
+      implicit none
+      integer a
+      a=0
+      return
+      end
+_LT_EOF
+
+
+_lt_libdeps_save_CFLAGS=$CFLAGS
+case "$CC $CFLAGS " in #(
+*\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;;
+*\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;;
+*\ -fuse-linker-plugin*\ *) CFLAGS="$CFLAGS -fno-use-linker-plugin" ;;
+esac
+
+if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+  # Parse the compiler output and extract the necessary
+  # objects, libraries and library flags.
+
+  # Sentinel used to keep track of whether or not we are before
+  # the conftest object file.
+  pre_test_object_deps_done=no
+
+  for p in `eval "$output_verbose_link_cmd"`; do
+    case ${prev}${p} in
+
+    -L* | -R* | -l*)
+       # Some compilers place space between "-{L,R}" and the path.
+       # Remove the space.
+       if test $p = "-L" ||
+          test $p = "-R"; then
+	 prev=$p
+	 continue
+       fi
+
+       # Expand the sysroot to ease extracting the directories later.
+       if test -z "$prev"; then
+         case $p in
+         -L*) func_stripname_cnf '-L' '' "$p"; prev=-L; p=$func_stripname_result ;;
+         -R*) func_stripname_cnf '-R' '' "$p"; prev=-R; p=$func_stripname_result ;;
+         -l*) func_stripname_cnf '-l' '' "$p"; prev=-l; p=$func_stripname_result ;;
+         esac
+       fi
+       case $p in
+       =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;;
+       esac
+       if test "$pre_test_object_deps_done" = no; then
+	 case ${prev} in
+	 -L | -R)
+	   # Internal compiler library paths should come after those
+	   # provided the user.  The postdeps already come after the
+	   # user supplied libs so there is no need to process them.
+	   if test -z "$compiler_lib_search_path_FC"; then
+	     compiler_lib_search_path_FC="${prev}${p}"
+	   else
+	     compiler_lib_search_path_FC="${compiler_lib_search_path_FC} ${prev}${p}"
+	   fi
+	   ;;
+	 # The "-l" case would never come before the object being
+	 # linked, so don't bother handling this case.
+	 esac
+       else
+	 if test -z "$postdeps_FC"; then
+	   postdeps_FC="${prev}${p}"
+	 else
+	   postdeps_FC="${postdeps_FC} ${prev}${p}"
+	 fi
+       fi
+       prev=
+       ;;
+
+    *.lto.$objext) ;; # Ignore GCC LTO objects
+    *.$objext)
+       # This assumes that the test object file only shows up
+       # once in the compiler output.
+       if test "$p" = "conftest.$objext"; then
+	 pre_test_object_deps_done=yes
+	 continue
+       fi
+
+       if test "$pre_test_object_deps_done" = no; then
+	 if test -z "$predep_objects_FC"; then
+	   predep_objects_FC="$p"
+	 else
+	   predep_objects_FC="$predep_objects_FC $p"
+	 fi
+       else
+	 if test -z "$postdep_objects_FC"; then
+	   postdep_objects_FC="$p"
+	 else
+	   postdep_objects_FC="$postdep_objects_FC $p"
+	 fi
+       fi
+       ;;
+
+    *) ;; # Ignore the rest.
+
+    esac
+  done
+
+  # Clean up.
+  rm -f a.out a.exe
+else
+  echo "libtool.m4: error: problem compiling FC test program"
+fi
+
+$RM -f confest.$objext
+CFLAGS=$_lt_libdeps_save_CFLAGS
+
+# PORTME: override above test on systems where it is broken
+
+
+case " $postdeps_FC " in
+*" -lc "*) archive_cmds_need_lc_FC=no ;;
+esac
+ compiler_lib_search_dirs_FC=
+if test -n "${compiler_lib_search_path_FC}"; then
+ compiler_lib_search_dirs_FC=`echo " ${compiler_lib_search_path_FC}" | ${SED} -e 's! -L! !g' -e 's!^ !!'`
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+    lt_prog_compiler_wl_FC=
+lt_prog_compiler_pic_FC=
+lt_prog_compiler_static_FC=
+
+
+  if test "$GCC" = yes; then
+    lt_prog_compiler_wl_FC='-Wl,'
+    lt_prog_compiler_static_FC='-static'
+
+    case $host_os in
+      aix*)
+      # All AIX code is PIC.
+      if test "$host_cpu" = ia64; then
+	# AIX 5 now supports IA64 processor
+	lt_prog_compiler_static_FC='-Bstatic'
+      fi
+      ;;
+
+    amigaos*)
+      case $host_cpu in
+      powerpc)
+            # see comment about AmigaOS4 .so support
+            lt_prog_compiler_pic_FC='-fPIC'
+        ;;
+      m68k)
+            # FIXME: we need at least 68020 code to build shared libraries, but
+            # adding the `-m68020' flag to GCC prevents building anything better,
+            # like `-m68040'.
+            lt_prog_compiler_pic_FC='-m68020 -resident32 -malways-restore-a4'
+        ;;
+      esac
+      ;;
+
+    beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
+      # PIC is the default for these OSes.
+      ;;
+
+    mingw* | cygwin* | pw32* | os2* | cegcc*)
+      # This hack is so that the source file can tell whether it is being
+      # built for inclusion in a dll (and should export symbols for example).
+      # Although the cygwin gcc ignores -fPIC, still need this for old-style
+      # (--disable-auto-import) libraries
+      lt_prog_compiler_pic_FC='-DDLL_EXPORT'
+      ;;
+
+    darwin* | rhapsody*)
+      # PIC is the default on this platform
+      # Common symbols not allowed in MH_DYLIB files
+      lt_prog_compiler_pic_FC='-fno-common'
+      ;;
+
+    haiku*)
+      # PIC is the default for Haiku.
+      # The "-static" flag exists, but is broken.
+      lt_prog_compiler_static_FC=
+      ;;
+
+    hpux*)
+      # PIC is the default for 64-bit PA HP-UX, but not for 32-bit
+      # PA HP-UX.  On IA64 HP-UX, PIC is the default but the pic flag
+      # sets the default TLS model and affects inlining.
+      case $host_cpu in
+      hppa*64*)
+	# +Z the default
+	;;
+      *)
+	lt_prog_compiler_pic_FC='-fPIC'
+	;;
+      esac
+      ;;
+
+    interix[3-9]*)
+      # Interix 3.x gcc -fpic/-fPIC options generate broken code.
+      # Instead, we relocate shared libraries at runtime.
+      ;;
+
+    msdosdjgpp*)
+      # Just because we use GCC doesn't mean we suddenly get shared libraries
+      # on systems that don't support them.
+      lt_prog_compiler_can_build_shared_FC=no
+      enable_shared=no
+      ;;
+
+    *nto* | *qnx*)
+      # QNX uses GNU C++, but need to define -shared option too, otherwise
+      # it will coredump.
+      lt_prog_compiler_pic_FC='-fPIC -shared'
+      ;;
+
+    sysv4*MP*)
+      if test -d /usr/nec; then
+	lt_prog_compiler_pic_FC=-Kconform_pic
+      fi
+      ;;
+
+    *)
+      lt_prog_compiler_pic_FC='-fPIC'
+      ;;
+    esac
+
+    case $cc_basename in
+    nvcc*) # Cuda Compiler Driver 2.2
+      lt_prog_compiler_wl_FC='-Xlinker '
+      if test -n "$lt_prog_compiler_pic_FC"; then
+        lt_prog_compiler_pic_FC="-Xcompiler $lt_prog_compiler_pic_FC"
+      fi
+      ;;
+    esac
+  else
+    # PORTME Check for flag to pass linker flags through the system compiler.
+    case $host_os in
+    aix*)
+      lt_prog_compiler_wl_FC='-Wl,'
+      if test "$host_cpu" = ia64; then
+	# AIX 5 now supports IA64 processor
+	lt_prog_compiler_static_FC='-Bstatic'
+      else
+	lt_prog_compiler_static_FC='-bnso -bI:/lib/syscalls.exp'
+      fi
+      ;;
+
+    mingw* | cygwin* | pw32* | os2* | cegcc*)
+      # This hack is so that the source file can tell whether it is being
+      # built for inclusion in a dll (and should export symbols for example).
+      lt_prog_compiler_pic_FC='-DDLL_EXPORT'
+      ;;
+
+    hpux9* | hpux10* | hpux11*)
+      lt_prog_compiler_wl_FC='-Wl,'
+      # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but
+      # not for PA HP-UX.
+      case $host_cpu in
+      hppa*64*|ia64*)
+	# +Z the default
+	;;
+      *)
+	lt_prog_compiler_pic_FC='+Z'
+	;;
+      esac
+      # Is there a better lt_prog_compiler_static that works with the bundled CC?
+      lt_prog_compiler_static_FC='${wl}-a ${wl}archive'
+      ;;
+
+    irix5* | irix6* | nonstopux*)
+      lt_prog_compiler_wl_FC='-Wl,'
+      # PIC (with -KPIC) is the default.
+      lt_prog_compiler_static_FC='-non_shared'
+      ;;
+
+    linux* | k*bsd*-gnu | kopensolaris*-gnu)
+      case $cc_basename in
+      # old Intel for x86_64 which still supported -KPIC.
+      ecc*)
+	lt_prog_compiler_wl_FC='-Wl,'
+	lt_prog_compiler_pic_FC='-KPIC'
+	lt_prog_compiler_static_FC='-static'
+        ;;
+      # icc used to be incompatible with GCC.
+      # ICC 10 doesn't accept -KPIC any more.
+      icc* | ifort*)
+	lt_prog_compiler_wl_FC='-Wl,'
+	lt_prog_compiler_pic_FC='-fPIC'
+	lt_prog_compiler_static_FC='-static'
+        ;;
+      # Lahey Fortran 8.1.
+      lf95*)
+	lt_prog_compiler_wl_FC='-Wl,'
+	lt_prog_compiler_pic_FC='--shared'
+	lt_prog_compiler_static_FC='--static'
+	;;
+      nagfor*)
+	# NAG Fortran compiler
+	lt_prog_compiler_wl_FC='-Wl,-Wl,,'
+	lt_prog_compiler_pic_FC='-PIC'
+	lt_prog_compiler_static_FC='-Bstatic'
+	;;
+      pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*)
+        # Portland Group compilers (*not* the Pentium gcc compiler,
+	# which looks to be a dead project)
+	lt_prog_compiler_wl_FC='-Wl,'
+	lt_prog_compiler_pic_FC='-fpic'
+	lt_prog_compiler_static_FC='-Bstatic'
+        ;;
+      ccc*)
+        lt_prog_compiler_wl_FC='-Wl,'
+        # All Alpha code is PIC.
+        lt_prog_compiler_static_FC='-non_shared'
+        ;;
+      xl* | bgxl* | bgf* | mpixl*)
+	# IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene
+	lt_prog_compiler_wl_FC='-Wl,'
+	lt_prog_compiler_pic_FC='-qpic'
+	lt_prog_compiler_static_FC='-qstaticlink'
+	;;
+      *)
+	case `$CC -V 2>&1 | sed 5q` in
+	*Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [1-7].* | *Sun*Fortran*\ 8.[0-3]*)
+	  # Sun Fortran 8.3 passes all unrecognized flags to the linker
+	  lt_prog_compiler_pic_FC='-KPIC'
+	  lt_prog_compiler_static_FC='-Bstatic'
+	  lt_prog_compiler_wl_FC=''
+	  ;;
+	*Sun\ F* | *Sun*Fortran*)
+	  lt_prog_compiler_pic_FC='-KPIC'
+	  lt_prog_compiler_static_FC='-Bstatic'
+	  lt_prog_compiler_wl_FC='-Qoption ld '
+	  ;;
+	*Sun\ C*)
+	  # Sun C 5.9
+	  lt_prog_compiler_pic_FC='-KPIC'
+	  lt_prog_compiler_static_FC='-Bstatic'
+	  lt_prog_compiler_wl_FC='-Wl,'
+	  ;;
+        *Intel*\ [CF]*Compiler*)
+	  lt_prog_compiler_wl_FC='-Wl,'
+	  lt_prog_compiler_pic_FC='-fPIC'
+	  lt_prog_compiler_static_FC='-static'
+	  ;;
+	*Portland\ Group*)
+	  lt_prog_compiler_wl_FC='-Wl,'
+	  lt_prog_compiler_pic_FC='-fpic'
+	  lt_prog_compiler_static_FC='-Bstatic'
+	  ;;
+	esac
+	;;
+      esac
+      ;;
+
+    newsos6)
+      lt_prog_compiler_pic_FC='-KPIC'
+      lt_prog_compiler_static_FC='-Bstatic'
+      ;;
+
+    *nto* | *qnx*)
+      # QNX uses GNU C++, but need to define -shared option too, otherwise
+      # it will coredump.
+      lt_prog_compiler_pic_FC='-fPIC -shared'
+      ;;
+
+    osf3* | osf4* | osf5*)
+      lt_prog_compiler_wl_FC='-Wl,'
+      # All OSF/1 code is PIC.
+      lt_prog_compiler_static_FC='-non_shared'
+      ;;
+
+    rdos*)
+      lt_prog_compiler_static_FC='-non_shared'
+      ;;
+
+    solaris*)
+      lt_prog_compiler_pic_FC='-KPIC'
+      lt_prog_compiler_static_FC='-Bstatic'
+      case $cc_basename in
+      f77* | f90* | f95* | sunf77* | sunf90* | sunf95*)
+	lt_prog_compiler_wl_FC='-Qoption ld ';;
+      *)
+	lt_prog_compiler_wl_FC='-Wl,';;
+      esac
+      ;;
+
+    sunos4*)
+      lt_prog_compiler_wl_FC='-Qoption ld '
+      lt_prog_compiler_pic_FC='-PIC'
+      lt_prog_compiler_static_FC='-Bstatic'
+      ;;
+
+    sysv4 | sysv4.2uw2* | sysv4.3*)
+      lt_prog_compiler_wl_FC='-Wl,'
+      lt_prog_compiler_pic_FC='-KPIC'
+      lt_prog_compiler_static_FC='-Bstatic'
+      ;;
+
+    sysv4*MP*)
+      if test -d /usr/nec ;then
+	lt_prog_compiler_pic_FC='-Kconform_pic'
+	lt_prog_compiler_static_FC='-Bstatic'
+      fi
+      ;;
+
+    sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
+      lt_prog_compiler_wl_FC='-Wl,'
+      lt_prog_compiler_pic_FC='-KPIC'
+      lt_prog_compiler_static_FC='-Bstatic'
+      ;;
+
+    unicos*)
+      lt_prog_compiler_wl_FC='-Wl,'
+      lt_prog_compiler_can_build_shared_FC=no
+      ;;
+
+    uts4*)
+      lt_prog_compiler_pic_FC='-pic'
+      lt_prog_compiler_static_FC='-Bstatic'
+      ;;
+
+    *)
+      lt_prog_compiler_can_build_shared_FC=no
+      ;;
+    esac
+  fi
+
+case $host_os in
+  # For platforms which do not support PIC, -DPIC is meaningless:
+  *djgpp*)
+    lt_prog_compiler_pic_FC=
+    ;;
+  *)
+    lt_prog_compiler_pic_FC="$lt_prog_compiler_pic_FC"
+    ;;
+esac
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5
+$as_echo_n "checking for $compiler option to produce PIC... " >&6; }
+if ${lt_cv_prog_compiler_pic_FC+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_prog_compiler_pic_FC=$lt_prog_compiler_pic_FC
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_FC" >&5
+$as_echo "$lt_cv_prog_compiler_pic_FC" >&6; }
+lt_prog_compiler_pic_FC=$lt_cv_prog_compiler_pic_FC
+
+#
+# Check to make sure the PIC flag actually works.
+#
+if test -n "$lt_prog_compiler_pic_FC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic_FC works" >&5
+$as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic_FC works... " >&6; }
+if ${lt_cv_prog_compiler_pic_works_FC+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_prog_compiler_pic_works_FC=no
+   ac_outfile=conftest.$ac_objext
+   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+   lt_compiler_flag="$lt_prog_compiler_pic_FC"
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   # The option is referenced via a variable to avoid confusing sed.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
+   (eval "$lt_compile" 2>conftest.err)
+   ac_status=$?
+   cat conftest.err >&5
+   echo "$as_me:$LINENO: \$? = $ac_status" >&5
+   if (exit $ac_status) && test -s "$ac_outfile"; then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings other than the usual output.
+     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp
+     $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+     if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
+       lt_cv_prog_compiler_pic_works_FC=yes
+     fi
+   fi
+   $RM conftest*
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works_FC" >&5
+$as_echo "$lt_cv_prog_compiler_pic_works_FC" >&6; }
+
+if test x"$lt_cv_prog_compiler_pic_works_FC" = xyes; then
+    case $lt_prog_compiler_pic_FC in
+     "" | " "*) ;;
+     *) lt_prog_compiler_pic_FC=" $lt_prog_compiler_pic_FC" ;;
+     esac
+else
+    lt_prog_compiler_pic_FC=
+     lt_prog_compiler_can_build_shared_FC=no
+fi
+
+fi
+
+
+
+
+
+#
+# Check to make sure the static flag actually works.
+#
+wl=$lt_prog_compiler_wl_FC eval lt_tmp_static_flag=\"$lt_prog_compiler_static_FC\"
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5
+$as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; }
+if ${lt_cv_prog_compiler_static_works_FC+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_prog_compiler_static_works_FC=no
+   save_LDFLAGS="$LDFLAGS"
+   LDFLAGS="$LDFLAGS $lt_tmp_static_flag"
+   echo "$lt_simple_link_test_code" > conftest.$ac_ext
+   if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
+     # The linker can only warn and ignore the option if not recognized
+     # So say no if there are warnings
+     if test -s conftest.err; then
+       # Append any errors to the config.log.
+       cat conftest.err 1>&5
+       $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp
+       $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+       if diff conftest.exp conftest.er2 >/dev/null; then
+         lt_cv_prog_compiler_static_works_FC=yes
+       fi
+     else
+       lt_cv_prog_compiler_static_works_FC=yes
+     fi
+   fi
+   $RM -r conftest*
+   LDFLAGS="$save_LDFLAGS"
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works_FC" >&5
+$as_echo "$lt_cv_prog_compiler_static_works_FC" >&6; }
+
+if test x"$lt_cv_prog_compiler_static_works_FC" = xyes; then
+    :
+else
+    lt_prog_compiler_static_FC=
+fi
+
+
+
+
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5
+$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; }
+if ${lt_cv_prog_compiler_c_o_FC+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_prog_compiler_c_o_FC=no
+   $RM -r conftest 2>/dev/null
+   mkdir conftest
+   cd conftest
+   mkdir out
+   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+   lt_compiler_flag="-o out/conftest2.$ac_objext"
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
+   (eval "$lt_compile" 2>out/conftest.err)
+   ac_status=$?
+   cat out/conftest.err >&5
+   echo "$as_me:$LINENO: \$? = $ac_status" >&5
+   if (exit $ac_status) && test -s out/conftest2.$ac_objext
+   then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings
+     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp
+     $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
+     if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
+       lt_cv_prog_compiler_c_o_FC=yes
+     fi
+   fi
+   chmod u+w . 2>&5
+   $RM conftest*
+   # SGI C++ compiler will create directory out/ii_files/ for
+   # template instantiation
+   test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files
+   $RM out/* && rmdir out
+   cd ..
+   $RM -r conftest
+   $RM conftest*
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_FC" >&5
+$as_echo "$lt_cv_prog_compiler_c_o_FC" >&6; }
+
+
+
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5
+$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; }
+if ${lt_cv_prog_compiler_c_o_FC+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_prog_compiler_c_o_FC=no
+   $RM -r conftest 2>/dev/null
+   mkdir conftest
+   cd conftest
+   mkdir out
+   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+   lt_compiler_flag="-o out/conftest2.$ac_objext"
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
+   (eval "$lt_compile" 2>out/conftest.err)
+   ac_status=$?
+   cat out/conftest.err >&5
+   echo "$as_me:$LINENO: \$? = $ac_status" >&5
+   if (exit $ac_status) && test -s out/conftest2.$ac_objext
+   then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings
+     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp
+     $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
+     if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
+       lt_cv_prog_compiler_c_o_FC=yes
+     fi
+   fi
+   chmod u+w . 2>&5
+   $RM conftest*
+   # SGI C++ compiler will create directory out/ii_files/ for
+   # template instantiation
+   test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files
+   $RM out/* && rmdir out
+   cd ..
+   $RM -r conftest
+   $RM conftest*
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_FC" >&5
+$as_echo "$lt_cv_prog_compiler_c_o_FC" >&6; }
+
+
+
+
+hard_links="nottested"
+if test "$lt_cv_prog_compiler_c_o_FC" = no && test "$need_locks" != no; then
+  # do not overwrite the value of need_locks provided by the user
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5
+$as_echo_n "checking if we can lock with hard links... " >&6; }
+  hard_links=yes
+  $RM conftest*
+  ln conftest.a conftest.b 2>/dev/null && hard_links=no
+  touch conftest.a
+  ln conftest.a conftest.b 2>&5 || hard_links=no
+  ln conftest.a conftest.b 2>/dev/null && hard_links=no
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5
+$as_echo "$hard_links" >&6; }
+  if test "$hard_links" = no; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5
+$as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;}
+    need_locks=warn
+  fi
+else
+  need_locks=no
+fi
+
+
+
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5
+$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; }
+
+  runpath_var=
+  allow_undefined_flag_FC=
+  always_export_symbols_FC=no
+  archive_cmds_FC=
+  archive_expsym_cmds_FC=
+  compiler_needs_object_FC=no
+  enable_shared_with_static_runtimes_FC=no
+  export_dynamic_flag_spec_FC=
+  export_symbols_cmds_FC='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+  hardcode_automatic_FC=no
+  hardcode_direct_FC=no
+  hardcode_direct_absolute_FC=no
+  hardcode_libdir_flag_spec_FC=
+  hardcode_libdir_separator_FC=
+  hardcode_minus_L_FC=no
+  hardcode_shlibpath_var_FC=unsupported
+  inherit_rpath_FC=no
+  link_all_deplibs_FC=unknown
+  module_cmds_FC=
+  module_expsym_cmds_FC=
+  old_archive_from_new_cmds_FC=
+  old_archive_from_expsyms_cmds_FC=
+  thread_safe_flag_spec_FC=
+  whole_archive_flag_spec_FC=
+  # include_expsyms should be a list of space-separated symbols to be *always*
+  # included in the symbol list
+  include_expsyms_FC=
+  # exclude_expsyms can be an extended regexp of symbols to exclude
+  # it will be wrapped by ` (' and `)$', so one must not match beginning or
+  # end of line.  Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc',
+  # as well as any symbol that contains `d'.
+  exclude_expsyms_FC='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'
+  # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out
+  # platforms (ab)use it in PIC code, but their linkers get confused if
+  # the symbol is explicitly referenced.  Since portable code cannot
+  # rely on this symbol name, it's probably fine to never include it in
+  # preloaded symbol tables.
+  # Exclude shared library initialization/finalization symbols.
+  extract_expsyms_cmds=
+
+  case $host_os in
+  cygwin* | mingw* | pw32* | cegcc*)
+    # FIXME: the MSVC++ port hasn't been tested in a loooong time
+    # When not using gcc, we currently assume that we are using
+    # Microsoft Visual C++.
+    if test "$GCC" != yes; then
+      with_gnu_ld=no
+    fi
+    ;;
+  interix*)
+    # we just hope/assume this is gcc and not c89 (= MSVC++)
+    with_gnu_ld=yes
+    ;;
+  openbsd*)
+    with_gnu_ld=no
+    ;;
+  esac
+
+  ld_shlibs_FC=yes
+
+  # On some targets, GNU ld is compatible enough with the native linker
+  # that we're better off using the native interface for both.
+  lt_use_gnu_ld_interface=no
+  if test "$with_gnu_ld" = yes; then
+    case $host_os in
+      aix*)
+	# The AIX port of GNU ld has always aspired to compatibility
+	# with the native linker.  However, as the warning in the GNU ld
+	# block says, versions before 2.19.5* couldn't really create working
+	# shared libraries, regardless of the interface used.
+	case `$LD -v 2>&1` in
+	  *\ \(GNU\ Binutils\)\ 2.19.5*) ;;
+	  *\ \(GNU\ Binutils\)\ 2.[2-9]*) ;;
+	  *\ \(GNU\ Binutils\)\ [3-9]*) ;;
+	  *)
+	    lt_use_gnu_ld_interface=yes
+	    ;;
+	esac
+	;;
+      *)
+	lt_use_gnu_ld_interface=yes
+	;;
+    esac
+  fi
+
+  if test "$lt_use_gnu_ld_interface" = yes; then
+    # If archive_cmds runs LD, not CC, wlarc should be empty
+    wlarc='${wl}'
+
+    # Set some defaults for GNU ld with shared library support. These
+    # are reset later if shared libraries are not supported. Putting them
+    # here allows them to be overridden if necessary.
+    runpath_var=LD_RUN_PATH
+    hardcode_libdir_flag_spec_FC='${wl}-rpath ${wl}$libdir'
+    export_dynamic_flag_spec_FC='${wl}--export-dynamic'
+    # ancient GNU ld didn't support --whole-archive et. al.
+    if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then
+      whole_archive_flag_spec_FC="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
+    else
+      whole_archive_flag_spec_FC=
+    fi
+    supports_anon_versioning=no
+    case `$LD -v 2>&1` in
+      *GNU\ gold*) supports_anon_versioning=yes ;;
+      *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11
+      *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ...
+      *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ...
+      *\ 2.11.*) ;; # other 2.11 versions
+      *) supports_anon_versioning=yes ;;
+    esac
+
+    # See if GNU ld supports shared libraries.
+    case $host_os in
+    aix[3-9]*)
+      # On AIX/PPC, the GNU linker is very broken
+      if test "$host_cpu" != ia64; then
+	ld_shlibs_FC=no
+	cat <<_LT_EOF 1>&2
+
+*** Warning: the GNU linker, at least up to release 2.19, is reported
+*** to be unable to reliably create shared libraries on AIX.
+*** Therefore, libtool is disabling shared libraries support.  If you
+*** really care for shared libraries, you may want to install binutils
+*** 2.20 or above, or modify your PATH so that a non-GNU linker is found.
+*** You will then need to restart the configuration process.
+
+_LT_EOF
+      fi
+      ;;
+
+    amigaos*)
+      case $host_cpu in
+      powerpc)
+            # see comment about AmigaOS4 .so support
+            archive_cmds_FC='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+            archive_expsym_cmds_FC=''
+        ;;
+      m68k)
+            archive_cmds_FC='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
+            hardcode_libdir_flag_spec_FC='-L$libdir'
+            hardcode_minus_L_FC=yes
+        ;;
+      esac
+      ;;
+
+    beos*)
+      if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+	allow_undefined_flag_FC=unsupported
+	# Joseph Beckenbach <jrb3 at best.com> says some releases of gcc
+	# support --undefined.  This deserves some investigation.  FIXME
+	archive_cmds_FC='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+      else
+	ld_shlibs_FC=no
+      fi
+      ;;
+
+    cygwin* | mingw* | pw32* | cegcc*)
+      # _LT_TAGVAR(hardcode_libdir_flag_spec, FC) is actually meaningless,
+      # as there is no search path for DLLs.
+      hardcode_libdir_flag_spec_FC='-L$libdir'
+      export_dynamic_flag_spec_FC='${wl}--export-all-symbols'
+      allow_undefined_flag_FC=unsupported
+      always_export_symbols_FC=no
+      enable_shared_with_static_runtimes_FC=yes
+      export_symbols_cmds_FC='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols'
+      exclude_expsyms_FC='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'
+
+      if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then
+        archive_cmds_FC='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+	# If the export-symbols file already is a .def file (1st line
+	# is EXPORTS), use it as is; otherwise, prepend...
+	archive_expsym_cmds_FC='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
+	  cp $export_symbols $output_objdir/$soname.def;
+	else
+	  echo EXPORTS > $output_objdir/$soname.def;
+	  cat $export_symbols >> $output_objdir/$soname.def;
+	fi~
+	$CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+      else
+	ld_shlibs_FC=no
+      fi
+      ;;
+
+    haiku*)
+      archive_cmds_FC='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+      link_all_deplibs_FC=yes
+      ;;
+
+    interix[3-9]*)
+      hardcode_direct_FC=no
+      hardcode_shlibpath_var_FC=no
+      hardcode_libdir_flag_spec_FC='${wl}-rpath,$libdir'
+      export_dynamic_flag_spec_FC='${wl}-E'
+      # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
+      # Instead, shared libraries are loaded at an image base (0x10000000 by
+      # default) and relocated if they conflict, which is a slow very memory
+      # consuming and fragmenting process.  To avoid this, we pick a random,
+      # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
+      # time.  Moving up from 0x10000000 also allows more sbrk(2) space.
+      archive_cmds_FC='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+      archive_expsym_cmds_FC='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+      ;;
+
+    gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu)
+      tmp_diet=no
+      if test "$host_os" = linux-dietlibc; then
+	case $cc_basename in
+	  diet\ *) tmp_diet=yes;;	# linux-dietlibc with static linking (!diet-dyn)
+	esac
+      fi
+      if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \
+	 && test "$tmp_diet" = no
+      then
+	tmp_addflag=' $pic_flag'
+	tmp_sharedflag='-shared'
+	case $cc_basename,$host_cpu in
+        pgcc*)				# Portland Group C compiler
+	  whole_archive_flag_spec_FC='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+	  tmp_addflag=' $pic_flag'
+	  ;;
+	pgf77* | pgf90* | pgf95* | pgfortran*)
+					# Portland Group f77 and f90 compilers
+	  whole_archive_flag_spec_FC='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+	  tmp_addflag=' $pic_flag -Mnomain' ;;
+	ecc*,ia64* | icc*,ia64*)	# Intel C compiler on ia64
+	  tmp_addflag=' -i_dynamic' ;;
+	efc*,ia64* | ifort*,ia64*)	# Intel Fortran compiler on ia64
+	  tmp_addflag=' -i_dynamic -nofor_main' ;;
+	ifc* | ifort*)			# Intel Fortran compiler
+	  tmp_addflag=' -nofor_main' ;;
+	lf95*)				# Lahey Fortran 8.1
+	  whole_archive_flag_spec_FC=
+	  tmp_sharedflag='--shared' ;;
+	xl[cC]* | bgxl[cC]* | mpixl[cC]*) # IBM XL C 8.0 on PPC (deal with xlf below)
+	  tmp_sharedflag='-qmkshrobj'
+	  tmp_addflag= ;;
+	nvcc*)	# Cuda Compiler Driver 2.2
+	  whole_archive_flag_spec_FC='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+	  compiler_needs_object_FC=yes
+	  ;;
+	esac
+	case `$CC -V 2>&1 | sed 5q` in
+	*Sun\ C*)			# Sun C 5.9
+	  whole_archive_flag_spec_FC='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+	  compiler_needs_object_FC=yes
+	  tmp_sharedflag='-G' ;;
+	*Sun\ F*)			# Sun Fortran 8.3
+	  tmp_sharedflag='-G' ;;
+	esac
+	archive_cmds_FC='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+
+        if test "x$supports_anon_versioning" = xyes; then
+          archive_expsym_cmds_FC='echo "{ global:" > $output_objdir/$libname.ver~
+	    cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+	    echo "local: *; };" >> $output_objdir/$libname.ver~
+	    $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'
+        fi
+
+	case $cc_basename in
+	xlf* | bgf* | bgxlf* | mpixlf*)
+	  # IBM XL Fortran 10.1 on PPC cannot create shared libs itself
+	  whole_archive_flag_spec_FC='--whole-archive$convenience --no-whole-archive'
+	  hardcode_libdir_flag_spec_FC='${wl}-rpath ${wl}$libdir'
+	  archive_cmds_FC='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib'
+	  if test "x$supports_anon_versioning" = xyes; then
+	    archive_expsym_cmds_FC='echo "{ global:" > $output_objdir/$libname.ver~
+	      cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+	      echo "local: *; };" >> $output_objdir/$libname.ver~
+	      $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib'
+	  fi
+	  ;;
+	esac
+      else
+        ld_shlibs_FC=no
+      fi
+      ;;
+
+    netbsd*)
+      if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+	archive_cmds_FC='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib'
+	wlarc=
+      else
+	archive_cmds_FC='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	archive_expsym_cmds_FC='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+      fi
+      ;;
+
+    solaris*)
+      if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then
+	ld_shlibs_FC=no
+	cat <<_LT_EOF 1>&2
+
+*** Warning: The releases 2.8.* of the GNU linker cannot reliably
+*** create shared libraries on Solaris systems.  Therefore, libtool
+*** is disabling shared libraries support.  We urge you to upgrade GNU
+*** binutils to release 2.9.1 or newer.  Another option is to modify
+*** your PATH or compiler configuration so that the native linker is
+*** used, and then restart.
+
+_LT_EOF
+      elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+	archive_cmds_FC='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	archive_expsym_cmds_FC='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+      else
+	ld_shlibs_FC=no
+      fi
+      ;;
+
+    sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*)
+      case `$LD -v 2>&1` in
+        *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*)
+	ld_shlibs_FC=no
+	cat <<_LT_EOF 1>&2
+
+*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not
+*** reliably create shared libraries on SCO systems.  Therefore, libtool
+*** is disabling shared libraries support.  We urge you to upgrade GNU
+*** binutils to release 2.16.91.0.3 or newer.  Another option is to modify
+*** your PATH or compiler configuration so that the native linker is
+*** used, and then restart.
+
+_LT_EOF
+	;;
+	*)
+	  # For security reasons, it is highly recommended that you always
+	  # use absolute paths for naming shared libraries, and exclude the
+	  # DT_RUNPATH tag from executables and libraries.  But doing so
+	  # requires that you compile everything twice, which is a pain.
+	  if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+	    hardcode_libdir_flag_spec_FC='${wl}-rpath ${wl}$libdir'
+	    archive_cmds_FC='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	    archive_expsym_cmds_FC='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+	  else
+	    ld_shlibs_FC=no
+	  fi
+	;;
+      esac
+      ;;
+
+    sunos4*)
+      archive_cmds_FC='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+      wlarc=
+      hardcode_direct_FC=yes
+      hardcode_shlibpath_var_FC=no
+      ;;
+
+    *)
+      if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+	archive_cmds_FC='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	archive_expsym_cmds_FC='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+      else
+	ld_shlibs_FC=no
+      fi
+      ;;
+    esac
+
+    if test "$ld_shlibs_FC" = no; then
+      runpath_var=
+      hardcode_libdir_flag_spec_FC=
+      export_dynamic_flag_spec_FC=
+      whole_archive_flag_spec_FC=
+    fi
+  else
+    # PORTME fill in a description of your system's linker (not GNU ld)
+    case $host_os in
+    aix3*)
+      allow_undefined_flag_FC=unsupported
+      always_export_symbols_FC=yes
+      archive_expsym_cmds_FC='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname'
+      # Note: this linker hardcodes the directories in LIBPATH if there
+      # are no directories specified by -L.
+      hardcode_minus_L_FC=yes
+      if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then
+	# Neither direct hardcoding nor static linking is supported with a
+	# broken collect2.
+	hardcode_direct_FC=unsupported
+      fi
+      ;;
+
+    aix[4-9]*)
+      if test "$host_cpu" = ia64; then
+	# On IA64, the linker does run time linking by default, so we don't
+	# have to do anything special.
+	aix_use_runtimelinking=no
+	exp_sym_flag='-Bexport'
+	no_entry_flag=""
+      else
+	# If we're using GNU nm, then we don't want the "-C" option.
+	# -C means demangle to AIX nm, but means don't demangle with GNU nm
+	# Also, AIX nm treats weak defined symbols like other global
+	# defined symbols, whereas GNU nm marks them as "W".
+	if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then
+	  export_symbols_cmds_FC='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
+	else
+	  export_symbols_cmds_FC='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
+	fi
+	aix_use_runtimelinking=no
+
+	# Test if we are trying to use run time linking or normal
+	# AIX style linking. If -brtl is somewhere in LDFLAGS, we
+	# need to do runtime linking.
+	case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*)
+	  for ld_flag in $LDFLAGS; do
+	  if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then
+	    aix_use_runtimelinking=yes
+	    break
+	  fi
+	  done
+	  ;;
+	esac
+
+	exp_sym_flag='-bexport'
+	no_entry_flag='-bnoentry'
+      fi
+
+      # When large executables or shared objects are built, AIX ld can
+      # have problems creating the table of contents.  If linking a library
+      # or program results in "error TOC overflow" add -mminimal-toc to
+      # CXXFLAGS/CFLAGS for g++/gcc.  In the cases where that is not
+      # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
+
+      archive_cmds_FC=''
+      hardcode_direct_FC=yes
+      hardcode_direct_absolute_FC=yes
+      hardcode_libdir_separator_FC=':'
+      link_all_deplibs_FC=yes
+      file_list_spec_FC='${wl}-f,'
+
+      if test "$GCC" = yes; then
+	case $host_os in aix4.[012]|aix4.[012].*)
+	# We only want to do this on AIX 4.2 and lower, the check
+	# below for broken collect2 doesn't work under 4.3+
+	  collect2name=`${CC} -print-prog-name=collect2`
+	  if test -f "$collect2name" &&
+	   strings "$collect2name" | $GREP resolve_lib_name >/dev/null
+	  then
+	  # We have reworked collect2
+	  :
+	  else
+	  # We have old collect2
+	  hardcode_direct_FC=unsupported
+	  # It fails to find uninstalled libraries when the uninstalled
+	  # path is not listed in the libpath.  Setting hardcode_minus_L
+	  # to unsupported forces relinking
+	  hardcode_minus_L_FC=yes
+	  hardcode_libdir_flag_spec_FC='-L$libdir'
+	  hardcode_libdir_separator_FC=
+	  fi
+	  ;;
+	esac
+	shared_flag='-shared'
+	if test "$aix_use_runtimelinking" = yes; then
+	  shared_flag="$shared_flag "'${wl}-G'
+	fi
+      else
+	# not using gcc
+	if test "$host_cpu" = ia64; then
+	# VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
+	# chokes on -Wl,-G. The following line is correct:
+	  shared_flag='-G'
+	else
+	  if test "$aix_use_runtimelinking" = yes; then
+	    shared_flag='${wl}-G'
+	  else
+	    shared_flag='${wl}-bM:SRE'
+	  fi
+	fi
+      fi
+
+      export_dynamic_flag_spec_FC='${wl}-bexpall'
+      # It seems that -bexpall does not export symbols beginning with
+      # underscore (_), so it is better to generate a list of symbols to export.
+      always_export_symbols_FC=yes
+      if test "$aix_use_runtimelinking" = yes; then
+	# Warning - without using the other runtime loading flags (-brtl),
+	# -berok will link without error, but may produce a broken library.
+	allow_undefined_flag_FC='-berok'
+        # Determine the default libpath from the value encoded in an
+        # empty executable.
+        if test "${lt_cv_aix_libpath+set}" = set; then
+  aix_libpath=$lt_cv_aix_libpath
+else
+  if ${lt_cv_aix_libpath__FC+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat > conftest.$ac_ext <<_ACEOF
+      program main
+
+      end
+_ACEOF
+if ac_fn_fc_try_link "$LINENO"; then :
+
+  lt_aix_libpath_sed='
+      /Import File Strings/,/^$/ {
+	  /^0/ {
+	      s/^0  *\([^ ]*\) *$/\1/
+	      p
+	  }
+      }'
+  lt_cv_aix_libpath__FC=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+  # Check for a 64-bit object if we didn't find anything.
+  if test -z "$lt_cv_aix_libpath__FC"; then
+    lt_cv_aix_libpath__FC=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+  fi
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+  if test -z "$lt_cv_aix_libpath__FC"; then
+    lt_cv_aix_libpath__FC="/usr/lib:/lib"
+  fi
+
+fi
+
+  aix_libpath=$lt_cv_aix_libpath__FC
+fi
+
+        hardcode_libdir_flag_spec_FC='${wl}-blibpath:$libdir:'"$aix_libpath"
+        archive_expsym_cmds_FC='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
+      else
+	if test "$host_cpu" = ia64; then
+	  hardcode_libdir_flag_spec_FC='${wl}-R $libdir:/usr/lib:/lib'
+	  allow_undefined_flag_FC="-z nodefs"
+	  archive_expsym_cmds_FC="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols"
+	else
+	 # Determine the default libpath from the value encoded in an
+	 # empty executable.
+	 if test "${lt_cv_aix_libpath+set}" = set; then
+  aix_libpath=$lt_cv_aix_libpath
+else
+  if ${lt_cv_aix_libpath__FC+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat > conftest.$ac_ext <<_ACEOF
+      program main
+
+      end
+_ACEOF
+if ac_fn_fc_try_link "$LINENO"; then :
+
+  lt_aix_libpath_sed='
+      /Import File Strings/,/^$/ {
+	  /^0/ {
+	      s/^0  *\([^ ]*\) *$/\1/
+	      p
+	  }
+      }'
+  lt_cv_aix_libpath__FC=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+  # Check for a 64-bit object if we didn't find anything.
+  if test -z "$lt_cv_aix_libpath__FC"; then
+    lt_cv_aix_libpath__FC=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+  fi
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+  if test -z "$lt_cv_aix_libpath__FC"; then
+    lt_cv_aix_libpath__FC="/usr/lib:/lib"
+  fi
+
+fi
+
+  aix_libpath=$lt_cv_aix_libpath__FC
+fi
+
+	 hardcode_libdir_flag_spec_FC='${wl}-blibpath:$libdir:'"$aix_libpath"
+	  # Warning - without using the other run time loading flags,
+	  # -berok will link without error, but may produce a broken library.
+	  no_undefined_flag_FC=' ${wl}-bernotok'
+	  allow_undefined_flag_FC=' ${wl}-berok'
+	  if test "$with_gnu_ld" = yes; then
+	    # We only use this code for GNU lds that support --whole-archive.
+	    whole_archive_flag_spec_FC='${wl}--whole-archive$convenience ${wl}--no-whole-archive'
+	  else
+	    # Exported symbols can be pulled into shared objects from archives
+	    whole_archive_flag_spec_FC='$convenience'
+	  fi
+	  archive_cmds_need_lc_FC=yes
+	  # This is similar to how AIX traditionally builds its shared libraries.
+	  archive_expsym_cmds_FC="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'
+	fi
+      fi
+      ;;
+
+    amigaos*)
+      case $host_cpu in
+      powerpc)
+            # see comment about AmigaOS4 .so support
+            archive_cmds_FC='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+            archive_expsym_cmds_FC=''
+        ;;
+      m68k)
+            archive_cmds_FC='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
+            hardcode_libdir_flag_spec_FC='-L$libdir'
+            hardcode_minus_L_FC=yes
+        ;;
+      esac
+      ;;
+
+    bsdi[45]*)
+      export_dynamic_flag_spec_FC=-rdynamic
+      ;;
+
+    cygwin* | mingw* | pw32* | cegcc*)
+      # When not using gcc, we currently assume that we are using
+      # Microsoft Visual C++.
+      # hardcode_libdir_flag_spec is actually meaningless, as there is
+      # no search path for DLLs.
+      case $cc_basename in
+      cl*)
+	# Native MSVC
+	hardcode_libdir_flag_spec_FC=' '
+	allow_undefined_flag_FC=unsupported
+	always_export_symbols_FC=yes
+	file_list_spec_FC='@'
+	# Tell ltmain to make .lib files, not .a files.
+	libext=lib
+	# Tell ltmain to make .dll files, not .so files.
+	shrext_cmds=".dll"
+	# FIXME: Setting linknames here is a bad hack.
+	archive_cmds_FC='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames='
+	archive_expsym_cmds_FC='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
+	    sed -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp;
+	  else
+	    sed -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp;
+	  fi~
+	  $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~
+	  linknames='
+	# The linker will not automatically build a static lib if we build a DLL.
+	# _LT_TAGVAR(old_archive_from_new_cmds, FC)='true'
+	enable_shared_with_static_runtimes_FC=yes
+	exclude_expsyms_FC='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*'
+	export_symbols_cmds_FC='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1,DATA/'\'' | $SED -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols'
+	# Don't use ranlib
+	old_postinstall_cmds_FC='chmod 644 $oldlib'
+	postlink_cmds_FC='lt_outputfile="@OUTPUT@"~
+	  lt_tool_outputfile="@TOOL_OUTPUT@"~
+	  case $lt_outputfile in
+	    *.exe|*.EXE) ;;
+	    *)
+	      lt_outputfile="$lt_outputfile.exe"
+	      lt_tool_outputfile="$lt_tool_outputfile.exe"
+	      ;;
+	  esac~
+	  if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then
+	    $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1;
+	    $RM "$lt_outputfile.manifest";
+	  fi'
+	;;
+      *)
+	# Assume MSVC wrapper
+	hardcode_libdir_flag_spec_FC=' '
+	allow_undefined_flag_FC=unsupported
+	# Tell ltmain to make .lib files, not .a files.
+	libext=lib
+	# Tell ltmain to make .dll files, not .so files.
+	shrext_cmds=".dll"
+	# FIXME: Setting linknames here is a bad hack.
+	archive_cmds_FC='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames='
+	# The linker will automatically build a .lib file if we build a DLL.
+	old_archive_from_new_cmds_FC='true'
+	# FIXME: Should let the user specify the lib program.
+	old_archive_cmds_FC='lib -OUT:$oldlib$oldobjs$old_deplibs'
+	enable_shared_with_static_runtimes_FC=yes
+	;;
+      esac
+      ;;
+
+    darwin* | rhapsody*)
+
+
+  archive_cmds_need_lc_FC=no
+  hardcode_direct_FC=no
+  hardcode_automatic_FC=yes
+  hardcode_shlibpath_var_FC=unsupported
+  if test "$lt_cv_ld_force_load" = "yes"; then
+    whole_archive_flag_spec_FC='`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`'
+    compiler_needs_object_FC=yes
+  else
+    whole_archive_flag_spec_FC=''
+  fi
+  link_all_deplibs_FC=yes
+  allow_undefined_flag_FC="$_lt_dar_allow_undefined"
+  case $cc_basename in
+     ifort*) _lt_dar_can_shared=yes ;;
+     *) _lt_dar_can_shared=$GCC ;;
+  esac
+  if test "$_lt_dar_can_shared" = "yes"; then
+    output_verbose_link_cmd=func_echo_all
+    archive_cmds_FC="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}"
+    module_cmds_FC="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}"
+    archive_expsym_cmds_FC="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}"
+    module_expsym_cmds_FC="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}"
+
+  else
+  ld_shlibs_FC=no
+  fi
+
+      ;;
+
+    dgux*)
+      archive_cmds_FC='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      hardcode_libdir_flag_spec_FC='-L$libdir'
+      hardcode_shlibpath_var_FC=no
+      ;;
+
+    # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor
+    # support.  Future versions do this automatically, but an explicit c++rt0.o
+    # does not break anything, and helps significantly (at the cost of a little
+    # extra space).
+    freebsd2.2*)
+      archive_cmds_FC='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o'
+      hardcode_libdir_flag_spec_FC='-R$libdir'
+      hardcode_direct_FC=yes
+      hardcode_shlibpath_var_FC=no
+      ;;
+
+    # Unfortunately, older versions of FreeBSD 2 do not have this feature.
+    freebsd2.*)
+      archive_cmds_FC='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+      hardcode_direct_FC=yes
+      hardcode_minus_L_FC=yes
+      hardcode_shlibpath_var_FC=no
+      ;;
+
+    # FreeBSD 3 and greater uses gcc -shared to do shared libraries.
+    freebsd* | dragonfly*)
+      archive_cmds_FC='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+      hardcode_libdir_flag_spec_FC='-R$libdir'
+      hardcode_direct_FC=yes
+      hardcode_shlibpath_var_FC=no
+      ;;
+
+    hpux9*)
+      if test "$GCC" = yes; then
+	archive_cmds_FC='$RM $output_objdir/$soname~$CC -shared $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+      else
+	archive_cmds_FC='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+      fi
+      hardcode_libdir_flag_spec_FC='${wl}+b ${wl}$libdir'
+      hardcode_libdir_separator_FC=:
+      hardcode_direct_FC=yes
+
+      # hardcode_minus_L: Not really in the search PATH,
+      # but as the default location of the library.
+      hardcode_minus_L_FC=yes
+      export_dynamic_flag_spec_FC='${wl}-E'
+      ;;
+
+    hpux10*)
+      if test "$GCC" = yes && test "$with_gnu_ld" = no; then
+	archive_cmds_FC='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	archive_cmds_FC='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'
+      fi
+      if test "$with_gnu_ld" = no; then
+	hardcode_libdir_flag_spec_FC='${wl}+b ${wl}$libdir'
+	hardcode_libdir_separator_FC=:
+	hardcode_direct_FC=yes
+	hardcode_direct_absolute_FC=yes
+	export_dynamic_flag_spec_FC='${wl}-E'
+	# hardcode_minus_L: Not really in the search PATH,
+	# but as the default location of the library.
+	hardcode_minus_L_FC=yes
+      fi
+      ;;
+
+    hpux11*)
+      if test "$GCC" = yes && test "$with_gnu_ld" = no; then
+	case $host_cpu in
+	hppa*64*)
+	  archive_cmds_FC='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	ia64*)
+	  archive_cmds_FC='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	*)
+	  archive_cmds_FC='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	esac
+      else
+	case $host_cpu in
+	hppa*64*)
+	  archive_cmds_FC='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	ia64*)
+	  archive_cmds_FC='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	*)
+	archive_cmds_FC='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	esac
+      fi
+      if test "$with_gnu_ld" = no; then
+	hardcode_libdir_flag_spec_FC='${wl}+b ${wl}$libdir'
+	hardcode_libdir_separator_FC=:
+
+	case $host_cpu in
+	hppa*64*|ia64*)
+	  hardcode_direct_FC=no
+	  hardcode_shlibpath_var_FC=no
+	  ;;
+	*)
+	  hardcode_direct_FC=yes
+	  hardcode_direct_absolute_FC=yes
+	  export_dynamic_flag_spec_FC='${wl}-E'
+
+	  # hardcode_minus_L: Not really in the search PATH,
+	  # but as the default location of the library.
+	  hardcode_minus_L_FC=yes
+	  ;;
+	esac
+      fi
+      ;;
+
+    irix5* | irix6* | nonstopux*)
+      if test "$GCC" = yes; then
+	archive_cmds_FC='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+	# Try to use the -exported_symbol ld option, if it does not
+	# work, assume that -exports_file does not work either and
+	# implicitly export all symbols.
+	# This should be the same for all languages, so no per-tag cache variable.
+	{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $host_os linker accepts -exported_symbol" >&5
+$as_echo_n "checking whether the $host_os linker accepts -exported_symbol... " >&6; }
+if ${lt_cv_irix_exported_symbol+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  save_LDFLAGS="$LDFLAGS"
+	   LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null"
+	   cat > conftest.$ac_ext <<_ACEOF
+
+      subroutine foo
+      end
+_ACEOF
+if ac_fn_fc_try_link "$LINENO"; then :
+  lt_cv_irix_exported_symbol=yes
+else
+  lt_cv_irix_exported_symbol=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+           LDFLAGS="$save_LDFLAGS"
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_irix_exported_symbol" >&5
+$as_echo "$lt_cv_irix_exported_symbol" >&6; }
+	if test "$lt_cv_irix_exported_symbol" = yes; then
+          archive_expsym_cmds_FC='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib'
+	fi
+      else
+	archive_cmds_FC='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
+	archive_expsym_cmds_FC='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib'
+      fi
+      archive_cmds_need_lc_FC='no'
+      hardcode_libdir_flag_spec_FC='${wl}-rpath ${wl}$libdir'
+      hardcode_libdir_separator_FC=:
+      inherit_rpath_FC=yes
+      link_all_deplibs_FC=yes
+      ;;
+
+    netbsd*)
+      if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+	archive_cmds_FC='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'  # a.out
+      else
+	archive_cmds_FC='$LD -shared -o $lib $libobjs $deplibs $linker_flags'      # ELF
+      fi
+      hardcode_libdir_flag_spec_FC='-R$libdir'
+      hardcode_direct_FC=yes
+      hardcode_shlibpath_var_FC=no
+      ;;
+
+    newsos6)
+      archive_cmds_FC='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      hardcode_direct_FC=yes
+      hardcode_libdir_flag_spec_FC='${wl}-rpath ${wl}$libdir'
+      hardcode_libdir_separator_FC=:
+      hardcode_shlibpath_var_FC=no
+      ;;
+
+    *nto* | *qnx*)
+      ;;
+
+    openbsd*)
+      if test -f /usr/libexec/ld.so; then
+	hardcode_direct_FC=yes
+	hardcode_shlibpath_var_FC=no
+	hardcode_direct_absolute_FC=yes
+	if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+	  archive_cmds_FC='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+	  archive_expsym_cmds_FC='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols'
+	  hardcode_libdir_flag_spec_FC='${wl}-rpath,$libdir'
+	  export_dynamic_flag_spec_FC='${wl}-E'
+	else
+	  case $host_os in
+	   openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*)
+	     archive_cmds_FC='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+	     hardcode_libdir_flag_spec_FC='-R$libdir'
+	     ;;
+	   *)
+	     archive_cmds_FC='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+	     hardcode_libdir_flag_spec_FC='${wl}-rpath,$libdir'
+	     ;;
+	  esac
+	fi
+      else
+	ld_shlibs_FC=no
+      fi
+      ;;
+
+    os2*)
+      hardcode_libdir_flag_spec_FC='-L$libdir'
+      hardcode_minus_L_FC=yes
+      allow_undefined_flag_FC=unsupported
+      archive_cmds_FC='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~echo DATA >> $output_objdir/$libname.def~echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def'
+      old_archive_from_new_cmds_FC='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def'
+      ;;
+
+    osf3*)
+      if test "$GCC" = yes; then
+	allow_undefined_flag_FC=' ${wl}-expect_unresolved ${wl}\*'
+	archive_cmds_FC='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+      else
+	allow_undefined_flag_FC=' -expect_unresolved \*'
+	archive_cmds_FC='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
+      fi
+      archive_cmds_need_lc_FC='no'
+      hardcode_libdir_flag_spec_FC='${wl}-rpath ${wl}$libdir'
+      hardcode_libdir_separator_FC=:
+      ;;
+
+    osf4* | osf5*)	# as osf3* with the addition of -msym flag
+      if test "$GCC" = yes; then
+	allow_undefined_flag_FC=' ${wl}-expect_unresolved ${wl}\*'
+	archive_cmds_FC='$CC -shared${allow_undefined_flag} $pic_flag $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+	hardcode_libdir_flag_spec_FC='${wl}-rpath ${wl}$libdir'
+      else
+	allow_undefined_flag_FC=' -expect_unresolved \*'
+	archive_cmds_FC='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
+	archive_expsym_cmds_FC='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~
+	$CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp'
+
+	# Both c and cxx compiler support -rpath directly
+	hardcode_libdir_flag_spec_FC='-rpath $libdir'
+      fi
+      archive_cmds_need_lc_FC='no'
+      hardcode_libdir_separator_FC=:
+      ;;
+
+    solaris*)
+      no_undefined_flag_FC=' -z defs'
+      if test "$GCC" = yes; then
+	wlarc='${wl}'
+	archive_cmds_FC='$CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+	archive_expsym_cmds_FC='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+	  $CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
+      else
+	case `$CC -V 2>&1` in
+	*"Compilers 5.0"*)
+	  wlarc=''
+	  archive_cmds_FC='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	  archive_expsym_cmds_FC='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+	  $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp'
+	  ;;
+	*)
+	  wlarc='${wl}'
+	  archive_cmds_FC='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags'
+	  archive_expsym_cmds_FC='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+	  $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
+	  ;;
+	esac
+      fi
+      hardcode_libdir_flag_spec_FC='-R$libdir'
+      hardcode_shlibpath_var_FC=no
+      case $host_os in
+      solaris2.[0-5] | solaris2.[0-5].*) ;;
+      *)
+	# The compiler driver will combine and reorder linker options,
+	# but understands `-z linker_flag'.  GCC discards it without `$wl',
+	# but is careful enough not to reorder.
+	# Supported since Solaris 2.6 (maybe 2.5.1?)
+	if test "$GCC" = yes; then
+	  whole_archive_flag_spec_FC='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract'
+	else
+	  whole_archive_flag_spec_FC='-z allextract$convenience -z defaultextract'
+	fi
+	;;
+      esac
+      link_all_deplibs_FC=yes
+      ;;
+
+    sunos4*)
+      if test "x$host_vendor" = xsequent; then
+	# Use $CC to link under sequent, because it throws in some extra .o
+	# files that make .init and .fini sections work.
+	archive_cmds_FC='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	archive_cmds_FC='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags'
+      fi
+      hardcode_libdir_flag_spec_FC='-L$libdir'
+      hardcode_direct_FC=yes
+      hardcode_minus_L_FC=yes
+      hardcode_shlibpath_var_FC=no
+      ;;
+
+    sysv4)
+      case $host_vendor in
+	sni)
+	  archive_cmds_FC='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	  hardcode_direct_FC=yes # is this really true???
+	;;
+	siemens)
+	  ## LD is ld it makes a PLAMLIB
+	  ## CC just makes a GrossModule.
+	  archive_cmds_FC='$LD -G -o $lib $libobjs $deplibs $linker_flags'
+	  reload_cmds_FC='$CC -r -o $output$reload_objs'
+	  hardcode_direct_FC=no
+        ;;
+	motorola)
+	  archive_cmds_FC='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	  hardcode_direct_FC=no #Motorola manual says yes, but my tests say they lie
+	;;
+      esac
+      runpath_var='LD_RUN_PATH'
+      hardcode_shlibpath_var_FC=no
+      ;;
+
+    sysv4.3*)
+      archive_cmds_FC='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      hardcode_shlibpath_var_FC=no
+      export_dynamic_flag_spec_FC='-Bexport'
+      ;;
+
+    sysv4*MP*)
+      if test -d /usr/nec; then
+	archive_cmds_FC='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	hardcode_shlibpath_var_FC=no
+	runpath_var=LD_RUN_PATH
+	hardcode_runpath_var=yes
+	ld_shlibs_FC=yes
+      fi
+      ;;
+
+    sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*)
+      no_undefined_flag_FC='${wl}-z,text'
+      archive_cmds_need_lc_FC=no
+      hardcode_shlibpath_var_FC=no
+      runpath_var='LD_RUN_PATH'
+
+      if test "$GCC" = yes; then
+	archive_cmds_FC='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	archive_expsym_cmds_FC='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	archive_cmds_FC='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	archive_expsym_cmds_FC='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      fi
+      ;;
+
+    sysv5* | sco3.2v5* | sco5v6*)
+      # Note: We can NOT use -z defs as we might desire, because we do not
+      # link with -lc, and that would cause any symbols used from libc to
+      # always be unresolved, which means just about no library would
+      # ever link correctly.  If we're not using GNU ld we use -z text
+      # though, which does catch some bad symbols but isn't as heavy-handed
+      # as -z defs.
+      no_undefined_flag_FC='${wl}-z,text'
+      allow_undefined_flag_FC='${wl}-z,nodefs'
+      archive_cmds_need_lc_FC=no
+      hardcode_shlibpath_var_FC=no
+      hardcode_libdir_flag_spec_FC='${wl}-R,$libdir'
+      hardcode_libdir_separator_FC=':'
+      link_all_deplibs_FC=yes
+      export_dynamic_flag_spec_FC='${wl}-Bexport'
+      runpath_var='LD_RUN_PATH'
+
+      if test "$GCC" = yes; then
+	archive_cmds_FC='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	archive_expsym_cmds_FC='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	archive_cmds_FC='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	archive_expsym_cmds_FC='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      fi
+      ;;
+
+    uts4*)
+      archive_cmds_FC='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      hardcode_libdir_flag_spec_FC='-L$libdir'
+      hardcode_shlibpath_var_FC=no
+      ;;
+
+    *)
+      ld_shlibs_FC=no
+      ;;
+    esac
+
+    if test x$host_vendor = xsni; then
+      case $host in
+      sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)
+	export_dynamic_flag_spec_FC='${wl}-Blargedynsym'
+	;;
+      esac
+    fi
+  fi
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_FC" >&5
+$as_echo "$ld_shlibs_FC" >&6; }
+test "$ld_shlibs_FC" = no && can_build_shared=no
+
+with_gnu_ld_FC=$with_gnu_ld
+
+
+
+
+
+
+#
+# Do we need to explicitly link libc?
+#
+case "x$archive_cmds_need_lc_FC" in
+x|xyes)
+  # Assume -lc should be added
+  archive_cmds_need_lc_FC=yes
+
+  if test "$enable_shared" = yes && test "$GCC" = yes; then
+    case $archive_cmds_FC in
+    *'~'*)
+      # FIXME: we may have to deal with multi-command sequences.
+      ;;
+    '$CC '*)
+      # Test whether the compiler implicitly links with -lc since on some
+      # systems, -lgcc has to come before -lc. If gcc already passes -lc
+      # to ld, don't add -lc before -lgcc.
+      { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5
+$as_echo_n "checking whether -lc should be explicitly linked in... " >&6; }
+if ${lt_cv_archive_cmds_need_lc_FC+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  $RM conftest*
+	echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+	if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } 2>conftest.err; then
+	  soname=conftest
+	  lib=conftest
+	  libobjs=conftest.$ac_objext
+	  deplibs=
+	  wl=$lt_prog_compiler_wl_FC
+	  pic_flag=$lt_prog_compiler_pic_FC
+	  compiler_flags=-v
+	  linker_flags=-v
+	  verstring=
+	  output_objdir=.
+	  libname=conftest
+	  lt_save_allow_undefined_flag=$allow_undefined_flag_FC
+	  allow_undefined_flag_FC=
+	  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds_FC 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5
+  (eval $archive_cmds_FC 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }
+	  then
+	    lt_cv_archive_cmds_need_lc_FC=no
+	  else
+	    lt_cv_archive_cmds_need_lc_FC=yes
+	  fi
+	  allow_undefined_flag_FC=$lt_save_allow_undefined_flag
+	else
+	  cat conftest.err 1>&5
+	fi
+	$RM conftest*
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc_FC" >&5
+$as_echo "$lt_cv_archive_cmds_need_lc_FC" >&6; }
+      archive_cmds_need_lc_FC=$lt_cv_archive_cmds_need_lc_FC
+      ;;
+    esac
+  fi
+  ;;
+esac
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5
+$as_echo_n "checking dynamic linker characteristics... " >&6; }
+
+library_names_spec=
+libname_spec='lib$name'
+soname_spec=
+shrext_cmds=".so"
+postinstall_cmds=
+postuninstall_cmds=
+finish_cmds=
+finish_eval=
+shlibpath_var=
+shlibpath_overrides_runpath=unknown
+version_type=none
+dynamic_linker="$host_os ld.so"
+sys_lib_dlsearch_path_spec="/lib /usr/lib"
+need_lib_prefix=unknown
+hardcode_into_libs=no
+
+# when you set need_version to no, make sure it does not cause -set_version
+# flags to be left without arguments
+need_version=unknown
+
+case $host_os in
+aix3*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a'
+  shlibpath_var=LIBPATH
+
+  # AIX 3 has no versioning support, so we append a major version to the name.
+  soname_spec='${libname}${release}${shared_ext}$major'
+  ;;
+
+aix[4-9]*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  hardcode_into_libs=yes
+  if test "$host_cpu" = ia64; then
+    # AIX 5 supports IA64
+    library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}'
+    shlibpath_var=LD_LIBRARY_PATH
+  else
+    # With GCC up to 2.95.x, collect2 would create an import file
+    # for dependence libraries.  The import file would start with
+    # the line `#! .'.  This would cause the generated library to
+    # depend on `.', always an invalid library.  This was fixed in
+    # development snapshots of GCC prior to 3.0.
+    case $host_os in
+      aix4 | aix4.[01] | aix4.[01].*)
+      if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'
+	   echo ' yes '
+	   echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then
+	:
+      else
+	can_build_shared=no
+      fi
+      ;;
+    esac
+    # AIX (on Power*) has no versioning support, so currently we can not hardcode correct
+    # soname into executable. Probably we can add versioning support to
+    # collect2, so additional links can be useful in future.
+    if test "$aix_use_runtimelinking" = yes; then
+      # If using run time linking (on AIX 4.2 or later) use lib<name>.so
+      # instead of lib<name>.a to let people know that these are not
+      # typical AIX shared libraries.
+      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    else
+      # We preserve .a as extension for shared libraries through AIX4.2
+      # and later when we are not doing run time linking.
+      library_names_spec='${libname}${release}.a $libname.a'
+      soname_spec='${libname}${release}${shared_ext}$major'
+    fi
+    shlibpath_var=LIBPATH
+  fi
+  ;;
+
+amigaos*)
+  case $host_cpu in
+  powerpc)
+    # Since July 2007 AmigaOS4 officially supports .so libraries.
+    # When compiling the executable, add -use-dynld -Lsobjs: to the compileline.
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    ;;
+  m68k)
+    library_names_spec='$libname.ixlibrary $libname.a'
+    # Create ${libname}_ixlibrary.a entries in /sys/libs.
+    finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'
+    ;;
+  esac
+  ;;
+
+beos*)
+  library_names_spec='${libname}${shared_ext}'
+  dynamic_linker="$host_os ld.so"
+  shlibpath_var=LIBRARY_PATH
+  ;;
+
+bsdi[45]*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib"
+  sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib"
+  # the default ld.so.conf also contains /usr/contrib/lib and
+  # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow
+  # libtool to hard-code these into programs
+  ;;
+
+cygwin* | mingw* | pw32* | cegcc*)
+  version_type=windows
+  shrext_cmds=".dll"
+  need_version=no
+  need_lib_prefix=no
+
+  case $GCC,$cc_basename in
+  yes,*)
+    # gcc
+    library_names_spec='$libname.dll.a'
+    # DLL is installed to $(libdir)/../bin by postinstall_cmds
+    postinstall_cmds='base_file=`basename \${file}`~
+      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~
+      dldir=$destdir/`dirname \$dlpath`~
+      test -d \$dldir || mkdir -p \$dldir~
+      $install_prog $dir/$dlname \$dldir/$dlname~
+      chmod a+x \$dldir/$dlname~
+      if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then
+        eval '\''$striplib \$dldir/$dlname'\'' || exit \$?;
+      fi'
+    postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
+      dlpath=$dir/\$dldll~
+       $RM \$dlpath'
+    shlibpath_overrides_runpath=yes
+
+    case $host_os in
+    cygwin*)
+      # Cygwin DLLs use 'cyg' prefix rather than 'lib'
+      soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+
+      ;;
+    mingw* | cegcc*)
+      # MinGW DLLs use traditional 'lib' prefix
+      soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+      ;;
+    pw32*)
+      # pw32 DLLs use 'pw' prefix rather than 'lib'
+      library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+      ;;
+    esac
+    dynamic_linker='Win32 ld.exe'
+    ;;
+
+  *,cl*)
+    # Native MSVC
+    libname_spec='$name'
+    soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+    library_names_spec='${libname}.dll.lib'
+
+    case $build_os in
+    mingw*)
+      sys_lib_search_path_spec=
+      lt_save_ifs=$IFS
+      IFS=';'
+      for lt_path in $LIB
+      do
+        IFS=$lt_save_ifs
+        # Let DOS variable expansion print the short 8.3 style file name.
+        lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"`
+        sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path"
+      done
+      IFS=$lt_save_ifs
+      # Convert to MSYS style.
+      sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'`
+      ;;
+    cygwin*)
+      # Convert to unix form, then to dos form, then back to unix form
+      # but this time dos style (no spaces!) so that the unix form looks
+      # like /cygdrive/c/PROGRA~1:/cygdr...
+      sys_lib_search_path_spec=`cygpath --path --unix "$LIB"`
+      sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null`
+      sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
+      ;;
+    *)
+      sys_lib_search_path_spec="$LIB"
+      if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then
+        # It is most probably a Windows format PATH.
+        sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
+      else
+        sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
+      fi
+      # FIXME: find the short name or the path components, as spaces are
+      # common. (e.g. "Program Files" -> "PROGRA~1")
+      ;;
+    esac
+
+    # DLL is installed to $(libdir)/../bin by postinstall_cmds
+    postinstall_cmds='base_file=`basename \${file}`~
+      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~
+      dldir=$destdir/`dirname \$dlpath`~
+      test -d \$dldir || mkdir -p \$dldir~
+      $install_prog $dir/$dlname \$dldir/$dlname'
+    postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
+      dlpath=$dir/\$dldll~
+       $RM \$dlpath'
+    shlibpath_overrides_runpath=yes
+    dynamic_linker='Win32 link.exe'
+    ;;
+
+  *)
+    # Assume MSVC wrapper
+    library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib'
+    dynamic_linker='Win32 ld.exe'
+    ;;
+  esac
+  # FIXME: first we should search . and the directory the executable is in
+  shlibpath_var=PATH
+  ;;
+
+darwin* | rhapsody*)
+  dynamic_linker="$host_os dyld"
+  version_type=darwin
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext'
+  soname_spec='${libname}${release}${major}$shared_ext'
+  shlibpath_overrides_runpath=yes
+  shlibpath_var=DYLD_LIBRARY_PATH
+  shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`'
+
+  sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib'
+  ;;
+
+dgux*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  ;;
+
+freebsd* | dragonfly*)
+  # DragonFly does not have aout.  When/if they implement a new
+  # versioning mechanism, adjust this.
+  if test -x /usr/bin/objformat; then
+    objformat=`/usr/bin/objformat`
+  else
+    case $host_os in
+    freebsd[23].*) objformat=aout ;;
+    *) objformat=elf ;;
+    esac
+  fi
+  version_type=freebsd-$objformat
+  case $version_type in
+    freebsd-elf*)
+      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
+      need_version=no
+      need_lib_prefix=no
+      ;;
+    freebsd-*)
+      library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix'
+      need_version=yes
+      ;;
+  esac
+  shlibpath_var=LD_LIBRARY_PATH
+  case $host_os in
+  freebsd2.*)
+    shlibpath_overrides_runpath=yes
+    ;;
+  freebsd3.[01]* | freebsdelf3.[01]*)
+    shlibpath_overrides_runpath=yes
+    hardcode_into_libs=yes
+    ;;
+  freebsd3.[2-9]* | freebsdelf3.[2-9]* | \
+  freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1)
+    shlibpath_overrides_runpath=no
+    hardcode_into_libs=yes
+    ;;
+  *) # from 4.6 on, and DragonFly
+    shlibpath_overrides_runpath=yes
+    hardcode_into_libs=yes
+    ;;
+  esac
+  ;;
+
+gnu*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  ;;
+
+haiku*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  dynamic_linker="$host_os runtime_loader"
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib'
+  hardcode_into_libs=yes
+  ;;
+
+hpux9* | hpux10* | hpux11*)
+  # Give a soname corresponding to the major version so that dld.sl refuses to
+  # link against other versions.
+  version_type=sunos
+  need_lib_prefix=no
+  need_version=no
+  case $host_cpu in
+  ia64*)
+    shrext_cmds='.so'
+    hardcode_into_libs=yes
+    dynamic_linker="$host_os dld.so"
+    shlibpath_var=LD_LIBRARY_PATH
+    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    if test "X$HPUX_IA64_MODE" = X32; then
+      sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib"
+    else
+      sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64"
+    fi
+    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+    ;;
+  hppa*64*)
+    shrext_cmds='.sl'
+    hardcode_into_libs=yes
+    dynamic_linker="$host_os dld.sl"
+    shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH
+    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64"
+    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+    ;;
+  *)
+    shrext_cmds='.sl'
+    dynamic_linker="$host_os dld.sl"
+    shlibpath_var=SHLIB_PATH
+    shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    ;;
+  esac
+  # HP-UX runs *really* slowly unless shared libraries are mode 555, ...
+  postinstall_cmds='chmod 555 $lib'
+  # or fails outright, so override atomically:
+  install_override_mode=555
+  ;;
+
+interix[3-9]*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  ;;
+
+irix5* | irix6* | nonstopux*)
+  case $host_os in
+    nonstopux*) version_type=nonstopux ;;
+    *)
+	if test "$lt_cv_prog_gnu_ld" = yes; then
+		version_type=linux # correct to gnu/linux during the next big refactor
+	else
+		version_type=irix
+	fi ;;
+  esac
+  need_lib_prefix=no
+  need_version=no
+  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}'
+  case $host_os in
+  irix5* | nonstopux*)
+    libsuff= shlibsuff=
+    ;;
+  *)
+    case $LD in # libtool.m4 will add one of these switches to LD
+    *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ")
+      libsuff= shlibsuff= libmagic=32-bit;;
+    *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ")
+      libsuff=32 shlibsuff=N32 libmagic=N32;;
+    *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ")
+      libsuff=64 shlibsuff=64 libmagic=64-bit;;
+    *) libsuff= shlibsuff= libmagic=never-match;;
+    esac
+    ;;
+  esac
+  shlibpath_var=LD_LIBRARY${shlibsuff}_PATH
+  shlibpath_overrides_runpath=no
+  sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}"
+  sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}"
+  hardcode_into_libs=yes
+  ;;
+
+# No shared lib support for Linux oldld, aout, or coff.
+linux*oldld* | linux*aout* | linux*coff*)
+  dynamic_linker=no
+  ;;
+
+# This must be glibc/ELF.
+linux* | k*bsd*-gnu | kopensolaris*-gnu)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+
+  # Some binutils ld are patched to set DT_RUNPATH
+  if ${lt_cv_shlibpath_overrides_runpath+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_shlibpath_overrides_runpath=no
+    save_LDFLAGS=$LDFLAGS
+    save_libdir=$libdir
+    eval "libdir=/foo; wl=\"$lt_prog_compiler_wl_FC\"; \
+	 LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec_FC\""
+    cat > conftest.$ac_ext <<_ACEOF
+      program main
+
+      end
+_ACEOF
+if ac_fn_fc_try_link "$LINENO"; then :
+  if  ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then :
+  lt_cv_shlibpath_overrides_runpath=yes
+fi
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+    LDFLAGS=$save_LDFLAGS
+    libdir=$save_libdir
+
+fi
+
+  shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath
+
+  # This implies no fast_install, which is unacceptable.
+  # Some rework will be needed to allow for fast_install
+  # before this can be enabled.
+  hardcode_into_libs=yes
+
+  # Append ld.so.conf contents to the search path
+  if test -f /etc/ld.so.conf; then
+    lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[	 ]*hwcap[	 ]/d;s/[:,	]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '`
+    sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra"
+  fi
+
+  # We used to test for /lib/ld.so.1 and disable shared libraries on
+  # powerpc, because MkLinux only supported shared libraries with the
+  # GNU dynamic linker.  Since this was broken with cross compilers,
+  # most powerpc-linux boxes support dynamic linking these days and
+  # people can always --disable-shared, the test was removed, and we
+  # assume the GNU/Linux dynamic linker is in use.
+  dynamic_linker='GNU/Linux ld.so'
+  ;;
+
+netbsd*)
+  version_type=sunos
+  need_lib_prefix=no
+  need_version=no
+  if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+    finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+    dynamic_linker='NetBSD (a.out) ld.so'
+  else
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    dynamic_linker='NetBSD ld.elf_so'
+  fi
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  hardcode_into_libs=yes
+  ;;
+
+newsos6)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  ;;
+
+*nto* | *qnx*)
+  version_type=qnx
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  dynamic_linker='ldqnx.so'
+  ;;
+
+openbsd*)
+  version_type=sunos
+  sys_lib_dlsearch_path_spec="/usr/lib"
+  need_lib_prefix=no
+  # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs.
+  case $host_os in
+    openbsd3.3 | openbsd3.3.*)	need_version=yes ;;
+    *)				need_version=no  ;;
+  esac
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+    case $host_os in
+      openbsd2.[89] | openbsd2.[89].*)
+	shlibpath_overrides_runpath=no
+	;;
+      *)
+	shlibpath_overrides_runpath=yes
+	;;
+      esac
+  else
+    shlibpath_overrides_runpath=yes
+  fi
+  ;;
+
+os2*)
+  libname_spec='$name'
+  shrext_cmds=".dll"
+  need_lib_prefix=no
+  library_names_spec='$libname${shared_ext} $libname.a'
+  dynamic_linker='OS/2 ld.exe'
+  shlibpath_var=LIBPATH
+  ;;
+
+osf3* | osf4* | osf5*)
+  version_type=osf
+  need_lib_prefix=no
+  need_version=no
+  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  shlibpath_var=LD_LIBRARY_PATH
+  sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib"
+  sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec"
+  ;;
+
+rdos*)
+  dynamic_linker=no
+  ;;
+
+solaris*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  hardcode_into_libs=yes
+  # ldd complains unless libraries are executable
+  postinstall_cmds='chmod +x $lib'
+  ;;
+
+sunos4*)
+  version_type=sunos
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+  finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  if test "$with_gnu_ld" = yes; then
+    need_lib_prefix=no
+  fi
+  need_version=yes
+  ;;
+
+sysv4 | sysv4.3*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  case $host_vendor in
+    sni)
+      shlibpath_overrides_runpath=no
+      need_lib_prefix=no
+      runpath_var=LD_RUN_PATH
+      ;;
+    siemens)
+      need_lib_prefix=no
+      ;;
+    motorola)
+      need_lib_prefix=no
+      need_version=no
+      shlibpath_overrides_runpath=no
+      sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib'
+      ;;
+  esac
+  ;;
+
+sysv4*MP*)
+  if test -d /usr/nec ;then
+    version_type=linux # correct to gnu/linux during the next big refactor
+    library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}'
+    soname_spec='$libname${shared_ext}.$major'
+    shlibpath_var=LD_LIBRARY_PATH
+  fi
+  ;;
+
+sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
+  version_type=freebsd-elf
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  hardcode_into_libs=yes
+  if test "$with_gnu_ld" = yes; then
+    sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib'
+  else
+    sys_lib_search_path_spec='/usr/ccs/lib /usr/lib'
+    case $host_os in
+      sco3.2v5*)
+        sys_lib_search_path_spec="$sys_lib_search_path_spec /lib"
+	;;
+    esac
+  fi
+  sys_lib_dlsearch_path_spec='/usr/lib'
+  ;;
+
+tpf*)
+  # TPF is a cross-target only.  Preferred cross-host = GNU/Linux.
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  ;;
+
+uts4*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  ;;
+
+*)
+  dynamic_linker=no
+  ;;
+esac
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5
+$as_echo "$dynamic_linker" >&6; }
+test "$dynamic_linker" = no && can_build_shared=no
+
+variables_saved_for_relink="PATH $shlibpath_var $runpath_var"
+if test "$GCC" = yes; then
+  variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH"
+fi
+
+if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then
+  sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec"
+fi
+if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then
+  sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec"
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5
+$as_echo_n "checking how to hardcode library paths into programs... " >&6; }
+hardcode_action_FC=
+if test -n "$hardcode_libdir_flag_spec_FC" ||
+   test -n "$runpath_var_FC" ||
+   test "X$hardcode_automatic_FC" = "Xyes" ; then
+
+  # We can hardcode non-existent directories.
+  if test "$hardcode_direct_FC" != no &&
+     # If the only mechanism to avoid hardcoding is shlibpath_var, we
+     # have to relink, otherwise we might link with an installed library
+     # when we should be linking with a yet-to-be-installed one
+     ## test "$_LT_TAGVAR(hardcode_shlibpath_var, FC)" != no &&
+     test "$hardcode_minus_L_FC" != no; then
+    # Linking always hardcodes the temporary library directory.
+    hardcode_action_FC=relink
+  else
+    # We can link without hardcoding, and we can hardcode nonexisting dirs.
+    hardcode_action_FC=immediate
+  fi
+else
+  # We cannot hardcode anything, or else we can only hardcode existing
+  # directories.
+  hardcode_action_FC=unsupported
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action_FC" >&5
+$as_echo "$hardcode_action_FC" >&6; }
+
+if test "$hardcode_action_FC" = relink ||
+   test "$inherit_rpath_FC" = yes; then
+  # Fast installation is not supported
+  enable_fast_install=no
+elif test "$shlibpath_overrides_runpath" = yes ||
+     test "$enable_shared" = no; then
+  # Fast installation is not necessary
+  enable_fast_install=needless
+fi
+
+
+
+
+
+
+
+  fi # test -n "$compiler"
+
+  GCC=$lt_save_GCC
+  CC=$lt_save_CC
+  CFLAGS=$lt_save_CFLAGS
+fi # test "$_lt_disable_FC" != yes
+
+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_config_commands="$ac_config_commands libtool"
+
+
+
+
+# Only expand once:
+
+
+
+# Valgrind tests don't work with shared builds because of some libtool
+# weirdness.
+if test "x$enable_shared" = xyes; then
+   if test $enable_valgrind_tests = yes; then
+      { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: No valgrind tests with shared libraries" >&5
+$as_echo "$as_me: WARNING: No valgrind tests with shared libraries" >&2;}
+      enable_valgrind_tests=no
+   fi
+fi
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: finding other utilities" >&5
+$as_echo "$as_me: finding other utilities" >&6;}
+
+# Find the install program.
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: trying to set fortran flags for this platform" >&5
+$as_echo "$as_me: trying to set fortran flags for this platform" >&6;}
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking what FC is set to" >&5
+$as_echo_n "checking what FC is set to... " >&6; }
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $FC" >&5
+$as_echo "$FC" >&6; }
+# Set fortran flag if the user has not already set it in CPPFLAGS.
+case "$CPPFLAGS" in
+ *pgiFortran*|*NAGf90Fortran*|*f2cFortran*|*hpuxFortran*|*apolloFortran*|*sunFortran*|*IBMR2Fortran*|*CRAYFortran*|*PATHSCALE_COMPILER*|*gFortran*|*mipsFortran*|*DECFortran*|*vmsFortran*|*CONVEXFortran*|*PowerStationFortran*|*AbsoftUNIXFortran*|*AbsoftProFortran*|*SXFortran*)
+    ;;
+   *)
+      case "$FC" in
+         pgf95|pgf90|pgf77|ifort*|lf90|lf95)
+
+$as_echo "#define pgiFortran 1" >>confdefs.h
+
+            ;;
+          *gfortran)
+             if (gfortran --version | grep '(GCC 4.1.' || gfortran --version | grep '(GCC 4.0.'); then
+
+$as_echo "#define gFortran 1" >>confdefs.h
+
+             else
+
+$as_echo "#define pgiFortran 1" >>confdefs.h
+
+             fi
+             ;;
+          *g77)
+
+$as_echo "#define f2cFortran 1" >>confdefs.h
+
+             ;;
+          *)
+             # If it's a gnu compiler, guess f2c.
+             if test "x$ac_cv_fc_compiler_gnu" = xyes; then
+
+$as_echo "#define f2cFortran 1" >>confdefs.h
+
+             fi
+             ;;
+      esac
+esac
+
+case "$FC" in
+pgf95|pgf90|pgf77|ifort*|lf90|lf95) using_pgi=yes ;;
+*) ;;
+esac
+
+ if test "x$using_pgi" = "xyes"; then
+  USING_PGI_TRUE=
+  USING_PGI_FALSE='#'
+else
+  USING_PGI_TRUE='#'
+  USING_PGI_FALSE=
+fi
+
+
+# Check to see if any macros must be set to enable large (>2GB) files.
+# Check whether --enable-largefile was given.
+if test "${enable_largefile+set}" = set; then :
+  enableval=$enable_largefile;
+fi
+
+if test "$enable_largefile" != no; then
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for special C compiler options needed for large files" >&5
+$as_echo_n "checking for special C compiler options needed for large files... " >&6; }
+if ${ac_cv_sys_largefile_CC+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_cv_sys_largefile_CC=no
+     if test "$GCC" != yes; then
+       ac_save_CC=$CC
+       while :; do
+	 # IRIX 6.2 and later do not support large files by default,
+	 # so use the C compiler's -n32 option if that helps.
+	 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <sys/types.h>
+ /* Check that off_t can represent 2**63 - 1 correctly.
+    We can't simply define LARGE_OFF_T to be 9223372036854775807,
+    since some C++ compilers masquerading as C compilers
+    incorrectly reject 9223372036854775807.  */
+#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62))
+  int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
+		       && LARGE_OFF_T % 2147483647 == 1)
+		      ? 1 : -1];
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+	 if ac_fn_c_try_compile "$LINENO"; then :
+  break
+fi
+rm -f core conftest.err conftest.$ac_objext
+	 CC="$CC -n32"
+	 if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_sys_largefile_CC=' -n32'; break
+fi
+rm -f core conftest.err conftest.$ac_objext
+	 break
+       done
+       CC=$ac_save_CC
+       rm -f conftest.$ac_ext
+    fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_largefile_CC" >&5
+$as_echo "$ac_cv_sys_largefile_CC" >&6; }
+  if test "$ac_cv_sys_largefile_CC" != no; then
+    CC=$CC$ac_cv_sys_largefile_CC
+  fi
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _FILE_OFFSET_BITS value needed for large files" >&5
+$as_echo_n "checking for _FILE_OFFSET_BITS value needed for large files... " >&6; }
+if ${ac_cv_sys_file_offset_bits+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  while :; do
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <sys/types.h>
+ /* Check that off_t can represent 2**63 - 1 correctly.
+    We can't simply define LARGE_OFF_T to be 9223372036854775807,
+    since some C++ compilers masquerading as C compilers
+    incorrectly reject 9223372036854775807.  */
+#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62))
+  int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
+		       && LARGE_OFF_T % 2147483647 == 1)
+		      ? 1 : -1];
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_sys_file_offset_bits=no; break
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#define _FILE_OFFSET_BITS 64
+#include <sys/types.h>
+ /* Check that off_t can represent 2**63 - 1 correctly.
+    We can't simply define LARGE_OFF_T to be 9223372036854775807,
+    since some C++ compilers masquerading as C compilers
+    incorrectly reject 9223372036854775807.  */
+#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62))
+  int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
+		       && LARGE_OFF_T % 2147483647 == 1)
+		      ? 1 : -1];
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_sys_file_offset_bits=64; break
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+  ac_cv_sys_file_offset_bits=unknown
+  break
+done
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_file_offset_bits" >&5
+$as_echo "$ac_cv_sys_file_offset_bits" >&6; }
+case $ac_cv_sys_file_offset_bits in #(
+  no | unknown) ;;
+  *)
+cat >>confdefs.h <<_ACEOF
+#define _FILE_OFFSET_BITS $ac_cv_sys_file_offset_bits
+_ACEOF
+;;
+esac
+rm -rf conftest*
+  if test $ac_cv_sys_file_offset_bits = unknown; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _LARGE_FILES value needed for large files" >&5
+$as_echo_n "checking for _LARGE_FILES value needed for large files... " >&6; }
+if ${ac_cv_sys_large_files+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  while :; do
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <sys/types.h>
+ /* Check that off_t can represent 2**63 - 1 correctly.
+    We can't simply define LARGE_OFF_T to be 9223372036854775807,
+    since some C++ compilers masquerading as C compilers
+    incorrectly reject 9223372036854775807.  */
+#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62))
+  int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
+		       && LARGE_OFF_T % 2147483647 == 1)
+		      ? 1 : -1];
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_sys_large_files=no; break
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#define _LARGE_FILES 1
+#include <sys/types.h>
+ /* Check that off_t can represent 2**63 - 1 correctly.
+    We can't simply define LARGE_OFF_T to be 9223372036854775807,
+    since some C++ compilers masquerading as C compilers
+    incorrectly reject 9223372036854775807.  */
+#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62))
+  int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
+		       && LARGE_OFF_T % 2147483647 == 1)
+		      ? 1 : -1];
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_sys_large_files=1; break
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+  ac_cv_sys_large_files=unknown
+  break
+done
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_large_files" >&5
+$as_echo "$ac_cv_sys_large_files" >&6; }
+case $ac_cv_sys_large_files in #(
+  no | unknown) ;;
+  *)
+cat >>confdefs.h <<_ACEOF
+#define _LARGE_FILES $ac_cv_sys_large_files
+_ACEOF
+;;
+esac
+rm -rf conftest*
+  fi
+
+
+fi
+
+
+#AC_MSG_NOTICE([displaying some results])
+
+## This next macro just prints some results for debugging
+## support issues.
+#UD_DISPLAY_RESULTS
+
+# For nightly build testing, output CC, FC, etc.
+#echo "CPPFLAGS=$CPPFLAGS CC=$CC CFLAGS=$CFLAGS CXX=$CXX CXXFLAGS=$CXXFLAGS FC=$FC FCFLAGS=$FCFLAGS F77=$F77 FFLAGS=$FFLAGS LDFLAGS=$LDFLAGS LIBS=$LIBS FLIBS=$FLIBS F90LIBS=$F90LIBS" >> comps.txt
+
+ac_cv_prog_f90_uppercase_mod=no
+
+# This will test the f77 compiler, as well as check some fortran types.
+if test "$enable_fortran_type_check" = yes; then
+
+    case "${NM-unset}" in
+	unset) for ac_prog in nm
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_NM+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$NM"; then
+  ac_cv_prog_NM="$NM" # 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_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_NM="$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+NM=$ac_cv_prog_NM
+if test -n "$NM"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $NM" >&5
+$as_echo "$NM" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  test -n "$NM" && break
+done
+test -n "$NM" || NM="nm"
+ ;;
+	*) for ac_prog in $NM nm
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_NM+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$NM"; then
+  ac_cv_prog_NM="$NM" # 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_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_NM="$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+NM=$ac_cv_prog_NM
+if test -n "$NM"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $NM" >&5
+$as_echo "$NM" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  test -n "$NM" && break
+done
+test -n "$NM" || NM="nm"
+ ;;
+    esac
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking nm flags" >&5
+$as_echo_n "checking nm flags... " >&6; }
+    case "${NMFLAGS-unset}" in
+	unset) NMFLAGS= ;;
+    esac
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $NMFLAGS" >&5
+$as_echo "$NMFLAGS" >&6; }
+
+
+
+#    AC_REQUIRE([UD_PROG_FC])
+    case "$FC" in
+	'') ;;
+	*)
+
+
+
+	    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for C-equivalent to Fortran routine \"SUB\"" >&5
+$as_echo_n "checking for C-equivalent to Fortran routine \"SUB\"... " >&6; }
+	    cat >conftest.f <<\EOF
+              call sub()
+              end
+EOF
+	    doit='$FC -c ${FFLAGS} conftest.f'
+	    if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$doit\""; } >&5
+  (eval $doit) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+		FCALLSCSUB=`$NM $NMFLAGS conftest.o | awk '
+		    /SUB_/{print "SUB_";exit}
+		    /SUB/ {print "SUB"; exit}
+		    /sub_/{print "sub_";exit}
+		    /sub/ {print "sub"; exit}'`
+		case "$FCALLSCSUB" in
+		    '') as_fn_error $? "not found" "$LINENO" 5
+			;;
+		    *)  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $FCALLSCSUB" >&5
+$as_echo "$FCALLSCSUB" >&6; }
+			;;
+		esac
+	    else
+		as_fn_error $? "Could not compile conftest.f" "$LINENO" 5
+	    fi
+	    rm -f conftest*
+	    ;;
+    esac
+
+
+#    AC_REQUIRE([UD_PROG_FC])
+    case "$FC" in
+    '')
+	;;
+    *)
+
+
+    for ftype in byte integer*1 "integer(kind=1)" "integer(selected_int_kind(2))"; do
+	{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for Fortran \"$ftype\"" >&5
+$as_echo_n "checking for Fortran \"$ftype\"... " >&6; }
+	cat >conftest.f <<EOF
+      subroutine sub(value)
+      $ftype value
+      end
+EOF
+	doit='$FC -c ${FFLAGS} conftest.f'
+	if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$doit\""; } >&5
+  (eval $doit) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+	    { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+	    NF_INT1_T=$ftype
+
+cat >>confdefs.h <<_ACEOF
+#define NF_INT1_T $ftype
+_ACEOF
+
+	    break
+	else
+	    { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+	fi
+    done
+    rm -f conftest*
+
+
+    for ftype in integer*2 "integer(kind=2)" "integer(selected_int_kind(4))"; do
+	{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for Fortran \"$ftype\"" >&5
+$as_echo_n "checking for Fortran \"$ftype\"... " >&6; }
+	cat >conftest.f <<EOF
+      subroutine sub(value)
+      $ftype value
+      end
+EOF
+	doit='$FC -c ${FFLAGS} conftest.f'
+	if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$doit\""; } >&5
+  (eval $doit) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+	    { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+	    NF_INT2_T=$ftype
+
+cat >>confdefs.h <<_ACEOF
+#define NF_INT2_T $ftype
+_ACEOF
+
+	    break
+	else
+	    { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+	fi
+    done
+    rm -f conftest*
+
+
+	case "${NF_INT1_T}" in
+	    '') ;;
+	    *)
+    cat >conftestf.f <<EOF
+           $NF_INT1_T values(4)
+           data values /-1, -2, -3, -4/
+           call sub(values)
+           end
+EOF
+    for ctype in "signed char"; do
+	{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if Fortran \"$NF_INT1_T\" is C \"$ctype\"" >&5
+$as_echo_n "checking if Fortran \"$NF_INT1_T\" is C \"$ctype\"... " >&6; }
+	cat >conftest.c <<EOF
+	    void $FCALLSCSUB(values)
+		$ctype values[4];
+	    {
+		exit(values[1] != -2 || values[2] != -3);
+	    }
+EOF
+	doit='$CC -c ${CPPFLAGS} ${CFLAGS} conftest.c'
+	if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$doit\""; } >&5
+  (eval $doit) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+	    doit='$FC ${FFLAGS} -c conftestf.f'
+	    if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$doit\""; } >&5
+  (eval $doit) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+	        doit='$FC -o conftest ${FFLAGS} ${LDFLAGS} conftestf.o conftest.o ${FLIBS} ${LIBS}'
+	        if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$doit\""; } >&5
+  (eval $doit) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+		    doit=./conftest
+		    if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$doit\""; } >&5
+  (eval $doit) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+		        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+		        cname=`echo $ctype | tr ' abcdefghijklmnopqrstuvwxyz' \
+			    _ABCDEFGHIJKLMNOPQRSTUVWXYZ`
+
+cat >>confdefs.h <<_ACEOF
+#define NF_INT1_IS_C_$cname 1
+_ACEOF
+
+		        break
+		    else
+		        { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+		    fi
+	        else
+		    as_fn_error $? "Could not link conftestf.o and conftest.o" "$LINENO" 5
+	        fi
+	    else
+		as_fn_error $? "Could not compile conftestf.f" "$LINENO" 5
+	    fi
+	else
+	    as_fn_error $? "Could not compile conftest.c" "$LINENO" 5
+	fi
+    done
+    rm -f conftest*
+
+
+    cat >conftestf.f <<EOF
+           $NF_INT1_T values(4)
+           data values /-1, -2, -3, -4/
+           call sub(values)
+           end
+EOF
+    for ctype in "short"; do
+	{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if Fortran \"$NF_INT1_T\" is C \"$ctype\"" >&5
+$as_echo_n "checking if Fortran \"$NF_INT1_T\" is C \"$ctype\"... " >&6; }
+	cat >conftest.c <<EOF
+	    void $FCALLSCSUB(values)
+		$ctype values[4];
+	    {
+		exit(values[1] != -2 || values[2] != -3);
+	    }
+EOF
+	doit='$CC -c ${CPPFLAGS} ${CFLAGS} conftest.c'
+	if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$doit\""; } >&5
+  (eval $doit) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+	    doit='$FC ${FFLAGS} -c conftestf.f'
+	    if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$doit\""; } >&5
+  (eval $doit) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+	        doit='$FC -o conftest ${FFLAGS} ${LDFLAGS} conftestf.o conftest.o ${FLIBS} ${LIBS}'
+	        if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$doit\""; } >&5
+  (eval $doit) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+		    doit=./conftest
+		    if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$doit\""; } >&5
+  (eval $doit) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+		        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+		        cname=`echo $ctype | tr ' abcdefghijklmnopqrstuvwxyz' \
+			    _ABCDEFGHIJKLMNOPQRSTUVWXYZ`
+
+cat >>confdefs.h <<_ACEOF
+#define NF_INT1_IS_C_$cname 1
+_ACEOF
+
+		        break
+		    else
+		        { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+		    fi
+	        else
+		    as_fn_error $? "Could not link conftestf.o and conftest.o" "$LINENO" 5
+	        fi
+	    else
+		as_fn_error $? "Could not compile conftestf.f" "$LINENO" 5
+	    fi
+	else
+	    as_fn_error $? "Could not compile conftest.c" "$LINENO" 5
+	fi
+    done
+    rm -f conftest*
+
+
+    cat >conftestf.f <<EOF
+           $NF_INT1_T values(4)
+           data values /-1, -2, -3, -4/
+           call sub(values)
+           end
+EOF
+    for ctype in "int"; do
+	{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if Fortran \"$NF_INT1_T\" is C \"$ctype\"" >&5
+$as_echo_n "checking if Fortran \"$NF_INT1_T\" is C \"$ctype\"... " >&6; }
+	cat >conftest.c <<EOF
+	    void $FCALLSCSUB(values)
+		$ctype values[4];
+	    {
+		exit(values[1] != -2 || values[2] != -3);
+	    }
+EOF
+	doit='$CC -c ${CPPFLAGS} ${CFLAGS} conftest.c'
+	if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$doit\""; } >&5
+  (eval $doit) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+	    doit='$FC ${FFLAGS} -c conftestf.f'
+	    if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$doit\""; } >&5
+  (eval $doit) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+	        doit='$FC -o conftest ${FFLAGS} ${LDFLAGS} conftestf.o conftest.o ${FLIBS} ${LIBS}'
+	        if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$doit\""; } >&5
+  (eval $doit) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+		    doit=./conftest
+		    if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$doit\""; } >&5
+  (eval $doit) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+		        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+		        cname=`echo $ctype | tr ' abcdefghijklmnopqrstuvwxyz' \
+			    _ABCDEFGHIJKLMNOPQRSTUVWXYZ`
+
+cat >>confdefs.h <<_ACEOF
+#define NF_INT1_IS_C_$cname 1
+_ACEOF
+
+		        break
+		    else
+		        { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+		    fi
+	        else
+		    as_fn_error $? "Could not link conftestf.o and conftest.o" "$LINENO" 5
+	        fi
+	    else
+		as_fn_error $? "Could not compile conftestf.f" "$LINENO" 5
+	    fi
+	else
+	    as_fn_error $? "Could not compile conftest.c" "$LINENO" 5
+	fi
+    done
+    rm -f conftest*
+
+
+    cat >conftestf.f <<EOF
+           $NF_INT1_T values(4)
+           data values /-1, -2, -3, -4/
+           call sub(values)
+           end
+EOF
+    for ctype in "long"; do
+	{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if Fortran \"$NF_INT1_T\" is C \"$ctype\"" >&5
+$as_echo_n "checking if Fortran \"$NF_INT1_T\" is C \"$ctype\"... " >&6; }
+	cat >conftest.c <<EOF
+	    void $FCALLSCSUB(values)
+		$ctype values[4];
+	    {
+		exit(values[1] != -2 || values[2] != -3);
+	    }
+EOF
+	doit='$CC -c ${CPPFLAGS} ${CFLAGS} conftest.c'
+	if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$doit\""; } >&5
+  (eval $doit) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+	    doit='$FC ${FFLAGS} -c conftestf.f'
+	    if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$doit\""; } >&5
+  (eval $doit) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+	        doit='$FC -o conftest ${FFLAGS} ${LDFLAGS} conftestf.o conftest.o ${FLIBS} ${LIBS}'
+	        if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$doit\""; } >&5
+  (eval $doit) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+		    doit=./conftest
+		    if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$doit\""; } >&5
+  (eval $doit) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+		        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+		        cname=`echo $ctype | tr ' abcdefghijklmnopqrstuvwxyz' \
+			    _ABCDEFGHIJKLMNOPQRSTUVWXYZ`
+
+cat >>confdefs.h <<_ACEOF
+#define NF_INT1_IS_C_$cname 1
+_ACEOF
+
+		        break
+		    else
+		        { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+		    fi
+	        else
+		    as_fn_error $? "Could not link conftestf.o and conftest.o" "$LINENO" 5
+	        fi
+	    else
+		as_fn_error $? "Could not compile conftestf.f" "$LINENO" 5
+	    fi
+	else
+	    as_fn_error $? "Could not compile conftest.c" "$LINENO" 5
+	fi
+    done
+    rm -f conftest*
+
+		;;
+	esac
+	case "${NF_INT2_T}" in
+	    '') ;;
+	    *)
+    cat >conftestf.f <<EOF
+           $NF_INT2_T values(4)
+           data values /-1, -2, -3, -4/
+           call sub(values)
+           end
+EOF
+    for ctype in short; do
+	{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if Fortran \"$NF_INT2_T\" is C \"$ctype\"" >&5
+$as_echo_n "checking if Fortran \"$NF_INT2_T\" is C \"$ctype\"... " >&6; }
+	cat >conftest.c <<EOF
+	    void $FCALLSCSUB(values)
+		$ctype values[4];
+	    {
+		exit(values[1] != -2 || values[2] != -3);
+	    }
+EOF
+	doit='$CC -c ${CPPFLAGS} ${CFLAGS} conftest.c'
+	if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$doit\""; } >&5
+  (eval $doit) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+	    doit='$FC ${FFLAGS} -c conftestf.f'
+	    if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$doit\""; } >&5
+  (eval $doit) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+	        doit='$FC -o conftest ${FFLAGS} ${LDFLAGS} conftestf.o conftest.o ${FLIBS} ${LIBS}'
+	        if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$doit\""; } >&5
+  (eval $doit) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+		    doit=./conftest
+		    if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$doit\""; } >&5
+  (eval $doit) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+		        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+		        cname=`echo $ctype | tr ' abcdefghijklmnopqrstuvwxyz' \
+			    _ABCDEFGHIJKLMNOPQRSTUVWXYZ`
+
+cat >>confdefs.h <<_ACEOF
+#define NF_INT2_IS_C_$cname 1
+_ACEOF
+
+		        break
+		    else
+		        { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+		    fi
+	        else
+		    as_fn_error $? "Could not link conftestf.o and conftest.o" "$LINENO" 5
+	        fi
+	    else
+		as_fn_error $? "Could not compile conftestf.f" "$LINENO" 5
+	    fi
+	else
+	    as_fn_error $? "Could not compile conftest.c" "$LINENO" 5
+	fi
+    done
+    rm -f conftest*
+
+
+    cat >conftestf.f <<EOF
+           $NF_INT2_T values(4)
+           data values /-1, -2, -3, -4/
+           call sub(values)
+           end
+EOF
+    for ctype in int; do
+	{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if Fortran \"$NF_INT2_T\" is C \"$ctype\"" >&5
+$as_echo_n "checking if Fortran \"$NF_INT2_T\" is C \"$ctype\"... " >&6; }
+	cat >conftest.c <<EOF
+	    void $FCALLSCSUB(values)
+		$ctype values[4];
+	    {
+		exit(values[1] != -2 || values[2] != -3);
+	    }
+EOF
+	doit='$CC -c ${CPPFLAGS} ${CFLAGS} conftest.c'
+	if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$doit\""; } >&5
+  (eval $doit) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+	    doit='$FC ${FFLAGS} -c conftestf.f'
+	    if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$doit\""; } >&5
+  (eval $doit) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+	        doit='$FC -o conftest ${FFLAGS} ${LDFLAGS} conftestf.o conftest.o ${FLIBS} ${LIBS}'
+	        if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$doit\""; } >&5
+  (eval $doit) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+		    doit=./conftest
+		    if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$doit\""; } >&5
+  (eval $doit) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+		        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+		        cname=`echo $ctype | tr ' abcdefghijklmnopqrstuvwxyz' \
+			    _ABCDEFGHIJKLMNOPQRSTUVWXYZ`
+
+cat >>confdefs.h <<_ACEOF
+#define NF_INT2_IS_C_$cname 1
+_ACEOF
+
+		        break
+		    else
+		        { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+		    fi
+	        else
+		    as_fn_error $? "Could not link conftestf.o and conftest.o" "$LINENO" 5
+	        fi
+	    else
+		as_fn_error $? "Could not compile conftestf.f" "$LINENO" 5
+	    fi
+	else
+	    as_fn_error $? "Could not compile conftest.c" "$LINENO" 5
+	fi
+    done
+    rm -f conftest*
+
+
+    cat >conftestf.f <<EOF
+           $NF_INT2_T values(4)
+           data values /-1, -2, -3, -4/
+           call sub(values)
+           end
+EOF
+    for ctype in long; do
+	{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if Fortran \"$NF_INT2_T\" is C \"$ctype\"" >&5
+$as_echo_n "checking if Fortran \"$NF_INT2_T\" is C \"$ctype\"... " >&6; }
+	cat >conftest.c <<EOF
+	    void $FCALLSCSUB(values)
+		$ctype values[4];
+	    {
+		exit(values[1] != -2 || values[2] != -3);
+	    }
+EOF
+	doit='$CC -c ${CPPFLAGS} ${CFLAGS} conftest.c'
+	if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$doit\""; } >&5
+  (eval $doit) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+	    doit='$FC ${FFLAGS} -c conftestf.f'
+	    if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$doit\""; } >&5
+  (eval $doit) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+	        doit='$FC -o conftest ${FFLAGS} ${LDFLAGS} conftestf.o conftest.o ${FLIBS} ${LIBS}'
+	        if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$doit\""; } >&5
+  (eval $doit) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+		    doit=./conftest
+		    if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$doit\""; } >&5
+  (eval $doit) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+		        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+		        cname=`echo $ctype | tr ' abcdefghijklmnopqrstuvwxyz' \
+			    _ABCDEFGHIJKLMNOPQRSTUVWXYZ`
+
+cat >>confdefs.h <<_ACEOF
+#define NF_INT2_IS_C_$cname 1
+_ACEOF
+
+		        break
+		    else
+		        { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+		    fi
+	        else
+		    as_fn_error $? "Could not link conftestf.o and conftest.o" "$LINENO" 5
+	        fi
+	    else
+		as_fn_error $? "Could not compile conftestf.f" "$LINENO" 5
+	    fi
+	else
+	    as_fn_error $? "Could not compile conftest.c" "$LINENO" 5
+	fi
+    done
+    rm -f conftest*
+
+		;;
+	esac
+
+    cat >conftestf.f <<EOF
+           integer values(4)
+           data values /-1, -2, -3, -4/
+           call sub(values)
+           end
+EOF
+    for ctype in int long; do
+	{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if Fortran \"integer\" is C \"$ctype\"" >&5
+$as_echo_n "checking if Fortran \"integer\" is C \"$ctype\"... " >&6; }
+	cat >conftest.c <<EOF
+	    void $FCALLSCSUB(values)
+		$ctype values[4];
+	    {
+		exit(values[1] != -2 || values[2] != -3);
+	    }
+EOF
+	doit='$CC -c ${CPPFLAGS} ${CFLAGS} conftest.c'
+	if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$doit\""; } >&5
+  (eval $doit) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+	    doit='$FC ${FFLAGS} -c conftestf.f'
+	    if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$doit\""; } >&5
+  (eval $doit) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+	        doit='$FC -o conftest ${FFLAGS} ${LDFLAGS} conftestf.o conftest.o ${FLIBS} ${LIBS}'
+	        if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$doit\""; } >&5
+  (eval $doit) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+		    doit=./conftest
+		    if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$doit\""; } >&5
+  (eval $doit) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+		        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+		        cname=`echo $ctype | tr ' abcdefghijklmnopqrstuvwxyz' \
+			    _ABCDEFGHIJKLMNOPQRSTUVWXYZ`
+
+cat >>confdefs.h <<_ACEOF
+#define NF_INT_IS_C_$cname 1
+_ACEOF
+
+		        break
+		    else
+		        { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+		    fi
+	        else
+		    as_fn_error $? "Could not link conftestf.o and conftest.o" "$LINENO" 5
+	        fi
+	    else
+		as_fn_error $? "Could not compile conftestf.f" "$LINENO" 5
+	    fi
+	else
+	    as_fn_error $? "Could not compile conftest.c" "$LINENO" 5
+	fi
+    done
+    rm -f conftest*
+
+
+    cat >conftestf.f <<EOF
+           real values(4)
+           data values /-1, -2, -3, -4/
+           call sub(values)
+           end
+EOF
+    for ctype in float double; do
+	{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if Fortran \"real\" is C \"$ctype\"" >&5
+$as_echo_n "checking if Fortran \"real\" is C \"$ctype\"... " >&6; }
+	cat >conftest.c <<EOF
+	    void $FCALLSCSUB(values)
+		$ctype values[4];
+	    {
+		exit(values[1] != -2 || values[2] != -3);
+	    }
+EOF
+	doit='$CC -c ${CPPFLAGS} ${CFLAGS} conftest.c'
+	if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$doit\""; } >&5
+  (eval $doit) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+	    doit='$FC ${FFLAGS} -c conftestf.f'
+	    if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$doit\""; } >&5
+  (eval $doit) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+	        doit='$FC -o conftest ${FFLAGS} ${LDFLAGS} conftestf.o conftest.o ${FLIBS} ${LIBS}'
+	        if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$doit\""; } >&5
+  (eval $doit) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+		    doit=./conftest
+		    if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$doit\""; } >&5
+  (eval $doit) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+		        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+		        cname=`echo $ctype | tr ' abcdefghijklmnopqrstuvwxyz' \
+			    _ABCDEFGHIJKLMNOPQRSTUVWXYZ`
+
+cat >>confdefs.h <<_ACEOF
+#define NF_REAL_IS_C_$cname 1
+_ACEOF
+
+		        break
+		    else
+		        { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+		    fi
+	        else
+		    as_fn_error $? "Could not link conftestf.o and conftest.o" "$LINENO" 5
+	        fi
+	    else
+		as_fn_error $? "Could not compile conftestf.f" "$LINENO" 5
+	    fi
+	else
+	    as_fn_error $? "Could not compile conftest.c" "$LINENO" 5
+	fi
+    done
+    rm -f conftest*
+
+
+    cat >conftestf.f <<EOF
+           doubleprecision values(4)
+           data values /-1, -2, -3, -4/
+           call sub(values)
+           end
+EOF
+    for ctype in double float; do
+	{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if Fortran \"doubleprecision\" is C \"$ctype\"" >&5
+$as_echo_n "checking if Fortran \"doubleprecision\" is C \"$ctype\"... " >&6; }
+	cat >conftest.c <<EOF
+	    void $FCALLSCSUB(values)
+		$ctype values[4];
+	    {
+		exit(values[1] != -2 || values[2] != -3);
+	    }
+EOF
+	doit='$CC -c ${CPPFLAGS} ${CFLAGS} conftest.c'
+	if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$doit\""; } >&5
+  (eval $doit) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+	    doit='$FC ${FFLAGS} -c conftestf.f'
+	    if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$doit\""; } >&5
+  (eval $doit) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+	        doit='$FC -o conftest ${FFLAGS} ${LDFLAGS} conftestf.o conftest.o ${FLIBS} ${LIBS}'
+	        if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$doit\""; } >&5
+  (eval $doit) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+		    doit=./conftest
+		    if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$doit\""; } >&5
+  (eval $doit) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+		        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+		        cname=`echo $ctype | tr ' abcdefghijklmnopqrstuvwxyz' \
+			    _ABCDEFGHIJKLMNOPQRSTUVWXYZ`
+
+cat >>confdefs.h <<_ACEOF
+#define NF_DOUBLEPRECISION_IS_C_$cname 1
+_ACEOF
+
+		        break
+		    else
+		        { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+		    fi
+	        else
+		    as_fn_error $? "Could not link conftestf.o and conftest.o" "$LINENO" 5
+	        fi
+	    else
+		as_fn_error $? "Could not compile conftestf.f" "$LINENO" 5
+	    fi
+	else
+	    as_fn_error $? "Could not compile conftest.c" "$LINENO" 5
+	fi
+    done
+    rm -f conftest*
+
+
+
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Fortran-equivalent to netCDF \"byte\"" >&5
+$as_echo_n "checking for Fortran-equivalent to netCDF \"byte\"... " >&6; }
+    for type in byte integer*1 "integer(kind=1)" "integer(selected_int_kind(2))" integer; do
+	cat >conftest.f <<EOF
+               $type foo
+               end
+EOF
+	doit='$FC -c ${FFLAGS} conftest.f'
+	if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$doit\""; } >&5
+  (eval $doit) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+	    break;
+	fi
+    done
+    rm -f conftest.f conftest.o
+
+cat >>confdefs.h <<_ACEOF
+#define NCBYTE_T $type
+_ACEOF
+
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $type" >&5
+$as_echo "$type" >&6; }
+    NCBYTE_T=$type
+
+
+
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Fortran-equivalent to netCDF \"short\"" >&5
+$as_echo_n "checking for Fortran-equivalent to netCDF \"short\"... " >&6; }
+    for type in integer*2 "integer(kind=2)" "integer(selected_int_kind(4))" integer; do
+	cat >conftest.f <<EOF
+               $type foo
+               end
+EOF
+	doit='$FC -c ${FFLAGS} conftest.f'
+	if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$doit\""; } >&5
+  (eval $doit) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+	    break;
+	fi
+    done
+    rm -f conftest.f conftest.o
+
+cat >>confdefs.h <<_ACEOF
+#define NCSHORT_T $type
+_ACEOF
+
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $type" >&5
+$as_echo "$type" >&6; }
+    NCSHORT_T=$type
+
+
+
+
+	;;
+    esac
+
+   if test "x$ud_fc_failed" = xyes; then
+      as_fn_error $? "F77 compiler doesn't work, and compiler recovery disabled." "$LINENO" 5
+   fi
+else
+   $as_echo "#define NCBYTE_T byte" >>confdefs.h
+
+   $as_echo "#define NCSHORT_T integer*2" >>confdefs.h
+
+   $as_echo "#define NF_INT1_T byte" >>confdefs.h
+
+   $as_echo "#define NF_INT2_T integer*2" >>confdefs.h
+
+
+$as_echo "#define NF_INT1_IS_C_SIGNED_CHAR 1" >>confdefs.h
+
+
+$as_echo "#define NF_INT2_IS_C_SHORT 1" >>confdefs.h
+
+
+$as_echo "#define NF_INT_IS_C_INT 1" >>confdefs.h
+
+
+$as_echo "#define NF_REAL_IS_C_FLOAT 1" >>confdefs.h
+
+
+$as_echo "#define NF_DOUBLEPRECISION_IS_C_DOUBLE 1" >>confdefs.h
+
+fi
+
+# Test whether F90 module names get capitalized.
+if test "x$nc_build_f90" = xyes; then
+
+ac_ext=${ac_fc_srcext-f}
+ac_compile='$FC -c $FCFLAGS $ac_fcflags_srcext conftest.$ac_ext >&5'
+ac_link='$FC -o conftest$ac_exeext $FCFLAGS $LDFLAGS $ac_fcflags_srcext conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_fc_compiler_gnu
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if Fortran 90 compiler capitalizes .mod filenames" >&5
+$as_echo_n "checking if Fortran 90 compiler capitalizes .mod filenames... " >&6; }
+		    cat <<EOF >conftest.f90
+		      module conftest
+		      end module conftest
+EOF
+ac_try='$F90 ${F90FLAGS} conftest.f90 -c ${F90LIBS}>&5'
+{ { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }
+# Following changed from "test -f" to adapt to OSX case-insensitive filesystems
+if test `ls *.mod` CONFTEST.mod ; then
+   ac_cv_prog_f90_uppercase_mod=yes
+   rm -f CONFTEST.mod
+else
+   ac_cv_prog_f90_uppercase_mod=no
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_f90_uppercase_mod" >&5
+$as_echo "$ac_cv_prog_f90_uppercase_mod" >&6; }
+#rm -f conftest*
+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
+
+
+fi
+if test "x$ac_cv_prog_f90_uppercase_mod" = xyes ; then
+{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "Upper Case Modules names not supported
+See \`config.log' for more details" "$LINENO" 5; }
+fi
+ if test "x$ac_cv_prog_f90_uppercase_mod" = xyes; then
+  UPPER_CASE_MOD_TRUE=
+  UPPER_CASE_MOD_FALSE='#'
+else
+  UPPER_CASE_MOD_TRUE='#'
+  UPPER_CASE_MOD_FALSE=
+fi
+
+
+# Does the user want to run extra example tests
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether extra example tests should be run" >&5
+$as_echo_n "checking whether extra example tests should be run... " >&6; }
+# Check whether --enable-extra-example-tests was given.
+if test "${enable_extra_example_tests+set}" = set; then :
+  enableval=$enable_extra_example_tests;
+fi
+
+test "x$enable_extra_example_tests" = xyes || enable_extra_example_tests=no
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_extra_example_tests" >&5
+$as_echo "$enable_extra_example_tests" >&6; }
+ if test "x$enable_extra_example_tests" = xyes; then
+  EXTRA_EXAMPLE_TESTS_TRUE=
+  EXTRA_EXAMPLE_TESTS_FALSE='#'
+else
+  EXTRA_EXAMPLE_TESTS_TRUE='#'
+  EXTRA_EXAMPLE_TESTS_FALSE=
+fi
+
+
+# If --enable-dll is specified the DLL will be built. This only works
+# on mingw.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a win32 DLL is desired" >&5
+$as_echo_n "checking whether a win32 DLL is desired... " >&6; }
+# Check whether --enable-dll was given.
+if test "${enable_dll+set}" = set; then :
+  enableval=$enable_dll;
+fi
+
+test "x$enable_dll" = xyes || enable_dll=no
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_dll" >&5
+$as_echo "$enable_dll" >&6; }
+ if test x$enable_dll = xyes; then
+  BUILD_DLL_TRUE=
+  BUILD_DLL_FALSE='#'
+else
+  BUILD_DLL_TRUE='#'
+  BUILD_DLL_FALSE=
+fi
+
+if test "x$enable_dll" = xyes; then
+
+$as_echo "#define DLL_NETCDF 1" >>confdefs.h
+
+fi
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking types, headers, and functions" >&5
+$as_echo "$as_me: checking types, headers, and functions" >&6;}
+
+# Find the netCDF header and library.
+for ac_header in netcdf.h
+do :
+  ac_fn_c_check_header_mongrel "$LINENO" "netcdf.h" "ac_cv_header_netcdf_h" "$ac_includes_default"
+if test "x$ac_cv_header_netcdf_h" = xyes; then :
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_NETCDF_H 1
+_ACEOF
+
+else
+  as_fn_error $? "netcdf.h could not be found. Please set CPPFLAGS." "$LINENO" 5
+fi
+
+done
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing nc_open" >&5
+$as_echo_n "checking for library containing nc_open... " >&6; }
+if ${ac_cv_search_nc_open+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_func_search_save_LIBS=$LIBS
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char nc_open ();
+int
+main ()
+{
+return nc_open ();
+  ;
+  return 0;
+}
+_ACEOF
+for ac_lib in '' netcdf; do
+  if test -z "$ac_lib"; then
+    ac_res="none required"
+  else
+    ac_res=-l$ac_lib
+    LIBS="-l$ac_lib  $ac_func_search_save_LIBS"
+  fi
+  if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_search_nc_open=$ac_res
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext
+  if ${ac_cv_search_nc_open+:} false; then :
+  break
+fi
+done
+if ${ac_cv_search_nc_open+:} false; then :
+
+else
+  ac_cv_search_nc_open=no
+fi
+rm conftest.$ac_ext
+LIBS=$ac_func_search_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_nc_open" >&5
+$as_echo "$ac_cv_search_nc_open" >&6; }
+ac_res=$ac_cv_search_nc_open
+if test "$ac_res" != no; then :
+  test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"
+
+fi
+
+
+# See if various libraries are available
+for ac_func in nc_def_opaque nccreate nc_set_log_level oc_open nc_use_parallel_enabled
+do :
+  as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
+ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
+if eval test \"x\$"$as_ac_var"\" = x"yes"; then :
+  cat >>confdefs.h <<_ACEOF
+#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+done
+
+#test "x$ac_cv_func_oc_open" = xyes && nc_has_dap=yes || nc_has_dap=no
+# Whether we build/test some functionality depends on what we found in
+# the C library.
+#nc_build_v2=$ac_cv_func_nccreate
+#nc_build_v4=$ac_cv_func_nc_def_opaque
+
+nc_build_v2=no
+nc_build_v4=no
+nc_has_logging=no
+nc_has_dap=no
+nc_has_parallel=no
+
+test "x$ac_cv_func_nc_def_opaque" = xyes && nc_build_v4=yes
+test "x$ac_cv_func_nccreate" = xyes && nc_build_v2=yes
+test "x$ac_cv_func_nc_set_log_level" = xyes && nc_has_logging=yes
+test "x$ac_cv_func_oc_open" = xyes && nc_has_dap=yes
+test "x$ac_cv_func_nc_use_parallel_enabled" = xyes && nc_has_parallel=yes
+
+#AC_CHECK_FUNC([nc_def_opaque],[nc_build_v4=yes])
+#AC_CHECK_FUNC([nccreate],[nc_build_v2=yes])
+#AC_CHECK_FUNC([nc_set_log_level],[nc_has_logging=yes])
+#AC_CHECK_FUNC([oc_open],[nc_has_dap=yes])
+#AC_CHECK_FUNC([nc_use_parallel_enabled],[nc_has_parallel=yes])
+
+if test "x$nc_build_v4" = xyes; then
+
+$as_echo "#define USE_NETCDF4 1" >>confdefs.h
+
+fi
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking netCDF v2 API present" >&5
+$as_echo_n "checking netCDF v2 API present... " >&6; }
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $nc_build_v2" >&5
+$as_echo "$nc_build_v2" >&6; }
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking netCDF-4 present" >&5
+$as_echo_n "checking netCDF-4 present... " >&6; }
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $nc_build_v4" >&5
+$as_echo "$nc_build_v4" >&6; }
+
+ if test "x$nc_build_v4" = xyes; then
+  USE_NETCDF4_TRUE=
+  USE_NETCDF4_FALSE='#'
+else
+  USE_NETCDF4_TRUE='#'
+  USE_NETCDF4_FALSE=
+fi
+
+ if test "x$nc_build_v2" = xyes; then
+  BUILD_V2_TRUE=
+  BUILD_V2_FALSE='#'
+else
+  BUILD_V2_TRUE='#'
+  BUILD_V2_FALSE=
+fi
+
+ if test "x$nc_has_logging" = xyes; then
+  USE_LOGGING_TRUE=
+  USE_LOGGING_FALSE='#'
+else
+  USE_LOGGING_TRUE='#'
+  USE_LOGGING_FALSE=
+fi
+
+ if test "x$nc_has_dap" = xyes; then
+  BUILD_DAP_TRUE=
+  BUILD_DAP_FALSE='#'
+else
+  BUILD_DAP_TRUE='#'
+  BUILD_DAP_FALSE=
+fi
+
+ if test "x$nc_has_parallel" = xyes; then
+  BUILD_PARALLEL_TRUE=
+  BUILD_PARALLEL_FALSE='#'
+else
+  BUILD_PARALLEL_TRUE='#'
+  BUILD_PARALLEL_FALSE=
+fi
+
+ac_fn_c_check_header_mongrel "$LINENO" "stdlib.h" "ac_cv_header_stdlib_h" "$ac_includes_default"
+if test "x$ac_cv_header_stdlib_h" = xyes; then :
+
+else
+
+$as_echo "#define NO_STDLIB_H /**/" >>confdefs.h
+
+fi
+
+
+ac_fn_c_check_header_mongrel "$LINENO" "sys/types.h" "ac_cv_header_sys_types_h" "$ac_includes_default"
+if test "x$ac_cv_header_sys_types_h" = xyes; then :
+
+else
+
+$as_echo "#define NO_SYS_TYPES_H /**/" >>confdefs.h
+
+fi
+
+
+for ac_header in sys/param.h
+do :
+  ac_fn_c_check_header_mongrel "$LINENO" "sys/param.h" "ac_cv_header_sys_param_h" "$ac_includes_default"
+if test "x$ac_cv_header_sys_param_h" = xyes; then :
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_SYS_PARAM_H 1
+_ACEOF
+
+fi
+
+done
+
+#AC_CHECK_HEADERS([locale.h])
+for ac_header in locale.h stdio.h stdarg.h errno.h ctype.h fcntl.h malloc.h stdlib.h string.h \
+			   strings.h unistd.h sys/stat.h getopt.h sys/time.h sys/resource.h
+do :
+  as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
+ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default"
+if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
+  cat >>confdefs.h <<_ACEOF
+#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+ac_header_dirent=no
+for ac_hdr in dirent.h sys/ndir.h sys/dir.h ndir.h; do
+  as_ac_Header=`$as_echo "ac_cv_header_dirent_$ac_hdr" | $as_tr_sh`
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_hdr that defines DIR" >&5
+$as_echo_n "checking for $ac_hdr that defines DIR... " >&6; }
+if eval \${$as_ac_Header+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <sys/types.h>
+#include <$ac_hdr>
+
+int
+main ()
+{
+if ((DIR *) 0)
+return 0;
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  eval "$as_ac_Header=yes"
+else
+  eval "$as_ac_Header=no"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+eval ac_res=\$$as_ac_Header
+	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
+  cat >>confdefs.h <<_ACEOF
+#define `$as_echo "HAVE_$ac_hdr" | $as_tr_cpp` 1
+_ACEOF
+
+ac_header_dirent=$ac_hdr; break
+fi
+
+done
+# Two versions of opendir et al. are in -ldir and -lx on SCO Xenix.
+if test $ac_header_dirent = dirent.h; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing opendir" >&5
+$as_echo_n "checking for library containing opendir... " >&6; }
+if ${ac_cv_search_opendir+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_func_search_save_LIBS=$LIBS
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char opendir ();
+int
+main ()
+{
+return opendir ();
+  ;
+  return 0;
+}
+_ACEOF
+for ac_lib in '' dir; do
+  if test -z "$ac_lib"; then
+    ac_res="none required"
+  else
+    ac_res=-l$ac_lib
+    LIBS="-l$ac_lib  $ac_func_search_save_LIBS"
+  fi
+  if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_search_opendir=$ac_res
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext
+  if ${ac_cv_search_opendir+:} false; then :
+  break
+fi
+done
+if ${ac_cv_search_opendir+:} false; then :
+
+else
+  ac_cv_search_opendir=no
+fi
+rm conftest.$ac_ext
+LIBS=$ac_func_search_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_opendir" >&5
+$as_echo "$ac_cv_search_opendir" >&6; }
+ac_res=$ac_cv_search_opendir
+if test "$ac_res" != no; then :
+  test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"
+
+fi
+
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing opendir" >&5
+$as_echo_n "checking for library containing opendir... " >&6; }
+if ${ac_cv_search_opendir+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_func_search_save_LIBS=$LIBS
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char opendir ();
+int
+main ()
+{
+return opendir ();
+  ;
+  return 0;
+}
+_ACEOF
+for ac_lib in '' x; do
+  if test -z "$ac_lib"; then
+    ac_res="none required"
+  else
+    ac_res=-l$ac_lib
+    LIBS="-l$ac_lib  $ac_func_search_save_LIBS"
+  fi
+  if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_search_opendir=$ac_res
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext
+  if ${ac_cv_search_opendir+:} false; then :
+  break
+fi
+done
+if ${ac_cv_search_opendir+:} false; then :
+
+else
+  ac_cv_search_opendir=no
+fi
+rm conftest.$ac_ext
+LIBS=$ac_func_search_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_opendir" >&5
+$as_echo "$ac_cv_search_opendir" >&6; }
+ac_res=$ac_cv_search_opendir
+if test "$ac_res" != no; then :
+  test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"
+
+fi
+
+fi
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5
+$as_echo_n "checking for ANSI C header files... " >&6; }
+if ${ac_cv_header_stdc+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <stdlib.h>
+#include <stdarg.h>
+#include <string.h>
+#include <float.h>
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_header_stdc=yes
+else
+  ac_cv_header_stdc=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+
+if test $ac_cv_header_stdc = yes; then
+  # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <string.h>
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "memchr" >/dev/null 2>&1; then :
+
+else
+  ac_cv_header_stdc=no
+fi
+rm -f conftest*
+
+fi
+
+if test $ac_cv_header_stdc = yes; then
+  # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <stdlib.h>
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "free" >/dev/null 2>&1; then :
+
+else
+  ac_cv_header_stdc=no
+fi
+rm -f conftest*
+
+fi
+
+if test $ac_cv_header_stdc = yes; then
+  # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.
+  if test "$cross_compiling" = yes; then :
+  :
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <ctype.h>
+#include <stdlib.h>
+#if ((' ' & 0x0FF) == 0x020)
+# define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
+# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
+#else
+# define ISLOWER(c) \
+		   (('a' <= (c) && (c) <= 'i') \
+		     || ('j' <= (c) && (c) <= 'r') \
+		     || ('s' <= (c) && (c) <= 'z'))
+# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c))
+#endif
+
+#define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))
+int
+main ()
+{
+  int i;
+  for (i = 0; i < 256; i++)
+    if (XOR (islower (i), ISLOWER (i))
+	|| toupper (i) != TOUPPER (i))
+      return 2;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"; then :
+
+else
+  ac_cv_header_stdc=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5
+$as_echo "$ac_cv_header_stdc" >&6; }
+if test $ac_cv_header_stdc = yes; then
+
+$as_echo "#define STDC_HEADERS 1" >>confdefs.h
+
+fi
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for sys/wait.h that is POSIX.1 compatible" >&5
+$as_echo_n "checking for sys/wait.h that is POSIX.1 compatible... " >&6; }
+if ${ac_cv_header_sys_wait_h+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <sys/types.h>
+#include <sys/wait.h>
+#ifndef WEXITSTATUS
+# define WEXITSTATUS(stat_val) ((unsigned int) (stat_val) >> 8)
+#endif
+#ifndef WIFEXITED
+# define WIFEXITED(stat_val) (((stat_val) & 255) == 0)
+#endif
+
+int
+main ()
+{
+  int s;
+  wait (&s);
+  s = WIFEXITED (s) ? WEXITSTATUS (s) : 1;
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_header_sys_wait_h=yes
+else
+  ac_cv_header_sys_wait_h=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_sys_wait_h" >&5
+$as_echo "$ac_cv_header_sys_wait_h" >&6; }
+if test $ac_cv_header_sys_wait_h = yes; then
+
+$as_echo "#define HAVE_SYS_WAIT_H 1" >>confdefs.h
+
+fi
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether time.h and sys/time.h may both be included" >&5
+$as_echo_n "checking whether time.h and sys/time.h may both be included... " >&6; }
+if ${ac_cv_header_time+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <sys/types.h>
+#include <sys/time.h>
+#include <time.h>
+
+int
+main ()
+{
+if ((struct tm *) 0)
+return 0;
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_header_time=yes
+else
+  ac_cv_header_time=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_time" >&5
+$as_echo "$ac_cv_header_time" >&6; }
+if test $ac_cv_header_time = yes; then
+
+$as_echo "#define TIME_WITH_SYS_TIME 1" >>confdefs.h
+
+fi
+
+
+for ac_func in vprintf
+do :
+  ac_fn_c_check_func "$LINENO" "vprintf" "ac_cv_func_vprintf"
+if test "x$ac_cv_func_vprintf" = xyes; then :
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_VPRINTF 1
+_ACEOF
+
+ac_fn_c_check_func "$LINENO" "_doprnt" "ac_cv_func__doprnt"
+if test "x$ac_cv_func__doprnt" = xyes; then :
+
+$as_echo "#define HAVE_DOPRNT 1" >>confdefs.h
+
+fi
+
+fi
+done
+
+
+
+# Check for <stdbool.h> that conforms to C99 requirements
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for stdbool.h that conforms to C99" >&5
+$as_echo_n "checking for stdbool.h that conforms to C99... " >&6; }
+if ${ac_cv_header_stdbool_h+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+             #include <stdbool.h>
+             #ifndef bool
+              "error: bool is not defined"
+             #endif
+             #ifndef false
+              "error: false is not defined"
+             #endif
+             #if false
+              "error: false is not 0"
+             #endif
+             #ifndef true
+              "error: true is not defined"
+             #endif
+             #if true != 1
+              "error: true is not 1"
+             #endif
+             #ifndef __bool_true_false_are_defined
+              "error: __bool_true_false_are_defined is not defined"
+             #endif
+
+             struct s { _Bool s: 1; _Bool t; } s;
+
+             char a[true == 1 ? 1 : -1];
+             char b[false == 0 ? 1 : -1];
+             char c[__bool_true_false_are_defined == 1 ? 1 : -1];
+             char d[(bool) 0.5 == true ? 1 : -1];
+             /* See body of main program for 'e'.  */
+             char f[(_Bool) 0.0 == false ? 1 : -1];
+             char g[true];
+             char h[sizeof (_Bool)];
+             char i[sizeof s.t];
+             enum { j = false, k = true, l = false * true, m = true * 256 };
+             /* The following fails for
+                HP aC++/ANSI C B3910B A.05.55 [Dec 04 2003]. */
+             _Bool n[m];
+             char o[sizeof n == m * sizeof n[0] ? 1 : -1];
+             char p[-1 - (_Bool) 0 < 0 && -1 - (bool) 0 < 0 ? 1 : -1];
+             /* Catch a bug in an HP-UX C compiler.  See
+                http://gcc.gnu.org/ml/gcc-patches/2003-12/msg02303.html
+                http://lists.gnu.org/archive/html/bug-coreutils/2005-11/msg00161.html
+              */
+             _Bool q = true;
+             _Bool *pq = &q;
+
+int
+main ()
+{
+
+             bool e = &s;
+             *pq |= q;
+             *pq |= ! q;
+             /* Refer to every declared value, to avoid compiler optimizations.  */
+             return (!a + !b + !c + !d + !e + !f + !g + !h + !i + !!j + !k + !!l
+                     + !m + !n + !o + !p + !q + !pq);
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_header_stdbool_h=yes
+else
+  ac_cv_header_stdbool_h=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdbool_h" >&5
+$as_echo "$ac_cv_header_stdbool_h" >&6; }
+   ac_fn_c_check_type "$LINENO" "_Bool" "ac_cv_type__Bool" "$ac_includes_default"
+if test "x$ac_cv_type__Bool" = xyes; then :
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE__BOOL 1
+_ACEOF
+
+
+fi
+
+
+if test $ac_cv_header_stdbool_h = yes; then
+
+$as_echo "#define HAVE_STDBOOL_H 1" >>confdefs.h
+
+fi
+
+
+# Check for these functions...
+#AC_CHECK_FUNCS([strlcat strerror snprintf strchr strrchr mktemp strcat strcpy strdup \
+#			strcasecmp strtod strtoll strtoull getrlimit gettimeofday fsync MPI_Comm_f2c])
+ac_fn_c_check_type "$LINENO" "size_t" "ac_cv_type_size_t" "$ac_includes_default"
+if test "x$ac_cv_type_size_t" = xyes; then :
+
+else
+
+cat >>confdefs.h <<_ACEOF
+#define size_t unsigned int
+_ACEOF
+
+fi
+
+# The Ultrix 4.2 mips builtin alloca declared by alloca.h only works
+# for constant arguments.  Useless!
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for working alloca.h" >&5
+$as_echo_n "checking for working alloca.h... " >&6; }
+if ${ac_cv_working_alloca_h+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <alloca.h>
+int
+main ()
+{
+char *p = (char *) alloca (2 * sizeof (int));
+			  if (p) return 0;
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_working_alloca_h=yes
+else
+  ac_cv_working_alloca_h=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_working_alloca_h" >&5
+$as_echo "$ac_cv_working_alloca_h" >&6; }
+if test $ac_cv_working_alloca_h = yes; then
+
+$as_echo "#define HAVE_ALLOCA_H 1" >>confdefs.h
+
+fi
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for alloca" >&5
+$as_echo_n "checking for alloca... " >&6; }
+if ${ac_cv_func_alloca_works+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#ifdef __GNUC__
+# define alloca __builtin_alloca
+#else
+# ifdef _MSC_VER
+#  include <malloc.h>
+#  define alloca _alloca
+# else
+#  ifdef HAVE_ALLOCA_H
+#   include <alloca.h>
+#  else
+#   ifdef _AIX
+ #pragma alloca
+#   else
+#    ifndef alloca /* predefined by HP cc +Olibcalls */
+void *alloca (size_t);
+#    endif
+#   endif
+#  endif
+# endif
+#endif
+
+int
+main ()
+{
+char *p = (char *) alloca (1);
+				    if (p) return 0;
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_func_alloca_works=yes
+else
+  ac_cv_func_alloca_works=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_alloca_works" >&5
+$as_echo "$ac_cv_func_alloca_works" >&6; }
+
+if test $ac_cv_func_alloca_works = yes; then
+
+$as_echo "#define HAVE_ALLOCA 1" >>confdefs.h
+
+else
+  # The SVR3 libPW and SVR4 libucb both contain incompatible functions
+# that cause trouble.  Some versions do not even contain alloca or
+# contain a buggy version.  If you still want to use their alloca,
+# use ar to extract alloca.o from them instead of compiling alloca.c.
+
+ALLOCA=\${LIBOBJDIR}alloca.$ac_objext
+
+$as_echo "#define C_ALLOCA 1" >>confdefs.h
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether \`alloca.c' needs Cray hooks" >&5
+$as_echo_n "checking whether \`alloca.c' needs Cray hooks... " >&6; }
+if ${ac_cv_os_cray+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#if defined CRAY && ! defined CRAY2
+webecray
+#else
+wenotbecray
+#endif
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "webecray" >/dev/null 2>&1; then :
+  ac_cv_os_cray=yes
+else
+  ac_cv_os_cray=no
+fi
+rm -f conftest*
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_os_cray" >&5
+$as_echo "$ac_cv_os_cray" >&6; }
+if test $ac_cv_os_cray = yes; then
+  for ac_func in _getb67 GETB67 getb67; do
+    as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
+ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
+if eval test \"x\$"$as_ac_var"\" = x"yes"; then :
+
+cat >>confdefs.h <<_ACEOF
+#define CRAY_STACKSEG_END $ac_func
+_ACEOF
+
+    break
+fi
+
+  done
+fi
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking stack direction for C alloca" >&5
+$as_echo_n "checking stack direction for C alloca... " >&6; }
+if ${ac_cv_c_stack_direction+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test "$cross_compiling" = yes; then :
+  ac_cv_c_stack_direction=0
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$ac_includes_default
+int
+find_stack_direction (int *addr, int depth)
+{
+  int dir, dummy = 0;
+  if (! addr)
+    addr = &dummy;
+  *addr = addr < &dummy ? 1 : addr == &dummy ? 0 : -1;
+  dir = depth ? find_stack_direction (addr, depth - 1) : 0;
+  return dir + dummy;
+}
+
+int
+main (int argc, char **argv)
+{
+  return find_stack_direction (0, argc + !argv + 20) < 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"; then :
+  ac_cv_c_stack_direction=1
+else
+  ac_cv_c_stack_direction=-1
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_stack_direction" >&5
+$as_echo "$ac_cv_c_stack_direction" >&6; }
+cat >>confdefs.h <<_ACEOF
+#define STACK_DIRECTION $ac_cv_c_stack_direction
+_ACEOF
+
+
+fi
+
+#AC_CHECK_DECLS([isnan, isinf, isfinite, signbit],,,[#include <math.h>])
+#AC_STRUCT_ST_BLKSIZE
+#UD_CHECK_IEEE
+ac_fn_c_check_type "$LINENO" "size_t" "ac_cv_type_size_t" "$ac_includes_default"
+if test "x$ac_cv_type_size_t" = xyes; then :
+
+else
+
+cat >>confdefs.h <<_ACEOF
+#define size_t unsigned int
+_ACEOF
+
+fi
+
+ac_fn_c_check_type "$LINENO" "off_t" "ac_cv_type_off_t" "$ac_includes_default"
+if test "x$ac_cv_type_off_t" = xyes; then :
+
+else
+
+cat >>confdefs.h <<_ACEOF
+#define off_t long int
+_ACEOF
+
+fi
+
+ac_fn_c_check_type "$LINENO" "ssize_t" "ac_cv_type_ssize_t" "$ac_includes_default"
+if test "x$ac_cv_type_ssize_t" = xyes; then :
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_SSIZE_T 1
+_ACEOF
+
+
+fi
+ac_fn_c_check_type "$LINENO" "ptrdiff_t" "ac_cv_type_ptrdiff_t" "$ac_includes_default"
+if test "x$ac_cv_type_ptrdiff_t" = xyes; then :
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_PTRDIFF_T 1
+_ACEOF
+
+
+fi
+ac_fn_c_check_type "$LINENO" "uchar" "ac_cv_type_uchar" "$ac_includes_default"
+if test "x$ac_cv_type_uchar" = xyes; then :
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_UCHAR 1
+_ACEOF
+
+
+fi
+ac_fn_c_check_type "$LINENO" "longlong" "ac_cv_type_longlong" "$ac_includes_default"
+if test "x$ac_cv_type_longlong" = xyes; then :
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_LONGLONG 1
+_ACEOF
+
+
+fi
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether char is unsigned" >&5
+$as_echo_n "checking whether char is unsigned... " >&6; }
+if ${ac_cv_c_char_unsigned+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !(((char) -1) < 0)];
+test_array [0] = 0;
+return test_array [0];
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_c_char_unsigned=no
+else
+  ac_cv_c_char_unsigned=yes
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_char_unsigned" >&5
+$as_echo "$ac_cv_c_char_unsigned" >&6; }
+if test $ac_cv_c_char_unsigned = yes && test "$GCC" != yes; then
+  $as_echo "#define __CHAR_UNSIGNED__ 1" >>confdefs.h
+
+fi
+
+#AC_C_BIGENDIAN
+# The cast to long int works around a bug in the HP C Compiler
+# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
+# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
+# This bug is HP SR number 8606223364.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of short" >&5
+$as_echo_n "checking size of short... " >&6; }
+if ${ac_cv_sizeof_short+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (short))" "ac_cv_sizeof_short"        "$ac_includes_default"; then :
+
+else
+  if test "$ac_cv_type_short" = yes; then
+     { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error 77 "cannot compute sizeof (short)
+See \`config.log' for more details" "$LINENO" 5; }
+   else
+     ac_cv_sizeof_short=0
+   fi
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_short" >&5
+$as_echo "$ac_cv_sizeof_short" >&6; }
+
+
+
+cat >>confdefs.h <<_ACEOF
+#define SIZEOF_SHORT $ac_cv_sizeof_short
+_ACEOF
+
+
+# The cast to long int works around a bug in the HP C Compiler
+# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
+# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
+# This bug is HP SR number 8606223364.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of int" >&5
+$as_echo_n "checking size of int... " >&6; }
+if ${ac_cv_sizeof_int+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (int))" "ac_cv_sizeof_int"        "$ac_includes_default"; then :
+
+else
+  if test "$ac_cv_type_int" = yes; then
+     { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error 77 "cannot compute sizeof (int)
+See \`config.log' for more details" "$LINENO" 5; }
+   else
+     ac_cv_sizeof_int=0
+   fi
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_int" >&5
+$as_echo "$ac_cv_sizeof_int" >&6; }
+
+
+
+cat >>confdefs.h <<_ACEOF
+#define SIZEOF_INT $ac_cv_sizeof_int
+_ACEOF
+
+
+# The cast to long int works around a bug in the HP C Compiler
+# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
+# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
+# This bug is HP SR number 8606223364.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of long" >&5
+$as_echo_n "checking size of long... " >&6; }
+if ${ac_cv_sizeof_long+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (long))" "ac_cv_sizeof_long"        "$ac_includes_default"; then :
+
+else
+  if test "$ac_cv_type_long" = yes; then
+     { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error 77 "cannot compute sizeof (long)
+See \`config.log' for more details" "$LINENO" 5; }
+   else
+     ac_cv_sizeof_long=0
+   fi
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_long" >&5
+$as_echo "$ac_cv_sizeof_long" >&6; }
+
+
+
+cat >>confdefs.h <<_ACEOF
+#define SIZEOF_LONG $ac_cv_sizeof_long
+_ACEOF
+
+
+# The cast to long int works around a bug in the HP C Compiler
+# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
+# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
+# This bug is HP SR number 8606223364.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of float" >&5
+$as_echo_n "checking size of float... " >&6; }
+if ${ac_cv_sizeof_float+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (float))" "ac_cv_sizeof_float"        "$ac_includes_default"; then :
+
+else
+  if test "$ac_cv_type_float" = yes; then
+     { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error 77 "cannot compute sizeof (float)
+See \`config.log' for more details" "$LINENO" 5; }
+   else
+     ac_cv_sizeof_float=0
+   fi
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_float" >&5
+$as_echo "$ac_cv_sizeof_float" >&6; }
+
+
+
+cat >>confdefs.h <<_ACEOF
+#define SIZEOF_FLOAT $ac_cv_sizeof_float
+_ACEOF
+
+
+# The cast to long int works around a bug in the HP C Compiler
+# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
+# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
+# This bug is HP SR number 8606223364.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of double" >&5
+$as_echo_n "checking size of double... " >&6; }
+if ${ac_cv_sizeof_double+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (double))" "ac_cv_sizeof_double"        "$ac_includes_default"; then :
+
+else
+  if test "$ac_cv_type_double" = yes; then
+     { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error 77 "cannot compute sizeof (double)
+See \`config.log' for more details" "$LINENO" 5; }
+   else
+     ac_cv_sizeof_double=0
+   fi
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_double" >&5
+$as_echo "$ac_cv_sizeof_double" >&6; }
+
+
+
+cat >>confdefs.h <<_ACEOF
+#define SIZEOF_DOUBLE $ac_cv_sizeof_double
+_ACEOF
+
+
+# The cast to long int works around a bug in the HP C Compiler
+# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
+# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
+# This bug is HP SR number 8606223364.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of off_t" >&5
+$as_echo_n "checking size of off_t... " >&6; }
+if ${ac_cv_sizeof_off_t+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (off_t))" "ac_cv_sizeof_off_t"        "$ac_includes_default"; then :
+
+else
+  if test "$ac_cv_type_off_t" = yes; then
+     { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error 77 "cannot compute sizeof (off_t)
+See \`config.log' for more details" "$LINENO" 5; }
+   else
+     ac_cv_sizeof_off_t=0
+   fi
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_off_t" >&5
+$as_echo "$ac_cv_sizeof_off_t" >&6; }
+
+
+
+cat >>confdefs.h <<_ACEOF
+#define SIZEOF_OFF_T $ac_cv_sizeof_off_t
+_ACEOF
+
+
+# The cast to long int works around a bug in the HP C Compiler
+# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
+# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
+# This bug is HP SR number 8606223364.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of size_t" >&5
+$as_echo_n "checking size of size_t... " >&6; }
+if ${ac_cv_sizeof_size_t+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (size_t))" "ac_cv_sizeof_size_t"        "$ac_includes_default"; then :
+
+else
+  if test "$ac_cv_type_size_t" = yes; then
+     { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error 77 "cannot compute sizeof (size_t)
+See \`config.log' for more details" "$LINENO" 5; }
+   else
+     ac_cv_sizeof_size_t=0
+   fi
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_size_t" >&5
+$as_echo "$ac_cv_sizeof_size_t" >&6; }
+
+
+
+cat >>confdefs.h <<_ACEOF
+#define SIZEOF_SIZE_T $ac_cv_sizeof_size_t
+_ACEOF
+
+
+# The cast to long int works around a bug in the HP C Compiler
+# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
+# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
+# This bug is HP SR number 8606223364.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of ptrdiff_t" >&5
+$as_echo_n "checking size of ptrdiff_t... " >&6; }
+if ${ac_cv_sizeof_ptrdiff_t+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (ptrdiff_t))" "ac_cv_sizeof_ptrdiff_t"        "$ac_includes_default"; then :
+
+else
+  if test "$ac_cv_type_ptrdiff_t" = yes; then
+     { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error 77 "cannot compute sizeof (ptrdiff_t)
+See \`config.log' for more details" "$LINENO" 5; }
+   else
+     ac_cv_sizeof_ptrdiff_t=0
+   fi
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_ptrdiff_t" >&5
+$as_echo "$ac_cv_sizeof_ptrdiff_t" >&6; }
+
+
+
+cat >>confdefs.h <<_ACEOF
+#define SIZEOF_PTRDIFF_T $ac_cv_sizeof_ptrdiff_t
+_ACEOF
+
+
+if ac_fn_c_compute_int "$LINENO" "sizeof(long long) == sizeof(long)" "longlong_is_long"        ""; then :
+
+else
+  longlong_is_long=0
+fi
+
+if test $longlong_is_long = 1; then
+   CFLAGS="$CFLAGS -DLONGLONG_IS_LONG"
+fi
+
+# Automake conditionals need to be called, whether the answer is yes
+# or no.
+ if test "x$enable_parallel_tests" = xyes; then
+  TEST_PARALLEL_TRUE=
+  TEST_PARALLEL_FALSE='#'
+else
+  TEST_PARALLEL_TRUE='#'
+  TEST_PARALLEL_FALSE=
+fi
+
+ if test "x$enable_valgrind_tests" = xyes; then
+  USE_VALGRIND_TESTS_TRUE=
+  USE_VALGRIND_TESTS_FALSE='#'
+else
+  USE_VALGRIND_TESTS_TRUE='#'
+  USE_VALGRIND_TESTS_FALSE=
+fi
+
+
+# Flags for nf-config script; by design $prefix, $includir, $libdir,
+# etc.  are left as shell variables in the script so as to facilitate
+# relocation
+NC_LIBS="-lnetcdf"
+NC_LIBS="$LDFLAGS $NC_LIBS $LIBS"
+
+case "x$target_os" in
+xsolaris*)
+  NEWNCLIBS=""
+  for x in $NC_LIBS ; do
+    case "$x" in
+    -L*) r=`echo "$x" | sed -e 's|^-L|-R|'`
+	 NEWNCLIBS="$NEWNCLIBS $x $r"
+	 ;;
+    *)	 NEWNCLIBS="$NEWNCLIBS $x" ;;
+    esac
+  done
+  NC_LIBS="$NEWNCLIBS"
+  ;;
+*);;
+esac
+
+NC_FLIBS="-lnetcdff $NC_LIBS"
+
+NC_LIBS=$NC_LIBS
+
+NC_FLIBS=$NC_FLIBS
+
+HAS_F90=$nc_build_f90
+
+HAS_F03=$nc_build_f03
+
+HAS_DAP=$nc_has_dap
+
+HAS_NC2=$nc_build_v2
+
+HAS_NC4=$nc_build_v4
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: generating header files and makefiles" >&5
+$as_echo "$as_me: generating header files and makefiles" >&6;}
+
+# We will output a fortran inc file, nfconfig.inc.
+ac_config_headers="$ac_config_headers config.h"
+
+ac_config_headers="$ac_config_headers libsrc/nfconfig1.inc:libsrc/nfconfig.in"
+
+
+ac_config_files="$ac_config_files Makefile nf-config netcdf-fortran.pc docs/Makefile libsrc/Makefile fortran/Makefile nf_test/Makefile nf03_test/Makefile CMakeExtras/Makefile examples/Makefile examples/F90/Makefile examples/F77/Makefile"
+
+
+cat >confcache <<\_ACEOF
+# This file is a shell script that caches the results of configure
+# tests run on this system so they can be shared between configure
+# scripts and configure runs, see configure's option --config-cache.
+# It is not useful on other systems.  If it contains results you don't
+# want to keep, you may remove or edit it.
+#
+# config.status only pays attention to the cache file if you give it
+# the --recheck option to rerun configure.
+#
+# `ac_cv_env_foo' variables (set or unset) will be overridden when
+# loading this file, other *unset* `ac_cv_foo' will be assigned the
+# following values.
+
+_ACEOF
+
+# The following way of writing the cache mishandles newlines in values,
+# but we know of no workaround that is simple, portable, and efficient.
+# So, we kill variables containing newlines.
+# Ultrix sh set writes to stderr and can't be redirected directly,
+# and sets the high bit in the cache file unless we assign to the vars.
+(
+  for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do
+    eval ac_val=\$$ac_var
+    case $ac_val in #(
+    *${as_nl}*)
+      case $ac_var in #(
+      *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
+$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
+      esac
+      case $ac_var in #(
+      _ | IFS | as_nl) ;; #(
+      BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(
+      *) { eval $ac_var=; unset $ac_var;} ;;
+      esac ;;
+    esac
+  done
+
+  (set) 2>&1 |
+    case $as_nl`(ac_space=' '; set) 2>&1` in #(
+    *${as_nl}ac_space=\ *)
+      # `set' does not quote correctly, so add quotes: double-quote
+      # substitution turns \\\\ into \\, and sed turns \\ into \.
+      sed -n \
+	"s/'/'\\\\''/g;
+	  s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p"
+      ;; #(
+    *)
+      # `set' quotes correctly as required by POSIX, so do not add quotes.
+      sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
+      ;;
+    esac |
+    sort
+) |
+  sed '
+     /^ac_cv_env_/b end
+     t clear
+     :clear
+     s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/
+     t end
+     s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/
+     :end' >>confcache
+if diff "$cache_file" confcache >/dev/null 2>&1; then :; else
+  if test -w "$cache_file"; then
+    if test "x$cache_file" != "x/dev/null"; then
+      { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5
+$as_echo "$as_me: updating cache $cache_file" >&6;}
+      if test ! -f "$cache_file" || test -h "$cache_file"; then
+	cat confcache >"$cache_file"
+      else
+        case $cache_file in #(
+        */* | ?:*)
+	  mv -f confcache "$cache_file"$$ &&
+	  mv -f "$cache_file"$$ "$cache_file" ;; #(
+        *)
+	  mv -f confcache "$cache_file" ;;
+	esac
+      fi
+    fi
+  else
+    { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5
+$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;}
+  fi
+fi
+rm -f confcache
+
+test "x$prefix" = xNONE && prefix=$ac_default_prefix
+# Let make expand exec_prefix.
+test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
+
+DEFS=-DHAVE_CONFIG_H
+
+ac_libobjs=
+ac_ltlibobjs=
+U=
+for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue
+  # 1. Remove the extension, and $U if already installed.
+  ac_script='s/\$U\././;s/\.o$//;s/\.obj$//'
+  ac_i=`$as_echo "$ac_i" | sed "$ac_script"`
+  # 2. Prepend LIBOBJDIR.  When used with automake>=1.10 LIBOBJDIR
+  #    will be set to the directory where LIBOBJS objects are built.
+  as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext"
+  as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo'
+done
+LIBOBJS=$ac_libobjs
+
+LTLIBOBJS=$ac_ltlibobjs
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking that generated files are newer than configure" >&5
+$as_echo_n "checking that generated files are newer than configure... " >&6; }
+   if test -n "$am_sleep_pid"; then
+     # Hide warnings about reused PIDs.
+     wait $am_sleep_pid 2>/dev/null
+   fi
+   { $as_echo "$as_me:${as_lineno-$LINENO}: result: done" >&5
+$as_echo "done" >&6; }
+ if test -n "$EXEEXT"; then
+  am__EXEEXT_TRUE=
+  am__EXEEXT_FALSE='#'
+else
+  am__EXEEXT_TRUE='#'
+  am__EXEEXT_FALSE=
+fi
+
+if test -z "${MAINTAINER_MODE_TRUE}" && test -z "${MAINTAINER_MODE_FALSE}"; then
+  as_fn_error $? "conditional \"MAINTAINER_MODE\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${EXTRA_TESTS_TRUE}" && test -z "${EXTRA_TESTS_FALSE}"; then
+  as_fn_error $? "conditional \"EXTRA_TESTS\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${BUILD_DOCS_TRUE}" && test -z "${BUILD_DOCS_FALSE}"; then
+  as_fn_error $? "conditional \"BUILD_DOCS\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then
+  as_fn_error $? "conditional \"AMDEP\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then
+  as_fn_error $? "conditional \"am__fastdepCC\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${LARGE_FILE_TESTS_TRUE}" && test -z "${LARGE_FILE_TESTS_FALSE}"; then
+  as_fn_error $? "conditional \"LARGE_FILE_TESTS\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${BUILD_BENCHMARKS_TRUE}" && test -z "${BUILD_BENCHMARKS_FALSE}"; then
+  as_fn_error $? "conditional \"BUILD_BENCHMARKS\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${BUILD_F03_TRUE}" && test -z "${BUILD_F03_FALSE}"; then
+  as_fn_error $? "conditional \"BUILD_F03\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${USING_PGI_TRUE}" && test -z "${USING_PGI_FALSE}"; then
+  as_fn_error $? "conditional \"USING_PGI\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${UPPER_CASE_MOD_TRUE}" && test -z "${UPPER_CASE_MOD_FALSE}"; then
+  as_fn_error $? "conditional \"UPPER_CASE_MOD\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${EXTRA_EXAMPLE_TESTS_TRUE}" && test -z "${EXTRA_EXAMPLE_TESTS_FALSE}"; then
+  as_fn_error $? "conditional \"EXTRA_EXAMPLE_TESTS\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${BUILD_DLL_TRUE}" && test -z "${BUILD_DLL_FALSE}"; then
+  as_fn_error $? "conditional \"BUILD_DLL\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${USE_NETCDF4_TRUE}" && test -z "${USE_NETCDF4_FALSE}"; then
+  as_fn_error $? "conditional \"USE_NETCDF4\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${BUILD_V2_TRUE}" && test -z "${BUILD_V2_FALSE}"; then
+  as_fn_error $? "conditional \"BUILD_V2\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${USE_LOGGING_TRUE}" && test -z "${USE_LOGGING_FALSE}"; then
+  as_fn_error $? "conditional \"USE_LOGGING\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${BUILD_DAP_TRUE}" && test -z "${BUILD_DAP_FALSE}"; then
+  as_fn_error $? "conditional \"BUILD_DAP\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${BUILD_PARALLEL_TRUE}" && test -z "${BUILD_PARALLEL_FALSE}"; then
+  as_fn_error $? "conditional \"BUILD_PARALLEL\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${TEST_PARALLEL_TRUE}" && test -z "${TEST_PARALLEL_FALSE}"; then
+  as_fn_error $? "conditional \"TEST_PARALLEL\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${USE_VALGRIND_TESTS_TRUE}" && test -z "${USE_VALGRIND_TESTS_FALSE}"; then
+  as_fn_error $? "conditional \"USE_VALGRIND_TESTS\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+
+: "${CONFIG_STATUS=./config.status}"
+ac_write_fail=0
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files $CONFIG_STATUS"
+{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5
+$as_echo "$as_me: creating $CONFIG_STATUS" >&6;}
+as_write_fail=0
+cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1
+#! $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}
+export SHELL
+_ASEOF
+cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1
+## -------------------- ##
+## M4sh Initialization. ##
+## -------------------- ##
+
+# Be more Bourne compatible
+DUALCASE=1; export DUALCASE # for MKS sh
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then :
+  emulate sh
+  NULLCMD=:
+  # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '${1+"$@"}'='"$@"'
+  setopt NO_GLOB_SUBST
+else
+  case `(set -o) 2>/dev/null` in #(
+  *posix*) :
+    set -o posix ;; #(
+  *) :
+     ;;
+esac
+fi
+
+
+as_nl='
+'
+export as_nl
+# Printing a long string crashes Solaris 7 /usr/bin/printf.
+as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo
+# Prefer a ksh shell builtin over an external printf program on Solaris,
+# but without wasting forks for bash or zsh.
+if test -z "$BASH_VERSION$ZSH_VERSION" \
+    && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then
+  as_echo='print -r --'
+  as_echo_n='print -rn --'
+elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then
+  as_echo='printf %s\n'
+  as_echo_n='printf %s'
+else
+  if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then
+    as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"'
+    as_echo_n='/usr/ucb/echo -n'
+  else
+    as_echo_body='eval expr "X$1" : "X\\(.*\\)"'
+    as_echo_n_body='eval
+      arg=$1;
+      case $arg in #(
+      *"$as_nl"*)
+	expr "X$arg" : "X\\(.*\\)$as_nl";
+	arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;;
+      esac;
+      expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl"
+    '
+    export as_echo_n_body
+    as_echo_n='sh -c $as_echo_n_body as_echo'
+  fi
+  export as_echo_body
+  as_echo='sh -c $as_echo_body as_echo'
+fi
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+  PATH_SEPARATOR=:
+  (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
+    (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
+      PATH_SEPARATOR=';'
+  }
+fi
+
+
+# IFS
+# We need space, tab and new line, in precisely that order.  Quoting is
+# there to prevent editors from complaining about space-tab.
+# (If _AS_PATH_WALK were called with IFS unset, it would disable word
+# splitting by setting IFS to empty value.)
+IFS=" ""	$as_nl"
+
+# Find who we are.  Look in the path if we contain no directory separator.
+as_myself=
+case $0 in #((
+  *[\\/]* ) as_myself=$0 ;;
+  *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+  done
+IFS=$as_save_IFS
+
+     ;;
+esac
+# We did not find ourselves, most probably we were run as `sh COMMAND'
+# in which case we are not to be found in the path.
+if test "x$as_myself" = x; then
+  as_myself=$0
+fi
+if test ! -f "$as_myself"; then
+  $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+  exit 1
+fi
+
+# Unset variables that we do not need and which cause bugs (e.g. in
+# pre-3.0 UWIN ksh).  But do not cause bugs in bash 2.01; the "|| exit 1"
+# suppresses any "Segmentation fault" message there.  '((' could
+# trigger a bug in pdksh 5.2.14.
+for as_var in BASH_ENV ENV MAIL MAILPATH
+do eval test x\${$as_var+set} = xset \
+  && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
+done
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+LC_ALL=C
+export LC_ALL
+LANGUAGE=C
+export LANGUAGE
+
+# CDPATH.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+
+# as_fn_error STATUS ERROR [LINENO LOG_FD]
+# ----------------------------------------
+# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are
+# provided, also output the error to LOG_FD, referencing LINENO. Then exit the
+# script with STATUS, using 1 if that was 0.
+as_fn_error ()
+{
+  as_status=$1; test $as_status -eq 0 && as_status=1
+  if test "$4"; then
+    as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+    $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
+  fi
+  $as_echo "$as_me: error: $2" >&2
+  as_fn_exit $as_status
+} # as_fn_error
+
+
+# as_fn_set_status STATUS
+# -----------------------
+# Set $? to STATUS, without forking.
+as_fn_set_status ()
+{
+  return $1
+} # as_fn_set_status
+
+# as_fn_exit STATUS
+# -----------------
+# Exit the shell with STATUS, even in a "trap 0" or "set -e" context.
+as_fn_exit ()
+{
+  set +e
+  as_fn_set_status $1
+  exit $1
+} # as_fn_exit
+
+# as_fn_unset VAR
+# ---------------
+# Portably unset VAR.
+as_fn_unset ()
+{
+  { eval $1=; unset $1;}
+}
+as_unset=as_fn_unset
+# as_fn_append VAR VALUE
+# ----------------------
+# Append the text in VALUE to the end of the definition contained in VAR. Take
+# advantage of any shell optimizations that allow amortized linear growth over
+# repeated appends, instead of the typical quadratic growth present in naive
+# implementations.
+if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then :
+  eval 'as_fn_append ()
+  {
+    eval $1+=\$2
+  }'
+else
+  as_fn_append ()
+  {
+    eval $1=\$$1\$2
+  }
+fi # as_fn_append
+
+# as_fn_arith ARG...
+# ------------------
+# Perform arithmetic evaluation on the ARGs, and store the result in the
+# global $as_val. Take advantage of shells that can avoid forks. The arguments
+# must be portable across $(()) and expr.
+if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then :
+  eval 'as_fn_arith ()
+  {
+    as_val=$(( $* ))
+  }'
+else
+  as_fn_arith ()
+  {
+    as_val=`expr "$@" || test $? -eq 1`
+  }
+fi # as_fn_arith
+
+
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+   test "X`expr 00001 : '.*\(...\)'`" = X001; then
+  as_expr=expr
+else
+  as_expr=false
+fi
+
+if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
+  as_basename=basename
+else
+  as_basename=false
+fi
+
+if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
+  as_dirname=dirname
+else
+  as_dirname=false
+fi
+
+as_me=`$as_basename -- "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+	 X"$0" : 'X\(//\)$' \| \
+	 X"$0" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X/"$0" |
+    sed '/^.*\/\([^/][^/]*\)\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\/\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\/\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+
+# 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
+
+ECHO_C= ECHO_N= ECHO_T=
+case `echo -n x` in #(((((
+-n*)
+  case `echo 'xy\c'` in
+  *c*) ECHO_T='	';;	# ECHO_T is single tab character.
+  xy)  ECHO_C='\c';;
+  *)   echo `echo ksh88 bug on AIX 6.1` > /dev/null
+       ECHO_T='	';;
+  esac;;
+*)
+  ECHO_N='-n';;
+esac
+
+rm -f conf$$ conf$$.exe conf$$.file
+if test -d conf$$.dir; then
+  rm -f conf$$.dir/conf$$.file
+else
+  rm -f conf$$.dir
+  mkdir conf$$.dir 2>/dev/null
+fi
+if (echo >conf$$.file) 2>/dev/null; then
+  if ln -s conf$$.file conf$$ 2>/dev/null; then
+    as_ln_s='ln -s'
+    # ... but there are two gotchas:
+    # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
+    # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
+    # In both cases, we have to default to `cp -pR'.
+    ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
+      as_ln_s='cp -pR'
+  elif ln conf$$.file conf$$ 2>/dev/null; then
+    as_ln_s=ln
+  else
+    as_ln_s='cp -pR'
+  fi
+else
+  as_ln_s='cp -pR'
+fi
+rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
+rmdir conf$$.dir 2>/dev/null
+
+
+# as_fn_mkdir_p
+# -------------
+# Create "$as_dir" as a directory, including parents if necessary.
+as_fn_mkdir_p ()
+{
+
+  case $as_dir in #(
+  -*) as_dir=./$as_dir;;
+  esac
+  test -d "$as_dir" || eval $as_mkdir_p || {
+    as_dirs=
+    while :; do
+      case $as_dir in #(
+      *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
+      *) as_qdir=$as_dir;;
+      esac
+      as_dirs="'$as_qdir' $as_dirs"
+      as_dir=`$as_dirname -- "$as_dir" ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$as_dir" : 'X\(//\)[^/]' \| \
+	 X"$as_dir" : 'X\(//\)$' \| \
+	 X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$as_dir" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)[^/].*/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+      test -d "$as_dir" && break
+    done
+    test -z "$as_dirs" || eval "mkdir $as_dirs"
+  } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir"
+
+
+} # as_fn_mkdir_p
+if mkdir -p . 2>/dev/null; then
+  as_mkdir_p='mkdir -p "$as_dir"'
+else
+  test -d ./-p && rmdir ./-p
+  as_mkdir_p=false
+fi
+
+
+# as_fn_executable_p FILE
+# -----------------------
+# Test if FILE is an executable regular file.
+as_fn_executable_p ()
+{
+  test -f "$1" && test -x "$1"
+} # as_fn_executable_p
+as_test_x='test -x'
+as_executable_p=as_fn_executable_p
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+
+
+exec 6>&1
+## ----------------------------------- ##
+## Main body of $CONFIG_STATUS script. ##
+## ----------------------------------- ##
+_ASEOF
+test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+# Save the log message, to keep $0 and so on meaningful, and to
+# report actual input values of CONFIG_FILES etc. instead of their
+# values after options handling.
+ac_log="
+This file was extended by netCDF-Fortran $as_me 4.4.1, which was
+generated by GNU Autoconf 2.69.  Invocation command line was
+
+  CONFIG_FILES    = $CONFIG_FILES
+  CONFIG_HEADERS  = $CONFIG_HEADERS
+  CONFIG_LINKS    = $CONFIG_LINKS
+  CONFIG_COMMANDS = $CONFIG_COMMANDS
+  $ $0 $@
+
+on `(hostname || uname -n) 2>/dev/null | sed 1q`
+"
+
+_ACEOF
+
+case $ac_config_files in *"
+"*) set x $ac_config_files; shift; ac_config_files=$*;;
+esac
+
+case $ac_config_headers in *"
+"*) set x $ac_config_headers; shift; ac_config_headers=$*;;
+esac
+
+
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+# Files that config.status was made for.
+config_files="$ac_config_files"
+config_headers="$ac_config_headers"
+config_commands="$ac_config_commands"
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+ac_cs_usage="\
+\`$as_me' instantiates files and other configuration actions
+from templates according to the current configuration.  Unless the files
+and actions are specified as TAGs, all are instantiated by default.
+
+Usage: $0 [OPTION]... [TAG]...
+
+  -h, --help       print this help, then exit
+  -V, --version    print version number and configuration settings, then exit
+      --config     print configuration, then exit
+  -q, --quiet, --silent
+                   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
+      --header=FILE[:TEMPLATE]
+                   instantiate the configuration header FILE
+
+Configuration files:
+$config_files
+
+Configuration headers:
+$config_headers
+
+Configuration commands:
+$config_commands
+
+Report bugs to <support-netcdf at unidata.ucar.edu>."
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
+ac_cs_version="\\
+netCDF-Fortran config.status 4.4.1
+configured by $0, generated by GNU Autoconf 2.69,
+  with options \\"\$ac_cs_config\\"
+
+Copyright (C) 2012 Free Software Foundation, Inc.
+This config.status script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it."
+
+ac_pwd='$ac_pwd'
+srcdir='$srcdir'
+INSTALL='$INSTALL'
+MKDIR_P='$MKDIR_P'
+AWK='$AWK'
+test -n "\$AWK" || AWK=awk
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+# The default lists apply if the user does not specify any file.
+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=`expr "X$1" : 'X\([^=]*\)='`
+    ac_optarg=
+    ac_shift=:
+    ;;
+  *)
+    ac_option=$1
+    ac_optarg=$2
+    ac_shift=shift
+    ;;
+  esac
+
+  case $ac_option in
+  # Handling of the options.
+  -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
+    ac_cs_recheck=: ;;
+  --version | --versio | --versi | --vers | --ver | --ve | --v | -V )
+    $as_echo "$ac_cs_version"; exit ;;
+  --config | --confi | --conf | --con | --co | --c )
+    $as_echo "$ac_cs_config"; exit ;;
+  --debug | --debu | --deb | --de | --d | -d )
+    debug=: ;;
+  --file | --fil | --fi | --f )
+    $ac_shift
+    case $ac_optarg in
+    *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;
+    '') as_fn_error $? "missing file argument" ;;
+    esac
+    as_fn_append CONFIG_FILES " '$ac_optarg'"
+    ac_need_defaults=false;;
+  --header | --heade | --head | --hea )
+    $ac_shift
+    case $ac_optarg in
+    *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;
+    esac
+    as_fn_append CONFIG_HEADERS " '$ac_optarg'"
+    ac_need_defaults=false;;
+  --he | --h)
+    # Conflict between --help and --header
+    as_fn_error $? "ambiguous option: \`$1'
+Try \`$0 --help' for more information.";;
+  --help | --hel | -h )
+    $as_echo "$ac_cs_usage"; exit ;;
+  -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+  | -silent | --silent | --silen | --sile | --sil | --si | --s)
+    ac_cs_silent=: ;;
+
+  # This is an error.
+  -*) as_fn_error $? "unrecognized option: \`$1'
+Try \`$0 --help' for more information." ;;
+
+  *) as_fn_append ac_config_targets " $1"
+     ac_need_defaults=false ;;
+
+  esac
+  shift
+done
+
+ac_configure_extra_args=
+
+if $ac_cs_silent; then
+  exec 6>/dev/null
+  ac_configure_extra_args="$ac_configure_extra_args --silent"
+fi
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+if \$ac_cs_recheck; then
+  set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion
+  shift
+  \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6
+  CONFIG_SHELL='$SHELL'
+  export CONFIG_SHELL
+  exec "\$@"
+fi
+
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+exec 5>>config.log
+{
+  echo
+  sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX
+## Running $as_me. ##
+_ASBOX
+  $as_echo "$ac_log"
+} >&5
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+#
+# INIT-COMMANDS
+#
+AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"
+
+
+# The HP-UX ksh and POSIX shell print the target directory to stdout
+# if CDPATH is set.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+sed_quote_subst='$sed_quote_subst'
+double_quote_subst='$double_quote_subst'
+delay_variable_subst='$delay_variable_subst'
+macro_version='`$ECHO "$macro_version" | $SED "$delay_single_quote_subst"`'
+macro_revision='`$ECHO "$macro_revision" | $SED "$delay_single_quote_subst"`'
+enable_shared='`$ECHO "$enable_shared" | $SED "$delay_single_quote_subst"`'
+enable_static='`$ECHO "$enable_static" | $SED "$delay_single_quote_subst"`'
+pic_mode='`$ECHO "$pic_mode" | $SED "$delay_single_quote_subst"`'
+enable_fast_install='`$ECHO "$enable_fast_install" | $SED "$delay_single_quote_subst"`'
+SHELL='`$ECHO "$SHELL" | $SED "$delay_single_quote_subst"`'
+ECHO='`$ECHO "$ECHO" | $SED "$delay_single_quote_subst"`'
+PATH_SEPARATOR='`$ECHO "$PATH_SEPARATOR" | $SED "$delay_single_quote_subst"`'
+host_alias='`$ECHO "$host_alias" | $SED "$delay_single_quote_subst"`'
+host='`$ECHO "$host" | $SED "$delay_single_quote_subst"`'
+host_os='`$ECHO "$host_os" | $SED "$delay_single_quote_subst"`'
+build_alias='`$ECHO "$build_alias" | $SED "$delay_single_quote_subst"`'
+build='`$ECHO "$build" | $SED "$delay_single_quote_subst"`'
+build_os='`$ECHO "$build_os" | $SED "$delay_single_quote_subst"`'
+SED='`$ECHO "$SED" | $SED "$delay_single_quote_subst"`'
+Xsed='`$ECHO "$Xsed" | $SED "$delay_single_quote_subst"`'
+GREP='`$ECHO "$GREP" | $SED "$delay_single_quote_subst"`'
+EGREP='`$ECHO "$EGREP" | $SED "$delay_single_quote_subst"`'
+FGREP='`$ECHO "$FGREP" | $SED "$delay_single_quote_subst"`'
+LD='`$ECHO "$LD" | $SED "$delay_single_quote_subst"`'
+NM='`$ECHO "$NM" | $SED "$delay_single_quote_subst"`'
+LN_S='`$ECHO "$LN_S" | $SED "$delay_single_quote_subst"`'
+max_cmd_len='`$ECHO "$max_cmd_len" | $SED "$delay_single_quote_subst"`'
+ac_objext='`$ECHO "$ac_objext" | $SED "$delay_single_quote_subst"`'
+exeext='`$ECHO "$exeext" | $SED "$delay_single_quote_subst"`'
+lt_unset='`$ECHO "$lt_unset" | $SED "$delay_single_quote_subst"`'
+lt_SP2NL='`$ECHO "$lt_SP2NL" | $SED "$delay_single_quote_subst"`'
+lt_NL2SP='`$ECHO "$lt_NL2SP" | $SED "$delay_single_quote_subst"`'
+lt_cv_to_host_file_cmd='`$ECHO "$lt_cv_to_host_file_cmd" | $SED "$delay_single_quote_subst"`'
+lt_cv_to_tool_file_cmd='`$ECHO "$lt_cv_to_tool_file_cmd" | $SED "$delay_single_quote_subst"`'
+reload_flag='`$ECHO "$reload_flag" | $SED "$delay_single_quote_subst"`'
+reload_cmds='`$ECHO "$reload_cmds" | $SED "$delay_single_quote_subst"`'
+OBJDUMP='`$ECHO "$OBJDUMP" | $SED "$delay_single_quote_subst"`'
+deplibs_check_method='`$ECHO "$deplibs_check_method" | $SED "$delay_single_quote_subst"`'
+file_magic_cmd='`$ECHO "$file_magic_cmd" | $SED "$delay_single_quote_subst"`'
+file_magic_glob='`$ECHO "$file_magic_glob" | $SED "$delay_single_quote_subst"`'
+want_nocaseglob='`$ECHO "$want_nocaseglob" | $SED "$delay_single_quote_subst"`'
+DLLTOOL='`$ECHO "$DLLTOOL" | $SED "$delay_single_quote_subst"`'
+sharedlib_from_linklib_cmd='`$ECHO "$sharedlib_from_linklib_cmd" | $SED "$delay_single_quote_subst"`'
+AR='`$ECHO "$AR" | $SED "$delay_single_quote_subst"`'
+AR_FLAGS='`$ECHO "$AR_FLAGS" | $SED "$delay_single_quote_subst"`'
+archiver_list_spec='`$ECHO "$archiver_list_spec" | $SED "$delay_single_quote_subst"`'
+STRIP='`$ECHO "$STRIP" | $SED "$delay_single_quote_subst"`'
+RANLIB='`$ECHO "$RANLIB" | $SED "$delay_single_quote_subst"`'
+old_postinstall_cmds='`$ECHO "$old_postinstall_cmds" | $SED "$delay_single_quote_subst"`'
+old_postuninstall_cmds='`$ECHO "$old_postuninstall_cmds" | $SED "$delay_single_quote_subst"`'
+old_archive_cmds='`$ECHO "$old_archive_cmds" | $SED "$delay_single_quote_subst"`'
+lock_old_archive_extraction='`$ECHO "$lock_old_archive_extraction" | $SED "$delay_single_quote_subst"`'
+CC='`$ECHO "$CC" | $SED "$delay_single_quote_subst"`'
+CFLAGS='`$ECHO "$CFLAGS" | $SED "$delay_single_quote_subst"`'
+compiler='`$ECHO "$compiler" | $SED "$delay_single_quote_subst"`'
+GCC='`$ECHO "$GCC" | $SED "$delay_single_quote_subst"`'
+lt_cv_sys_global_symbol_pipe='`$ECHO "$lt_cv_sys_global_symbol_pipe" | $SED "$delay_single_quote_subst"`'
+lt_cv_sys_global_symbol_to_cdecl='`$ECHO "$lt_cv_sys_global_symbol_to_cdecl" | $SED "$delay_single_quote_subst"`'
+lt_cv_sys_global_symbol_to_c_name_address='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address" | $SED "$delay_single_quote_subst"`'
+lt_cv_sys_global_symbol_to_c_name_address_lib_prefix='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address_lib_prefix" | $SED "$delay_single_quote_subst"`'
+nm_file_list_spec='`$ECHO "$nm_file_list_spec" | $SED "$delay_single_quote_subst"`'
+lt_sysroot='`$ECHO "$lt_sysroot" | $SED "$delay_single_quote_subst"`'
+objdir='`$ECHO "$objdir" | $SED "$delay_single_quote_subst"`'
+MAGIC_CMD='`$ECHO "$MAGIC_CMD" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_no_builtin_flag='`$ECHO "$lt_prog_compiler_no_builtin_flag" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_pic='`$ECHO "$lt_prog_compiler_pic" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_wl='`$ECHO "$lt_prog_compiler_wl" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_static='`$ECHO "$lt_prog_compiler_static" | $SED "$delay_single_quote_subst"`'
+lt_cv_prog_compiler_c_o='`$ECHO "$lt_cv_prog_compiler_c_o" | $SED "$delay_single_quote_subst"`'
+need_locks='`$ECHO "$need_locks" | $SED "$delay_single_quote_subst"`'
+MANIFEST_TOOL='`$ECHO "$MANIFEST_TOOL" | $SED "$delay_single_quote_subst"`'
+DSYMUTIL='`$ECHO "$DSYMUTIL" | $SED "$delay_single_quote_subst"`'
+NMEDIT='`$ECHO "$NMEDIT" | $SED "$delay_single_quote_subst"`'
+LIPO='`$ECHO "$LIPO" | $SED "$delay_single_quote_subst"`'
+OTOOL='`$ECHO "$OTOOL" | $SED "$delay_single_quote_subst"`'
+OTOOL64='`$ECHO "$OTOOL64" | $SED "$delay_single_quote_subst"`'
+libext='`$ECHO "$libext" | $SED "$delay_single_quote_subst"`'
+shrext_cmds='`$ECHO "$shrext_cmds" | $SED "$delay_single_quote_subst"`'
+extract_expsyms_cmds='`$ECHO "$extract_expsyms_cmds" | $SED "$delay_single_quote_subst"`'
+archive_cmds_need_lc='`$ECHO "$archive_cmds_need_lc" | $SED "$delay_single_quote_subst"`'
+enable_shared_with_static_runtimes='`$ECHO "$enable_shared_with_static_runtimes" | $SED "$delay_single_quote_subst"`'
+export_dynamic_flag_spec='`$ECHO "$export_dynamic_flag_spec" | $SED "$delay_single_quote_subst"`'
+whole_archive_flag_spec='`$ECHO "$whole_archive_flag_spec" | $SED "$delay_single_quote_subst"`'
+compiler_needs_object='`$ECHO "$compiler_needs_object" | $SED "$delay_single_quote_subst"`'
+old_archive_from_new_cmds='`$ECHO "$old_archive_from_new_cmds" | $SED "$delay_single_quote_subst"`'
+old_archive_from_expsyms_cmds='`$ECHO "$old_archive_from_expsyms_cmds" | $SED "$delay_single_quote_subst"`'
+archive_cmds='`$ECHO "$archive_cmds" | $SED "$delay_single_quote_subst"`'
+archive_expsym_cmds='`$ECHO "$archive_expsym_cmds" | $SED "$delay_single_quote_subst"`'
+module_cmds='`$ECHO "$module_cmds" | $SED "$delay_single_quote_subst"`'
+module_expsym_cmds='`$ECHO "$module_expsym_cmds" | $SED "$delay_single_quote_subst"`'
+with_gnu_ld='`$ECHO "$with_gnu_ld" | $SED "$delay_single_quote_subst"`'
+allow_undefined_flag='`$ECHO "$allow_undefined_flag" | $SED "$delay_single_quote_subst"`'
+no_undefined_flag='`$ECHO "$no_undefined_flag" | $SED "$delay_single_quote_subst"`'
+hardcode_libdir_flag_spec='`$ECHO "$hardcode_libdir_flag_spec" | $SED "$delay_single_quote_subst"`'
+hardcode_libdir_separator='`$ECHO "$hardcode_libdir_separator" | $SED "$delay_single_quote_subst"`'
+hardcode_direct='`$ECHO "$hardcode_direct" | $SED "$delay_single_quote_subst"`'
+hardcode_direct_absolute='`$ECHO "$hardcode_direct_absolute" | $SED "$delay_single_quote_subst"`'
+hardcode_minus_L='`$ECHO "$hardcode_minus_L" | $SED "$delay_single_quote_subst"`'
+hardcode_shlibpath_var='`$ECHO "$hardcode_shlibpath_var" | $SED "$delay_single_quote_subst"`'
+hardcode_automatic='`$ECHO "$hardcode_automatic" | $SED "$delay_single_quote_subst"`'
+inherit_rpath='`$ECHO "$inherit_rpath" | $SED "$delay_single_quote_subst"`'
+link_all_deplibs='`$ECHO "$link_all_deplibs" | $SED "$delay_single_quote_subst"`'
+always_export_symbols='`$ECHO "$always_export_symbols" | $SED "$delay_single_quote_subst"`'
+export_symbols_cmds='`$ECHO "$export_symbols_cmds" | $SED "$delay_single_quote_subst"`'
+exclude_expsyms='`$ECHO "$exclude_expsyms" | $SED "$delay_single_quote_subst"`'
+include_expsyms='`$ECHO "$include_expsyms" | $SED "$delay_single_quote_subst"`'
+prelink_cmds='`$ECHO "$prelink_cmds" | $SED "$delay_single_quote_subst"`'
+postlink_cmds='`$ECHO "$postlink_cmds" | $SED "$delay_single_quote_subst"`'
+file_list_spec='`$ECHO "$file_list_spec" | $SED "$delay_single_quote_subst"`'
+variables_saved_for_relink='`$ECHO "$variables_saved_for_relink" | $SED "$delay_single_quote_subst"`'
+need_lib_prefix='`$ECHO "$need_lib_prefix" | $SED "$delay_single_quote_subst"`'
+need_version='`$ECHO "$need_version" | $SED "$delay_single_quote_subst"`'
+version_type='`$ECHO "$version_type" | $SED "$delay_single_quote_subst"`'
+runpath_var='`$ECHO "$runpath_var" | $SED "$delay_single_quote_subst"`'
+shlibpath_var='`$ECHO "$shlibpath_var" | $SED "$delay_single_quote_subst"`'
+shlibpath_overrides_runpath='`$ECHO "$shlibpath_overrides_runpath" | $SED "$delay_single_quote_subst"`'
+libname_spec='`$ECHO "$libname_spec" | $SED "$delay_single_quote_subst"`'
+library_names_spec='`$ECHO "$library_names_spec" | $SED "$delay_single_quote_subst"`'
+soname_spec='`$ECHO "$soname_spec" | $SED "$delay_single_quote_subst"`'
+install_override_mode='`$ECHO "$install_override_mode" | $SED "$delay_single_quote_subst"`'
+postinstall_cmds='`$ECHO "$postinstall_cmds" | $SED "$delay_single_quote_subst"`'
+postuninstall_cmds='`$ECHO "$postuninstall_cmds" | $SED "$delay_single_quote_subst"`'
+finish_cmds='`$ECHO "$finish_cmds" | $SED "$delay_single_quote_subst"`'
+finish_eval='`$ECHO "$finish_eval" | $SED "$delay_single_quote_subst"`'
+hardcode_into_libs='`$ECHO "$hardcode_into_libs" | $SED "$delay_single_quote_subst"`'
+sys_lib_search_path_spec='`$ECHO "$sys_lib_search_path_spec" | $SED "$delay_single_quote_subst"`'
+sys_lib_dlsearch_path_spec='`$ECHO "$sys_lib_dlsearch_path_spec" | $SED "$delay_single_quote_subst"`'
+hardcode_action='`$ECHO "$hardcode_action" | $SED "$delay_single_quote_subst"`'
+enable_dlopen='`$ECHO "$enable_dlopen" | $SED "$delay_single_quote_subst"`'
+enable_dlopen_self='`$ECHO "$enable_dlopen_self" | $SED "$delay_single_quote_subst"`'
+enable_dlopen_self_static='`$ECHO "$enable_dlopen_self_static" | $SED "$delay_single_quote_subst"`'
+old_striplib='`$ECHO "$old_striplib" | $SED "$delay_single_quote_subst"`'
+striplib='`$ECHO "$striplib" | $SED "$delay_single_quote_subst"`'
+compiler_lib_search_dirs='`$ECHO "$compiler_lib_search_dirs" | $SED "$delay_single_quote_subst"`'
+predep_objects='`$ECHO "$predep_objects" | $SED "$delay_single_quote_subst"`'
+postdep_objects='`$ECHO "$postdep_objects" | $SED "$delay_single_quote_subst"`'
+predeps='`$ECHO "$predeps" | $SED "$delay_single_quote_subst"`'
+postdeps='`$ECHO "$postdeps" | $SED "$delay_single_quote_subst"`'
+compiler_lib_search_path='`$ECHO "$compiler_lib_search_path" | $SED "$delay_single_quote_subst"`'
+LD_F77='`$ECHO "$LD_F77" | $SED "$delay_single_quote_subst"`'
+LD_FC='`$ECHO "$LD_FC" | $SED "$delay_single_quote_subst"`'
+reload_flag_F77='`$ECHO "$reload_flag_F77" | $SED "$delay_single_quote_subst"`'
+reload_flag_FC='`$ECHO "$reload_flag_FC" | $SED "$delay_single_quote_subst"`'
+reload_cmds_F77='`$ECHO "$reload_cmds_F77" | $SED "$delay_single_quote_subst"`'
+reload_cmds_FC='`$ECHO "$reload_cmds_FC" | $SED "$delay_single_quote_subst"`'
+old_archive_cmds_F77='`$ECHO "$old_archive_cmds_F77" | $SED "$delay_single_quote_subst"`'
+old_archive_cmds_FC='`$ECHO "$old_archive_cmds_FC" | $SED "$delay_single_quote_subst"`'
+compiler_F77='`$ECHO "$compiler_F77" | $SED "$delay_single_quote_subst"`'
+compiler_FC='`$ECHO "$compiler_FC" | $SED "$delay_single_quote_subst"`'
+GCC_F77='`$ECHO "$GCC_F77" | $SED "$delay_single_quote_subst"`'
+GCC_FC='`$ECHO "$GCC_FC" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_no_builtin_flag_F77='`$ECHO "$lt_prog_compiler_no_builtin_flag_F77" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_no_builtin_flag_FC='`$ECHO "$lt_prog_compiler_no_builtin_flag_FC" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_pic_F77='`$ECHO "$lt_prog_compiler_pic_F77" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_pic_FC='`$ECHO "$lt_prog_compiler_pic_FC" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_wl_F77='`$ECHO "$lt_prog_compiler_wl_F77" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_wl_FC='`$ECHO "$lt_prog_compiler_wl_FC" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_static_F77='`$ECHO "$lt_prog_compiler_static_F77" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_static_FC='`$ECHO "$lt_prog_compiler_static_FC" | $SED "$delay_single_quote_subst"`'
+lt_cv_prog_compiler_c_o_F77='`$ECHO "$lt_cv_prog_compiler_c_o_F77" | $SED "$delay_single_quote_subst"`'
+lt_cv_prog_compiler_c_o_FC='`$ECHO "$lt_cv_prog_compiler_c_o_FC" | $SED "$delay_single_quote_subst"`'
+archive_cmds_need_lc_F77='`$ECHO "$archive_cmds_need_lc_F77" | $SED "$delay_single_quote_subst"`'
+archive_cmds_need_lc_FC='`$ECHO "$archive_cmds_need_lc_FC" | $SED "$delay_single_quote_subst"`'
+enable_shared_with_static_runtimes_F77='`$ECHO "$enable_shared_with_static_runtimes_F77" | $SED "$delay_single_quote_subst"`'
+enable_shared_with_static_runtimes_FC='`$ECHO "$enable_shared_with_static_runtimes_FC" | $SED "$delay_single_quote_subst"`'
+export_dynamic_flag_spec_F77='`$ECHO "$export_dynamic_flag_spec_F77" | $SED "$delay_single_quote_subst"`'
+export_dynamic_flag_spec_FC='`$ECHO "$export_dynamic_flag_spec_FC" | $SED "$delay_single_quote_subst"`'
+whole_archive_flag_spec_F77='`$ECHO "$whole_archive_flag_spec_F77" | $SED "$delay_single_quote_subst"`'
+whole_archive_flag_spec_FC='`$ECHO "$whole_archive_flag_spec_FC" | $SED "$delay_single_quote_subst"`'
+compiler_needs_object_F77='`$ECHO "$compiler_needs_object_F77" | $SED "$delay_single_quote_subst"`'
+compiler_needs_object_FC='`$ECHO "$compiler_needs_object_FC" | $SED "$delay_single_quote_subst"`'
+old_archive_from_new_cmds_F77='`$ECHO "$old_archive_from_new_cmds_F77" | $SED "$delay_single_quote_subst"`'
+old_archive_from_new_cmds_FC='`$ECHO "$old_archive_from_new_cmds_FC" | $SED "$delay_single_quote_subst"`'
+old_archive_from_expsyms_cmds_F77='`$ECHO "$old_archive_from_expsyms_cmds_F77" | $SED "$delay_single_quote_subst"`'
+old_archive_from_expsyms_cmds_FC='`$ECHO "$old_archive_from_expsyms_cmds_FC" | $SED "$delay_single_quote_subst"`'
+archive_cmds_F77='`$ECHO "$archive_cmds_F77" | $SED "$delay_single_quote_subst"`'
+archive_cmds_FC='`$ECHO "$archive_cmds_FC" | $SED "$delay_single_quote_subst"`'
+archive_expsym_cmds_F77='`$ECHO "$archive_expsym_cmds_F77" | $SED "$delay_single_quote_subst"`'
+archive_expsym_cmds_FC='`$ECHO "$archive_expsym_cmds_FC" | $SED "$delay_single_quote_subst"`'
+module_cmds_F77='`$ECHO "$module_cmds_F77" | $SED "$delay_single_quote_subst"`'
+module_cmds_FC='`$ECHO "$module_cmds_FC" | $SED "$delay_single_quote_subst"`'
+module_expsym_cmds_F77='`$ECHO "$module_expsym_cmds_F77" | $SED "$delay_single_quote_subst"`'
+module_expsym_cmds_FC='`$ECHO "$module_expsym_cmds_FC" | $SED "$delay_single_quote_subst"`'
+with_gnu_ld_F77='`$ECHO "$with_gnu_ld_F77" | $SED "$delay_single_quote_subst"`'
+with_gnu_ld_FC='`$ECHO "$with_gnu_ld_FC" | $SED "$delay_single_quote_subst"`'
+allow_undefined_flag_F77='`$ECHO "$allow_undefined_flag_F77" | $SED "$delay_single_quote_subst"`'
+allow_undefined_flag_FC='`$ECHO "$allow_undefined_flag_FC" | $SED "$delay_single_quote_subst"`'
+no_undefined_flag_F77='`$ECHO "$no_undefined_flag_F77" | $SED "$delay_single_quote_subst"`'
+no_undefined_flag_FC='`$ECHO "$no_undefined_flag_FC" | $SED "$delay_single_quote_subst"`'
+hardcode_libdir_flag_spec_F77='`$ECHO "$hardcode_libdir_flag_spec_F77" | $SED "$delay_single_quote_subst"`'
+hardcode_libdir_flag_spec_FC='`$ECHO "$hardcode_libdir_flag_spec_FC" | $SED "$delay_single_quote_subst"`'
+hardcode_libdir_separator_F77='`$ECHO "$hardcode_libdir_separator_F77" | $SED "$delay_single_quote_subst"`'
+hardcode_libdir_separator_FC='`$ECHO "$hardcode_libdir_separator_FC" | $SED "$delay_single_quote_subst"`'
+hardcode_direct_F77='`$ECHO "$hardcode_direct_F77" | $SED "$delay_single_quote_subst"`'
+hardcode_direct_FC='`$ECHO "$hardcode_direct_FC" | $SED "$delay_single_quote_subst"`'
+hardcode_direct_absolute_F77='`$ECHO "$hardcode_direct_absolute_F77" | $SED "$delay_single_quote_subst"`'
+hardcode_direct_absolute_FC='`$ECHO "$hardcode_direct_absolute_FC" | $SED "$delay_single_quote_subst"`'
+hardcode_minus_L_F77='`$ECHO "$hardcode_minus_L_F77" | $SED "$delay_single_quote_subst"`'
+hardcode_minus_L_FC='`$ECHO "$hardcode_minus_L_FC" | $SED "$delay_single_quote_subst"`'
+hardcode_shlibpath_var_F77='`$ECHO "$hardcode_shlibpath_var_F77" | $SED "$delay_single_quote_subst"`'
+hardcode_shlibpath_var_FC='`$ECHO "$hardcode_shlibpath_var_FC" | $SED "$delay_single_quote_subst"`'
+hardcode_automatic_F77='`$ECHO "$hardcode_automatic_F77" | $SED "$delay_single_quote_subst"`'
+hardcode_automatic_FC='`$ECHO "$hardcode_automatic_FC" | $SED "$delay_single_quote_subst"`'
+inherit_rpath_F77='`$ECHO "$inherit_rpath_F77" | $SED "$delay_single_quote_subst"`'
+inherit_rpath_FC='`$ECHO "$inherit_rpath_FC" | $SED "$delay_single_quote_subst"`'
+link_all_deplibs_F77='`$ECHO "$link_all_deplibs_F77" | $SED "$delay_single_quote_subst"`'
+link_all_deplibs_FC='`$ECHO "$link_all_deplibs_FC" | $SED "$delay_single_quote_subst"`'
+always_export_symbols_F77='`$ECHO "$always_export_symbols_F77" | $SED "$delay_single_quote_subst"`'
+always_export_symbols_FC='`$ECHO "$always_export_symbols_FC" | $SED "$delay_single_quote_subst"`'
+export_symbols_cmds_F77='`$ECHO "$export_symbols_cmds_F77" | $SED "$delay_single_quote_subst"`'
+export_symbols_cmds_FC='`$ECHO "$export_symbols_cmds_FC" | $SED "$delay_single_quote_subst"`'
+exclude_expsyms_F77='`$ECHO "$exclude_expsyms_F77" | $SED "$delay_single_quote_subst"`'
+exclude_expsyms_FC='`$ECHO "$exclude_expsyms_FC" | $SED "$delay_single_quote_subst"`'
+include_expsyms_F77='`$ECHO "$include_expsyms_F77" | $SED "$delay_single_quote_subst"`'
+include_expsyms_FC='`$ECHO "$include_expsyms_FC" | $SED "$delay_single_quote_subst"`'
+prelink_cmds_F77='`$ECHO "$prelink_cmds_F77" | $SED "$delay_single_quote_subst"`'
+prelink_cmds_FC='`$ECHO "$prelink_cmds_FC" | $SED "$delay_single_quote_subst"`'
+postlink_cmds_F77='`$ECHO "$postlink_cmds_F77" | $SED "$delay_single_quote_subst"`'
+postlink_cmds_FC='`$ECHO "$postlink_cmds_FC" | $SED "$delay_single_quote_subst"`'
+file_list_spec_F77='`$ECHO "$file_list_spec_F77" | $SED "$delay_single_quote_subst"`'
+file_list_spec_FC='`$ECHO "$file_list_spec_FC" | $SED "$delay_single_quote_subst"`'
+hardcode_action_F77='`$ECHO "$hardcode_action_F77" | $SED "$delay_single_quote_subst"`'
+hardcode_action_FC='`$ECHO "$hardcode_action_FC" | $SED "$delay_single_quote_subst"`'
+compiler_lib_search_dirs_F77='`$ECHO "$compiler_lib_search_dirs_F77" | $SED "$delay_single_quote_subst"`'
+compiler_lib_search_dirs_FC='`$ECHO "$compiler_lib_search_dirs_FC" | $SED "$delay_single_quote_subst"`'
+predep_objects_F77='`$ECHO "$predep_objects_F77" | $SED "$delay_single_quote_subst"`'
+predep_objects_FC='`$ECHO "$predep_objects_FC" | $SED "$delay_single_quote_subst"`'
+postdep_objects_F77='`$ECHO "$postdep_objects_F77" | $SED "$delay_single_quote_subst"`'
+postdep_objects_FC='`$ECHO "$postdep_objects_FC" | $SED "$delay_single_quote_subst"`'
+predeps_F77='`$ECHO "$predeps_F77" | $SED "$delay_single_quote_subst"`'
+predeps_FC='`$ECHO "$predeps_FC" | $SED "$delay_single_quote_subst"`'
+postdeps_F77='`$ECHO "$postdeps_F77" | $SED "$delay_single_quote_subst"`'
+postdeps_FC='`$ECHO "$postdeps_FC" | $SED "$delay_single_quote_subst"`'
+compiler_lib_search_path_F77='`$ECHO "$compiler_lib_search_path_F77" | $SED "$delay_single_quote_subst"`'
+compiler_lib_search_path_FC='`$ECHO "$compiler_lib_search_path_FC" | $SED "$delay_single_quote_subst"`'
+
+LTCC='$LTCC'
+LTCFLAGS='$LTCFLAGS'
+compiler='$compiler_DEFAULT'
+
+# A function that is used when there is no print builtin or printf.
+func_fallback_echo ()
+{
+  eval 'cat <<_LTECHO_EOF
+\$1
+_LTECHO_EOF'
+}
+
+# Quote evaled strings.
+for var in SHELL \
+ECHO \
+PATH_SEPARATOR \
+SED \
+GREP \
+EGREP \
+FGREP \
+LD \
+NM \
+LN_S \
+lt_SP2NL \
+lt_NL2SP \
+reload_flag \
+OBJDUMP \
+deplibs_check_method \
+file_magic_cmd \
+file_magic_glob \
+want_nocaseglob \
+DLLTOOL \
+sharedlib_from_linklib_cmd \
+AR \
+AR_FLAGS \
+archiver_list_spec \
+STRIP \
+RANLIB \
+CC \
+CFLAGS \
+compiler \
+lt_cv_sys_global_symbol_pipe \
+lt_cv_sys_global_symbol_to_cdecl \
+lt_cv_sys_global_symbol_to_c_name_address \
+lt_cv_sys_global_symbol_to_c_name_address_lib_prefix \
+nm_file_list_spec \
+lt_prog_compiler_no_builtin_flag \
+lt_prog_compiler_pic \
+lt_prog_compiler_wl \
+lt_prog_compiler_static \
+lt_cv_prog_compiler_c_o \
+need_locks \
+MANIFEST_TOOL \
+DSYMUTIL \
+NMEDIT \
+LIPO \
+OTOOL \
+OTOOL64 \
+shrext_cmds \
+export_dynamic_flag_spec \
+whole_archive_flag_spec \
+compiler_needs_object \
+with_gnu_ld \
+allow_undefined_flag \
+no_undefined_flag \
+hardcode_libdir_flag_spec \
+hardcode_libdir_separator \
+exclude_expsyms \
+include_expsyms \
+file_list_spec \
+variables_saved_for_relink \
+libname_spec \
+library_names_spec \
+soname_spec \
+install_override_mode \
+finish_eval \
+old_striplib \
+striplib \
+compiler_lib_search_dirs \
+predep_objects \
+postdep_objects \
+predeps \
+postdeps \
+compiler_lib_search_path \
+LD_F77 \
+LD_FC \
+reload_flag_F77 \
+reload_flag_FC \
+compiler_F77 \
+compiler_FC \
+lt_prog_compiler_no_builtin_flag_F77 \
+lt_prog_compiler_no_builtin_flag_FC \
+lt_prog_compiler_pic_F77 \
+lt_prog_compiler_pic_FC \
+lt_prog_compiler_wl_F77 \
+lt_prog_compiler_wl_FC \
+lt_prog_compiler_static_F77 \
+lt_prog_compiler_static_FC \
+lt_cv_prog_compiler_c_o_F77 \
+lt_cv_prog_compiler_c_o_FC \
+export_dynamic_flag_spec_F77 \
+export_dynamic_flag_spec_FC \
+whole_archive_flag_spec_F77 \
+whole_archive_flag_spec_FC \
+compiler_needs_object_F77 \
+compiler_needs_object_FC \
+with_gnu_ld_F77 \
+with_gnu_ld_FC \
+allow_undefined_flag_F77 \
+allow_undefined_flag_FC \
+no_undefined_flag_F77 \
+no_undefined_flag_FC \
+hardcode_libdir_flag_spec_F77 \
+hardcode_libdir_flag_spec_FC \
+hardcode_libdir_separator_F77 \
+hardcode_libdir_separator_FC \
+exclude_expsyms_F77 \
+exclude_expsyms_FC \
+include_expsyms_F77 \
+include_expsyms_FC \
+file_list_spec_F77 \
+file_list_spec_FC \
+compiler_lib_search_dirs_F77 \
+compiler_lib_search_dirs_FC \
+predep_objects_F77 \
+predep_objects_FC \
+postdep_objects_F77 \
+postdep_objects_FC \
+predeps_F77 \
+predeps_FC \
+postdeps_F77 \
+postdeps_FC \
+compiler_lib_search_path_F77 \
+compiler_lib_search_path_FC; do
+    case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in
+    *[\\\\\\\`\\"\\\$]*)
+      eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\""
+      ;;
+    *)
+      eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
+      ;;
+    esac
+done
+
+# Double-quote double-evaled strings.
+for var in reload_cmds \
+old_postinstall_cmds \
+old_postuninstall_cmds \
+old_archive_cmds \
+extract_expsyms_cmds \
+old_archive_from_new_cmds \
+old_archive_from_expsyms_cmds \
+archive_cmds \
+archive_expsym_cmds \
+module_cmds \
+module_expsym_cmds \
+export_symbols_cmds \
+prelink_cmds \
+postlink_cmds \
+postinstall_cmds \
+postuninstall_cmds \
+finish_cmds \
+sys_lib_search_path_spec \
+sys_lib_dlsearch_path_spec \
+reload_cmds_F77 \
+reload_cmds_FC \
+old_archive_cmds_F77 \
+old_archive_cmds_FC \
+old_archive_from_new_cmds_F77 \
+old_archive_from_new_cmds_FC \
+old_archive_from_expsyms_cmds_F77 \
+old_archive_from_expsyms_cmds_FC \
+archive_cmds_F77 \
+archive_cmds_FC \
+archive_expsym_cmds_F77 \
+archive_expsym_cmds_FC \
+module_cmds_F77 \
+module_cmds_FC \
+module_expsym_cmds_F77 \
+module_expsym_cmds_FC \
+export_symbols_cmds_F77 \
+export_symbols_cmds_FC \
+prelink_cmds_F77 \
+prelink_cmds_FC \
+postlink_cmds_F77 \
+postlink_cmds_FC; do
+    case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in
+    *[\\\\\\\`\\"\\\$]*)
+      eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\""
+      ;;
+    *)
+      eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
+      ;;
+    esac
+done
+
+ac_aux_dir='$ac_aux_dir'
+xsi_shell='$xsi_shell'
+lt_shell_append='$lt_shell_append'
+
+# See if we are running on zsh, and set the options which allow our
+# commands through without removal of \ escapes INIT.
+if test -n "\${ZSH_VERSION+set}" ; then
+   setopt NO_GLOB_SUBST
+fi
+
+
+    PACKAGE='$PACKAGE'
+    VERSION='$VERSION'
+    TIMESTAMP='$TIMESTAMP'
+    RM='$RM'
+    ofile='$ofile'
+
+
+
+
+
+
+
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+
+# Handling of arguments.
+for ac_config_target in $ac_config_targets
+do
+  case $ac_config_target in
+    "docs/Doxyfile") CONFIG_FILES="$CONFIG_FILES docs/Doxyfile" ;;
+    "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;;
+    "libtool") CONFIG_COMMANDS="$CONFIG_COMMANDS libtool" ;;
+    "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;;
+    "libsrc/nfconfig1.inc") CONFIG_HEADERS="$CONFIG_HEADERS libsrc/nfconfig1.inc:libsrc/nfconfig.in" ;;
+    "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;;
+    "nf-config") CONFIG_FILES="$CONFIG_FILES nf-config" ;;
+    "netcdf-fortran.pc") CONFIG_FILES="$CONFIG_FILES netcdf-fortran.pc" ;;
+    "docs/Makefile") CONFIG_FILES="$CONFIG_FILES docs/Makefile" ;;
+    "libsrc/Makefile") CONFIG_FILES="$CONFIG_FILES libsrc/Makefile" ;;
+    "fortran/Makefile") CONFIG_FILES="$CONFIG_FILES fortran/Makefile" ;;
+    "nf_test/Makefile") CONFIG_FILES="$CONFIG_FILES nf_test/Makefile" ;;
+    "nf03_test/Makefile") CONFIG_FILES="$CONFIG_FILES nf03_test/Makefile" ;;
+    "CMakeExtras/Makefile") CONFIG_FILES="$CONFIG_FILES CMakeExtras/Makefile" ;;
+    "examples/Makefile") CONFIG_FILES="$CONFIG_FILES examples/Makefile" ;;
+    "examples/F90/Makefile") CONFIG_FILES="$CONFIG_FILES examples/F90/Makefile" ;;
+    "examples/F77/Makefile") CONFIG_FILES="$CONFIG_FILES examples/F77/Makefile" ;;
+
+  *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;;
+  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
+  test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers
+  test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands
+fi
+
+# Have a temporary directory for convenience.  Make it in the build tree
+# simply because there is no reason against having it here, and in addition,
+# creating and moving files from /tmp can sometimes cause problems.
+# Hook for its removal unless debugging.
+# Note that there is a small window in which the directory will not be cleaned:
+# after its creation but before its name has been assigned to `$tmp'.
+$debug ||
+{
+  tmp= ac_tmp=
+  trap 'exit_status=$?
+  : "${ac_tmp:=$tmp}"
+  { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status
+' 0
+  trap 'as_fn_exit 1' 1 2 13 15
+}
+# Create a (secure) tmp directory for tmp files.
+
+{
+  tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` &&
+  test -d "$tmp"
+}  ||
+{
+  tmp=./conf$$-$RANDOM
+  (umask 077 && mkdir "$tmp")
+} || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5
+ac_tmp=$tmp
+
+# Set up the scripts for CONFIG_FILES section.
+# No need to generate them if there are no CONFIG_FILES.
+# This happens for instance with `./config.status config.h'.
+if test -n "$CONFIG_FILES"; then
+
+
+ac_cr=`echo X | tr X '\015'`
+# On cygwin, bash can eat \r inside `` if the user requested igncr.
+# But we know of no other shell where ac_cr would be empty at this
+# point, so we can use a bashism as a fallback.
+if test "x$ac_cr" = x; then
+  eval ac_cr=\$\'\\r\'
+fi
+ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' </dev/null 2>/dev/null`
+if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then
+  ac_cs_awk_cr='\\r'
+else
+  ac_cs_awk_cr=$ac_cr
+fi
+
+echo 'BEGIN {' >"$ac_tmp/subs1.awk" &&
+_ACEOF
+
+
+{
+  echo "cat >conf$$subs.awk <<_ACEOF" &&
+  echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' &&
+  echo "_ACEOF"
+} >conf$$subs.sh ||
+  as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
+ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'`
+ac_delim='%!_!# '
+for ac_last_try in false false false false false :; do
+  . ./conf$$subs.sh ||
+    as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
+
+  ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X`
+  if test $ac_delim_n = $ac_delim_num; then
+    break
+  elif $ac_last_try; then
+    as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
+  else
+    ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
+  fi
+done
+rm -f conf$$subs.sh
+
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK &&
+_ACEOF
+sed -n '
+h
+s/^/S["/; s/!.*/"]=/
+p
+g
+s/^[^!]*!//
+:repl
+t repl
+s/'"$ac_delim"'$//
+t delim
+:nl
+h
+s/\(.\{148\}\)..*/\1/
+t more1
+s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/
+p
+n
+b repl
+:more1
+s/["\\]/\\&/g; s/^/"/; s/$/"\\/
+p
+g
+s/.\{148\}//
+t nl
+:delim
+h
+s/\(.\{148\}\)..*/\1/
+t more2
+s/["\\]/\\&/g; s/^/"/; s/$/"/
+p
+b
+:more2
+s/["\\]/\\&/g; s/^/"/; s/$/"\\/
+p
+g
+s/.\{148\}//
+t delim
+' <conf$$subs.awk | sed '
+/^[^""]/{
+  N
+  s/\n//
+}
+' >>$CONFIG_STATUS || ac_write_fail=1
+rm -f conf$$subs.awk
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+_ACAWK
+cat >>"\$ac_tmp/subs1.awk" <<_ACAWK &&
+  for (key in S) S_is_set[key] = 1
+  FS = ""
+
+}
+{
+  line = $ 0
+  nfields = split(line, field, "@")
+  substed = 0
+  len = length(field[1])
+  for (i = 2; i < nfields; i++) {
+    key = field[i]
+    keylen = length(key)
+    if (S_is_set[key]) {
+      value = S[key]
+      line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3)
+      len += length(value) + length(field[++i])
+      substed = 1
+    } else
+      len += 1 + keylen
+  }
+
+  print line
+}
+
+_ACAWK
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then
+  sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g"
+else
+  cat
+fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \
+  || as_fn_error $? "could not setup config files machinery" "$LINENO" 5
+_ACEOF
+
+# VPATH may cause trouble with some makes, so we remove sole $(srcdir),
+# ${srcdir} and @srcdir@ entries 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[	 ]*=[	 ]*/{
+h
+s///
+s/^/:/
+s/[	 ]*$/:/
+s/:\$(srcdir):/:/g
+s/:\${srcdir}:/:/g
+s/:@srcdir@:/:/g
+s/^:*//
+s/:*$//
+x
+s/\(=[	 ]*\).*/\1/
+G
+s/\n//
+s/^[^=]*=[	 ]*$//
+}'
+fi
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+fi # test -n "$CONFIG_FILES"
+
+# Set up the scripts for CONFIG_HEADERS section.
+# No need to generate them if there are no CONFIG_HEADERS.
+# This happens for instance with `./config.status Makefile'.
+if test -n "$CONFIG_HEADERS"; then
+cat >"$ac_tmp/defines.awk" <<\_ACAWK ||
+BEGIN {
+_ACEOF
+
+# Transform confdefs.h into an awk script `defines.awk', embedded as
+# here-document in config.status, that substitutes the proper values into
+# config.h.in to produce config.h.
+
+# Create a delimiter string that does not exist in confdefs.h, to ease
+# handling of long lines.
+ac_delim='%!_!# '
+for ac_last_try in false false :; do
+  ac_tt=`sed -n "/$ac_delim/p" confdefs.h`
+  if test -z "$ac_tt"; then
+    break
+  elif $ac_last_try; then
+    as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5
+  else
+    ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
+  fi
+done
+
+# For the awk script, D is an array of macro values keyed by name,
+# likewise P contains macro parameters if any.  Preserve backslash
+# newline sequences.
+
+ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]*
+sed -n '
+s/.\{148\}/&'"$ac_delim"'/g
+t rset
+:rset
+s/^[	 ]*#[	 ]*define[	 ][	 ]*/ /
+t def
+d
+:def
+s/\\$//
+t bsnl
+s/["\\]/\\&/g
+s/^ \('"$ac_word_re"'\)\(([^()]*)\)[	 ]*\(.*\)/P["\1"]="\2"\
+D["\1"]=" \3"/p
+s/^ \('"$ac_word_re"'\)[	 ]*\(.*\)/D["\1"]=" \2"/p
+d
+:bsnl
+s/["\\]/\\&/g
+s/^ \('"$ac_word_re"'\)\(([^()]*)\)[	 ]*\(.*\)/P["\1"]="\2"\
+D["\1"]=" \3\\\\\\n"\\/p
+t cont
+s/^ \('"$ac_word_re"'\)[	 ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p
+t cont
+d
+:cont
+n
+s/.\{148\}/&'"$ac_delim"'/g
+t clear
+:clear
+s/\\$//
+t bsnlc
+s/["\\]/\\&/g; s/^/"/; s/$/"/p
+d
+:bsnlc
+s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p
+b cont
+' <confdefs.h | sed '
+s/'"$ac_delim"'/"\\\
+"/g' >>$CONFIG_STATUS || ac_write_fail=1
+
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+  for (key in D) D_is_set[key] = 1
+  FS = ""
+}
+/^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ {
+  line = \$ 0
+  split(line, arg, " ")
+  if (arg[1] == "#") {
+    defundef = arg[2]
+    mac1 = arg[3]
+  } else {
+    defundef = substr(arg[1], 2)
+    mac1 = arg[2]
+  }
+  split(mac1, mac2, "(") #)
+  macro = mac2[1]
+  prefix = substr(line, 1, index(line, defundef) - 1)
+  if (D_is_set[macro]) {
+    # Preserve the white space surrounding the "#".
+    print prefix "define", macro P[macro] D[macro]
+    next
+  } else {
+    # Replace #undef with comments.  This is necessary, for example,
+    # in the case of _POSIX_SOURCE, which is predefined and required
+    # on some systems where configure will not decide to define it.
+    if (defundef == "undef") {
+      print "/*", prefix defundef, macro, "*/"
+      next
+    }
+  }
+}
+{ print }
+_ACAWK
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+  as_fn_error $? "could not setup config headers machinery" "$LINENO" 5
+fi # test -n "$CONFIG_HEADERS"
+
+
+eval set X "  :F $CONFIG_FILES  :H $CONFIG_HEADERS    :C $CONFIG_COMMANDS"
+shift
+for ac_tag
+do
+  case $ac_tag in
+  :[FHLC]) ac_mode=$ac_tag; continue;;
+  esac
+  case $ac_mode$ac_tag in
+  :[FHL]*:*);;
+  :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;;
+  :[FH]-) ac_tag=-:-;;
+  :[FH]*) ac_tag=$ac_tag:$ac_tag.in;;
+  esac
+  ac_save_IFS=$IFS
+  IFS=:
+  set x $ac_tag
+  IFS=$ac_save_IFS
+  shift
+  ac_file=$1
+  shift
+
+  case $ac_mode in
+  :L) ac_source=$1;;
+  :[FH])
+    ac_file_inputs=
+    for ac_f
+    do
+      case $ac_f in
+      -) ac_f="$ac_tmp/stdin";;
+      *) # Look for the file first in the build tree, then in the source tree
+	 # (if the path is not absolute).  The absolute path cannot be DOS-style,
+	 # because $ac_f cannot contain `:'.
+	 test -f "$ac_f" ||
+	   case $ac_f in
+	   [\\/$]*) false;;
+	   *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";;
+	   esac ||
+	   as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;;
+      esac
+      case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac
+      as_fn_append ac_file_inputs " '$ac_f'"
+    done
+
+    # Let's still pretend it is `configure' which instantiates (i.e., don't
+    # use $as_me), people would be surprised to read:
+    #    /* config.h.  Generated by config.status.  */
+    configure_input='Generated from '`
+	  $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g'
+	`' by configure.'
+    if test x"$ac_file" != x-; then
+      configure_input="$ac_file.  $configure_input"
+      { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5
+$as_echo "$as_me: creating $ac_file" >&6;}
+    fi
+    # Neutralize special characters interpreted by sed in replacement strings.
+    case $configure_input in #(
+    *\&* | *\|* | *\\* )
+       ac_sed_conf_input=`$as_echo "$configure_input" |
+       sed 's/[\\\\&|]/\\\\&/g'`;; #(
+    *) ac_sed_conf_input=$configure_input;;
+    esac
+
+    case $ac_tag in
+    *:-:* | *:-) cat >"$ac_tmp/stdin" \
+      || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;;
+    esac
+    ;;
+  esac
+
+  ac_dir=`$as_dirname -- "$ac_file" ||
+$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$ac_file" : 'X\(//\)[^/]' \| \
+	 X"$ac_file" : 'X\(//\)$' \| \
+	 X"$ac_file" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$ac_file" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)[^/].*/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+  as_dir="$ac_dir"; as_fn_mkdir_p
+  ac_builddir=.
+
+case "$ac_dir" in
+.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
+*)
+  ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'`
+  # A ".." for each directory in $ac_dir_suffix.
+  ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
+  case $ac_top_builddir_sub in
+  "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
+  *)  ac_top_build_prefix=$ac_top_builddir_sub/ ;;
+  esac ;;
+esac
+ac_abs_top_builddir=$ac_pwd
+ac_abs_builddir=$ac_pwd$ac_dir_suffix
+# for backward compatibility:
+ac_top_builddir=$ac_top_build_prefix
+
+case $srcdir in
+  .)  # We are building in place.
+    ac_srcdir=.
+    ac_top_srcdir=$ac_top_builddir_sub
+    ac_abs_top_srcdir=$ac_pwd ;;
+  [\\/]* | ?:[\\/]* )  # Absolute name.
+    ac_srcdir=$srcdir$ac_dir_suffix;
+    ac_top_srcdir=$srcdir
+    ac_abs_top_srcdir=$srcdir ;;
+  *) # Relative name.
+    ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
+    ac_top_srcdir=$ac_top_build_prefix$srcdir
+    ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
+esac
+ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
+
+
+  case $ac_mode in
+  :F)
+  #
+  # CONFIG_FILE
+  #
+
+  case $INSTALL in
+  [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;;
+  *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;;
+  esac
+  ac_MKDIR_P=$MKDIR_P
+  case $MKDIR_P in
+  [\\/$]* | ?:[\\/]* ) ;;
+  */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;;
+  esac
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+# If the template does not know about datarootdir, expand it.
+# FIXME: This hack should be removed a few years after 2.60.
+ac_datarootdir_hack=; ac_datarootdir_seen=
+ac_sed_dataroot='
+/datarootdir/ {
+  p
+  q
+}
+/@datadir@/p
+/@docdir@/p
+/@infodir@/p
+/@localedir@/p
+/@mandir@/p'
+case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in
+*datarootdir*) ac_datarootdir_seen=yes;;
+*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*)
+  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5
+$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;}
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+  ac_datarootdir_hack='
+  s&@datadir@&$datadir&g
+  s&@docdir@&$docdir&g
+  s&@infodir@&$infodir&g
+  s&@localedir@&$localedir&g
+  s&@mandir@&$mandir&g
+  s&\\\${datarootdir}&$datarootdir&g' ;;
+esac
+_ACEOF
+
+# Neutralize VPATH when `$srcdir' = `.'.
+# Shell code in configure.ac might set extrasub.
+# FIXME: do we really want to maintain this feature?
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+ac_sed_extra="$ac_vpsub
+$extrasub
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+:t
+/@[a-zA-Z_][a-zA-Z_0-9]*@/!b
+s|@configure_input@|$ac_sed_conf_input|;t t
+s&@top_builddir@&$ac_top_builddir_sub&;t t
+s&@top_build_prefix@&$ac_top_build_prefix&;t t
+s&@srcdir@&$ac_srcdir&;t t
+s&@abs_srcdir@&$ac_abs_srcdir&;t t
+s&@top_srcdir@&$ac_top_srcdir&;t t
+s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t
+s&@builddir@&$ac_builddir&;t t
+s&@abs_builddir@&$ac_abs_builddir&;t t
+s&@abs_top_builddir@&$ac_abs_top_builddir&;t t
+s&@INSTALL@&$ac_INSTALL&;t t
+s&@MKDIR_P@&$ac_MKDIR_P&;t t
+$ac_datarootdir_hack
+"
+eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \
+  >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5
+
+test -z "$ac_datarootdir_hack$ac_datarootdir_seen" &&
+  { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } &&
+  { ac_out=`sed -n '/^[	 ]*datarootdir[	 ]*:*=/p' \
+      "$ac_tmp/out"`; test -z "$ac_out"; } &&
+  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir'
+which seems to be undefined.  Please make sure it is defined" >&5
+$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir'
+which seems to be undefined.  Please make sure it is defined" >&2;}
+
+  rm -f "$ac_tmp/stdin"
+  case $ac_file in
+  -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";;
+  *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";;
+  esac \
+  || as_fn_error $? "could not create $ac_file" "$LINENO" 5
+ ;;
+  :H)
+  #
+  # CONFIG_HEADER
+  #
+  if test x"$ac_file" != x-; then
+    {
+      $as_echo "/* $configure_input  */" \
+      && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs"
+    } >"$ac_tmp/config.h" \
+      || as_fn_error $? "could not create $ac_file" "$LINENO" 5
+    if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then
+      { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5
+$as_echo "$as_me: $ac_file is unchanged" >&6;}
+    else
+      rm -f "$ac_file"
+      mv "$ac_tmp/config.h" "$ac_file" \
+	|| as_fn_error $? "could not create $ac_file" "$LINENO" 5
+    fi
+  else
+    $as_echo "/* $configure_input  */" \
+      && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \
+      || as_fn_error $? "could not create -" "$LINENO" 5
+  fi
+# Compute "$ac_file"'s index in $config_headers.
+_am_arg="$ac_file"
+_am_stamp_count=1
+for _am_header in $config_headers :; do
+  case $_am_header in
+    $_am_arg | $_am_arg:* )
+      break ;;
+    * )
+      _am_stamp_count=`expr $_am_stamp_count + 1` ;;
+  esac
+done
+echo "timestamp for $_am_arg" >`$as_dirname -- "$_am_arg" ||
+$as_expr X"$_am_arg" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$_am_arg" : 'X\(//\)[^/]' \| \
+	 X"$_am_arg" : 'X\(//\)$' \| \
+	 X"$_am_arg" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$_am_arg" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)[^/].*/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`/stamp-h$_am_stamp_count
+ ;;
+
+  :C)  { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5
+$as_echo "$as_me: executing $ac_file commands" >&6;}
+ ;;
+  esac
+
+
+  case $ac_file$ac_mode in
+    "depfiles":C) test x"$AMDEP_TRUE" != x"" || {
+  # Older Autoconf quotes --file arguments for eval, but not when files
+  # are listed without --file.  Let's play safe and only enable the eval
+  # if we detect the quoting.
+  case $CONFIG_FILES in
+  *\'*) eval set x "$CONFIG_FILES" ;;
+  *)   set x $CONFIG_FILES ;;
+  esac
+  shift
+  for mf
+  do
+    # Strip MF so we end up with the name of the file.
+    mf=`echo "$mf" | sed -e 's/:.*$//'`
+    # Check whether this is an Automake generated Makefile or not.
+    # We used to match only the files named 'Makefile.in', but
+    # some people rename them; so instead we look at the file content.
+    # Grep'ing the first line is not enough: some people post-process
+    # each Makefile.in and add a new line on top of each file to say so.
+    # Grep'ing the whole file is not good either: AIX grep has a line
+    # limit of 2048, but all sed's we know have understand at least 4000.
+    if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then
+      dirpart=`$as_dirname -- "$mf" ||
+$as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$mf" : 'X\(//\)[^/]' \| \
+	 X"$mf" : 'X\(//\)$' \| \
+	 X"$mf" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$mf" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)[^/].*/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+    else
+      continue
+    fi
+    # Extract the definition of DEPDIR, am__include, and am__quote
+    # from the Makefile without running 'make'.
+    DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"`
+    test -z "$DEPDIR" && continue
+    am__include=`sed -n 's/^am__include = //p' < "$mf"`
+    test -z "$am__include" && continue
+    am__quote=`sed -n 's/^am__quote = //p' < "$mf"`
+    # Find all dependency output files, they are included files with
+    # $(DEPDIR) in their names.  We invoke sed twice because it is the
+    # simplest approach to changing $(DEPDIR) to its actual value in the
+    # expansion.
+    for file in `sed -n "
+      s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \
+	 sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do
+      # Make sure the directory exists.
+      test -f "$dirpart/$file" && continue
+      fdir=`$as_dirname -- "$file" ||
+$as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$file" : 'X\(//\)[^/]' \| \
+	 X"$file" : 'X\(//\)$' \| \
+	 X"$file" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$file" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)[^/].*/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+      as_dir=$dirpart/$fdir; as_fn_mkdir_p
+      # echo "creating $dirpart/$file"
+      echo '# dummy' > "$dirpart/$file"
+    done
+  done
+}
+ ;;
+    "libtool":C)
+
+    # See if we are running on zsh, and set the options which allow our
+    # commands through without removal of \ escapes.
+    if test -n "${ZSH_VERSION+set}" ; then
+      setopt NO_GLOB_SUBST
+    fi
+
+    cfgfile="${ofile}T"
+    trap "$RM \"$cfgfile\"; exit 1" 1 2 15
+    $RM "$cfgfile"
+
+    cat <<_LT_EOF >> "$cfgfile"
+#! $SHELL
+
+# `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services.
+# Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION
+# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
+# NOTE: Changes made to this file will be lost: look at ltmain.sh.
+#
+#   Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005,
+#                 2006, 2007, 2008, 2009, 2010, 2011 Free Software
+#                 Foundation, Inc.
+#   Written by Gordon Matzigkeit, 1996
+#
+#   This file is part of GNU Libtool.
+#
+# GNU Libtool is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License as
+# published by the Free Software Foundation; either version 2 of
+# the License, or (at your option) any later version.
+#
+# As a special exception to the GNU General Public License,
+# if you distribute this file as part of a program or library that
+# is built using GNU Libtool, you may include this file under the
+# same distribution terms that you use for the rest of that program.
+#
+# GNU Libtool is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GNU Libtool; see the file COPYING.  If not, a copy
+# can be downloaded from http://www.gnu.org/licenses/gpl.html, or
+# obtained by writing to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+
+# The names of the tagged configurations supported by this script.
+available_tags="F77 FC "
+
+# ### BEGIN LIBTOOL CONFIG
+
+# Which release of libtool.m4 was used?
+macro_version=$macro_version
+macro_revision=$macro_revision
+
+# Whether or not to build shared libraries.
+build_libtool_libs=$enable_shared
+
+# Whether or not to build static libraries.
+build_old_libs=$enable_static
+
+# What type of objects to build.
+pic_mode=$pic_mode
+
+# Whether or not to optimize for fast installation.
+fast_install=$enable_fast_install
+
+# Shell to use when invoking shell scripts.
+SHELL=$lt_SHELL
+
+# An echo program that protects backslashes.
+ECHO=$lt_ECHO
+
+# The PATH separator for the build system.
+PATH_SEPARATOR=$lt_PATH_SEPARATOR
+
+# The host system.
+host_alias=$host_alias
+host=$host
+host_os=$host_os
+
+# The build system.
+build_alias=$build_alias
+build=$build
+build_os=$build_os
+
+# A sed program that does not truncate output.
+SED=$lt_SED
+
+# Sed that helps us avoid accidentally triggering echo(1) options like -n.
+Xsed="\$SED -e 1s/^X//"
+
+# A grep program that handles long lines.
+GREP=$lt_GREP
+
+# An ERE matcher.
+EGREP=$lt_EGREP
+
+# A literal string matcher.
+FGREP=$lt_FGREP
+
+# A BSD- or MS-compatible name lister.
+NM=$lt_NM
+
+# Whether we need soft or hard links.
+LN_S=$lt_LN_S
+
+# What is the maximum length of a command?
+max_cmd_len=$max_cmd_len
+
+# Object file suffix (normally "o").
+objext=$ac_objext
+
+# Executable file suffix (normally "").
+exeext=$exeext
+
+# whether the shell understands "unset".
+lt_unset=$lt_unset
+
+# turn spaces into newlines.
+SP2NL=$lt_lt_SP2NL
+
+# turn newlines into spaces.
+NL2SP=$lt_lt_NL2SP
+
+# convert \$build file names to \$host format.
+to_host_file_cmd=$lt_cv_to_host_file_cmd
+
+# convert \$build files to toolchain format.
+to_tool_file_cmd=$lt_cv_to_tool_file_cmd
+
+# An object symbol dumper.
+OBJDUMP=$lt_OBJDUMP
+
+# Method to check whether dependent libraries are shared objects.
+deplibs_check_method=$lt_deplibs_check_method
+
+# Command to use when deplibs_check_method = "file_magic".
+file_magic_cmd=$lt_file_magic_cmd
+
+# How to find potential files when deplibs_check_method = "file_magic".
+file_magic_glob=$lt_file_magic_glob
+
+# Find potential files using nocaseglob when deplibs_check_method = "file_magic".
+want_nocaseglob=$lt_want_nocaseglob
+
+# DLL creation program.
+DLLTOOL=$lt_DLLTOOL
+
+# Command to associate shared and link libraries.
+sharedlib_from_linklib_cmd=$lt_sharedlib_from_linklib_cmd
+
+# The archiver.
+AR=$lt_AR
+
+# Flags to create an archive.
+AR_FLAGS=$lt_AR_FLAGS
+
+# How to feed a file listing to the archiver.
+archiver_list_spec=$lt_archiver_list_spec
+
+# A symbol stripping program.
+STRIP=$lt_STRIP
+
+# Commands used to install an old-style archive.
+RANLIB=$lt_RANLIB
+old_postinstall_cmds=$lt_old_postinstall_cmds
+old_postuninstall_cmds=$lt_old_postuninstall_cmds
+
+# Whether to use a lock for old archive extraction.
+lock_old_archive_extraction=$lock_old_archive_extraction
+
+# A C compiler.
+LTCC=$lt_CC
+
+# LTCC compiler flags.
+LTCFLAGS=$lt_CFLAGS
+
+# Take the output of nm and produce a listing of raw symbols and C names.
+global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe
+
+# Transform the output of nm in a proper C declaration.
+global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl
+
+# Transform the output of nm in a C name address pair.
+global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address
+
+# Transform the output of nm in a C name address pair when lib prefix is needed.
+global_symbol_to_c_name_address_lib_prefix=$lt_lt_cv_sys_global_symbol_to_c_name_address_lib_prefix
+
+# Specify filename containing input files for \$NM.
+nm_file_list_spec=$lt_nm_file_list_spec
+
+# The root where to search for dependent libraries,and in which our libraries should be installed.
+lt_sysroot=$lt_sysroot
+
+# The name of the directory that contains temporary libtool files.
+objdir=$objdir
+
+# Used to examine libraries when file_magic_cmd begins with "file".
+MAGIC_CMD=$MAGIC_CMD
+
+# Must we lock files when doing compilation?
+need_locks=$lt_need_locks
+
+# Manifest tool.
+MANIFEST_TOOL=$lt_MANIFEST_TOOL
+
+# Tool to manipulate archived DWARF debug symbol files on Mac OS X.
+DSYMUTIL=$lt_DSYMUTIL
+
+# Tool to change global to local symbols on Mac OS X.
+NMEDIT=$lt_NMEDIT
+
+# Tool to manipulate fat objects and archives on Mac OS X.
+LIPO=$lt_LIPO
+
+# ldd/readelf like tool for Mach-O binaries on Mac OS X.
+OTOOL=$lt_OTOOL
+
+# ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4.
+OTOOL64=$lt_OTOOL64
+
+# Old archive suffix (normally "a").
+libext=$libext
+
+# Shared library suffix (normally ".so").
+shrext_cmds=$lt_shrext_cmds
+
+# The commands to extract the exported symbol list from a shared archive.
+extract_expsyms_cmds=$lt_extract_expsyms_cmds
+
+# Variables whose values should be saved in libtool wrapper scripts and
+# restored at link time.
+variables_saved_for_relink=$lt_variables_saved_for_relink
+
+# Do we need the "lib" prefix for modules?
+need_lib_prefix=$need_lib_prefix
+
+# Do we need a version for libraries?
+need_version=$need_version
+
+# Library versioning type.
+version_type=$version_type
+
+# Shared library runtime path variable.
+runpath_var=$runpath_var
+
+# Shared library path variable.
+shlibpath_var=$shlibpath_var
+
+# Is shlibpath searched before the hard-coded library search path?
+shlibpath_overrides_runpath=$shlibpath_overrides_runpath
+
+# Format of library name prefix.
+libname_spec=$lt_libname_spec
+
+# List of archive names.  First name is the real one, the rest are links.
+# The last name is the one that the linker finds with -lNAME
+library_names_spec=$lt_library_names_spec
+
+# The coded name of the library, if different from the real name.
+soname_spec=$lt_soname_spec
+
+# Permission mode override for installation of shared libraries.
+install_override_mode=$lt_install_override_mode
+
+# Command to use after installation of a shared archive.
+postinstall_cmds=$lt_postinstall_cmds
+
+# Command to use after uninstallation of a shared archive.
+postuninstall_cmds=$lt_postuninstall_cmds
+
+# Commands used to finish a libtool library installation in a directory.
+finish_cmds=$lt_finish_cmds
+
+# As "finish_cmds", except a single script fragment to be evaled but
+# not shown.
+finish_eval=$lt_finish_eval
+
+# Whether we should hardcode library paths into libraries.
+hardcode_into_libs=$hardcode_into_libs
+
+# Compile-time system search path for libraries.
+sys_lib_search_path_spec=$lt_sys_lib_search_path_spec
+
+# Run-time system search path for libraries.
+sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec
+
+# Whether dlopen is supported.
+dlopen_support=$enable_dlopen
+
+# Whether dlopen of programs is supported.
+dlopen_self=$enable_dlopen_self
+
+# Whether dlopen of statically linked programs is supported.
+dlopen_self_static=$enable_dlopen_self_static
+
+# Commands to strip libraries.
+old_striplib=$lt_old_striplib
+striplib=$lt_striplib
+
+
+# The linker used to build libraries.
+LD=$lt_LD
+
+# How to create reloadable object files.
+reload_flag=$lt_reload_flag
+reload_cmds=$lt_reload_cmds
+
+# Commands used to build an old-style archive.
+old_archive_cmds=$lt_old_archive_cmds
+
+# A language specific compiler.
+CC=$lt_compiler
+
+# Is the compiler the GNU compiler?
+with_gcc=$GCC
+
+# Compiler flag to turn off builtin functions.
+no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag
+
+# Additional compiler flags for building library objects.
+pic_flag=$lt_lt_prog_compiler_pic
+
+# How to pass a linker flag through the compiler.
+wl=$lt_lt_prog_compiler_wl
+
+# Compiler flag to prevent dynamic linking.
+link_static_flag=$lt_lt_prog_compiler_static
+
+# Does compiler simultaneously support -c and -o options?
+compiler_c_o=$lt_lt_cv_prog_compiler_c_o
+
+# Whether or not to add -lc for building shared libraries.
+build_libtool_need_lc=$archive_cmds_need_lc
+
+# Whether or not to disallow shared libs when runtime libs are static.
+allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes
+
+# Compiler flag to allow reflexive dlopens.
+export_dynamic_flag_spec=$lt_export_dynamic_flag_spec
+
+# Compiler flag to generate shared objects directly from archives.
+whole_archive_flag_spec=$lt_whole_archive_flag_spec
+
+# Whether the compiler copes with passing no objects directly.
+compiler_needs_object=$lt_compiler_needs_object
+
+# Create an old-style archive from a shared archive.
+old_archive_from_new_cmds=$lt_old_archive_from_new_cmds
+
+# Create a temporary old-style archive to link instead of a shared archive.
+old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds
+
+# Commands used to build a shared archive.
+archive_cmds=$lt_archive_cmds
+archive_expsym_cmds=$lt_archive_expsym_cmds
+
+# Commands used to build a loadable module if different from building
+# a shared archive.
+module_cmds=$lt_module_cmds
+module_expsym_cmds=$lt_module_expsym_cmds
+
+# Whether we are building with GNU ld or not.
+with_gnu_ld=$lt_with_gnu_ld
+
+# Flag that allows shared libraries with undefined symbols to be built.
+allow_undefined_flag=$lt_allow_undefined_flag
+
+# Flag that enforces no undefined symbols.
+no_undefined_flag=$lt_no_undefined_flag
+
+# Flag to hardcode \$libdir into a binary during linking.
+# This must work even if \$libdir does not exist
+hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec
+
+# Whether we need a single "-rpath" flag with a separated argument.
+hardcode_libdir_separator=$lt_hardcode_libdir_separator
+
+# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes
+# DIR into the resulting binary.
+hardcode_direct=$hardcode_direct
+
+# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes
+# DIR into the resulting binary and the resulting library dependency is
+# "absolute",i.e impossible to change by setting \${shlibpath_var} if the
+# library is relocated.
+hardcode_direct_absolute=$hardcode_direct_absolute
+
+# Set to "yes" if using the -LDIR flag during linking hardcodes DIR
+# into the resulting binary.
+hardcode_minus_L=$hardcode_minus_L
+
+# Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR
+# into the resulting binary.
+hardcode_shlibpath_var=$hardcode_shlibpath_var
+
+# Set to "yes" if building a shared library automatically hardcodes DIR
+# into the library and all subsequent libraries and executables linked
+# against it.
+hardcode_automatic=$hardcode_automatic
+
+# Set to yes if linker adds runtime paths of dependent libraries
+# to runtime path list.
+inherit_rpath=$inherit_rpath
+
+# Whether libtool must link a program against all its dependency libraries.
+link_all_deplibs=$link_all_deplibs
+
+# Set to "yes" if exported symbols are required.
+always_export_symbols=$always_export_symbols
+
+# The commands to list exported symbols.
+export_symbols_cmds=$lt_export_symbols_cmds
+
+# Symbols that should not be listed in the preloaded symbols.
+exclude_expsyms=$lt_exclude_expsyms
+
+# Symbols that must always be exported.
+include_expsyms=$lt_include_expsyms
+
+# Commands necessary for linking programs (against libraries) with templates.
+prelink_cmds=$lt_prelink_cmds
+
+# Commands necessary for finishing linking programs.
+postlink_cmds=$lt_postlink_cmds
+
+# Specify filename containing input files.
+file_list_spec=$lt_file_list_spec
+
+# How to hardcode a shared library path into an executable.
+hardcode_action=$hardcode_action
+
+# The directories searched by this compiler when creating a shared library.
+compiler_lib_search_dirs=$lt_compiler_lib_search_dirs
+
+# Dependencies to place before and after the objects being linked to
+# create a shared library.
+predep_objects=$lt_predep_objects
+postdep_objects=$lt_postdep_objects
+predeps=$lt_predeps
+postdeps=$lt_postdeps
+
+# The library search path used internally by the compiler when linking
+# a shared library.
+compiler_lib_search_path=$lt_compiler_lib_search_path
+
+# ### END LIBTOOL CONFIG
+
+_LT_EOF
+
+  case $host_os in
+  aix3*)
+    cat <<\_LT_EOF >> "$cfgfile"
+# AIX sometimes has problems with the GCC collect2 program.  For some
+# reason, if we set the COLLECT_NAMES environment variable, the problems
+# vanish in a puff of smoke.
+if test "X${COLLECT_NAMES+set}" != Xset; then
+  COLLECT_NAMES=
+  export COLLECT_NAMES
+fi
+_LT_EOF
+    ;;
+  esac
+
+
+ltmain="$ac_aux_dir/ltmain.sh"
+
+
+  # We use sed instead of cat because bash on DJGPP gets confused if
+  # if finds mixed CR/LF and LF-only lines.  Since sed operates in
+  # text mode, it properly converts lines to CR/LF.  This bash problem
+  # is reportedly fixed, but why not run on old versions too?
+  sed '$q' "$ltmain" >> "$cfgfile" \
+     || (rm -f "$cfgfile"; exit 1)
+
+  if test x"$xsi_shell" = xyes; then
+  sed -e '/^func_dirname ()$/,/^} # func_dirname /c\
+func_dirname ()\
+{\
+\    case ${1} in\
+\      */*) func_dirname_result="${1%/*}${2}" ;;\
+\      *  ) func_dirname_result="${3}" ;;\
+\    esac\
+} # Extended-shell func_dirname implementation' "$cfgfile" > $cfgfile.tmp \
+  && mv -f "$cfgfile.tmp" "$cfgfile" \
+    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+test 0 -eq $? || _lt_function_replace_fail=:
+
+
+  sed -e '/^func_basename ()$/,/^} # func_basename /c\
+func_basename ()\
+{\
+\    func_basename_result="${1##*/}"\
+} # Extended-shell func_basename implementation' "$cfgfile" > $cfgfile.tmp \
+  && mv -f "$cfgfile.tmp" "$cfgfile" \
+    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+test 0 -eq $? || _lt_function_replace_fail=:
+
+
+  sed -e '/^func_dirname_and_basename ()$/,/^} # func_dirname_and_basename /c\
+func_dirname_and_basename ()\
+{\
+\    case ${1} in\
+\      */*) func_dirname_result="${1%/*}${2}" ;;\
+\      *  ) func_dirname_result="${3}" ;;\
+\    esac\
+\    func_basename_result="${1##*/}"\
+} # Extended-shell func_dirname_and_basename implementation' "$cfgfile" > $cfgfile.tmp \
+  && mv -f "$cfgfile.tmp" "$cfgfile" \
+    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+test 0 -eq $? || _lt_function_replace_fail=:
+
+
+  sed -e '/^func_stripname ()$/,/^} # func_stripname /c\
+func_stripname ()\
+{\
+\    # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are\
+\    # positional parameters, so assign one to ordinary parameter first.\
+\    func_stripname_result=${3}\
+\    func_stripname_result=${func_stripname_result#"${1}"}\
+\    func_stripname_result=${func_stripname_result%"${2}"}\
+} # Extended-shell func_stripname implementation' "$cfgfile" > $cfgfile.tmp \
+  && mv -f "$cfgfile.tmp" "$cfgfile" \
+    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+test 0 -eq $? || _lt_function_replace_fail=:
+
+
+  sed -e '/^func_split_long_opt ()$/,/^} # func_split_long_opt /c\
+func_split_long_opt ()\
+{\
+\    func_split_long_opt_name=${1%%=*}\
+\    func_split_long_opt_arg=${1#*=}\
+} # Extended-shell func_split_long_opt implementation' "$cfgfile" > $cfgfile.tmp \
+  && mv -f "$cfgfile.tmp" "$cfgfile" \
+    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+test 0 -eq $? || _lt_function_replace_fail=:
+
+
+  sed -e '/^func_split_short_opt ()$/,/^} # func_split_short_opt /c\
+func_split_short_opt ()\
+{\
+\    func_split_short_opt_arg=${1#??}\
+\    func_split_short_opt_name=${1%"$func_split_short_opt_arg"}\
+} # Extended-shell func_split_short_opt implementation' "$cfgfile" > $cfgfile.tmp \
+  && mv -f "$cfgfile.tmp" "$cfgfile" \
+    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+test 0 -eq $? || _lt_function_replace_fail=:
+
+
+  sed -e '/^func_lo2o ()$/,/^} # func_lo2o /c\
+func_lo2o ()\
+{\
+\    case ${1} in\
+\      *.lo) func_lo2o_result=${1%.lo}.${objext} ;;\
+\      *)    func_lo2o_result=${1} ;;\
+\    esac\
+} # Extended-shell func_lo2o implementation' "$cfgfile" > $cfgfile.tmp \
+  && mv -f "$cfgfile.tmp" "$cfgfile" \
+    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+test 0 -eq $? || _lt_function_replace_fail=:
+
+
+  sed -e '/^func_xform ()$/,/^} # func_xform /c\
+func_xform ()\
+{\
+    func_xform_result=${1%.*}.lo\
+} # Extended-shell func_xform implementation' "$cfgfile" > $cfgfile.tmp \
+  && mv -f "$cfgfile.tmp" "$cfgfile" \
+    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+test 0 -eq $? || _lt_function_replace_fail=:
+
+
+  sed -e '/^func_arith ()$/,/^} # func_arith /c\
+func_arith ()\
+{\
+    func_arith_result=$(( $* ))\
+} # Extended-shell func_arith implementation' "$cfgfile" > $cfgfile.tmp \
+  && mv -f "$cfgfile.tmp" "$cfgfile" \
+    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+test 0 -eq $? || _lt_function_replace_fail=:
+
+
+  sed -e '/^func_len ()$/,/^} # func_len /c\
+func_len ()\
+{\
+    func_len_result=${#1}\
+} # Extended-shell func_len implementation' "$cfgfile" > $cfgfile.tmp \
+  && mv -f "$cfgfile.tmp" "$cfgfile" \
+    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+test 0 -eq $? || _lt_function_replace_fail=:
+
+fi
+
+if test x"$lt_shell_append" = xyes; then
+  sed -e '/^func_append ()$/,/^} # func_append /c\
+func_append ()\
+{\
+    eval "${1}+=\\${2}"\
+} # Extended-shell func_append implementation' "$cfgfile" > $cfgfile.tmp \
+  && mv -f "$cfgfile.tmp" "$cfgfile" \
+    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+test 0 -eq $? || _lt_function_replace_fail=:
+
+
+  sed -e '/^func_append_quoted ()$/,/^} # func_append_quoted /c\
+func_append_quoted ()\
+{\
+\    func_quote_for_eval "${2}"\
+\    eval "${1}+=\\\\ \\$func_quote_for_eval_result"\
+} # Extended-shell func_append_quoted implementation' "$cfgfile" > $cfgfile.tmp \
+  && mv -f "$cfgfile.tmp" "$cfgfile" \
+    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+test 0 -eq $? || _lt_function_replace_fail=:
+
+
+  # Save a `func_append' function call where possible by direct use of '+='
+  sed -e 's%func_append \([a-zA-Z_]\{1,\}\) "%\1+="%g' $cfgfile > $cfgfile.tmp \
+    && mv -f "$cfgfile.tmp" "$cfgfile" \
+      || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+  test 0 -eq $? || _lt_function_replace_fail=:
+else
+  # Save a `func_append' function call even when '+=' is not available
+  sed -e 's%func_append \([a-zA-Z_]\{1,\}\) "%\1="$\1%g' $cfgfile > $cfgfile.tmp \
+    && mv -f "$cfgfile.tmp" "$cfgfile" \
+      || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+  test 0 -eq $? || _lt_function_replace_fail=:
+fi
+
+if test x"$_lt_function_replace_fail" = x":"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Unable to substitute extended shell functions in $ofile" >&5
+$as_echo "$as_me: WARNING: Unable to substitute extended shell functions in $ofile" >&2;}
+fi
+
+
+   mv -f "$cfgfile" "$ofile" ||
+    (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile")
+  chmod +x "$ofile"
+
+
+    cat <<_LT_EOF >> "$ofile"
+
+# ### BEGIN LIBTOOL TAG CONFIG: F77
+
+# The linker used to build libraries.
+LD=$lt_LD_F77
+
+# How to create reloadable object files.
+reload_flag=$lt_reload_flag_F77
+reload_cmds=$lt_reload_cmds_F77
+
+# Commands used to build an old-style archive.
+old_archive_cmds=$lt_old_archive_cmds_F77
+
+# A language specific compiler.
+CC=$lt_compiler_F77
+
+# Is the compiler the GNU compiler?
+with_gcc=$GCC_F77
+
+# Compiler flag to turn off builtin functions.
+no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_F77
+
+# Additional compiler flags for building library objects.
+pic_flag=$lt_lt_prog_compiler_pic_F77
+
+# How to pass a linker flag through the compiler.
+wl=$lt_lt_prog_compiler_wl_F77
+
+# Compiler flag to prevent dynamic linking.
+link_static_flag=$lt_lt_prog_compiler_static_F77
+
+# Does compiler simultaneously support -c and -o options?
+compiler_c_o=$lt_lt_cv_prog_compiler_c_o_F77
+
+# Whether or not to add -lc for building shared libraries.
+build_libtool_need_lc=$archive_cmds_need_lc_F77
+
+# Whether or not to disallow shared libs when runtime libs are static.
+allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_F77
+
+# Compiler flag to allow reflexive dlopens.
+export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_F77
+
+# Compiler flag to generate shared objects directly from archives.
+whole_archive_flag_spec=$lt_whole_archive_flag_spec_F77
+
+# Whether the compiler copes with passing no objects directly.
+compiler_needs_object=$lt_compiler_needs_object_F77
+
+# Create an old-style archive from a shared archive.
+old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_F77
+
+# Create a temporary old-style archive to link instead of a shared archive.
+old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_F77
+
+# Commands used to build a shared archive.
+archive_cmds=$lt_archive_cmds_F77
+archive_expsym_cmds=$lt_archive_expsym_cmds_F77
+
+# Commands used to build a loadable module if different from building
+# a shared archive.
+module_cmds=$lt_module_cmds_F77
+module_expsym_cmds=$lt_module_expsym_cmds_F77
+
+# Whether we are building with GNU ld or not.
+with_gnu_ld=$lt_with_gnu_ld_F77
+
+# Flag that allows shared libraries with undefined symbols to be built.
+allow_undefined_flag=$lt_allow_undefined_flag_F77
+
+# Flag that enforces no undefined symbols.
+no_undefined_flag=$lt_no_undefined_flag_F77
+
+# Flag to hardcode \$libdir into a binary during linking.
+# This must work even if \$libdir does not exist
+hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_F77
+
+# Whether we need a single "-rpath" flag with a separated argument.
+hardcode_libdir_separator=$lt_hardcode_libdir_separator_F77
+
+# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes
+# DIR into the resulting binary.
+hardcode_direct=$hardcode_direct_F77
+
+# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes
+# DIR into the resulting binary and the resulting library dependency is
+# "absolute",i.e impossible to change by setting \${shlibpath_var} if the
+# library is relocated.
+hardcode_direct_absolute=$hardcode_direct_absolute_F77
+
+# Set to "yes" if using the -LDIR flag during linking hardcodes DIR
+# into the resulting binary.
+hardcode_minus_L=$hardcode_minus_L_F77
+
+# Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR
+# into the resulting binary.
+hardcode_shlibpath_var=$hardcode_shlibpath_var_F77
+
+# Set to "yes" if building a shared library automatically hardcodes DIR
+# into the library and all subsequent libraries and executables linked
+# against it.
+hardcode_automatic=$hardcode_automatic_F77
+
+# Set to yes if linker adds runtime paths of dependent libraries
+# to runtime path list.
+inherit_rpath=$inherit_rpath_F77
+
+# Whether libtool must link a program against all its dependency libraries.
+link_all_deplibs=$link_all_deplibs_F77
+
+# Set to "yes" if exported symbols are required.
+always_export_symbols=$always_export_symbols_F77
+
+# The commands to list exported symbols.
+export_symbols_cmds=$lt_export_symbols_cmds_F77
+
+# Symbols that should not be listed in the preloaded symbols.
+exclude_expsyms=$lt_exclude_expsyms_F77
+
+# Symbols that must always be exported.
+include_expsyms=$lt_include_expsyms_F77
+
+# Commands necessary for linking programs (against libraries) with templates.
+prelink_cmds=$lt_prelink_cmds_F77
+
+# Commands necessary for finishing linking programs.
+postlink_cmds=$lt_postlink_cmds_F77
+
+# Specify filename containing input files.
+file_list_spec=$lt_file_list_spec_F77
+
+# How to hardcode a shared library path into an executable.
+hardcode_action=$hardcode_action_F77
+
+# The directories searched by this compiler when creating a shared library.
+compiler_lib_search_dirs=$lt_compiler_lib_search_dirs_F77
+
+# Dependencies to place before and after the objects being linked to
+# create a shared library.
+predep_objects=$lt_predep_objects_F77
+postdep_objects=$lt_postdep_objects_F77
+predeps=$lt_predeps_F77
+postdeps=$lt_postdeps_F77
+
+# The library search path used internally by the compiler when linking
+# a shared library.
+compiler_lib_search_path=$lt_compiler_lib_search_path_F77
+
+# ### END LIBTOOL TAG CONFIG: F77
+_LT_EOF
+
+
+    cat <<_LT_EOF >> "$ofile"
+
+# ### BEGIN LIBTOOL TAG CONFIG: FC
+
+# The linker used to build libraries.
+LD=$lt_LD_FC
+
+# How to create reloadable object files.
+reload_flag=$lt_reload_flag_FC
+reload_cmds=$lt_reload_cmds_FC
+
+# Commands used to build an old-style archive.
+old_archive_cmds=$lt_old_archive_cmds_FC
+
+# A language specific compiler.
+CC=$lt_compiler_FC
+
+# Is the compiler the GNU compiler?
+with_gcc=$GCC_FC
+
+# Compiler flag to turn off builtin functions.
+no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_FC
+
+# Additional compiler flags for building library objects.
+pic_flag=$lt_lt_prog_compiler_pic_FC
+
+# How to pass a linker flag through the compiler.
+wl=$lt_lt_prog_compiler_wl_FC
+
+# Compiler flag to prevent dynamic linking.
+link_static_flag=$lt_lt_prog_compiler_static_FC
+
+# Does compiler simultaneously support -c and -o options?
+compiler_c_o=$lt_lt_cv_prog_compiler_c_o_FC
+
+# Whether or not to add -lc for building shared libraries.
+build_libtool_need_lc=$archive_cmds_need_lc_FC
+
+# Whether or not to disallow shared libs when runtime libs are static.
+allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_FC
+
+# Compiler flag to allow reflexive dlopens.
+export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_FC
+
+# Compiler flag to generate shared objects directly from archives.
+whole_archive_flag_spec=$lt_whole_archive_flag_spec_FC
+
+# Whether the compiler copes with passing no objects directly.
+compiler_needs_object=$lt_compiler_needs_object_FC
+
+# Create an old-style archive from a shared archive.
+old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_FC
+
+# Create a temporary old-style archive to link instead of a shared archive.
+old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_FC
+
+# Commands used to build a shared archive.
+archive_cmds=$lt_archive_cmds_FC
+archive_expsym_cmds=$lt_archive_expsym_cmds_FC
+
+# Commands used to build a loadable module if different from building
+# a shared archive.
+module_cmds=$lt_module_cmds_FC
+module_expsym_cmds=$lt_module_expsym_cmds_FC
+
+# Whether we are building with GNU ld or not.
+with_gnu_ld=$lt_with_gnu_ld_FC
+
+# Flag that allows shared libraries with undefined symbols to be built.
+allow_undefined_flag=$lt_allow_undefined_flag_FC
+
+# Flag that enforces no undefined symbols.
+no_undefined_flag=$lt_no_undefined_flag_FC
+
+# Flag to hardcode \$libdir into a binary during linking.
+# This must work even if \$libdir does not exist
+hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_FC
+
+# Whether we need a single "-rpath" flag with a separated argument.
+hardcode_libdir_separator=$lt_hardcode_libdir_separator_FC
+
+# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes
+# DIR into the resulting binary.
+hardcode_direct=$hardcode_direct_FC
+
+# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes
+# DIR into the resulting binary and the resulting library dependency is
+# "absolute",i.e impossible to change by setting \${shlibpath_var} if the
+# library is relocated.
+hardcode_direct_absolute=$hardcode_direct_absolute_FC
+
+# Set to "yes" if using the -LDIR flag during linking hardcodes DIR
+# into the resulting binary.
+hardcode_minus_L=$hardcode_minus_L_FC
+
+# Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR
+# into the resulting binary.
+hardcode_shlibpath_var=$hardcode_shlibpath_var_FC
+
+# Set to "yes" if building a shared library automatically hardcodes DIR
+# into the library and all subsequent libraries and executables linked
+# against it.
+hardcode_automatic=$hardcode_automatic_FC
+
+# Set to yes if linker adds runtime paths of dependent libraries
+# to runtime path list.
+inherit_rpath=$inherit_rpath_FC
+
+# Whether libtool must link a program against all its dependency libraries.
+link_all_deplibs=$link_all_deplibs_FC
+
+# Set to "yes" if exported symbols are required.
+always_export_symbols=$always_export_symbols_FC
+
+# The commands to list exported symbols.
+export_symbols_cmds=$lt_export_symbols_cmds_FC
+
+# Symbols that should not be listed in the preloaded symbols.
+exclude_expsyms=$lt_exclude_expsyms_FC
+
+# Symbols that must always be exported.
+include_expsyms=$lt_include_expsyms_FC
+
+# Commands necessary for linking programs (against libraries) with templates.
+prelink_cmds=$lt_prelink_cmds_FC
+
+# Commands necessary for finishing linking programs.
+postlink_cmds=$lt_postlink_cmds_FC
+
+# Specify filename containing input files.
+file_list_spec=$lt_file_list_spec_FC
+
+# How to hardcode a shared library path into an executable.
+hardcode_action=$hardcode_action_FC
+
+# The directories searched by this compiler when creating a shared library.
+compiler_lib_search_dirs=$lt_compiler_lib_search_dirs_FC
+
+# Dependencies to place before and after the objects being linked to
+# create a shared library.
+predep_objects=$lt_predep_objects_FC
+postdep_objects=$lt_postdep_objects_FC
+predeps=$lt_predeps_FC
+postdeps=$lt_postdeps_FC
+
+# The library search path used internally by the compiler when linking
+# a shared library.
+compiler_lib_search_path=$lt_compiler_lib_search_path_FC
+
+# ### END LIBTOOL TAG CONFIG: FC
+_LT_EOF
+
+ ;;
+    "libsrc/nfconfig1.inc":H) sed '1d;s%^/\* \(.*\) \*/%\1%' libsrc/nfconfig1.inc >conftest.tmp && mv conftest.tmp libsrc/nfconfig.inc ;;
+    "Makefile":F) test -f  nf-config && chmod 755 nf-config  ;;
+    "nf-config":F) test -f  nf-config && chmod 755 nf-config  ;;
+    "netcdf-fortran.pc":F) test -f  nf-config && chmod 755 nf-config  ;;
+    "docs/Makefile":F) test -f  nf-config && chmod 755 nf-config  ;;
+    "libsrc/Makefile":F) test -f  nf-config && chmod 755 nf-config  ;;
+    "fortran/Makefile":F) test -f  nf-config && chmod 755 nf-config  ;;
+    "nf_test/Makefile":F) test -f  nf-config && chmod 755 nf-config  ;;
+    "nf03_test/Makefile":F) test -f  nf-config && chmod 755 nf-config  ;;
+    "CMakeExtras/Makefile":F) test -f  nf-config && chmod 755 nf-config  ;;
+    "examples/Makefile":F) test -f  nf-config && chmod 755 nf-config  ;;
+    "examples/F90/Makefile":F) test -f  nf-config && chmod 755 nf-config  ;;
+    "examples/F77/Makefile":F) test -f  nf-config && chmod 755 nf-config  ;;
+
+  esac
+done # for ac_tag
+
+
+as_fn_exit 0
+_ACEOF
+ac_clean_files=$ac_clean_files_save
+
+test $ac_write_fail = 0 ||
+  as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5
+
+
+# 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 || as_fn_exit 1
+fi
+if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5
+$as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;}
+fi
+
diff --git a/configure.ac b/configure.ac
new file mode 100644
index 0000000..4f74135
--- /dev/null
+++ b/configure.ac
@@ -0,0 +1,609 @@
+#                                               -*- Autoconf -*-
+## Process this file with autoconf to produce a configure script.
+
+# This is part of Unidata's netCDF package. Copyright 2011, see the
+# COPYRIGHT file for more information.
+
+# Running autoconf on this file will trigger a warning if
+# autoconf is not at least the specified version.
+AC_PREREQ([2.59])
+
+# Initialize with name, version, and support email address.
+AC_INIT([netCDF-Fortran], [4.4.1], [support-netcdf at unidata.ucar.edu])
+
+# Create the VERSION file, which contains the package version from
+# AC_INIT.
+echo -n AC_PACKAGE_VERSION>VERSION
+AC_SUBST(PACKAGE_VERSION)
+
+AC_MSG_NOTICE([netCDF-Fortran AC_PACKAGE_VERSION])
+
+# Keep libtool macros in an m4 directory.
+AC_CONFIG_MACRO_DIR([m4])
+
+# Find out about the host we're building on.
+AC_CANONICAL_HOST
+
+# Find out about the target we're building for.
+AC_CANONICAL_TARGET
+
+# This call is required by automake.
+AM_INIT_AUTOMAKE([foreign dist-zip subdir-objects])
+AM_MAINTAINER_MODE()
+# Check for the existence of this file before proceeding.
+AC_CONFIG_SRCDIR([libsrc/fort-attio.c])
+
+AC_MSG_NOTICE([checking user options])
+
+# Does the user want to run extra tests with valgrind?
+AC_MSG_CHECKING([whether extra valgrind tests should be run])
+AC_ARG_ENABLE([valgrind-tests],
+              [AS_HELP_STRING([--enable-valgrind-tests],
+                              [build with valgrind-tests (valgrind is required, static builds only)])])
+test "x$enable_valgrind_tests" = xyes || enable_valgrind_tests=no
+AC_MSG_RESULT($enable_valgrind_tests)
+
+# Does the user want to run extra parallel tests when parallel netCDF-4 is built?
+AC_MSG_CHECKING([whether parallel IO tests should be run])
+AC_ARG_ENABLE([parallel-tests],
+              [AS_HELP_STRING([--enable-parallel-tests],
+                              [Run extra parallel IO tests. Ignored if \
+                               netCDF-4 is not enabled, or built on a system \
+                               without parallel I/O support.])])
+test "x$enable_parallel_tests" = xyes || enable_parallel_tests=no
+AC_MSG_RESULT($enable_parallel_tests)
+
+# Does the user want to do some extra tests?
+AC_MSG_CHECKING([whether netCDF extra tests should be run (developers only)])
+AC_ARG_ENABLE([extra-tests],
+              [AS_HELP_STRING([--enable-extra-tests],
+                              [run some extra tests that may not pass because of known issues])])
+test "x$enable_extra_tests" = xyes || enable_extra_tests=no
+AC_MSG_RESULT($enable_extra_tests)
+if test "x$enable_extra_tests" = xyes; then
+   AC_DEFINE([EXTRA_TESTS], [1], [if true, run extra tests which may not work yet])
+fi
+AM_CONDITIONAL(EXTRA_TESTS, [test x$enable_extra_tests = xyes])
+
+#####
+# Determine if we want to enable doxygen-generated documentation.
+#####
+AC_ARG_ENABLE([doxygen],
+	[AS_HELP_STRING([--enable-doxygen],
+	[Enable generation of documentation with doxygen.])])
+    test "x$enable_doxygen" = xyes || enable_doxygen=no
+AM_CONDITIONAL([BUILD_DOCS], [test "x$enable_doxygen" = xyes])
+
+# Does the user want to generate dot-based documentation?
+AC_ARG_ENABLE([dot],
+	[AS_HELP_STRING([--enable-dot],
+	[Use dot (provided by graphviz) to generate charts and graphs in the doxygen-based documentation.])])
+	test "x$enable_dot" = xyes || enable_dot=no
+
+# Does the user want to generate internal documentation?
+AC_ARG_ENABLE([internal-docs],
+  [AS_HELP_STRING([--enable-internal-docs],
+    [Include documentation of library internals. This is of interest only to those developing the netCDF library.])])
+test "x$enable_internal_docs" = xyes || enable_internal_docs=no
+AC_SUBST([BUILD_INTERNAL_DOCS], [$enable_internal_docs])
+
+# Is doxygen installed? If so, have configure construct the Doxyfile.
+AC_CHECK_PROGS([DOXYGEN], [doxygen])
+if test -z "$DOXYGEN"; then
+   AC_MSG_WARN([Doxygen not found - documentation will not be built])
+fi
+
+# Is graphviz/dot installed? If so, we'll use dot to create
+# graphs in the documentation.
+AC_CHECK_PROGS([DOT], [dot])
+if test -z "$DOT"; then
+   AC_MSG_WARN([dot not found - will use simple charts in documentation])
+   HAVE_DOT=NO
+elif test "x$enable_dot" = xno; then
+   HAVE_DOT=NO
+else
+   HAVE_DOT=YES
+fi
+# If we have doxygen, and it's enabled, then process the file.
+if test "x$enable_doxygen" != xno; then
+   if test -n "$DOXYGEN"; then
+        AC_SUBST(HAVE_DOT)
+        AC_CONFIG_FILES([docs/Doxyfile])
+   fi
+# Note: the list of files to input to doxygen
+# has been moved to docs/Doxyfile.in so
+# that make distcheck works correctly.
+# Any new inputs should be inserted into
+# docs/Doxyfile.in and possibley docs/Makefile.am
+fi
+
+#####
+# End doxygen-related documentation block.
+#####
+
+# Find the C compiler.
+AC_MSG_NOTICE([finding C compiler])
+
+AC_PROG_CC
+AM_PROG_CC_C_O
+AC_C_CONST
+
+# If F03 is set, FC isn't, then set FC to whatever F03 was set
+if test "${F03+set}" = set -a "${FC+set}" != set; then
+   FC=$F03
+fi
+
+# If F90 is set, FC isn't, then set FC to whatever F90 was set to.
+if test "${F90+set}" = set -a "${FC+set}" != set; then
+   FC=$F90
+fi
+
+# Find fortran compiler. If FC isn't set after AC_PROG_FC, we couldn't
+# find a fortran compiler. If the user requested the fortran API, and
+# has told us not to recover from a missing compiler, then bail out
+# right here.
+AC_MSG_NOTICE([finding Fortran compiler])
+AC_PROG_FC
+AC_PROG_F77($FC)
+
+# If we couldn't find an F90 compiler, deal with it.
+if test "${FC+set}" = set && test "x$FC" = x; then
+   AC_MSG_FAILURE([Can't find F90 compiler.])
+fi
+
+# Set the default fortran builds; default is to build f03
+nc_build_f90=no
+nc_build_f03=yes
+
+# Does the user want to test for Fortran 2003 compiler.
+# Added to get around NAG evaluation compiler error turning off F03
+AC_MSG_CHECKING([whether Fortran compiler is checked for ISO_C_BINDING support])
+AC_ARG_ENABLE([f03-compiler-check],
+              [AS_HELP_STRING([--disable-f03-compiler-check],
+                              [disable check of ISO_C_BINDING support in Fortran compiler])])
+test "x$enable_f03_compiler_check" = xno || enable_f03_compiler_check=yes
+AC_MSG_RESULT($enable_f03_compiler_check)
+
+# next check to see if the Fortran compiler will support
+# ISO_C_BINDING
+nc_iso_c_binding=yes
+
+# Some f90 compilers change the case of the mod file names. Others
+# require special flags to be set to deal with .f90 files. Find out
+# about this compiler.
+AC_LANG_PUSH(Fortran)
+AC_FC_SRCEXT(f90)
+AC_LANG_POP(Fortran)
+AX_F90_MODULE_FLAG
+AC_SUBST(MOD_FLAG, ${ax_cv_f90_modflag})
+if test "x$enable_f03_compiler_check" = xyes; then
+  AC_MSG_CHECKING([if Fortran compiler supports Fortran 2003 ISO_C_BINDING])
+  cat <<EOF >conftest.f90
+module conftest_module
+USE ISO_C_BINDING
+end module conftest_module
+EOF
+  doit='$FC -c ${FCFLAGS} ${FCFLAGS_f90} conftest.f90'
+  if AC_TRY_EVAL(doit); then
+     nc_iso_c_binding=yes
+  else
+     nc_iso_c_binding=no
+  fi
+  AC_MSG_RESULT([$nc_iso_c_binding])
+
+  AC_MSG_CHECKING([if Fortran compiler supports Fortran 2008 ISO_FORTRAN_ENV additions])
+  cat <<EOF >conftest.f90
+Program test
+USE ISO_FORTRAN_ENV, ONLY: REAL32, REAL64, INT8, INT16, INT32, INT64
+End Program
+EOF
+  doit='$FC -c ${FCFLAGS} ${FCFLAGS_f90} conftest.f90'
+  if AC_TRY_EVAL(doit); then
+     nc_f2008_is0_env_additions=yes
+     AC_DEFINE([HAVE_F2008], 1, [if true, use Fortran 2008 ISO_FORTRAN_ENV additions])
+  else
+     nc_f2008_is0_env_additions=no
+  fi
+  AC_MSG_RESULT([$nc_f2008_is0_env_additions])
+
+  AC_MSG_CHECKING([if Fortran compiler supports TS29113 standard extension])
+  cat <<EOF >conftest.f90
+Program test
+USE ISO_C_BINDING, ONLY: C_PTRDIFF_T
+End Program
+EOF
+  doit='$FC -c ${FCFLAGS} ${FCFLAGS_f90} conftest.f90'
+  if AC_TRY_EVAL(doit); then
+     nc_ts29113_support=yes
+     AC_DEFINE([HAVE_TS29113_SUPPORT], 1, [if true, Fortran compiler supports TS29113 extension])
+  else
+     nc_ts29113_support=no
+  fi
+  AC_MSG_RESULT([$nc_ts29113_support])
+
+  if test "x$nc_iso_c_binding" = xno; then
+    if test "x$enable_compiler_recover" = xyes; then
+      nc_build_f90=yes
+      AC_MSG_WARN([ISO_C_BINDING not supported - defaulting to F90 interfaces])
+    else
+      AC_MSG_FAILURE([Can't use build F03 interfaces and cannot do compiler recovery])
+    fi
+  fi
+fi
+
+
+## Do we want to use the fortran 90 wrappers instead of 2003 native code?
+AC_MSG_CHECKING([whether F03 native code is desired])
+AC_ARG_ENABLE([f03],
+              [AS_HELP_STRING([--disable-f03],
+                              [suppress netCDF Fortran 2003 native code])])
+test "x$enable_f03" = xno || enable_f03=yes
+AC_MSG_RESULT([$enable_f03])
+
+if test "x$enable_f03" = xyes ; then nc_build_f03=yes; fi
+
+# Decide on f90 versus 2003
+if test "x$nc_iso_c_binding" = xno; then
+  #Cannot build f03 native code
+  AC_MSG_NOTICE([Fortran 2003 interface not supported; Using fortran 90 interface])
+  nc_build_f90=yes
+fi
+
+# Guarantee build state; f90 currently overrides f03
+if test "x$nc_build_f90" = xyes ; then
+  nc_build_f03=no
+else
+  nc_build_f03=yes
+fi
+
+# Does the user want to check into fortran type information?
+AC_MSG_CHECKING([whether fortran type sizes should be checked])
+AC_ARG_ENABLE([fortran-type-check],
+              [AS_HELP_STRING([--disable-fortran-type-check],
+                              [cause the Fortran type sizes checks to be skipped])])
+test "x$enable_fortran_type_check" = xno || enable_fortran_type_check=yes
+AC_MSG_RESULT($enable_fortran_type_check)
+
+# Does the user want to run tests for large files (> 2GiB)?
+AC_MSG_CHECKING([whether large file (> 2GB) tests should be run])
+AC_ARG_ENABLE([large-file-tests],
+              [AS_HELP_STRING([--enable-large-file-tests],
+                              [Run tests which create very large data files (~13 GB disk space
+                              required, but it will be recovered when tests are complete). See
+                              option --with-temp-large to specify temporary directory])])
+test "x$enable_large_file_tests" = xyes || enable_large_file_tests=no
+AC_MSG_RESULT($enable_large_file_tests)
+AM_CONDITIONAL(LARGE_FILE_TESTS, [test x$enable_large_file_tests = xyes])
+if test "x$enable_large_file_tests" = xyes; then
+   AC_DEFINE([LARGE_FILE_TESTS], [1], [do large file tests])
+fi
+
+# Does the user want to run benchmarks?
+AC_MSG_CHECKING([whether benchmaks should be run (experimental)])
+AC_ARG_ENABLE([benchmarks],
+              [AS_HELP_STRING([--enable-benchmarks],
+                              [Run benchmarks. This is an experimental feature.])])
+test "x$enable_benchmarks" = xyes || enable_benchmarks=no
+AC_MSG_RESULT($enable_benchmarks)
+AM_CONDITIONAL(BUILD_BENCHMARKS, [test x$enable_benchmarks = xyes])
+
+# If the env. variable TEMP_LARGE is set, or if
+# --with-temp-large=<directory>, use it as a place for the large
+# (i.e. > 2 GiB) files created during the large file testing.
+AC_MSG_CHECKING([where to put large temp files if large file tests are run])
+AC_ARG_WITH([temp-large],
+            [AS_HELP_STRING([--with-temp-large=<directory>],
+                            [specify directory where large files (i.e. >2 GB) \
+                            will be written, if large files tests are run with
+                            --enable-large-file-tests])],
+            [TEMP_LARGE=$with_temp_large])
+TEMP_LARGE=${TEMP_LARGE-.}
+AC_MSG_RESULT($TEMP_LARGE)
+#AC_SUBST(TEMP_LARGE)
+AC_DEFINE_UNQUOTED([TEMP_LARGE], ["$TEMP_LARGE"], [Place to put very large netCDF test files.])
+
+
+# Turn off building old F77 interfaces if nc_build_f03 is still yes
+
+test "x$nc_build_f03" = xyes && nc_build_f77=no
+
+if test "x$nc_build_f90" = xno; then
+   F90=
+   # If F77 is set, and FC isn't, then set FC to whatever F77 was set to.
+   FC=$F77
+fi
+
+# See if the fortran 90 build is desired. If so, set some stuff
+if test "x$nc_build_f90" = xyes; then
+   AC_MSG_NOTICE([setting up Fortran 90])
+   if test "${F90+set}" != set; then
+      F90=$FC
+   fi
+   AC_MSG_CHECKING([what FC is set to])
+   AC_MSG_RESULT([$FC])
+
+   if test "x$nc_build_f03" = xno; then
+     # Some f90 compilers change the case of the mod file names. Others
+     # require special flags to be set to deal with .f90 files. Find out
+     # about this compiler.
+     AC_LANG_PUSH(Fortran)
+     AC_FC_SRCEXT(f90)
+     AC_LANG_POP(Fortran)
+     AX_F90_MODULE_FLAG
+     AC_SUBST(MOD_FLAG, ${ax_cv_f90_modflag})
+   fi
+
+   # Set the FCLIBS flag to help with shared libraries.
+#   AC_FC_LIBRARY_LDFLAGS
+#   AC_F77_LIBRARY_LDFLAGS
+fi
+
+AM_CONDITIONAL(BUILD_F03, [test "x$nc_build_f03" = xyes])
+
+# Set up libtool.
+AC_MSG_NOTICE([setting up libtool])
+LT_PREREQ([2.2])
+LT_INIT
+
+# Valgrind tests don't work with shared builds because of some libtool
+# weirdness.
+if test "x$enable_shared" = xyes; then
+   if test $enable_valgrind_tests = yes; then
+      AC_MSG_WARN([No valgrind tests with shared libraries])
+      enable_valgrind_tests=no
+   fi
+fi
+
+AC_MSG_NOTICE([finding other utilities])
+
+# Find the install program.
+AC_PROG_INSTALL
+
+AC_MSG_NOTICE([trying to set fortran flags for this platform])
+AC_MSG_CHECKING([what FC is set to])
+AC_MSG_RESULT([$FC])
+# Set fortran flag if the user has not already set it in CPPFLAGS.
+case "$CPPFLAGS" in
+ *pgiFortran*|*NAGf90Fortran*|*f2cFortran*|*hpuxFortran*|*apolloFortran*|*sunFortran*|*IBMR2Fortran*|*CRAYFortran*|*PATHSCALE_COMPILER*|*gFortran*|*mipsFortran*|*DECFortran*|*vmsFortran*|*CONVEXFortran*|*PowerStationFortran*|*AbsoftUNIXFortran*|*AbsoftProFortran*|*SXFortran*)
+    ;;
+   *)
+      case "$FC" in
+         pgf95|pgf90|pgf77|ifort*|lf90|lf95)
+            AC_DEFINE(pgiFortran, [1], [Turned on by netCDF configure.])
+            ;;
+          *gfortran)
+             if (gfortran --version | grep '(GCC 4.1.' || gfortran --version | grep '(GCC 4.0.'); then
+                AC_DEFINE(gFortran, [1], [Turned on by netCDF configure.])
+             else
+                AC_DEFINE(pgiFortran, [1], [Turned on by netCDF configure.])
+             fi
+             ;;
+          *g77)
+             AC_DEFINE(f2cFortran, [1], [Turned on by netCDF configure.])
+             ;;
+          *)
+             # If it's a gnu compiler, guess f2c.
+             if test "x$ac_cv_fc_compiler_gnu" = xyes; then
+                AC_DEFINE(f2cFortran, [1], [Turned on by netCDF configure.])
+             fi
+             ;;
+      esac
+esac
+
+case "$FC" in
+pgf95|pgf90|pgf77|ifort*|lf90|lf95) using_pgi=yes ;;
+*) ;;
+esac
+
+AM_CONDITIONAL(USING_PGI, [test "x$using_pgi" = "xyes"])
+
+# Check to see if any macros must be set to enable large (>2GB) files.
+AC_SYS_LARGEFILE
+
+#AC_MSG_NOTICE([displaying some results])
+
+## This next macro just prints some results for debugging
+## support issues.
+#UD_DISPLAY_RESULTS
+
+# For nightly build testing, output CC, FC, etc.
+#echo "CPPFLAGS=$CPPFLAGS CC=$CC CFLAGS=$CFLAGS CXX=$CXX CXXFLAGS=$CXXFLAGS FC=$FC FCFLAGS=$FCFLAGS F77=$F77 FFLAGS=$FFLAGS LDFLAGS=$LDFLAGS LIBS=$LIBS FLIBS=$FLIBS F90LIBS=$F90LIBS" >> comps.txt
+
+ac_cv_prog_f90_uppercase_mod=no
+
+# This will test the f77 compiler, as well as check some fortran types.
+if test "$enable_fortran_type_check" = yes; then
+   UD_FORTRAN_TYPES
+   if test "x$ud_fc_failed" = xyes; then
+      AC_MSG_ERROR([F77 compiler doesn't work, and compiler recovery disabled.])
+   fi
+else
+   AC_DEFINE(NCBYTE_T, byte)
+   AC_DEFINE(NCSHORT_T, integer*2)
+   AC_DEFINE(NF_INT1_T, byte)
+   AC_DEFINE(NF_INT2_T, integer*2)
+   AC_DEFINE(NF_INT1_IS_C_SIGNED_CHAR, 1, [default])
+   AC_DEFINE(NF_INT2_IS_C_SHORT, 1, [default])
+   AC_DEFINE(NF_INT_IS_C_INT, 1, [default])
+   AC_DEFINE(NF_REAL_IS_C_FLOAT, 1, [default])
+   AC_DEFINE(NF_DOUBLEPRECISION_IS_C_DOUBLE, 1, [default])
+fi
+
+# Test whether F90 module names get capitalized.
+if test "x$nc_build_f90" = xyes; then
+   AC_PROG_FC_UPPERCASE_MOD
+fi
+if test "x$ac_cv_prog_f90_uppercase_mod" = xyes ; then
+AC_MSG_FAILURE([Upper Case Modules names not supported])
+fi
+AM_CONDITIONAL(UPPER_CASE_MOD, [test "x$ac_cv_prog_f90_uppercase_mod" = xyes])
+
+# Does the user want to run extra example tests
+AC_MSG_CHECKING([whether extra example tests should be run])
+AC_ARG_ENABLE([extra-example-tests],
+              [AS_HELP_STRING([--enable-extra-example-tests],
+                              [Run extra example tests; requires GNU sed. Ignored if \
+                               netCDF-4 is not enabled.])])
+test "x$enable_extra_example_tests" = xyes || enable_extra_example_tests=no
+AC_MSG_RESULT($enable_extra_example_tests)
+AM_CONDITIONAL(EXTRA_EXAMPLE_TESTS, [test "x$enable_extra_example_tests" = xyes])
+
+# If --enable-dll is specified the DLL will be built. This only works
+# on mingw.
+AC_MSG_CHECKING([whether a win32 DLL is desired])
+AC_ARG_ENABLE([dll],
+              [AS_HELP_STRING([--enable-dll],
+                              [build a win32 DLL (only works on mingw)])])
+test "x$enable_dll" = xyes || enable_dll=no
+AC_MSG_RESULT([$enable_dll])
+AM_CONDITIONAL(BUILD_DLL, [test x$enable_dll = xyes])
+if test "x$enable_dll" = xyes; then
+   AC_DEFINE(DLL_NETCDF, 1, [set this only when building a DLL under MinGW])
+fi
+
+AC_MSG_NOTICE([checking types, headers, and functions])
+
+# Find the netCDF header and library.
+AC_CHECK_HEADERS([netcdf.h], [], [AC_MSG_ERROR([netcdf.h could not be found. Please set CPPFLAGS.])])
+AC_SEARCH_LIBS([nc_open], [netcdf])
+
+# See if various libraries are available
+AC_CHECK_FUNCS([nc_def_opaque nccreate nc_set_log_level oc_open nc_use_parallel_enabled])
+#test "x$ac_cv_func_oc_open" = xyes && nc_has_dap=yes || nc_has_dap=no
+# Whether we build/test some functionality depends on what we found in
+# the C library.
+#nc_build_v2=$ac_cv_func_nccreate
+#nc_build_v4=$ac_cv_func_nc_def_opaque
+
+nc_build_v2=no
+nc_build_v4=no
+nc_has_logging=no
+nc_has_dap=no
+nc_has_parallel=no
+
+test "x$ac_cv_func_nc_def_opaque" = xyes && nc_build_v4=yes
+test "x$ac_cv_func_nccreate" = xyes && nc_build_v2=yes
+test "x$ac_cv_func_nc_set_log_level" = xyes && nc_has_logging=yes
+test "x$ac_cv_func_oc_open" = xyes && nc_has_dap=yes
+test "x$ac_cv_func_nc_use_parallel_enabled" = xyes && nc_has_parallel=yes
+
+#AC_CHECK_FUNC([nc_def_opaque],[nc_build_v4=yes])
+#AC_CHECK_FUNC([nccreate],[nc_build_v2=yes])
+#AC_CHECK_FUNC([nc_set_log_level],[nc_has_logging=yes])
+#AC_CHECK_FUNC([oc_open],[nc_has_dap=yes])
+#AC_CHECK_FUNC([nc_use_parallel_enabled],[nc_has_parallel=yes])
+
+if test "x$nc_build_v4" = xyes; then
+   AC_DEFINE([USE_NETCDF4], [1], [if true, build netCDF-4])
+fi
+
+AC_MSG_CHECKING([netCDF v2 API present])
+AC_MSG_RESULT([$nc_build_v2])
+AC_MSG_CHECKING([netCDF-4 present])
+AC_MSG_RESULT([$nc_build_v4])
+
+AM_CONDITIONAL([USE_NETCDF4], [test "x$nc_build_v4" = xyes])
+AM_CONDITIONAL([BUILD_V2], [test "x$nc_build_v2" = xyes])
+AM_CONDITIONAL([USE_LOGGING], [test "x$nc_has_logging" = xyes])
+AM_CONDITIONAL([BUILD_DAP], [test "x$nc_has_dap" = xyes])
+AM_CONDITIONAL([BUILD_PARALLEL], [test "x$nc_has_parallel" = xyes])
+AC_CHECK_HEADER(stdlib.h, ,AC_DEFINE([NO_STDLIB_H], [], [no stdlib.h]))
+AC_CHECK_HEADER(sys/types.h, ,AC_DEFINE([NO_SYS_TYPES_H], [], [no sys_types.h]))
+AC_CHECK_HEADERS([sys/param.h])
+#AC_CHECK_HEADERS([locale.h])
+AC_CHECK_HEADERS([locale.h stdio.h stdarg.h errno.h ctype.h fcntl.h malloc.h stdlib.h string.h \
+			   strings.h unistd.h sys/stat.h getopt.h sys/time.h sys/resource.h])
+AC_HEADER_DIRENT
+AC_HEADER_STDC
+AC_HEADER_SYS_WAIT
+AC_HEADER_TIME
+
+AC_FUNC_VPRINTF
+
+# Check for <stdbool.h> that conforms to C99 requirements
+AC_HEADER_STDBOOL
+
+# Check for these functions...
+#AC_CHECK_FUNCS([strlcat strerror snprintf strchr strrchr mktemp strcat strcpy strdup \
+#			strcasecmp strtod strtoll strtoull getrlimit gettimeofday fsync MPI_Comm_f2c])
+AC_FUNC_ALLOCA
+#AC_CHECK_DECLS([isnan, isinf, isfinite, signbit],,,[#include <math.h>])
+#AC_STRUCT_ST_BLKSIZE
+#UD_CHECK_IEEE
+AC_TYPE_SIZE_T
+AC_TYPE_OFF_T
+AC_CHECK_TYPES([ssize_t, ptrdiff_t, uchar, longlong])
+AC_C_CHAR_UNSIGNED
+#AC_C_BIGENDIAN
+AC_CHECK_SIZEOF(short)
+AC_CHECK_SIZEOF(int)
+AC_CHECK_SIZEOF(long)
+AC_CHECK_SIZEOF(float)
+AC_CHECK_SIZEOF(double)
+AC_CHECK_SIZEOF(off_t)
+AC_CHECK_SIZEOF(size_t)
+AC_CHECK_SIZEOF(ptrdiff_t)
+AC_COMPUTE_INT([longlong_is_long],[sizeof(long long) == sizeof(long)],[],[longlong_is_long=0])
+if test $longlong_is_long = 1; then
+   CFLAGS="$CFLAGS -DLONGLONG_IS_LONG"
+fi
+
+# Automake conditionals need to be called, whether the answer is yes
+# or no.
+AM_CONDITIONAL(TEST_PARALLEL, [test "x$enable_parallel_tests" = xyes])
+AM_CONDITIONAL(USE_VALGRIND_TESTS, [test "x$enable_valgrind_tests" = xyes])
+
+# Flags for nf-config script; by design $prefix, $includir, $libdir,
+# etc.  are left as shell variables in the script so as to facilitate
+# relocation
+NC_LIBS="-lnetcdf"
+NC_LIBS="$LDFLAGS $NC_LIBS $LIBS"
+
+case "x$target_os" in
+xsolaris*)
+  NEWNCLIBS=""
+  for x in $NC_LIBS ; do
+    case "$x" in
+    -L*) r=`echo "$x" | sed -e 's|^-L|-R|'`
+	 NEWNCLIBS="$NEWNCLIBS $x $r"
+	 ;;
+    *)	 NEWNCLIBS="$NEWNCLIBS $x" ;;
+    esac
+  done
+  NC_LIBS="$NEWNCLIBS"
+  ;;
+*);;
+esac
+
+NC_FLIBS="-lnetcdff $NC_LIBS"
+
+AC_SUBST(NC_LIBS,[$NC_LIBS])
+AC_SUBST(NC_FLIBS,[$NC_FLIBS])
+AC_SUBST(HAS_F90,[$nc_build_f90])
+AC_SUBST(HAS_F03,[$nc_build_f03])
+AC_SUBST(HAS_DAP,[$nc_has_dap])
+AC_SUBST(HAS_NC2,[$nc_build_v2])
+AC_SUBST(HAS_NC4,[$nc_build_v4])
+
+AC_MSG_NOTICE([generating header files and makefiles])
+
+# We will output a fortran inc file, nfconfig.inc.
+AC_CONFIG_HEADERS([config.h])
+AC_CONFIG_HEADERS([libsrc/nfconfig1.inc:libsrc/nfconfig.in],
+   [sed '1d;s%^/\* \(.*\) \*/%\1%' libsrc/nfconfig1.inc >conftest.tmp && mv conftest.tmp libsrc/nfconfig.inc])
+
+AC_CONFIG_FILES([Makefile
+                 nf-config
+                 netcdf-fortran.pc
+                 docs/Makefile
+                 libsrc/Makefile
+                 fortran/Makefile
+                 nf_test/Makefile
+                 nf03_test/Makefile
+                 CMakeExtras/Makefile
+                 examples/Makefile
+                 examples/F90/Makefile
+                 examples/F77/Makefile],
+		 [test -f  nf-config && chmod 755 nf-config ])
+
+AC_OUTPUT()
diff --git a/depcomp b/depcomp
new file mode 100755
index 0000000..4ebd5b3
--- /dev/null
+++ b/depcomp
@@ -0,0 +1,791 @@
+#! /bin/sh
+# depcomp - compile a program generating dependencies as side-effects
+
+scriptversion=2013-05-30.07; # UTC
+
+# Copyright (C) 1999-2013 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# Originally written by Alexandre Oliva <oliva at dcc.unicamp.br>.
+
+case $1 in
+  '')
+    echo "$0: No command.  Try '$0 --help' for more information." 1>&2
+    exit 1;
+    ;;
+  -h | --h*)
+    cat <<\EOF
+Usage: depcomp [--help] [--version] PROGRAM [ARGS]
+
+Run PROGRAMS ARGS to compile a file, generating dependencies
+as side-effects.
+
+Environment variables:
+  depmode     Dependency tracking mode.
+  source      Source file read by 'PROGRAMS ARGS'.
+  object      Object file output by 'PROGRAMS ARGS'.
+  DEPDIR      directory where to store dependencies.
+  depfile     Dependency file to output.
+  tmpdepfile  Temporary file to use when outputting dependencies.
+  libtool     Whether libtool is used (yes/no).
+
+Report bugs to <bug-automake at gnu.org>.
+EOF
+    exit $?
+    ;;
+  -v | --v*)
+    echo "depcomp $scriptversion"
+    exit $?
+    ;;
+esac
+
+# Get the directory component of the given path, and save it in the
+# global variables '$dir'.  Note that this directory component will
+# be either empty or ending with a '/' character.  This is deliberate.
+set_dir_from ()
+{
+  case $1 in
+    */*) dir=`echo "$1" | sed -e 's|/[^/]*$|/|'`;;
+      *) dir=;;
+  esac
+}
+
+# Get the suffix-stripped basename of the given path, and save it the
+# global variable '$base'.
+set_base_from ()
+{
+  base=`echo "$1" | sed -e 's|^.*/||' -e 's/\.[^.]*$//'`
+}
+
+# If no dependency file was actually created by the compiler invocation,
+# we still have to create a dummy depfile, to avoid errors with the
+# Makefile "include basename.Plo" scheme.
+make_dummy_depfile ()
+{
+  echo "#dummy" > "$depfile"
+}
+
+# Factor out some common post-processing of the generated depfile.
+# Requires the auxiliary global variable '$tmpdepfile' to be set.
+aix_post_process_depfile ()
+{
+  # If the compiler actually managed to produce a dependency file,
+  # post-process it.
+  if test -f "$tmpdepfile"; then
+    # Each line is of the form 'foo.o: dependency.h'.
+    # Do two passes, one to just change these to
+    #   $object: dependency.h
+    # and one to simply output
+    #   dependency.h:
+    # which is needed to avoid the deleted-header problem.
+    { sed -e "s,^.*\.[$lower]*:,$object:," < "$tmpdepfile"
+      sed -e "s,^.*\.[$lower]*:[$tab ]*,," -e 's,$,:,' < "$tmpdepfile"
+    } > "$depfile"
+    rm -f "$tmpdepfile"
+  else
+    make_dummy_depfile
+  fi
+}
+
+# A tabulation character.
+tab='	'
+# A newline character.
+nl='
+'
+# Character ranges might be problematic outside the C locale.
+# These definitions help.
+upper=ABCDEFGHIJKLMNOPQRSTUVWXYZ
+lower=abcdefghijklmnopqrstuvwxyz
+digits=0123456789
+alpha=${upper}${lower}
+
+if test -z "$depmode" || test -z "$source" || test -z "$object"; then
+  echo "depcomp: Variables source, object and depmode must be set" 1>&2
+  exit 1
+fi
+
+# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po.
+depfile=${depfile-`echo "$object" |
+  sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`}
+tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`}
+
+rm -f "$tmpdepfile"
+
+# Avoid interferences from the environment.
+gccflag= dashmflag=
+
+# Some modes work just like other modes, but use different flags.  We
+# parameterize here, but still list the modes in the big case below,
+# to make depend.m4 easier to write.  Note that we *cannot* use a case
+# here, because this file can only contain one case statement.
+if test "$depmode" = hp; then
+  # HP compiler uses -M and no extra arg.
+  gccflag=-M
+  depmode=gcc
+fi
+
+if test "$depmode" = dashXmstdout; then
+  # This is just like dashmstdout with a different argument.
+  dashmflag=-xM
+  depmode=dashmstdout
+fi
+
+cygpath_u="cygpath -u -f -"
+if test "$depmode" = msvcmsys; then
+  # This is just like msvisualcpp but w/o cygpath translation.
+  # Just convert the backslash-escaped backslashes to single forward
+  # slashes to satisfy depend.m4
+  cygpath_u='sed s,\\\\,/,g'
+  depmode=msvisualcpp
+fi
+
+if test "$depmode" = msvc7msys; then
+  # This is just like msvc7 but w/o cygpath translation.
+  # Just convert the backslash-escaped backslashes to single forward
+  # slashes to satisfy depend.m4
+  cygpath_u='sed s,\\\\,/,g'
+  depmode=msvc7
+fi
+
+if test "$depmode" = xlc; then
+  # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency information.
+  gccflag=-qmakedep=gcc,-MF
+  depmode=gcc
+fi
+
+case "$depmode" in
+gcc3)
+## gcc 3 implements dependency tracking that does exactly what
+## we want.  Yay!  Note: for some reason libtool 1.4 doesn't like
+## it if -MD -MP comes after the -MF stuff.  Hmm.
+## Unfortunately, FreeBSD c89 acceptance of flags depends upon
+## the command line argument order; so add the flags where they
+## appear in depend2.am.  Note that the slowdown incurred here
+## affects only configure: in makefiles, %FASTDEP% shortcuts this.
+  for arg
+  do
+    case $arg in
+    -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;;
+    *)  set fnord "$@" "$arg" ;;
+    esac
+    shift # fnord
+    shift # $arg
+  done
+  "$@"
+  stat=$?
+  if test $stat -ne 0; then
+    rm -f "$tmpdepfile"
+    exit $stat
+  fi
+  mv "$tmpdepfile" "$depfile"
+  ;;
+
+gcc)
+## Note that this doesn't just cater to obsosete pre-3.x GCC compilers.
+## but also to in-use compilers like IMB xlc/xlC and the HP C compiler.
+## (see the conditional assignment to $gccflag above).
+## There are various ways to get dependency output from gcc.  Here's
+## why we pick this rather obscure method:
+## - Don't want to use -MD because we'd like the dependencies to end
+##   up in a subdir.  Having to rename by hand is ugly.
+##   (We might end up doing this anyway to support other compilers.)
+## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like
+##   -MM, not -M (despite what the docs say).  Also, it might not be
+##   supported by the other compilers which use the 'gcc' depmode.
+## - Using -M directly means running the compiler twice (even worse
+##   than renaming).
+  if test -z "$gccflag"; then
+    gccflag=-MD,
+  fi
+  "$@" -Wp,"$gccflag$tmpdepfile"
+  stat=$?
+  if test $stat -ne 0; then
+    rm -f "$tmpdepfile"
+    exit $stat
+  fi
+  rm -f "$depfile"
+  echo "$object : \\" > "$depfile"
+  # The second -e expression handles DOS-style file names with drive
+  # letters.
+  sed -e 's/^[^:]*: / /' \
+      -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile"
+## This next piece of magic avoids the "deleted header file" problem.
+## The problem is that when a header file which appears in a .P file
+## is deleted, the dependency causes make to die (because there is
+## typically no way to rebuild the header).  We avoid this by adding
+## dummy dependencies for each header file.  Too bad gcc doesn't do
+## this for us directly.
+## Some versions of gcc put a space before the ':'.  On the theory
+## that the space means something, we add a space to the output as
+## well.  hp depmode also adds that space, but also prefixes the VPATH
+## to the object.  Take care to not repeat it in the output.
+## Some versions of the HPUX 10.20 sed can't process this invocation
+## correctly.  Breaking it into two sed invocations is a workaround.
+  tr ' ' "$nl" < "$tmpdepfile" \
+    | sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \
+    | sed -e 's/$/ :/' >> "$depfile"
+  rm -f "$tmpdepfile"
+  ;;
+
+hp)
+  # This case exists only to let depend.m4 do its work.  It works by
+  # looking at the text of this script.  This case will never be run,
+  # since it is checked for above.
+  exit 1
+  ;;
+
+sgi)
+  if test "$libtool" = yes; then
+    "$@" "-Wp,-MDupdate,$tmpdepfile"
+  else
+    "$@" -MDupdate "$tmpdepfile"
+  fi
+  stat=$?
+  if test $stat -ne 0; then
+    rm -f "$tmpdepfile"
+    exit $stat
+  fi
+  rm -f "$depfile"
+
+  if test -f "$tmpdepfile"; then  # yes, the sourcefile depend on other files
+    echo "$object : \\" > "$depfile"
+    # Clip off the initial element (the dependent).  Don't try to be
+    # clever and replace this with sed code, as IRIX sed won't handle
+    # lines with more than a fixed number of characters (4096 in
+    # IRIX 6.2 sed, 8192 in IRIX 6.5).  We also remove comment lines;
+    # the IRIX cc adds comments like '#:fec' to the end of the
+    # dependency line.
+    tr ' ' "$nl" < "$tmpdepfile" \
+      | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' \
+      | tr "$nl" ' ' >> "$depfile"
+    echo >> "$depfile"
+    # The second pass generates a dummy entry for each header file.
+    tr ' ' "$nl" < "$tmpdepfile" \
+      | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \
+      >> "$depfile"
+  else
+    make_dummy_depfile
+  fi
+  rm -f "$tmpdepfile"
+  ;;
+
+xlc)
+  # This case exists only to let depend.m4 do its work.  It works by
+  # looking at the text of this script.  This case will never be run,
+  # since it is checked for above.
+  exit 1
+  ;;
+
+aix)
+  # The C for AIX Compiler uses -M and outputs the dependencies
+  # in a .u file.  In older versions, this file always lives in the
+  # current directory.  Also, the AIX compiler puts '$object:' at the
+  # start of each line; $object doesn't have directory information.
+  # Version 6 uses the directory in both cases.
+  set_dir_from "$object"
+  set_base_from "$object"
+  if test "$libtool" = yes; then
+    tmpdepfile1=$dir$base.u
+    tmpdepfile2=$base.u
+    tmpdepfile3=$dir.libs/$base.u
+    "$@" -Wc,-M
+  else
+    tmpdepfile1=$dir$base.u
+    tmpdepfile2=$dir$base.u
+    tmpdepfile3=$dir$base.u
+    "$@" -M
+  fi
+  stat=$?
+  if test $stat -ne 0; then
+    rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
+    exit $stat
+  fi
+
+  for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
+  do
+    test -f "$tmpdepfile" && break
+  done
+  aix_post_process_depfile
+  ;;
+
+tcc)
+  # tcc (Tiny C Compiler) understand '-MD -MF file' since version 0.9.26
+  # FIXME: That version still under development at the moment of writing.
+  #        Make that this statement remains true also for stable, released
+  #        versions.
+  # It will wrap lines (doesn't matter whether long or short) with a
+  # trailing '\', as in:
+  #
+  #   foo.o : \
+  #    foo.c \
+  #    foo.h \
+  #
+  # It will put a trailing '\' even on the last line, and will use leading
+  # spaces rather than leading tabs (at least since its commit 0394caf7
+  # "Emit spaces for -MD").
+  "$@" -MD -MF "$tmpdepfile"
+  stat=$?
+  if test $stat -ne 0; then
+    rm -f "$tmpdepfile"
+    exit $stat
+  fi
+  rm -f "$depfile"
+  # Each non-empty line is of the form 'foo.o : \' or ' dep.h \'.
+  # We have to change lines of the first kind to '$object: \'.
+  sed -e "s|.*:|$object :|" < "$tmpdepfile" > "$depfile"
+  # And for each line of the second kind, we have to emit a 'dep.h:'
+  # dummy dependency, to avoid the deleted-header problem.
+  sed -n -e 's|^  *\(.*\) *\\$|\1:|p' < "$tmpdepfile" >> "$depfile"
+  rm -f "$tmpdepfile"
+  ;;
+
+## The order of this option in the case statement is important, since the
+## shell code in configure will try each of these formats in the order
+## listed in this file.  A plain '-MD' option would be understood by many
+## compilers, so we must ensure this comes after the gcc and icc options.
+pgcc)
+  # Portland's C compiler understands '-MD'.
+  # Will always output deps to 'file.d' where file is the root name of the
+  # source file under compilation, even if file resides in a subdirectory.
+  # The object file name does not affect the name of the '.d' file.
+  # pgcc 10.2 will output
+  #    foo.o: sub/foo.c sub/foo.h
+  # and will wrap long lines using '\' :
+  #    foo.o: sub/foo.c ... \
+  #     sub/foo.h ... \
+  #     ...
+  set_dir_from "$object"
+  # Use the source, not the object, to determine the base name, since
+  # that's sadly what pgcc will do too.
+  set_base_from "$source"
+  tmpdepfile=$base.d
+
+  # For projects that build the same source file twice into different object
+  # files, the pgcc approach of using the *source* file root name can cause
+  # problems in parallel builds.  Use a locking strategy to avoid stomping on
+  # the same $tmpdepfile.
+  lockdir=$base.d-lock
+  trap "
+    echo '$0: caught signal, cleaning up...' >&2
+    rmdir '$lockdir'
+    exit 1
+  " 1 2 13 15
+  numtries=100
+  i=$numtries
+  while test $i -gt 0; do
+    # mkdir is a portable test-and-set.
+    if mkdir "$lockdir" 2>/dev/null; then
+      # This process acquired the lock.
+      "$@" -MD
+      stat=$?
+      # Release the lock.
+      rmdir "$lockdir"
+      break
+    else
+      # If the lock is being held by a different process, wait
+      # until the winning process is done or we timeout.
+      while test -d "$lockdir" && test $i -gt 0; do
+        sleep 1
+        i=`expr $i - 1`
+      done
+    fi
+    i=`expr $i - 1`
+  done
+  trap - 1 2 13 15
+  if test $i -le 0; then
+    echo "$0: failed to acquire lock after $numtries attempts" >&2
+    echo "$0: check lockdir '$lockdir'" >&2
+    exit 1
+  fi
+
+  if test $stat -ne 0; then
+    rm -f "$tmpdepfile"
+    exit $stat
+  fi
+  rm -f "$depfile"
+  # Each line is of the form `foo.o: dependent.h',
+  # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'.
+  # Do two passes, one to just change these to
+  # `$object: dependent.h' and one to simply `dependent.h:'.
+  sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile"
+  # Some versions of the HPUX 10.20 sed can't process this invocation
+  # correctly.  Breaking it into two sed invocations is a workaround.
+  sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" \
+    | sed -e 's/$/ :/' >> "$depfile"
+  rm -f "$tmpdepfile"
+  ;;
+
+hp2)
+  # The "hp" stanza above does not work with aCC (C++) and HP's ia64
+  # compilers, which have integrated preprocessors.  The correct option
+  # to use with these is +Maked; it writes dependencies to a file named
+  # 'foo.d', which lands next to the object file, wherever that
+  # happens to be.
+  # Much of this is similar to the tru64 case; see comments there.
+  set_dir_from  "$object"
+  set_base_from "$object"
+  if test "$libtool" = yes; then
+    tmpdepfile1=$dir$base.d
+    tmpdepfile2=$dir.libs/$base.d
+    "$@" -Wc,+Maked
+  else
+    tmpdepfile1=$dir$base.d
+    tmpdepfile2=$dir$base.d
+    "$@" +Maked
+  fi
+  stat=$?
+  if test $stat -ne 0; then
+     rm -f "$tmpdepfile1" "$tmpdepfile2"
+     exit $stat
+  fi
+
+  for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2"
+  do
+    test -f "$tmpdepfile" && break
+  done
+  if test -f "$tmpdepfile"; then
+    sed -e "s,^.*\.[$lower]*:,$object:," "$tmpdepfile" > "$depfile"
+    # Add 'dependent.h:' lines.
+    sed -ne '2,${
+               s/^ *//
+               s/ \\*$//
+               s/$/:/
+               p
+             }' "$tmpdepfile" >> "$depfile"
+  else
+    make_dummy_depfile
+  fi
+  rm -f "$tmpdepfile" "$tmpdepfile2"
+  ;;
+
+tru64)
+  # The Tru64 compiler uses -MD to generate dependencies as a side
+  # effect.  'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'.
+  # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put
+  # dependencies in 'foo.d' instead, so we check for that too.
+  # Subdirectories are respected.
+  set_dir_from  "$object"
+  set_base_from "$object"
+
+  if test "$libtool" = yes; then
+    # Libtool generates 2 separate objects for the 2 libraries.  These
+    # two compilations output dependencies in $dir.libs/$base.o.d and
+    # in $dir$base.o.d.  We have to check for both files, because
+    # one of the two compilations can be disabled.  We should prefer
+    # $dir$base.o.d over $dir.libs/$base.o.d because the latter is
+    # automatically cleaned when .libs/ is deleted, while ignoring
+    # the former would cause a distcleancheck panic.
+    tmpdepfile1=$dir$base.o.d          # libtool 1.5
+    tmpdepfile2=$dir.libs/$base.o.d    # Likewise.
+    tmpdepfile3=$dir.libs/$base.d      # Compaq CCC V6.2-504
+    "$@" -Wc,-MD
+  else
+    tmpdepfile1=$dir$base.d
+    tmpdepfile2=$dir$base.d
+    tmpdepfile3=$dir$base.d
+    "$@" -MD
+  fi
+
+  stat=$?
+  if test $stat -ne 0; then
+    rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
+    exit $stat
+  fi
+
+  for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
+  do
+    test -f "$tmpdepfile" && break
+  done
+  # Same post-processing that is required for AIX mode.
+  aix_post_process_depfile
+  ;;
+
+msvc7)
+  if test "$libtool" = yes; then
+    showIncludes=-Wc,-showIncludes
+  else
+    showIncludes=-showIncludes
+  fi
+  "$@" $showIncludes > "$tmpdepfile"
+  stat=$?
+  grep -v '^Note: including file: ' "$tmpdepfile"
+  if test $stat -ne 0; then
+    rm -f "$tmpdepfile"
+    exit $stat
+  fi
+  rm -f "$depfile"
+  echo "$object : \\" > "$depfile"
+  # The first sed program below extracts the file names and escapes
+  # backslashes for cygpath.  The second sed program outputs the file
+  # name when reading, but also accumulates all include files in the
+  # hold buffer in order to output them again at the end.  This only
+  # works with sed implementations that can handle large buffers.
+  sed < "$tmpdepfile" -n '
+/^Note: including file:  *\(.*\)/ {
+  s//\1/
+  s/\\/\\\\/g
+  p
+}' | $cygpath_u | sort -u | sed -n '
+s/ /\\ /g
+s/\(.*\)/'"$tab"'\1 \\/p
+s/.\(.*\) \\/\1:/
+H
+$ {
+  s/.*/'"$tab"'/
+  G
+  p
+}' >> "$depfile"
+  echo >> "$depfile" # make sure the fragment doesn't end with a backslash
+  rm -f "$tmpdepfile"
+  ;;
+
+msvc7msys)
+  # This case exists only to let depend.m4 do its work.  It works by
+  # looking at the text of this script.  This case will never be run,
+  # since it is checked for above.
+  exit 1
+  ;;
+
+#nosideeffect)
+  # This comment above is used by automake to tell side-effect
+  # dependency tracking mechanisms from slower ones.
+
+dashmstdout)
+  # Important note: in order to support this mode, a compiler *must*
+  # always write the preprocessed file to stdout, regardless of -o.
+  "$@" || exit $?
+
+  # Remove the call to Libtool.
+  if test "$libtool" = yes; then
+    while test "X$1" != 'X--mode=compile'; do
+      shift
+    done
+    shift
+  fi
+
+  # Remove '-o $object'.
+  IFS=" "
+  for arg
+  do
+    case $arg in
+    -o)
+      shift
+      ;;
+    $object)
+      shift
+      ;;
+    *)
+      set fnord "$@" "$arg"
+      shift # fnord
+      shift # $arg
+      ;;
+    esac
+  done
+
+  test -z "$dashmflag" && dashmflag=-M
+  # Require at least two characters before searching for ':'
+  # in the target name.  This is to cope with DOS-style filenames:
+  # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise.
+  "$@" $dashmflag |
+    sed "s|^[$tab ]*[^:$tab ][^:][^:]*:[$tab ]*|$object: |" > "$tmpdepfile"
+  rm -f "$depfile"
+  cat < "$tmpdepfile" > "$depfile"
+  # Some versions of the HPUX 10.20 sed can't process this sed invocation
+  # correctly.  Breaking it into two sed invocations is a workaround.
+  tr ' ' "$nl" < "$tmpdepfile" \
+    | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \
+    | sed -e 's/$/ :/' >> "$depfile"
+  rm -f "$tmpdepfile"
+  ;;
+
+dashXmstdout)
+  # This case only exists to satisfy depend.m4.  It is never actually
+  # run, as this mode is specially recognized in the preamble.
+  exit 1
+  ;;
+
+makedepend)
+  "$@" || exit $?
+  # Remove any Libtool call
+  if test "$libtool" = yes; then
+    while test "X$1" != 'X--mode=compile'; do
+      shift
+    done
+    shift
+  fi
+  # X makedepend
+  shift
+  cleared=no eat=no
+  for arg
+  do
+    case $cleared in
+    no)
+      set ""; shift
+      cleared=yes ;;
+    esac
+    if test $eat = yes; then
+      eat=no
+      continue
+    fi
+    case "$arg" in
+    -D*|-I*)
+      set fnord "$@" "$arg"; shift ;;
+    # Strip any option that makedepend may not understand.  Remove
+    # the object too, otherwise makedepend will parse it as a source file.
+    -arch)
+      eat=yes ;;
+    -*|$object)
+      ;;
+    *)
+      set fnord "$@" "$arg"; shift ;;
+    esac
+  done
+  obj_suffix=`echo "$object" | sed 's/^.*\././'`
+  touch "$tmpdepfile"
+  ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@"
+  rm -f "$depfile"
+  # makedepend may prepend the VPATH from the source file name to the object.
+  # No need to regex-escape $object, excess matching of '.' is harmless.
+  sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile"
+  # Some versions of the HPUX 10.20 sed can't process the last invocation
+  # correctly.  Breaking it into two sed invocations is a workaround.
+  sed '1,2d' "$tmpdepfile" \
+    | tr ' ' "$nl" \
+    | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \
+    | sed -e 's/$/ :/' >> "$depfile"
+  rm -f "$tmpdepfile" "$tmpdepfile".bak
+  ;;
+
+cpp)
+  # Important note: in order to support this mode, a compiler *must*
+  # always write the preprocessed file to stdout.
+  "$@" || exit $?
+
+  # Remove the call to Libtool.
+  if test "$libtool" = yes; then
+    while test "X$1" != 'X--mode=compile'; do
+      shift
+    done
+    shift
+  fi
+
+  # Remove '-o $object'.
+  IFS=" "
+  for arg
+  do
+    case $arg in
+    -o)
+      shift
+      ;;
+    $object)
+      shift
+      ;;
+    *)
+      set fnord "$@" "$arg"
+      shift # fnord
+      shift # $arg
+      ;;
+    esac
+  done
+
+  "$@" -E \
+    | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
+             -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
+    | sed '$ s: \\$::' > "$tmpdepfile"
+  rm -f "$depfile"
+  echo "$object : \\" > "$depfile"
+  cat < "$tmpdepfile" >> "$depfile"
+  sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile"
+  rm -f "$tmpdepfile"
+  ;;
+
+msvisualcpp)
+  # Important note: in order to support this mode, a compiler *must*
+  # always write the preprocessed file to stdout.
+  "$@" || exit $?
+
+  # Remove the call to Libtool.
+  if test "$libtool" = yes; then
+    while test "X$1" != 'X--mode=compile'; do
+      shift
+    done
+    shift
+  fi
+
+  IFS=" "
+  for arg
+  do
+    case "$arg" in
+    -o)
+      shift
+      ;;
+    $object)
+      shift
+      ;;
+    "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI")
+        set fnord "$@"
+        shift
+        shift
+        ;;
+    *)
+        set fnord "$@" "$arg"
+        shift
+        shift
+        ;;
+    esac
+  done
+  "$@" -E 2>/dev/null |
+  sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile"
+  rm -f "$depfile"
+  echo "$object : \\" > "$depfile"
+  sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile"
+  echo "$tab" >> "$depfile"
+  sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile"
+  rm -f "$tmpdepfile"
+  ;;
+
+msvcmsys)
+  # This case exists only to let depend.m4 do its work.  It works by
+  # looking at the text of this script.  This case will never be run,
+  # since it is checked for above.
+  exit 1
+  ;;
+
+none)
+  exec "$@"
+  ;;
+
+*)
+  echo "Unknown depmode $depmode" 1>&2
+  exit 1
+  ;;
+esac
+
+exit 0
+
+# Local Variables:
+# mode: shell-script
+# sh-indentation: 2
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-time-zone: "UTC"
+# time-stamp-end: "; # UTC"
+# End:
diff --git a/docs/CMakeLists.txt b/docs/CMakeLists.txt
new file mode 100644
index 0000000..607ab51
--- /dev/null
+++ b/docs/CMakeLists.txt
@@ -0,0 +1,28 @@
+#####
+# Build doxygen documentation, if need be.
+#####
+IF(ENABLE_DOXYGEN)
+
+  FILE(GLOB COPY_FILES ${CMAKE_CURRENT_SOURCE_DIR}/*.html ${CMAKE_CURRENT_SOURCE_DIR}/images ${CMAKE_CURRENT_SOURCE_DIR}/*.doc ${CMAKE_CURRENT_SOURCE_DIR}/*.xml ${CMAKE_CURRENT_SOURCE_DIR}/*.m4 ${CMAKE_CURRENT_SOURCE_DIR}/*.texi)
+  FILE(COPY ${COPY_FILES} DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/)
+  # Copy the image files used by markdown documentation
+  # manually.
+  FILE(GLOB IMG_FILES ${CMAKE_CURRENT_BINARY_DIR}/images/*.jpg)
+
+  # Set abs_top_srcdir to work with autotools doxyfile template.
+  SET(abs_top_srcdir "${CMAKE_SOURCE_DIR}")
+  SET(abs_builddir "${CMAKE_CURRENT_BINARY_DIR}")
+
+  CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/Doxyfile.in
+    ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile @ONLY)
+  ADD_CUSTOM_TARGET(doc ALL
+    ${DOXYGEN_EXECUTABLE} ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile
+    WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
+    COMMENT "Generating API Documentation with Doxygen" VERBATIM
+    )
+  FILE(COPY ${IMG_FILES} DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/html/)
+ENDIF()
+
+SET(CUR_EXTRA_DIST ${CUR_EXTRA_DIST} CMakeLists.txt Makefile.am netcdf.m4 DoxygenLayout.xml Doxyfile.in footer.html mainpage.doc tutorial.doc install.doc dispatch.doc guide.doc types.doc notes.doc cdl.doc architecture.doc internal.doc Doxyfile.in.cmake windows-binaries.md Building-with-CMake.md)
+
+ADD_EXTRA_DIST("${CUR_EXTRA_DIST}")
diff --git a/docs/Doxyfile.in b/docs/Doxyfile.in
new file mode 100644
index 0000000..bc5106c
--- /dev/null
+++ b/docs/Doxyfile.in
@@ -0,0 +1,2318 @@
+# Doxyfile 1.8.7
+
+# This file describes the settings to be used by the documentation system
+# doxygen (www.doxygen.org) for a project.
+#
+# All text after a double hash (##) is considered a comment and is placed in
+# front of the TAG it is preceding.
+#
+# All text after a single hash (#) is considered a comment and will be ignored.
+# The format is:
+# TAG = value [value, ...]
+# For lists, items can also be appended using:
+# TAG += value [value, ...]
+# Values that contain spaces should be placed between quotes (\" \").
+
+#---------------------------------------------------------------------------
+# Project related configuration options
+#---------------------------------------------------------------------------
+
+# This tag specifies the encoding used for all characters in the config file
+# that follow. The default is UTF-8 which is also the encoding used for all text
+# before the first occurrence of this tag. Doxygen uses libiconv (or the iconv
+# built into libc) for the transcoding. See http://www.gnu.org/software/libiconv
+# for the list of possible encodings.
+# The default value is: UTF-8.
+
+DOXYFILE_ENCODING      = UTF-8
+
+# The PROJECT_NAME tag is a single word (or a sequence of words surrounded by
+# double-quotes, unless you are using Doxywizard) that should identify the
+# project for which the documentation is generated. This name is used in the
+# title of most generated pages and in a few other places.
+# The default value is: My Project.
+
+PROJECT_NAME           = NetCDF-Fortran
+
+# The PROJECT_NUMBER tag can be used to enter a project or revision number. This
+# could be handy for archiving the generated documentation or if some version
+# control system is used.
+
+PROJECT_NUMBER         = @PACKAGE_VERSION@
+
+# Using the PROJECT_BRIEF tag one can provide an optional one line description
+# for a project that appears at the top of each page and should give viewer a
+# quick idea about the purpose of the project. Keep the description short.
+
+PROJECT_BRIEF          =
+
+# With the PROJECT_LOGO tag one can specify an logo or icon that is included in
+# the documentation. The maximum height of the logo should not exceed 55 pixels
+# and the maximum width should not exceed 200 pixels. Doxygen will copy the logo
+# to the output directory.
+
+PROJECT_LOGO           = @abs_top_srcdir@/docs/netcdf-50x50.png
+
+# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) path
+# into which the generated documentation will be written. If a relative path is
+# entered, it will be relative to the location where doxygen was started. If
+# left blank the current directory will be used.
+
+OUTPUT_DIRECTORY       =
+
+# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create 4096 sub-
+# directories (in 2 levels) under the output directory of each output format and
+# will distribute the generated files over these directories. Enabling this
+# option can be useful when feeding doxygen a huge amount of source files, where
+# putting all generated files in the same directory would otherwise causes
+# performance problems for the file system.
+# The default value is: NO.
+
+CREATE_SUBDIRS         = NO
+
+# If the ALLOW_UNICODE_NAMES tag is set to YES, doxygen will allow non-ASCII
+# characters to appear in the names of generated files. If set to NO, non-ASCII
+# characters will be escaped, for example _xE3_x81_x84 will be used for Unicode
+# U+3044.
+# The default value is: NO.
+
+ALLOW_UNICODE_NAMES    = NO
+
+# The OUTPUT_LANGUAGE tag is used to specify the language in which all
+# documentation generated by doxygen is written. Doxygen will use this
+# information to generate all constant output in the proper language.
+# Possible values are: Afrikaans, Arabic, Armenian, Brazilian, Catalan, Chinese,
+# Chinese-Traditional, Croatian, Czech, Danish, Dutch, English (United States),
+# Esperanto, Farsi (Persian), Finnish, French, German, Greek, Hungarian,
+# Indonesian, Italian, Japanese, Japanese-en (Japanese with English messages),
+# Korean, Korean-en (Korean with English messages), Latvian, Lithuanian,
+# Macedonian, Norwegian, Persian (Farsi), Polish, Portuguese, Romanian, Russian,
+# Serbian, Serbian-Cyrillic, Slovak, Slovene, Spanish, Swedish, Turkish,
+# Ukrainian and Vietnamese.
+# The default value is: English.
+
+OUTPUT_LANGUAGE        = English
+
+# If the BRIEF_MEMBER_DESC tag is set to YES doxygen will include brief member
+# descriptions after the members that are listed in the file and class
+# documentation (similar to Javadoc). Set to NO to disable this.
+# The default value is: YES.
+
+BRIEF_MEMBER_DESC      = YES
+
+# If the REPEAT_BRIEF tag is set to YES doxygen will prepend the brief
+# description of a member or function before the detailed description
+#
+# Note: If both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the
+# brief descriptions will be completely suppressed.
+# The default value is: YES.
+
+REPEAT_BRIEF           = YES
+
+# This tag implements a quasi-intelligent brief description abbreviator that is
+# used to form the text in various listings. Each string in this list, if found
+# as the leading text of the brief description, will be stripped from the text
+# and the result, after processing the whole list, is used as the annotated
+# text. Otherwise, the brief description is used as-is. If left blank, the
+# following values are used ($name is automatically replaced with the name of
+# the entity):The $name class, The $name widget, The $name file, is, provides,
+# specifies, contains, represents, a, an and the.
+
+ABBREVIATE_BRIEF       =
+
+# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then
+# doxygen will generate a detailed section even if there is only a brief
+# description.
+# The default value is: NO.
+
+ALWAYS_DETAILED_SEC    = NO
+
+# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all
+# inherited members of a class in the documentation of that class as if those
+# members were ordinary class members. Constructors, destructors and assignment
+# operators of the base classes will not be shown.
+# The default value is: NO.
+
+INLINE_INHERITED_MEMB  = NO
+
+# If the FULL_PATH_NAMES tag is set to YES doxygen will prepend the full path
+# before files name in the file list and in the header files. If set to NO the
+# shortest path that makes the file name unique will be used
+# The default value is: YES.
+
+FULL_PATH_NAMES        = NO
+
+# The STRIP_FROM_PATH tag can be used to strip a user-defined part of the path.
+# Stripping is only done if one of the specified strings matches the left-hand
+# part of the path. The tag can be used to show relative paths in the file list.
+# If left blank the directory from which doxygen is run is used as the path to
+# strip.
+#
+# Note that you can specify absolute paths here, but also relative paths, which
+# will be relative from the directory where doxygen is started.
+# This tag requires that the tag FULL_PATH_NAMES is set to YES.
+
+STRIP_FROM_PATH        =
+
+# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of the
+# path mentioned in the documentation of a class, which tells the reader which
+# header file to include in order to use a class. If left blank only the name of
+# the header file containing the class definition is used. Otherwise one should
+# specify the list of include paths that are normally passed to the compiler
+# using the -I flag.
+
+STRIP_FROM_INC_PATH    =
+
+# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter (but
+# less readable) file names. This can be useful is your file systems doesn't
+# support long names like on DOS, Mac, or CD-ROM.
+# The default value is: NO.
+
+SHORT_NAMES            = NO
+
+# If the JAVADOC_AUTOBRIEF tag is set to YES then doxygen will interpret the
+# first line (until the first dot) of a Javadoc-style comment as the brief
+# description. If set to NO, the Javadoc-style will behave just like regular Qt-
+# style comments (thus requiring an explicit @brief command for a brief
+# description.)
+# The default value is: NO.
+
+JAVADOC_AUTOBRIEF      = YES
+
+# If the QT_AUTOBRIEF tag is set to YES then doxygen will interpret the first
+# line (until the first dot) of a Qt-style comment as the brief description. If
+# set to NO, the Qt-style will behave just like regular Qt-style comments (thus
+# requiring an explicit \brief command for a brief description.)
+# The default value is: NO.
+
+QT_AUTOBRIEF           = YES
+
+# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make doxygen treat a
+# multi-line C++ special comment block (i.e. a block of //! or /// comments) as
+# a brief description. This used to be the default behavior. The new default is
+# to treat a multi-line C++ comment block as a detailed description. Set this
+# tag to YES if you prefer the old behavior instead.
+#
+# Note that setting this tag to YES also means that rational rose comments are
+# not recognized any more.
+# The default value is: NO.
+
+MULTILINE_CPP_IS_BRIEF = NO
+
+# If the INHERIT_DOCS tag is set to YES then an undocumented member inherits the
+# documentation from any documented member that it re-implements.
+# The default value is: YES.
+
+INHERIT_DOCS           = YES
+
+# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce a
+# new page for each member. If set to NO, the documentation of a member will be
+# part of the file/class/namespace that contains it.
+# The default value is: NO.
+
+SEPARATE_MEMBER_PAGES  = NO
+
+# The TAB_SIZE tag can be used to set the number of spaces in a tab. Doxygen
+# uses this value to replace tabs by spaces in code fragments.
+# Minimum value: 1, maximum value: 16, default value: 4.
+
+TAB_SIZE               = 4
+
+# This tag can be used to specify a number of aliases that act as commands in
+# the documentation. An alias has the form:
+# name=value
+# For example adding
+# "sideeffect=@par Side Effects:\n"
+# will allow you to put the command \sideeffect (or @sideeffect) in the
+# documentation, which will result in a user-defined paragraph with heading
+# "Side Effects:". You can put \n's in the value part of an alias to insert
+# newlines.
+
+ALIASES                =
+
+# This tag can be used to specify a number of word-keyword mappings (TCL only).
+# A mapping has the form "name=value". For example adding "class=itcl::class"
+# will allow you to use the command class in the itcl::class meaning.
+
+TCL_SUBST              =
+
+# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources
+# only. Doxygen will then generate output that is more tailored for C. For
+# instance, some of the names that are used will be different. The list of all
+# members will be omitted, etc.
+# The default value is: NO.
+
+OPTIMIZE_OUTPUT_FOR_C  = NO
+
+# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java or
+# Python sources only. Doxygen will then generate output that is more tailored
+# for that language. For instance, namespaces will be presented as packages,
+# qualified scopes will look different, etc.
+# The default value is: NO.
+
+OPTIMIZE_OUTPUT_JAVA   = NO
+
+# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran
+# sources. Doxygen will then generate output that is tailored for Fortran.
+# The default value is: NO.
+
+OPTIMIZE_FOR_FORTRAN   = YES
+
+# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL
+# sources. Doxygen will then generate output that is tailored for VHDL.
+# The default value is: NO.
+
+OPTIMIZE_OUTPUT_VHDL   = NO
+
+# Doxygen selects the parser to use depending on the extension of the files it
+# parses. With this tag you can assign which parser to use for a given
+# extension. Doxygen has a built-in mapping, but you can override or extend it
+# using this tag. The format is ext=language, where ext is a file extension, and
+# language is one of the parsers supported by doxygen: IDL, Java, Javascript,
+# C#, C, C++, D, PHP, Objective-C, Python, Fortran (fixed format Fortran:
+# FortranFixed, free formatted Fortran: FortranFree, unknown formatted Fortran:
+# Fortran. In the later case the parser tries to guess whether the code is fixed
+# or free formatted code, this is the default for Fortran type files), VHDL. For
+# instance to make doxygen treat .inc files as Fortran files (default is PHP),
+# and .f files as C (default is Fortran), use: inc=Fortran f=C.
+#
+# Note For files without extension you can use no_extension as a placeholder.
+#
+# Note that for custom extensions you also need to set FILE_PATTERNS otherwise
+# the files are not read by doxygen.
+
+EXTENSION_MAPPING      =
+
+# If the MARKDOWN_SUPPORT tag is enabled then doxygen pre-processes all comments
+# according to the Markdown format, which allows for more readable
+# documentation. See http://daringfireball.net/projects/markdown/ for details.
+# The output of markdown processing is further processed by doxygen, so you can
+# mix doxygen, HTML, and XML commands with Markdown formatting. Disable only in
+# case of backward compatibilities issues.
+# The default value is: YES.
+
+MARKDOWN_SUPPORT       = YES
+
+# When enabled doxygen tries to link words that correspond to documented
+# classes, or namespaces to their corresponding documentation. Such a link can
+# be prevented in individual cases by by putting a % sign in front of the word
+# or globally by setting AUTOLINK_SUPPORT to NO.
+# The default value is: YES.
+
+AUTOLINK_SUPPORT       = YES
+
+# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want
+# to include (a tag file for) the STL sources as input, then you should set this
+# tag to YES in order to let doxygen match functions declarations and
+# definitions whose arguments contain STL classes (e.g. func(std::string);
+# versus func(std::string) {}). This also make the inheritance and collaboration
+# diagrams that involve STL classes more complete and accurate.
+# The default value is: NO.
+
+BUILTIN_STL_SUPPORT    = NO
+
+# If you use Microsoft's C++/CLI language, you should set this option to YES to
+# enable parsing support.
+# The default value is: NO.
+
+CPP_CLI_SUPPORT        = NO
+
+# Set the SIP_SUPPORT tag to YES if your project consists of sip (see:
+# http://www.riverbankcomputing.co.uk/software/sip/intro) sources only. Doxygen
+# will parse them like normal C++ but will assume all classes use public instead
+# of private inheritance when no explicit protection keyword is present.
+# The default value is: NO.
+
+SIP_SUPPORT            = NO
+
+# For Microsoft's IDL there are propget and propput attributes to indicate
+# getter and setter methods for a property. Setting this option to YES will make
+# doxygen to replace the get and set methods by a property in the documentation.
+# This will only work if the methods are indeed getting or setting a simple
+# type. If this is not the case, or you want to show the methods anyway, you
+# should set this option to NO.
+# The default value is: YES.
+
+IDL_PROPERTY_SUPPORT   = YES
+
+# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC
+# tag is set to YES, then doxygen will reuse the documentation of the first
+# member in the group (if any) for the other members of the group. By default
+# all members of a group must be documented explicitly.
+# The default value is: NO.
+
+DISTRIBUTE_GROUP_DOC   = YES
+
+# Set the SUBGROUPING tag to YES to allow class member groups of the same type
+# (for instance a group of public functions) to be put as a subgroup of that
+# type (e.g. under the Public Functions section). Set it to NO to prevent
+# subgrouping. Alternatively, this can be done per class using the
+# \nosubgrouping command.
+# The default value is: YES.
+
+SUBGROUPING            = YES
+
+# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and unions
+# are shown inside the group in which they are included (e.g. using \ingroup)
+# instead of on a separate page (for HTML and Man pages) or section (for LaTeX
+# and RTF).
+#
+# Note that this feature does not work in combination with
+# SEPARATE_MEMBER_PAGES.
+# The default value is: NO.
+
+INLINE_GROUPED_CLASSES = NO
+
+# When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and unions
+# with only public data fields or simple typedef fields will be shown inline in
+# the documentation of the scope in which they are defined (i.e. file,
+# namespace, or group documentation), provided this scope is documented. If set
+# to NO, structs, classes, and unions are shown on a separate page (for HTML and
+# Man pages) or section (for LaTeX and RTF).
+# The default value is: NO.
+
+INLINE_SIMPLE_STRUCTS  = NO
+
+# When TYPEDEF_HIDES_STRUCT tag is enabled, a typedef of a struct, union, or
+# enum is documented as struct, union, or enum with the name of the typedef. So
+# typedef struct TypeS {} TypeT, will appear in the documentation as a struct
+# with name TypeT. When disabled the typedef will appear as a member of a file,
+# namespace, or class. And the struct will be named TypeS. This can typically be
+# useful for C code in case the coding convention dictates that all compound
+# types are typedef'ed and only the typedef is referenced, never the tag name.
+# The default value is: NO.
+
+TYPEDEF_HIDES_STRUCT   = NO
+
+# The size of the symbol lookup cache can be set using LOOKUP_CACHE_SIZE. This
+# cache is used to resolve symbols given their name and scope. Since this can be
+# an expensive process and often the same symbol appears multiple times in the
+# code, doxygen keeps a cache of pre-resolved symbols. If the cache is too small
+# doxygen will become slower. If the cache is too large, memory is wasted. The
+# cache size is given by this formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range
+# is 0..9, the default is 0, corresponding to a cache size of 2^16=65536
+# symbols. At the end of a run doxygen will report the cache usage and suggest
+# the optimal cache size from a speed point of view.
+# Minimum value: 0, maximum value: 9, default value: 0.
+
+LOOKUP_CACHE_SIZE      = 0
+
+#---------------------------------------------------------------------------
+# Build related configuration options
+#---------------------------------------------------------------------------
+
+# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in
+# documentation are documented, even if no documentation was available. Private
+# class members and static file members will be hidden unless the
+# EXTRACT_PRIVATE respectively EXTRACT_STATIC tags are set to YES.
+# Note: This will also disable the warnings about undocumented members that are
+# normally produced when WARNINGS is set to YES.
+# The default value is: NO.
+
+EXTRACT_ALL            = NO
+
+# If the EXTRACT_PRIVATE tag is set to YES all private members of a class will
+# be included in the documentation.
+# The default value is: NO.
+
+EXTRACT_PRIVATE        = NO
+
+# If the EXTRACT_PACKAGE tag is set to YES all members with package or internal
+# scope will be included in the documentation.
+# The default value is: NO.
+
+EXTRACT_PACKAGE        = NO
+
+# If the EXTRACT_STATIC tag is set to YES all static members of a file will be
+# included in the documentation.
+# The default value is: NO.
+
+EXTRACT_STATIC         = YES
+
+# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) defined
+# locally in source files will be included in the documentation. If set to NO
+# only classes defined in header files are included. Does not have any effect
+# for Java sources.
+# The default value is: YES.
+
+EXTRACT_LOCAL_CLASSES  = YES
+
+# This flag is only useful for Objective-C code. When set to YES local methods,
+# which are defined in the implementation section but not in the interface are
+# included in the documentation. If set to NO only methods in the interface are
+# included.
+# The default value is: NO.
+
+EXTRACT_LOCAL_METHODS  = NO
+
+# If this flag is set to YES, the members of anonymous namespaces will be
+# extracted and appear in the documentation as a namespace called
+# 'anonymous_namespace{file}', where file will be replaced with the base name of
+# the file that contains the anonymous namespace. By default anonymous namespace
+# are hidden.
+# The default value is: NO.
+
+EXTRACT_ANON_NSPACES   = NO
+
+# If the HIDE_UNDOC_MEMBERS tag is set to YES, doxygen will hide all
+# undocumented members inside documented classes or files. If set to NO these
+# members will be included in the various overviews, but no documentation
+# section is generated. This option has no effect if EXTRACT_ALL is enabled.
+# The default value is: NO.
+
+HIDE_UNDOC_MEMBERS     = NO
+
+# If the HIDE_UNDOC_CLASSES tag is set to YES, doxygen will hide all
+# undocumented classes that are normally visible in the class hierarchy. If set
+# to NO these classes will be included in the various overviews. This option has
+# no effect if EXTRACT_ALL is enabled.
+# The default value is: NO.
+
+HIDE_UNDOC_CLASSES     = NO
+
+# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, doxygen will hide all friend
+# (class|struct|union) declarations. If set to NO these declarations will be
+# included in the documentation.
+# The default value is: NO.
+
+HIDE_FRIEND_COMPOUNDS  = NO
+
+# If the HIDE_IN_BODY_DOCS tag is set to YES, doxygen will hide any
+# documentation blocks found inside the body of a function. If set to NO these
+# blocks will be appended to the function's detailed documentation block.
+# The default value is: NO.
+
+HIDE_IN_BODY_DOCS      = NO
+
+# The INTERNAL_DOCS tag determines if documentation that is typed after a
+# \internal command is included. If the tag is set to NO then the documentation
+# will be excluded. Set it to YES to include the internal documentation.
+# The default value is: NO.
+
+INTERNAL_DOCS          = @BUILD_INTERNAL_DOCS@
+
+# If the CASE_SENSE_NAMES tag is set to NO then doxygen will only generate file
+# names in lower-case letters. If set to YES upper-case letters are also
+# allowed. This is useful if you have classes or files whose names only differ
+# in case and if your file system supports case sensitive file names. Windows
+# and Mac users are advised to set this option to NO.
+# The default value is: system dependent.
+
+CASE_SENSE_NAMES       = YES
+
+# If the HIDE_SCOPE_NAMES tag is set to NO then doxygen will show members with
+# their full class and namespace scopes in the documentation. If set to YES the
+# scope will be hidden.
+# The default value is: NO.
+
+HIDE_SCOPE_NAMES       = NO
+
+# If the SHOW_INCLUDE_FILES tag is set to YES then doxygen will put a list of
+# the files that are included by a file in the documentation of that file.
+# The default value is: YES.
+
+SHOW_INCLUDE_FILES     = YES
+
+# If the SHOW_GROUPED_MEMB_INC tag is set to YES then Doxygen will add for each
+# grouped member an include statement to the documentation, telling the reader
+# which file to include in order to use the member.
+# The default value is: NO.
+
+SHOW_GROUPED_MEMB_INC  = NO
+
+# If the FORCE_LOCAL_INCLUDES tag is set to YES then doxygen will list include
+# files with double quotes in the documentation rather than with sharp brackets.
+# The default value is: NO.
+
+FORCE_LOCAL_INCLUDES   = NO
+
+# If the INLINE_INFO tag is set to YES then a tag [inline] is inserted in the
+# documentation for inline members.
+# The default value is: YES.
+
+INLINE_INFO            = YES
+
+# If the SORT_MEMBER_DOCS tag is set to YES then doxygen will sort the
+# (detailed) documentation of file and class members alphabetically by member
+# name. If set to NO the members will appear in declaration order.
+# The default value is: YES.
+
+SORT_MEMBER_DOCS       = YES
+
+# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the brief
+# descriptions of file, namespace and class members alphabetically by member
+# name. If set to NO the members will appear in declaration order. Note that
+# this will also influence the order of the classes in the class list.
+# The default value is: NO.
+
+SORT_BRIEF_DOCS        = NO
+
+# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen will sort the
+# (brief and detailed) documentation of class members so that constructors and
+# destructors are listed first. If set to NO the constructors will appear in the
+# respective orders defined by SORT_BRIEF_DOCS and SORT_MEMBER_DOCS.
+# Note: If SORT_BRIEF_DOCS is set to NO this option is ignored for sorting brief
+# member documentation.
+# Note: If SORT_MEMBER_DOCS is set to NO this option is ignored for sorting
+# detailed member documentation.
+# The default value is: NO.
+
+SORT_MEMBERS_CTORS_1ST = NO
+
+# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the hierarchy
+# of group names into alphabetical order. If set to NO the group names will
+# appear in their defined order.
+# The default value is: NO.
+
+SORT_GROUP_NAMES       = NO
+
+# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be sorted by
+# fully-qualified names, including namespaces. If set to NO, the class list will
+# be sorted only by class name, not including the namespace part.
+# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES.
+# Note: This option applies only to the class list, not to the alphabetical
+# list.
+# The default value is: NO.
+
+SORT_BY_SCOPE_NAME     = NO
+
+# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to do proper
+# type resolution of all parameters of a function it will reject a match between
+# the prototype and the implementation of a member function even if there is
+# only one candidate or it is obvious which candidate to choose by doing a
+# simple string match. By disabling STRICT_PROTO_MATCHING doxygen will still
+# accept a match between prototype and implementation in such cases.
+# The default value is: NO.
+
+STRICT_PROTO_MATCHING  = NO
+
+# The GENERATE_TODOLIST tag can be used to enable ( YES) or disable ( NO) the
+# todo list. This list is created by putting \todo commands in the
+# documentation.
+# The default value is: YES.
+
+GENERATE_TODOLIST      = @SHOW_DOXYGEN_TAG_LIST@
+
+# The GENERATE_TESTLIST tag can be used to enable ( YES) or disable ( NO) the
+# test list. This list is created by putting \test commands in the
+# documentation.
+# The default value is: YES.
+
+GENERATE_TESTLIST      = @SHOW_DOXYGEN_TAG_LIST@
+
+# The GENERATE_BUGLIST tag can be used to enable ( YES) or disable ( NO) the bug
+# list. This list is created by putting \bug commands in the documentation.
+# The default value is: YES.
+
+GENERATE_BUGLIST       = @SHOW_DOXYGEN_TAG_LIST@
+
+# The GENERATE_DEPRECATEDLIST tag can be used to enable ( YES) or disable ( NO)
+# the deprecated list. This list is created by putting \deprecated commands in
+# the documentation.
+# The default value is: YES.
+
+GENERATE_DEPRECATEDLIST= YES
+
+# The ENABLED_SECTIONS tag can be used to enable conditional documentation
+# sections, marked by \if <section_label> ... \endif and \cond <section_label>
+# ... \endcond blocks.
+
+ENABLED_SECTIONS       =
+
+# The MAX_INITIALIZER_LINES tag determines the maximum number of lines that the
+# initial value of a variable or macro / define can have for it to appear in the
+# documentation. If the initializer consists of more lines than specified here
+# it will be hidden. Use a value of 0 to hide initializers completely. The
+# appearance of the value of individual variables and macros / defines can be
+# controlled using \showinitializer or \hideinitializer command in the
+# documentation regardless of this setting.
+# Minimum value: 0, maximum value: 10000, default value: 30.
+
+MAX_INITIALIZER_LINES  = 30
+
+# Set the SHOW_USED_FILES tag to NO to disable the list of files generated at
+# the bottom of the documentation of classes and structs. If set to YES the list
+# will mention the files that were used to generate the documentation.
+# The default value is: YES.
+
+SHOW_USED_FILES        = YES
+
+# Set the SHOW_FILES tag to NO to disable the generation of the Files page. This
+# will remove the Files entry from the Quick Index and from the Folder Tree View
+# (if specified).
+# The default value is: YES.
+
+SHOW_FILES             = YES
+
+# Set the SHOW_NAMESPACES tag to NO to disable the generation of the Namespaces
+# page. This will remove the Namespaces entry from the Quick Index and from the
+# Folder Tree View (if specified).
+# The default value is: YES.
+
+SHOW_NAMESPACES        = YES
+
+# The FILE_VERSION_FILTER tag can be used to specify a program or script that
+# doxygen should invoke to get the current version for each file (typically from
+# the version control system). Doxygen will invoke the program by executing (via
+# popen()) the command command input-file, where command is the value of the
+# FILE_VERSION_FILTER tag, and input-file is the name of an input file provided
+# by doxygen. Whatever the program writes to standard output is used as the file
+# version. For an example see the documentation.
+
+FILE_VERSION_FILTER    =
+
+# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed
+# by doxygen. The layout file controls the global structure of the generated
+# output files in an output format independent way. To create the layout file
+# that represents doxygen's defaults, run doxygen with the -l option. You can
+# optionally specify a file name after the option, if omitted DoxygenLayout.xml
+# will be used as the name of the layout file.
+#
+# Note that if you run doxygen from a directory containing a file called
+# DoxygenLayout.xml, doxygen will parse it automatically even if the LAYOUT_FILE
+# tag is left empty.
+
+LAYOUT_FILE            = @abs_top_srcdir@/docs/DoxygenLayout.xml
+
+# The CITE_BIB_FILES tag can be used to specify one or more bib files containing
+# the reference definitions. This must be a list of .bib files. The .bib
+# extension is automatically appended if omitted. This requires the bibtex tool
+# to be installed. See also http://en.wikipedia.org/wiki/BibTeX for more info.
+# For LaTeX the style of the bibliography can be controlled using
+# LATEX_BIB_STYLE. To use this feature you need bibtex and perl available in the
+# search path. Do not use file names with spaces, bibtex cannot handle them. See
+# also \cite for info how to create references.
+
+CITE_BIB_FILES         =
+
+#---------------------------------------------------------------------------
+# Configuration options related to warning and progress messages
+#---------------------------------------------------------------------------
+
+# The QUIET tag can be used to turn on/off the messages that are generated to
+# standard output by doxygen. If QUIET is set to YES this implies that the
+# messages are off.
+# The default value is: NO.
+
+QUIET                  = YES
+
+# The WARNINGS tag can be used to turn on/off the warning messages that are
+# generated to standard error ( stderr) by doxygen. If WARNINGS is set to YES
+# this implies that the warnings are on.
+#
+# Tip: Turn warnings on while writing the documentation.
+# The default value is: YES.
+
+WARNINGS               = YES
+
+# If the WARN_IF_UNDOCUMENTED tag is set to YES, then doxygen will generate
+# warnings for undocumented members. If EXTRACT_ALL is set to YES then this flag
+# will automatically be disabled.
+# The default value is: YES.
+
+WARN_IF_UNDOCUMENTED   = NO
+
+# If the WARN_IF_DOC_ERROR tag is set to YES, doxygen will generate warnings for
+# potential errors in the documentation, such as not documenting some parameters
+# in a documented function, or documenting parameters that don't exist or using
+# markup commands wrongly.
+# The default value is: YES.
+
+WARN_IF_DOC_ERROR      = YES
+
+# This WARN_NO_PARAMDOC option can be enabled to get warnings for functions that
+# are documented, but have no documentation for their parameters or return
+# value. If set to NO doxygen will only warn about wrong or incomplete parameter
+# documentation, but not about the absence of documentation.
+# The default value is: NO.
+
+WARN_NO_PARAMDOC       = YES
+
+# The WARN_FORMAT tag determines the format of the warning messages that doxygen
+# can produce. The string should contain the $file, $line, and $text tags, which
+# will be replaced by the file and line number from which the warning originated
+# and the warning text. Optionally the format may contain $version, which will
+# be replaced by the version of the file (if it could be obtained via
+# FILE_VERSION_FILTER)
+# The default value is: $file:$line: $text.
+
+WARN_FORMAT            = "$file:$line: $text"
+
+# The WARN_LOGFILE tag can be used to specify a file to which warning and error
+# messages should be written. If left blank the output is written to standard
+# error (stderr).
+
+WARN_LOGFILE           =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the input files
+#---------------------------------------------------------------------------
+
+# The INPUT tag is used to specify the files and/or directories that contain
+# documented source files. You may enter file names like myfile.cpp or
+# directories like /usr/src/myproject. Separate the files or directories with
+# spaces.
+# Note: If this tag is empty the current directory is searched.
+
+INPUT                  = @abs_top_srcdir@/RELEASE_NOTES.md \
+                         @abs_top_srcdir@/README.md \
+						 @abs_top_srcdir@/libsrc \
+						 @abs_top_srcdir@/fortran \
+						 @abs_top_srcdir@/docs/netcdf-f77.md \
+                         @abs_top_srcdir@/fortran \
+                         @abs_top_srcdir@/libsrc
+
+# This tag can be used to specify the character encoding of the source files
+# that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses
+# libiconv (or the iconv built into libc) for the transcoding. See the libiconv
+# documentation (see: http://www.gnu.org/software/libiconv) for the list of
+# possible encodings.
+# The default value is: UTF-8.
+
+INPUT_ENCODING         = UTF-8
+
+# If the value of the INPUT tag contains directories, you can use the
+# FILE_PATTERNS tag to specify one or more wildcard patterns (like *.cpp and
+# *.h) to filter out the source-files in the directories. If left blank the
+# following patterns are tested:*.c, *.cc, *.cxx, *.cpp, *.c++, *.java, *.ii,
+# *.ixx, *.ipp, *.i++, *.inl, *.idl, *.ddl, *.odl, *.h, *.hh, *.hxx, *.hpp,
+# *.h++, *.cs, *.d, *.php, *.php4, *.php5, *.phtml, *.inc, *.m, *.markdown,
+# *.md, *.mm, *.dox, *.py, *.f90, *.f, *.for, *.tcl, *.vhd, *.vhdl, *.ucf,
+# *.qsf, *.as and *.js.
+
+FILE_PATTERNS          = *.f90 *.F90 *.c *.h *.F
+
+# The RECURSIVE tag can be used to specify whether or not subdirectories should
+# be searched for input files as well.
+# The default value is: NO.
+
+RECURSIVE              = YES
+
+# The EXCLUDE tag can be used to specify files and/or directories that should be
+# excluded from the INPUT source files. This way you can easily exclude a
+# subdirectory from a directory tree whose root is specified with the INPUT tag.
+#
+# Note that relative paths are relative to the directory from which doxygen is
+# run.
+
+EXCLUDE                =
+
+# The EXCLUDE_SYMLINKS tag can be used to select whether or not files or
+# directories that are symbolic links (a Unix file system feature) are excluded
+# from the input.
+# The default value is: NO.
+
+EXCLUDE_SYMLINKS       = NO
+
+# If the value of the INPUT tag contains directories, you can use the
+# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude
+# certain files from those directories.
+#
+# Note that the wildcards are matched against the file with absolute path, so to
+# exclude all test directories for example use the pattern */test/*
+
+EXCLUDE_PATTERNS       =
+
+# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names
+# (namespaces, classes, functions, etc.) that should be excluded from the
+# output. The symbol name can be a fully qualified name, a word, or if the
+# wildcard * is used, a substring. Examples: ANamespace, AClass,
+# AClass::ANamespace, ANamespace::*Test
+#
+# Note that the wildcards are matched against the file with absolute path, so to
+# exclude all test directories use the pattern */test/*
+
+EXCLUDE_SYMBOLS        =
+
+# The EXAMPLE_PATH tag can be used to specify one or more files or directories
+# that contain example code fragments that are included (see the \include
+# command).
+
+EXAMPLE_PATH           = @abs_top_srcdir@/examples
+
+# If the value of the EXAMPLE_PATH tag contains directories, you can use the
+# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp and
+# *.h) to filter out the source-files in the directories. If left blank all
+# files are included.
+
+EXAMPLE_PATTERNS       =
+
+# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be
+# searched for input files to be used with the \include or \dontinclude commands
+# irrespective of the value of the RECURSIVE tag.
+# The default value is: NO.
+
+EXAMPLE_RECURSIVE      = NO
+
+# The IMAGE_PATH tag can be used to specify one or more files or directories
+# that contain images that are to be included in the documentation (see the
+# \image command).
+
+IMAGE_PATH             =
+
+# The INPUT_FILTER tag can be used to specify a program that doxygen should
+# invoke to filter for each input file. Doxygen will invoke the filter program
+# by executing (via popen()) the command:
+#
+# <filter> <input-file>
+#
+# where <filter> is the value of the INPUT_FILTER tag, and <input-file> is the
+# name of an input file. Doxygen will then use the output that the filter
+# program writes to standard output. If FILTER_PATTERNS is specified, this tag
+# will be ignored.
+#
+# Note that the filter must not add or remove lines; it is applied before the
+# code is scanned, but not when the output code is generated. If lines are added
+# or removed, the anchors will not be placed correctly.
+
+INPUT_FILTER           =
+
+# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern
+# basis. Doxygen will compare the file name with each pattern and apply the
+# filter if there is a match. The filters are a list of the form: pattern=filter
+# (like *.cpp=my_cpp_filter). See INPUT_FILTER for further information on how
+# filters are used. If the FILTER_PATTERNS tag is empty or if none of the
+# patterns match the file name, INPUT_FILTER is applied.
+
+FILTER_PATTERNS        =
+
+# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using
+# INPUT_FILTER ) will also be used to filter the input files that are used for
+# producing the source files to browse (i.e. when SOURCE_BROWSER is set to YES).
+# The default value is: NO.
+
+FILTER_SOURCE_FILES    = NO
+
+# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file
+# pattern. A pattern will override the setting for FILTER_PATTERN (if any) and
+# it is also possible to disable source filtering for a specific pattern using
+# *.ext= (so without naming a filter).
+# This tag requires that the tag FILTER_SOURCE_FILES is set to YES.
+
+FILTER_SOURCE_PATTERNS =
+
+# If the USE_MDFILE_AS_MAINPAGE tag refers to the name of a markdown file that
+# is part of the input, its contents will be placed on the main page
+# (index.html). This can be useful if you have a project on for instance GitHub
+# and want to reuse the introduction page also for the doxygen output.
+
+USE_MDFILE_AS_MAINPAGE = @abs_top_srcdir@/README.md
+
+#---------------------------------------------------------------------------
+# Configuration options related to source browsing
+#---------------------------------------------------------------------------
+
+# If the SOURCE_BROWSER tag is set to YES then a list of source files will be
+# generated. Documented entities will be cross-referenced with these sources.
+#
+# Note: To get rid of all source code in the generated output, make sure that
+# also VERBATIM_HEADERS is set to NO.
+# The default value is: NO.
+
+SOURCE_BROWSER         = YES
+
+# Setting the INLINE_SOURCES tag to YES will include the body of functions,
+# classes and enums directly into the documentation.
+# The default value is: NO.
+
+INLINE_SOURCES         = NO
+
+# Setting the STRIP_CODE_COMMENTS tag to YES will instruct doxygen to hide any
+# special comment blocks from generated source code fragments. Normal C, C++ and
+# Fortran comments will always remain visible.
+# The default value is: YES.
+
+STRIP_CODE_COMMENTS    = YES
+
+# If the REFERENCED_BY_RELATION tag is set to YES then for each documented
+# function all documented functions referencing it will be listed.
+# The default value is: NO.
+
+REFERENCED_BY_RELATION = NO
+
+# If the REFERENCES_RELATION tag is set to YES then for each documented function
+# all documented entities called/used by that function will be listed.
+# The default value is: NO.
+
+REFERENCES_RELATION    = NO
+
+# If the REFERENCES_LINK_SOURCE tag is set to YES and SOURCE_BROWSER tag is set
+# to YES, then the hyperlinks from functions in REFERENCES_RELATION and
+# REFERENCED_BY_RELATION lists will link to the source code. Otherwise they will
+# link to the documentation.
+# The default value is: YES.
+
+REFERENCES_LINK_SOURCE = YES
+
+# If SOURCE_TOOLTIPS is enabled (the default) then hovering a hyperlink in the
+# source code will show a tooltip with additional information such as prototype,
+# brief description and links to the definition and documentation. Since this
+# will make the HTML file larger and loading of large files a bit slower, you
+# can opt to disable this feature.
+# The default value is: YES.
+# This tag requires that the tag SOURCE_BROWSER is set to YES.
+
+SOURCE_TOOLTIPS        = YES
+
+# If the USE_HTAGS tag is set to YES then the references to source code will
+# point to the HTML generated by the htags(1) tool instead of doxygen built-in
+# source browser. The htags tool is part of GNU's global source tagging system
+# (see http://www.gnu.org/software/global/global.html). You will need version
+# 4.8.6 or higher.
+#
+# To use it do the following:
+# - Install the latest version of global
+# - Enable SOURCE_BROWSER and USE_HTAGS in the config file
+# - Make sure the INPUT points to the root of the source tree
+# - Run doxygen as normal
+#
+# Doxygen will invoke htags (and that will in turn invoke gtags), so these
+# tools must be available from the command line (i.e. in the search path).
+#
+# The result: instead of the source browser generated by doxygen, the links to
+# source code will now point to the output of htags.
+# The default value is: NO.
+# This tag requires that the tag SOURCE_BROWSER is set to YES.
+
+USE_HTAGS              = NO
+
+# If the VERBATIM_HEADERS tag is set the YES then doxygen will generate a
+# verbatim copy of the header file for each class for which an include is
+# specified. Set to NO to disable this.
+# See also: Section \class.
+# The default value is: YES.
+
+VERBATIM_HEADERS       = YES
+
+#---------------------------------------------------------------------------
+# Configuration options related to the alphabetical class index
+#---------------------------------------------------------------------------
+
+# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index of all
+# compounds will be generated. Enable this if the project contains a lot of
+# classes, structs, unions or interfaces.
+# The default value is: YES.
+
+ALPHABETICAL_INDEX     = YES
+
+# The COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns in
+# which the alphabetical index list will be split.
+# Minimum value: 1, maximum value: 20, default value: 5.
+# This tag requires that the tag ALPHABETICAL_INDEX is set to YES.
+
+COLS_IN_ALPHA_INDEX    = 5
+
+# In case all classes in a project start with a common prefix, all classes will
+# be put under the same header in the alphabetical index. The IGNORE_PREFIX tag
+# can be used to specify a prefix (or a list of prefixes) that should be ignored
+# while generating the index headers.
+# This tag requires that the tag ALPHABETICAL_INDEX is set to YES.
+
+IGNORE_PREFIX          =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the HTML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_HTML tag is set to YES doxygen will generate HTML output
+# The default value is: YES.
+
+GENERATE_HTML          = YES
+
+# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it.
+# The default directory is: html.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_OUTPUT            = html
+
+# The HTML_FILE_EXTENSION tag can be used to specify the file extension for each
+# generated HTML page (for example: .htm, .php, .asp).
+# The default value is: .html.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_FILE_EXTENSION    = .html
+
+# The HTML_HEADER tag can be used to specify a user-defined HTML header file for
+# each generated HTML page. If the tag is left blank doxygen will generate a
+# standard header.
+#
+# To get valid HTML the header file that includes any scripts and style sheets
+# that doxygen needs, which is dependent on the configuration options used (e.g.
+# the setting GENERATE_TREEVIEW). It is highly recommended to start with a
+# default header using
+# doxygen -w html new_header.html new_footer.html new_stylesheet.css
+# YourConfigFile
+# and then modify the file new_header.html. See also section "Doxygen usage"
+# for information on how to generate the default header that doxygen normally
+# uses.
+# Note: The header is subject to change so you typically have to regenerate the
+# default header when upgrading to a newer version of doxygen. For a description
+# of the possible markers and block names see the documentation.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_HEADER            =
+
+# The HTML_FOOTER tag can be used to specify a user-defined HTML footer for each
+# generated HTML page. If the tag is left blank doxygen will generate a standard
+# footer. See HTML_HEADER for more information on how to generate a default
+# footer and what special commands can be used inside the footer. See also
+# section "Doxygen usage" for information on how to generate the default footer
+# that doxygen normally uses.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_FOOTER            = @abs_top_srcdir@/docs/footer.html
+
+# The HTML_STYLESHEET tag can be used to specify a user-defined cascading style
+# sheet that is used by each HTML page. It can be used to fine-tune the look of
+# the HTML output. If left blank doxygen will generate a default style sheet.
+# See also section "Doxygen usage" for information on how to generate the style
+# sheet that doxygen normally uses.
+# Note: It is recommended to use HTML_EXTRA_STYLESHEET instead of this tag, as
+# it is more robust and this tag (HTML_STYLESHEET) will in the future become
+# obsolete.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_STYLESHEET        =
+
+# The HTML_EXTRA_STYLESHEET tag can be used to specify an additional user-
+# defined cascading style sheet that is included after the standard style sheets
+# created by doxygen. Using this option one can overrule certain style aspects.
+# This is preferred over using HTML_STYLESHEET since it does not replace the
+# standard style sheet and is therefor more robust against future updates.
+# Doxygen will copy the style sheet file to the output directory. For an example
+# see the documentation.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_EXTRA_STYLESHEET  =
+
+# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or
+# other source files which should be copied to the HTML output directory. Note
+# that these files will be copied to the base HTML output directory. Use the
+# $relpath^ marker in the HTML_HEADER and/or HTML_FOOTER files to load these
+# files. In the HTML_STYLESHEET file, use the file name only. Also note that the
+# files will be copied as-is; there are no commands or markers available.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_EXTRA_FILES       =
+
+# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen
+# will adjust the colors in the stylesheet and background images according to
+# this color. Hue is specified as an angle on a colorwheel, see
+# http://en.wikipedia.org/wiki/Hue for more information. For instance the value
+# 0 represents red, 60 is yellow, 120 is green, 180 is cyan, 240 is blue, 300
+# purple, and 360 is red again.
+# Minimum value: 0, maximum value: 359, default value: 220.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_COLORSTYLE_HUE    = 220
+
+# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of the colors
+# in the HTML output. For a value of 0 the output will use grayscales only. A
+# value of 255 will produce the most vivid colors.
+# Minimum value: 0, maximum value: 255, default value: 100.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_COLORSTYLE_SAT    = 100
+
+# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to the
+# luminance component of the colors in the HTML output. Values below 100
+# gradually make the output lighter, whereas values above 100 make the output
+# darker. The value divided by 100 is the actual gamma applied, so 80 represents
+# a gamma of 0.8, The value 220 represents a gamma of 2.2, and 100 does not
+# change the gamma.
+# Minimum value: 40, maximum value: 240, default value: 80.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_COLORSTYLE_GAMMA  = 80
+
+# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML
+# page will contain the date and time when the page was generated. Setting this
+# to NO can help when comparing the output of multiple runs.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_TIMESTAMP         = YES
+
+# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML
+# documentation will contain sections that can be hidden and shown after the
+# page has loaded.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_DYNAMIC_SECTIONS  = NO
+
+# With HTML_INDEX_NUM_ENTRIES one can control the preferred number of entries
+# shown in the various tree structured indices initially; the user can expand
+# and collapse entries dynamically later on. Doxygen will expand the tree to
+# such a level that at most the specified number of entries are visible (unless
+# a fully collapsed tree already exceeds this amount). So setting the number of
+# entries 1 will produce a full collapsed tree by default. 0 is a special value
+# representing an infinite number of entries and will result in a full expanded
+# tree by default.
+# Minimum value: 0, maximum value: 9999, default value: 100.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_INDEX_NUM_ENTRIES = 100
+
+# If the GENERATE_DOCSET tag is set to YES, additional index files will be
+# generated that can be used as input for Apple's Xcode 3 integrated development
+# environment (see: http://developer.apple.com/tools/xcode/), introduced with
+# OSX 10.5 (Leopard). To create a documentation set, doxygen will generate a
+# Makefile in the HTML output directory. Running make will produce the docset in
+# that directory and running make install will install the docset in
+# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find it at
+# startup. See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html
+# for more information.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_DOCSET        = NO
+
+# This tag determines the name of the docset feed. A documentation feed provides
+# an umbrella under which multiple documentation sets from a single provider
+# (such as a company or product suite) can be grouped.
+# The default value is: Doxygen generated docs.
+# This tag requires that the tag GENERATE_DOCSET is set to YES.
+
+DOCSET_FEEDNAME        = "Doxygen generated docs"
+
+# This tag specifies a string that should uniquely identify the documentation
+# set bundle. This should be a reverse domain-name style string, e.g.
+# com.mycompany.MyDocSet. Doxygen will append .docset to the name.
+# The default value is: org.doxygen.Project.
+# This tag requires that the tag GENERATE_DOCSET is set to YES.
+
+DOCSET_BUNDLE_ID       = org.doxygen.Project
+
+# The DOCSET_PUBLISHER_ID tag specifies a string that should uniquely identify
+# the documentation publisher. This should be a reverse domain-name style
+# string, e.g. com.mycompany.MyDocSet.documentation.
+# The default value is: org.doxygen.Publisher.
+# This tag requires that the tag GENERATE_DOCSET is set to YES.
+
+DOCSET_PUBLISHER_ID    = org.doxygen.Publisher
+
+# The DOCSET_PUBLISHER_NAME tag identifies the documentation publisher.
+# The default value is: Publisher.
+# This tag requires that the tag GENERATE_DOCSET is set to YES.
+
+DOCSET_PUBLISHER_NAME  = Publisher
+
+# If the GENERATE_HTMLHELP tag is set to YES then doxygen generates three
+# additional HTML index files: index.hhp, index.hhc, and index.hhk. The
+# index.hhp is a project file that can be read by Microsoft's HTML Help Workshop
+# (see: http://www.microsoft.com/en-us/download/details.aspx?id=21138) on
+# Windows.
+#
+# The HTML Help Workshop contains a compiler that can convert all HTML output
+# generated by doxygen into a single compiled HTML file (.chm). Compiled HTML
+# files are now used as the Windows 98 help format, and will replace the old
+# Windows help format (.hlp) on all Windows platforms in the future. Compressed
+# HTML files also contain an index, a table of contents, and you can search for
+# words in the documentation. The HTML workshop also contains a viewer for
+# compressed HTML files.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_HTMLHELP      = NO
+
+# The CHM_FILE tag can be used to specify the file name of the resulting .chm
+# file. You can add a path in front of the file if the result should not be
+# written to the html output directory.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+CHM_FILE               =
+
+# The HHC_LOCATION tag can be used to specify the location (absolute path
+# including file name) of the HTML help compiler ( hhc.exe). If non-empty
+# doxygen will try to run the HTML help compiler on the generated index.hhp.
+# The file has to be specified with full path.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+HHC_LOCATION           =
+
+# The GENERATE_CHI flag controls if a separate .chi index file is generated (
+# YES) or that it should be included in the master .chm file ( NO).
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+GENERATE_CHI           = NO
+
+# The CHM_INDEX_ENCODING is used to encode HtmlHelp index ( hhk), content ( hhc)
+# and project file content.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+CHM_INDEX_ENCODING     =
+
+# The BINARY_TOC flag controls whether a binary table of contents is generated (
+# YES) or a normal table of contents ( NO) in the .chm file. Furthermore it
+# enables the Previous and Next buttons.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+BINARY_TOC             = NO
+
+# The TOC_EXPAND flag can be set to YES to add extra items for group members to
+# the table of contents of the HTML help documentation and to the tree view.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+TOC_EXPAND             = NO
+
+# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and
+# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated that
+# can be used as input for Qt's qhelpgenerator to generate a Qt Compressed Help
+# (.qch) of the generated HTML documentation.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_QHP           = NO
+
+# If the QHG_LOCATION tag is specified, the QCH_FILE tag can be used to specify
+# the file name of the resulting .qch file. The path specified is relative to
+# the HTML output folder.
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QCH_FILE               =
+
+# The QHP_NAMESPACE tag specifies the namespace to use when generating Qt Help
+# Project output. For more information please see Qt Help Project / Namespace
+# (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#namespace).
+# The default value is: org.doxygen.Project.
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_NAMESPACE          = org.doxygen.Project
+
+# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating Qt
+# Help Project output. For more information please see Qt Help Project / Virtual
+# Folders (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#virtual-
+# folders).
+# The default value is: doc.
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_VIRTUAL_FOLDER     = doc
+
+# If the QHP_CUST_FILTER_NAME tag is set, it specifies the name of a custom
+# filter to add. For more information please see Qt Help Project / Custom
+# Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom-
+# filters).
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_CUST_FILTER_NAME   =
+
+# The QHP_CUST_FILTER_ATTRS tag specifies the list of the attributes of the
+# custom filter to add. For more information please see Qt Help Project / Custom
+# Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom-
+# filters).
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_CUST_FILTER_ATTRS  =
+
+# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this
+# project's filter section matches. Qt Help Project / Filter Attributes (see:
+# http://qt-project.org/doc/qt-4.8/qthelpproject.html#filter-attributes).
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_SECT_FILTER_ATTRS  =
+
+# The QHG_LOCATION tag can be used to specify the location of Qt's
+# qhelpgenerator. If non-empty doxygen will try to run qhelpgenerator on the
+# generated .qhp file.
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHG_LOCATION           =
+
+# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files will be
+# generated, together with the HTML files, they form an Eclipse help plugin. To
+# install this plugin and make it available under the help contents menu in
+# Eclipse, the contents of the directory containing the HTML and XML files needs
+# to be copied into the plugins directory of eclipse. The name of the directory
+# within the plugins directory should be the same as the ECLIPSE_DOC_ID value.
+# After copying Eclipse needs to be restarted before the help appears.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_ECLIPSEHELP   = NO
+
+# A unique identifier for the Eclipse help plugin. When installing the plugin
+# the directory name containing the HTML and XML files should also have this
+# name. Each documentation set should have its own identifier.
+# The default value is: org.doxygen.Project.
+# This tag requires that the tag GENERATE_ECLIPSEHELP is set to YES.
+
+ECLIPSE_DOC_ID         = org.doxygen.Project
+
+# If you want full control over the layout of the generated HTML pages it might
+# be necessary to disable the index and replace it with your own. The
+# DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs) at top
+# of each HTML page. A value of NO enables the index and the value YES disables
+# it. Since the tabs in the index contain the same information as the navigation
+# tree, you can set this option to YES if you also set GENERATE_TREEVIEW to YES.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+DISABLE_INDEX          = NO
+
+# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index
+# structure should be generated to display hierarchical information. If the tag
+# value is set to YES, a side panel will be generated containing a tree-like
+# index structure (just like the one that is generated for HTML Help). For this
+# to work a browser that supports JavaScript, DHTML, CSS and frames is required
+# (i.e. any modern browser). Windows users are probably better off using the
+# HTML help feature. Via custom stylesheets (see HTML_EXTRA_STYLESHEET) one can
+# further fine-tune the look of the index. As an example, the default style
+# sheet generated by doxygen has an example that shows how to put an image at
+# the root of the tree instead of the PROJECT_NAME. Since the tree basically has
+# the same information as the tab index, you could consider setting
+# DISABLE_INDEX to YES when enabling this option.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_TREEVIEW      = YES
+
+# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values that
+# doxygen will group on one line in the generated HTML documentation.
+#
+# Note that a value of 0 will completely suppress the enum values from appearing
+# in the overview section.
+# Minimum value: 0, maximum value: 20, default value: 4.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+ENUM_VALUES_PER_LINE   = 4
+
+# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be used
+# to set the initial width (in pixels) of the frame in which the tree is shown.
+# Minimum value: 0, maximum value: 1500, default value: 250.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+TREEVIEW_WIDTH         = 250
+
+# When the EXT_LINKS_IN_WINDOW option is set to YES doxygen will open links to
+# external symbols imported via tag files in a separate window.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+EXT_LINKS_IN_WINDOW    = NO
+
+# Use this tag to change the font size of LaTeX formulas included as images in
+# the HTML documentation. When you change the font size after a successful
+# doxygen run you need to manually remove any form_*.png images from the HTML
+# output directory to force them to be regenerated.
+# Minimum value: 8, maximum value: 50, default value: 10.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+FORMULA_FONTSIZE       = 10
+
+# Use the FORMULA_TRANPARENT tag to determine whether or not the images
+# generated for formulas are transparent PNGs. Transparent PNGs are not
+# supported properly for IE 6.0, but are supported on all modern browsers.
+#
+# Note that when changing this option you need to delete any form_*.png files in
+# the HTML output directory before the changes have effect.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+FORMULA_TRANSPARENT    = YES
+
+# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax (see
+# http://www.mathjax.org) which uses client side Javascript for the rendering
+# instead of using prerendered bitmaps. Use this if you do not have LaTeX
+# installed or if you want to formulas look prettier in the HTML output. When
+# enabled you may also need to install MathJax separately and configure the path
+# to it using the MATHJAX_RELPATH option.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+USE_MATHJAX            = NO
+
+# When MathJax is enabled you can set the default output format to be used for
+# the MathJax output. See the MathJax site (see:
+# http://docs.mathjax.org/en/latest/output.html) for more details.
+# Possible values are: HTML-CSS (which is slower, but has the best
+# compatibility), NativeMML (i.e. MathML) and SVG.
+# The default value is: HTML-CSS.
+# This tag requires that the tag USE_MATHJAX is set to YES.
+
+MATHJAX_FORMAT         = HTML-CSS
+
+# When MathJax is enabled you need to specify the location relative to the HTML
+# output directory using the MATHJAX_RELPATH option. The destination directory
+# should contain the MathJax.js script. For instance, if the mathjax directory
+# is located at the same level as the HTML output directory, then
+# MATHJAX_RELPATH should be ../mathjax. The default value points to the MathJax
+# Content Delivery Network so you can quickly see the result without installing
+# MathJax. However, it is strongly recommended to install a local copy of
+# MathJax from http://www.mathjax.org before deployment.
+# The default value is: http://cdn.mathjax.org/mathjax/latest.
+# This tag requires that the tag USE_MATHJAX is set to YES.
+
+MATHJAX_RELPATH        = http://cdn.mathjax.org/mathjax/latest
+
+# The MATHJAX_EXTENSIONS tag can be used to specify one or more MathJax
+# extension names that should be enabled during MathJax rendering. For example
+# MATHJAX_EXTENSIONS = TeX/AMSmath TeX/AMSsymbols
+# This tag requires that the tag USE_MATHJAX is set to YES.
+
+MATHJAX_EXTENSIONS     =
+
+# The MATHJAX_CODEFILE tag can be used to specify a file with javascript pieces
+# of code that will be used on startup of the MathJax code. See the MathJax site
+# (see: http://docs.mathjax.org/en/latest/output.html) for more details. For an
+# example see the documentation.
+# This tag requires that the tag USE_MATHJAX is set to YES.
+
+MATHJAX_CODEFILE       =
+
+# When the SEARCHENGINE tag is enabled doxygen will generate a search box for
+# the HTML output. The underlying search engine uses javascript and DHTML and
+# should work on any modern browser. Note that when using HTML help
+# (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets (GENERATE_DOCSET)
+# there is already a search function so this one should typically be disabled.
+# For large projects the javascript based search engine can be slow, then
+# enabling SERVER_BASED_SEARCH may provide a better solution. It is possible to
+# search using the keyboard; to jump to the search box use <access key> + S
+# (what the <access key> is depends on the OS and browser, but it is typically
+# <CTRL>, <ALT>/<option>, or both). Inside the search box use the <cursor down
+# key> to jump into the search results window, the results can be navigated
+# using the <cursor keys>. Press <Enter> to select an item or <escape> to cancel
+# the search. The filter options can be selected when the cursor is inside the
+# search box by pressing <Shift>+<cursor down>. Also here use the <cursor keys>
+# to select a filter and <Enter> or <escape> to activate or cancel the filter
+# option.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+SEARCHENGINE           = YES
+
+# When the SERVER_BASED_SEARCH tag is enabled the search engine will be
+# implemented using a web server instead of a web client using Javascript. There
+# are two flavors of web server based searching depending on the EXTERNAL_SEARCH
+# setting. When disabled, doxygen will generate a PHP script for searching and
+# an index file used by the script. When EXTERNAL_SEARCH is enabled the indexing
+# and searching needs to be provided by external tools. See the section
+# "External Indexing and Searching" for details.
+# The default value is: NO.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+SERVER_BASED_SEARCH    = NO
+
+# When EXTERNAL_SEARCH tag is enabled doxygen will no longer generate the PHP
+# script for searching. Instead the search results are written to an XML file
+# which needs to be processed by an external indexer. Doxygen will invoke an
+# external search engine pointed to by the SEARCHENGINE_URL option to obtain the
+# search results.
+#
+# Doxygen ships with an example indexer ( doxyindexer) and search engine
+# (doxysearch.cgi) which are based on the open source search engine library
+# Xapian (see: http://xapian.org/).
+#
+# See the section "External Indexing and Searching" for details.
+# The default value is: NO.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+EXTERNAL_SEARCH        = NO
+
+# The SEARCHENGINE_URL should point to a search engine hosted by a web server
+# which will return the search results when EXTERNAL_SEARCH is enabled.
+#
+# Doxygen ships with an example indexer ( doxyindexer) and search engine
+# (doxysearch.cgi) which are based on the open source search engine library
+# Xapian (see: http://xapian.org/). See the section "External Indexing and
+# Searching" for details.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+SEARCHENGINE_URL       =
+
+# When SERVER_BASED_SEARCH and EXTERNAL_SEARCH are both enabled the unindexed
+# search data is written to a file for indexing by an external tool. With the
+# SEARCHDATA_FILE tag the name of this file can be specified.
+# The default file is: searchdata.xml.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+SEARCHDATA_FILE        = searchdata.xml
+
+# When SERVER_BASED_SEARCH and EXTERNAL_SEARCH are both enabled the
+# EXTERNAL_SEARCH_ID tag can be used as an identifier for the project. This is
+# useful in combination with EXTRA_SEARCH_MAPPINGS to search through multiple
+# projects and redirect the results back to the right project.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+EXTERNAL_SEARCH_ID     =
+
+# The EXTRA_SEARCH_MAPPINGS tag can be used to enable searching through doxygen
+# projects other than the one defined by this configuration file, but that are
+# all added to the same external search index. Each project needs to have a
+# unique id set via EXTERNAL_SEARCH_ID. The search mapping then maps the id of
+# to a relative location where the documentation can be found. The format is:
+# EXTRA_SEARCH_MAPPINGS = tagname1=loc1 tagname2=loc2 ...
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+EXTRA_SEARCH_MAPPINGS  =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the LaTeX output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_LATEX tag is set to YES doxygen will generate LaTeX output.
+# The default value is: YES.
+
+GENERATE_LATEX         = YES
+
+# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it.
+# The default directory is: latex.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_OUTPUT           = latex
+
+# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be
+# invoked.
+#
+# Note that when enabling USE_PDFLATEX this option is only used for generating
+# bitmaps for formulas in the HTML output, but not in the Makefile that is
+# written to the output directory.
+# The default file is: latex.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_CMD_NAME         = latex
+
+# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to generate
+# index for LaTeX.
+# The default file is: makeindex.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+MAKEINDEX_CMD_NAME     = makeindex
+
+# If the COMPACT_LATEX tag is set to YES doxygen generates more compact LaTeX
+# documents. This may be useful for small projects and may help to save some
+# trees in general.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+COMPACT_LATEX          = NO
+
+# The PAPER_TYPE tag can be used to set the paper type that is used by the
+# printer.
+# Possible values are: a4 (210 x 297 mm), letter (8.5 x 11 inches), legal (8.5 x
+# 14 inches) and executive (7.25 x 10.5 inches).
+# The default value is: a4.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+PAPER_TYPE             = letter
+
+# The EXTRA_PACKAGES tag can be used to specify one or more LaTeX package names
+# that should be included in the LaTeX output. To get the times font for
+# instance you can specify
+# EXTRA_PACKAGES=times
+# If left blank no extra packages will be included.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+EXTRA_PACKAGES         =
+
+# The LATEX_HEADER tag can be used to specify a personal LaTeX header for the
+# generated LaTeX document. The header should contain everything until the first
+# chapter. If it is left blank doxygen will generate a standard header. See
+# section "Doxygen usage" for information on how to let doxygen write the
+# default header to a separate file.
+#
+# Note: Only use a user-defined header if you know what you are doing! The
+# following commands have a special meaning inside the header: $title,
+# $datetime, $date, $doxygenversion, $projectname, $projectnumber,
+# $projectbrief, $projectlogo. Doxygen will replace $title with the empy string,
+# for the replacement values of the other commands the user is refered to
+# HTML_HEADER.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_HEADER           =
+
+# The LATEX_FOOTER tag can be used to specify a personal LaTeX footer for the
+# generated LaTeX document. The footer should contain everything after the last
+# chapter. If it is left blank doxygen will generate a standard footer. See
+# LATEX_HEADER for more information on how to generate a default footer and what
+# special commands can be used inside the footer.
+#
+# Note: Only use a user-defined footer if you know what you are doing!
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_FOOTER           =
+
+# The LATEX_EXTRA_FILES tag can be used to specify one or more extra images or
+# other source files which should be copied to the LATEX_OUTPUT output
+# directory. Note that the files will be copied as-is; there are no commands or
+# markers available.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_EXTRA_FILES      =
+
+# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated is
+# prepared for conversion to PDF (using ps2pdf or pdflatex). The PDF file will
+# contain links (just like the HTML output) instead of page references. This
+# makes the output suitable for online browsing using a PDF viewer.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+PDF_HYPERLINKS         = YES
+
+# If the LATEX_PDFLATEX tag is set to YES, doxygen will use pdflatex to generate
+# the PDF file directly from the LaTeX files. Set this option to YES to get a
+# higher quality PDF documentation.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+USE_PDFLATEX           = YES
+
+# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \batchmode
+# command to the generated LaTeX files. This will instruct LaTeX to keep running
+# if errors occur, instead of asking the user for help. This option is also used
+# when generating formulas in HTML.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_BATCHMODE        = NO
+
+# If the LATEX_HIDE_INDICES tag is set to YES then doxygen will not include the
+# index chapters (such as File Index, Compound Index, etc.) in the output.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_HIDE_INDICES     = NO
+
+# If the LATEX_SOURCE_CODE tag is set to YES then doxygen will include source
+# code with syntax highlighting in the LaTeX output.
+#
+# Note that which sources are shown also depends on other settings such as
+# SOURCE_BROWSER.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_SOURCE_CODE      = NO
+
+# The LATEX_BIB_STYLE tag can be used to specify the style to use for the
+# bibliography, e.g. plainnat, or ieeetr. See
+# http://en.wikipedia.org/wiki/BibTeX and \cite for more info.
+# The default value is: plain.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_BIB_STYLE        = plain
+
+#---------------------------------------------------------------------------
+# Configuration options related to the RTF output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_RTF tag is set to YES doxygen will generate RTF output. The
+# RTF output is optimized for Word 97 and may not look too pretty with other RTF
+# readers/editors.
+# The default value is: NO.
+
+GENERATE_RTF           = NO
+
+# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it.
+# The default directory is: rtf.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+RTF_OUTPUT             = rtf
+
+# If the COMPACT_RTF tag is set to YES doxygen generates more compact RTF
+# documents. This may be useful for small projects and may help to save some
+# trees in general.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+COMPACT_RTF            = NO
+
+# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated will
+# contain hyperlink fields. The RTF file will contain links (just like the HTML
+# output) instead of page references. This makes the output suitable for online
+# browsing using Word or some other Word compatible readers that support those
+# fields.
+#
+# Note: WordPad (write) and others do not support links.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+RTF_HYPERLINKS         = NO
+
+# Load stylesheet definitions from file. Syntax is similar to doxygen's config
+# file, i.e. a series of assignments. You only have to provide replacements,
+# missing definitions are set to their default value.
+#
+# See also section "Doxygen usage" for information on how to generate the
+# default style sheet that doxygen normally uses.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+RTF_STYLESHEET_FILE    =
+
+# Set optional variables used in the generation of an RTF document. Syntax is
+# similar to doxygen's config file. A template extensions file can be generated
+# using doxygen -e rtf extensionFile.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+RTF_EXTENSIONS_FILE    =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the man page output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_MAN tag is set to YES doxygen will generate man pages for
+# classes and files.
+# The default value is: NO.
+
+GENERATE_MAN           = YES
+
+# The MAN_OUTPUT tag is used to specify where the man pages will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it. A directory man3 will be created inside the directory specified by
+# MAN_OUTPUT.
+# The default directory is: man.
+# This tag requires that the tag GENERATE_MAN is set to YES.
+
+MAN_OUTPUT             = man
+
+# The MAN_EXTENSION tag determines the extension that is added to the generated
+# man pages. In case the manual section does not start with a number, the number
+# 3 is prepended. The dot (.) at the beginning of the MAN_EXTENSION tag is
+# optional.
+# The default value is: .3.
+# This tag requires that the tag GENERATE_MAN is set to YES.
+
+MAN_EXTENSION          = .3
+
+# The MAN_SUBDIR tag determines the name of the directory created within
+# MAN_OUTPUT in which the man pages are placed. If defaults to man followed by
+# MAN_EXTENSION with the initial . removed.
+# This tag requires that the tag GENERATE_MAN is set to YES.
+
+MAN_SUBDIR             =
+
+# If the MAN_LINKS tag is set to YES and doxygen generates man output, then it
+# will generate one additional man file for each entity documented in the real
+# man page(s). These additional files only source the real man page, but without
+# them the man command would be unable to find the correct page.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_MAN is set to YES.
+
+MAN_LINKS              = YES
+
+#---------------------------------------------------------------------------
+# Configuration options related to the XML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_XML tag is set to YES doxygen will generate an XML file that
+# captures the structure of the code including all documentation.
+# The default value is: NO.
+
+GENERATE_XML           = NO
+
+# The XML_OUTPUT tag is used to specify where the XML pages will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it.
+# The default directory is: xml.
+# This tag requires that the tag GENERATE_XML is set to YES.
+
+XML_OUTPUT             = xml
+
+# If the XML_PROGRAMLISTING tag is set to YES doxygen will dump the program
+# listings (including syntax highlighting and cross-referencing information) to
+# the XML output. Note that enabling this will significantly increase the size
+# of the XML output.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_XML is set to YES.
+
+XML_PROGRAMLISTING     = YES
+
+#---------------------------------------------------------------------------
+# Configuration options related to the DOCBOOK output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_DOCBOOK tag is set to YES doxygen will generate Docbook files
+# that can be used to generate PDF.
+# The default value is: NO.
+
+GENERATE_DOCBOOK       = NO
+
+# The DOCBOOK_OUTPUT tag is used to specify where the Docbook pages will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be put in
+# front of it.
+# The default directory is: docbook.
+# This tag requires that the tag GENERATE_DOCBOOK is set to YES.
+
+DOCBOOK_OUTPUT         = docbook
+
+#---------------------------------------------------------------------------
+# Configuration options for the AutoGen Definitions output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_AUTOGEN_DEF tag is set to YES doxygen will generate an AutoGen
+# Definitions (see http://autogen.sf.net) file that captures the structure of
+# the code including all documentation. Note that this feature is still
+# experimental and incomplete at the moment.
+# The default value is: NO.
+
+GENERATE_AUTOGEN_DEF   = NO
+
+#---------------------------------------------------------------------------
+# Configuration options related to the Perl module output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_PERLMOD tag is set to YES doxygen will generate a Perl module
+# file that captures the structure of the code including all documentation.
+#
+# Note that this feature is still experimental and incomplete at the moment.
+# The default value is: NO.
+
+GENERATE_PERLMOD       = NO
+
+# If the PERLMOD_LATEX tag is set to YES doxygen will generate the necessary
+# Makefile rules, Perl scripts and LaTeX code to be able to generate PDF and DVI
+# output from the Perl module output.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_PERLMOD is set to YES.
+
+PERLMOD_LATEX          = NO
+
+# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be nicely
+# formatted so it can be parsed by a human reader. This is useful if you want to
+# understand what is going on. On the other hand, if this tag is set to NO the
+# size of the Perl module output will be much smaller and Perl will parse it
+# just the same.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_PERLMOD is set to YES.
+
+PERLMOD_PRETTY         = YES
+
+# The names of the make variables in the generated doxyrules.make file are
+# prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. This is useful
+# so different doxyrules.make files included by the same Makefile don't
+# overwrite each other's variables.
+# This tag requires that the tag GENERATE_PERLMOD is set to YES.
+
+PERLMOD_MAKEVAR_PREFIX =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the preprocessor
+#---------------------------------------------------------------------------
+
+# If the ENABLE_PREPROCESSING tag is set to YES doxygen will evaluate all
+# C-preprocessor directives found in the sources and include files.
+# The default value is: YES.
+
+ENABLE_PREPROCESSING   = YES
+
+# If the MACRO_EXPANSION tag is set to YES doxygen will expand all macro names
+# in the source code. If set to NO only conditional compilation will be
+# performed. Macro expansion can be done in a controlled way by setting
+# EXPAND_ONLY_PREDEF to YES.
+# The default value is: NO.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+MACRO_EXPANSION        = NO
+
+# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES then
+# the macro expansion is limited to the macros specified with the PREDEFINED and
+# EXPAND_AS_DEFINED tags.
+# The default value is: NO.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+EXPAND_ONLY_PREDEF     = NO
+
+# If the SEARCH_INCLUDES tag is set to YES the includes files in the
+# INCLUDE_PATH will be searched if a #include is found.
+# The default value is: YES.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+SEARCH_INCLUDES        = YES
+
+# The INCLUDE_PATH tag can be used to specify one or more directories that
+# contain include files that are not input files but should be processed by the
+# preprocessor.
+# This tag requires that the tag SEARCH_INCLUDES is set to YES.
+
+INCLUDE_PATH           =
+
+# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard
+# patterns (like *.h and *.hpp) to filter out the header-files in the
+# directories. If left blank, the patterns specified with FILE_PATTERNS will be
+# used.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+INCLUDE_FILE_PATTERNS  =
+
+# The PREDEFINED tag can be used to specify one or more macro names that are
+# defined before the preprocessor is started (similar to the -D option of e.g.
+# gcc). The argument of the tag is a list of macros of the form: name or
+# name=definition (no spaces). If the definition and the "=" are omitted, "=1"
+# is assumed. To prevent a macro definition from being undefined via #undef or
+# recursively expanded use the := operator instead of the = operator.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+PREDEFINED             =
+
+# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then this
+# tag can be used to specify a list of macro names that should be expanded. The
+# macro definition that is found in the sources will be used. Use the PREDEFINED
+# tag if you want to use a different macro definition that overrules the
+# definition found in the source code.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+EXPAND_AS_DEFINED      =
+
+# If the SKIP_FUNCTION_MACROS tag is set to YES then doxygen's preprocessor will
+# remove all references to function-like macros that are alone on a line, have
+# an all uppercase name, and do not end with a semicolon. Such function macros
+# are typically used for boiler-plate code, and will confuse the parser if not
+# removed.
+# The default value is: YES.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+SKIP_FUNCTION_MACROS   = YES
+
+#---------------------------------------------------------------------------
+# Configuration options related to external references
+#---------------------------------------------------------------------------
+
+# The TAGFILES tag can be used to specify one or more tag files. For each tag
+# file the location of the external documentation should be added. The format of
+# a tag file without this location is as follows:
+# TAGFILES = file1 file2 ...
+# Adding location for the tag files is done as follows:
+# TAGFILES = file1=loc1 "file2 = loc2" ...
+# where loc1 and loc2 can be relative or absolute paths or URLs. See the
+# section "Linking to external documentation" for more information about the use
+# of tag files.
+# Note: Each tag file must have a unique name (where the name does NOT include
+# the path). If a tag file is not located in the directory in which doxygen is
+# run, you must also specify the path to the tagfile here.
+
+TAGFILES               =
+
+# When a file name is specified after GENERATE_TAGFILE, doxygen will create a
+# tag file that is based on the input files it reads. See section "Linking to
+# external documentation" for more information about the usage of tag files.
+
+GENERATE_TAGFILE       =
+
+# If the ALLEXTERNALS tag is set to YES all external class will be listed in the
+# class index. If set to NO only the inherited external classes will be listed.
+# The default value is: NO.
+
+ALLEXTERNALS           = NO
+
+# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed in
+# the modules index. If set to NO, only the current project's groups will be
+# listed.
+# The default value is: YES.
+
+EXTERNAL_GROUPS        = YES
+
+# If the EXTERNAL_PAGES tag is set to YES all external pages will be listed in
+# the related pages index. If set to NO, only the current project's pages will
+# be listed.
+# The default value is: YES.
+
+EXTERNAL_PAGES         = YES
+
+# The PERL_PATH should be the absolute path and name of the perl script
+# interpreter (i.e. the result of 'which perl').
+# The default file (with absolute path) is: /usr/bin/perl.
+
+PERL_PATH              = /usr/bin/perl
+
+#---------------------------------------------------------------------------
+# Configuration options related to the dot tool
+#---------------------------------------------------------------------------
+
+# If the CLASS_DIAGRAMS tag is set to YES doxygen will generate a class diagram
+# (in HTML and LaTeX) for classes with base or super classes. Setting the tag to
+# NO turns the diagrams off. Note that this option also works with HAVE_DOT
+# disabled, but it is recommended to install and use dot, since it yields more
+# powerful graphs.
+# The default value is: YES.
+
+CLASS_DIAGRAMS         = YES
+
+# You can define message sequence charts within doxygen comments using the \msc
+# command. Doxygen will then run the mscgen tool (see:
+# http://www.mcternan.me.uk/mscgen/)) to produce the chart and insert it in the
+# documentation. The MSCGEN_PATH tag allows you to specify the directory where
+# the mscgen tool resides. If left empty the tool is assumed to be found in the
+# default search path.
+
+MSCGEN_PATH            =
+
+# You can include diagrams made with dia in doxygen documentation. Doxygen will
+# then run dia to produce the diagram and insert it in the documentation. The
+# DIA_PATH tag allows you to specify the directory where the dia binary resides.
+# If left empty dia is assumed to be found in the default search path.
+
+DIA_PATH               =
+
+# If set to YES, the inheritance and collaboration graphs will hide inheritance
+# and usage relations if the target is undocumented or is not a class.
+# The default value is: YES.
+
+HIDE_UNDOC_RELATIONS   = NO
+
+# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is
+# available from the path. This tool is part of Graphviz (see:
+# http://www.graphviz.org/), a graph visualization toolkit from AT&T and Lucent
+# Bell Labs. The other options in this section have no effect if this option is
+# set to NO
+# The default value is: NO.
+
+HAVE_DOT               = @HAVE_DOT@
+
+# The DOT_NUM_THREADS specifies the number of dot invocations doxygen is allowed
+# to run in parallel. When set to 0 doxygen will base this on the number of
+# processors available in the system. You can set it explicitly to a value
+# larger than 0 to get control over the balance between CPU load and processing
+# speed.
+# Minimum value: 0, maximum value: 32, default value: 0.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_NUM_THREADS        = 0
+
+# When you want a differently looking font n the dot files that doxygen
+# generates you can specify the font name using DOT_FONTNAME. You need to make
+# sure dot is able to find the font, which can be done by putting it in a
+# standard location or by setting the DOTFONTPATH environment variable or by
+# setting DOT_FONTPATH to the directory containing the font.
+# The default value is: Helvetica.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_FONTNAME           = Helvetica
+
+# The DOT_FONTSIZE tag can be used to set the size (in points) of the font of
+# dot graphs.
+# Minimum value: 4, maximum value: 24, default value: 10.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_FONTSIZE           = 10
+
+# By default doxygen will tell dot to use the default font as specified with
+# DOT_FONTNAME. If you specify a different font using DOT_FONTNAME you can set
+# the path where dot can find it using this tag.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_FONTPATH           =
+
+# If the CLASS_GRAPH tag is set to YES then doxygen will generate a graph for
+# each documented class showing the direct and indirect inheritance relations.
+# Setting this tag to YES will force the CLASS_DIAGRAMS tag to NO.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+CLASS_GRAPH            = YES
+
+# If the COLLABORATION_GRAPH tag is set to YES then doxygen will generate a
+# graph for each documented class showing the direct and indirect implementation
+# dependencies (inheritance, containment, and class references variables) of the
+# class with other documented classes.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+COLLABORATION_GRAPH    = YES
+
+# If the GROUP_GRAPHS tag is set to YES then doxygen will generate a graph for
+# groups, showing the direct groups dependencies.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+GROUP_GRAPHS           = YES
+
+# If the UML_LOOK tag is set to YES doxygen will generate inheritance and
+# collaboration diagrams in a style similar to the OMG's Unified Modeling
+# Language.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+UML_LOOK               = NO
+
+# If the UML_LOOK tag is enabled, the fields and methods are shown inside the
+# class node. If there are many fields or methods and many nodes the graph may
+# become too big to be useful. The UML_LIMIT_NUM_FIELDS threshold limits the
+# number of items for each type to make the size more manageable. Set this to 0
+# for no limit. Note that the threshold may be exceeded by 50% before the limit
+# is enforced. So when you set the threshold to 10, up to 15 fields may appear,
+# but if the number exceeds 15, the total amount of fields shown is limited to
+# 10.
+# Minimum value: 0, maximum value: 100, default value: 10.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+UML_LIMIT_NUM_FIELDS   = 10
+
+# If the TEMPLATE_RELATIONS tag is set to YES then the inheritance and
+# collaboration graphs will show the relations between templates and their
+# instances.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+TEMPLATE_RELATIONS     = NO
+
+# If the INCLUDE_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are set to
+# YES then doxygen will generate a graph for each documented file showing the
+# direct and indirect include dependencies of the file with other documented
+# files.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+INCLUDE_GRAPH          = YES
+
+# If the INCLUDED_BY_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are
+# set to YES then doxygen will generate a graph for each documented file showing
+# the direct and indirect include dependencies of the file with other documented
+# files.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+INCLUDED_BY_GRAPH      = YES
+
+# If the CALL_GRAPH tag is set to YES then doxygen will generate a call
+# dependency graph for every global function or class method.
+#
+# Note that enabling this option will significantly increase the time of a run.
+# So in most cases it will be better to enable call graphs for selected
+# functions only using the \callgraph command.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+CALL_GRAPH             = YES
+
+# If the CALLER_GRAPH tag is set to YES then doxygen will generate a caller
+# dependency graph for every global function or class method.
+#
+# Note that enabling this option will significantly increase the time of a run.
+# So in most cases it will be better to enable caller graphs for selected
+# functions only using the \callergraph command.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+CALLER_GRAPH           = NO
+
+# If the GRAPHICAL_HIERARCHY tag is set to YES then doxygen will graphical
+# hierarchy of all classes instead of a textual one.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+GRAPHICAL_HIERARCHY    = YES
+
+# If the DIRECTORY_GRAPH tag is set to YES then doxygen will show the
+# dependencies a directory has on other directories in a graphical way. The
+# dependency relations are determined by the #include relations between the
+# files in the directories.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DIRECTORY_GRAPH        = YES
+
+# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images
+# generated by dot.
+# Note: If you choose svg you need to set HTML_FILE_EXTENSION to xhtml in order
+# to make the SVG files visible in IE 9+ (other browsers do not have this
+# requirement).
+# Possible values are: png, jpg, gif and svg.
+# The default value is: png.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_IMAGE_FORMAT       = png
+
+# If DOT_IMAGE_FORMAT is set to svg, then this option can be set to YES to
+# enable generation of interactive SVG images that allow zooming and panning.
+#
+# Note that this requires a modern browser other than Internet Explorer. Tested
+# and working are Firefox, Chrome, Safari, and Opera.
+# Note: For IE 9+ you need to set HTML_FILE_EXTENSION to xhtml in order to make
+# the SVG files visible. Older versions of IE do not have SVG support.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+INTERACTIVE_SVG        = NO
+
+# The DOT_PATH tag can be used to specify the path where the dot tool can be
+# found. If left blank, it is assumed the dot tool can be found in the path.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_PATH               =
+
+# The DOTFILE_DIRS tag can be used to specify one or more directories that
+# contain dot files that are included in the documentation (see the \dotfile
+# command).
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOTFILE_DIRS           =
+
+# The MSCFILE_DIRS tag can be used to specify one or more directories that
+# contain msc files that are included in the documentation (see the \mscfile
+# command).
+
+MSCFILE_DIRS           =
+
+# The DIAFILE_DIRS tag can be used to specify one or more directories that
+# contain dia files that are included in the documentation (see the \diafile
+# command).
+
+DIAFILE_DIRS           =
+
+# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of nodes
+# that will be shown in the graph. If the number of nodes in a graph becomes
+# larger than this value, doxygen will truncate the graph, which is visualized
+# by representing a node as a red box. Note that doxygen if the number of direct
+# children of the root node in a graph is already larger than
+# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note that
+# the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH.
+# Minimum value: 0, maximum value: 10000, default value: 50.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_GRAPH_MAX_NODES    = 50
+
+# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the graphs
+# generated by dot. A depth value of 3 means that only nodes reachable from the
+# root by following a path via at most 3 edges will be shown. Nodes that lay
+# further from the root node will be omitted. Note that setting this option to 1
+# or 2 may greatly reduce the computation time needed for large code bases. Also
+# note that the size of a graph can be further restricted by
+# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction.
+# Minimum value: 0, maximum value: 1000, default value: 0.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+MAX_DOT_GRAPH_DEPTH    = 0
+
+# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent
+# background. This is disabled by default, because dot on Windows does not seem
+# to support this out of the box.
+#
+# Warning: Depending on the platform used, enabling this option may lead to
+# badly anti-aliased labels on the edges of a graph (i.e. they become hard to
+# read).
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_TRANSPARENT        = NO
+
+# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output
+# files in one run (i.e. multiple -o and -T options on the command line). This
+# makes dot run faster, but since only newer versions of dot (>1.8.10) support
+# this, this feature is disabled by default.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_MULTI_TARGETS      = NO
+
+# If the GENERATE_LEGEND tag is set to YES doxygen will generate a legend page
+# explaining the meaning of the various boxes and arrows in the dot generated
+# graphs.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+GENERATE_LEGEND        = YES
+
+# If the DOT_CLEANUP tag is set to YES doxygen will remove the intermediate dot
+# files that are used to generate the various graphs.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_CLEANUP            = YES
diff --git a/docs/Makefile.am b/docs/Makefile.am
new file mode 100644
index 0000000..a0f5a2d
--- /dev/null
+++ b/docs/Makefile.am
@@ -0,0 +1,95 @@
+## This is a automake file, part of Unidata's netCDF package.
+# Copyright 2005-2006, see the COPYRIGHT file for more information.
+# This file builds the netcdf documentation.
+
+# The "all" target does nothing in this directory. The "dist" target
+# *does* build the documentation, because the distribution contains
+# all of the built documentation.
+
+# The "install" target installs the documentation in a directory
+# called $(prefix)/doc/$(PACKAGE)-$(VERSION).
+
+man_MANS = netcdf_fortran.3
+
+# These are the source files for all the netcdf manuals.
+# info_TEXINFOS = netcdf-f90.texi netcdf-f77.texi
+
+# Get lists of the coresponding ps, info, and pdf files.
+#html_docs = ${info_TEXINFOS:.texi=.html}
+#html_dirs = ${info_TEXINFOS:.texi=}
+#ps_docs = ${info_TEXINFOS:.texi=.ps}
+#dvi_docs = ${info_TEXINFOS:.texi=.dvi}
+#pdf_docs = ${info_TEXINFOS:.texi=.pdf}
+#info_docs= ${info_TEXINFOS:.texi=.info}
+#txt_docs= ${info_TEXINFOS:.texi=.txt}
+
+# These are html versions of the man pages.
+#html_mans = netcdf_fortran-man.html
+
+# These files will be included with the dist.
+EXTRA_DIST = netcdf.m4 $(man_MANS) \
+CMakeLists.txt netcdf-50x50.png Doxyfile.in
+
+# All the documents depend on defines.texi for some common
+# definitions.
+# netcdf_fortran_TEXINFOS = defines.texi
+
+# Get texi2dvi to shut the hell up, and work better for parallel
+# builds. The --tidy option may be useful getting parallel builds to
+# work someday.
+# TEXI2DVI = texi2dvi -s
+
+# Turn off parallel builds in this directory.
+# .NOTPARALLEL:
+
+# To build documentation you must have M4 in their path.
+M4=m4
+
+# Rule to generate the text copies of the documentation.
+#.texi.txt:
+#	makeinfo -o $*.txt --no-headers $(srcdir)/$<
+
+# Generate the HTML version of the netcdf-3 F03 man page.
+#netcdf_fortran-man.html: $(top_srcdir)/docs/netcdf_fortran.3
+#	groff -man -Thtml $? > $@
+
+#netcdf-fortran.html:
+#	$(MAKEINFO) --html $(AM_MAKEINFOHTMLFLAGS) $(MAKEINFOFLAGS) -I$(srcdir) netcdf-fortran.texi
+#	$(MAKEINFO) --no-split --html $(AM_MAKEINFOHTMLFLAGS) $(MAKEINFOFLAGS) -I$(srcdir) netcdf-fortran.texi
+
+# This builds the docs from source, if necessary, and tars up
+# everything needed for the website. Run this and copy the resulting
+# tarball to the /contents/netcdf/docs directory to update the on-line
+# docs.
+
+#web-tarball: $(pdf_docs) $(html_mans) $(txt_docs) $(dvi_docs) $(ps_docs) $(info_docs) $(html_docs)
+#	tar cf netcdf_info.tar *.info*
+#	gzip -f netcdf_info.tar
+#	zip netcdf_info *.info
+#	tar cf netcdf_pdf.tar *.pdf
+#	gzip -f netcdf_pdf.tar
+#	zip netcdf_pdf *.pdf
+#	tar cf netcdf_html.tar *.html $(html_dirs)
+#	gzip -f netcdf_html.tar
+#	zip netcdf_html *.html $(html_dirs)
+#	tar cf netcdf_txt.tar *.txt
+#	gzip -f netcdf_txt.tar
+#	zip netcdf_txt *.txt
+#	tar cf netcdf_man.tar netcdf_fortran.3
+#	gzip -f netcdf_man.tar
+#	zip netcdf_man netcdf_fortran.3
+#	tar cf netcdf_docs.tar $(html_dirs) *.pdf *.txt *.html *.tar.gz *.zip
+#	gzip -f netcdf_docs.tar
+
+# Clean up all the junk we created!
+MAINTAINERCLEANFILES = netcdf_fortran-man.html stamp-* version*
+
+ARGS_MANPAGE = -DAPI=FORTRAN -DNETCDF4=TRUE
+if BUILD_DAP
+ARGS_MANPAGE += -DDAP=TRUE
+endif
+if BUILD_PARALLEL
+ARGS_MANPAGE += -DPARALLEL_IO=TRUE
+endif
+manpages: $(top_srcdir)/docs/netcdf.m4
+	m4 $(M4FLAGS) $(ARGS_MANPAGE) $? >netcdf_fortran.3 || rm netcdf_fortran.3
diff --git a/docs/Makefile.in b/docs/Makefile.in
new file mode 100644
index 0000000..6b4bb4b
--- /dev/null
+++ b/docs/Makefile.in
@@ -0,0 +1,624 @@
+# Makefile.in generated by automake 1.14.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2013 Free Software Foundation, Inc.
+
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+ at SET_MAKE@
+
+# Copyright 2005-2006, see the COPYRIGHT file for more information.
+# This file builds the netcdf documentation.
+
+# The "all" target does nothing in this directory. The "dist" target
+# *does* build the documentation, because the distribution contains
+# all of the built documentation.
+
+# The "install" target installs the documentation in a directory
+# called $(prefix)/doc/$(PACKAGE)-$(VERSION).
+VPATH = @srcdir@
+am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
+am__make_running_with_option = \
+  case $${target_option-} in \
+      ?) ;; \
+      *) echo "am__make_running_with_option: internal error: invalid" \
+              "target option '$${target_option-}' specified" >&2; \
+         exit 1;; \
+  esac; \
+  has_opt=no; \
+  sane_makeflags=$$MAKEFLAGS; \
+  if $(am__is_gnu_make); then \
+    sane_makeflags=$$MFLAGS; \
+  else \
+    case $$MAKEFLAGS in \
+      *\\[\ \	]*) \
+        bs=\\; \
+        sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+          | sed "s/$$bs$$bs[$$bs $$bs	]*//g"`;; \
+    esac; \
+  fi; \
+  skip_next=no; \
+  strip_trailopt () \
+  { \
+    flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+  }; \
+  for flg in $$sane_makeflags; do \
+    test $$skip_next = yes && { skip_next=no; continue; }; \
+    case $$flg in \
+      *=*|--*) continue;; \
+        -*I) strip_trailopt 'I'; skip_next=yes;; \
+      -*I?*) strip_trailopt 'I';; \
+        -*O) strip_trailopt 'O'; skip_next=yes;; \
+      -*O?*) strip_trailopt 'O';; \
+        -*l) strip_trailopt 'l'; skip_next=yes;; \
+      -*l?*) strip_trailopt 'l';; \
+      -[dEDm]) skip_next=yes;; \
+      -[JT]) skip_next=yes;; \
+    esac; \
+    case $$flg in \
+      *$$target_option*) has_opt=yes; break;; \
+    esac; \
+  done; \
+  test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+target_triplet = @target@
+ at BUILD_DAP_TRUE@am__append_1 = -DDAP=TRUE
+ at BUILD_PARALLEL_TRUE@am__append_2 = -DPARALLEL_IO=TRUE
+subdir = docs
+DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \
+	$(srcdir)/Doxyfile.in texinfo.tex
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \
+	$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+	$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+	$(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/config.h \
+	$(top_builddir)/libsrc/nfconfig1.inc
+CONFIG_CLEAN_FILES = Doxyfile
+CONFIG_CLEAN_VPATH_FILES =
+AM_V_P = $(am__v_P_ at AM_V@)
+am__v_P_ = $(am__v_P_ at AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_ at AM_V@)
+am__v_GEN_ = $(am__v_GEN_ at AM_DEFAULT_V@)
+am__v_GEN_0 = @echo "  GEN     " $@;
+am__v_GEN_1 = 
+AM_V_at = $(am__v_at_ at AM_V@)
+am__v_at_ = $(am__v_at_ at AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 = 
+SOURCES =
+DIST_SOURCES =
+am__can_run_installinfo = \
+  case $$AM_UPDATE_INFO_DIR in \
+    n|no|NO) false;; \
+    *) (install-info --version) >/dev/null 2>&1;; \
+  esac
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+  for p in $$list; do echo "$$p $$p"; done | \
+  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+    if (++n[$$2] == $(am__install_max)) \
+      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+    END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__uninstall_files_from_dir = { \
+  test -z "$$files" \
+    || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+    || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+         $(am__cd) "$$dir" && rm -f $$files; }; \
+  }
+man3dir = $(mandir)/man3
+am__installdirs = "$(DESTDIR)$(man3dir)"
+NROFF = nroff
+MANS = $(man_MANS)
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+ALLOCA = @ALLOCA@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BUILD_INTERNAL_DOCS = @BUILD_INTERNAL_DOCS@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+DOT = @DOT@
+DOXYGEN = @DOXYGEN@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+F77 = @F77@
+FC = @FC@
+FCFLAGS = @FCFLAGS@
+FCFLAGS_f90 = @FCFLAGS_f90@
+FFLAGS = @FFLAGS@
+FGREP = @FGREP@
+GREP = @GREP@
+HAS_DAP = @HAS_DAP@
+HAS_F03 = @HAS_F03@
+HAS_F90 = @HAS_F90@
+HAS_NC2 = @HAS_NC2@
+HAS_NC4 = @HAS_NC4@
+HAVE_DOT = @HAVE_DOT@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MKDIR_P = @MKDIR_P@
+MOD_FLAG = @MOD_FLAG@
+NC_FLIBS = @NC_FLIBS@
+NC_LIBS = @NC_LIBS@
+NM = @NM@
+NMEDIT = @NMEDIT@
+NMFLAGS = @NMFLAGS@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+VERSION = @VERSION@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+ac_ct_F77 = @ac_ct_F77@
+ac_ct_FC = @ac_ct_FC@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target = @target@
+target_alias = @target_alias@
+target_cpu = @target_cpu@
+target_os = @target_os@
+target_vendor = @target_vendor@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+man_MANS = netcdf_fortran.3
+
+# These are the source files for all the netcdf manuals.
+# info_TEXINFOS = netcdf-f90.texi netcdf-f77.texi
+
+# Get lists of the coresponding ps, info, and pdf files.
+#html_docs = ${info_TEXINFOS:.texi=.html}
+#html_dirs = ${info_TEXINFOS:.texi=}
+#ps_docs = ${info_TEXINFOS:.texi=.ps}
+#dvi_docs = ${info_TEXINFOS:.texi=.dvi}
+#pdf_docs = ${info_TEXINFOS:.texi=.pdf}
+#info_docs= ${info_TEXINFOS:.texi=.info}
+#txt_docs= ${info_TEXINFOS:.texi=.txt}
+
+# These are html versions of the man pages.
+#html_mans = netcdf_fortran-man.html
+
+# These files will be included with the dist.
+EXTRA_DIST = netcdf.m4 $(man_MANS) \
+CMakeLists.txt netcdf-50x50.png Doxyfile.in
+
+
+# All the documents depend on defines.texi for some common
+# definitions.
+# netcdf_fortran_TEXINFOS = defines.texi
+
+# Get texi2dvi to shut the hell up, and work better for parallel
+# builds. The --tidy option may be useful getting parallel builds to
+# work someday.
+# TEXI2DVI = texi2dvi -s
+
+# Turn off parallel builds in this directory.
+# .NOTPARALLEL:
+
+# To build documentation you must have M4 in their path.
+M4 = m4
+
+# Rule to generate the text copies of the documentation.
+#.texi.txt:
+#	makeinfo -o $*.txt --no-headers $(srcdir)/$<
+
+# Generate the HTML version of the netcdf-3 F03 man page.
+#netcdf_fortran-man.html: $(top_srcdir)/docs/netcdf_fortran.3
+#	groff -man -Thtml $? > $@
+
+#netcdf-fortran.html:
+#	$(MAKEINFO) --html $(AM_MAKEINFOHTMLFLAGS) $(MAKEINFOFLAGS) -I$(srcdir) netcdf-fortran.texi
+#	$(MAKEINFO) --no-split --html $(AM_MAKEINFOHTMLFLAGS) $(MAKEINFOFLAGS) -I$(srcdir) netcdf-fortran.texi
+
+# This builds the docs from source, if necessary, and tars up
+# everything needed for the website. Run this and copy the resulting
+# tarball to the /contents/netcdf/docs directory to update the on-line
+# docs.
+
+#web-tarball: $(pdf_docs) $(html_mans) $(txt_docs) $(dvi_docs) $(ps_docs) $(info_docs) $(html_docs)
+#	tar cf netcdf_info.tar *.info*
+#	gzip -f netcdf_info.tar
+#	zip netcdf_info *.info
+#	tar cf netcdf_pdf.tar *.pdf
+#	gzip -f netcdf_pdf.tar
+#	zip netcdf_pdf *.pdf
+#	tar cf netcdf_html.tar *.html $(html_dirs)
+#	gzip -f netcdf_html.tar
+#	zip netcdf_html *.html $(html_dirs)
+#	tar cf netcdf_txt.tar *.txt
+#	gzip -f netcdf_txt.tar
+#	zip netcdf_txt *.txt
+#	tar cf netcdf_man.tar netcdf_fortran.3
+#	gzip -f netcdf_man.tar
+#	zip netcdf_man netcdf_fortran.3
+#	tar cf netcdf_docs.tar $(html_dirs) *.pdf *.txt *.html *.tar.gz *.zip
+#	gzip -f netcdf_docs.tar
+
+# Clean up all the junk we created!
+MAINTAINERCLEANFILES = netcdf_fortran-man.html stamp-* version*
+ARGS_MANPAGE = -DAPI=FORTRAN -DNETCDF4=TRUE $(am__append_1) \
+	$(am__append_2)
+all: all-am
+
+.SUFFIXES:
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign docs/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign docs/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+Doxyfile: $(top_builddir)/config.status $(srcdir)/Doxyfile.in
+	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+
+mostlyclean-libtool:
+	-rm -f *.lo
+
+clean-libtool:
+	-rm -rf .libs _libs
+install-man3: $(man_MANS)
+	@$(NORMAL_INSTALL)
+	@list1=''; \
+	list2='$(man_MANS)'; \
+	test -n "$(man3dir)" \
+	  && test -n "`echo $$list1$$list2`" \
+	  || exit 0; \
+	echo " $(MKDIR_P) '$(DESTDIR)$(man3dir)'"; \
+	$(MKDIR_P) "$(DESTDIR)$(man3dir)" || exit 1; \
+	{ for i in $$list1; do echo "$$i"; done;  \
+	if test -n "$$list2"; then \
+	  for i in $$list2; do echo "$$i"; done \
+	    | sed -n '/\.3[a-z]*$$/p'; \
+	fi; \
+	} | while read p; do \
+	  if test -f $$p; then d=; else d="$(srcdir)/"; fi; \
+	  echo "$$d$$p"; echo "$$p"; \
+	done | \
+	sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^3][0-9a-z]*$$,3,;x' \
+	      -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \
+	sed 'N;N;s,\n, ,g' | { \
+	list=; while read file base inst; do \
+	  if test "$$base" = "$$inst"; then list="$$list $$file"; else \
+	    echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man3dir)/$$inst'"; \
+	    $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man3dir)/$$inst" || exit $$?; \
+	  fi; \
+	done; \
+	for i in $$list; do echo "$$i"; done | $(am__base_list) | \
+	while read files; do \
+	  test -z "$$files" || { \
+	    echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man3dir)'"; \
+	    $(INSTALL_DATA) $$files "$(DESTDIR)$(man3dir)" || exit $$?; }; \
+	done; }
+
+uninstall-man3:
+	@$(NORMAL_UNINSTALL)
+	@list=''; test -n "$(man3dir)" || exit 0; \
+	files=`{ for i in $$list; do echo "$$i"; done; \
+	l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \
+	  sed -n '/\.3[a-z]*$$/p'; \
+	} | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^3][0-9a-z]*$$,3,;x' \
+	      -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \
+	dir='$(DESTDIR)$(man3dir)'; $(am__uninstall_files_from_dir)
+tags TAGS:
+
+ctags CTAGS:
+
+cscope cscopelist:
+
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+	  else \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
+	    || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+check: check-am
+all-am: Makefile $(MANS)
+installdirs:
+	for dir in "$(DESTDIR)$(man3dir)"; do \
+	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
+	done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	if test -z '$(STRIP)'; then \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	      install; \
+	else \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	    "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+	fi
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+	-test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES)
+clean: clean-am
+
+clean-am: clean-generic clean-libtool mostlyclean-am
+
+distclean: distclean-am
+	-rm -f Makefile
+distclean-am: clean-am distclean-generic
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am: install-man
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man: install-man3
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-generic mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-man
+
+uninstall-man: uninstall-man3
+
+.MAKE: install-am install-strip
+
+.PHONY: all all-am check check-am clean clean-generic clean-libtool \
+	cscopelist-am ctags-am distclean distclean-generic \
+	distclean-libtool distdir dvi dvi-am html html-am info info-am \
+	install install-am install-data install-data-am install-dvi \
+	install-dvi-am install-exec install-exec-am install-html \
+	install-html-am install-info install-info-am install-man \
+	install-man3 install-pdf install-pdf-am install-ps \
+	install-ps-am install-strip installcheck installcheck-am \
+	installdirs maintainer-clean maintainer-clean-generic \
+	mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \
+	ps ps-am tags-am uninstall uninstall-am uninstall-man \
+	uninstall-man3
+
+manpages: $(top_srcdir)/docs/netcdf.m4
+	m4 $(M4FLAGS) $(ARGS_MANPAGE) $? >netcdf_fortran.3 || rm netcdf_fortran.3
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/docs/netcdf-50x50.png b/docs/netcdf-50x50.png
new file mode 100644
index 0000000..09ded48
Binary files /dev/null and b/docs/netcdf-50x50.png differ
diff --git a/docs/netcdf.m4 b/docs/netcdf.m4
new file mode 100644
index 0000000..e365b6c
--- /dev/null
+++ b/docs/netcdf.m4
@@ -0,0 +1,1514 @@
+divert(-1)
+
+changequote(<<,>>)
+define(<<index>>, defn(index))
+
+define(<<CODE>>, <<\fB$1\fR>>)
+
+define(<<ARG>>, <<\fI$1\fP>>)
+
+define(<<HEADER_FILE>>, 
+    <<ifelse(API,C,
+	$1.h,
+	$1.inc)>>)
+
+define(<<INCLUDE>>, 
+    <<ifelse(API,C,
+	<<#include>> "HEADER_FILE($1)",
+	<<<<include>>>> HEADER_FILE($1))>>)
+
+define(<<COMPILER>>,
+    <<ifelse(API,C,
+	cc,
+	f77)>>)
+
+define(<<LANGUAGE>>,
+    <<ifelse(API,C,
+	C,
+	FORTRAN)>>)
+
+define(<<RETSTR>>,
+    <<ifelse(API,C,
+	const char*,
+	character*80)>>)
+
+define(<<FNAME>>,
+    <<ifelse(API,C,
+	nc_$1,
+	nf_$1)>>)
+
+define(<<VOID_ARG>>,
+    <<ifelse(API,C,,void)>>)
+
+define(<<MACRO>>,
+    <<CODE(ifelse(API,C,
+	NC_$1,
+	NF_$1))>>)
+
+dnl AQUAL(io, rank)
+define(<<AQUAL>>, <<ifelse(API,C,
+    <<ifelse($1, output, , <<ifelse($2, 0, , const )>>)>>)>>)
+
+dnl CTYPE(type)
+define(<<CTYPE>>,
+    <<ifelse($1,text,char,
+    <<ifelse($1,uchar,unsigned char,
+    <<ifelse($1,schar,signed char,
+    <<ifelse($1,short,short,
+    <<ifelse($1,int,int,
+    <<ifelse($1,nc_type,nc_type,
+    <<ifelse($1,size_t,size_t,
+    <<ifelse($1,ptrdiff_t,ptrdiff_t,
+    <<ifelse($1,long,long,
+    <<ifelse($1,int64,long long,
+    <<ifelse($1,float,float,
+    <<ifelse($1,double,double,
+    <<ifelse($1,ubyte,unsigned char,
+    <<ifelse($1,ushort,unsigned short,
+    <<ifelse($1,uint,unsigned int,
+    <<ifelse($1,int64,long long,
+    <<ifelse($1,uint64,unsigned long long,
+    <<ifelse($1,string,char *,
+    <<ifelse($1,voidp,void *,
+    )>>)>>)>>)>>)>>)>>)>>)>>)>>)>>)>>)>>)>>)>>)>>)>>)>>)>>)>>)
+
+dnl CSTAR(io, rank)
+define(<<CSTAR>>, <<ifelse($1,input,,<<ifelse($2,0,*)>>)>>)
+
+dnl FTYPE(type, rank)
+define(<<FTYPE>>, 
+    <<ifelse($1,text,<<character*ifelse($2,0,1,(*))>>,
+    <<ifelse($1,schar,integer*1,
+    <<ifelse($1,short,integer*2,
+    <<ifelse($1,int,integer,
+    <<ifelse($1,nc_type,integer,
+    <<ifelse($1,size_t,integer,
+    <<ifelse($1,ptrdiff_t,integer,
+    <<ifelse($1,long,integer,
+    <<ifelse($1,int64,integer*8,
+    <<ifelse($1,float,real,
+    <<ifelse($1,double,doubleprecision,
+    <<ifelse($1,ubyte,integer*1,
+    <<ifelse($1,ushort,integer*2,
+    <<ifelse($1,uint,integer*4,
+    <<ifelse($1,int64,integer*8,
+    <<ifelse($1,uint64,integer*8,
+    <<ifelse($1,string,character*,
+    <<ifelse($1,voidp,void *,
+)>>)>>)>>)>>)>>)>>)>>)>>)>>)>>)>>)>>)>>)>>)>>)>>)>>)>>)
+
+dnl ATYPE(io,rank,type)
+define(<<ATYPE>>, <<ifelse(API,C,
+    <<CTYPE($3)<<>>CSTAR($1,$2)>>, 
+    <<FTYPE($3,$2)>>)>>)
+
+dnl AID(name, rank, type)
+define(<<AID>>, <<ARG($1)<<>>ifelse(API,C,
+    <<ifelse($2,0,,[])>>, 
+    <<ifelse($3,text,,<<ifelse($2,0,,(1))>>)>>)>>)
+
+dnl ADECL(io, rank, type, name)
+define(<<ADECL>>, <<AQUAL($1,$2)ATYPE($1,$2,$3) AID($4,$2,$3)>>)
+
+define(<<ITEXT>>,	<<ADECL(input,0,text,$1)>>)
+define(<<ITEXTV>>,	<<ADECL(input,1,text,$1)>>)
+define(<<OTEXT>>,	<<ADECL(output,0,text,$1)>>)
+define(<<OTEXTV>>,	<<ADECL(output,1,text,$1)>>)
+
+define(<<IUCHAR>>,	<<ADECL(input,0,uchar,$1)>>)
+define(<<IUCHARV>>,	<<ADECL(input,1,uchar,$1)>>)
+define(<<OUCHAR>>,	<<ADECL(output,0,uchar,$1)>>)
+define(<<OUCHARV>>,	<<ADECL(output,1,uchar,$1)>>)
+
+define(<<ISCHAR>>,	<<ADECL(input,0,schar,$1)>>)
+define(<<ISCHARV>>,	<<ADECL(input,1,schar,$1)>>)
+define(<<OSCHAR>>,	<<ADECL(output,0,schar,$1)>>)
+define(<<OSCHARV>>,	<<ADECL(output,1,schar,$1)>>)
+
+define(<<ISHORT>>,	<<ADECL(input,0,short,$1)>>)
+define(<<ISHORTV>>,	<<ADECL(input,1,short,$1)>>)
+define(<<OSHORT>>,	<<ADECL(output,0,short,$1)>>)
+define(<<OSHORTV>>,	<<ADECL(output,1,short,$1)>>)
+
+define(<<IINT>>,	<<ADECL(input,0,int,$1)>>)
+define(<<IINTV>>,	<<ADECL(input,1,int,$1)>>)
+define(<<OINT>>,	<<ADECL(output,0,int,$1)>>)
+define(<<OINTV>>,	<<ADECL(output,1,int,$1)>>)
+
+define(<<IINT64>>,	<<ADECL(input,0,int64,$1)>>)
+define(<<IINT64V>>,	<<ADECL(input,1,int64,$1)>>)
+define(<<OINT64>>,	<<ADECL(output,0,int64,$1)>>)
+define(<<OINT64V>>,	<<ADECL(output,1,int64,$1)>>)
+
+define(<<INCTYPE>>,	<<ADECL(input,0,nc_type,$1)>>)
+define(<<INCTYPEV>>,	<<ADECL(input,1,nc_type,$1)>>)
+define(<<ONCTYPE>>,	<<ADECL(output,0,nc_type,$1)>>)
+define(<<ONCTYPEV>>,	<<ADECL(output,1,nc_type,$1)>>)
+
+define(<<ISIZET>>,	<<ADECL(input,0,size_t,$1)>>)
+define(<<ISIZETV>>,	<<ADECL(input,1,size_t,$1)>>)
+define(<<OSIZET>>,	<<ADECL(output,0,size_t,$1)>>)
+define(<<OSIZETV>>,	<<ADECL(output,1,size_t,$1)>>)
+
+define(<<IPTRDIFFT>>,	<<ADECL(input,0,ptrdiff_t,$1)>>)
+define(<<IPTRDIFFTV>>,	<<ADECL(input,1,ptrdiff_t,$1)>>)
+define(<<OPTRDIFFT>>,	<<ADECL(output,0,ptrdiff_t,$1)>>)
+define(<<OPTRDIFFTV>>,	<<ADECL(output,1,ptrdiff_t,$1)>>)
+
+define(<<ILONG>>,	<<ADECL(input,0,long,$1)>>)
+define(<<ILONGV>>,	<<ADECL(input,1,long,$1)>>)
+define(<<OLONG>>,	<<ADECL(output,0,long,$1)>>)
+define(<<OLONGV>>,	<<ADECL(output,1,long,$1)>>)
+
+define(<<IFLOAT>>,	<<ADECL(input,0,float,$1)>>)
+define(<<IFLOATV>>,	<<ADECL(input,1,float,$1)>>)
+define(<<OFLOAT>>,	<<ADECL(output,0,float,$1)>>)
+define(<<OFLOATV>>,	<<ADECL(output,1,float,$1)>>)
+
+define(<<IDOUBLE>>,	<<ADECL(input,0,double,$1)>>)
+define(<<IDOUBLEV>>,	<<ADECL(input,1,double,$1)>>)
+define(<<ODOUBLE>>,	<<ADECL(output,0,double,$1)>>)
+define(<<ODOUBLEV>>,	<<ADECL(output,1,double,$1)>>)
+
+define(<<IUBYTE>>,	<<ADECL(input,0,ubyte,$1)>>)
+define(<<IUBYTEV>>,	<<ADECL(input,1,ubyte,$1)>>)
+define(<<OUBYTE>>,	<<ADECL(output,0,ubyte,$1)>>)
+define(<<OUBYTEV>>,	<<ADECL(output,1,ubyte,$1)>>)
+
+define(<<IUSHORT>>,	<<ADECL(input,0,ushort,$1)>>)
+define(<<IUSHORTV>>,	<<ADECL(input,1,ushort,$1)>>)
+define(<<OUSHORT>>,	<<ADECL(output,0,ushort,$1)>>)
+define(<<OUSHORTV>>,	<<ADECL(output,1,ushort,$1)>>)
+
+define(<<IUINT>>,	<<ADECL(input,0,uint,$1)>>)
+define(<<IUINTV>>,	<<ADECL(input,1,uint,$1)>>)
+define(<<OUINT>>,	<<ADECL(output,0,uint,$1)>>)
+define(<<OUINTV>>,	<<ADECL(output,1,uint,$1)>>)
+
+define(<<IINT64>>,	<<ADECL(input,0,int64,$1)>>)
+define(<<IINT64V>>,	<<ADECL(input,1,int64,$1)>>)
+define(<<OINT64>>,	<<ADECL(output,0,int64,$1)>>)
+define(<<OINT64V>>,	<<ADECL(output,1,int64,$1)>>)
+
+define(<<IUINT64>>,	<<ADECL(input,0,uint64,$1)>>)
+define(<<IUINT64V>>,	<<ADECL(input,1,uint64,$1)>>)
+define(<<OUINT64>>,	<<ADECL(output,0,uint64,$1)>>)
+define(<<OUINT64V>>,	<<ADECL(output,1,uint64,$1)>>)
+
+define(<<ISTRING>>,	<<ADECL(input,0,string,$1)>>)
+define(<<ISTRINGV>>,	<<ADECL(input,1,string,$1)>>)
+define(<<OSTRING>>,	<<ADECL(output,0,string,$1)>>)
+define(<<OSTRINGV>>,	<<ADECL(output,1,string,$1)>>)
+
+define(<<IVOIDP>>,	<<ADECL(input,0,voidp,$1)>>)
+define(<<IVOIDPV>>,	<<ADECL(input,1,voidp,$1)>>)
+define(<<OVOIDP>>,	<<ADECL(output,0,voidp,$1)>>)
+define(<<OVOIDPV>>,	<<ADECL(output,1,voidp,$1)>>)
+
+dnl CCOMP(type)
+define(<<CCOMP>>, 
+    <<ifelse($1,text,text,
+    <<ifelse($1,uchar,uchar,
+    <<ifelse($1,schar,schar,
+    <<ifelse($1,short,short,
+    <<ifelse($1,int,int,
+    <<ifelse($1,long,long,
+    <<ifelse($1,float,float,
+    <<ifelse($1,double,double,
+    <<ifelse($1,ubyte,ubyte,
+    <<ifelse($1,ushort,ushort,
+    <<ifelse($1,uint,uint,
+    <<ifelse($1,int64,int64,
+    <<ifelse($1,uint64,uint64,
+    <<ifelse($1,string,string,
+    <<ifelse($1,voidp,void *,
+)>>)>>)>>)>>)>>)>>)>>)>>)>>)>>)>>)>>)>>)>>)>>)
+
+dnl FCOMP(type)
+define(<<FCOMP>>, 
+    <<ifelse($1,text,text,
+    <<ifelse($1,schar,int1,
+    <<ifelse($1,short,int2,
+    <<ifelse($1,int,int,
+    <<ifelse($1,float,real,
+    <<ifelse($1,double,double,
+    <<ifelse($1,ubyte,ubyte,
+    <<ifelse($1,ushort,ushort,
+    <<ifelse($1,uint,uint,
+    <<ifelse($1,uint64,uint64,
+    <<ifelse($1,string,string,
+    <<ifelse($1,voidp,any,
+)>>)>>)>>)>>)>>)>>)>>)>>)>>)>>)>>)>>)
+
+dnl COMP(type)
+define(<<COMP>>, <<ifelse(API,C,<<CCOMP($1)>>,<<FCOMP($1)>>)>>)
+
+define(<<FDECL_TYPE>>,
+    <<ifelse(API,C, 
+	int,
+	integer function)>>)
+
+dnl DECL(return-type, name, argument-list)
+define(<<DECL>>, <<CODE($1 FNAME($2)$3)>>)
+
+dnl FDECL(name, argument-list)
+define(<<FDECL>>, <<DECL(FDECL_TYPE, $1, $2)>>)
+
+dnl IODECL(name, type, argument-list)
+define(<<IODECL>>, <<FDECL($1_<<>>COMP($2), $3)>>)
+
+dnl FREF(name)
+define(<<FREF>>, <<CODE(FNAME($1)(\|))>>)
+
+dnl FOLD(cname, fname)
+define(<<FOLD>>, <<CODE(ifelse(API,C, nc$1, nc$2)(\|))>>)
+
+dnl Function Input Arguments:
+define(<<IATTNUM>>, <<IINT(attnum)>>)
+define(<<ICMODE>>, <<IINT(cmode)>>)
+define(<<ICOUNT>>, <<ISIZETV(count)>>)
+define(<<IDIMID>>, <<IINT(dimid)>>)
+define(<<IDIMIDS>>, <<IINTV(dimids)>>)
+define(<<IFILLMODE>>, <<IINT(fillmode)>>)
+define(<<IH_MINFREE>>, <<ISIZET(h_minfree)>>)
+define(<<IINDEX>>, <<ISIZETV(index)>>)
+define(<<IINITSIZE>>, <<ISIZET(initialsize)>>)
+define(<<ILEN>>, <<ISIZET(<<len>>)>>)
+define(<<IMAP>>, <<IPTRDIFFTV(imap)>>)
+define(<<IMODE>>, <<IINT(mode)>>)
+define(<<INAME>>, <<ITEXTV(name)>>)
+define(<<INCID>>, <<IINT(ncid)>>)
+define(<<INCIDIN>>, <<IINT(ncid_in)>>)
+define(<<INCIDOUT>>, <<IINT(ncid_out)>>)
+define(<<INDIMS>>, <<IINT(ndims)>>)
+define(<<INEWNAME>>, <<ITEXTV(newname)>>)
+define(<<IPATH>>, ITEXTV(path))
+define(<<IPE>>, <<IINT(pe)>>)
+define(<<IR_ALIGN>>, <<ISIZET(r_align)>>)
+define(<<ISTART>>, <<ISIZETV(start)>>)
+define(<<ISTATUS>>, <<IINT(status)>>)
+define(<<ISTRIDE>>, <<ISIZETV(stride)>>)
+define(<<IV_ALIGN>>, <<ISIZET(v_align)>>)
+define(<<IV_MINFREE>>, <<ISIZET(v_minfree)>>)
+define(<<IVARID>>, <<IINT(varid)>>)
+define(<<IVARIDIN>>, <<IINT(varid_in)>>)
+define(<<IVARIDOUT>>, <<IINT(varid_out)>>)
+define(<<IXTYPE>>, <<INCTYPE(xtype)>>)
+define(<<IPARACCESS>>, <<IINT(par_access)>>)
+
+dnl Function Output Arguments:
+define(<<OATTNUM>>, <<OINT(attnum)>>)
+define(<<OCHUNKSIZE>>, <<OSIZET(chunksize)>>)
+define(<<ODIMID>>, <<OINT(dimid)>>)
+define(<<ODIMIDS>>, <<OINTV(dimids)>>)
+define(<<OLEN>>, <<OSIZET(<<len>>)>>)
+define(<<ONAME>>, <<OTEXTV(name)>>)
+define(<<ONATTS>>, <<OINT(natts)>>)
+define(<<ONCID>>, <<OINT(ncid)>>)
+define(<<ONDIMS>>, <<OINT(ndims)>>)
+define(<<ONVARS>>, <<OINT(nvars)>>)
+define(<<OOLDFILLMODE>>, <<OINT(old_fillemode)>>)
+define(<<OPE>>, <<OINT(pe)>>)
+define(<<OVARID>>, <<OINT(varid)>>)
+define(<<OUNLIMDIMID>>, <<OINT(unlimdimid)>>)
+define(<<OFORMATN>>, <<OINT(formatn)>>)
+define(<<OXTYPE>>, <<ONCTYPE(xtype)>>)
+
+dnl Argument References:
+define(<<ATTNUM>>, <<ARG(attnum)>>)
+define(<<COUNT>>, <<ARG(count)>>)
+define(<<DIMID>>, <<ARG(dimid)>>)
+define(<<DIMIDS>>, <<ARG(dimids)>>)
+define(<<FILLMODE>>, <<ARG(fillmode)>>)
+define(<<IN>>, <<ARG(in)>>)
+define(<<INDEX>>, <<ARG(index)>>)
+define(<<LEN>>, <<ARG(<<len>>)>>)
+define(<<IMAP>>, <<ARG(imap)>>)
+define(<<NAME>>, <<ARG(name)>>)
+define(<<NATTS>>, <<ARG(natts)>>)
+define(<<NCID>>, <<ARG(ncid)>>)
+define(<<NCIDIN>>, <<ARG(ncid_in)>>)
+define(<<NCIDOUT>>, <<ARG(ncid_out)>>)
+define(<<NDIMS>>, <<ARG(ndims)>>)
+define(<<NEWNAME>>, <<ARG(newname)>>)
+define(<<NULL>>, <<CODE(<<<<NULL>>>>)>>)
+define(<<NVARS>>, <<ARG(nvars)>>)
+define(<<NVATTS>>, <<ARG(nvatts)>>)
+define(<<OLDFILLMODE>>, <<ARG(old_fillmode)>>)
+define(<<OUT>>, <<ARG(out)>>)
+define(<<START>>, <<ARG(start)>>)
+define(<<STRIDE>>, <<ARG(stride)>>)
+define(<<UNLIMDIMID>>, <<ARG(unlimdimid)>>)
+define(<<FORMATN>>, <<ARG(formatn)>>)
+define(<<VARID>>, <<ARG(varid)>>)
+define(<<VARIDIN>>, <<ARG(varid_in)>>)
+define(<<VARIDOUT>>, <<ARG(varid_out)>>)
+define(<<XTYPE>>, <<ARG(xtype)>>)
+
+define(<<UPCASE>>, 
+<<translit($1,abcdefghijklmnopqrstuvwxyz,ABCDEFGHIJKLMNOPQRSTUVWXYZ)>>)
+
+dnl Variable "Put" Functions:
+define(<<VOUT>>, <<I<<>>UPCASE($1)<<>>ifelse($2,1,,V)(ifelse($2,1,*)out)>>)
+define(<<VPUT>>, <<IODECL(put_var$1, $2, (INCID(), IVARID()$3, VOUT($2,$1)))>>)
+define(<<PUT_VAR>>, <<VPUT(,$1)>>)
+define(<<PUT_VAR1>>,<<VPUT(1,$1,<<, IINDEX()>>)>>)
+define(<<PUT_VARA>>,<<VPUT(a,$1,<<, ISTART(), ICOUNT()>>)>>)
+define(<<PUT_VARS>>,<<VPUT(s,$1,<<, ISTART(), ICOUNT(), ISTRIDE()>>)>>)
+define(<<PUT_VARM>>,<<VPUT(m,$1,<<, ISTART(), ICOUNT(), ISTRIDE(), IMAP()>>)>>)
+
+dnl Variable "Get" Functions:
+define(<<VIN>>, <<O<<>>UPCASE($1)<<>>ifelse($2,1,,V)(in)>>)
+define(<<VGET>>, <<IODECL(get_var$1, $2, (INCID(), IVARID()$3, VIN($2,$1)))>>)
+define(<<GET_VAR>>, <<VGET(,$1)>>)
+define(<<GET_VAR1>>,<<VGET(1,$1,<<, IINDEX()>>)>>)
+define(<<GET_VARA>>,<<VGET(a,$1,<<, ISTART(), ICOUNT()>>)>>)
+define(<<GET_VARS>>,<<VGET(s,$1,<<, ISTART(), ICOUNT(), ISTRIDE()>>)>>)
+define(<<GET_VARM>>,<<VGET(m,$1,<<, ISTART(), ICOUNT(), ISTRIDE(), IMAP()>>)>>)
+
+dnl Attribute "Put" Functions:
+define(<<AOUT>>, <<I<<>>UPCASE($1)<<>>V(out)>>)
+define(<<APUT>>,<<IODECL(put_att,$1,(INCID(), IVARID(), INAME(), IXTYPE(), ILEN(), AOUT($1)))>>)
+
+dnl Attribute "Get" Functions:
+define(<<AIN>>, <<O<<>>UPCASE($1)<<>>V(in)>>)
+define(<<AGET>>,<<IODECL(get_att,$1,(INCID(), IVARID(), INAME(), AIN($1)))>>)
+
+dnl Function Family Listing:
+define(<<FUNC_FAMILY>>,
+<<.HP
+$1(text)
+ifelse(API,C,
+<<.HP
+$1(uchar)>>)
+.HP
+$1(schar)
+.HP
+$1(short)
+.HP
+$1(int)
+ifelse(API,C,
+<<.HP
+$1(long)>>)
+.HP
+$1(float)
+.HP
+$1(double)
+ifelse(NETCDF4,TRUE,
+<<.HP
+$1(ubyte)
+.HP
+$1(ushort)
+.HP
+$1(uint)
+.HP
+$1(int64)
+.HP
+$1(uint64)
+.HP
+$1(string)>>
+)
+>>)
+
+divert(0)dnl
+.nr yr \n(yr+1900
+.af mo 01
+.af dy 01
+.TH NETCDF 3 "1997-04-18" "Printed: \n(yr-\n(mo-\n(dy" "UNIDATA LIBRARY FUNCTIONS"
+.SH N<<>>AME
+netcdf \- Unidata's Network Common Data Form (netCDF) library interface
+.SH SYNOPSIS
+.ft B
+.na
+.nh
+INCLUDE(netcdf)
+.sp
+ifelse(API,C,,
+.SS Most Systems:)
+ifelse(NETCDF4,TRUE,
+COMPILER() ...  -lnetcdf -lhdf5_hl -lhdf5 -lz -lm,
+COMPILER() ... -lnetcdf)
+ifelse(API,C,,
+.sp
+.SS CRAY PVP Systems:
+f90 -dp -i64 ... -lnetcdf
+)
+.ad
+.hy
+Complete documentation for the netCDF libraries can be found at the netCDF website: http://www.unidata.ucar.edu/software/netcdf/.
+.sp
+.SH "LIBRARY VERSION"
+.LP
+ifelse(NETCDF4,TRUE,
+This document describes versions 3 and 4,
+This document describes version 3
+)
+of Unidata netCDF data-access interface
+for the LANGUAGE() programming language.
+.HP
+DECL(RETSTR(), inq_libvers, (VOID_ARG))
+.sp
+Returns a string identifying the version of the netCDF library, and
+when it was built, like: "3.1a of Aug 22 1996 12:57:47 $".
+.LP
+The RCS \fBident(1)\fP command will find a string like
+"$\|Id: @\|(#) netcdf library version 3.1a of Sep  6 1996 15:56:26 $"
+in the library. The SCCS \fBwhat(1)\fP command will find a string like
+"netcdf library version 3.1a of Aug 23 1996 16:07:40 $".
+.SH "RETURN VALUES"
+.LP
+All netCDF functions (except
+FREF(inq_libvers) and FREF(strerror)) return an integer status.
+
+If this returned status value is not equal to
+MACRO(NOERR) (zero), it
+indicates that an error occurred. The possible status values are defined in 
+ifelse(API,C, system <<<<include>>>> file <errno.h> and in )<<>>dnl
+ifelse(API,C,")HEADER_FILE(netcdf)<<>>ifelse(API,C,").
+.HP
+DECL(RETSTR(), strerror, (ISTATUS()))
+.sp
+Returns a string textual translation of the \fIstatus\fP
+value, like "Attribute or variable name contains illegal characters"
+or "No such file or directory".
+.sp
+.SH "FILE OPERATIONS"
+.LP
+.HP
+FDECL(create, (IPATH(), ICMODE(), ONCID()))
+.sp
+Creates a new netCDF dataset at ARG(path),
+returning a netCDF ID in ARG(ncid).
+The argument ARG(cmode) may <<include>> the bitwise-or
+of the following flags:
+MACRO(NOCLOBBER)
+to protect existing datasets (default
+silently blows them away),
+MACRO(SHARE)
+for synchronous dataset updates for classic format files
+(default is to buffer accesses),
+.sp
+When a netCDF dataset is created, is is opened
+MACRO(WRITE).
+The new netCDF dataset is in <<define>> mode.
+MACRO(64BIT_OFFSET).
+to create a file in the 64-bit offset format 
+(as opposed to classic format, the default). 
+ifelse(NETCDF4,TRUE,
+<<MACRO(NETCDF4) to create a netCDF-4/HDF5 file, 
+and MACRO(CLASSIC_MODEL) to guarantee that netCDF-4/HDF5 files maintain compatibility 
+with the netCDF classic data model.>>,
+.
+)
+.HP
+FDECL(_create, (IPATH(), ICMODE(), IINITSIZE(), OCHUNKSIZE(), ONCID()))
+.sp
+Like FREF(create) but has additional performance tuning parameters.
+.sp
+The argument ARG(initialsize) sets the initial size of the file at
+creation time.
+.sp
+See FREF(_open) below for an explanation of the ARG(chunksize)
+parameter.
+.HP
+FDECL(open, (IPATH(), IMODE(), ONCID()))
+.sp
+(Corresponds to FOLD(open, opn) in version 2)
+.sp
+Opens a existing netCDF dataset at ARG(path)
+returning a netCDF ID
+in ARG(ncid).
+The type of access is described by the ARG(mode) parameter,
+which may <<include>> the bitwise-or
+of the following flags:
+MACRO(WRITE)
+for read-write access (default
+read-only),
+MACRO(SHARE)
+for synchronous dataset updates (default is
+to buffer accesses), and
+MACRO(LOCK)
+(not yet implemented).
+.sp
+ifelse(DAP,TRUE,
+<<As of NetCDF version 4.1, and if DAP support was enabled
+when the NetCDF library was built, the path parameter
+may specify a DAP URL. In this case, the access mode is
+forced to be read-only.>>)
+.HP
+FDECL(_open, (IPATH(), IMODE(), OCHUNKSIZE(), ONCID()))
+.sp
+Like FREF(open) but has an additional performance tuning parameter.
+.sp
+The argument referenced by ARG(chunksize) controls a space versus time
+tradeoff, memory allocated in the netcdf library versus number of system
+calls.
+Because of internal requirements, the value may not be set to exactly
+the value requested.
+The actual value chosen is returned by reference.
+Using the value MACRO(SIZEHINT_DEFAULT) causes the library to choose a
+default.
+How the system choses the default depends on the system.
+On many systems, the "preferred I/O block size" is available from the 
+CODE(stat()) system call, CODE(struct stat) member CODE(st_blksize).
+If this is available it is used. Lacking that, twice the system pagesize
+is used.
+Lacking a call to discover the system pagesize, we just set default
+chunksize to 8192.
+.sp
+The chunksize is a property of a given open netcdf descriptor
+ARG(ncid), it is not a persistent property of the netcdf dataset.
+.sp
+ifelse(DAP,TRUE,
+<<As with FREF(_open), the path parameter
+may specify a DAP URL, but the tuning parameters are ignored.>>)
+.HP
+FDECL(redef, (INCID()))
+.sp
+(Corresponds to FOLD(redef, redf) in version 2)
+.sp
+Puts an open netCDF dataset into <<define>> mode, 
+so dimensions, variables, and attributes can be added or renamed and 
+attributes can be deleted.
+.HP
+FDECL(enddef, (INCID()))
+.sp
+(Corresponds to FOLD(endef, endf) in version 2)
+.sp
+Takes an open netCDF dataset out of <<define>> mode.
+The changes made to the netCDF dataset
+while it was in <<define>> mode are checked and committed to disk if no
+problems occurred.  Some data values may be written as well,
+see "VARIABLE PREFILLING" below.
+After a successful call, variable data can be read or written to the dataset.
+.HP
+FDECL(_enddef, (INCID(), IH_MINFREE(), IV_ALIGN(), IV_MINFREE(), IR_ALIGN()))
+.sp
+Like FREF(enddef) but has additional performance tuning parameters.
+.sp
+Caution: this function exposes internals of the netcdf version 1 file
+<<format>>.
+It may not be available on future netcdf implementations.
+.sp
+The current netcdf file <<format>> has three sections,
+the "header" section, the data section for fixed size variables, and
+the data section for variables which have an unlimited dimension (record
+variables).
+The header begins at the beginning of the file. The <<index>>
+(offset) of the beginning of the other two sections is contained in the
+header. Typically, there is no space between the sections. This causes
+copying overhead to accrue if one wishes to change the size of the
+sections,
+as may happen when changing names of things, text attribute values,
+adding
+attributes or adding variables. Also, for buffered i/o, there may be
+advantages
+to aligning sections in certain ways.
+.sp
+The minfree parameters allow one to control costs of future calls
+to FREF(redef), FREF(enddef) by requesting that ARG(minfree) bytes be
+available at the end of the section.
+The ARG(h_minfree) parameter sets the pad
+at the end of the "header" section. The ARG(v_minfree) parameter sets
+the pad at the end of the data section for fixed size variables.
+.sp
+The align parameters allow one to set the alignment of the beginning of
+the corresponding sections. The beginning of the section is rounded up
+to an <<index>> which is a multiple of the align parameter. The flag value
+MACRO(ALIGN_CHUNK) tells the library to use the chunksize (see above)
+as the align parameter.
+The ARG(v_align) parameter controls the alignment of the beginning of
+the data section for fixed size variables.
+The ARG(r_align) parameter controls the alignment of the beginning of
+the data section for variables which have an unlimited dimension (record
+variables).
+.sp
+The file <<format>> requires mod 4 alignment, so the align parameters
+are silently rounded up to multiples of 4. The usual call,
+CODE(FNAME(enddef)(NCID()))
+is equivalent to
+CODE(FNAME(_enddef)(NCID(), 0, 4, 0, 4)).
+.sp
+The file <<format>> does not contain a "record size" value, this is
+calculated from the sizes of the record variables. This unfortunate fact
+prevents us from providing minfree and alignment control of the
+"records"
+in a netcdf file. If you add a variable which has an unlimited
+dimension,
+the third section will always be copied with the new variable added.
+.HP
+FDECL(sync, (INCID()))
+.sp
+(Corresponds to FOLD(sync, snc) in version 2)
+.sp
+Unless the
+MACRO(SHARE)
+bit is set in
+FREF(open) or FREF(create),
+accesses to the underlying netCDF dataset are
+buffered by the library. This function synchronizes the state of
+the underlying dataset and the library.
+This is done automatically by
+FREF(close) and FREF(enddef).
+.HP
+FDECL(abort, (INCID()))
+.sp
+(Corresponds to FOLD(abort, abor) in version 2)
+.sp
+You don't need to call this function.
+This function is called automatically by
+FREF(close)
+if the netCDF was in <<define>> mode and something goes wrong with the commit.
+If the netCDF dataset isn't in <<define>> mode, then this function is equivalent to
+FREF(close).
+If it is called after
+FREF(redef),
+but before
+FREF(enddef),
+the new definitions are not committed and the dataset is closed.
+If it is called after
+FREF(create)
+but before
+FREF(enddef),
+the dataset disappears.
+.HP
+FDECL(close, (INCID()))
+.sp
+(Corresponds to
+FOLD(close, clos) in version 2)
+.sp
+Closes an open netCDF dataset.
+If the dataset is in <<define>> mode,
+FREF(enddef)
+will be called before closing.
+After a dataset is closed, its ID may be reassigned to another dataset.
+.HP
+FDECL(inq, (INCID(), ONDIMS(), ONVARS(),
+ONATTS(), OUNLIMDIMID()))
+.HP
+FDECL(inq_ndims, (INCID(), ONDIMS()))
+.HP
+FDECL(inq_nvars, (INCID(), ONVARS()))
+.HP
+FDECL(inq_natts, (INCID(), ONATTS()))
+.HP
+FDECL(inq_unlimdim, (INCID(), OUNLIMDIMID()))
+.HP
+FDECL(inq_format, (INCID(), OFORMATN()))
+.sp
+Use these functions to find out what is in a netCDF dataset.
+Upon successful return,
+NDIMS() will contain  the
+number of dimensions defined for this netCDF dataset,
+NVARS() will contain the number of variables,
+NATTS() will contain the number of attributes, and
+UNLIMDIMID() will contain the
+dimension ID of the unlimited dimension if one exists, or
+ifelse(API,C, <<-1>>, <<0>>) otherwise.
+FORMATN() will contain the version number of the dataset <format>, one of
+MACRO(FORMAT_CLASSIC), MACRO(FORMAT_64BIT), MACRO(FORMAT_NETCDF4), or
+MACRO(FORMAT_NETCDF4_CLASSIC).
+ifelse(API,C,
+<<If any of the
+return parameters is a NULL() pointer, then the corresponding information
+will not be returned; hence, no space need be allocated for it.>>)
+.HP
+FDECL(def_dim, (INCID(), INAME(), ILEN(), ODIMID()))
+.sp
+(Corresponds to FOLD(dimdef, ddef) in version 2)
+.sp
+Adds a new dimension to an open netCDF dataset, which must be 
+in <<define>> mode.
+NAME() is the dimension name.
+ifelse(API,C,dnl
+<<If DIMID() is not a NULL() pointer then upon successful completion >>)<<>>dnl
+DIMID() will contain the dimension ID of the newly created dimension.
+ifelse(NETCDF4,TRUE,
+<<
+.SH "USER DEFINED TYPES"
+.LP
+Users many define types for a netCDF-4/HDF5 file (unless the
+MACRO(CLASSIC_MODEL) was used when the file was creates). Users may
+define compound types, variable length arrays, enumeration types, and
+opaque types.
+.sp
+
+.HP
+FDECL(def_compound, (INCID(), ISIZET(size), INAME(), OINT(typeidp)))
+.sp
+Define a compound type.
+.HP
+FDECL(insert_compound, (INCID(), INCTYPE(), INAME(), ISIZET(offset), INCTYPE(field_typeid)))
+.sp
+Insert an element into a compound type. May not be done after type has been used, or after the type has been written by an enddef.
+.HP
+FDECL(insert_array_compound, (INCID(), INCTYPE(), INAME(), ISIZET(offset), INCTYPE(field_typeid), INDIMS(), IINTV(dim_sizes)))
+.sp 
+Insert an array into a compound type.
+.HP
+FDECL(inq_type, (INCID(), INCTYPE(), ONAME(), OSIZET(sizep)))
+.sp
+Learn about a type.
+.HP
+FDECL(inq_compound, (INCID(), INCTYPE(), ONAME(), OSIZET(sizep), OSIZET(nfieldsp)))
+.HP
+FDECL(inq_compound_name, (INCID(), INCTYPE(), ONAME()))
+.HP
+FDECL(inq_compound_size, (INCID(), INCTYPE(), OSIZET(sizep)))
+.HP
+FDECL(inq_compound_nfields, (INCID(), INCTYPE(), OSIZET(nfieldsp)))
+.HP
+FDECL(inq_compound_fieldname, (INCID(), INCTYPE(), IINT(fieldid), ONAME()))
+.HP
+FDECL(inq_compound_fieldindex, (INCID(), INCTYPE(), INAME(), OINT(fieldidp)))
+.HP
+FDECL(inq_compound_fieldoffset, (INCID(), INCTYPE(), IINT(fieldid), OSIZET(offsetp)))
+.HP
+FDECL(inq_compound_fieldtype, (INCID(), INCTYPE(), IINT(fieldid), ONCTYPE(field_typeid)))
+.HP
+FDECL(inq_compound_fieldndims, (INCID(), INCTYPE(), IINT(fieldid), ONDIMS()))
+.HP
+FDECL(inq_compound_fielddim_sizes, (INCID(), INCTYPE(), IINT(fieldid), OINTV(dim_sizes)))
+.sp
+Learn about a compound type.
+.HP
+FDECL(def_vlen, (INCID(), INAME(), INCTYPE(base_typeid), ONCTYPE(xtypep)))
+.sp
+Create a varaible length array type.
+.HP
+FDECL(inq_vlen, (INCID(), INCTYPE(), ONAME(), OSIZET(datum_sizep), ONCTYPE(base_nc_typep)))
+.sp
+Learn about a varaible length array type.
+.HP
+FDECL(free_vlen, (nc_vlen_t *vl))
+.sp
+Free memory comsumed by reading data of a varaible length array type.
+.HP
+FDECL(put_vlen_element, (INCID(), INCTYPE(), IVOIDP(vlen_element), ISIZET(len), IVOIDP(data)))
+.sp
+Write one VLEN.
+.HP
+FDECL(get_vlen_element, (INCID(), INCTYPE(), OVOIDP(vlen_element), ISIZET(len), OVOIDP(data)))
+.sp
+Read one VLEN.
+.HP
+FDECL(free_string, (ISIZET(len), char **data))
+.sp
+Free memory comsumed by reading data of a string type.
+.HP
+FDECL(inq_user_type, (INCID(), INCTYPE(), ONAME(), OSIZET(), ONCTYPE(), OSIZET(), OINT()))
+.sp
+Learn about a user define type.
+.HP
+FDECL(def_enum, (INCID(), INCTYPE(base_typeid), INAME(), ONCTYPE(typeidp)))
+.sp
+Define an enumeration type.
+.HP
+FDECL(insert_enum, (INCID(), INCTYPE(base_typeid), INAME(), const void *value))
+.sp
+Insert a name-value pair into enumeration type.
+.HP
+FDECL(inq_enum_member, (INCID(), INCTYPE(xtype), IINT(idx), ONAME(), void *value))
+.HP
+FDECL(inq_enum_ident, (INCID(), INCTYPE(xtype), IINT(idx), IINT64(value), OTEXTV(identifier)))
+.sp
+Learn about a name-value pair into enumeration type.
+.HP
+FDECL(def_opaque, (INCID(), ISIZET(size), INAME(), ONCTYPE(xtypep)))
+.sp
+Create an opaque type.
+.HP
+FDECL(inq_opaque, (INCID(), INCTYPE(xtype), ONAME(), OSIZET(sizep)))
+.sp
+Learn about opaque type.
+.HP
+.SH "GROUPS"
+.sp
+Users may organize data into hierarchical groups in netCDF-4/HDF5 files (unless MACRO(CLASSIC_MODEL) was used when creating the file).
+.HP
+FDECL(inq_grps, (INCID(), OINT(numgrps), OINTV(ncids)))
+.sp
+Learn how many groups (and their ncids) are available from the group represented by ncid.
+.HP
+FDECL(inq_grpname, (INCID(), ONAME()))
+.HP
+FDECL(inq_grpname_full, (INCID(), OLEN(), ONAME()))
+.HP
+FDECL(inq_grpname_len, (INCID(), OLEN()))
+.HP
+FDECL(inq_grp_parent, (INCID(), ONCID()))
+.HP
+FDECL(inq_grp_ncid, (INCID(), ONAME(), ONCID()))
+.HP
+FDECL(inq_full_ncid, (INCID(), ONAME(), ONCID()))
+.sp
+Learn about a group.
+.HP
+FDECL(inq_varids, (INCID(), ONVARS(), OINT()))
+.sp
+Get the varids in a group.
+.HP
+FDECL(inq_dimids, (INCID(), ONDIMS(), OINT(dimids), IINT(include_parents)))
+.sp
+Get the dimids in a group and (potentially) its parents.
+.HP
+FDECL(inq_typeids, (INCID(), OINT(ntypes), OINTV(typeids)))
+.sp
+Get the typeids of user-defined types in a group.
+.HP
+FDECL(def_grp, (INCID(), ONAME(), ONCID()))
+.sp
+Create a group.
+.LP
+>>)
+.SH "DIMENSIONS"
+.LP
+.HP
+FDECL(inq_dimid, (INCID(), INAME(), ODIMID()))
+.sp
+(Corresponds to FOLD(dimid, did) in version 2)
+.sp
+Given a dimension name, returns the ID of a netCDF dimension in DIMID().
+.HP
+FDECL(inq_dim, (INCID(), IDIMID(), ONAME(), OLEN()))
+.HP
+FDECL(inq_dimname, (INCID(), IDIMID(), ONAME()))
+.HP
+FDECL(inq_dimlen, (INCID(), IDIMID(), OLEN()))
+.sp
+Use these functions to find out about a dimension.
+ifelse(API,C,
+<<If either the NAME()
+argument or LEN() argument is a NULL() pointer, then
+the associated information will not be returned.  Otherwise,>>)
+NAME() should be  big enough (MACRO(MAX_NAME))
+to hold the dimension name as the name will be copied into your storage.
+The length return parameter, LEN()
+will contain the size of the dimension.
+For the unlimited dimension, the returned length is the current
+maximum value used for writing into any of the variables which use
+the dimension.
+.HP
+FDECL(rename_dim, (INCID(), IDIMID(), INAME()))
+.sp
+(Corresponds to FOLD(dimrename, dren) in version 2)
+.sp
+Renames an existing dimension in an open netCDF dataset.
+If the new name is longer than the old name, the netCDF dataset must be in 
+<<define>> mode.
+You cannot rename a dimension to have the same name as another dimension.
+.SH "VARIABLES"
+.LP
+.HP
+FDECL(def_var, (INCID(), INAME(), IXTYPE(), INDIMS(), IDIMIDS(), OVARID()))
+.sp
+(Corresponds to FOLD(vardef, vdef) in version 2)
+.sp
+Adds a new variable to a netCDF dataset. The netCDF must be in <<define>> mode.
+ifelse(API,C, <<If not NULL(), then >>)dnl
+VARID() will be set to the netCDF variable ID.
+.HP
+FDECL(inq_varid, (INCID(), INAME(), OVARID()))
+.sp
+(Corresponds to FOLD(varid, vid) in version 2)
+.sp
+Returns the ID of a netCDF variable in VARID() given its name.
+.HP
+FDECL(inq_var, (INCID(), IVARID(), ONAME(), OXTYPE(), ONDIMS(), ODIMIDS(),
+ONATTS()))
+.HP
+FDECL(inq_varname, (INCID(), IVARID(), ONAME()))
+.HP
+FDECL(inq_vartype, (INCID(), IVARID(), OXTYPE()))
+.HP
+FDECL(inq_varndims, (INCID(), IVARID(), ONDIMS()))
+.HP
+FDECL(inq_vardimid, (INCID(), IVARID(), ODIMIDS()))
+.HP
+FDECL(inq_varnatts, (INCID(), IVARID(), ONATTS()))
+.sp
+Returns information about a netCDF variable, given its ID.
+ifelse(API,C,
+<<If any of the
+return parameters (NAME(), XTYPE(), NDIMS(), DIMIDS(), or
+NATTS()) is a NULL() pointer, then the corresponding information
+will not be returned; hence, no space need be allocated for it.>>)
+.HP
+FDECL(rename_var, (INCID(), IVARID(), INAME()))
+.sp
+(Corresponds to FOLD(varrename, vren) in version 2)
+.sp
+Changes the name of a netCDF variable.
+If the new name is longer than the old name, the netCDF must be in <<define>> mode.
+You cannot rename a variable to have the name of any existing variable.
+ifelse(NETCDF4,TRUE,
+<<
+.SH "VARIABLES IN NETCDF-4 FILES"
+.LP
+The following functions may only be used on variables in a
+netCDF-4/HDF5 data file. These functions must be called after the
+variable is defined, but before an enddef call.
+.sp
+FDECL(def_var_deflate, (INCID(), IVARID(), IINT(shuffle), IINT(deflate), IINT(deflate_level)))
+.sp
+Turn on compression and/or shuffle filter. (Shuffle filter is only useful for integer data.)
+.HP
+FDECL(inq_var_deflate, (INCID(), IVARID(), OINT(shufflep), OINT(deflatep), OINT(deflate_levelp)))
+.sp
+Learn about a variable's deflate settings.
+.HP
+FDECL(def_var_fletcher32, (INCID(), IVARID(), IINT(fletcher32)))
+.sp
+Turn on checksumming for a variable.
+.HP
+FDECL(inq_var_fletcher32, (INCID(), IVARID(), OINT(fletcher32)))
+.sp
+Learn about checksumming for a variable.
+.HP
+FDECL(def_var_chunking, (INCID(), IVARID(), IINT(storage), ISIZETV(chunksizesp)))
+.sp
+Set chunksizes for a variable.
+.HP
+FDECL(inq_var_chunking, (INCID(), IVARID(), OINT(storagep), OSIZETV(chunksizesp)))
+.sp
+Learn about chunksizes for a variable.
+.HP
+FDECL(def_var_fill, (INCID(), IVARID(), IINT(no_fill), ISIZETV(chunksizesp)))
+.sp
+Set a fill value for a variable.
+.HP
+FDECL(inq_var_fill, (INCID(), IVARID(), OINT(storagep), OSIZETV(chunksizesp)))
+.sp
+Learn the fill value for a variable.
+.HP
+FDECL(def_var_endian, (INCID(), IVARID(), IINT(endian)))
+.sp
+Set endianness of variable.
+.HP
+FDECL(inq_var_endian, (INCID(), IVARID(), OINT(endianp)))
+.sp
+Learn the endianness of a variable.
+.HP
+>>)
+.SH "WRITING AND READING WHOLE VARIABLES"
+.LP
+FUNC_FAMILY(<<PUT_VAR>>)
+.sp
+Writes an entire netCDF variable (i.e. all the values).  The netCDF
+dataset must be open and in data mode.  The type of the data is
+specified in the function name, and it is converted to the external
+type of the specified variable, if possible, otherwise an
+MACRO(ERANGE) error is returned. Note that rounding is not performed
+during the conversion. Floating point numbers are truncated when
+converted to integers.
+FUNC_FAMILY(<<GET_VAR>>)
+.sp
+Reads an entire netCDF variable (i.e. all the values).
+The netCDF dataset must be open and in data mode.  
+The data is converted from the external type of the specified variable,
+if necessary, to the type specified in the function name.  If conversion is
+not possible, an MACRO(ERANGE) error is returned.
+.SH "WRITING AND READING ONE DATUM"
+.LP
+FUNC_FAMILY(<<PUT_VAR1>>)
+.sp
+Puts a single data value into a variable at the position INDEX() of an
+open netCDF dataset that is in data mode.  The type of the data is
+specified in the function name, and it is converted to the external type
+of the specified variable, if possible, otherwise an MACRO(ERANGE)
+error is returned.
+FUNC_FAMILY(<<GET_VAR1>>)
+.sp
+Gets a single data value from a variable at the position INDEX()
+of an open netCDF dataset that is in data mode.  
+The data is converted from the external type of the specified variable,
+if necessary, to the type specified in the function name.  If conversion is
+not possible, an MACRO(ERANGE) error is returned.
+.SH "WRITING AND READING AN ARRAY"
+.LP
+FUNC_FAMILY(<<PUT_VARA>>)
+.sp
+Writes an array section of values into a netCDF variable of an open
+netCDF dataset, which must be in data mode.  The array section is specified
+by the START() and COUNT() vectors, which give the starting <<index>>
+and count of values along each dimension of the specified variable.
+The type of the data is
+specified in the function name and is converted to the external type
+of the specified variable, if possible, otherwise an MACRO(ERANGE)
+error is returned.
+FUNC_FAMILY(<<GET_VARA>>)
+.sp
+Reads an array section of values from a netCDF variable of an open
+netCDF dataset, which must be in data mode.  The array section is specified
+by the START() and COUNT() vectors, which give the starting <<index>>
+and count of values along each dimension of the specified variable.
+The data is converted from the external type of the specified variable,
+if necessary, to the type specified in the function name.  If conversion is
+not possible, an MACRO(ERANGE) error is returned.
+.SH "WRITING AND READING A SLICED ARRAY"
+.LP
+FUNC_FAMILY(<<PUT_VARS>>)
+.sp
+These functions are used for \fIstrided output\fP, which is like the
+array section output described above, except that
+the sampling stride (the interval between accessed values) is
+specified for each dimension.
+For an explanation of the sampling stride
+vector, see COMMON ARGUMENTS DESCRIPTIONS below.
+FUNC_FAMILY(<<GET_VARS>>)
+.sp
+These functions are used for \fIstrided input\fP, which is like the
+array section input described above, except that 
+the sampling stride (the interval between accessed values) is
+specified for each dimension.
+For an explanation of the sampling stride
+vector, see COMMON ARGUMENTS DESCRIPTIONS below.
+.SH "WRITING AND READING A MAPPED ARRAY"
+.LP
+FUNC_FAMILY(<<PUT_VARM>>)
+.sp
+These functions are used for \fImapped output\fP, which is like
+strided output described above, except that an additional <<index>> mapping
+vector is provided to specify the in-memory arrangement of the data
+values.
+For an explanation of the <<index>>
+mapping vector, see COMMON ARGUMENTS DESCRIPTIONS below.
+FUNC_FAMILY(<<GET_VARM>>)
+.sp
+These functions are used for \fImapped input\fP, which is like
+strided input described above, except that an additional <<index>> mapping
+vector is provided to specify the in-memory arrangement of the data
+values.
+For an explanation of the <<index>>
+mapping vector, see COMMON ARGUMENTS DESCRIPTIONS below.
+.SH "ATTRIBUTES"
+.LP
+FUNC_FAMILY(<<APUT>>)
+.HP
+FDECL(put_att, (INCID(), IVARID(), INAME(), INCTYPE(xtype), ISIZET(len), IVOIDP(ip)))
+.HP
+FDECL(get_att, (INCID(), IVARID(), INAME(), OVOIDP(ip)))
+.sp
+Unlike variables, attributes do not have 
+separate functions for defining and writing values.
+This family of functions defines a new attribute with a value or changes
+the value of an existing attribute.
+If the attribute is new, or if the space required to
+store the attribute value is greater than before,
+the netCDF dataset must be in <<define>> mode.
+The parameter LEN() is the number of values from OUT() to transfer.
+It is often one, except that for
+FREF(put_att_text) it will usually be
+ifelse(API,C, <<CODE(strlen(OUT())).>>, <<CODE(len_trim(OUT())).>>)
+.sp
+For these functions, the type component of the function name refers to
+the in-memory type of the value, whereas the XTYPE() argument refers to the
+external type for storing the value.  An MACRO(ERANGE)
+error results if
+a conversion between these types is not possible.  In this case the value
+is represented with the appropriate fill-value for the associated 
+external type.
+.HP
+FDECL(inq_attname, (INCID(), IVARID(), IATTNUM(), ONAME()))
+.sp
+Gets the
+name of an attribute, given its variable ID and attribute number.
+This function is useful in generic applications that
+need to get the names of all the attributes associated with a variable,
+since attributes are accessed by name rather than number in all other
+attribute functions.  The number of an attribute is more volatile than
+the name, since it can change when other attributes of the same variable
+are deleted.  The attributes for each variable are numbered
+from ifelse(API,C,0,1) (the first attribute) to
+NVATTS()<<>>ifelse(API,C,-1),
+where NVATTS() is
+the number of attributes for the variable, as returned from a call to
+FREF(inq_varnatts).
+ifelse(API,C,
+<<If the NAME() parameter is a NULL() pointer, no name will be
+returned and no space need be allocated.>>)
+.HP
+FDECL(inq_att, (INCID(), IVARID(), INAME(), OXTYPE(), OLEN()))
+.HP
+FDECL(inq_attid, (INCID(), IVARID(), INAME(), OATTNUM()))
+.HP
+FDECL(inq_atttype, (INCID(), IVARID(), INAME(), OXTYPE()))
+.HP
+FDECL(inq_attlen, (INCID(), IVARID(), INAME(), OLEN()))
+.sp
+These functions return information about a netCDF attribute,
+given its variable ID and name.  The information returned is the
+external type in XTYPE()
+and the number of elements in the attribute as LEN().
+ifelse(API,C,
+<<If any of the return arguments is a NULL() pointer,
+the specified information will not be returned.>>)
+.HP
+FDECL(copy_att, (INCID(), IVARIDIN(), INAME(), INCIDOUT(), IVARIDOUT()))
+.sp
+Copies an
+attribute from one netCDF dataset to another.  It can also be used to
+copy an attribute from one variable to another within the same netCDF.
+NCIDIN() is the netCDF ID of an input netCDF dataset from which the
+attribute will be copied.
+VARIDIN()
+is the ID of the variable in the input netCDF dataset from which the
+attribute will be copied, or MACRO(GLOBAL)
+for a global attribute.
+NAME()
+is the name of the attribute in the input netCDF dataset to be copied.
+NCIDOUT()
+is the netCDF ID of the output netCDF dataset to which the attribute will be 
+copied.
+It is permissible for the input and output netCDF ID's to be the same.  The
+output netCDF dataset should be in <<define>> mode if the attribute to be
+copied does not already exist for the target variable, or if it would
+cause an existing target attribute to grow.
+VARIDOUT()
+is the ID of the variable in the output netCDF dataset to which the attribute will
+be copied, or MACRO(GLOBAL) to copy to a global attribute.
+.HP
+FDECL(rename_att, (INCID(), IVARID(), INAME(), INEWNAME()))
+.sp
+Changes the
+name of an attribute.  If the new name is longer than the original name,
+the netCDF must be in <<define>> mode.  You cannot rename an attribute to
+have the same name as another attribute of the same variable.
+NAME() is the original attribute name.
+NEWNAME()
+is the new name to be assigned to the specified attribute.  If the new name
+is longer than the old name, the netCDF dataset must be in <<define>> mode.
+.HP
+FDECL(del_att, (INCID(), IVARID(), INAME()))
+.sp
+Deletes an attribute from a netCDF dataset.  The dataset must be in
+<<define>> mode.
+FUNC_FAMILY(<<AGET>>)
+.sp
+Gets the value(s) of a netCDF attribute, given its
+variable ID and name.  Converts from the external type to the type
+specified in
+the function name, if possible, otherwise returns an MACRO(ERANGE)
+error.
+All elements of the vector of attribute
+values are returned, so you must allocate enough space to hold
+them.  If you don't know how much space to reserve, call
+FREF(inq_attlen)
+first to find out the length of the attribute.
+.SH "COMMON ARGUMENT DESCRIPTIONS"
+.LP
+In this section we <<define>> some common arguments which are used in the 
+"FUNCTION DESCRIPTIONS" section.
+.TP
+INCID()
+is the netCDF ID returned from a previous, successful call to
+FREF(open) or FREF(create)
+.TP
+ONAME()
+is the name of a dimension, variable, or attribute. The names of 
+dimensions, variables and attributes consist of arbitrary
+sequences of alphanumeric characters (as well as underscore '_',
+period '.' and hyphen '-'), beginning with a letter or
+underscore. (However names commencing with underscore are reserved for
+system use.) Case is significant in netCDF names. A zero-length name
+is not allowed.
+ifelse(API,C,<<As an input argument, 
+it shall be a pointer to a 0-terminated string; as an output argument, it 
+shall be the address of a buffer in which to hold such a string.>>)
+The maximum allowable number of characters 
+ifelse(API,C,(excluding the terminating 0)) is MACRO(MAX_NAME).
+.TP
+IXTYPE()
+specifies the external data type of a netCDF variable or attribute and
+is one of the following:
+MACRO(BYTE), MACRO(CHAR), MACRO(SHORT), MACRO(INT), 
+MACRO(FLOAT), or MACRO(DOUBLE).
+These are used to specify 8-bit integers,
+characters, 16-bit integers, 32-bit integers, 32-bit IEEE floating point
+numbers, and 64-bit IEEE floating-point numbers, respectively.
+ifelse(API,C,
+<<(MACRO(INT) corresponds to MACRO(LONG) in version 2, to specify a
+32-bit integer).>>)
+.TP
+ODIMIDS()
+is a vector of dimension ID's and defines the shape of a netCDF variable.
+The size of the vector shall be greater than or equal to the
+rank (i.e. the number of dimensions) of the variable (NDIMS()).
+The vector shall be ordered by the speed with which a dimension varies:
+DIMIDS()<<>>ifelse(API,C,<<[NDIMS()-1]>>,<<(1)>>)
+shall be the dimension ID of the most rapidly
+varying dimension and
+DIMIDS()<<>>ifelse(API,C,<<[0]>>,<<(NDIMS())>>)
+shall be the dimension ID of the most slowly
+varying dimension.
+The maximum possible number of
+dimensions for a variable is given by the symbolic constant
+MACRO(MAX_VAR_DIMS).
+.TP
+IDIMID()
+is the ID of a netCDF dimension.
+netCDF dimension ID's are allocated sequentially from the 
+ifelse(API,C,non-negative, positive)
+integers beginning with ifelse(API,C,0,1).
+.TP
+INDIMS()
+is either the total number of dimensions in a netCDF dataset or the rank
+(i.e. the number of dimensions) of a netCDF variable.
+The value shall not be negative or greater than the symbolic constant 
+MACRO(MAX_VAR_DIMS).
+.TP
+IVARID()
+is the ID of a netCDF variable or (for the attribute-access functions) 
+the symbolic constant
+MACRO(GLOBAL),
+which is used to reference global attributes.
+netCDF variable ID's are allocated sequentially from the 
+ifelse(API,C,non-negative,positive)
+integers beginning with ifelse(API,C,0,1).
+.TP
+ONATTS()
+is the number of global attributes in a netCDF dataset  for the
+FREF(inquire)
+function or the number
+of attributes associated with a netCDF variable for the
+FREF(varinq)
+function.
+.TP
+IINDEX()
+specifies the indicial coordinates of the netCDF data value to be accessed.
+The indices start at ifelse(API,C,0,1);
+thus, for example, the first data value of a
+two-dimensional variable is ifelse(API,C,(0,0),(1,1)).
+The size of the vector shall be at least the rank of the associated
+netCDF variable and its elements shall correspond, in order, to the
+variable's dimensions.
+.TP
+ISTART()
+specifies the starting point
+for accessing a netCDF variable's data values
+in terms of the indicial coordinates of 
+the corner of the array section.
+The indices start at ifelse(API,C,0,1);
+thus, the first data
+value of a variable is ifelse(API,C,(0, 0, ..., 0),(1, 1, ..., 1)).
+The size of the vector shall be at least the rank of the associated
+netCDF variable and its elements shall correspond, in order, to the
+variable's dimensions.
+.TP
+ICOUNT()
+specifies the number of indices selected along each dimension of the
+array section.
+Thus, to access a single value, for example, specify COUNT() as
+(1, 1, ..., 1).
+Note that, for strided I/O, this argument must be adjusted
+to be compatible with the STRIDE() and START() arguments so that 
+the interaction of the
+three does not attempt to access an invalid data co-ordinate.
+The elements of the
+COUNT() vector correspond, in order, to the variable's dimensions.
+.TP
+ISTRIDE()
+specifies the sampling interval along each dimension of the netCDF
+variable.   The elements of the stride vector correspond, in order,
+to the netCDF variable's dimensions (ARG(stride)<<>>ifelse(API,C,[0],<<(1)>>))
+gives the sampling interval along the most ifelse(API,C,slowly,rapidly) 
+varying dimension of the netCDF variable).  Sampling intervals are
+specified in type-independent units of elements (a value of 1 selects
+consecutive elements of the netCDF variable along the corresponding
+dimension, a value of 2 selects every other element, etc.).
+ifelse(API,C,<<A NULL() stride argument is treated as (1, 1, ... , 1).>>)
+.TP
+IMAP()
+specifies the mapping between the dimensions of a netCDF variable and
+the in-memory structure of the internal data array.  The elements of
+the <<index>> mapping vector correspond, in order, to the netCDF variable's
+dimensions (ARG(imap)<<>>ifelse(API,C,[0],<<(1)>>) gives the distance
+between elements of the internal array corresponding to the most
+ifelse(API,C,slowly,rapidly) varying dimension of the netCDF variable).
+Distances between elements are specified in type-independent units of
+elements (the distance between internal elements that occupy adjacent
+memory locations is 1 and not the element's byte-length as in netCDF 2).
+ifelse(API,C,<<A NULL() pointer means the memory-resident values have
+the same structure as the associated netCDF variable.>>)
+.SH "VARIABLE PREFILLING"
+.LP
+By default, the netCDF interface sets the values of
+all newly-defined variables of finite length (i.e. those that do not have
+an unlimited, dimension) to the type-dependent fill-value associated with each 
+variable.  This is done when FREF(enddef)
+is called.  The
+fill-value for a variable may be changed from the default value by
+defining the attribute `CODE(_FillValue)' for the variable.  This
+attribute must have the same type as the variable and be of length one.
+.LP
+Variables with an unlimited dimension are also prefilled, but on
+an `as needed' basis.  For example, if the first write of such a
+variable is to position 5, then
+positions
+ifelse(API,C,0 through 4, 1 through 4)
+(and no others)
+would be set to the fill-value at the same time.
+.LP
+This default prefilling of data values may be disabled by
+or'ing the
+MACRO(NOFILL)
+flag into the mode parameter of FREF(open) or FREF(create),
+or, by calling the function FREF(set_fill)
+with the argument MACRO(NOFILL).
+For variables that do not use the unlimited dimension,
+this call must
+be made before
+FREF(enddef).
+For variables that
+use the unlimited dimension, this call
+may be made at any time.
+.LP
+One can obtain increased performance of the netCDF interface by using 
+this feature, but only at the expense of requiring the application to set
+every single data value.  The performance
+enhancing behavior of this function is dependent on the particulars of
+the implementation and dataset <<format>>.
+The flag value controlled by FREF(set_fill)
+is per netCDF ID,
+not per variable or per write. 
+Allowing this to change affects the degree to which
+a program can be effectively parallelized.
+Given all of this, we state that the use
+of this feature may not be available (or even needed) in future
+releases. Programmers are cautioned against heavy reliance upon this
+feature.
+.HP
+FDECL(setfill, (INCID(), IFILLMODE(), OOLDFILLMODE()))
+ifelse(API,C,
+<<.sp
+(Corresponds to FOLD(setfill) in version 2)>>)
+.sp
+Determines whether or not variable prefilling will be done (see 
+above).
+The netCDF dataset shall be writable.
+FILLMODE() is either MACRO(FILL)
+to enable prefilling (the
+default) or MACRO(NOFILL)
+to disable prefilling.
+This function returns the previous setting in OLDFILLMODE().
+ifelse(PARALLEL_IO,TRUE,
+<<.SH "PARALLEL I/O"
+.LP
+.HP
+FDECL(create_par, (IPATH(), ICMODE(), MPI_Comm comm, MPI_Info info, ONCID()))
+.sp
+Like FREF(create) but creates for parallel I/O access. The mode must specify a 
+netCDF-4/HDF5 dataset.
+.sp
+.HP
+FDECL(open_par, (IPATH(), IMODE(), MPI_Comm comm, MPI_Info info, ONCID()))
+.sp
+Opens for parallel I/O access. Must be a netCDF-4/HDF5 dataset.
+.HP
+FDECL(var_par_access, (INCID(), VARID(), IPARACCESS()))
+.sp
+May be used to change access to a variable from independent to collective data access.>>)
+.HP
+.SH "MPP FUNCTION DESCRIPTIONS"
+.LP
+Additional functions for use on SGI/Cray MPP machines (_CRAYMPP).
+These are used to set and inquire which PE is the base for MPP
+for a particular netCDF. These are only relevant when
+using the SGI/Cray ``global''
+Flexible File I/O layer and desire to have
+only a subset of PEs to open the specific netCDF file.
+For technical reasons, these functions are available on all platforms.
+On a platform other than SGI/Cray MPP, it is as if
+only processor available were processor 0.
+.LP
+To use this feature, you need to specify a communicator group and call
+CODE(glio_group_mpi(\|)) or CODE(glio_group_shmem(\|)) prior to the netCDF
+FREF(open) and FREF(create) calls.
+.HP
+FDECL(_create_mp, (IPATH(), ICMODE(), IINITSIZE(), IPE(), OCHUNKSIZE(), ONCID()))
+.sp
+Like FREF(_create) but allows the base PE to be set.
+.sp
+The argument ARG(pe) sets the base PE at creation time. In the MPP
+environment, FREF(_create) and FREF(create) set the base PE to processor
+zero by default.
+.HP
+FDECL(_open_mp, (IPATH(), IMODE(), IPE(), OCHUNKSIZE(), ONCID()))
+.sp
+Like FREF(_open) but allows the base PE to be set.
+The argument ARG(pe) sets the base PE at creation time. In the MPP
+environment, FREF(_open) and FREF(open) set the base PE to processor
+zero by default.
+.HP
+FDECL(inq_base_pe, (INCID(), OPE()))
+.sp
+Inquires of the netCDF dataset which PE is being used as the base for MPP use.
+This is safe to use at any time.
+.HP
+FDECL(set_base_pe, (INCID(), IPE()))
+.sp
+Resets the base PE for the netCDF dataset.
+Only perform this operation when the affected communicator group
+synchronizes before and after the call.
+This operation is very risky and should only be contemplated
+under only the most extreme cases.
+.SH "ENVIRONMENT VARIABLES"
+.TP 4
+.B NETCDF_FFIOSPEC
+Specifies the Flexible File I/O buffers for netCDF I/O when executing
+under the UNICOS operating system (the variable is ignored on other
+operating systems).
+An appropriate specification can greatly increase the efficiency of 
+netCDF I/O -- to the extent that it can actually surpass FORTRAN binary 
+I/O.
+This environment variable has been made a little more generalized,
+such that other FFIO option specifications can now be added.
+The default specification is \fBbufa:336:2\fP,
+unless a current FFIO specification is in operation,
+which will be honored.
+See UNICOS Flexible File I/O for more information.
+.SH "MAILING-LISTS"
+.LP
+Both a mailing list and a digest are available for
+discussion of the netCDF interface and announcements about netCDF bugs,
+fixes, and enhancements.
+To begin or change your subscription to either the mailing-list or the
+digest, send one of the following in the body (not
+the subject line) of an email message to "majordomo at unidata.ucar.edu".
+Use your email address in place of \fIjdoe at host.inst.domain\fP.
+.sp
+To subscribe to the netCDF mailing list:
+.RS
+\fBsubscribe netcdfgroup \fIjdoe at host.inst.domain\fR
+.RE
+To unsubscribe from the netCDF mailing list:
+.RS
+\fBunsubscribe netcdfgroup \fIjdoe at host.inst.domain\fR
+.RE
+To subscribe to the netCDF digest:
+.RS
+\fBsubscribe netcdfdigest \fIjdoe at host.inst.domain\fR
+.RE
+To unsubscribe from the netCDF digest:
+.RS
+\fBunsubscribe netcdfdigest \fIjdoe at host.inst.domain\fR
+.RE
+To retrieve the general introductory information for the mailing list:
+.RS
+\fBinfo netcdfgroup\fR
+.RE
+To get a synopsis of other majordomo commands:
+.RS
+\fBhelp\fR
+.RE
+.SH "SEE ALSO"
+.LP
+.BR ncdump (1),
+.BR ncgen (1),
+.BR netcdf (3<<>>ifelse(API,C,,f)).
+.LP
+\fInetCDF User's Guide\fP, published
+by the Unidata Program Center, University Corporation for Atmospheric
+Research, located in Boulder, Colorado.
+
+NetCDF home page at http:/www.unidata.ucar.edu/netcdf.
diff --git a/docs/netcdf_fortran.3 b/docs/netcdf_fortran.3
new file mode 100755
index 0000000..24571cd
--- /dev/null
+++ b/docs/netcdf_fortran.3
@@ -0,0 +1,1370 @@
+.nr yr \n(yr+1900
+.af mo 01
+.af dy 01
+.TH NETCDF 3 "1997-04-18" "Printed: \n(yr-\n(mo-\n(dy" "UNIDATA LIBRARY FUNCTIONS"
+.SH NAME
+netcdf \- Unidata's Network Common Data Form (netCDF) library interface
+.SH SYNOPSIS
+.ft B
+.na
+.nh
+include netcdf.inc
+.sp
+.SS Most Systems:
+f77 ...  -lnetcdf -lhdf5_hl -lhdf5 -lz -lm
+.sp
+.SS CRAY PVP Systems:
+f90 -dp -i64 ... -lnetcdf
+
+.ad
+.hy
+Complete documentation for the netCDF libraries can be found at the netCDF website: http://www.unidata.ucar.edu/software/netcdf/.
+.sp
+.SH "LIBRARY VERSION"
+.LP
+This document describes versions 3 and 4
+of Unidata netCDF data-access interface
+for the FORTRAN programming language.
+.HP
+\fBcharacter*80 nf_inq_libvers(void)\fR
+.sp
+Returns a string identifying the version of the netCDF library, and
+when it was built, like: "3.1a of Aug 22 1996 12:57:47 $".
+.LP
+The RCS \fBident(1)\fP command will find a string like
+"$\|Id: @\|(#) netcdf library version 3.1a of Sep  6 1996 15:56:26 $"
+in the library. The SCCS \fBwhat(1)\fP command will find a string like
+"netcdf library version 3.1a of Aug 23 1996 16:07:40 $".
+.SH "RETURN VALUES"
+.LP
+All netCDF functions (except
+\fBnf_inq_libvers(\|)\fR and \fBnf_strerror(\|)\fR) return an integer status.
+
+If this returned status value is not equal to
+\fBNF_NOERR\fR (zero), it
+indicates that an error occurred. The possible status values are defined in 
+netcdf.inc.
+.HP
+\fBcharacter*80 nf_strerror(integer \fIstatus\fP)\fR
+.sp
+Returns a string textual translation of the \fIstatus\fP
+value, like "Attribute or variable name contains illegal characters"
+or "No such file or directory".
+.sp
+.SH "FILE OPERATIONS"
+.LP
+.HP
+\fBinteger function nf_create(character*(*) \fIpath\fP, integer \fIcmode\fP, integer \fIncid\fP)\fR
+.sp
+Creates a new netCDF dataset at \fIpath\fP,
+returning a netCDF ID in \fIncid\fP.
+The argument \fIcmode\fP may include the bitwise-or
+of the following flags:
+\fBNF_NOCLOBBER\fR
+to protect existing datasets (default
+silently blows them away),
+\fBNF_SHARE\fR
+for synchronous dataset updates for classic format files
+(default is to buffer accesses),
+.sp
+When a netCDF dataset is created, is is opened
+\fBNF_WRITE\fR.
+The new netCDF dataset is in define mode.
+\fBNF_64BIT_OFFSET\fR.
+to create a file in the 64-bit offset format 
+(as opposed to classic format, the default). 
+\fBNF_TRUE\fR to create a netCDF-4/HDF5 file, 
+and \fBNF_CLASSIC_MODEL\fR to guarantee that netCDF-4/HDF5 files maintain compatibility 
+with the netCDF classic data model.
+.HP
+\fBinteger function nf__create(character*(*) \fIpath\fP, integer \fIcmode\fP, integer \fIinitialsize\fP, integer \fIchunksize\fP, integer \fIncid\fP)\fR
+.sp
+Like \fBnf_create(\|)\fR but has additional performance tuning parameters.
+.sp
+The argument \fIinitialsize\fP sets the initial size of the file at
+creation time.
+.sp
+See \fBnf__open(\|)\fR below for an explanation of the \fIchunksize\fP
+parameter.
+.HP
+\fBinteger function nf_open(character*(*) \fIpath\fP, integer \fImode\fP, integer \fIncid\fP)\fR
+.sp
+(Corresponds to \fBncopn(\|)\fR in version 2)
+.sp
+Opens a existing netCDF dataset at \fIpath\fP
+returning a netCDF ID
+in \fIncid\fP.
+The type of access is described by the \fImode\fP parameter,
+which may include the bitwise-or
+of the following flags:
+\fBNF_WRITE\fR
+for read-write access (default
+read-only),
+\fBNF_SHARE\fR
+for synchronous dataset updates (default is
+to buffer accesses), and
+\fBNF_LOCK\fR
+(not yet implemented).
+.sp
+As of NetCDF version 4.1, and if TRUE support was enabled
+when the NetCDF library was built, the path parameter
+may specify a TRUE URL. In this case, the access mode is
+forced to be read-only.
+.HP
+\fBinteger function nf__open(character*(*) \fIpath\fP, integer \fImode\fP, integer \fIchunksize\fP, integer \fIncid\fP)\fR
+.sp
+Like \fBnf_open(\|)\fR but has an additional performance tuning parameter.
+.sp
+The argument referenced by \fIchunksize\fP controls a space versus time
+tradeoff, memory allocated in the netcdf library versus number of system
+calls.
+Because of internal requirements, the value may not be set to exactly
+the value requested.
+The actual value chosen is returned by reference.
+Using the value \fBNF_SIZEHINT_DEFAULT\fR causes the library to choose a
+default.
+How the system choses the default depends on the system.
+On many systems, the "preferred I/O block size" is available from the 
+\fBstat()\fR system call, \fBstruct stat\fR member \fBst_blksize\fR.
+If this is available it is used. Lacking that, twice the system pagesize
+is used.
+Lacking a call to discover the system pagesize, we just set default
+chunksize to 8192.
+.sp
+The chunksize is a property of a given open netcdf descriptor
+\fIncid\fP, it is not a persistent property of the netcdf dataset.
+.sp
+As with \fBnf__open(\|)\fR, the path parameter
+may specify a TRUE URL, but the tuning parameters are ignored.
+.HP
+\fBinteger function nf_redef(integer \fIncid\fP)\fR
+.sp
+(Corresponds to \fBncredf(\|)\fR in version 2)
+.sp
+Puts an open netCDF dataset into define mode, 
+so dimensions, variables, and attributes can be added or renamed and 
+attributes can be deleted.
+.HP
+\fBinteger function nf_enddef(integer \fIncid\fP)\fR
+.sp
+(Corresponds to \fBncendf(\|)\fR in version 2)
+.sp
+Takes an open netCDF dataset out of define mode.
+The changes made to the netCDF dataset
+while it was in define mode are checked and committed to disk if no
+problems occurred.  Some data values may be written as well,
+see "VARIABLE PREFILLING" below.
+After a successful call, variable data can be read or written to the dataset.
+.HP
+\fBinteger function nf__enddef(integer \fIncid\fP, integer \fIh_minfree\fP, integer \fIv_align\fP, integer \fIv_minfree\fP, integer \fIr_align\fP)\fR
+.sp
+Like \fBnf_enddef(\|)\fR but has additional performance tuning parameters.
+.sp
+Caution: this function exposes internals of the netcdf version 1 file
+format.
+It may not be available on future netcdf implementations.
+.sp
+The current netcdf file format has three sections,
+the "header" section, the data section for fixed size variables, and
+the data section for variables which have an unlimited dimension (record
+variables).
+The header begins at the beginning of the file. The index
+(offset) of the beginning of the other two sections is contained in the
+header. Typically, there is no space between the sections. This causes
+copying overhead to accrue if one wishes to change the size of the
+sections,
+as may happen when changing names of things, text attribute values,
+adding
+attributes or adding variables. Also, for buffered i/o, there may be
+advantages
+to aligning sections in certain ways.
+.sp
+The minfree parameters allow one to control costs of future calls
+to \fBnf_redef(\|)\fR, \fBnf_enddef(\|)\fR by requesting that \fIminfree\fP bytes be
+available at the end of the section.
+The \fIh_minfree\fP parameter sets the pad
+at the end of the "header" section. The \fIv_minfree\fP parameter sets
+the pad at the end of the data section for fixed size variables.
+.sp
+The align parameters allow one to set the alignment of the beginning of
+the corresponding sections. The beginning of the section is rounded up
+to an index which is a multiple of the align parameter. The flag value
+\fBNF_ALIGN_CHUNK\fR tells the library to use the chunksize (see above)
+as the align parameter.
+The \fIv_align\fP parameter controls the alignment of the beginning of
+the data section for fixed size variables.
+The \fIr_align\fP parameter controls the alignment of the beginning of
+the data section for variables which have an unlimited dimension (record
+variables).
+.sp
+The file format requires mod 4 alignment, so the align parameters
+are silently rounded up to multiples of 4. The usual call,
+\fBnf_enddef(\fIncid\fP)\fR
+is equivalent to
+\fBnf__enddef(\fIncid\fP, 0, 4, 0, 4)\fR.
+.sp
+The file format does not contain a "record size" value, this is
+calculated from the sizes of the record variables. This unfortunate fact
+prevents us from providing minfree and alignment control of the
+"records"
+in a netcdf file. If you add a variable which has an unlimited
+dimension,
+the third section will always be copied with the new variable added.
+.HP
+\fBinteger function nf_sync(integer \fIncid\fP)\fR
+.sp
+(Corresponds to \fBncsnc(\|)\fR in version 2)
+.sp
+Unless the
+\fBNF_SHARE\fR
+bit is set in
+\fBnf_open(\|)\fR or \fBnf_create(\|)\fR,
+accesses to the underlying netCDF dataset are
+buffered by the library. This function synchronizes the state of
+the underlying dataset and the library.
+This is done automatically by
+\fBnf_close(\|)\fR and \fBnf_enddef(\|)\fR.
+.HP
+\fBinteger function nf_abort(integer \fIncid\fP)\fR
+.sp
+(Corresponds to \fBncabor(\|)\fR in version 2)
+.sp
+You don't need to call this function.
+This function is called automatically by
+\fBnf_close(\|)\fR
+if the netCDF was in define mode and something goes wrong with the commit.
+If the netCDF dataset isn't in define mode, then this function is equivalent to
+\fBnf_close(\|)\fR.
+If it is called after
+\fBnf_redef(\|)\fR,
+but before
+\fBnf_enddef(\|)\fR,
+the new definitions are not committed and the dataset is closed.
+If it is called after
+\fBnf_create(\|)\fR
+but before
+\fBnf_enddef(\|)\fR,
+the dataset disappears.
+.HP
+\fBinteger function nf_close(integer \fIncid\fP)\fR
+.sp
+(Corresponds to
+\fBncclos(\|)\fR in version 2)
+.sp
+Closes an open netCDF dataset.
+If the dataset is in define mode,
+\fBnf_enddef(\|)\fR
+will be called before closing.
+After a dataset is closed, its ID may be reassigned to another dataset.
+.HP
+\fBinteger function nf_inq(integer \fIncid\fP, integer \fIndims\fP, integer \fInvars\fP,
+integer \fInatts\fP, integer \fIunlimdimid\fP)\fR
+.HP
+\fBinteger function nf_inq_ndims(integer \fIncid\fP, integer \fIndims\fP)\fR
+.HP
+\fBinteger function nf_inq_nvars(integer \fIncid\fP, integer \fInvars\fP)\fR
+.HP
+\fBinteger function nf_inq_natts(integer \fIncid\fP, integer \fInatts\fP)\fR
+.HP
+\fBinteger function nf_inq_unlimdim(integer \fIncid\fP, integer \fIunlimdimid\fP)\fR
+.HP
+\fBinteger function nf_inq_format(integer \fIncid\fP, integer \fIformatn\fP)\fR
+.sp
+Use these functions to find out what is in a netCDF dataset.
+Upon successful return,
+\fIndims\fP will contain  the
+number of dimensions defined for this netCDF dataset,
+\fInvars\fP will contain the number of variables,
+\fInatts\fP will contain the number of attributes, and
+\fIunlimdimid\fP will contain the
+dimension ID of the unlimited dimension if one exists, or
+0 otherwise.
+\fIformatn\fP will contain the version number of the dataset <format>, one of
+\fBNF_FORMAT_CLASSIC\fR, \fBNF_FORMAT_64BIT\fR, \fBNF_FORMAT_NETCDF4\fR, or
+\fBNF_FORMAT_NETCDF4_CLASSIC\fR.
+
+.HP
+\fBinteger function nf_def_dim(integer \fIncid\fP, character*(*) \fIname\fP, integer \fIlen\fP, integer \fIdimid\fP)\fR
+.sp
+(Corresponds to \fBncddef(\|)\fR in version 2)
+.sp
+Adds a new dimension to an open netCDF dataset, which must be 
+in define mode.
+\fIname\fP is the dimension name.
+\fIdimid\fP will contain the dimension ID of the newly created dimension.
+
+.SH "USER DEFINED TYPES"
+.LP
+Users many define types for a netCDF-4/HDF5 file (unless the
+\fBNF_CLASSIC_MODEL\fR was used when the file was creates). Users may
+define compound types, variable length arrays, enumeration types, and
+opaque types.
+.sp
+
+.HP
+\fBinteger function nf_def_compound(integer \fIncid\fP, integer \fIsize\fP, character*(*) \fIname\fP, integer \fItypeidp\fP)\fR
+.sp
+Define a compound type.
+.HP
+\fBinteger function nf_insert_compound(integer \fIncid\fP, integer \fI\fP, character*(*) \fIname\fP, integer \fIoffset\fP, integer \fIfield_typeid\fP)\fR
+.sp
+Insert an element into a compound type. May not be done after type has been used, or after the type has been written by an enddef.
+.HP
+\fBinteger function nf_insert_array_compound(integer \fIncid\fP, integer \fI\fP, character*(*) \fIname\fP, integer \fIoffset\fP, integer \fIfield_typeid\fP, integer \fIndims\fP, integer \fIdim_sizes\fP(1))\fR
+.sp 
+Insert an array into a compound type.
+.HP
+\fBinteger function nf_inq_type(integer \fIncid\fP, integer \fI\fP, character*(*) \fIname\fP, integer \fIsizep\fP)\fR
+.sp
+Learn about a type.
+.HP
+\fBinteger function nf_inq_compound(integer \fIncid\fP, integer \fI\fP, character*(*) \fIname\fP, integer \fIsizep\fP, integer \fInfieldsp\fP)\fR
+.HP
+\fBinteger function nf_inq_compound_name(integer \fIncid\fP, integer \fI\fP, character*(*) \fIname\fP)\fR
+.HP
+\fBinteger function nf_inq_compound_size(integer \fIncid\fP, integer \fI\fP, integer \fIsizep\fP)\fR
+.HP
+\fBinteger function nf_inq_compound_nfields(integer \fIncid\fP, integer \fI\fP, integer \fInfieldsp\fP)\fR
+.HP
+\fBinteger function nf_inq_compound_fieldname(integer \fIncid\fP, integer \fI\fP, integer \fIfieldid\fP, character*(*) \fIname\fP)\fR
+.HP
+\fBinteger function nf_inq_compound_fieldindex(integer \fIncid\fP, integer \fI\fP, character*(*) \fIname\fP, integer \fIfieldidp\fP)\fR
+.HP
+\fBinteger function nf_inq_compound_fieldoffset(integer \fIncid\fP, integer \fI\fP, integer \fIfieldid\fP, integer \fIoffsetp\fP)\fR
+.HP
+\fBinteger function nf_inq_compound_fieldtype(integer \fIncid\fP, integer \fI\fP, integer \fIfieldid\fP, integer \fIfield_typeid\fP)\fR
+.HP
+\fBinteger function nf_inq_compound_fieldndims(integer \fIncid\fP, integer \fI\fP, integer \fIfieldid\fP, integer \fIndims\fP)\fR
+.HP
+\fBinteger function nf_inq_compound_fielddim_sizes(integer \fIncid\fP, integer \fI\fP, integer \fIfieldid\fP, integer \fIdim_sizes\fP(1))\fR
+.sp
+Learn about a compound type.
+.HP
+\fBinteger function nf_def_vlen(integer \fIncid\fP, character*(*) \fIname\fP, integer \fIbase_typeid\fP, integer \fIxtypep\fP)\fR
+.sp
+Create a varaible length array type.
+.HP
+\fBinteger function nf_inq_vlen(integer \fIncid\fP, integer \fI\fP, character*(*) \fIname\fP, integer \fIdatum_sizep\fP, integer \fIbase_nc_typep\fP)\fR
+.sp
+Learn about a varaible length array type.
+.HP
+\fBinteger function nf_free_vlen(nc_vlen_t *vl)\fR
+.sp
+Free memory comsumed by reading data of a varaible length array type.
+.HP
+\fBinteger function nf_put_vlen_element(integer \fIncid\fP, integer \fI\fP, void * \fIvlen_element\fP, integer \fIlen\fP, void * \fIdata\fP)\fR
+.sp
+Write one VLEN.
+.HP
+\fBinteger function nf_get_vlen_element(integer \fIncid\fP, integer \fI\fP, void * \fIvlen_element\fP, integer \fIlen\fP, void * \fIdata\fP)\fR
+.sp
+Read one VLEN.
+.HP
+\fBinteger function nf_free_string(integer \fIlen\fP, char **data)\fR
+.sp
+Free memory comsumed by reading data of a string type.
+.HP
+\fBinteger function nf_inq_user_type(integer \fIncid\fP, integer \fI\fP, character*(*) \fIname\fP, integer \fI\fP, integer \fI\fP, integer \fI\fP, integer \fI\fP)\fR
+.sp
+Learn about a user define type.
+.HP
+\fBinteger function nf_def_enum(integer \fIncid\fP, integer \fIbase_typeid\fP, character*(*) \fIname\fP, integer \fItypeidp\fP)\fR
+.sp
+Define an enumeration type.
+.HP
+\fBinteger function nf_insert_enum(integer \fIncid\fP, integer \fIbase_typeid\fP, character*(*) \fIname\fP, const void *value)\fR
+.sp
+Insert a name-value pair into enumeration type.
+.HP
+\fBinteger function nf_inq_enum_member(integer \fIncid\fP, integer \fIxtype\fP, integer \fIidx\fP, character*(*) \fIname\fP, void *value)\fR
+.HP
+\fBinteger function nf_inq_enum_ident(integer \fIncid\fP, integer \fIxtype\fP, integer \fIidx\fP, integer*8 \fIvalue\fP, character*(*) \fIidentifier\fP)\fR
+.sp
+Learn about a name-value pair into enumeration type.
+.HP
+\fBinteger function nf_def_opaque(integer \fIncid\fP, integer \fIsize\fP, character*(*) \fIname\fP, integer \fIxtypep\fP)\fR
+.sp
+Create an opaque type.
+.HP
+\fBinteger function nf_inq_opaque(integer \fIncid\fP, integer \fIxtype\fP, character*(*) \fIname\fP, integer \fIsizep\fP)\fR
+.sp
+Learn about opaque type.
+.HP
+.SH "GROUPS"
+.sp
+Users may organize data into hierarchical groups in netCDF-4/HDF5 files (unless \fBNF_CLASSIC_MODEL\fR was used when creating the file).
+.HP
+\fBinteger function nf_inq_grps(integer \fIncid\fP, integer \fInumgrps\fP, integer \fIncids\fP(1))\fR
+.sp
+Learn how many groups (and their ncids) are available from the group represented by ncid.
+.HP
+\fBinteger function nf_inq_grpname(integer \fIncid\fP, character*(*) \fIname\fP)\fR
+.HP
+\fBinteger function nf_inq_grpname_full(integer \fIncid\fP, integer \fIlen\fP, character*(*) \fIname\fP)\fR
+.HP
+\fBinteger function nf_inq_grpname_len(integer \fIncid\fP, integer \fIlen\fP)\fR
+.HP
+\fBinteger function nf_inq_grp_parent(integer \fIncid\fP, integer \fIncid\fP)\fR
+.HP
+\fBinteger function nf_inq_grp_ncid(integer \fIncid\fP, character*(*) \fIname\fP, integer \fIncid\fP)\fR
+.HP
+\fBinteger function nf_inq_full_ncid(integer \fIncid\fP, character*(*) \fIname\fP, integer \fIncid\fP)\fR
+.sp
+Learn about a group.
+.HP
+\fBinteger function nf_inq_varids(integer \fIncid\fP, integer \fInvars\fP, integer \fI\fP)\fR
+.sp
+Get the varids in a group.
+.HP
+\fBinteger function nf_inq_dimids(integer \fIncid\fP, integer \fIndims\fP, integer \fIdimids\fP, integer \fIinclude_parents\fP)\fR
+.sp
+Get the dimids in a group and (potentially) its parents.
+.HP
+\fBinteger function nf_inq_typeids(integer \fIncid\fP, integer \fIntypes\fP, integer \fItypeids\fP(1))\fR
+.sp
+Get the typeids of user-defined types in a group.
+.HP
+\fBinteger function nf_def_grp(integer \fIncid\fP, character*(*) \fIname\fP, integer \fIncid\fP)\fR
+.sp
+Create a group.
+.LP
+
+.SH "DIMENSIONS"
+.LP
+.HP
+\fBinteger function nf_inq_dimid(integer \fIncid\fP, character*(*) \fIname\fP, integer \fIdimid\fP)\fR
+.sp
+(Corresponds to \fBncdid(\|)\fR in version 2)
+.sp
+Given a dimension name, returns the ID of a netCDF dimension in \fIdimid\fP.
+.HP
+\fBinteger function nf_inq_dim(integer \fIncid\fP, integer \fIdimid\fP, character*(*) \fIname\fP, integer \fIlen\fP)\fR
+.HP
+\fBinteger function nf_inq_dimname(integer \fIncid\fP, integer \fIdimid\fP, character*(*) \fIname\fP)\fR
+.HP
+\fBinteger function nf_inq_dimlen(integer \fIncid\fP, integer \fIdimid\fP, integer \fIlen\fP)\fR
+.sp
+Use these functions to find out about a dimension.
+
+\fIname\fP should be  big enough (\fBNF_MAX_NAME\fR)
+to hold the dimension name as the name will be copied into your storage.
+The length return parameter, \fIlen\fP
+will contain the size of the dimension.
+For the unlimited dimension, the returned length is the current
+maximum value used for writing into any of the variables which use
+the dimension.
+.HP
+\fBinteger function nf_rename_dim(integer \fIncid\fP, integer \fIdimid\fP, character*(*) \fIname\fP)\fR
+.sp
+(Corresponds to \fBncdren(\|)\fR in version 2)
+.sp
+Renames an existing dimension in an open netCDF dataset.
+If the new name is longer than the old name, the netCDF dataset must be in 
+define mode.
+You cannot rename a dimension to have the same name as another dimension.
+.SH "VARIABLES"
+.LP
+.HP
+\fBinteger function nf_def_var(integer \fIncid\fP, character*(*) \fIname\fP, integer \fIxtype\fP, integer \fIndims\fP, integer \fIdimids\fP(1), integer \fIvarid\fP)\fR
+.sp
+(Corresponds to \fBncvdef(\|)\fR in version 2)
+.sp
+Adds a new variable to a netCDF dataset. The netCDF must be in define mode.
+\fIvarid\fP will be set to the netCDF variable ID.
+.HP
+\fBinteger function nf_inq_varid(integer \fIncid\fP, character*(*) \fIname\fP, integer \fIvarid\fP)\fR
+.sp
+(Corresponds to \fBncvid(\|)\fR in version 2)
+.sp
+Returns the ID of a netCDF variable in \fIvarid\fP given its name.
+.HP
+\fBinteger function nf_inq_var(integer \fIncid\fP, integer \fIvarid\fP, character*(*) \fIname\fP, integer \fIxtype\fP, integer \fIndims\fP, integer \fIdimids\fP(1),
+integer \fInatts\fP)\fR
+.HP
+\fBinteger function nf_inq_varname(integer \fIncid\fP, integer \fIvarid\fP, character*(*) \fIname\fP)\fR
+.HP
+\fBinteger function nf_inq_vartype(integer \fIncid\fP, integer \fIvarid\fP, integer \fIxtype\fP)\fR
+.HP
+\fBinteger function nf_inq_varndims(integer \fIncid\fP, integer \fIvarid\fP, integer \fIndims\fP)\fR
+.HP
+\fBinteger function nf_inq_vardimid(integer \fIncid\fP, integer \fIvarid\fP, integer \fIdimids\fP(1))\fR
+.HP
+\fBinteger function nf_inq_varnatts(integer \fIncid\fP, integer \fIvarid\fP, integer \fInatts\fP)\fR
+.sp
+Returns information about a netCDF variable, given its ID.
+
+.HP
+\fBinteger function nf_rename_var(integer \fIncid\fP, integer \fIvarid\fP, character*(*) \fIname\fP)\fR
+.sp
+(Corresponds to \fBncvren(\|)\fR in version 2)
+.sp
+Changes the name of a netCDF variable.
+If the new name is longer than the old name, the netCDF must be in define mode.
+You cannot rename a variable to have the name of any existing variable.
+
+.SH "VARIABLES \fIin\fP NETCDF-4 FILES"
+.LP
+The following functions may only be used on variables in a
+netCDF-4/HDF5 data file. These functions must be called after the
+variable is defined, but before an enddef call.
+.sp
+\fBinteger function nf_def_var_deflate(integer \fIncid\fP, integer \fIvarid\fP, integer \fIshuffle\fP, integer \fIdeflate\fP, integer \fIdeflate_level\fP)\fR
+.sp
+Turn on compression and/or shuffle filter. (Shuffle filter is only useful for integer data.)
+.HP
+\fBinteger function nf_inq_var_deflate(integer \fIncid\fP, integer \fIvarid\fP, integer \fIshufflep\fP, integer \fIdeflatep\fP, integer \fIdeflate_levelp\fP)\fR
+.sp
+Learn about a variable's deflate settings.
+.HP
+\fBinteger function nf_def_var_fletcher32(integer \fIncid\fP, integer \fIvarid\fP, integer \fIfletcher32\fP)\fR
+.sp
+Turn on checksumming for a variable.
+.HP
+\fBinteger function nf_inq_var_fletcher32(integer \fIncid\fP, integer \fIvarid\fP, integer \fIfletcher32\fP)\fR
+.sp
+Learn about checksumming for a variable.
+.HP
+\fBinteger function nf_def_var_chunking(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstorage\fP, integer \fIchunksizesp\fP(1))\fR
+.sp
+Set chunksizes for a variable.
+.HP
+\fBinteger function nf_inq_var_chunking(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstoragep\fP, integer \fIchunksizesp\fP(1))\fR
+.sp
+Learn about chunksizes for a variable.
+.HP
+\fBinteger function nf_def_var_fill(integer \fIncid\fP, integer \fIvarid\fP, integer \fIno_fill\fP, integer \fIchunksizesp\fP(1))\fR
+.sp
+Set a fill value for a variable.
+.HP
+\fBinteger function nf_inq_var_fill(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstoragep\fP, integer \fIchunksizesp\fP(1))\fR
+.sp
+Learn the fill value for a variable.
+.HP
+\fBinteger function nf_def_var_endian(integer \fIncid\fP, integer \fIvarid\fP, integer \fIendian\fP)\fR
+.sp
+Set endianness of variable.
+.HP
+\fBinteger function nf_inq_var_endian(integer \fIncid\fP, integer \fIvarid\fP, integer \fIendianp\fP)\fR
+.sp
+Learn the endianness of a variable.
+.HP
+
+.SH "WRITING AND READING WHOLE VARIABLES"
+.LP
+.HP
+\fBinteger function nf_put_var_text(integer \fIncid\fP, integer \fIvarid\fP, character*(*) \fIout\fP)\fR
+
+.HP
+\fBinteger function nf_put_var_int1(integer \fIncid\fP, integer \fIvarid\fP, integer*1 \fIout\fP(1))\fR
+.HP
+\fBinteger function nf_put_var_int2(integer \fIncid\fP, integer \fIvarid\fP, integer*2 \fIout\fP(1))\fR
+.HP
+\fBinteger function nf_put_var_int(integer \fIncid\fP, integer \fIvarid\fP, integer \fIout\fP(1))\fR
+
+.HP
+\fBinteger function nf_put_var_real(integer \fIncid\fP, integer \fIvarid\fP, real \fIout\fP(1))\fR
+.HP
+\fBinteger function nf_put_var_double(integer \fIncid\fP, integer \fIvarid\fP, doubleprecision \fIout\fP(1))\fR
+.HP
+\fBinteger function nf_put_var_ubyte(integer \fIncid\fP, integer \fIvarid\fP, integer*1 \fIout\fP(1))\fR
+.HP
+\fBinteger function nf_put_var_ushort(integer \fIncid\fP, integer \fIvarid\fP, integer*2 \fIout\fP(1))\fR
+.HP
+\fBinteger function nf_put_var_uint(integer \fIncid\fP, integer \fIvarid\fP, integer*4 \fIout\fP(1))\fR
+.HP
+\fBinteger function nf_put_var_(integer \fIncid\fP, integer \fIvarid\fP, integer*8 \fIout\fP(1))\fR
+.HP
+\fBinteger function nf_put_var_uint64(integer \fIncid\fP, integer \fIvarid\fP, integer*8 \fIout\fP(1))\fR
+.HP
+\fBinteger function nf_put_var_string(integer \fIncid\fP, integer \fIvarid\fP, character* \fIout\fP(1))\fR
+
+
+.sp
+Writes an entire netCDF variable (i.e. all the values).  The netCDF
+dataset must be open and in data mode.  The type of the data is
+specified in the function name, and it is converted to the external
+type of the specified variable, if possible, otherwise an
+\fBNF_ERANGE\fR error is returned. Note that rounding is not performed
+during the conversion. Floating point numbers are truncated when
+converted to integers.
+.HP
+\fBinteger function nf_get_var_text(integer \fIncid\fP, integer \fIvarid\fP, character*(*) \fIin\fP)\fR
+
+.HP
+\fBinteger function nf_get_var_int1(integer \fIncid\fP, integer \fIvarid\fP, integer*1 \fIin\fP(1))\fR
+.HP
+\fBinteger function nf_get_var_int2(integer \fIncid\fP, integer \fIvarid\fP, integer*2 \fIin\fP(1))\fR
+.HP
+\fBinteger function nf_get_var_int(integer \fIncid\fP, integer \fIvarid\fP, integer \fIin\fP(1))\fR
+
+.HP
+\fBinteger function nf_get_var_real(integer \fIncid\fP, integer \fIvarid\fP, real \fIin\fP(1))\fR
+.HP
+\fBinteger function nf_get_var_double(integer \fIncid\fP, integer \fIvarid\fP, doubleprecision \fIin\fP(1))\fR
+.HP
+\fBinteger function nf_get_var_ubyte(integer \fIncid\fP, integer \fIvarid\fP, integer*1 \fIin\fP(1))\fR
+.HP
+\fBinteger function nf_get_var_ushort(integer \fIncid\fP, integer \fIvarid\fP, integer*2 \fIin\fP(1))\fR
+.HP
+\fBinteger function nf_get_var_uint(integer \fIncid\fP, integer \fIvarid\fP, integer*4 \fIin\fP(1))\fR
+.HP
+\fBinteger function nf_get_var_(integer \fIncid\fP, integer \fIvarid\fP, integer*8 \fIin\fP(1))\fR
+.HP
+\fBinteger function nf_get_var_uint64(integer \fIncid\fP, integer \fIvarid\fP, integer*8 \fIin\fP(1))\fR
+.HP
+\fBinteger function nf_get_var_string(integer \fIncid\fP, integer \fIvarid\fP, character* \fIin\fP(1))\fR
+
+
+.sp
+Reads an entire netCDF variable (i.e. all the values).
+The netCDF dataset must be open and in data mode.  
+The data is converted from the external type of the specified variable,
+if necessary, to the type specified in the function name.  If conversion is
+not possible, an \fBNF_ERANGE\fR error is returned.
+.SH "WRITING AND READING ONE DATUM"
+.LP
+.HP
+\fBinteger function nf_put_var1_text(integer \fIncid\fP, integer \fIvarid\fP, integer \fIindex\fP(1), character*1 \fI*out\fP)\fR
+
+.HP
+\fBinteger function nf_put_var1_int1(integer \fIncid\fP, integer \fIvarid\fP, integer \fIindex\fP(1), integer*1 \fI*out\fP)\fR
+.HP
+\fBinteger function nf_put_var1_int2(integer \fIncid\fP, integer \fIvarid\fP, integer \fIindex\fP(1), integer*2 \fI*out\fP)\fR
+.HP
+\fBinteger function nf_put_var1_int(integer \fIncid\fP, integer \fIvarid\fP, integer \fIindex\fP(1), integer \fI*out\fP)\fR
+
+.HP
+\fBinteger function nf_put_var1_real(integer \fIncid\fP, integer \fIvarid\fP, integer \fIindex\fP(1), real \fI*out\fP)\fR
+.HP
+\fBinteger function nf_put_var1_double(integer \fIncid\fP, integer \fIvarid\fP, integer \fIindex\fP(1), doubleprecision \fI*out\fP)\fR
+.HP
+\fBinteger function nf_put_var1_ubyte(integer \fIncid\fP, integer \fIvarid\fP, integer \fIindex\fP(1), integer*1 \fI*out\fP)\fR
+.HP
+\fBinteger function nf_put_var1_ushort(integer \fIncid\fP, integer \fIvarid\fP, integer \fIindex\fP(1), integer*2 \fI*out\fP)\fR
+.HP
+\fBinteger function nf_put_var1_uint(integer \fIncid\fP, integer \fIvarid\fP, integer \fIindex\fP(1), integer*4 \fI*out\fP)\fR
+.HP
+\fBinteger function nf_put_var1_(integer \fIncid\fP, integer \fIvarid\fP, integer \fIindex\fP(1), integer*8 \fI*out\fP)\fR
+.HP
+\fBinteger function nf_put_var1_uint64(integer \fIncid\fP, integer \fIvarid\fP, integer \fIindex\fP(1), integer*8 \fI*out\fP)\fR
+.HP
+\fBinteger function nf_put_var1_string(integer \fIncid\fP, integer \fIvarid\fP, integer \fIindex\fP(1), character* \fI*out\fP)\fR
+
+
+.sp
+Puts a single data value into a variable at the position \fIindex\fP of an
+open netCDF dataset that is in data mode.  The type of the data is
+specified in the function name, and it is converted to the external type
+of the specified variable, if possible, otherwise an \fBNF_ERANGE\fR
+error is returned.
+.HP
+\fBinteger function nf_get_var1_text(integer \fIncid\fP, integer \fIvarid\fP, integer \fIindex\fP(1), character*1 \fIin\fP)\fR
+
+.HP
+\fBinteger function nf_get_var1_int1(integer \fIncid\fP, integer \fIvarid\fP, integer \fIindex\fP(1), integer*1 \fIin\fP)\fR
+.HP
+\fBinteger function nf_get_var1_int2(integer \fIncid\fP, integer \fIvarid\fP, integer \fIindex\fP(1), integer*2 \fIin\fP)\fR
+.HP
+\fBinteger function nf_get_var1_int(integer \fIncid\fP, integer \fIvarid\fP, integer \fIindex\fP(1), integer \fIin\fP)\fR
+
+.HP
+\fBinteger function nf_get_var1_real(integer \fIncid\fP, integer \fIvarid\fP, integer \fIindex\fP(1), real \fIin\fP)\fR
+.HP
+\fBinteger function nf_get_var1_double(integer \fIncid\fP, integer \fIvarid\fP, integer \fIindex\fP(1), doubleprecision \fIin\fP)\fR
+.HP
+\fBinteger function nf_get_var1_ubyte(integer \fIncid\fP, integer \fIvarid\fP, integer \fIindex\fP(1), integer*1 \fIin\fP)\fR
+.HP
+\fBinteger function nf_get_var1_ushort(integer \fIncid\fP, integer \fIvarid\fP, integer \fIindex\fP(1), integer*2 \fIin\fP)\fR
+.HP
+\fBinteger function nf_get_var1_uint(integer \fIncid\fP, integer \fIvarid\fP, integer \fIindex\fP(1), integer*4 \fIin\fP)\fR
+.HP
+\fBinteger function nf_get_var1_(integer \fIncid\fP, integer \fIvarid\fP, integer \fIindex\fP(1), integer*8 \fIin\fP)\fR
+.HP
+\fBinteger function nf_get_var1_uint64(integer \fIncid\fP, integer \fIvarid\fP, integer \fIindex\fP(1), integer*8 \fIin\fP)\fR
+.HP
+\fBinteger function nf_get_var1_string(integer \fIncid\fP, integer \fIvarid\fP, integer \fIindex\fP(1), character* \fIin\fP)\fR
+
+
+.sp
+Gets a single data value from a variable at the position \fIindex\fP
+of an open netCDF dataset that is in data mode.  
+The data is converted from the external type of the specified variable,
+if necessary, to the type specified in the function name.  If conversion is
+not possible, an \fBNF_ERANGE\fR error is returned.
+.SH "WRITING AND READING AN ARRAY"
+.LP
+.HP
+\fBinteger function nf_put_vara_text(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), character*(*) \fIout\fP)\fR
+
+.HP
+\fBinteger function nf_put_vara_int1(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), integer*1 \fIout\fP(1))\fR
+.HP
+\fBinteger function nf_put_vara_int2(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), integer*2 \fIout\fP(1))\fR
+.HP
+\fBinteger function nf_put_vara_int(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), integer \fIout\fP(1))\fR
+
+.HP
+\fBinteger function nf_put_vara_real(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), real \fIout\fP(1))\fR
+.HP
+\fBinteger function nf_put_vara_double(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), doubleprecision \fIout\fP(1))\fR
+.HP
+\fBinteger function nf_put_vara_ubyte(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), integer*1 \fIout\fP(1))\fR
+.HP
+\fBinteger function nf_put_vara_ushort(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), integer*2 \fIout\fP(1))\fR
+.HP
+\fBinteger function nf_put_vara_uint(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), integer*4 \fIout\fP(1))\fR
+.HP
+\fBinteger function nf_put_vara_(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), integer*8 \fIout\fP(1))\fR
+.HP
+\fBinteger function nf_put_vara_uint64(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), integer*8 \fIout\fP(1))\fR
+.HP
+\fBinteger function nf_put_vara_string(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), character* \fIout\fP(1))\fR
+
+
+.sp
+Writes an array section of values into a netCDF variable of an open
+netCDF dataset, which must be in data mode.  The array section is specified
+by the \fIstart\fP and \fIcount\fP vectors, which give the starting index
+and count of values along each dimension of the specified variable.
+The type of the data is
+specified in the function name and is converted to the external type
+of the specified variable, if possible, otherwise an \fBNF_ERANGE\fR
+error is returned.
+.HP
+\fBinteger function nf_get_vara_text(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), character*(*) \fIin\fP)\fR
+
+.HP
+\fBinteger function nf_get_vara_int1(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), integer*1 \fIin\fP(1))\fR
+.HP
+\fBinteger function nf_get_vara_int2(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), integer*2 \fIin\fP(1))\fR
+.HP
+\fBinteger function nf_get_vara_int(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), integer \fIin\fP(1))\fR
+
+.HP
+\fBinteger function nf_get_vara_real(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), real \fIin\fP(1))\fR
+.HP
+\fBinteger function nf_get_vara_double(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), doubleprecision \fIin\fP(1))\fR
+.HP
+\fBinteger function nf_get_vara_ubyte(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), integer*1 \fIin\fP(1))\fR
+.HP
+\fBinteger function nf_get_vara_ushort(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), integer*2 \fIin\fP(1))\fR
+.HP
+\fBinteger function nf_get_vara_uint(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), integer*4 \fIin\fP(1))\fR
+.HP
+\fBinteger function nf_get_vara_(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), integer*8 \fIin\fP(1))\fR
+.HP
+\fBinteger function nf_get_vara_uint64(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), integer*8 \fIin\fP(1))\fR
+.HP
+\fBinteger function nf_get_vara_string(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), character* \fIin\fP(1))\fR
+
+
+.sp
+Reads an array section of values from a netCDF variable of an open
+netCDF dataset, which must be in data mode.  The array section is specified
+by the \fIstart\fP and \fIcount\fP vectors, which give the starting index
+and count of values along each dimension of the specified variable.
+The data is converted from the external type of the specified variable,
+if necessary, to the type specified in the function name.  If conversion is
+not possible, an \fBNF_ERANGE\fR error is returned.
+.SH "WRITING AND READING A SLICED ARRAY"
+.LP
+.HP
+\fBinteger function nf_put_vars_text(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), integer \fIstride\fP(1), character*(*) \fIout\fP)\fR
+
+.HP
+\fBinteger function nf_put_vars_int1(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), integer \fIstride\fP(1), integer*1 \fIout\fP(1))\fR
+.HP
+\fBinteger function nf_put_vars_int2(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), integer \fIstride\fP(1), integer*2 \fIout\fP(1))\fR
+.HP
+\fBinteger function nf_put_vars_int(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), integer \fIstride\fP(1), integer \fIout\fP(1))\fR
+
+.HP
+\fBinteger function nf_put_vars_real(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), integer \fIstride\fP(1), real \fIout\fP(1))\fR
+.HP
+\fBinteger function nf_put_vars_double(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), integer \fIstride\fP(1), doubleprecision \fIout\fP(1))\fR
+.HP
+\fBinteger function nf_put_vars_ubyte(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), integer \fIstride\fP(1), integer*1 \fIout\fP(1))\fR
+.HP
+\fBinteger function nf_put_vars_ushort(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), integer \fIstride\fP(1), integer*2 \fIout\fP(1))\fR
+.HP
+\fBinteger function nf_put_vars_uint(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), integer \fIstride\fP(1), integer*4 \fIout\fP(1))\fR
+.HP
+\fBinteger function nf_put_vars_(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), integer \fIstride\fP(1), integer*8 \fIout\fP(1))\fR
+.HP
+\fBinteger function nf_put_vars_uint64(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), integer \fIstride\fP(1), integer*8 \fIout\fP(1))\fR
+.HP
+\fBinteger function nf_put_vars_string(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), integer \fIstride\fP(1), character* \fIout\fP(1))\fR
+
+
+.sp
+These functions are used for \fIstrided output\fP, which is like the
+array section output described above, except that
+the sampling stride (the interval between accessed values) is
+specified for each dimension.
+For an explanation of the sampling stride
+vector, see COMMON ARGUMENTS DESCRIPTIONS below.
+.HP
+\fBinteger function nf_get_vars_text(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), integer \fIstride\fP(1), character*(*) \fIin\fP)\fR
+
+.HP
+\fBinteger function nf_get_vars_int1(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), integer \fIstride\fP(1), integer*1 \fIin\fP(1))\fR
+.HP
+\fBinteger function nf_get_vars_int2(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), integer \fIstride\fP(1), integer*2 \fIin\fP(1))\fR
+.HP
+\fBinteger function nf_get_vars_int(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), integer \fIstride\fP(1), integer \fIin\fP(1))\fR
+
+.HP
+\fBinteger function nf_get_vars_real(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), integer \fIstride\fP(1), real \fIin\fP(1))\fR
+.HP
+\fBinteger function nf_get_vars_double(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), integer \fIstride\fP(1), doubleprecision \fIin\fP(1))\fR
+.HP
+\fBinteger function nf_get_vars_ubyte(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), integer \fIstride\fP(1), integer*1 \fIin\fP(1))\fR
+.HP
+\fBinteger function nf_get_vars_ushort(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), integer \fIstride\fP(1), integer*2 \fIin\fP(1))\fR
+.HP
+\fBinteger function nf_get_vars_uint(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), integer \fIstride\fP(1), integer*4 \fIin\fP(1))\fR
+.HP
+\fBinteger function nf_get_vars_(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), integer \fIstride\fP(1), integer*8 \fIin\fP(1))\fR
+.HP
+\fBinteger function nf_get_vars_uint64(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), integer \fIstride\fP(1), integer*8 \fIin\fP(1))\fR
+.HP
+\fBinteger function nf_get_vars_string(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), integer \fIstride\fP(1), character* \fIin\fP(1))\fR
+
+
+.sp
+These functions are used for \fIstrided input\fP, which is like the
+array section input described above, except that 
+the sampling stride (the interval between accessed values) is
+specified for each dimension.
+For an explanation of the sampling stride
+vector, see COMMON ARGUMENTS DESCRIPTIONS below.
+.SH "WRITING AND READING A MAPPED ARRAY"
+.LP
+.HP
+\fBinteger function nf_put_varm_text(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), integer \fIstride\fP(1), \fIimap\fP, character*(*) \fIout\fP)\fR
+
+.HP
+\fBinteger function nf_put_varm_int1(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), integer \fIstride\fP(1), \fIimap\fP, integer*1 \fIout\fP(1))\fR
+.HP
+\fBinteger function nf_put_varm_int2(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), integer \fIstride\fP(1), \fIimap\fP, integer*2 \fIout\fP(1))\fR
+.HP
+\fBinteger function nf_put_varm_int(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), integer \fIstride\fP(1), \fIimap\fP, integer \fIout\fP(1))\fR
+
+.HP
+\fBinteger function nf_put_varm_real(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), integer \fIstride\fP(1), \fIimap\fP, real \fIout\fP(1))\fR
+.HP
+\fBinteger function nf_put_varm_double(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), integer \fIstride\fP(1), \fIimap\fP, doubleprecision \fIout\fP(1))\fR
+.HP
+\fBinteger function nf_put_varm_ubyte(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), integer \fIstride\fP(1), \fIimap\fP, integer*1 \fIout\fP(1))\fR
+.HP
+\fBinteger function nf_put_varm_ushort(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), integer \fIstride\fP(1), \fIimap\fP, integer*2 \fIout\fP(1))\fR
+.HP
+\fBinteger function nf_put_varm_uint(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), integer \fIstride\fP(1), \fIimap\fP, integer*4 \fIout\fP(1))\fR
+.HP
+\fBinteger function nf_put_varm_(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), integer \fIstride\fP(1), \fIimap\fP, integer*8 \fIout\fP(1))\fR
+.HP
+\fBinteger function nf_put_varm_uint64(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), integer \fIstride\fP(1), \fIimap\fP, integer*8 \fIout\fP(1))\fR
+.HP
+\fBinteger function nf_put_varm_string(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), integer \fIstride\fP(1), \fIimap\fP, character* \fIout\fP(1))\fR
+
+
+.sp
+These functions are used for \fImapped output\fP, which is like
+strided output described above, except that an additional index mapping
+vector is provided to specify the in-memory arrangement of the data
+values.
+For an explanation of the index
+mapping vector, see COMMON ARGUMENTS DESCRIPTIONS below.
+.HP
+\fBinteger function nf_get_varm_text(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), integer \fIstride\fP(1), \fIimap\fP, character*(*) \fIin\fP)\fR
+
+.HP
+\fBinteger function nf_get_varm_int1(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), integer \fIstride\fP(1), \fIimap\fP, integer*1 \fIin\fP(1))\fR
+.HP
+\fBinteger function nf_get_varm_int2(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), integer \fIstride\fP(1), \fIimap\fP, integer*2 \fIin\fP(1))\fR
+.HP
+\fBinteger function nf_get_varm_int(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), integer \fIstride\fP(1), \fIimap\fP, integer \fIin\fP(1))\fR
+
+.HP
+\fBinteger function nf_get_varm_real(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), integer \fIstride\fP(1), \fIimap\fP, real \fIin\fP(1))\fR
+.HP
+\fBinteger function nf_get_varm_double(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), integer \fIstride\fP(1), \fIimap\fP, doubleprecision \fIin\fP(1))\fR
+.HP
+\fBinteger function nf_get_varm_ubyte(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), integer \fIstride\fP(1), \fIimap\fP, integer*1 \fIin\fP(1))\fR
+.HP
+\fBinteger function nf_get_varm_ushort(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), integer \fIstride\fP(1), \fIimap\fP, integer*2 \fIin\fP(1))\fR
+.HP
+\fBinteger function nf_get_varm_uint(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), integer \fIstride\fP(1), \fIimap\fP, integer*4 \fIin\fP(1))\fR
+.HP
+\fBinteger function nf_get_varm_(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), integer \fIstride\fP(1), \fIimap\fP, integer*8 \fIin\fP(1))\fR
+.HP
+\fBinteger function nf_get_varm_uint64(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), integer \fIstride\fP(1), \fIimap\fP, integer*8 \fIin\fP(1))\fR
+.HP
+\fBinteger function nf_get_varm_string(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), integer \fIstride\fP(1), \fIimap\fP, character* \fIin\fP(1))\fR
+
+
+.sp
+These functions are used for \fImapped input\fP, which is like
+strided input described above, except that an additional index mapping
+vector is provided to specify the in-memory arrangement of the data
+values.
+For an explanation of the index
+mapping vector, see COMMON ARGUMENTS DESCRIPTIONS below.
+.SH "ATTRIBUTES"
+.LP
+.HP
+\fBinteger function nf_put_att_text(integer \fIncid\fP, integer \fIvarid\fP, character*(*) \fIname\fP, integer \fIxtype\fP, integer \fIlen\fP, character*(*) \fIout\fP)\fR
+
+.HP
+\fBinteger function nf_put_att_int1(integer \fIncid\fP, integer \fIvarid\fP, character*(*) \fIname\fP, integer \fIxtype\fP, integer \fIlen\fP, integer*1 \fIout\fP(1))\fR
+.HP
+\fBinteger function nf_put_att_int2(integer \fIncid\fP, integer \fIvarid\fP, character*(*) \fIname\fP, integer \fIxtype\fP, integer \fIlen\fP, integer*2 \fIout\fP(1))\fR
+.HP
+\fBinteger function nf_put_att_int(integer \fIncid\fP, integer \fIvarid\fP, character*(*) \fIname\fP, integer \fIxtype\fP, integer \fIlen\fP, integer \fIout\fP(1))\fR
+
+.HP
+\fBinteger function nf_put_att_real(integer \fIncid\fP, integer \fIvarid\fP, character*(*) \fIname\fP, integer \fIxtype\fP, integer \fIlen\fP, real \fIout\fP(1))\fR
+.HP
+\fBinteger function nf_put_att_double(integer \fIncid\fP, integer \fIvarid\fP, character*(*) \fIname\fP, integer \fIxtype\fP, integer \fIlen\fP, doubleprecision \fIout\fP(1))\fR
+.HP
+\fBinteger function nf_put_att_ubyte(integer \fIncid\fP, integer \fIvarid\fP, character*(*) \fIname\fP, integer \fIxtype\fP, integer \fIlen\fP, integer*1 \fIout\fP(1))\fR
+.HP
+\fBinteger function nf_put_att_ushort(integer \fIncid\fP, integer \fIvarid\fP, character*(*) \fIname\fP, integer \fIxtype\fP, integer \fIlen\fP, integer*2 \fIout\fP(1))\fR
+.HP
+\fBinteger function nf_put_att_uint(integer \fIncid\fP, integer \fIvarid\fP, character*(*) \fIname\fP, integer \fIxtype\fP, integer \fIlen\fP, integer*4 \fIout\fP(1))\fR
+.HP
+\fBinteger function nf_put_att_(integer \fIncid\fP, integer \fIvarid\fP, character*(*) \fIname\fP, integer \fIxtype\fP, integer \fIlen\fP, integer*8 \fIout\fP(1))\fR
+.HP
+\fBinteger function nf_put_att_uint64(integer \fIncid\fP, integer \fIvarid\fP, character*(*) \fIname\fP, integer \fIxtype\fP, integer \fIlen\fP, integer*8 \fIout\fP(1))\fR
+.HP
+\fBinteger function nf_put_att_string(integer \fIncid\fP, integer \fIvarid\fP, character*(*) \fIname\fP, integer \fIxtype\fP, integer \fIlen\fP, character* \fIout\fP(1))\fR
+
+
+.HP
+\fBinteger function nf_put_att(integer \fIncid\fP, integer \fIvarid\fP, character*(*) \fIname\fP, integer \fIxtype\fP, integer \fIlen\fP, void * \fIip\fP)\fR
+.HP
+\fBinteger function nf_get_att(integer \fIncid\fP, integer \fIvarid\fP, character*(*) \fIname\fP, void * \fIip\fP)\fR
+.sp
+Unlike variables, attributes do not have 
+separate functions for defining and writing values.
+This family of functions defines a new attribute with a value or changes
+the value of an existing attribute.
+If the attribute is new, or if the space required to
+store the attribute value is greater than before,
+the netCDF dataset must be in define mode.
+The parameter \fIlen\fP is the number of values from \fIout\fP to transfer.
+It is often one, except that for
+\fBnf_put_att_text(\|)\fR it will usually be
+\fBlen_trim(\fIout\fP)\fR.
+.sp
+For these functions, the type component of the function name refers to
+the in-memory type of the value, whereas the \fIxtype\fP argument refers to the
+external type for storing the value.  An \fBNF_ERANGE\fR
+error results if
+a conversion between these types is not possible.  In this case the value
+is represented with the appropriate fill-value for the associated 
+external type.
+.HP
+\fBinteger function nf_inq_attname(integer \fIncid\fP, integer \fIvarid\fP, integer \fIattnum\fP, character*(*) \fIname\fP)\fR
+.sp
+Gets the
+name of an attribute, given its variable ID and attribute number.
+This function is useful in generic applications that
+need to get the names of all the attributes associated with a variable,
+since attributes are accessed by name rather than number in all other
+attribute functions.  The number of an attribute is more volatile than
+the name, since it can change when other attributes of the same variable
+are deleted.  The attributes for each variable are numbered
+from 1 (the first attribute) to
+\fInvatts\fP,
+where \fInvatts\fP is
+the number of attributes for the variable, as returned from a call to
+\fBnf_inq_varnatts(\|)\fR.
+
+.HP
+\fBinteger function nf_inq_att(integer \fIncid\fP, integer \fIvarid\fP, character*(*) \fIname\fP, integer \fIxtype\fP, integer \fIlen\fP)\fR
+.HP
+\fBinteger function nf_inq_attid(integer \fIncid\fP, integer \fIvarid\fP, character*(*) \fIname\fP, integer \fIattnum\fP)\fR
+.HP
+\fBinteger function nf_inq_atttype(integer \fIncid\fP, integer \fIvarid\fP, character*(*) \fIname\fP, integer \fIxtype\fP)\fR
+.HP
+\fBinteger function nf_inq_attlen(integer \fIncid\fP, integer \fIvarid\fP, character*(*) \fIname\fP, integer \fIlen\fP)\fR
+.sp
+These functions return information about a netCDF attribute,
+given its variable ID and name.  The information returned is the
+external type in \fIxtype\fP
+and the number of elements in the attribute as \fIlen\fP.
+
+.HP
+\fBinteger function nf_copy_att(integer \fIncid\fP, integer \fIvarid_in\fP, character*(*) \fIname\fP, integer \fIncid_out\fP, integer \fIvarid_out\fP)\fR
+.sp
+Copies an
+attribute from one netCDF dataset to another.  It can also be used to
+copy an attribute from one variable to another within the same netCDF.
+\fIncid_in\fP is the netCDF ID of an input netCDF dataset from which the
+attribute will be copied.
+\fIvarid_in\fP
+is the ID of the variable in the input netCDF dataset from which the
+attribute will be copied, or \fBNF_GLOBAL\fR
+for a global attribute.
+\fIname\fP
+is the name of the attribute in the input netCDF dataset to be copied.
+\fIncid_out\fP
+is the netCDF ID of the output netCDF dataset to which the attribute will be 
+copied.
+It is permissible for the input and output netCDF ID's to be the same.  The
+output netCDF dataset should be in define mode if the attribute to be
+copied does not already exist for the target variable, or if it would
+cause an existing target attribute to grow.
+\fIvarid_out\fP
+is the ID of the variable in the output netCDF dataset to which the attribute will
+be copied, or \fBNF_GLOBAL\fR to copy to a global attribute.
+.HP
+\fBinteger function nf_rename_att(integer \fIncid\fP, integer \fIvarid\fP, character*(*) \fIname\fP, character*(*) \fInewname\fP)\fR
+.sp
+Changes the
+name of an attribute.  If the new name is longer than the original name,
+the netCDF must be in define mode.  You cannot rename an attribute to
+have the same name as another attribute of the same variable.
+\fIname\fP is the original attribute name.
+\fInewname\fP
+is the new name to be assigned to the specified attribute.  If the new name
+is longer than the old name, the netCDF dataset must be in define mode.
+.HP
+\fBinteger function nf_del_att(integer \fIncid\fP, integer \fIvarid\fP, character*(*) \fIname\fP)\fR
+.sp
+Deletes an attribute from a netCDF dataset.  The dataset must be in
+define mode.
+.HP
+\fBinteger function nf_get_att_text(integer \fIncid\fP, integer \fIvarid\fP, character*(*) \fIname\fP, character*(*) \fIin\fP)\fR
+
+.HP
+\fBinteger function nf_get_att_int1(integer \fIncid\fP, integer \fIvarid\fP, character*(*) \fIname\fP, integer*1 \fIin\fP(1))\fR
+.HP
+\fBinteger function nf_get_att_int2(integer \fIncid\fP, integer \fIvarid\fP, character*(*) \fIname\fP, integer*2 \fIin\fP(1))\fR
+.HP
+\fBinteger function nf_get_att_int(integer \fIncid\fP, integer \fIvarid\fP, character*(*) \fIname\fP, integer \fIin\fP(1))\fR
+
+.HP
+\fBinteger function nf_get_att_real(integer \fIncid\fP, integer \fIvarid\fP, character*(*) \fIname\fP, real \fIin\fP(1))\fR
+.HP
+\fBinteger function nf_get_att_double(integer \fIncid\fP, integer \fIvarid\fP, character*(*) \fIname\fP, doubleprecision \fIin\fP(1))\fR
+.HP
+\fBinteger function nf_get_att_ubyte(integer \fIncid\fP, integer \fIvarid\fP, character*(*) \fIname\fP, integer*1 \fIin\fP(1))\fR
+.HP
+\fBinteger function nf_get_att_ushort(integer \fIncid\fP, integer \fIvarid\fP, character*(*) \fIname\fP, integer*2 \fIin\fP(1))\fR
+.HP
+\fBinteger function nf_get_att_uint(integer \fIncid\fP, integer \fIvarid\fP, character*(*) \fIname\fP, integer*4 \fIin\fP(1))\fR
+.HP
+\fBinteger function nf_get_att_(integer \fIncid\fP, integer \fIvarid\fP, character*(*) \fIname\fP, integer*8 \fIin\fP(1))\fR
+.HP
+\fBinteger function nf_get_att_uint64(integer \fIncid\fP, integer \fIvarid\fP, character*(*) \fIname\fP, integer*8 \fIin\fP(1))\fR
+.HP
+\fBinteger function nf_get_att_string(integer \fIncid\fP, integer \fIvarid\fP, character*(*) \fIname\fP, character* \fIin\fP(1))\fR
+
+
+.sp
+Gets the value(s) of a netCDF attribute, given its
+variable ID and name.  Converts from the external type to the type
+specified in
+the function name, if possible, otherwise returns an \fBNF_ERANGE\fR
+error.
+All elements of the vector of attribute
+values are returned, so you must allocate enough space to hold
+them.  If you don't know how much space to reserve, call
+\fBnf_inq_attlen(\|)\fR
+first to find out the length of the attribute.
+.SH "COMMON ARGUMENT DESCRIPTIONS"
+.LP
+In this section we define some common arguments which are used in the 
+"FUNCTION DESCRIPTIONS" section.
+.TP
+integer \fIncid\fP
+is the netCDF ID returned from a previous, successful call to
+\fBnf_open(\|)\fR or \fBnf_create(\|)\fR
+.TP
+character*(*) \fIname\fP
+is the name of a dimension, variable, or attribute. The names of 
+dimensions, variables and attributes consist of arbitrary
+sequences of alphanumeric characters (as well as underscore '_',
+period '.' and hyphen '-'), beginning with a letter or
+underscore. (However names commencing with underscore are reserved for
+system use.) Case is significant in netCDF names. A zero-length name
+is not allowed.
+
+The maximum allowable number of characters 
+ is \fBNF_MAX_NAME\fR.
+.TP
+integer \fIxtype\fP
+specifies the external data type of a netCDF variable or attribute and
+is one of the following:
+\fBNF_BYTE\fR, \fBNF_CHAR\fR, \fBNF_SHORT\fR, \fBNF_INT\fR, 
+\fBNF_FLOAT\fR, or \fBNF_DOUBLE\fR.
+These are used to specify 8-bit integers,
+characters, 16-bit integers, 32-bit integers, 32-bit IEEE floating point
+numbers, and 64-bit IEEE floating-point numbers, respectively.
+
+.TP
+integer \fIdimids\fP(1)
+is a vector of dimension ID's and defines the shape of a netCDF variable.
+The size of the vector shall be greater than or equal to the
+rank (i.e. the number of dimensions) of the variable (\fIndims\fP).
+The vector shall be ordered by the speed with which a dimension varies:
+\fIdimids\fP(1)
+shall be the dimension ID of the most rapidly
+varying dimension and
+\fIdimids\fP(\fIndims\fP)
+shall be the dimension ID of the most slowly
+varying dimension.
+The maximum possible number of
+dimensions for a variable is given by the symbolic constant
+\fBNF_MAX_VAR_DIMS\fR.
+.TP
+integer \fIdimid\fP
+is the ID of a netCDF dimension.
+netCDF dimension ID's are allocated sequentially from the 
+positive
+integers beginning with 1.
+.TP
+integer \fIndims\fP
+is either the total number of dimensions in a netCDF dataset or the rank
+(i.e. the number of dimensions) of a netCDF variable.
+The value shall not be negative or greater than the symbolic constant 
+\fBNF_MAX_VAR_DIMS\fR.
+.TP
+integer \fIvarid\fP
+is the ID of a netCDF variable or (for the attribute-access functions) 
+the symbolic constant
+\fBNF_GLOBAL\fR,
+which is used to reference global attributes.
+netCDF variable ID's are allocated sequentially from the 
+positive
+integers beginning with 1.
+.TP
+integer \fInatts\fP
+is the number of global attributes in a netCDF dataset  for the
+\fBnf_inquire(\|)\fR
+function or the number
+of attributes associated with a netCDF variable for the
+\fBnf_varinq(\|)\fR
+function.
+.TP
+integer \fIindex\fP(1)
+specifies the indicial coordinates of the netCDF data value to be accessed.
+The indices start at 1;
+thus, for example, the first data value of a
+two-dimensional variable is (1,1).
+The size of the vector shall be at least the rank of the associated
+netCDF variable and its elements shall correspond, in order, to the
+variable's dimensions.
+.TP
+integer \fIstart\fP(1)
+specifies the starting point
+for accessing a netCDF variable's data values
+in terms of the indicial coordinates of 
+the corner of the array section.
+The indices start at 1;
+thus, the first data
+value of a variable is (1, 1, ..., 1).
+The size of the vector shall be at least the rank of the associated
+netCDF variable and its elements shall correspond, in order, to the
+variable's dimensions.
+.TP
+integer \fIcount\fP(1)
+specifies the number of indices selected along each dimension of the
+array section.
+Thus, to access a single value, for example, specify \fIcount\fP as
+(1, 1, ..., 1).
+Note that, for strided I/O, this argument must be adjusted
+to be compatible with the \fIstride\fP and \fIstart\fP arguments so that 
+the interaction of the
+three does not attempt to access an invalid data co-ordinate.
+The elements of the
+\fIcount\fP vector correspond, in order, to the variable's dimensions.
+.TP
+integer \fIstride\fP(1)
+specifies the sampling interval along each dimension of the netCDF
+variable.   The elements of the stride vector correspond, in order,
+to the netCDF variable's dimensions (\fIstride\fP(1))
+gives the sampling interval along the most rapidly 
+varying dimension of the netCDF variable).  Sampling intervals are
+specified in type-independent units of elements (a value of 1 selects
+consecutive elements of the netCDF variable along the corresponding
+dimension, a value of 2 selects every other element, etc.).
+
+.TP
+\fIimap\fP
+specifies the mapping between the dimensions of a netCDF variable and
+the in-memory structure of the internal data array.  The elements of
+the index mapping vector correspond, in order, to the netCDF variable's
+dimensions (\fIimap\fP(1) gives the distance
+between elements of the internal array corresponding to the most
+rapidly varying dimension of the netCDF variable).
+Distances between elements are specified in type-independent units of
+elements (the distance between internal elements that occupy adjacent
+memory locations is 1 and not the element's byte-length as in netCDF 2).
+
+.SH "VARIABLE PREFILLING"
+.LP
+By default, the netCDF interface sets the values of
+all newly-defined variables of finite length (i.e. those that do not have
+an unlimited, dimension) to the type-dependent fill-value associated with each 
+variable.  This is done when \fBnf_enddef(\|)\fR
+is called.  The
+fill-value for a variable may be changed from the default value by
+defining the attribute `\fB_FillValue\fR' for the variable.  This
+attribute must have the same type as the variable and be of length one.
+.LP
+Variables with an unlimited dimension are also prefilled, but on
+an `as needed' basis.  For example, if the first write of such a
+variable is to position 5, then
+positions
+1 through 4
+(and no others)
+would be set to the fill-value at the same time.
+.LP
+This default prefilling of data values may be disabled by
+or'ing the
+\fBNF_NOFILL\fR
+flag into the mode parameter of \fBnf_open(\|)\fR or \fBnf_create(\|)\fR,
+or, by calling the function \fBnf_set_fill(\|)\fR
+with the argument \fBNF_NOFILL\fR.
+For variables that do not use the unlimited dimension,
+this call must
+be made before
+\fBnf_enddef(\|)\fR.
+For variables that
+use the unlimited dimension, this call
+may be made at any time.
+.LP
+One can obtain increased performance of the netCDF interface by using 
+this feature, but only at the expense of requiring the application to set
+every single data value.  The performance
+enhancing behavior of this function is dependent on the particulars of
+the implementation and dataset format.
+The flag value controlled by \fBnf_set_fill(\|)\fR
+is per netCDF ID,
+not per variable or per write. 
+Allowing this to change affects the degree to which
+a program can be effectively parallelized.
+Given all of this, we state that the use
+of this feature may not be available (or even needed) in future
+releases. Programmers are cautioned against heavy reliance upon this
+feature.
+.HP
+\fBinteger function nf_setfill(integer \fIncid\fP, integer \fIfillmode\fP, integer \fIold_fillemode\fP)\fR
+
+.sp
+Determines whether or not variable prefilling will be done (see 
+above).
+The netCDF dataset shall be writable.
+\fIfillmode\fP is either \fBNF_FILL\fR
+to enable prefilling (the
+default) or \fBNF_NOFILL\fR
+to disable prefilling.
+This function returns the previous setting in \fIold_fillmode\fP.
+
+.HP
+.SH "MPP FUNCTION DESCRIPTIONS"
+.LP
+Additional functions for use on SGI/Cray MPP machines (_CRAYMPP).
+These are used to set and inquire which PE is the base for MPP
+for a particular netCDF. These are only relevant when
+using the SGI/Cray ``global''
+Flexible File I/O layer and desire to have
+only a subset of PEs to open the specific netCDF file.
+For technical reasons, these functions are available on all platforms.
+On a platform other than SGI/Cray MPP, it is as if
+only processor available were processor 0.
+.LP
+To use this feature, you need to specify a communicator group and call
+\fBglio_group_mpi(\|)\fR or \fBglio_group_shmem(\|)\fR prior to the netCDF
+\fBnf_open(\|)\fR and \fBnf_create(\|)\fR calls.
+.HP
+\fBinteger function nf__create_mp(character*(*) \fIpath\fP, integer \fIcmode\fP, integer \fIinitialsize\fP, integer \fIpe\fP, integer \fIchunksize\fP, integer \fIncid\fP)\fR
+.sp
+Like \fBnf__create(\|)\fR but allows the base PE to be set.
+.sp
+The argument \fIpe\fP sets the base PE at creation time. In the MPP
+environment, \fBnf__create(\|)\fR and \fBnf_create(\|)\fR set the base PE to processor
+zero by default.
+.HP
+\fBinteger function nf__open_mp(character*(*) \fIpath\fP, integer \fImode\fP, integer \fIpe\fP, integer \fIchunksize\fP, integer \fIncid\fP)\fR
+.sp
+Like \fBnf__open(\|)\fR but allows the base PE to be set.
+The argument \fIpe\fP sets the base PE at creation time. In the MPP
+environment, \fBnf__open(\|)\fR and \fBnf_open(\|)\fR set the base PE to processor
+zero by default.
+.HP
+\fBinteger function nf_inq_base_pe(integer \fIncid\fP, integer \fIpe\fP)\fR
+.sp
+Inquires of the netCDF dataset which PE is being used as the base for MPP use.
+This is safe to use at any time.
+.HP
+\fBinteger function nf_set_base_pe(integer \fIncid\fP, integer \fIpe\fP)\fR
+.sp
+Resets the base PE for the netCDF dataset.
+Only perform this operation when the affected communicator group
+synchronizes before and after the call.
+This operation is very risky and should only be contemplated
+under only the most extreme cases.
+.SH "ENVIRONMENT VARIABLES"
+.TP 4
+.B NETCDF_FFIOSPEC
+Specifies the Flexible File I/O buffers for netCDF I/O when executing
+under the UNICOS operating system (the variable is ignored on other
+operating systems).
+An appropriate specification can greatly increase the efficiency of 
+netCDF I/O -- to the extent that it can actually surpass FORTRAN binary 
+I/O.
+This environment variable has been made a little more generalized,
+such that other FFIO option specifications can now be added.
+The default specification is \fBbufa:336:2\fP,
+unless a current FFIO specification is in operation,
+which will be honored.
+See UNICOS Flexible File I/O for more information.
+.SH "MAILING-LISTS"
+.LP
+Both a mailing list and a digest are available for
+discussion of the netCDF interface and announcements about netCDF bugs,
+fixes, and enhancements.
+To begin or change your subscription to either the mailing-list or the
+digest, send one of the following in the body (not
+the subject line) of an email message to "majordomo at unidata.ucar.edu".
+Use your email address in place of \fIjdoe at host.inst.domain\fP.
+.sp
+To subscribe to the netCDF mailing list:
+.RS
+\fBsubscribe netcdfgroup \fIjdoe at host.inst.domain\fR
+.RE
+To unsubscribe from the netCDF mailing list:
+.RS
+\fBunsubscribe netcdfgroup \fIjdoe at host.inst.domain\fR
+.RE
+To subscribe to the netCDF digest:
+.RS
+\fBsubscribe netcdfdigest \fIjdoe at host.inst.domain\fR
+.RE
+To unsubscribe from the netCDF digest:
+.RS
+\fBunsubscribe netcdfdigest \fIjdoe at host.inst.domain\fR
+.RE
+To retrieve the general introductory information for the mailing list:
+.RS
+\fBinfo netcdfgroup\fR
+.RE
+To get a synopsis of other majordomo commands:
+.RS
+\fBhelp\fR
+.RE
+.SH "SEE ALSO"
+.LP
+.BR ncdump (1),
+.BR ncgen (1),
+.BR netcdf (3f).
+.LP
+\fInetCDF User's Guide\fP, published
+by the Unidata Program Center, University Corporation for Atmospheric
+Research, located in Boulder, Colorado.
+
+NetCDF home page at http:/www.unidata.ucar.edu/netcdf.
diff --git a/docs/texinfo.tex b/docs/texinfo.tex
new file mode 100644
index 0000000..85f184c
--- /dev/null
+++ b/docs/texinfo.tex
@@ -0,0 +1,10079 @@
+% texinfo.tex -- TeX macros to handle Texinfo files.
+% 
+% Load plain if necessary, i.e., if running under initex.
+\expandafter\ifx\csname fmtname\endcsname\relax\input plain\fi
+%
+\def\texinfoversion{2013-02-01.11}
+%
+% Copyright 1985, 1986, 1988, 1990, 1991, 1992, 1993, 1994, 1995,
+% 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006,
+% 2007, 2008, 2009, 2010, 2011, 2012, 2013 Free Software Foundation, Inc.
+%
+% This texinfo.tex file is free software: you can redistribute it and/or
+% modify it under the terms of the GNU General Public License as
+% published by the Free Software Foundation, either version 3 of the
+% License, or (at your option) any later version.
+%
+% This texinfo.tex file is distributed in the hope that it will be
+% useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+% of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+% General Public License for more details.
+%
+% You should have received a copy of the GNU General Public License
+% along with this program.  If not, see <http://www.gnu.org/licenses/>.
+%
+% As a special exception, when this file is read by TeX when processing
+% a Texinfo source document, you may use the result without
+% restriction. This Exception is an additional permission under section 7
+% of the GNU General Public License, version 3 ("GPLv3").
+%
+% Please try the latest version of texinfo.tex before submitting bug
+% reports; you can get the latest version from:
+%   http://ftp.gnu.org/gnu/texinfo/ (the Texinfo release area), or
+%   http://ftpmirror.gnu.org/texinfo/ (same, via a mirror), or
+%   http://www.gnu.org/software/texinfo/ (the Texinfo home page)
+% The texinfo.tex in any given distribution could well be out
+% of date, so if that's what you're using, please check.
+%
+% Send bug reports to bug-texinfo at gnu.org.  Please include including a
+% complete document in each bug report with which we can reproduce the
+% problem.  Patches are, of course, greatly appreciated.
+%
+% To process a Texinfo manual with TeX, it's most reliable to use the
+% texi2dvi shell script that comes with the distribution.  For a simple
+% manual foo.texi, however, you can get away with this:
+%   tex foo.texi
+%   texindex foo.??
+%   tex foo.texi
+%   tex foo.texi
+%   dvips foo.dvi -o  # or whatever; this makes foo.ps.
+% The extra TeX runs get the cross-reference information correct.
+% Sometimes one run after texindex suffices, and sometimes you need more
+% than two; texi2dvi does it as many times as necessary.
+%
+% It is possible to adapt texinfo.tex for other languages, to some
+% extent.  You can get the existing language-specific files from the
+% full Texinfo distribution.
+%
+% The GNU Texinfo home page is http://www.gnu.org/software/texinfo.
+
+
+\message{Loading texinfo [version \texinfoversion]:}
+
+% If in a .fmt file, print the version number
+% and turn on active characters that we couldn't do earlier because
+% they might have appeared in the input file name.
+\everyjob{\message{[Texinfo version \texinfoversion]}%
+  \catcode`+=\active \catcode`\_=\active}
+
+\chardef\other=12
+
+% We never want plain's \outer definition of \+ in Texinfo.
+% For @tex, we can use \tabalign.
+\let\+ = \relax
+
+% Save some plain tex macros whose names we will redefine.
+\let\ptexb=\b
+\let\ptexbullet=\bullet
+\let\ptexc=\c
+\let\ptexcomma=\,
+\let\ptexdot=\.
+\let\ptexdots=\dots
+\let\ptexend=\end
+\let\ptexequiv=\equiv
+\let\ptexexclam=\!
+\let\ptexfootnote=\footnote
+\let\ptexgtr=>
+\let\ptexhat=^
+\let\ptexi=\i
+\let\ptexindent=\indent
+\let\ptexinsert=\insert
+\let\ptexlbrace=\{
+\let\ptexless=<
+\let\ptexnewwrite\newwrite
+\let\ptexnoindent=\noindent
+\let\ptexplus=+
+\let\ptexraggedright=\raggedright
+\let\ptexrbrace=\}
+\let\ptexslash=\/
+\let\ptexstar=\*
+\let\ptext=\t
+\let\ptextop=\top
+{\catcode`\'=\active \global\let\ptexquoteright'}% active in plain's math mode
+
+% If this character appears in an error message or help string, it
+% starts a new line in the output.
+\newlinechar = `^^J
+
+% Use TeX 3.0's \inputlineno to get the line number, for better error
+% messages, but if we're using an old version of TeX, don't do anything.
+%
+\ifx\inputlineno\thisisundefined
+  \let\linenumber = \empty % Pre-3.0.
+\else
+  \def\linenumber{l.\the\inputlineno:\space}
+\fi
+
+% Set up fixed words for English if not already set.
+\ifx\putwordAppendix\undefined  \gdef\putwordAppendix{Appendix}\fi
+\ifx\putwordChapter\undefined   \gdef\putwordChapter{Chapter}\fi
+\ifx\putworderror\undefined     \gdef\putworderror{error}\fi
+\ifx\putwordfile\undefined      \gdef\putwordfile{file}\fi
+\ifx\putwordin\undefined        \gdef\putwordin{in}\fi
+\ifx\putwordIndexIsEmpty\undefined       \gdef\putwordIndexIsEmpty{(Index is empty)}\fi
+\ifx\putwordIndexNonexistent\undefined   \gdef\putwordIndexNonexistent{(Index is nonexistent)}\fi
+\ifx\putwordInfo\undefined      \gdef\putwordInfo{Info}\fi
+\ifx\putwordInstanceVariableof\undefined \gdef\putwordInstanceVariableof{Instance Variable of}\fi
+\ifx\putwordMethodon\undefined  \gdef\putwordMethodon{Method on}\fi
+\ifx\putwordNoTitle\undefined   \gdef\putwordNoTitle{No Title}\fi
+\ifx\putwordof\undefined        \gdef\putwordof{of}\fi
+\ifx\putwordon\undefined        \gdef\putwordon{on}\fi
+\ifx\putwordpage\undefined      \gdef\putwordpage{page}\fi
+\ifx\putwordsection\undefined   \gdef\putwordsection{section}\fi
+\ifx\putwordSection\undefined   \gdef\putwordSection{Section}\fi
+\ifx\putwordsee\undefined       \gdef\putwordsee{see}\fi
+\ifx\putwordSee\undefined       \gdef\putwordSee{See}\fi
+\ifx\putwordShortTOC\undefined  \gdef\putwordShortTOC{Short Contents}\fi
+\ifx\putwordTOC\undefined       \gdef\putwordTOC{Table of Contents}\fi
+%
+\ifx\putwordMJan\undefined \gdef\putwordMJan{January}\fi
+\ifx\putwordMFeb\undefined \gdef\putwordMFeb{February}\fi
+\ifx\putwordMMar\undefined \gdef\putwordMMar{March}\fi
+\ifx\putwordMApr\undefined \gdef\putwordMApr{April}\fi
+\ifx\putwordMMay\undefined \gdef\putwordMMay{May}\fi
+\ifx\putwordMJun\undefined \gdef\putwordMJun{June}\fi
+\ifx\putwordMJul\undefined \gdef\putwordMJul{July}\fi
+\ifx\putwordMAug\undefined \gdef\putwordMAug{August}\fi
+\ifx\putwordMSep\undefined \gdef\putwordMSep{September}\fi
+\ifx\putwordMOct\undefined \gdef\putwordMOct{October}\fi
+\ifx\putwordMNov\undefined \gdef\putwordMNov{November}\fi
+\ifx\putwordMDec\undefined \gdef\putwordMDec{December}\fi
+%
+\ifx\putwordDefmac\undefined    \gdef\putwordDefmac{Macro}\fi
+\ifx\putwordDefspec\undefined   \gdef\putwordDefspec{Special Form}\fi
+\ifx\putwordDefvar\undefined    \gdef\putwordDefvar{Variable}\fi
+\ifx\putwordDefopt\undefined    \gdef\putwordDefopt{User Option}\fi
+\ifx\putwordDeffunc\undefined   \gdef\putwordDeffunc{Function}\fi
+
+% Since the category of space is not known, we have to be careful.
+\chardef\spacecat = 10
+\def\spaceisspace{\catcode`\ =\spacecat}
+
+% sometimes characters are active, so we need control sequences.
+\chardef\ampChar   = `\&
+\chardef\colonChar = `\:
+\chardef\commaChar = `\,
+\chardef\dashChar  = `\-
+\chardef\dotChar   = `\.
+\chardef\exclamChar= `\!
+\chardef\hashChar  = `\#
+\chardef\lquoteChar= `\`
+\chardef\questChar = `\?
+\chardef\rquoteChar= `\'
+\chardef\semiChar  = `\;
+\chardef\slashChar = `\/
+\chardef\underChar = `\_
+
+% Ignore a token.
+%
+\def\gobble#1{}
+
+% The following is used inside several \edef's.
+\def\makecsname#1{\expandafter\noexpand\csname#1\endcsname}
+
+% Hyphenation fixes.
+\hyphenation{
+  Flor-i-da Ghost-script Ghost-view Mac-OS Post-Script
+  ap-pen-dix bit-map bit-maps
+  data-base data-bases eshell fall-ing half-way long-est man-u-script
+  man-u-scripts mini-buf-fer mini-buf-fers over-view par-a-digm
+  par-a-digms rath-er rec-tan-gu-lar ro-bot-ics se-vere-ly set-up spa-ces
+  spell-ing spell-ings
+  stand-alone strong-est time-stamp time-stamps which-ever white-space
+  wide-spread wrap-around
+}
+
+% Margin to add to right of even pages, to left of odd pages.
+\newdimen\bindingoffset
+\newdimen\normaloffset
+\newdimen\pagewidth \newdimen\pageheight
+
+% For a final copy, take out the rectangles
+% that mark overfull boxes (in case you have decided
+% that the text looks ok even though it passes the margin).
+%
+\def\finalout{\overfullrule=0pt }
+
+% Sometimes it is convenient to have everything in the transcript file
+% and nothing on the terminal.  We don't just call \tracingall here,
+% since that produces some useless output on the terminal.  We also make
+% some effort to order the tracing commands to reduce output in the log
+% file; cf. trace.sty in LaTeX.
+%
+\def\gloggingall{\begingroup \globaldefs = 1 \loggingall \endgroup}%
+\def\loggingall{%
+  \tracingstats2
+  \tracingpages1
+  \tracinglostchars2  % 2 gives us more in etex
+  \tracingparagraphs1
+  \tracingoutput1
+  \tracingmacros2
+  \tracingrestores1
+  \showboxbreadth\maxdimen \showboxdepth\maxdimen
+  \ifx\eTeXversion\thisisundefined\else % etex gives us more logging
+    \tracingscantokens1
+    \tracingifs1
+    \tracinggroups1
+    \tracingnesting2
+    \tracingassigns1
+  \fi
+  \tracingcommands3  % 3 gives us more in etex
+  \errorcontextlines16
+}%
+
+% @errormsg{MSG}.  Do the index-like expansions on MSG, but if things
+% aren't perfect, it's not the end of the world, being an error message,
+% after all.
+% 
+\def\errormsg{\begingroup \indexnofonts \doerrormsg}
+\def\doerrormsg#1{\errmessage{#1}}
+
+% add check for \lastpenalty to plain's definitions.  If the last thing
+% we did was a \nobreak, we don't want to insert more space.
+%
+\def\smallbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\smallskipamount
+  \removelastskip\penalty-50\smallskip\fi\fi}
+\def\medbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\medskipamount
+  \removelastskip\penalty-100\medskip\fi\fi}
+\def\bigbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\bigskipamount
+  \removelastskip\penalty-200\bigskip\fi\fi}
+
+% Do @cropmarks to get crop marks.
+%
+\newif\ifcropmarks
+\let\cropmarks = \cropmarkstrue
+%
+% Dimensions to add cropmarks at corners.
+% Added by P. A. MacKay, 12 Nov. 1986
+%
+\newdimen\outerhsize \newdimen\outervsize % set by the paper size routines
+\newdimen\cornerlong  \cornerlong=1pc
+\newdimen\cornerthick \cornerthick=.3pt
+\newdimen\topandbottommargin \topandbottommargin=.75in
+
+% Output a mark which sets \thischapter, \thissection and \thiscolor.
+% We dump everything together because we only have one kind of mark.
+% This works because we only use \botmark / \topmark, not \firstmark.
+%
+% A mark contains a subexpression of the \ifcase ... \fi construct.
+% \get*marks macros below extract the needed part using \ifcase.
+%
+% Another complication is to let the user choose whether \thischapter
+% (\thissection) refers to the chapter (section) in effect at the top
+% of a page, or that at the bottom of a page.  The solution is
+% described on page 260 of The TeXbook.  It involves outputting two
+% marks for the sectioning macros, one before the section break, and
+% one after.  I won't pretend I can describe this better than DEK...
+\def\domark{%
+  \toks0=\expandafter{\lastchapterdefs}%
+  \toks2=\expandafter{\lastsectiondefs}%
+  \toks4=\expandafter{\prevchapterdefs}%
+  \toks6=\expandafter{\prevsectiondefs}%
+  \toks8=\expandafter{\lastcolordefs}%
+  \mark{%
+                   \the\toks0 \the\toks2
+      \noexpand\or \the\toks4 \the\toks6
+    \noexpand\else \the\toks8
+  }%
+}
+% \topmark doesn't work for the very first chapter (after the title
+% page or the contents), so we use \firstmark there -- this gets us
+% the mark with the chapter defs, unless the user sneaks in, e.g.,
+% @setcolor (or @url, or @link, etc.) between @contents and the very
+% first @chapter.
+\def\gettopheadingmarks{%
+  \ifcase0\topmark\fi
+  \ifx\thischapter\empty \ifcase0\firstmark\fi \fi
+}
+\def\getbottomheadingmarks{\ifcase1\botmark\fi}
+\def\getcolormarks{\ifcase2\topmark\fi}
+
+% Avoid "undefined control sequence" errors.
+\def\lastchapterdefs{}
+\def\lastsectiondefs{}
+\def\prevchapterdefs{}
+\def\prevsectiondefs{}
+\def\lastcolordefs{}
+
+% Main output routine.
+\chardef\PAGE = 255
+\output = {\onepageout{\pagecontents\PAGE}}
+
+\newbox\headlinebox
+\newbox\footlinebox
+
+% \onepageout takes a vbox as an argument.  Note that \pagecontents
+% does insertions, but you have to call it yourself.
+\def\onepageout#1{%
+  \ifcropmarks \hoffset=0pt \else \hoffset=\normaloffset \fi
+  %
+  \ifodd\pageno  \advance\hoffset by \bindingoffset
+  \else \advance\hoffset by -\bindingoffset\fi
+  %
+  % Do this outside of the \shipout so @code etc. will be expanded in
+  % the headline as they should be, not taken literally (outputting ''code).
+  \ifodd\pageno \getoddheadingmarks \else \getevenheadingmarks \fi
+  \setbox\headlinebox = \vbox{\let\hsize=\pagewidth \makeheadline}%
+  \ifodd\pageno \getoddfootingmarks \else \getevenfootingmarks \fi
+  \setbox\footlinebox = \vbox{\let\hsize=\pagewidth \makefootline}%
+  %
+  {%
+    % Have to do this stuff outside the \shipout because we want it to
+    % take effect in \write's, yet the group defined by the \vbox ends
+    % before the \shipout runs.
+    %
+    \indexdummies         % don't expand commands in the output.
+    \normalturnoffactive  % \ in index entries must not stay \, e.g., if
+               % the page break happens to be in the middle of an example.
+               % We don't want .vr (or whatever) entries like this:
+               % \entry{{\tt \indexbackslash }acronym}{32}{\code {\acronym}}
+               % "\acronym" won't work when it's read back in;
+               % it needs to be
+               % {\code {{\tt \backslashcurfont }acronym}
+    \shipout\vbox{%
+      % Do this early so pdf references go to the beginning of the page.
+      \ifpdfmakepagedest \pdfdest name{\the\pageno} xyz\fi
+      %
+      \ifcropmarks \vbox to \outervsize\bgroup
+        \hsize = \outerhsize
+        \vskip-\topandbottommargin
+        \vtop to0pt{%
+          \line{\ewtop\hfil\ewtop}%
+          \nointerlineskip
+          \line{%
+            \vbox{\moveleft\cornerthick\nstop}%
+            \hfill
+            \vbox{\moveright\cornerthick\nstop}%
+          }%
+          \vss}%
+        \vskip\topandbottommargin
+        \line\bgroup
+          \hfil % center the page within the outer (page) hsize.
+          \ifodd\pageno\hskip\bindingoffset\fi
+          \vbox\bgroup
+      \fi
+      %
+      \unvbox\headlinebox
+      \pagebody{#1}%
+      \ifdim\ht\footlinebox > 0pt
+        % Only leave this space if the footline is nonempty.
+        % (We lessened \vsize for it in \oddfootingyyy.)
+        % The \baselineskip=24pt in plain's \makefootline has no effect.
+        \vskip 24pt
+        \unvbox\footlinebox
+      \fi
+      %
+      \ifcropmarks
+          \egroup % end of \vbox\bgroup
+        \hfil\egroup % end of (centering) \line\bgroup
+        \vskip\topandbottommargin plus1fill minus1fill
+        \boxmaxdepth = \cornerthick
+        \vbox to0pt{\vss
+          \line{%
+            \vbox{\moveleft\cornerthick\nsbot}%
+            \hfill
+            \vbox{\moveright\cornerthick\nsbot}%
+          }%
+          \nointerlineskip
+          \line{\ewbot\hfil\ewbot}%
+        }%
+      \egroup % \vbox from first cropmarks clause
+      \fi
+    }% end of \shipout\vbox
+  }% end of group with \indexdummies
+  \advancepageno
+  \ifnum\outputpenalty>-20000 \else\dosupereject\fi
+}
+
+\newinsert\margin \dimen\margin=\maxdimen
+
+\def\pagebody#1{\vbox to\pageheight{\boxmaxdepth=\maxdepth #1}}
+{\catcode`\@ =11
+\gdef\pagecontents#1{\ifvoid\topins\else\unvbox\topins\fi
+% marginal hacks, juha at viisa.uucp (Juha Takala)
+\ifvoid\margin\else % marginal info is present
+  \rlap{\kern\hsize\vbox to\z@{\kern1pt\box\margin \vss}}\fi
+\dimen@=\dp#1\relax \unvbox#1\relax
+\ifvoid\footins\else\vskip\skip\footins\footnoterule \unvbox\footins\fi
+\ifr at ggedbottom \kern-\dimen@ \vfil \fi}
+}
+
+% Here are the rules for the cropmarks.  Note that they are
+% offset so that the space between them is truly \outerhsize or \outervsize
+% (P. A. MacKay, 12 November, 1986)
+%
+\def\ewtop{\vrule height\cornerthick depth0pt width\cornerlong}
+\def\nstop{\vbox
+  {\hrule height\cornerthick depth\cornerlong width\cornerthick}}
+\def\ewbot{\vrule height0pt depth\cornerthick width\cornerlong}
+\def\nsbot{\vbox
+  {\hrule height\cornerlong depth\cornerthick width\cornerthick}}
+
+% Parse an argument, then pass it to #1.  The argument is the rest of
+% the input line (except we remove a trailing comment).  #1 should be a
+% macro which expects an ordinary undelimited TeX argument.
+%
+\def\parsearg{\parseargusing{}}
+\def\parseargusing#1#2{%
+  \def\argtorun{#2}%
+  \begingroup
+    \obeylines
+    \spaceisspace
+    #1%
+    \parseargline\empty% Insert the \empty token, see \finishparsearg below.
+}
+
+{\obeylines %
+  \gdef\parseargline#1^^M{%
+    \endgroup % End of the group started in \parsearg.
+    \argremovecomment #1\comment\ArgTerm%
+  }%
+}
+
+% First remove any @comment, then any @c comment.
+\def\argremovecomment#1\comment#2\ArgTerm{\argremovec #1\c\ArgTerm}
+\def\argremovec#1\c#2\ArgTerm{\argcheckspaces#1\^^M\ArgTerm}
+
+% Each occurrence of `\^^M' or `<space>\^^M' is replaced by a single space.
+%
+% \argremovec might leave us with trailing space, e.g.,
+%    @end itemize  @c foo
+% This space token undergoes the same procedure and is eventually removed
+% by \finishparsearg.
+%
+\def\argcheckspaces#1\^^M{\argcheckspacesX#1\^^M \^^M}
+\def\argcheckspacesX#1 \^^M{\argcheckspacesY#1\^^M}
+\def\argcheckspacesY#1\^^M#2\^^M#3\ArgTerm{%
+  \def\temp{#3}%
+  \ifx\temp\empty
+    % Do not use \next, perhaps the caller of \parsearg uses it; reuse \temp:
+    \let\temp\finishparsearg
+  \else
+    \let\temp\argcheckspaces
+  \fi
+  % Put the space token in:
+  \temp#1 #3\ArgTerm
+}
+
+% If a _delimited_ argument is enclosed in braces, they get stripped; so
+% to get _exactly_ the rest of the line, we had to prevent such situation.
+% We prepended an \empty token at the very beginning and we expand it now,
+% just before passing the control to \argtorun.
+% (Similarly, we have to think about #3 of \argcheckspacesY above: it is
+% either the null string, or it ends with \^^M---thus there is no danger
+% that a pair of braces would be stripped.
+%
+% But first, we have to remove the trailing space token.
+%
+\def\finishparsearg#1 \ArgTerm{\expandafter\argtorun\expandafter{#1}}
+
+% \parseargdef\foo{...}
+%	is roughly equivalent to
+% \def\foo{\parsearg\Xfoo}
+% \def\Xfoo#1{...}
+%
+% Actually, I use \csname\string\foo\endcsname, ie. \\foo, as it is my
+% favourite TeX trick.  --kasal, 16nov03
+
+\def\parseargdef#1{%
+  \expandafter \doparseargdef \csname\string#1\endcsname #1%
+}
+\def\doparseargdef#1#2{%
+  \def#2{\parsearg#1}%
+  \def#1##1%
+}
+
+% Several utility definitions with active space:
+{
+  \obeyspaces
+  \gdef\obeyedspace{ }
+
+  % Make each space character in the input produce a normal interword
+  % space in the output.  Don't allow a line break at this space, as this
+  % is used only in environments like @example, where each line of input
+  % should produce a line of output anyway.
+  %
+  \gdef\sepspaces{\obeyspaces\let =\tie}
+
+  % If an index command is used in an @example environment, any spaces
+  % therein should become regular spaces in the raw index file, not the
+  % expansion of \tie (\leavevmode \penalty \@M \ ).
+  \gdef\unsepspaces{\let =\space}
+}
+
+
+\def\flushcr{\ifx\par\lisppar \def\next##1{}\else \let\next=\relax \fi \next}
+
+% Define the framework for environments in texinfo.tex.  It's used like this:
+%
+%   \envdef\foo{...}
+%   \def\Efoo{...}
+%
+% It's the responsibility of \envdef to insert \begingroup before the
+% actual body; @end closes the group after calling \Efoo.  \envdef also
+% defines \thisenv, so the current environment is known; @end checks
+% whether the environment name matches.  The \checkenv macro can also be
+% used to check whether the current environment is the one expected.
+%
+% Non-false conditionals (@iftex, @ifset) don't fit into this, so they
+% are not treated as environments; they don't open a group.  (The
+% implementation of @end takes care not to call \endgroup in this
+% special case.)
+
+
+% At run-time, environments start with this:
+\def\startenvironment#1{\begingroup\def\thisenv{#1}}
+% initialize
+\let\thisenv\empty
+
+% ... but they get defined via ``\envdef\foo{...}'':
+\long\def\envdef#1#2{\def#1{\startenvironment#1#2}}
+\def\envparseargdef#1#2{\parseargdef#1{\startenvironment#1#2}}
+
+% Check whether we're in the right environment:
+\def\checkenv#1{%
+  \def\temp{#1}%
+  \ifx\thisenv\temp
+  \else
+    \badenverr
+  \fi
+}
+
+% Environment mismatch, #1 expected:
+\def\badenverr{%
+  \errhelp = \EMsimple
+  \errmessage{This command can appear only \inenvironment\temp,
+    not \inenvironment\thisenv}%
+}
+\def\inenvironment#1{%
+  \ifx#1\empty
+    outside of any environment%
+  \else
+    in environment \expandafter\string#1%
+  \fi
+}
+
+% @end foo executes the definition of \Efoo.
+% But first, it executes a specialized version of \checkenv
+%
+\parseargdef\end{%
+  \if 1\csname iscond.#1\endcsname
+  \else
+    % The general wording of \badenverr may not be ideal.
+    \expandafter\checkenv\csname#1\endcsname
+    \csname E#1\endcsname
+    \endgroup
+  \fi
+}
+
+\newhelp\EMsimple{Press RETURN to continue.}
+
+
+% Be sure we're in horizontal mode when doing a tie, since we make space
+% equivalent to this in @example-like environments. Otherwise, a space
+% at the beginning of a line will start with \penalty -- and
+% since \penalty is valid in vertical mode, we'd end up putting the
+% penalty on the vertical list instead of in the new paragraph.
+{\catcode`@ = 11
+ % Avoid using \@M directly, because that causes trouble
+ % if the definition is written into an index file.
+ \global\let\tiepenalty = \@M
+ \gdef\tie{\leavevmode\penalty\tiepenalty\ }
+}
+
+% @: forces normal size whitespace following.
+\def\:{\spacefactor=1000 }
+
+% @* forces a line break.
+\def\*{\unskip\hfil\break\hbox{}\ignorespaces}
+
+% @/ allows a line break.
+\let\/=\allowbreak
+
+% @. is an end-of-sentence period.
+\def\.{.\spacefactor=\endofsentencespacefactor\space}
+
+% @! is an end-of-sentence bang.
+\def\!{!\spacefactor=\endofsentencespacefactor\space}
+
+% @? is an end-of-sentence query.
+\def\?{?\spacefactor=\endofsentencespacefactor\space}
+
+% @frenchspacing on|off  says whether to put extra space after punctuation.
+%
+\def\onword{on}
+\def\offword{off}
+%
+\parseargdef\frenchspacing{%
+  \def\temp{#1}%
+  \ifx\temp\onword \plainfrenchspacing
+  \else\ifx\temp\offword \plainnonfrenchspacing
+  \else
+    \errhelp = \EMsimple
+    \errmessage{Unknown @frenchspacing option `\temp', must be on|off}%
+  \fi\fi
+}
+
+% @w prevents a word break.  Without the \leavevmode, @w at the
+% beginning of a paragraph, when TeX is still in vertical mode, would
+% produce a whole line of output instead of starting the paragraph.
+\def\w#1{\leavevmode\hbox{#1}}
+
+% @group ... @end group forces ... to be all on one page, by enclosing
+% it in a TeX vbox.  We use \vtop instead of \vbox to construct the box
+% to keep its height that of a normal line.  According to the rules for
+% \topskip (p.114 of the TeXbook), the glue inserted is
+% max (\topskip - \ht (first item), 0).  If that height is large,
+% therefore, no glue is inserted, and the space between the headline and
+% the text is small, which looks bad.
+%
+% Another complication is that the group might be very large.  This can
+% cause the glue on the previous page to be unduly stretched, because it
+% does not have much material.  In this case, it's better to add an
+% explicit \vfill so that the extra space is at the bottom.  The
+% threshold for doing this is if the group is more than \vfilllimit
+% percent of a page (\vfilllimit can be changed inside of @tex).
+%
+\newbox\groupbox
+\def\vfilllimit{0.7}
+%
+\envdef\group{%
+  \ifnum\catcode`\^^M=\active \else
+    \errhelp = \groupinvalidhelp
+    \errmessage{@group invalid in context where filling is enabled}%
+  \fi
+  \startsavinginserts
+  %
+  \setbox\groupbox = \vtop\bgroup
+    % Do @comment since we are called inside an environment such as
+    % @example, where each end-of-line in the input causes an
+    % end-of-line in the output.  We don't want the end-of-line after
+    % the `@group' to put extra space in the output.  Since @group
+    % should appear on a line by itself (according to the Texinfo
+    % manual), we don't worry about eating any user text.
+    \comment
+}
+%
+% The \vtop produces a box with normal height and large depth; thus, TeX puts
+% \baselineskip glue before it, and (when the next line of text is done)
+% \lineskip glue after it.  Thus, space below is not quite equal to space
+% above.  But it's pretty close.
+\def\Egroup{%
+    % To get correct interline space between the last line of the group
+    % and the first line afterwards, we have to propagate \prevdepth.
+    \endgraf % Not \par, as it may have been set to \lisppar.
+    \global\dimen1 = \prevdepth
+  \egroup           % End the \vtop.
+  % \dimen0 is the vertical size of the group's box.
+  \dimen0 = \ht\groupbox  \advance\dimen0 by \dp\groupbox
+  % \dimen2 is how much space is left on the page (more or less).
+  \dimen2 = \pageheight   \advance\dimen2 by -\pagetotal
+  % if the group doesn't fit on the current page, and it's a big big
+  % group, force a page break.
+  \ifdim \dimen0 > \dimen2
+    \ifdim \pagetotal < \vfilllimit\pageheight
+      \page
+    \fi
+  \fi
+  \box\groupbox
+  \prevdepth = \dimen1
+  \checkinserts
+}
+%
+% TeX puts in an \escapechar (i.e., `@') at the beginning of the help
+% message, so this ends up printing `@group can only ...'.
+%
+\newhelp\groupinvalidhelp{%
+group can only be used in environments such as @example,^^J%
+where each line of input produces a line of output.}
+
+% @need space-in-mils
+% forces a page break if there is not space-in-mils remaining.
+
+\newdimen\mil  \mil=0.001in
+
+\parseargdef\need{%
+  % Ensure vertical mode, so we don't make a big box in the middle of a
+  % paragraph.
+  \par
+  %
+  % If the @need value is less than one line space, it's useless.
+  \dimen0 = #1\mil
+  \dimen2 = \ht\strutbox
+  \advance\dimen2 by \dp\strutbox
+  \ifdim\dimen0 > \dimen2
+    %
+    % Do a \strut just to make the height of this box be normal, so the
+    % normal leading is inserted relative to the preceding line.
+    % And a page break here is fine.
+    \vtop to #1\mil{\strut\vfil}%
+    %
+    % TeX does not even consider page breaks if a penalty added to the
+    % main vertical list is 10000 or more.  But in order to see if the
+    % empty box we just added fits on the page, we must make it consider
+    % page breaks.  On the other hand, we don't want to actually break the
+    % page after the empty box.  So we use a penalty of 9999.
+    %
+    % There is an extremely small chance that TeX will actually break the
+    % page at this \penalty, if there are no other feasible breakpoints in
+    % sight.  (If the user is using lots of big @group commands, which
+    % almost-but-not-quite fill up a page, TeX will have a hard time doing
+    % good page breaking, for example.)  However, I could not construct an
+    % example where a page broke at this \penalty; if it happens in a real
+    % document, then we can reconsider our strategy.
+    \penalty9999
+    %
+    % Back up by the size of the box, whether we did a page break or not.
+    \kern -#1\mil
+    %
+    % Do not allow a page break right after this kern.
+    \nobreak
+  \fi
+}
+
+% @br   forces paragraph break (and is undocumented).
+
+\let\br = \par
+
+% @page forces the start of a new page.
+%
+\def\page{\par\vfill\supereject}
+
+% @exdent text....
+% outputs text on separate line in roman font, starting at standard page margin
+
+% This records the amount of indent in the innermost environment.
+% That's how much \exdent should take out.
+\newskip\exdentamount
+
+% This defn is used inside fill environments such as @defun.
+\parseargdef\exdent{\hfil\break\hbox{\kern -\exdentamount{\rm#1}}\hfil\break}
+
+% This defn is used inside nofill environments such as @example.
+\parseargdef\nofillexdent{{\advance \leftskip by -\exdentamount
+  \leftline{\hskip\leftskip{\rm#1}}}}
+
+% @inmargin{WHICH}{TEXT} puts TEXT in the WHICH margin next to the current
+% paragraph.  For more general purposes, use the \margin insertion
+% class.  WHICH is `l' or `r'.  Not documented, written for gawk manual.
+%
+\newskip\inmarginspacing \inmarginspacing=1cm
+\def\strutdepth{\dp\strutbox}
+%
+\def\doinmargin#1#2{\strut\vadjust{%
+  \nobreak
+  \kern-\strutdepth
+  \vtop to \strutdepth{%
+    \baselineskip=\strutdepth
+    \vss
+    % if you have multiple lines of stuff to put here, you'll need to
+    % make the vbox yourself of the appropriate size.
+    \ifx#1l%
+      \llap{\ignorespaces #2\hskip\inmarginspacing}%
+    \else
+      \rlap{\hskip\hsize \hskip\inmarginspacing \ignorespaces #2}%
+    \fi
+    \null
+  }%
+}}
+\def\inleftmargin{\doinmargin l}
+\def\inrightmargin{\doinmargin r}
+%
+% @inmargin{TEXT [, RIGHT-TEXT]}
+% (if RIGHT-TEXT is given, use TEXT for left page, RIGHT-TEXT for right;
+% else use TEXT for both).
+%
+\def\inmargin#1{\parseinmargin #1,,\finish}
+\def\parseinmargin#1,#2,#3\finish{% not perfect, but better than nothing.
+  \setbox0 = \hbox{\ignorespaces #2}%
+  \ifdim\wd0 > 0pt
+    \def\lefttext{#1}%  have both texts
+    \def\righttext{#2}%
+  \else
+    \def\lefttext{#1}%  have only one text
+    \def\righttext{#1}%
+  \fi
+  %
+  \ifodd\pageno
+    \def\temp{\inrightmargin\righttext}% odd page -> outside is right margin
+  \else
+    \def\temp{\inleftmargin\lefttext}%
+  \fi
+  \temp
+}
+
+% @| inserts a changebar to the left of the current line.  It should
+% surround any changed text.  This approach does *not* work if the
+% change spans more than two lines of output.  To handle that, we would
+% have adopt a much more difficult approach (putting marks into the main
+% vertical list for the beginning and end of each change).  This command
+% is not documented, not supported, and doesn't work.
+%
+\def\|{%
+  % \vadjust can only be used in horizontal mode.
+  \leavevmode
+  %
+  % Append this vertical mode material after the current line in the output.
+  \vadjust{%
+    % We want to insert a rule with the height and depth of the current
+    % leading; that is exactly what \strutbox is supposed to record.
+    \vskip-\baselineskip
+    %
+    % \vadjust-items are inserted at the left edge of the type.  So
+    % the \llap here moves out into the left-hand margin.
+    \llap{%
+      %
+      % For a thicker or thinner bar, change the `1pt'.
+      \vrule height\baselineskip width1pt
+      %
+      % This is the space between the bar and the text.
+      \hskip 12pt
+    }%
+  }%
+}
+
+% @include FILE -- \input text of FILE.
+%
+\def\include{\parseargusing\filenamecatcodes\includezzz}
+\def\includezzz#1{%
+  \pushthisfilestack
+  \def\thisfile{#1}%
+  {%
+    \makevalueexpandable  % we want to expand any @value in FILE.
+    \turnoffactive        % and allow special characters in the expansion
+    \indexnofonts         % Allow `@@' and other weird things in file names.
+    \wlog{texinfo.tex: doing @include of #1^^J}%
+    \edef\temp{\noexpand\input #1 }%
+    %
+    % This trickery is to read FILE outside of a group, in case it makes
+    % definitions, etc.
+    \expandafter
+  }\temp
+  \popthisfilestack
+}
+\def\filenamecatcodes{%
+  \catcode`\\=\other
+  \catcode`~=\other
+  \catcode`^=\other
+  \catcode`_=\other
+  \catcode`|=\other
+  \catcode`<=\other
+  \catcode`>=\other
+  \catcode`+=\other
+  \catcode`-=\other
+  \catcode`\`=\other
+  \catcode`\'=\other
+}
+
+\def\pushthisfilestack{%
+  \expandafter\pushthisfilestackX\popthisfilestack\StackTerm
+}
+\def\pushthisfilestackX{%
+  \expandafter\pushthisfilestackY\thisfile\StackTerm
+}
+\def\pushthisfilestackY #1\StackTerm #2\StackTerm {%
+  \gdef\popthisfilestack{\gdef\thisfile{#1}\gdef\popthisfilestack{#2}}%
+}
+
+\def\popthisfilestack{\errthisfilestackempty}
+\def\errthisfilestackempty{\errmessage{Internal error:
+  the stack of filenames is empty.}}
+%
+\def\thisfile{}
+
+% @center line
+% outputs that line, centered.
+%
+\parseargdef\center{%
+  \ifhmode
+    \let\centersub\centerH
+  \else
+    \let\centersub\centerV
+  \fi
+  \centersub{\hfil \ignorespaces#1\unskip \hfil}%
+  \let\centersub\relax % don't let the definition persist, just in case
+}
+\def\centerH#1{{%
+  \hfil\break
+  \advance\hsize by -\leftskip
+  \advance\hsize by -\rightskip
+  \line{#1}%
+  \break
+}}
+%
+\newcount\centerpenalty
+\def\centerV#1{%
+  % The idea here is the same as in \startdefun, \cartouche, etc.: if
+  % @center is the first thing after a section heading, we need to wipe
+  % out the negative parskip inserted by \sectionheading, but still
+  % prevent a page break here.
+  \centerpenalty = \lastpenalty
+  \ifnum\centerpenalty>10000 \vskip\parskip \fi
+  \ifnum\centerpenalty>9999 \penalty\centerpenalty \fi
+  \line{\kern\leftskip #1\kern\rightskip}%
+}
+
+% @sp n   outputs n lines of vertical space
+%
+\parseargdef\sp{\vskip #1\baselineskip}
+
+% @comment ...line which is ignored...
+% @c is the same as @comment
+% @ignore ... @end ignore  is another way to write a comment
+%
+\def\comment{\begingroup \catcode`\^^M=\other%
+\catcode`\@=\other \catcode`\{=\other \catcode`\}=\other%
+\commentxxx}
+{\catcode`\^^M=\other \gdef\commentxxx#1^^M{\endgroup}}
+%
+\let\c=\comment
+
+% @paragraphindent NCHARS
+% We'll use ems for NCHARS, close enough.
+% NCHARS can also be the word `asis' or `none'.
+% We cannot feasibly implement @paragraphindent asis, though.
+%
+\def\asisword{asis} % no translation, these are keywords
+\def\noneword{none}
+%
+\parseargdef\paragraphindent{%
+  \def\temp{#1}%
+  \ifx\temp\asisword
+  \else
+    \ifx\temp\noneword
+      \defaultparindent = 0pt
+    \else
+      \defaultparindent = #1em
+    \fi
+  \fi
+  \parindent = \defaultparindent
+}
+
+% @exampleindent NCHARS
+% We'll use ems for NCHARS like @paragraphindent.
+% It seems @exampleindent asis isn't necessary, but
+% I preserve it to make it similar to @paragraphindent.
+\parseargdef\exampleindent{%
+  \def\temp{#1}%
+  \ifx\temp\asisword
+  \else
+    \ifx\temp\noneword
+      \lispnarrowing = 0pt
+    \else
+      \lispnarrowing = #1em
+    \fi
+  \fi
+}
+
+% @firstparagraphindent WORD
+% If WORD is `none', then suppress indentation of the first paragraph
+% after a section heading.  If WORD is `insert', then do indent at such
+% paragraphs.
+%
+% The paragraph indentation is suppressed or not by calling
+% \suppressfirstparagraphindent, which the sectioning commands do.
+% We switch the definition of this back and forth according to WORD.
+% By default, we suppress indentation.
+%
+\def\suppressfirstparagraphindent{\dosuppressfirstparagraphindent}
+\def\insertword{insert}
+%
+\parseargdef\firstparagraphindent{%
+  \def\temp{#1}%
+  \ifx\temp\noneword
+    \let\suppressfirstparagraphindent = \dosuppressfirstparagraphindent
+  \else\ifx\temp\insertword
+    \let\suppressfirstparagraphindent = \relax
+  \else
+    \errhelp = \EMsimple
+    \errmessage{Unknown @firstparagraphindent option `\temp'}%
+  \fi\fi
+}
+
+% Here is how we actually suppress indentation.  Redefine \everypar to
+% \kern backwards by \parindent, and then reset itself to empty.
+%
+% We also make \indent itself not actually do anything until the next
+% paragraph.
+%
+\gdef\dosuppressfirstparagraphindent{%
+  \gdef\indent{%
+    \restorefirstparagraphindent
+    \indent
+  }%
+  \gdef\noindent{%
+    \restorefirstparagraphindent
+    \noindent
+  }%
+  \global\everypar = {%
+    \kern -\parindent
+    \restorefirstparagraphindent
+  }%
+}
+
+\gdef\restorefirstparagraphindent{%
+  \global \let \indent = \ptexindent
+  \global \let \noindent = \ptexnoindent
+  \global \everypar = {}%
+}
+
+
+% @refill is a no-op.
+\let\refill=\relax
+
+% If working on a large document in chapters, it is convenient to
+% be able to disable indexing, cross-referencing, and contents, for test runs.
+% This is done with @novalidate (before @setfilename).
+%
+\newif\iflinks \linkstrue % by default we want the aux files.
+\let\novalidate = \linksfalse
+
+% @setfilename is done at the beginning of every texinfo file.
+% So open here the files we need to have open while reading the input.
+% This makes it possible to make a .fmt file for texinfo.
+\def\setfilename{%
+   \fixbackslash  % Turn off hack to swallow `\input texinfo'.
+   \iflinks
+     \tryauxfile
+     % Open the new aux file.  TeX will close it automatically at exit.
+     \immediate\openout\auxfile=\jobname.aux
+   \fi % \openindices needs to do some work in any case.
+   \openindices
+   \let\setfilename=\comment % Ignore extra @setfilename cmds.
+   %
+   % If texinfo.cnf is present on the system, read it.
+   % Useful for site-wide @afourpaper, etc.
+   \openin 1 texinfo.cnf
+   \ifeof 1 \else \input texinfo.cnf \fi
+   \closein 1
+   %
+   \comment % Ignore the actual filename.
+}
+
+% Called from \setfilename.
+%
+\def\openindices{%
+  \newindex{cp}%
+  \newcodeindex{fn}%
+  \newcodeindex{vr}%
+  \newcodeindex{tp}%
+  \newcodeindex{ky}%
+  \newcodeindex{pg}%
+}
+
+% @bye.
+\outer\def\bye{\pagealignmacro\tracingstats=1\ptexend}
+
+
+\message{pdf,}
+% adobe `portable' document format
+\newcount\tempnum
+\newcount\lnkcount
+\newtoks\filename
+\newcount\filenamelength
+\newcount\pgn
+\newtoks\toksA
+\newtoks\toksB
+\newtoks\toksC
+\newtoks\toksD
+\newbox\boxA
+\newcount\countA
+\newif\ifpdf
+\newif\ifpdfmakepagedest
+
+% when pdftex is run in dvi mode, \pdfoutput is defined (so \pdfoutput=1
+% can be set).  So we test for \relax and 0 as well as being undefined.
+\ifx\pdfoutput\thisisundefined
+\else
+  \ifx\pdfoutput\relax
+  \else
+    \ifcase\pdfoutput
+    \else
+      \pdftrue
+    \fi
+  \fi
+\fi
+
+% PDF uses PostScript string constants for the names of xref targets,
+% for display in the outlines, and in other places.  Thus, we have to
+% double any backslashes.  Otherwise, a name like "\node" will be
+% interpreted as a newline (\n), followed by o, d, e.  Not good.
+% 
+% See http://www.ntg.nl/pipermail/ntg-pdftex/2004-July/000654.html and
+% related messages.  The final outcome is that it is up to the TeX user
+% to double the backslashes and otherwise make the string valid, so
+% that's what we do.  pdftex 1.30.0 (ca.2005) introduced a primitive to
+% do this reliably, so we use it.
+
+% #1 is a control sequence in which to do the replacements,
+% which we \xdef.
+\def\txiescapepdf#1{%
+  \ifx\pdfescapestring\thisisundefined
+    % No primitive available; should we give a warning or log?
+    % Many times it won't matter.
+  \else
+    % The expandable \pdfescapestring primitive escapes parentheses,
+    % backslashes, and other special chars.
+    \xdef#1{\pdfescapestring{#1}}%
+  \fi
+}
+
+\newhelp\nopdfimagehelp{Texinfo supports .png, .jpg, .jpeg, and .pdf images
+with PDF output, and none of those formats could be found.  (.eps cannot
+be supported due to the design of the PDF format; use regular TeX (DVI
+output) for that.)}
+
+\ifpdf
+  %
+  % Color manipulation macros based on pdfcolor.tex,
+  % except using rgb instead of cmyk; the latter is said to render as a
+  % very dark gray on-screen and a very dark halftone in print, instead
+  % of actual black.
+  \def\rgbDarkRed{0.50 0.09 0.12}
+  \def\rgbBlack{0 0 0}
+  %
+  % k sets the color for filling (usual text, etc.);
+  % K sets the color for stroking (thin rules, e.g., normal _'s).
+  \def\pdfsetcolor#1{\pdfliteral{#1 rg  #1 RG}}
+  %
+  % Set color, and create a mark which defines \thiscolor accordingly,
+  % so that \makeheadline knows which color to restore.
+  \def\setcolor#1{%
+    \xdef\lastcolordefs{\gdef\noexpand\thiscolor{#1}}%
+    \domark
+    \pdfsetcolor{#1}%
+  }
+  %
+  \def\maincolor{\rgbBlack}
+  \pdfsetcolor{\maincolor}
+  \edef\thiscolor{\maincolor}
+  \def\lastcolordefs{}
+  %
+  \def\makefootline{%
+    \baselineskip24pt
+    \line{\pdfsetcolor{\maincolor}\the\footline}%
+  }
+  %
+  \def\makeheadline{%
+    \vbox to 0pt{%
+      \vskip-22.5pt
+      \line{%
+        \vbox to8.5pt{}%
+        % Extract \thiscolor definition from the marks.
+        \getcolormarks
+        % Typeset the headline with \maincolor, then restore the color.
+        \pdfsetcolor{\maincolor}\the\headline\pdfsetcolor{\thiscolor}%
+      }%
+      \vss
+    }%
+    \nointerlineskip
+  }
+  %
+  %
+  \pdfcatalog{/PageMode /UseOutlines}
+  %
+  % #1 is image name, #2 width (might be empty/whitespace), #3 height (ditto).
+  \def\dopdfimage#1#2#3{%
+    \def\pdfimagewidth{#2}\setbox0 = \hbox{\ignorespaces #2}%
+    \def\pdfimageheight{#3}\setbox2 = \hbox{\ignorespaces #3}%
+    %
+    % pdftex (and the PDF format) support .pdf, .png, .jpg (among
+    % others).  Let's try in that order, PDF first since if
+    % someone has a scalable image, presumably better to use that than a
+    % bitmap.
+    \let\pdfimgext=\empty
+    \begingroup
+      \openin 1 #1.pdf \ifeof 1
+        \openin 1 #1.PDF \ifeof 1
+          \openin 1 #1.png \ifeof 1
+            \openin 1 #1.jpg \ifeof 1
+              \openin 1 #1.jpeg \ifeof 1
+                \openin 1 #1.JPG \ifeof 1
+                  \errhelp = \nopdfimagehelp
+                  \errmessage{Could not find image file #1 for pdf}%
+                \else \gdef\pdfimgext{JPG}%
+                \fi
+              \else \gdef\pdfimgext{jpeg}%
+              \fi
+            \else \gdef\pdfimgext{jpg}%
+            \fi
+          \else \gdef\pdfimgext{png}%
+          \fi
+        \else \gdef\pdfimgext{PDF}%
+        \fi
+      \else \gdef\pdfimgext{pdf}%
+      \fi
+      \closein 1
+    \endgroup
+    %
+    % without \immediate, ancient pdftex seg faults when the same image is
+    % included twice.  (Version 3.14159-pre-1.0-unofficial-20010704.)
+    \ifnum\pdftexversion < 14
+      \immediate\pdfimage
+    \else
+      \immediate\pdfximage
+    \fi
+      \ifdim \wd0 >0pt width \pdfimagewidth \fi
+      \ifdim \wd2 >0pt height \pdfimageheight \fi
+      \ifnum\pdftexversion<13
+         #1.\pdfimgext
+       \else
+         {#1.\pdfimgext}%
+       \fi
+    \ifnum\pdftexversion < 14 \else
+      \pdfrefximage \pdflastximage
+    \fi}
+  %
+  \def\pdfmkdest#1{{%
+    % We have to set dummies so commands such as @code, and characters
+    % such as \, aren't expanded when present in a section title.
+    \indexnofonts
+    \turnoffactive
+    \makevalueexpandable
+    \def\pdfdestname{#1}%
+    \txiescapepdf\pdfdestname
+    \safewhatsit{\pdfdest name{\pdfdestname} xyz}%
+  }}
+  %
+  % used to mark target names; must be expandable.
+  \def\pdfmkpgn#1{#1}
+  %
+  % by default, use a color that is dark enough to print on paper as
+  % nearly black, but still distinguishable for online viewing.
+  \def\urlcolor{\rgbDarkRed}
+  \def\linkcolor{\rgbDarkRed}
+  \def\endlink{\setcolor{\maincolor}\pdfendlink}
+  %
+  % Adding outlines to PDF; macros for calculating structure of outlines
+  % come from Petr Olsak
+  \def\expnumber#1{\expandafter\ifx\csname#1\endcsname\relax 0%
+    \else \csname#1\endcsname \fi}
+  \def\advancenumber#1{\tempnum=\expnumber{#1}\relax
+    \advance\tempnum by 1
+    \expandafter\xdef\csname#1\endcsname{\the\tempnum}}
+  %
+  % #1 is the section text, which is what will be displayed in the
+  % outline by the pdf viewer.  #2 is the pdf expression for the number
+  % of subentries (or empty, for subsubsections).  #3 is the node text,
+  % which might be empty if this toc entry had no corresponding node.
+  % #4 is the page number
+  %
+  \def\dopdfoutline#1#2#3#4{%
+    % Generate a link to the node text if that exists; else, use the
+    % page number.  We could generate a destination for the section
+    % text in the case where a section has no node, but it doesn't
+    % seem worth the trouble, since most documents are normally structured.
+    \edef\pdfoutlinedest{#3}%
+    \ifx\pdfoutlinedest\empty
+      \def\pdfoutlinedest{#4}%
+    \else
+      \txiescapepdf\pdfoutlinedest
+    \fi
+    %
+    % Also escape PDF chars in the display string.
+    \edef\pdfoutlinetext{#1}%
+    \txiescapepdf\pdfoutlinetext
+    %
+    \pdfoutline goto name{\pdfmkpgn{\pdfoutlinedest}}#2{\pdfoutlinetext}%
+  }
+  %
+  \def\pdfmakeoutlines{%
+    \begingroup
+      % Read toc silently, to get counts of subentries for \pdfoutline.
+      \def\partentry##1##2##3##4{}% ignore parts in the outlines
+      \def\numchapentry##1##2##3##4{%
+	\def\thischapnum{##2}%
+	\def\thissecnum{0}%
+	\def\thissubsecnum{0}%
+      }%
+      \def\numsecentry##1##2##3##4{%
+	\advancenumber{chap\thischapnum}%
+	\def\thissecnum{##2}%
+	\def\thissubsecnum{0}%
+      }%
+      \def\numsubsecentry##1##2##3##4{%
+	\advancenumber{sec\thissecnum}%
+	\def\thissubsecnum{##2}%
+      }%
+      \def\numsubsubsecentry##1##2##3##4{%
+	\advancenumber{subsec\thissubsecnum}%
+      }%
+      \def\thischapnum{0}%
+      \def\thissecnum{0}%
+      \def\thissubsecnum{0}%
+      %
+      % use \def rather than \let here because we redefine \chapentry et
+      % al. a second time, below.
+      \def\appentry{\numchapentry}%
+      \def\appsecentry{\numsecentry}%
+      \def\appsubsecentry{\numsubsecentry}%
+      \def\appsubsubsecentry{\numsubsubsecentry}%
+      \def\unnchapentry{\numchapentry}%
+      \def\unnsecentry{\numsecentry}%
+      \def\unnsubsecentry{\numsubsecentry}%
+      \def\unnsubsubsecentry{\numsubsubsecentry}%
+      \readdatafile{toc}%
+      %
+      % Read toc second time, this time actually producing the outlines.
+      % The `-' means take the \expnumber as the absolute number of
+      % subentries, which we calculated on our first read of the .toc above.
+      %
+      % We use the node names as the destinations.
+      \def\numchapentry##1##2##3##4{%
+        \dopdfoutline{##1}{count-\expnumber{chap##2}}{##3}{##4}}%
+      \def\numsecentry##1##2##3##4{%
+        \dopdfoutline{##1}{count-\expnumber{sec##2}}{##3}{##4}}%
+      \def\numsubsecentry##1##2##3##4{%
+        \dopdfoutline{##1}{count-\expnumber{subsec##2}}{##3}{##4}}%
+      \def\numsubsubsecentry##1##2##3##4{% count is always zero
+        \dopdfoutline{##1}{}{##3}{##4}}%
+      %
+      % PDF outlines are displayed using system fonts, instead of
+      % document fonts.  Therefore we cannot use special characters,
+      % since the encoding is unknown.  For example, the eogonek from
+      % Latin 2 (0xea) gets translated to a | character.  Info from
+      % Staszek Wawrykiewicz, 19 Jan 2004 04:09:24 +0100.
+      %
+      % TODO this right, we have to translate 8-bit characters to
+      % their "best" equivalent, based on the @documentencoding.  Too
+      % much work for too little return.  Just use the ASCII equivalents
+      % we use for the index sort strings.
+      % 
+      \indexnofonts
+      \setupdatafile
+      % We can have normal brace characters in the PDF outlines, unlike
+      % Texinfo index files.  So set that up.
+      \def\{{\lbracecharliteral}%
+      \def\}{\rbracecharliteral}%
+      \catcode`\\=\active \otherbackslash
+      \input \tocreadfilename
+    \endgroup
+  }
+  {\catcode`[=1 \catcode`]=2
+   \catcode`{=\other \catcode`}=\other
+   \gdef\lbracecharliteral[{]%
+   \gdef\rbracecharliteral[}]%
+  ]
+  %
+  \def\skipspaces#1{\def\PP{#1}\def\D{|}%
+    \ifx\PP\D\let\nextsp\relax
+    \else\let\nextsp\skipspaces
+      \addtokens{\filename}{\PP}%
+      \advance\filenamelength by 1
+    \fi
+    \nextsp}
+  \def\getfilename#1{%
+    \filenamelength=0
+    % If we don't expand the argument now, \skipspaces will get
+    % snagged on things like "@value{foo}".
+    \edef\temp{#1}%
+    \expandafter\skipspaces\temp|\relax
+  }
+  \ifnum\pdftexversion < 14
+    \let \startlink \pdfannotlink
+  \else
+    \let \startlink \pdfstartlink
+  \fi
+  % make a live url in pdf output.
+  \def\pdfurl#1{%
+    \begingroup
+      % it seems we really need yet another set of dummies; have not
+      % tried to figure out what each command should do in the context
+      % of @url.  for now, just make @/ a no-op, that's the only one
+      % people have actually reported a problem with.
+      %
+      \normalturnoffactive
+      \def\@{@}%
+      \let\/=\empty
+      \makevalueexpandable
+      % do we want to go so far as to use \indexnofonts instead of just
+      % special-casing \var here?
+      \def\var##1{##1}%
+      %
+      \leavevmode\setcolor{\urlcolor}%
+      \startlink attr{/Border [0 0 0]}%
+        user{/Subtype /Link /A << /S /URI /URI (#1) >>}%
+    \endgroup}
+  \def\pdfgettoks#1.{\setbox\boxA=\hbox{\toksA={#1.}\toksB={}\maketoks}}
+  \def\addtokens#1#2{\edef\addtoks{\noexpand#1={\the#1#2}}\addtoks}
+  \def\adn#1{\addtokens{\toksC}{#1}\global\countA=1\let\next=\maketoks}
+  \def\poptoks#1#2|ENDTOKS|{\let\first=#1\toksD={#1}\toksA={#2}}
+  \def\maketoks{%
+    \expandafter\poptoks\the\toksA|ENDTOKS|\relax
+    \ifx\first0\adn0
+    \else\ifx\first1\adn1 \else\ifx\first2\adn2 \else\ifx\first3\adn3
+    \else\ifx\first4\adn4 \else\ifx\first5\adn5 \else\ifx\first6\adn6
+    \else\ifx\first7\adn7 \else\ifx\first8\adn8 \else\ifx\first9\adn9
+    \else
+      \ifnum0=\countA\else\makelink\fi
+      \ifx\first.\let\next=\done\else
+        \let\next=\maketoks
+        \addtokens{\toksB}{\the\toksD}
+        \ifx\first,\addtokens{\toksB}{\space}\fi
+      \fi
+    \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi
+    \next}
+  \def\makelink{\addtokens{\toksB}%
+    {\noexpand\pdflink{\the\toksC}}\toksC={}\global\countA=0}
+  \def\pdflink#1{%
+    \startlink attr{/Border [0 0 0]} goto name{\pdfmkpgn{#1}}
+    \setcolor{\linkcolor}#1\endlink}
+  \def\done{\edef\st{\global\noexpand\toksA={\the\toksB}}\st}
+\else
+  % non-pdf mode
+  \let\pdfmkdest = \gobble
+  \let\pdfurl = \gobble
+  \let\endlink = \relax
+  \let\setcolor = \gobble
+  \let\pdfsetcolor = \gobble
+  \let\pdfmakeoutlines = \relax
+\fi  % \ifx\pdfoutput
+
+
+\message{fonts,}
+
+% Change the current font style to #1, remembering it in \curfontstyle.
+% For now, we do not accumulate font styles: @b{@i{foo}} prints foo in
+% italics, not bold italics.
+%
+\def\setfontstyle#1{%
+  \def\curfontstyle{#1}% not as a control sequence, because we are \edef'd.
+  \csname ten#1\endcsname  % change the current font
+}
+
+% Select #1 fonts with the current style.
+%
+\def\selectfonts#1{\csname #1fonts\endcsname \csname\curfontstyle\endcsname}
+
+\def\rm{\fam=0 \setfontstyle{rm}}
+\def\it{\fam=\itfam \setfontstyle{it}}
+\def\sl{\fam=\slfam \setfontstyle{sl}}
+\def\bf{\fam=\bffam \setfontstyle{bf}}\def\bfstylename{bf}
+\def\tt{\fam=\ttfam \setfontstyle{tt}}
+
+% Unfortunately, we have to override this for titles and the like, since
+% in those cases "rm" is bold.  Sigh.
+\def\rmisbold{\rm\def\curfontstyle{bf}}
+
+% Texinfo sort of supports the sans serif font style, which plain TeX does not.
+% So we set up a \sf.
+\newfam\sffam
+\def\sf{\fam=\sffam \setfontstyle{sf}}
+\let\li = \sf % Sometimes we call it \li, not \sf.
+
+% We don't need math for this font style.
+\def\ttsl{\setfontstyle{ttsl}}
+
+
+% Set the baselineskip to #1, and the lineskip and strut size
+% correspondingly.  There is no deep meaning behind these magic numbers
+% used as factors; they just match (closely enough) what Knuth defined.
+%
+\def\lineskipfactor{.08333}
+\def\strutheightpercent{.70833}
+\def\strutdepthpercent {.29167}
+%
+% can get a sort of poor man's double spacing by redefining this.
+\def\baselinefactor{1}
+%
+\newdimen\textleading
+\def\setleading#1{%
+  \dimen0 = #1\relax
+  \normalbaselineskip = \baselinefactor\dimen0
+  \normallineskip = \lineskipfactor\normalbaselineskip
+  \normalbaselines
+  \setbox\strutbox =\hbox{%
+    \vrule width0pt height\strutheightpercent\baselineskip
+                    depth \strutdepthpercent \baselineskip
+  }%
+}
+
+% PDF CMaps.  See also LaTeX's t1.cmap.
+%
+% do nothing with this by default.
+\expandafter\let\csname cmapOT1\endcsname\gobble
+\expandafter\let\csname cmapOT1IT\endcsname\gobble
+\expandafter\let\csname cmapOT1TT\endcsname\gobble
+
+% if we are producing pdf, and we have \pdffontattr, then define cmaps.
+% (\pdffontattr was introduced many years ago, but people still run
+% older pdftex's; it's easy to conditionalize, so we do.)
+\ifpdf \ifx\pdffontattr\thisisundefined \else
+  \begingroup
+    \catcode`\^^M=\active \def^^M{^^J}% Output line endings as the ^^J char.
+    \catcode`\%=12 \immediate\pdfobj stream {%!PS-Adobe-3.0 Resource-CMap
+%%DocumentNeededResources: ProcSet (CIDInit)
+%%IncludeResource: ProcSet (CIDInit)
+%%BeginResource: CMap (TeX-OT1-0)
+%%Title: (TeX-OT1-0 TeX OT1 0)
+%%Version: 1.000
+%%EndComments
+/CIDInit /ProcSet findresource begin
+12 dict begin
+begincmap
+/CIDSystemInfo
+<< /Registry (TeX)
+/Ordering (OT1)
+/Supplement 0
+>> def
+/CMapName /TeX-OT1-0 def
+/CMapType 2 def
+1 begincodespacerange
+<00> <7F>
+endcodespacerange
+8 beginbfrange
+<00> <01> <0393>
+<09> <0A> <03A8>
+<23> <26> <0023>
+<28> <3B> <0028>
+<3F> <5B> <003F>
+<5D> <5E> <005D>
+<61> <7A> <0061>
+<7B> <7C> <2013>
+endbfrange
+40 beginbfchar
+<02> <0398>
+<03> <039B>
+<04> <039E>
+<05> <03A0>
+<06> <03A3>
+<07> <03D2>
+<08> <03A6>
+<0B> <00660066>
+<0C> <00660069>
+<0D> <0066006C>
+<0E> <006600660069>
+<0F> <00660066006C>
+<10> <0131>
+<11> <0237>
+<12> <0060>
+<13> <00B4>
+<14> <02C7>
+<15> <02D8>
+<16> <00AF>
+<17> <02DA>
+<18> <00B8>
+<19> <00DF>
+<1A> <00E6>
+<1B> <0153>
+<1C> <00F8>
+<1D> <00C6>
+<1E> <0152>
+<1F> <00D8>
+<21> <0021>
+<22> <201D>
+<27> <2019>
+<3C> <00A1>
+<3D> <003D>
+<3E> <00BF>
+<5C> <201C>
+<5F> <02D9>
+<60> <2018>
+<7D> <02DD>
+<7E> <007E>
+<7F> <00A8>
+endbfchar
+endcmap
+CMapName currentdict /CMap defineresource pop
+end
+end
+%%EndResource
+%%EOF
+    }\endgroup
+  \expandafter\edef\csname cmapOT1\endcsname#1{%
+    \pdffontattr#1{/ToUnicode \the\pdflastobj\space 0 R}%
+  }%
+%
+% \cmapOT1IT
+  \begingroup
+    \catcode`\^^M=\active \def^^M{^^J}% Output line endings as the ^^J char.
+    \catcode`\%=12 \immediate\pdfobj stream {%!PS-Adobe-3.0 Resource-CMap
+%%DocumentNeededResources: ProcSet (CIDInit)
+%%IncludeResource: ProcSet (CIDInit)
+%%BeginResource: CMap (TeX-OT1IT-0)
+%%Title: (TeX-OT1IT-0 TeX OT1IT 0)
+%%Version: 1.000
+%%EndComments
+/CIDInit /ProcSet findresource begin
+12 dict begin
+begincmap
+/CIDSystemInfo
+<< /Registry (TeX)
+/Ordering (OT1IT)
+/Supplement 0
+>> def
+/CMapName /TeX-OT1IT-0 def
+/CMapType 2 def
+1 begincodespacerange
+<00> <7F>
+endcodespacerange
+8 beginbfrange
+<00> <01> <0393>
+<09> <0A> <03A8>
+<25> <26> <0025>
+<28> <3B> <0028>
+<3F> <5B> <003F>
+<5D> <5E> <005D>
+<61> <7A> <0061>
+<7B> <7C> <2013>
+endbfrange
+42 beginbfchar
+<02> <0398>
+<03> <039B>
+<04> <039E>
+<05> <03A0>
+<06> <03A3>
+<07> <03D2>
+<08> <03A6>
+<0B> <00660066>
+<0C> <00660069>
+<0D> <0066006C>
+<0E> <006600660069>
+<0F> <00660066006C>
+<10> <0131>
+<11> <0237>
+<12> <0060>
+<13> <00B4>
+<14> <02C7>
+<15> <02D8>
+<16> <00AF>
+<17> <02DA>
+<18> <00B8>
+<19> <00DF>
+<1A> <00E6>
+<1B> <0153>
+<1C> <00F8>
+<1D> <00C6>
+<1E> <0152>
+<1F> <00D8>
+<21> <0021>
+<22> <201D>
+<23> <0023>
+<24> <00A3>
+<27> <2019>
+<3C> <00A1>
+<3D> <003D>
+<3E> <00BF>
+<5C> <201C>
+<5F> <02D9>
+<60> <2018>
+<7D> <02DD>
+<7E> <007E>
+<7F> <00A8>
+endbfchar
+endcmap
+CMapName currentdict /CMap defineresource pop
+end
+end
+%%EndResource
+%%EOF
+    }\endgroup
+  \expandafter\edef\csname cmapOT1IT\endcsname#1{%
+    \pdffontattr#1{/ToUnicode \the\pdflastobj\space 0 R}%
+  }%
+%
+% \cmapOT1TT
+  \begingroup
+    \catcode`\^^M=\active \def^^M{^^J}% Output line endings as the ^^J char.
+    \catcode`\%=12 \immediate\pdfobj stream {%!PS-Adobe-3.0 Resource-CMap
+%%DocumentNeededResources: ProcSet (CIDInit)
+%%IncludeResource: ProcSet (CIDInit)
+%%BeginResource: CMap (TeX-OT1TT-0)
+%%Title: (TeX-OT1TT-0 TeX OT1TT 0)
+%%Version: 1.000
+%%EndComments
+/CIDInit /ProcSet findresource begin
+12 dict begin
+begincmap
+/CIDSystemInfo
+<< /Registry (TeX)
+/Ordering (OT1TT)
+/Supplement 0
+>> def
+/CMapName /TeX-OT1TT-0 def
+/CMapType 2 def
+1 begincodespacerange
+<00> <7F>
+endcodespacerange
+5 beginbfrange
+<00> <01> <0393>
+<09> <0A> <03A8>
+<21> <26> <0021>
+<28> <5F> <0028>
+<61> <7E> <0061>
+endbfrange
+32 beginbfchar
+<02> <0398>
+<03> <039B>
+<04> <039E>
+<05> <03A0>
+<06> <03A3>
+<07> <03D2>
+<08> <03A6>
+<0B> <2191>
+<0C> <2193>
+<0D> <0027>
+<0E> <00A1>
+<0F> <00BF>
+<10> <0131>
+<11> <0237>
+<12> <0060>
+<13> <00B4>
+<14> <02C7>
+<15> <02D8>
+<16> <00AF>
+<17> <02DA>
+<18> <00B8>
+<19> <00DF>
+<1A> <00E6>
+<1B> <0153>
+<1C> <00F8>
+<1D> <00C6>
+<1E> <0152>
+<1F> <00D8>
+<20> <2423>
+<27> <2019>
+<60> <2018>
+<7F> <00A8>
+endbfchar
+endcmap
+CMapName currentdict /CMap defineresource pop
+end
+end
+%%EndResource
+%%EOF
+    }\endgroup
+  \expandafter\edef\csname cmapOT1TT\endcsname#1{%
+    \pdffontattr#1{/ToUnicode \the\pdflastobj\space 0 R}%
+  }%
+\fi\fi
+
+
+% Set the font macro #1 to the font named \fontprefix#2.
+% #3 is the font's design size, #4 is a scale factor, #5 is the CMap
+% encoding (only OT1, OT1IT and OT1TT are allowed, or empty to omit).
+% Example:
+% #1 = \textrm
+% #2 = \rmshape
+% #3 = 10
+% #4 = \mainmagstep
+% #5 = OT1
+%
+\def\setfont#1#2#3#4#5{%
+  \font#1=\fontprefix#2#3 scaled #4
+  \csname cmap#5\endcsname#1%
+}
+% This is what gets called when #5 of \setfont is empty.
+\let\cmap\gobble
+%
+% (end of cmaps)
+
+% Use cm as the default font prefix.
+% To specify the font prefix, you must define \fontprefix
+% before you read in texinfo.tex.
+\ifx\fontprefix\thisisundefined
+\def\fontprefix{cm}
+\fi
+% Support font families that don't use the same naming scheme as CM.
+\def\rmshape{r}
+\def\rmbshape{bx}               % where the normal face is bold
+\def\bfshape{b}
+\def\bxshape{bx}
+\def\ttshape{tt}
+\def\ttbshape{tt}
+\def\ttslshape{sltt}
+\def\itshape{ti}
+\def\itbshape{bxti}
+\def\slshape{sl}
+\def\slbshape{bxsl}
+\def\sfshape{ss}
+\def\sfbshape{ss}
+\def\scshape{csc}
+\def\scbshape{csc}
+
+% Definitions for a main text size of 11pt.  (The default in Texinfo.)
+%
+\def\definetextfontsizexi{%
+% Text fonts (11.2pt, magstep1).
+\def\textnominalsize{11pt}
+\edef\mainmagstep{\magstephalf}
+\setfont\textrm\rmshape{10}{\mainmagstep}{OT1}
+\setfont\texttt\ttshape{10}{\mainmagstep}{OT1TT}
+\setfont\textbf\bfshape{10}{\mainmagstep}{OT1}
+\setfont\textit\itshape{10}{\mainmagstep}{OT1IT}
+\setfont\textsl\slshape{10}{\mainmagstep}{OT1}
+\setfont\textsf\sfshape{10}{\mainmagstep}{OT1}
+\setfont\textsc\scshape{10}{\mainmagstep}{OT1}
+\setfont\textttsl\ttslshape{10}{\mainmagstep}{OT1TT}
+\font\texti=cmmi10 scaled \mainmagstep
+\font\textsy=cmsy10 scaled \mainmagstep
+\def\textecsize{1095}
+
+% A few fonts for @defun names and args.
+\setfont\defbf\bfshape{10}{\magstep1}{OT1}
+\setfont\deftt\ttshape{10}{\magstep1}{OT1TT}
+\setfont\defttsl\ttslshape{10}{\magstep1}{OT1TT}
+\def\df{\let\tentt=\deftt \let\tenbf = \defbf \let\tenttsl=\defttsl \bf}
+
+% Fonts for indices, footnotes, small examples (9pt).
+\def\smallnominalsize{9pt}
+\setfont\smallrm\rmshape{9}{1000}{OT1}
+\setfont\smalltt\ttshape{9}{1000}{OT1TT}
+\setfont\smallbf\bfshape{10}{900}{OT1}
+\setfont\smallit\itshape{9}{1000}{OT1IT}
+\setfont\smallsl\slshape{9}{1000}{OT1}
+\setfont\smallsf\sfshape{9}{1000}{OT1}
+\setfont\smallsc\scshape{10}{900}{OT1}
+\setfont\smallttsl\ttslshape{10}{900}{OT1TT}
+\font\smalli=cmmi9
+\font\smallsy=cmsy9
+\def\smallecsize{0900}
+
+% Fonts for small examples (8pt).
+\def\smallernominalsize{8pt}
+\setfont\smallerrm\rmshape{8}{1000}{OT1}
+\setfont\smallertt\ttshape{8}{1000}{OT1TT}
+\setfont\smallerbf\bfshape{10}{800}{OT1}
+\setfont\smallerit\itshape{8}{1000}{OT1IT}
+\setfont\smallersl\slshape{8}{1000}{OT1}
+\setfont\smallersf\sfshape{8}{1000}{OT1}
+\setfont\smallersc\scshape{10}{800}{OT1}
+\setfont\smallerttsl\ttslshape{10}{800}{OT1TT}
+\font\smalleri=cmmi8
+\font\smallersy=cmsy8
+\def\smallerecsize{0800}
+
+% Fonts for title page (20.4pt):
+\def\titlenominalsize{20pt}
+\setfont\titlerm\rmbshape{12}{\magstep3}{OT1}
+\setfont\titleit\itbshape{10}{\magstep4}{OT1IT}
+\setfont\titlesl\slbshape{10}{\magstep4}{OT1}
+\setfont\titlett\ttbshape{12}{\magstep3}{OT1TT}
+\setfont\titlettsl\ttslshape{10}{\magstep4}{OT1TT}
+\setfont\titlesf\sfbshape{17}{\magstep1}{OT1}
+\let\titlebf=\titlerm
+\setfont\titlesc\scbshape{10}{\magstep4}{OT1}
+\font\titlei=cmmi12 scaled \magstep3
+\font\titlesy=cmsy10 scaled \magstep4
+\def\titleecsize{2074}
+
+% Chapter (and unnumbered) fonts (17.28pt).
+\def\chapnominalsize{17pt}
+\setfont\chaprm\rmbshape{12}{\magstep2}{OT1}
+\setfont\chapit\itbshape{10}{\magstep3}{OT1IT}
+\setfont\chapsl\slbshape{10}{\magstep3}{OT1}
+\setfont\chaptt\ttbshape{12}{\magstep2}{OT1TT}
+\setfont\chapttsl\ttslshape{10}{\magstep3}{OT1TT}
+\setfont\chapsf\sfbshape{17}{1000}{OT1}
+\let\chapbf=\chaprm
+\setfont\chapsc\scbshape{10}{\magstep3}{OT1}
+\font\chapi=cmmi12 scaled \magstep2
+\font\chapsy=cmsy10 scaled \magstep3
+\def\chapecsize{1728}
+
+% Section fonts (14.4pt).
+\def\secnominalsize{14pt}
+\setfont\secrm\rmbshape{12}{\magstep1}{OT1}
+\setfont\secit\itbshape{10}{\magstep2}{OT1IT}
+\setfont\secsl\slbshape{10}{\magstep2}{OT1}
+\setfont\sectt\ttbshape{12}{\magstep1}{OT1TT}
+\setfont\secttsl\ttslshape{10}{\magstep2}{OT1TT}
+\setfont\secsf\sfbshape{12}{\magstep1}{OT1}
+\let\secbf\secrm
+\setfont\secsc\scbshape{10}{\magstep2}{OT1}
+\font\seci=cmmi12 scaled \magstep1
+\font\secsy=cmsy10 scaled \magstep2
+\def\sececsize{1440}
+
+% Subsection fonts (13.15pt).
+\def\ssecnominalsize{13pt}
+\setfont\ssecrm\rmbshape{12}{\magstephalf}{OT1}
+\setfont\ssecit\itbshape{10}{1315}{OT1IT}
+\setfont\ssecsl\slbshape{10}{1315}{OT1}
+\setfont\ssectt\ttbshape{12}{\magstephalf}{OT1TT}
+\setfont\ssecttsl\ttslshape{10}{1315}{OT1TT}
+\setfont\ssecsf\sfbshape{12}{\magstephalf}{OT1}
+\let\ssecbf\ssecrm
+\setfont\ssecsc\scbshape{10}{1315}{OT1}
+\font\sseci=cmmi12 scaled \magstephalf
+\font\ssecsy=cmsy10 scaled 1315
+\def\ssececsize{1200}
+
+% Reduced fonts for @acro in text (10pt).
+\def\reducednominalsize{10pt}
+\setfont\reducedrm\rmshape{10}{1000}{OT1}
+\setfont\reducedtt\ttshape{10}{1000}{OT1TT}
+\setfont\reducedbf\bfshape{10}{1000}{OT1}
+\setfont\reducedit\itshape{10}{1000}{OT1IT}
+\setfont\reducedsl\slshape{10}{1000}{OT1}
+\setfont\reducedsf\sfshape{10}{1000}{OT1}
+\setfont\reducedsc\scshape{10}{1000}{OT1}
+\setfont\reducedttsl\ttslshape{10}{1000}{OT1TT}
+\font\reducedi=cmmi10
+\font\reducedsy=cmsy10
+\def\reducedecsize{1000}
+
+\textleading = 13.2pt % line spacing for 11pt CM
+\textfonts            % reset the current fonts
+\rm
+} % end of 11pt text font size definitions, \definetextfontsizexi
+
+
+% Definitions to make the main text be 10pt Computer Modern, with
+% section, chapter, etc., sizes following suit.  This is for the GNU
+% Press printing of the Emacs 22 manual.  Maybe other manuals in the
+% future.  Used with @smallbook, which sets the leading to 12pt.
+%
+\def\definetextfontsizex{%
+% Text fonts (10pt).
+\def\textnominalsize{10pt}
+\edef\mainmagstep{1000}
+\setfont\textrm\rmshape{10}{\mainmagstep}{OT1}
+\setfont\texttt\ttshape{10}{\mainmagstep}{OT1TT}
+\setfont\textbf\bfshape{10}{\mainmagstep}{OT1}
+\setfont\textit\itshape{10}{\mainmagstep}{OT1IT}
+\setfont\textsl\slshape{10}{\mainmagstep}{OT1}
+\setfont\textsf\sfshape{10}{\mainmagstep}{OT1}
+\setfont\textsc\scshape{10}{\mainmagstep}{OT1}
+\setfont\textttsl\ttslshape{10}{\mainmagstep}{OT1TT}
+\font\texti=cmmi10 scaled \mainmagstep
+\font\textsy=cmsy10 scaled \mainmagstep
+\def\textecsize{1000}
+
+% A few fonts for @defun names and args.
+\setfont\defbf\bfshape{10}{\magstephalf}{OT1}
+\setfont\deftt\ttshape{10}{\magstephalf}{OT1TT}
+\setfont\defttsl\ttslshape{10}{\magstephalf}{OT1TT}
+\def\df{\let\tentt=\deftt \let\tenbf = \defbf \let\tenttsl=\defttsl \bf}
+
+% Fonts for indices, footnotes, small examples (9pt).
+\def\smallnominalsize{9pt}
+\setfont\smallrm\rmshape{9}{1000}{OT1}
+\setfont\smalltt\ttshape{9}{1000}{OT1TT}
+\setfont\smallbf\bfshape{10}{900}{OT1}
+\setfont\smallit\itshape{9}{1000}{OT1IT}
+\setfont\smallsl\slshape{9}{1000}{OT1}
+\setfont\smallsf\sfshape{9}{1000}{OT1}
+\setfont\smallsc\scshape{10}{900}{OT1}
+\setfont\smallttsl\ttslshape{10}{900}{OT1TT}
+\font\smalli=cmmi9
+\font\smallsy=cmsy9
+\def\smallecsize{0900}
+
+% Fonts for small examples (8pt).
+\def\smallernominalsize{8pt}
+\setfont\smallerrm\rmshape{8}{1000}{OT1}
+\setfont\smallertt\ttshape{8}{1000}{OT1TT}
+\setfont\smallerbf\bfshape{10}{800}{OT1}
+\setfont\smallerit\itshape{8}{1000}{OT1IT}
+\setfont\smallersl\slshape{8}{1000}{OT1}
+\setfont\smallersf\sfshape{8}{1000}{OT1}
+\setfont\smallersc\scshape{10}{800}{OT1}
+\setfont\smallerttsl\ttslshape{10}{800}{OT1TT}
+\font\smalleri=cmmi8
+\font\smallersy=cmsy8
+\def\smallerecsize{0800}
+
+% Fonts for title page (20.4pt):
+\def\titlenominalsize{20pt}
+\setfont\titlerm\rmbshape{12}{\magstep3}{OT1}
+\setfont\titleit\itbshape{10}{\magstep4}{OT1IT}
+\setfont\titlesl\slbshape{10}{\magstep4}{OT1}
+\setfont\titlett\ttbshape{12}{\magstep3}{OT1TT}
+\setfont\titlettsl\ttslshape{10}{\magstep4}{OT1TT}
+\setfont\titlesf\sfbshape{17}{\magstep1}{OT1}
+\let\titlebf=\titlerm
+\setfont\titlesc\scbshape{10}{\magstep4}{OT1}
+\font\titlei=cmmi12 scaled \magstep3
+\font\titlesy=cmsy10 scaled \magstep4
+\def\titleecsize{2074}
+
+% Chapter fonts (14.4pt).
+\def\chapnominalsize{14pt}
+\setfont\chaprm\rmbshape{12}{\magstep1}{OT1}
+\setfont\chapit\itbshape{10}{\magstep2}{OT1IT}
+\setfont\chapsl\slbshape{10}{\magstep2}{OT1}
+\setfont\chaptt\ttbshape{12}{\magstep1}{OT1TT}
+\setfont\chapttsl\ttslshape{10}{\magstep2}{OT1TT}
+\setfont\chapsf\sfbshape{12}{\magstep1}{OT1}
+\let\chapbf\chaprm
+\setfont\chapsc\scbshape{10}{\magstep2}{OT1}
+\font\chapi=cmmi12 scaled \magstep1
+\font\chapsy=cmsy10 scaled \magstep2
+\def\chapecsize{1440}
+
+% Section fonts (12pt).
+\def\secnominalsize{12pt}
+\setfont\secrm\rmbshape{12}{1000}{OT1}
+\setfont\secit\itbshape{10}{\magstep1}{OT1IT}
+\setfont\secsl\slbshape{10}{\magstep1}{OT1}
+\setfont\sectt\ttbshape{12}{1000}{OT1TT}
+\setfont\secttsl\ttslshape{10}{\magstep1}{OT1TT}
+\setfont\secsf\sfbshape{12}{1000}{OT1}
+\let\secbf\secrm
+\setfont\secsc\scbshape{10}{\magstep1}{OT1}
+\font\seci=cmmi12
+\font\secsy=cmsy10 scaled \magstep1
+\def\sececsize{1200}
+
+% Subsection fonts (10pt).
+\def\ssecnominalsize{10pt}
+\setfont\ssecrm\rmbshape{10}{1000}{OT1}
+\setfont\ssecit\itbshape{10}{1000}{OT1IT}
+\setfont\ssecsl\slbshape{10}{1000}{OT1}
+\setfont\ssectt\ttbshape{10}{1000}{OT1TT}
+\setfont\ssecttsl\ttslshape{10}{1000}{OT1TT}
+\setfont\ssecsf\sfbshape{10}{1000}{OT1}
+\let\ssecbf\ssecrm
+\setfont\ssecsc\scbshape{10}{1000}{OT1}
+\font\sseci=cmmi10
+\font\ssecsy=cmsy10
+\def\ssececsize{1000}
+
+% Reduced fonts for @acro in text (9pt).
+\def\reducednominalsize{9pt}
+\setfont\reducedrm\rmshape{9}{1000}{OT1}
+\setfont\reducedtt\ttshape{9}{1000}{OT1TT}
+\setfont\reducedbf\bfshape{10}{900}{OT1}
+\setfont\reducedit\itshape{9}{1000}{OT1IT}
+\setfont\reducedsl\slshape{9}{1000}{OT1}
+\setfont\reducedsf\sfshape{9}{1000}{OT1}
+\setfont\reducedsc\scshape{10}{900}{OT1}
+\setfont\reducedttsl\ttslshape{10}{900}{OT1TT}
+\font\reducedi=cmmi9
+\font\reducedsy=cmsy9
+\def\reducedecsize{0900}
+
+\divide\parskip by 2  % reduce space between paragraphs
+\textleading = 12pt   % line spacing for 10pt CM
+\textfonts            % reset the current fonts
+\rm
+} % end of 10pt text font size definitions, \definetextfontsizex
+
+
+% We provide the user-level command
+%   @fonttextsize 10
+% (or 11) to redefine the text font size.  pt is assumed.
+%
+\def\xiword{11}
+\def\xword{10}
+\def\xwordpt{10pt}
+%
+\parseargdef\fonttextsize{%
+  \def\textsizearg{#1}%
+  %\wlog{doing @fonttextsize \textsizearg}%
+  %
+  % Set \globaldefs so that documents can use this inside @tex, since
+  % makeinfo 4.8 does not support it, but we need it nonetheless.
+  %
+ \begingroup \globaldefs=1
+  \ifx\textsizearg\xword \definetextfontsizex
+  \else \ifx\textsizearg\xiword \definetextfontsizexi
+  \else
+    \errhelp=\EMsimple
+    \errmessage{@fonttextsize only supports `10' or `11', not `\textsizearg'}
+  \fi\fi
+ \endgroup
+}
+
+
+% In order for the font changes to affect most math symbols and letters,
+% we have to define the \textfont of the standard families.  Since
+% texinfo doesn't allow for producing subscripts and superscripts except
+% in the main text, we don't bother to reset \scriptfont and
+% \scriptscriptfont (which would also require loading a lot more fonts).
+%
+\def\resetmathfonts{%
+  \textfont0=\tenrm \textfont1=\teni \textfont2=\tensy
+  \textfont\itfam=\tenit \textfont\slfam=\tensl \textfont\bffam=\tenbf
+  \textfont\ttfam=\tentt \textfont\sffam=\tensf
+}
+
+% The font-changing commands redefine the meanings of \tenSTYLE, instead
+% of just \STYLE.  We do this because \STYLE needs to also set the
+% current \fam for math mode.  Our \STYLE (e.g., \rm) commands hardwire
+% \tenSTYLE to set the current font.
+%
+% Each font-changing command also sets the names \lsize (one size lower)
+% and \lllsize (three sizes lower).  These relative commands are used in
+% the LaTeX logo and acronyms.
+%
+% This all needs generalizing, badly.
+%
+\def\textfonts{%
+  \let\tenrm=\textrm \let\tenit=\textit \let\tensl=\textsl
+  \let\tenbf=\textbf \let\tentt=\texttt \let\smallcaps=\textsc
+  \let\tensf=\textsf \let\teni=\texti \let\tensy=\textsy
+  \let\tenttsl=\textttsl
+  \def\curfontsize{text}%
+  \def\lsize{reduced}\def\lllsize{smaller}%
+  \resetmathfonts \setleading{\textleading}}
+\def\titlefonts{%
+  \let\tenrm=\titlerm \let\tenit=\titleit \let\tensl=\titlesl
+  \let\tenbf=\titlebf \let\tentt=\titlett \let\smallcaps=\titlesc
+  \let\tensf=\titlesf \let\teni=\titlei \let\tensy=\titlesy
+  \let\tenttsl=\titlettsl
+  \def\curfontsize{title}%
+  \def\lsize{chap}\def\lllsize{subsec}%
+  \resetmathfonts \setleading{27pt}}
+\def\titlefont#1{{\titlefonts\rmisbold #1}}
+\def\chapfonts{%
+  \let\tenrm=\chaprm \let\tenit=\chapit \let\tensl=\chapsl
+  \let\tenbf=\chapbf \let\tentt=\chaptt \let\smallcaps=\chapsc
+  \let\tensf=\chapsf \let\teni=\chapi \let\tensy=\chapsy
+  \let\tenttsl=\chapttsl
+  \def\curfontsize{chap}%
+  \def\lsize{sec}\def\lllsize{text}%
+  \resetmathfonts \setleading{19pt}}
+\def\secfonts{%
+  \let\tenrm=\secrm \let\tenit=\secit \let\tensl=\secsl
+  \let\tenbf=\secbf \let\tentt=\sectt \let\smallcaps=\secsc
+  \let\tensf=\secsf \let\teni=\seci \let\tensy=\secsy
+  \let\tenttsl=\secttsl
+  \def\curfontsize{sec}%
+  \def\lsize{subsec}\def\lllsize{reduced}%
+  \resetmathfonts \setleading{16pt}}
+\def\subsecfonts{%
+  \let\tenrm=\ssecrm \let\tenit=\ssecit \let\tensl=\ssecsl
+  \let\tenbf=\ssecbf \let\tentt=\ssectt \let\smallcaps=\ssecsc
+  \let\tensf=\ssecsf \let\teni=\sseci \let\tensy=\ssecsy
+  \let\tenttsl=\ssecttsl
+  \def\curfontsize{ssec}%
+  \def\lsize{text}\def\lllsize{small}%
+  \resetmathfonts \setleading{15pt}}
+\let\subsubsecfonts = \subsecfonts
+\def\reducedfonts{%
+  \let\tenrm=\reducedrm \let\tenit=\reducedit \let\tensl=\reducedsl
+  \let\tenbf=\reducedbf \let\tentt=\reducedtt \let\reducedcaps=\reducedsc
+  \let\tensf=\reducedsf \let\teni=\reducedi \let\tensy=\reducedsy
+  \let\tenttsl=\reducedttsl
+  \def\curfontsize{reduced}%
+  \def\lsize{small}\def\lllsize{smaller}%
+  \resetmathfonts \setleading{10.5pt}}
+\def\smallfonts{%
+  \let\tenrm=\smallrm \let\tenit=\smallit \let\tensl=\smallsl
+  \let\tenbf=\smallbf \let\tentt=\smalltt \let\smallcaps=\smallsc
+  \let\tensf=\smallsf \let\teni=\smalli \let\tensy=\smallsy
+  \let\tenttsl=\smallttsl
+  \def\curfontsize{small}%
+  \def\lsize{smaller}\def\lllsize{smaller}%
+  \resetmathfonts \setleading{10.5pt}}
+\def\smallerfonts{%
+  \let\tenrm=\smallerrm \let\tenit=\smallerit \let\tensl=\smallersl
+  \let\tenbf=\smallerbf \let\tentt=\smallertt \let\smallcaps=\smallersc
+  \let\tensf=\smallersf \let\teni=\smalleri \let\tensy=\smallersy
+  \let\tenttsl=\smallerttsl
+  \def\curfontsize{smaller}%
+  \def\lsize{smaller}\def\lllsize{smaller}%
+  \resetmathfonts \setleading{9.5pt}}
+
+% Fonts for short table of contents.
+\setfont\shortcontrm\rmshape{12}{1000}{OT1}
+\setfont\shortcontbf\bfshape{10}{\magstep1}{OT1}  % no cmb12
+\setfont\shortcontsl\slshape{12}{1000}{OT1}
+\setfont\shortconttt\ttshape{12}{1000}{OT1TT}
+
+% Define these just so they can be easily changed for other fonts.
+\def\angleleft{$\langle$}
+\def\angleright{$\rangle$}
+
+% Set the fonts to use with the @small... environments.
+\let\smallexamplefonts = \smallfonts
+
+% About \smallexamplefonts.  If we use \smallfonts (9pt), @smallexample
+% can fit this many characters:
+%   8.5x11=86   smallbook=72  a4=90  a5=69
+% If we use \scriptfonts (8pt), then we can fit this many characters:
+%   8.5x11=90+  smallbook=80  a4=90+  a5=77
+% For me, subjectively, the few extra characters that fit aren't worth
+% the additional smallness of 8pt.  So I'm making the default 9pt.
+%
+% By the way, for comparison, here's what fits with @example (10pt):
+%   8.5x11=71  smallbook=60  a4=75  a5=58
+% --karl, 24jan03.
+
+% Set up the default fonts, so we can use them for creating boxes.
+%
+\definetextfontsizexi
+
+
+\message{markup,}
+
+% Check if we are currently using a typewriter font.  Since all the
+% Computer Modern typewriter fonts have zero interword stretch (and
+% shrink), and it is reasonable to expect all typewriter fonts to have
+% this property, we can check that font parameter.
+%
+\def\ifmonospace{\ifdim\fontdimen3\font=0pt }
+
+% Markup style infrastructure.  \defmarkupstylesetup\INITMACRO will
+% define and register \INITMACRO to be called on markup style changes.
+% \INITMACRO can check \currentmarkupstyle for the innermost
+% style and the set of \ifmarkupSTYLE switches for all styles
+% currently in effect.
+\newif\ifmarkupvar
+\newif\ifmarkupsamp
+\newif\ifmarkupkey
+%\newif\ifmarkupfile % @file == @samp.
+%\newif\ifmarkupoption % @option == @samp.
+\newif\ifmarkupcode
+\newif\ifmarkupkbd
+%\newif\ifmarkupenv % @env == @code.
+%\newif\ifmarkupcommand % @command == @code.
+\newif\ifmarkuptex % @tex (and part of @math, for now).
+\newif\ifmarkupexample
+\newif\ifmarkupverb
+\newif\ifmarkupverbatim
+
+\let\currentmarkupstyle\empty
+
+\def\setupmarkupstyle#1{%
+  \csname markup#1true\endcsname
+  \def\currentmarkupstyle{#1}%
+  \markupstylesetup
+}
+
+\let\markupstylesetup\empty
+
+\def\defmarkupstylesetup#1{%
+  \expandafter\def\expandafter\markupstylesetup
+    \expandafter{\markupstylesetup #1}%
+  \def#1%
+}
+
+% Markup style setup for left and right quotes.
+\defmarkupstylesetup\markupsetuplq{%
+  \expandafter\let\expandafter \temp
+    \csname markupsetuplq\currentmarkupstyle\endcsname
+  \ifx\temp\relax \markupsetuplqdefault \else \temp \fi
+}
+
+\defmarkupstylesetup\markupsetuprq{%
+  \expandafter\let\expandafter \temp
+    \csname markupsetuprq\currentmarkupstyle\endcsname
+  \ifx\temp\relax \markupsetuprqdefault \else \temp \fi
+}
+
+{
+\catcode`\'=\active
+\catcode`\`=\active
+
+\gdef\markupsetuplqdefault{\let`\lq}
+\gdef\markupsetuprqdefault{\let'\rq}
+
+\gdef\markupsetcodequoteleft{\let`\codequoteleft}
+\gdef\markupsetcodequoteright{\let'\codequoteright}
+}
+
+\let\markupsetuplqcode \markupsetcodequoteleft
+\let\markupsetuprqcode \markupsetcodequoteright
+%
+\let\markupsetuplqexample \markupsetcodequoteleft
+\let\markupsetuprqexample \markupsetcodequoteright
+%
+\let\markupsetuplqkbd     \markupsetcodequoteleft
+\let\markupsetuprqkbd     \markupsetcodequoteright
+%
+\let\markupsetuplqsamp \markupsetcodequoteleft
+\let\markupsetuprqsamp \markupsetcodequoteright
+%
+\let\markupsetuplqverb \markupsetcodequoteleft
+\let\markupsetuprqverb \markupsetcodequoteright
+%
+\let\markupsetuplqverbatim \markupsetcodequoteleft
+\let\markupsetuprqverbatim \markupsetcodequoteright
+
+% Allow an option to not use regular directed right quote/apostrophe
+% (char 0x27), but instead the undirected quote from cmtt (char 0x0d).
+% The undirected quote is ugly, so don't make it the default, but it
+% works for pasting with more pdf viewers (at least evince), the
+% lilypond developers report.  xpdf does work with the regular 0x27.
+%
+\def\codequoteright{%
+  \expandafter\ifx\csname SETtxicodequoteundirected\endcsname\relax
+    \expandafter\ifx\csname SETcodequoteundirected\endcsname\relax
+      '%
+    \else \char'15 \fi
+  \else \char'15 \fi
+}
+%
+% and a similar option for the left quote char vs. a grave accent.
+% Modern fonts display ASCII 0x60 as a grave accent, so some people like
+% the code environments to do likewise.
+%
+\def\codequoteleft{%
+  \expandafter\ifx\csname SETtxicodequotebacktick\endcsname\relax
+    \expandafter\ifx\csname SETcodequotebacktick\endcsname\relax
+      % [Knuth] pp. 380,381,391
+      % \relax disables Spanish ligatures ?` and !` of \tt font.
+      \relax`%
+    \else \char'22 \fi
+  \else \char'22 \fi
+}
+
+% Commands to set the quote options.
+% 
+\parseargdef\codequoteundirected{%
+  \def\temp{#1}%
+  \ifx\temp\onword
+    \expandafter\let\csname SETtxicodequoteundirected\endcsname
+      = t%
+  \else\ifx\temp\offword
+    \expandafter\let\csname SETtxicodequoteundirected\endcsname
+      = \relax
+  \else
+    \errhelp = \EMsimple
+    \errmessage{Unknown @codequoteundirected value `\temp', must be on|off}%
+  \fi\fi
+}
+%
+\parseargdef\codequotebacktick{%
+  \def\temp{#1}%
+  \ifx\temp\onword
+    \expandafter\let\csname SETtxicodequotebacktick\endcsname
+      = t%
+  \else\ifx\temp\offword
+    \expandafter\let\csname SETtxicodequotebacktick\endcsname
+      = \relax
+  \else
+    \errhelp = \EMsimple
+    \errmessage{Unknown @codequotebacktick value `\temp', must be on|off}%
+  \fi\fi
+}
+
+% [Knuth] pp. 380,381,391, disable Spanish ligatures ?` and !` of \tt font.
+\def\noligaturesquoteleft{\relax\lq}
+
+% Count depth in font-changes, for error checks
+\newcount\fontdepth \fontdepth=0
+
+% Font commands.
+
+% #1 is the font command (\sl or \it), #2 is the text to slant.
+% If we are in a monospaced environment, however, 1) always use \ttsl,
+% and 2) do not add an italic correction.
+\def\dosmartslant#1#2{%
+  \ifusingtt 
+    {{\ttsl #2}\let\next=\relax}%
+    {\def\next{{#1#2}\futurelet\next\smartitaliccorrection}}%
+  \next
+}
+\def\smartslanted{\dosmartslant\sl}
+\def\smartitalic{\dosmartslant\it}
+
+% Output an italic correction unless \next (presumed to be the following
+% character) is such as not to need one.
+\def\smartitaliccorrection{%
+  \ifx\next,%
+  \else\ifx\next-%
+  \else\ifx\next.%
+  \else\ptexslash
+  \fi\fi\fi
+  \aftersmartic
+}
+
+% Unconditional use \ttsl, and no ic.  @var is set to this for defuns.
+\def\ttslanted#1{{\ttsl #1}}
+
+% @cite is like \smartslanted except unconditionally use \sl.  We never want
+% ttsl for book titles, do we?
+\def\cite#1{{\sl #1}\futurelet\next\smartitaliccorrection}
+
+\def\aftersmartic{}
+\def\var#1{%
+  \let\saveaftersmartic = \aftersmartic
+  \def\aftersmartic{\null\let\aftersmartic=\saveaftersmartic}%
+  \smartslanted{#1}%
+}
+
+\let\i=\smartitalic
+\let\slanted=\smartslanted
+\let\dfn=\smartslanted
+\let\emph=\smartitalic
+
+% Explicit font changes: @r, @sc, undocumented @ii.
+\def\r#1{{\rm #1}}              % roman font
+\def\sc#1{{\smallcaps#1}}       % smallcaps font
+\def\ii#1{{\it #1}}             % italic font
+
+% @b, explicit bold.  Also @strong.
+\def\b#1{{\bf #1}}
+\let\strong=\b
+
+% @sansserif, explicit sans.
+\def\sansserif#1{{\sf #1}}
+
+% We can't just use \exhyphenpenalty, because that only has effect at
+% the end of a paragraph.  Restore normal hyphenation at the end of the
+% group within which \nohyphenation is presumably called.
+%
+\def\nohyphenation{\hyphenchar\font = -1  \aftergroup\restorehyphenation}
+\def\restorehyphenation{\hyphenchar\font = `- }
+
+% Set sfcode to normal for the chars that usually have another value.
+% Can't use plain's \frenchspacing because it uses the `\x notation, and
+% sometimes \x has an active definition that messes things up.
+%
+\catcode`@=11
+  \def\plainfrenchspacing{%
+    \sfcode\dotChar  =\@m \sfcode\questChar=\@m \sfcode\exclamChar=\@m
+    \sfcode\colonChar=\@m \sfcode\semiChar =\@m \sfcode\commaChar =\@m
+    \def\endofsentencespacefactor{1000}% for @. and friends
+  }
+  \def\plainnonfrenchspacing{%
+    \sfcode`\.3000\sfcode`\?3000\sfcode`\!3000
+    \sfcode`\:2000\sfcode`\;1500\sfcode`\,1250
+    \def\endofsentencespacefactor{3000}% for @. and friends
+  }
+\catcode`@=\other
+\def\endofsentencespacefactor{3000}% default
+
+% @t, explicit typewriter.
+\def\t#1{%
+  {\tt \rawbackslash \plainfrenchspacing #1}%
+  \null
+}
+
+% @samp.
+\def\samp#1{{\setupmarkupstyle{samp}\lq\tclose{#1}\rq\null}}
+
+% @indicateurl is \samp, that is, with quotes.
+\let\indicateurl=\samp
+
+% @code (and similar) prints in typewriter, but with spaces the same
+% size as normal in the surrounding text, without hyphenation, etc.
+% This is a subroutine for that.
+\def\tclose#1{%
+  {%
+    % Change normal interword space to be same as for the current font.
+    \spaceskip = \fontdimen2\font
+    %
+    % Switch to typewriter.
+    \tt
+    %
+    % But `\ ' produces the large typewriter interword space.
+    \def\ {{\spaceskip = 0pt{} }}%
+    %
+    % Turn off hyphenation.
+    \nohyphenation
+    %
+    \rawbackslash
+    \plainfrenchspacing
+    #1%
+  }%
+  \null % reset spacefactor to 1000
+}
+
+% We *must* turn on hyphenation at `-' and `_' in @code.
+% Otherwise, it is too hard to avoid overfull hboxes
+% in the Emacs manual, the Library manual, etc.
+%
+% Unfortunately, TeX uses one parameter (\hyphenchar) to control
+% both hyphenation at - and hyphenation within words.
+% We must therefore turn them both off (\tclose does that)
+% and arrange explicitly to hyphenate at a dash.
+%  -- rms.
+{
+  \catcode`\-=\active \catcode`\_=\active
+  \catcode`\'=\active \catcode`\`=\active
+  \global\let'=\rq \global\let`=\lq  % default definitions
+  %
+  \global\def\code{\begingroup
+    \setupmarkupstyle{code}%
+    % The following should really be moved into \setupmarkupstyle handlers.
+    \catcode\dashChar=\active  \catcode\underChar=\active
+    \ifallowcodebreaks
+     \let-\codedash
+     \let_\codeunder
+    \else
+     \let-\normaldash
+     \let_\realunder
+    \fi
+    \codex
+  }
+}
+
+\def\codex #1{\tclose{#1}\endgroup}
+
+\def\normaldash{-}
+\def\codedash{-\discretionary{}{}{}}
+\def\codeunder{%
+  % this is all so @math{@code{var_name}+1} can work.  In math mode, _
+  % is "active" (mathcode"8000) and \normalunderscore (or \char95, etc.)
+  % will therefore expand the active definition of _, which is us
+  % (inside @code that is), therefore an endless loop.
+  \ifusingtt{\ifmmode
+               \mathchar"075F % class 0=ordinary, family 7=ttfam, pos 0x5F=_.
+             \else\normalunderscore \fi
+             \discretionary{}{}{}}%
+            {\_}%
+}
+
+% An additional complication: the above will allow breaks after, e.g.,
+% each of the four underscores in __typeof__.  This is bad.
+% @allowcodebreaks provides a document-level way to turn breaking at -
+% and _ on and off.
+%
+\newif\ifallowcodebreaks  \allowcodebreakstrue
+
+\def\keywordtrue{true}
+\def\keywordfalse{false}
+
+\parseargdef\allowcodebreaks{%
+  \def\txiarg{#1}%
+  \ifx\txiarg\keywordtrue
+    \allowcodebreakstrue
+  \else\ifx\txiarg\keywordfalse
+    \allowcodebreaksfalse
+  \else
+    \errhelp = \EMsimple
+    \errmessage{Unknown @allowcodebreaks option `\txiarg', must be true|false}%
+  \fi\fi
+}
+
+% For @command, @env, @file, @option quotes seem unnecessary,
+% so use \code rather than \samp.
+\let\command=\code
+\let\env=\code
+\let\file=\code
+\let\option=\code
+
+% @uref (abbreviation for `urlref') takes an optional (comma-separated)
+% second argument specifying the text to display and an optional third
+% arg as text to display instead of (rather than in addition to) the url
+% itself.  First (mandatory) arg is the url.
+% (This \urefnobreak definition isn't used now, leaving it for a while
+% for comparison.)
+\def\urefnobreak#1{\dourefnobreak #1,,,\finish}
+\def\dourefnobreak#1,#2,#3,#4\finish{\begingroup
+  \unsepspaces
+  \pdfurl{#1}%
+  \setbox0 = \hbox{\ignorespaces #3}%
+  \ifdim\wd0 > 0pt
+    \unhbox0 % third arg given, show only that
+  \else
+    \setbox0 = \hbox{\ignorespaces #2}%
+    \ifdim\wd0 > 0pt
+      \ifpdf
+        \unhbox0             % PDF: 2nd arg given, show only it
+      \else
+        \unhbox0\ (\code{#1})% DVI: 2nd arg given, show both it and url
+      \fi
+    \else
+      \code{#1}% only url given, so show it
+    \fi
+  \fi
+  \endlink
+\endgroup}
+
+% This \urefbreak definition is the active one.
+\def\urefbreak{\begingroup \urefcatcodes \dourefbreak}
+\let\uref=\urefbreak
+\def\dourefbreak#1{\urefbreakfinish #1,,,\finish}
+\def\urefbreakfinish#1,#2,#3,#4\finish{% doesn't work in @example
+  \unsepspaces
+  \pdfurl{#1}%
+  \setbox0 = \hbox{\ignorespaces #3}%
+  \ifdim\wd0 > 0pt
+    \unhbox0 % third arg given, show only that
+  \else
+    \setbox0 = \hbox{\ignorespaces #2}%
+    \ifdim\wd0 > 0pt
+      \ifpdf
+        \unhbox0             % PDF: 2nd arg given, show only it
+      \else
+        \unhbox0\ (\urefcode{#1})% DVI: 2nd arg given, show both it and url
+      \fi
+    \else
+      \urefcode{#1}% only url given, so show it
+    \fi
+  \fi
+  \endlink
+\endgroup}
+
+% Allow line breaks around only a few characters (only).
+\def\urefcatcodes{%
+  \catcode\ampChar=\active   \catcode\dotChar=\active
+  \catcode\hashChar=\active  \catcode\questChar=\active
+  \catcode\slashChar=\active
+}
+{
+  \urefcatcodes
+  %
+  \global\def\urefcode{\begingroup
+    \setupmarkupstyle{code}%
+    \urefcatcodes
+    \let&\urefcodeamp
+    \let.\urefcodedot
+    \let#\urefcodehash
+    \let?\urefcodequest
+    \let/\urefcodeslash
+    \codex
+  }
+  %
+  % By default, they are just regular characters.
+  \global\def&{\normalamp}
+  \global\def.{\normaldot}
+  \global\def#{\normalhash}
+  \global\def?{\normalquest}
+  \global\def/{\normalslash}
+}
+
+% we put a little stretch before and after the breakable chars, to help
+% line breaking of long url's.  The unequal skips make look better in
+% cmtt at least, especially for dots.
+\def\urefprestretch{\urefprebreak \hskip0pt plus.13em }
+\def\urefpoststretch{\urefpostbreak \hskip0pt plus.1em }
+%
+\def\urefcodeamp{\urefprestretch \&\urefpoststretch}
+\def\urefcodedot{\urefprestretch .\urefpoststretch}
+\def\urefcodehash{\urefprestretch \#\urefpoststretch}
+\def\urefcodequest{\urefprestretch ?\urefpoststretch}
+\def\urefcodeslash{\futurelet\next\urefcodeslashfinish}
+{
+  \catcode`\/=\active
+  \global\def\urefcodeslashfinish{%
+    \urefprestretch \slashChar
+    % Allow line break only after the final / in a sequence of
+    % slashes, to avoid line break between the slashes in http://.
+    \ifx\next/\else \urefpoststretch \fi
+  }
+}
+
+% One more complication: by default we'll break after the special
+% characters, but some people like to break before the special chars, so
+% allow that.  Also allow no breaking at all, for manual control.
+% 
+\parseargdef\urefbreakstyle{%
+  \def\txiarg{#1}%
+  \ifx\txiarg\wordnone
+    \def\urefprebreak{\nobreak}\def\urefpostbreak{\nobreak}
+  \else\ifx\txiarg\wordbefore
+    \def\urefprebreak{\allowbreak}\def\urefpostbreak{\nobreak}
+  \else\ifx\txiarg\wordafter
+    \def\urefprebreak{\nobreak}\def\urefpostbreak{\allowbreak}
+  \else
+    \errhelp = \EMsimple
+    \errmessage{Unknown @urefbreakstyle setting `\txiarg'}%
+  \fi\fi\fi
+}
+\def\wordafter{after}
+\def\wordbefore{before}
+\def\wordnone{none}
+
+\urefbreakstyle after
+
+% @url synonym for @uref, since that's how everyone uses it.
+%
+\let\url=\uref
+
+% rms does not like angle brackets --karl, 17may97.
+% So now @email is just like @uref, unless we are pdf.
+%
+%\def\email#1{\angleleft{\tt #1}\angleright}
+\ifpdf
+  \def\email#1{\doemail#1,,\finish}
+  \def\doemail#1,#2,#3\finish{\begingroup
+    \unsepspaces
+    \pdfurl{mailto:#1}%
+    \setbox0 = \hbox{\ignorespaces #2}%
+    \ifdim\wd0>0pt\unhbox0\else\code{#1}\fi
+    \endlink
+  \endgroup}
+\else
+  \let\email=\uref
+\fi
+
+% @kbdinputstyle -- arg is `distinct' (@kbd uses slanted tty font always),
+%   `example' (@kbd uses ttsl only inside of @example and friends),
+%   or `code' (@kbd uses normal tty font always).
+\parseargdef\kbdinputstyle{%
+  \def\txiarg{#1}%
+  \ifx\txiarg\worddistinct
+    \gdef\kbdexamplefont{\ttsl}\gdef\kbdfont{\ttsl}%
+  \else\ifx\txiarg\wordexample
+    \gdef\kbdexamplefont{\ttsl}\gdef\kbdfont{\tt}%
+  \else\ifx\txiarg\wordcode
+    \gdef\kbdexamplefont{\tt}\gdef\kbdfont{\tt}%
+  \else
+    \errhelp = \EMsimple
+    \errmessage{Unknown @kbdinputstyle setting `\txiarg'}%
+  \fi\fi\fi
+}
+\def\worddistinct{distinct}
+\def\wordexample{example}
+\def\wordcode{code}
+
+% Default is `distinct'.
+\kbdinputstyle distinct
+
+% @kbd is like @code, except that if the argument is just one @key command,
+% then @kbd has no effect.
+\def\kbd#1{{\def\look{#1}\expandafter\kbdsub\look??\par}}
+
+\def\xkey{\key}
+\def\kbdsub#1#2#3\par{%
+  \def\one{#1}\def\three{#3}\def\threex{??}%
+  \ifx\one\xkey\ifx\threex\three \key{#2}%
+  \else{\tclose{\kbdfont\setupmarkupstyle{kbd}\look}}\fi
+  \else{\tclose{\kbdfont\setupmarkupstyle{kbd}\look}}\fi
+}
+
+% definition of @key that produces a lozenge.  Doesn't adjust to text size.
+%\setfont\keyrm\rmshape{8}{1000}{OT1}
+%\font\keysy=cmsy9
+%\def\key#1{{\keyrm\textfont2=\keysy \leavevmode\hbox{%
+%  \raise0.4pt\hbox{\angleleft}\kern-.08em\vtop{%
+%    \vbox{\hrule\kern-0.4pt
+%     \hbox{\raise0.4pt\hbox{\vphantom{\angleleft}}#1}}%
+%    \kern-0.4pt\hrule}%
+%  \kern-.06em\raise0.4pt\hbox{\angleright}}}}
+
+% definition of @key with no lozenge.  If the current font is already
+% monospace, don't change it; that way, we respect @kbdinputstyle.  But
+% if it isn't monospace, then use \tt.
+%
+\def\key#1{{\setupmarkupstyle{key}%
+  \nohyphenation
+  \ifmonospace\else\tt\fi
+  #1}\null}
+
+% @clicksequence{File @click{} Open ...}
+\def\clicksequence#1{\begingroup #1\endgroup}
+
+% @clickstyle @arrow   (by default)
+\parseargdef\clickstyle{\def\click{#1}}
+\def\click{\arrow}
+
+% Typeset a dimension, e.g., `in' or `pt'.  The only reason for the
+% argument is to make the input look right: @dmn{pt} instead of @dmn{}pt.
+%
+\def\dmn#1{\thinspace #1}
+
+% @l was never documented to mean ``switch to the Lisp font'',
+% and it is not used as such in any manual I can find.  We need it for
+% Polish suppressed-l.  --karl, 22sep96.
+%\def\l#1{{\li #1}\null}
+
+% @acronym for "FBI", "NATO", and the like.
+% We print this one point size smaller, since it's intended for
+% all-uppercase.
+%
+\def\acronym#1{\doacronym #1,,\finish}
+\def\doacronym#1,#2,#3\finish{%
+  {\selectfonts\lsize #1}%
+  \def\temp{#2}%
+  \ifx\temp\empty \else
+    \space ({\unsepspaces \ignorespaces \temp \unskip})%
+  \fi
+  \null % reset \spacefactor=1000
+}
+
+% @abbr for "Comput. J." and the like.
+% No font change, but don't do end-of-sentence spacing.
+%
+\def\abbr#1{\doabbr #1,,\finish}
+\def\doabbr#1,#2,#3\finish{%
+  {\plainfrenchspacing #1}%
+  \def\temp{#2}%
+  \ifx\temp\empty \else
+    \space ({\unsepspaces \ignorespaces \temp \unskip})%
+  \fi
+  \null % reset \spacefactor=1000
+}
+
+% @asis just yields its argument.  Used with @table, for example.
+%
+\def\asis#1{#1}
+
+% @math outputs its argument in math mode.
+%
+% One complication: _ usually means subscripts, but it could also mean
+% an actual _ character, as in @math{@var{some_variable} + 1}.  So make
+% _ active, and distinguish by seeing if the current family is \slfam,
+% which is what @var uses.
+{
+  \catcode`\_ = \active
+  \gdef\mathunderscore{%
+    \catcode`\_=\active
+    \def_{\ifnum\fam=\slfam \_\else\sb\fi}%
+  }
+}
+% Another complication: we want \\ (and @\) to output a math (or tt) \.
+% FYI, plain.tex uses \\ as a temporary control sequence (for no
+% particular reason), but this is not advertised and we don't care.
+%
+% The \mathchar is class=0=ordinary, family=7=ttfam, position=5C=\.
+\def\mathbackslash{\ifnum\fam=\ttfam \mathchar"075C \else\backslash \fi}
+%
+\def\math{%
+  \tex
+  \mathunderscore
+  \let\\ = \mathbackslash
+  \mathactive
+  % make the texinfo accent commands work in math mode
+  \let\"=\ddot
+  \let\'=\acute
+  \let\==\bar
+  \let\^=\hat
+  \let\`=\grave
+  \let\u=\breve
+  \let\v=\check
+  \let\~=\tilde
+  \let\dotaccent=\dot
+  $\finishmath
+}
+\def\finishmath#1{#1$\endgroup}  % Close the group opened by \tex.
+
+% Some active characters (such as <) are spaced differently in math.
+% We have to reset their definitions in case the @math was an argument
+% to a command which sets the catcodes (such as @item or @section).
+%
+{
+  \catcode`^ = \active
+  \catcode`< = \active
+  \catcode`> = \active
+  \catcode`+ = \active
+  \catcode`' = \active
+  \gdef\mathactive{%
+    \let^ = \ptexhat
+    \let< = \ptexless
+    \let> = \ptexgtr
+    \let+ = \ptexplus
+    \let' = \ptexquoteright
+  }
+}
+
+% ctrl is no longer a Texinfo command, but leave this definition for fun.
+\def\ctrl #1{{\tt \rawbackslash \hat}#1}
+
+% @inlinefmt{FMTNAME,PROCESSED-TEXT} and @inlineraw{FMTNAME,RAW-TEXT}.
+% Ignore unless FMTNAME == tex; then it is like @iftex and @tex,
+% except specified as a normal braced arg, so no newlines to worry about.
+% 
+\def\outfmtnametex{tex}
+%
+\long\def\inlinefmt#1{\doinlinefmt #1,\finish}
+\long\def\doinlinefmt#1,#2,\finish{%
+  \def\inlinefmtname{#1}%
+  \ifx\inlinefmtname\outfmtnametex \ignorespaces #2\fi
+}
+% For raw, must switch into @tex before parsing the argument, to avoid
+% setting catcodes prematurely.  Doing it this way means that, for
+% example, @inlineraw{html, foo{bar} gets a parse error instead of being
+% ignored.  But this isn't important because if people want a literal
+% *right* brace they would have to use a command anyway, so they may as
+% well use a command to get a left brace too.  We could re-use the
+% delimiter character idea from \verb, but it seems like overkill.
+% 
+\long\def\inlineraw{\tex \doinlineraw}
+\long\def\doinlineraw#1{\doinlinerawtwo #1,\finish}
+\def\doinlinerawtwo#1,#2,\finish{%
+  \def\inlinerawname{#1}%
+  \ifx\inlinerawname\outfmtnametex \ignorespaces #2\fi
+  \endgroup % close group opened by \tex.
+}
+
+
+\message{glyphs,}
+% and logos.
+
+% @@ prints an @, as does @atchar{}.
+\def\@{\char64 }
+\let\atchar=\@
+
+% @{ @} @lbracechar{} @rbracechar{} all generate brace characters.
+% Unless we're in typewriter, use \ecfont because the CM text fonts do
+% not have braces, and we don't want to switch into math.
+\def\mylbrace{{\ifmonospace\else\ecfont\fi \char123}}
+\def\myrbrace{{\ifmonospace\else\ecfont\fi \char125}}
+\let\{=\mylbrace \let\lbracechar=\{
+\let\}=\myrbrace \let\rbracechar=\}
+\begingroup
+  % Definitions to produce \{ and \} commands for indices,
+  % and @{ and @} for the aux/toc files.
+  \catcode`\{ = \other \catcode`\} = \other
+  \catcode`\[ = 1 \catcode`\] = 2
+  \catcode`\! = 0 \catcode`\\ = \other
+  !gdef!lbracecmd[\{]%
+  !gdef!rbracecmd[\}]%
+  !gdef!lbraceatcmd[@{]%
+  !gdef!rbraceatcmd[@}]%
+!endgroup
+
+% @comma{} to avoid , parsing problems.
+\let\comma = ,
+
+% Accents: @, @dotaccent @ringaccent @ubaraccent @udotaccent
+% Others are defined by plain TeX: @` @' @" @^ @~ @= @u @v @H.
+\let\, = \ptexc
+\let\dotaccent = \ptexdot
+\def\ringaccent#1{{\accent23 #1}}
+\let\tieaccent = \ptext
+\let\ubaraccent = \ptexb
+\let\udotaccent = \d
+
+% Other special characters: @questiondown @exclamdown @ordf @ordm
+% Plain TeX defines: @AA @AE @O @OE @L (plus lowercase versions) @ss.
+\def\questiondown{?`}
+\def\exclamdown{!`}
+\def\ordf{\leavevmode\raise1ex\hbox{\selectfonts\lllsize \underbar{a}}}
+\def\ordm{\leavevmode\raise1ex\hbox{\selectfonts\lllsize \underbar{o}}}
+
+% Dotless i and dotless j, used for accents.
+\def\imacro{i}
+\def\jmacro{j}
+\def\dotless#1{%
+  \def\temp{#1}%
+  \ifx\temp\imacro \ifmmode\imath \else\ptexi \fi
+  \else\ifx\temp\jmacro \ifmmode\jmath \else\j \fi
+  \else \errmessage{@dotless can be used only with i or j}%
+  \fi\fi
+}
+
+% The \TeX{} logo, as in plain, but resetting the spacing so that a
+% period following counts as ending a sentence.  (Idea found in latex.)
+%
+\edef\TeX{\TeX \spacefactor=1000 }
+
+% @LaTeX{} logo.  Not quite the same results as the definition in
+% latex.ltx, since we use a different font for the raised A; it's most
+% convenient for us to use an explicitly smaller font, rather than using
+% the \scriptstyle font (since we don't reset \scriptstyle and
+% \scriptscriptstyle).
+%
+\def\LaTeX{%
+  L\kern-.36em
+  {\setbox0=\hbox{T}%
+   \vbox to \ht0{\hbox{%
+     \ifx\textnominalsize\xwordpt
+       % for 10pt running text, \lllsize (8pt) is too small for the A in LaTeX.
+       % Revert to plain's \scriptsize, which is 7pt.
+       \count255=\the\fam $\fam\count255 \scriptstyle A$%
+     \else
+       % For 11pt, we can use our lllsize.
+       \selectfonts\lllsize A%
+     \fi
+     }%
+     \vss
+  }}%
+  \kern-.15em
+  \TeX
+}
+
+% Some math mode symbols.
+\def\bullet{$\ptexbullet$}
+\def\geq{\ifmmode \ge\else $\ge$\fi}
+\def\leq{\ifmmode \le\else $\le$\fi}
+\def\minus{\ifmmode -\else $-$\fi}
+
+% @dots{} outputs an ellipsis using the current font.
+% We do .5em per period so that it has the same spacing in the cm
+% typewriter fonts as three actual period characters; on the other hand,
+% in other typewriter fonts three periods are wider than 1.5em.  So do
+% whichever is larger.
+%
+\def\dots{%
+  \leavevmode
+  \setbox0=\hbox{...}% get width of three periods
+  \ifdim\wd0 > 1.5em
+    \dimen0 = \wd0
+  \else
+    \dimen0 = 1.5em
+  \fi
+  \hbox to \dimen0{%
+    \hskip 0pt plus.25fil
+    .\hskip 0pt plus1fil
+    .\hskip 0pt plus1fil
+    .\hskip 0pt plus.5fil
+  }%
+}
+
+% @enddots{} is an end-of-sentence ellipsis.
+%
+\def\enddots{%
+  \dots
+  \spacefactor=\endofsentencespacefactor
+}
+
+% @point{}, @result{}, @expansion{}, @print{}, @equiv{}.
+%
+% Since these characters are used in examples, they should be an even number of
+% \tt widths. Each \tt character is 1en, so two makes it 1em.
+%
+\def\point{$\star$}
+\def\arrow{\leavevmode\raise.05ex\hbox to 1em{\hfil$\rightarrow$\hfil}}
+\def\result{\leavevmode\raise.05ex\hbox to 1em{\hfil$\Rightarrow$\hfil}}
+\def\expansion{\leavevmode\hbox to 1em{\hfil$\mapsto$\hfil}}
+\def\print{\leavevmode\lower.1ex\hbox to 1em{\hfil$\dashv$\hfil}}
+\def\equiv{\leavevmode\hbox to 1em{\hfil$\ptexequiv$\hfil}}
+
+% The @error{} command.
+% Adapted from the TeXbook's \boxit.
+%
+\newbox\errorbox
+%
+{\tentt \global\dimen0 = 3em}% Width of the box.
+\dimen2 = .55pt % Thickness of rules
+% The text. (`r' is open on the right, `e' somewhat less so on the left.)
+\setbox0 = \hbox{\kern-.75pt \reducedsf \putworderror\kern-1.5pt}
+%
+\setbox\errorbox=\hbox to \dimen0{\hfil
+   \hsize = \dimen0 \advance\hsize by -5.8pt % Space to left+right.
+   \advance\hsize by -2\dimen2 % Rules.
+   \vbox{%
+      \hrule height\dimen2
+      \hbox{\vrule width\dimen2 \kern3pt          % Space to left of text.
+         \vtop{\kern2.4pt \box0 \kern2.4pt}% Space above/below.
+         \kern3pt\vrule width\dimen2}% Space to right.
+      \hrule height\dimen2}
+    \hfil}
+%
+\def\error{\leavevmode\lower.7ex\copy\errorbox}
+
+% @pounds{} is a sterling sign, which Knuth put in the CM italic font.
+%
+\def\pounds{{\it\$}}
+
+% @euro{} comes from a separate font, depending on the current style.
+% We use the free feym* fonts from the eurosym package by Henrik
+% Theiling, which support regular, slanted, bold and bold slanted (and
+% "outlined" (blackboard board, sort of) versions, which we don't need).
+% It is available from http://www.ctan.org/tex-archive/fonts/eurosym.
+%
+% Although only regular is the truly official Euro symbol, we ignore
+% that.  The Euro is designed to be slightly taller than the regular
+% font height.
+%
+% feymr - regular
+% feymo - slanted
+% feybr - bold
+% feybo - bold slanted
+%
+% There is no good (free) typewriter version, to my knowledge.
+% A feymr10 euro is ~7.3pt wide, while a normal cmtt10 char is ~5.25pt wide.
+% Hmm.
+%
+% Also doesn't work in math.  Do we need to do math with euro symbols?
+% Hope not.
+%
+%
+\def\euro{{\eurofont e}}
+\def\eurofont{%
+  % We set the font at each command, rather than predefining it in
+  % \textfonts and the other font-switching commands, so that
+  % installations which never need the symbol don't have to have the
+  % font installed.
+  %
+  % There is only one designed size (nominal 10pt), so we always scale
+  % that to the current nominal size.
+  %
+  % By the way, simply using "at 1em" works for cmr10 and the like, but
+  % does not work for cmbx10 and other extended/shrunken fonts.
+  %
+  \def\eurosize{\csname\curfontsize nominalsize\endcsname}%
+  %
+  \ifx\curfontstyle\bfstylename
+    % bold:
+    \font\thiseurofont = \ifusingit{feybo10}{feybr10} at \eurosize
+  \else
+    % regular:
+    \font\thiseurofont = \ifusingit{feymo10}{feymr10} at \eurosize
+  \fi
+  \thiseurofont
+}
+
+% Glyphs from the EC fonts.  We don't use \let for the aliases, because
+% sometimes we redefine the original macro, and the alias should reflect
+% the redefinition.
+%
+% Use LaTeX names for the Icelandic letters.
+\def\DH{{\ecfont \char"D0}} % Eth
+\def\dh{{\ecfont \char"F0}} % eth
+\def\TH{{\ecfont \char"DE}} % Thorn
+\def\th{{\ecfont \char"FE}} % thorn
+%
+\def\guillemetleft{{\ecfont \char"13}}
+\def\guillemotleft{\guillemetleft}
+\def\guillemetright{{\ecfont \char"14}}
+\def\guillemotright{\guillemetright}
+\def\guilsinglleft{{\ecfont \char"0E}}
+\def\guilsinglright{{\ecfont \char"0F}}
+\def\quotedblbase{{\ecfont \char"12}}
+\def\quotesinglbase{{\ecfont \char"0D}}
+%
+% This positioning is not perfect (see the ogonek LaTeX package), but
+% we have the precomposed glyphs for the most common cases.  We put the
+% tests to use those glyphs in the single \ogonek macro so we have fewer
+% dummy definitions to worry about for index entries, etc.
+%
+% ogonek is also used with other letters in Lithuanian (IOU), but using
+% the precomposed glyphs for those is not so easy since they aren't in
+% the same EC font.
+\def\ogonek#1{{%
+  \def\temp{#1}%
+  \ifx\temp\macrocharA\Aogonek
+  \else\ifx\temp\macrochara\aogonek
+  \else\ifx\temp\macrocharE\Eogonek
+  \else\ifx\temp\macrochare\eogonek
+  \else
+    \ecfont \setbox0=\hbox{#1}%
+    \ifdim\ht0=1ex\accent"0C #1%
+    \else\ooalign{\unhbox0\crcr\hidewidth\char"0C \hidewidth}%
+    \fi
+  \fi\fi\fi\fi
+  }%
+}
+\def\Aogonek{{\ecfont \char"81}}\def\macrocharA{A}
+\def\aogonek{{\ecfont \char"A1}}\def\macrochara{a}
+\def\Eogonek{{\ecfont \char"86}}\def\macrocharE{E}
+\def\eogonek{{\ecfont \char"A6}}\def\macrochare{e}
+%
+% Use the ec* fonts (cm-super in outline format) for non-CM glyphs.
+\def\ecfont{%
+  % We can't distinguish serif/sans and italic/slanted, but this
+  % is used for crude hacks anyway (like adding French and German
+  % quotes to documents typeset with CM, where we lose kerning), so
+  % hopefully nobody will notice/care.
+  \edef\ecsize{\csname\curfontsize ecsize\endcsname}%
+  \edef\nominalsize{\csname\curfontsize nominalsize\endcsname}%
+  \ifmonospace
+    % typewriter:
+    \font\thisecfont = ectt\ecsize \space at \nominalsize
+  \else
+    \ifx\curfontstyle\bfstylename
+      % bold:
+      \font\thisecfont = ecb\ifusingit{i}{x}\ecsize \space at \nominalsize
+    \else
+      % regular:
+      \font\thisecfont = ec\ifusingit{ti}{rm}\ecsize \space at \nominalsize
+    \fi
+  \fi
+  \thisecfont
+}
+
+% @registeredsymbol - R in a circle.  The font for the R should really
+% be smaller yet, but lllsize is the best we can do for now.
+% Adapted from the plain.tex definition of \copyright.
+%
+\def\registeredsymbol{%
+  $^{{\ooalign{\hfil\raise.07ex\hbox{\selectfonts\lllsize R}%
+               \hfil\crcr\Orb}}%
+    }$%
+}
+
+% @textdegree - the normal degrees sign.
+%
+\def\textdegree{$^\circ$}
+
+% Laurent Siebenmann reports \Orb undefined with:
+%  Textures 1.7.7 (preloaded format=plain 93.10.14)  (68K)  16 APR 2004 02:38
+% so we'll define it if necessary.
+%
+\ifx\Orb\thisisundefined
+\def\Orb{\mathhexbox20D}
+\fi
+
+% Quotes.
+\chardef\quotedblleft="5C
+\chardef\quotedblright=`\"
+\chardef\quoteleft=`\`
+\chardef\quoteright=`\'
+
+
+\message{page headings,}
+
+\newskip\titlepagetopglue \titlepagetopglue = 1.5in
+\newskip\titlepagebottomglue \titlepagebottomglue = 2pc
+
+% First the title page.  Must do @settitle before @titlepage.
+\newif\ifseenauthor
+\newif\iffinishedtitlepage
+
+% Do an implicit @contents or @shortcontents after @end titlepage if the
+% user says @setcontentsaftertitlepage or @setshortcontentsaftertitlepage.
+%
+\newif\ifsetcontentsaftertitlepage
+ \let\setcontentsaftertitlepage = \setcontentsaftertitlepagetrue
+\newif\ifsetshortcontentsaftertitlepage
+ \let\setshortcontentsaftertitlepage = \setshortcontentsaftertitlepagetrue
+
+\parseargdef\shorttitlepage{%
+  \begingroup \hbox{}\vskip 1.5in \chaprm \centerline{#1}%
+  \endgroup\page\hbox{}\page}
+
+\envdef\titlepage{%
+  % Open one extra group, as we want to close it in the middle of \Etitlepage.
+  \begingroup
+    \parindent=0pt \textfonts
+    % Leave some space at the very top of the page.
+    \vglue\titlepagetopglue
+    % No rule at page bottom unless we print one at the top with @title.
+    \finishedtitlepagetrue
+    %
+    % Most title ``pages'' are actually two pages long, with space
+    % at the top of the second.  We don't want the ragged left on the second.
+    \let\oldpage = \page
+    \def\page{%
+      \iffinishedtitlepage\else
+	 \finishtitlepage
+      \fi
+      \let\page = \oldpage
+      \page
+      \null
+    }%
+}
+
+\def\Etitlepage{%
+    \iffinishedtitlepage\else
+	\finishtitlepage
+    \fi
+    % It is important to do the page break before ending the group,
+    % because the headline and footline are only empty inside the group.
+    % If we use the new definition of \page, we always get a blank page
+    % after the title page, which we certainly don't want.
+    \oldpage
+  \endgroup
+  %
+  % Need this before the \...aftertitlepage checks so that if they are
+  % in effect the toc pages will come out with page numbers.
+  \HEADINGSon
+  %
+  % If they want short, they certainly want long too.
+  \ifsetshortcontentsaftertitlepage
+    \shortcontents
+    \contents
+    \global\let\shortcontents = \relax
+    \global\let\contents = \relax
+  \fi
+  %
+  \ifsetcontentsaftertitlepage
+    \contents
+    \global\let\contents = \relax
+    \global\let\shortcontents = \relax
+  \fi
+}
+
+\def\finishtitlepage{%
+  \vskip4pt \hrule height 2pt width \hsize
+  \vskip\titlepagebottomglue
+  \finishedtitlepagetrue
+}
+
+% Settings used for typesetting titles: no hyphenation, no indentation,
+% don't worry much about spacing, ragged right.  This should be used
+% inside a \vbox, and fonts need to be set appropriately first.  Because
+% it is always used for titles, nothing else, we call \rmisbold.  \par
+% should be specified before the end of the \vbox, since a vbox is a group.
+% 
+\def\raggedtitlesettings{%
+  \rmisbold
+  \hyphenpenalty=10000
+  \parindent=0pt
+  \tolerance=5000
+  \ptexraggedright
+}
+
+% Macros to be used within @titlepage:
+
+\let\subtitlerm=\tenrm
+\def\subtitlefont{\subtitlerm \normalbaselineskip = 13pt \normalbaselines}
+
+\parseargdef\title{%
+  \checkenv\titlepage
+  \vbox{\titlefonts \raggedtitlesettings #1\par}%
+  % print a rule at the page bottom also.
+  \finishedtitlepagefalse
+  \vskip4pt \hrule height 4pt width \hsize \vskip4pt
+}
+
+\parseargdef\subtitle{%
+  \checkenv\titlepage
+  {\subtitlefont \rightline{#1}}%
+}
+
+% @author should come last, but may come many times.
+% It can also be used inside @quotation.
+%
+\parseargdef\author{%
+  \def\temp{\quotation}%
+  \ifx\thisenv\temp
+    \def\quotationauthor{#1}% printed in \Equotation.
+  \else
+    \checkenv\titlepage
+    \ifseenauthor\else \vskip 0pt plus 1filll \seenauthortrue \fi
+    {\secfonts\rmisbold \leftline{#1}}%
+  \fi
+}
+
+
+% Set up page headings and footings.
+
+\let\thispage=\folio
+
+\newtoks\evenheadline    % headline on even pages
+\newtoks\oddheadline     % headline on odd pages
+\newtoks\evenfootline    % footline on even pages
+\newtoks\oddfootline     % footline on odd pages
+
+% Now make TeX use those variables
+\headline={{\textfonts\rm \ifodd\pageno \the\oddheadline
+                            \else \the\evenheadline \fi}}
+\footline={{\textfonts\rm \ifodd\pageno \the\oddfootline
+                            \else \the\evenfootline \fi}\HEADINGShook}
+\let\HEADINGShook=\relax
+
+% Commands to set those variables.
+% For example, this is what  @headings on  does
+% @evenheading @thistitle|@thispage|@thischapter
+% @oddheading @thischapter|@thispage|@thistitle
+% @evenfooting @thisfile||
+% @oddfooting ||@thisfile
+
+
+\def\evenheading{\parsearg\evenheadingxxx}
+\def\evenheadingxxx #1{\evenheadingyyy #1\|\|\|\|\finish}
+\def\evenheadingyyy #1\|#2\|#3\|#4\finish{%
+\global\evenheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}
+
+\def\oddheading{\parsearg\oddheadingxxx}
+\def\oddheadingxxx #1{\oddheadingyyy #1\|\|\|\|\finish}
+\def\oddheadingyyy #1\|#2\|#3\|#4\finish{%
+\global\oddheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}
+
+\parseargdef\everyheading{\oddheadingxxx{#1}\evenheadingxxx{#1}}%
+
+\def\evenfooting{\parsearg\evenfootingxxx}
+\def\evenfootingxxx #1{\evenfootingyyy #1\|\|\|\|\finish}
+\def\evenfootingyyy #1\|#2\|#3\|#4\finish{%
+\global\evenfootline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}
+
+\def\oddfooting{\parsearg\oddfootingxxx}
+\def\oddfootingxxx #1{\oddfootingyyy #1\|\|\|\|\finish}
+\def\oddfootingyyy #1\|#2\|#3\|#4\finish{%
+  \global\oddfootline = {\rlap{\centerline{#2}}\line{#1\hfil#3}}%
+  %
+  % Leave some space for the footline.  Hopefully ok to assume
+  % @evenfooting will not be used by itself.
+  \global\advance\pageheight by -12pt
+  \global\advance\vsize by -12pt
+}
+
+\parseargdef\everyfooting{\oddfootingxxx{#1}\evenfootingxxx{#1}}
+
+% @evenheadingmarks top     \thischapter <- chapter at the top of a page
+% @evenheadingmarks bottom  \thischapter <- chapter at the bottom of a page
+%
+% The same set of arguments for:
+%
+% @oddheadingmarks
+% @evenfootingmarks
+% @oddfootingmarks
+% @everyheadingmarks
+% @everyfootingmarks
+
+\def\evenheadingmarks{\headingmarks{even}{heading}}
+\def\oddheadingmarks{\headingmarks{odd}{heading}}
+\def\evenfootingmarks{\headingmarks{even}{footing}}
+\def\oddfootingmarks{\headingmarks{odd}{footing}}
+\def\everyheadingmarks#1 {\headingmarks{even}{heading}{#1}
+                          \headingmarks{odd}{heading}{#1} }
+\def\everyfootingmarks#1 {\headingmarks{even}{footing}{#1}
+                          \headingmarks{odd}{footing}{#1} }
+% #1 = even/odd, #2 = heading/footing, #3 = top/bottom.
+\def\headingmarks#1#2#3 {%
+  \expandafter\let\expandafter\temp \csname get#3headingmarks\endcsname
+  \global\expandafter\let\csname get#1#2marks\endcsname \temp
+}
+
+\everyheadingmarks bottom
+\everyfootingmarks bottom
+
+% @headings double      turns headings on for double-sided printing.
+% @headings single      turns headings on for single-sided printing.
+% @headings off         turns them off.
+% @headings on          same as @headings double, retained for compatibility.
+% @headings after       turns on double-sided headings after this page.
+% @headings doubleafter turns on double-sided headings after this page.
+% @headings singleafter turns on single-sided headings after this page.
+% By default, they are off at the start of a document,
+% and turned `on' after @end titlepage.
+
+\def\headings #1 {\csname HEADINGS#1\endcsname}
+
+\def\headingsoff{% non-global headings elimination
+  \evenheadline={\hfil}\evenfootline={\hfil}%
+   \oddheadline={\hfil}\oddfootline={\hfil}%
+}
+
+\def\HEADINGSoff{{\globaldefs=1 \headingsoff}} % global setting
+\HEADINGSoff  % it's the default
+
+% When we turn headings on, set the page number to 1.
+% For double-sided printing, put current file name in lower left corner,
+% chapter name on inside top of right hand pages, document
+% title on inside top of left hand pages, and page numbers on outside top
+% edge of all pages.
+\def\HEADINGSdouble{%
+\global\pageno=1
+\global\evenfootline={\hfil}
+\global\oddfootline={\hfil}
+\global\evenheadline={\line{\folio\hfil\thistitle}}
+\global\oddheadline={\line{\thischapter\hfil\folio}}
+\global\let\contentsalignmacro = \chapoddpage
+}
+\let\contentsalignmacro = \chappager
+
+% For single-sided printing, chapter title goes across top left of page,
+% page number on top right.
+\def\HEADINGSsingle{%
+\global\pageno=1
+\global\evenfootline={\hfil}
+\global\oddfootline={\hfil}
+\global\evenheadline={\line{\thischapter\hfil\folio}}
+\global\oddheadline={\line{\thischapter\hfil\folio}}
+\global\let\contentsalignmacro = \chappager
+}
+\def\HEADINGSon{\HEADINGSdouble}
+
+\def\HEADINGSafter{\let\HEADINGShook=\HEADINGSdoublex}
+\let\HEADINGSdoubleafter=\HEADINGSafter
+\def\HEADINGSdoublex{%
+\global\evenfootline={\hfil}
+\global\oddfootline={\hfil}
+\global\evenheadline={\line{\folio\hfil\thistitle}}
+\global\oddheadline={\line{\thischapter\hfil\folio}}
+\global\let\contentsalignmacro = \chapoddpage
+}
+
+\def\HEADINGSsingleafter{\let\HEADINGShook=\HEADINGSsinglex}
+\def\HEADINGSsinglex{%
+\global\evenfootline={\hfil}
+\global\oddfootline={\hfil}
+\global\evenheadline={\line{\thischapter\hfil\folio}}
+\global\oddheadline={\line{\thischapter\hfil\folio}}
+\global\let\contentsalignmacro = \chappager
+}
+
+% Subroutines used in generating headings
+% This produces Day Month Year style of output.
+% Only define if not already defined, in case a txi-??.tex file has set
+% up a different format (e.g., txi-cs.tex does this).
+\ifx\today\thisisundefined
+\def\today{%
+  \number\day\space
+  \ifcase\month
+  \or\putwordMJan\or\putwordMFeb\or\putwordMMar\or\putwordMApr
+  \or\putwordMMay\or\putwordMJun\or\putwordMJul\or\putwordMAug
+  \or\putwordMSep\or\putwordMOct\or\putwordMNov\or\putwordMDec
+  \fi
+  \space\number\year}
+\fi
+
+% @settitle line...  specifies the title of the document, for headings.
+% It generates no output of its own.
+\def\thistitle{\putwordNoTitle}
+\def\settitle{\parsearg{\gdef\thistitle}}
+
+
+\message{tables,}
+% Tables -- @table, @ftable, @vtable, @item(x).
+
+% default indentation of table text
+\newdimen\tableindent \tableindent=.8in
+% default indentation of @itemize and @enumerate text
+\newdimen\itemindent  \itemindent=.3in
+% margin between end of table item and start of table text.
+\newdimen\itemmargin  \itemmargin=.1in
+
+% used internally for \itemindent minus \itemmargin
+\newdimen\itemmax
+
+% Note @table, @ftable, and @vtable define @item, @itemx, etc., with
+% these defs.
+% They also define \itemindex
+% to index the item name in whatever manner is desired (perhaps none).
+
+\newif\ifitemxneedsnegativevskip
+
+\def\itemxpar{\par\ifitemxneedsnegativevskip\nobreak\vskip-\parskip\nobreak\fi}
+
+\def\internalBitem{\smallbreak \parsearg\itemzzz}
+\def\internalBitemx{\itemxpar \parsearg\itemzzz}
+
+\def\itemzzz #1{\begingroup %
+  \advance\hsize by -\rightskip
+  \advance\hsize by -\tableindent
+  \setbox0=\hbox{\itemindicate{#1}}%
+  \itemindex{#1}%
+  \nobreak % This prevents a break before @itemx.
+  %
+  % If the item text does not fit in the space we have, put it on a line
+  % by itself, and do not allow a page break either before or after that
+  % line.  We do not start a paragraph here because then if the next
+  % command is, e.g., @kindex, the whatsit would get put into the
+  % horizontal list on a line by itself, resulting in extra blank space.
+  \ifdim \wd0>\itemmax
+    %
+    % Make this a paragraph so we get the \parskip glue and wrapping,
+    % but leave it ragged-right.
+    \begingroup
+      \advance\leftskip by-\tableindent
+      \advance\hsize by\tableindent
+      \advance\rightskip by0pt plus1fil\relax
+      \leavevmode\unhbox0\par
+    \endgroup
+    %
+    % We're going to be starting a paragraph, but we don't want the
+    % \parskip glue -- logically it's part of the @item we just started.
+    \nobreak \vskip-\parskip
+    %
+    % Stop a page break at the \parskip glue coming up.  However, if
+    % what follows is an environment such as @example, there will be no
+    % \parskip glue; then the negative vskip we just inserted would
+    % cause the example and the item to crash together.  So we use this
+    % bizarre value of 10001 as a signal to \aboveenvbreak to insert
+    % \parskip glue after all.  Section titles are handled this way also.
+    %
+    \penalty 10001
+    \endgroup
+    \itemxneedsnegativevskipfalse
+  \else
+    % The item text fits into the space.  Start a paragraph, so that the
+    % following text (if any) will end up on the same line.
+    \noindent
+    % Do this with kerns and \unhbox so that if there is a footnote in
+    % the item text, it can migrate to the main vertical list and
+    % eventually be printed.
+    \nobreak\kern-\tableindent
+    \dimen0 = \itemmax  \advance\dimen0 by \itemmargin \advance\dimen0 by -\wd0
+    \unhbox0
+    \nobreak\kern\dimen0
+    \endgroup
+    \itemxneedsnegativevskiptrue
+  \fi
+}
+
+\def\item{\errmessage{@item while not in a list environment}}
+\def\itemx{\errmessage{@itemx while not in a list environment}}
+
+% @table, @ftable, @vtable.
+\envdef\table{%
+  \let\itemindex\gobble
+  \tablecheck{table}%
+}
+\envdef\ftable{%
+  \def\itemindex ##1{\doind {fn}{\code{##1}}}%
+  \tablecheck{ftable}%
+}
+\envdef\vtable{%
+  \def\itemindex ##1{\doind {vr}{\code{##1}}}%
+  \tablecheck{vtable}%
+}
+\def\tablecheck#1{%
+  \ifnum \the\catcode`\^^M=\active
+    \endgroup
+    \errmessage{This command won't work in this context; perhaps the problem is
+      that we are \inenvironment\thisenv}%
+    \def\next{\doignore{#1}}%
+  \else
+    \let\next\tablex
+  \fi
+  \next
+}
+\def\tablex#1{%
+  \def\itemindicate{#1}%
+  \parsearg\tabley
+}
+\def\tabley#1{%
+  {%
+    \makevalueexpandable
+    \edef\temp{\noexpand\tablez #1\space\space\space}%
+    \expandafter
+  }\temp \endtablez
+}
+\def\tablez #1 #2 #3 #4\endtablez{%
+  \aboveenvbreak
+  \ifnum 0#1>0 \advance \leftskip by #1\mil \fi
+  \ifnum 0#2>0 \tableindent=#2\mil \fi
+  \ifnum 0#3>0 \advance \rightskip by #3\mil \fi
+  \itemmax=\tableindent
+  \advance \itemmax by -\itemmargin
+  \advance \leftskip by \tableindent
+  \exdentamount=\tableindent
+  \parindent = 0pt
+  \parskip = \smallskipamount
+  \ifdim \parskip=0pt \parskip=2pt \fi
+  \let\item = \internalBitem
+  \let\itemx = \internalBitemx
+}
+\def\Etable{\endgraf\afterenvbreak}
+\let\Eftable\Etable
+\let\Evtable\Etable
+\let\Eitemize\Etable
+\let\Eenumerate\Etable
+
+% This is the counter used by @enumerate, which is really @itemize
+
+\newcount \itemno
+
+\envdef\itemize{\parsearg\doitemize}
+
+\def\doitemize#1{%
+  \aboveenvbreak
+  \itemmax=\itemindent
+  \advance\itemmax by -\itemmargin
+  \advance\leftskip by \itemindent
+  \exdentamount=\itemindent
+  \parindent=0pt
+  \parskip=\smallskipamount
+  \ifdim\parskip=0pt \parskip=2pt \fi
+  %
+  % Try typesetting the item mark that if the document erroneously says
+  % something like @itemize @samp (intending @table), there's an error
+  % right away at the @itemize.  It's not the best error message in the
+  % world, but it's better than leaving it to the @item.  This means if
+  % the user wants an empty mark, they have to say @w{} not just @w.
+  \def\itemcontents{#1}%
+  \setbox0 = \hbox{\itemcontents}%
+  %
+  % @itemize with no arg is equivalent to @itemize @bullet.
+  \ifx\itemcontents\empty\def\itemcontents{\bullet}\fi
+  %
+  \let\item=\itemizeitem
+}
+
+% Definition of @item while inside @itemize and @enumerate.
+%
+\def\itemizeitem{%
+  \advance\itemno by 1  % for enumerations
+  {\let\par=\endgraf \smallbreak}% reasonable place to break
+  {%
+   % If the document has an @itemize directly after a section title, a
+   % \nobreak will be last on the list, and \sectionheading will have
+   % done a \vskip-\parskip.  In that case, we don't want to zero
+   % parskip, or the item text will crash with the heading.  On the
+   % other hand, when there is normal text preceding the item (as there
+   % usually is), we do want to zero parskip, or there would be too much
+   % space.  In that case, we won't have a \nobreak before.  At least
+   % that's the theory.
+   \ifnum\lastpenalty<10000 \parskip=0in \fi
+   \noindent
+   \hbox to 0pt{\hss \itemcontents \kern\itemmargin}%
+   %
+   \vadjust{\penalty 1200}}% not good to break after first line of item.
+  \flushcr
+}
+
+% \splitoff TOKENS\endmark defines \first to be the first token in
+% TOKENS, and \rest to be the remainder.
+%
+\def\splitoff#1#2\endmark{\def\first{#1}\def\rest{#2}}%
+
+% Allow an optional argument of an uppercase letter, lowercase letter,
+% or number, to specify the first label in the enumerated list.  No
+% argument is the same as `1'.
+%
+\envparseargdef\enumerate{\enumeratey #1  \endenumeratey}
+\def\enumeratey #1 #2\endenumeratey{%
+  % If we were given no argument, pretend we were given `1'.
+  \def\thearg{#1}%
+  \ifx\thearg\empty \def\thearg{1}\fi
+  %
+  % Detect if the argument is a single token.  If so, it might be a
+  % letter.  Otherwise, the only valid thing it can be is a number.
+  % (We will always have one token, because of the test we just made.
+  % This is a good thing, since \splitoff doesn't work given nothing at
+  % all -- the first parameter is undelimited.)
+  \expandafter\splitoff\thearg\endmark
+  \ifx\rest\empty
+    % Only one token in the argument.  It could still be anything.
+    % A ``lowercase letter'' is one whose \lccode is nonzero.
+    % An ``uppercase letter'' is one whose \lccode is both nonzero, and
+    %   not equal to itself.
+    % Otherwise, we assume it's a number.
+    %
+    % We need the \relax at the end of the \ifnum lines to stop TeX from
+    % continuing to look for a <number>.
+    %
+    \ifnum\lccode\expandafter`\thearg=0\relax
+      \numericenumerate % a number (we hope)
+    \else
+      % It's a letter.
+      \ifnum\lccode\expandafter`\thearg=\expandafter`\thearg\relax
+        \lowercaseenumerate % lowercase letter
+      \else
+        \uppercaseenumerate % uppercase letter
+      \fi
+    \fi
+  \else
+    % Multiple tokens in the argument.  We hope it's a number.
+    \numericenumerate
+  \fi
+}
+
+% An @enumerate whose labels are integers.  The starting integer is
+% given in \thearg.
+%
+\def\numericenumerate{%
+  \itemno = \thearg
+  \startenumeration{\the\itemno}%
+}
+
+% The starting (lowercase) letter is in \thearg.
+\def\lowercaseenumerate{%
+  \itemno = \expandafter`\thearg
+  \startenumeration{%
+    % Be sure we're not beyond the end of the alphabet.
+    \ifnum\itemno=0
+      \errmessage{No more lowercase letters in @enumerate; get a bigger
+                  alphabet}%
+    \fi
+    \char\lccode\itemno
+  }%
+}
+
+% The starting (uppercase) letter is in \thearg.
+\def\uppercaseenumerate{%
+  \itemno = \expandafter`\thearg
+  \startenumeration{%
+    % Be sure we're not beyond the end of the alphabet.
+    \ifnum\itemno=0
+      \errmessage{No more uppercase letters in @enumerate; get a bigger
+                  alphabet}
+    \fi
+    \char\uccode\itemno
+  }%
+}
+
+% Call \doitemize, adding a period to the first argument and supplying the
+% common last two arguments.  Also subtract one from the initial value in
+% \itemno, since @item increments \itemno.
+%
+\def\startenumeration#1{%
+  \advance\itemno by -1
+  \doitemize{#1.}\flushcr
+}
+
+% @alphaenumerate and @capsenumerate are abbreviations for giving an arg
+% to @enumerate.
+%
+\def\alphaenumerate{\enumerate{a}}
+\def\capsenumerate{\enumerate{A}}
+\def\Ealphaenumerate{\Eenumerate}
+\def\Ecapsenumerate{\Eenumerate}
+
+
+% @multitable macros
+% Amy Hendrickson, 8/18/94, 3/6/96
+%
+% @multitable ... @end multitable will make as many columns as desired.
+% Contents of each column will wrap at width given in preamble.  Width
+% can be specified either with sample text given in a template line,
+% or in percent of \hsize, the current width of text on page.
+
+% Table can continue over pages but will only break between lines.
+
+% To make preamble:
+%
+% Either define widths of columns in terms of percent of \hsize:
+%   @multitable @columnfractions .25 .3 .45
+%   @item ...
+%
+%   Numbers following @columnfractions are the percent of the total
+%   current hsize to be used for each column. You may use as many
+%   columns as desired.
+
+
+% Or use a template:
+%   @multitable {Column 1 template} {Column 2 template} {Column 3 template}
+%   @item ...
+%   using the widest term desired in each column.
+
+% Each new table line starts with @item, each subsequent new column
+% starts with @tab. Empty columns may be produced by supplying @tab's
+% with nothing between them for as many times as empty columns are needed,
+% ie, @tab at tab@tab will produce two empty columns.
+
+% @item, @tab do not need to be on their own lines, but it will not hurt
+% if they are.
+
+% Sample multitable:
+
+%   @multitable {Column 1 template} {Column 2 template} {Column 3 template}
+%   @item first col stuff @tab second col stuff @tab third col
+%   @item
+%   first col stuff
+%   @tab
+%   second col stuff
+%   @tab
+%   third col
+%   @item first col stuff @tab second col stuff
+%   @tab Many paragraphs of text may be used in any column.
+%
+%         They will wrap at the width determined by the template.
+%   @item at tab@tab This will be in third column.
+%   @end multitable
+
+% Default dimensions may be reset by user.
+% @multitableparskip is vertical space between paragraphs in table.
+% @multitableparindent is paragraph indent in table.
+% @multitablecolmargin is horizontal space to be left between columns.
+% @multitablelinespace is space to leave between table items, baseline
+%                                                            to baseline.
+%   0pt means it depends on current normal line spacing.
+%
+\newskip\multitableparskip
+\newskip\multitableparindent
+\newdimen\multitablecolspace
+\newskip\multitablelinespace
+\multitableparskip=0pt
+\multitableparindent=6pt
+\multitablecolspace=12pt
+\multitablelinespace=0pt
+
+% Macros used to set up halign preamble:
+%
+\let\endsetuptable\relax
+\def\xendsetuptable{\endsetuptable}
+\let\columnfractions\relax
+\def\xcolumnfractions{\columnfractions}
+\newif\ifsetpercent
+
+% #1 is the @columnfraction, usually a decimal number like .5, but might
+% be just 1.  We just use it, whatever it is.
+%
+\def\pickupwholefraction#1 {%
+  \global\advance\colcount by 1
+  \expandafter\xdef\csname col\the\colcount\endcsname{#1\hsize}%
+  \setuptable
+}
+
+\newcount\colcount
+\def\setuptable#1{%
+  \def\firstarg{#1}%
+  \ifx\firstarg\xendsetuptable
+    \let\go = \relax
+  \else
+    \ifx\firstarg\xcolumnfractions
+      \global\setpercenttrue
+    \else
+      \ifsetpercent
+         \let\go\pickupwholefraction
+      \else
+         \global\advance\colcount by 1
+         \setbox0=\hbox{#1\unskip\space}% Add a normal word space as a
+                   % separator; typically that is always in the input, anyway.
+         \expandafter\xdef\csname col\the\colcount\endcsname{\the\wd0}%
+      \fi
+    \fi
+    \ifx\go\pickupwholefraction
+      % Put the argument back for the \pickupwholefraction call, so
+      % we'll always have a period there to be parsed.
+      \def\go{\pickupwholefraction#1}%
+    \else
+      \let\go = \setuptable
+    \fi%
+  \fi
+  \go
+}
+
+% multitable-only commands.
+%
+% @headitem starts a heading row, which we typeset in bold.
+% Assignments have to be global since we are inside the implicit group
+% of an alignment entry.  \everycr resets \everytab so we don't have to
+% undo it ourselves.
+\def\headitemfont{\b}% for people to use in the template row; not changeable
+\def\headitem{%
+  \checkenv\multitable
+  \crcr
+  \global\everytab={\bf}% can't use \headitemfont since the parsing differs
+  \the\everytab % for the first item
+}%
+%
+% A \tab used to include \hskip1sp.  But then the space in a template
+% line is not enough.  That is bad.  So let's go back to just `&' until
+% we again encounter the problem the 1sp was intended to solve.
+%					--karl, nathan at acm.org, 20apr99.
+\def\tab{\checkenv\multitable &\the\everytab}%
+
+% @multitable ... @end multitable definitions:
+%
+\newtoks\everytab  % insert after every tab.
+%
+\envdef\multitable{%
+  \vskip\parskip
+  \startsavinginserts
+  %
+  % @item within a multitable starts a normal row.
+  % We use \def instead of \let so that if one of the multitable entries
+  % contains an @itemize, we don't choke on the \item (seen as \crcr aka
+  % \endtemplate) expanding \doitemize.
+  \def\item{\crcr}%
+  %
+  \tolerance=9500
+  \hbadness=9500
+  \setmultitablespacing
+  \parskip=\multitableparskip
+  \parindent=\multitableparindent
+  \overfullrule=0pt
+  \global\colcount=0
+  %
+  \everycr = {%
+    \noalign{%
+      \global\everytab={}%
+      \global\colcount=0 % Reset the column counter.
+      % Check for saved footnotes, etc.
+      \checkinserts
+      % Keeps underfull box messages off when table breaks over pages.
+      %\filbreak
+	% Maybe so, but it also creates really weird page breaks when the
+	% table breaks over pages. Wouldn't \vfil be better?  Wait until the
+	% problem manifests itself, so it can be fixed for real --karl.
+    }%
+  }%
+  %
+  \parsearg\domultitable
+}
+\def\domultitable#1{%
+  % To parse everything between @multitable and @item:
+  \setuptable#1 \endsetuptable
+  %
+  % This preamble sets up a generic column definition, which will
+  % be used as many times as user calls for columns.
+  % \vtop will set a single line and will also let text wrap and
+  % continue for many paragraphs if desired.
+  \halign\bgroup &%
+    \global\advance\colcount by 1
+    \multistrut
+    \vtop{%
+      % Use the current \colcount to find the correct column width:
+      \hsize=\expandafter\csname col\the\colcount\endcsname
+      %
+      % In order to keep entries from bumping into each other
+      % we will add a \leftskip of \multitablecolspace to all columns after
+      % the first one.
+      %
+      % If a template has been used, we will add \multitablecolspace
+      % to the width of each template entry.
+      %
+      % If the user has set preamble in terms of percent of \hsize we will
+      % use that dimension as the width of the column, and the \leftskip
+      % will keep entries from bumping into each other.  Table will start at
+      % left margin and final column will justify at right margin.
+      %
+      % Make sure we don't inherit \rightskip from the outer environment.
+      \rightskip=0pt
+      \ifnum\colcount=1
+	% The first column will be indented with the surrounding text.
+	\advance\hsize by\leftskip
+      \else
+	\ifsetpercent \else
+	  % If user has not set preamble in terms of percent of \hsize
+	  % we will advance \hsize by \multitablecolspace.
+	  \advance\hsize by \multitablecolspace
+	\fi
+       % In either case we will make \leftskip=\multitablecolspace:
+      \leftskip=\multitablecolspace
+      \fi
+      % Ignoring space at the beginning and end avoids an occasional spurious
+      % blank line, when TeX decides to break the line at the space before the
+      % box from the multistrut, so the strut ends up on a line by itself.
+      % For example:
+      % @multitable @columnfractions .11 .89
+      % @item @code{#}
+      % @tab Legal holiday which is valid in major parts of the whole country.
+      % Is automatically provided with highlighting sequences respectively
+      % marking characters.
+      \noindent\ignorespaces##\unskip\multistrut
+    }\cr
+}
+\def\Emultitable{%
+  \crcr
+  \egroup % end the \halign
+  \global\setpercentfalse
+}
+
+\def\setmultitablespacing{%
+  \def\multistrut{\strut}% just use the standard line spacing
+  %
+  % Compute \multitablelinespace (if not defined by user) for use in
+  % \multitableparskip calculation.  We used define \multistrut based on
+  % this, but (ironically) that caused the spacing to be off.
+  % See bug-texinfo report from Werner Lemberg, 31 Oct 2004 12:52:20 +0100.
+\ifdim\multitablelinespace=0pt
+\setbox0=\vbox{X}\global\multitablelinespace=\the\baselineskip
+\global\advance\multitablelinespace by-\ht0
+\fi
+% Test to see if parskip is larger than space between lines of
+% table. If not, do nothing.
+%        If so, set to same dimension as multitablelinespace.
+\ifdim\multitableparskip>\multitablelinespace
+\global\multitableparskip=\multitablelinespace
+\global\advance\multitableparskip-7pt % to keep parskip somewhat smaller
+                                      % than skip between lines in the table.
+\fi%
+\ifdim\multitableparskip=0pt
+\global\multitableparskip=\multitablelinespace
+\global\advance\multitableparskip-7pt % to keep parskip somewhat smaller
+                                      % than skip between lines in the table.
+\fi}
+
+
+\message{conditionals,}
+
+% @iftex, @ifnotdocbook, @ifnothtml, @ifnotinfo, @ifnotplaintext,
+% @ifnotxml always succeed.  They currently do nothing; we don't
+% attempt to check whether the conditionals are properly nested.  But we
+% have to remember that they are conditionals, so that @end doesn't
+% attempt to close an environment group.
+%
+\def\makecond#1{%
+  \expandafter\let\csname #1\endcsname = \relax
+  \expandafter\let\csname iscond.#1\endcsname = 1
+}
+\makecond{iftex}
+\makecond{ifnotdocbook}
+\makecond{ifnothtml}
+\makecond{ifnotinfo}
+\makecond{ifnotplaintext}
+\makecond{ifnotxml}
+
+% Ignore @ignore, @ifhtml, @ifinfo, and the like.
+%
+\def\direntry{\doignore{direntry}}
+\def\documentdescription{\doignore{documentdescription}}
+\def\docbook{\doignore{docbook}}
+\def\html{\doignore{html}}
+\def\ifdocbook{\doignore{ifdocbook}}
+\def\ifhtml{\doignore{ifhtml}}
+\def\ifinfo{\doignore{ifinfo}}
+\def\ifnottex{\doignore{ifnottex}}
+\def\ifplaintext{\doignore{ifplaintext}}
+\def\ifxml{\doignore{ifxml}}
+\def\ignore{\doignore{ignore}}
+\def\menu{\doignore{menu}}
+\def\xml{\doignore{xml}}
+
+% Ignore text until a line `@end #1', keeping track of nested conditionals.
+%
+% A count to remember the depth of nesting.
+\newcount\doignorecount
+
+\def\doignore#1{\begingroup
+  % Scan in ``verbatim'' mode:
+  \obeylines
+  \catcode`\@ = \other
+  \catcode`\{ = \other
+  \catcode`\} = \other
+  %
+  % Make sure that spaces turn into tokens that match what \doignoretext wants.
+  \spaceisspace
+  %
+  % Count number of #1's that we've seen.
+  \doignorecount = 0
+  %
+  % Swallow text until we reach the matching `@end #1'.
+  \dodoignore{#1}%
+}
+
+{ \catcode`_=11 % We want to use \_STOP_ which cannot appear in texinfo source.
+  \obeylines %
+  %
+  \gdef\dodoignore#1{%
+    % #1 contains the command name as a string, e.g., `ifinfo'.
+    %
+    % Define a command to find the next `@end #1'.
+    \long\def\doignoretext##1^^M at end #1{%
+      \doignoretextyyy##1^^M@#1\_STOP_}%
+    %
+    % And this command to find another #1 command, at the beginning of a
+    % line.  (Otherwise, we would consider a line `@c @ifset', for
+    % example, to count as an @ifset for nesting.)
+    \long\def\doignoretextyyy##1^^M@#1##2\_STOP_{\doignoreyyy{##2}\_STOP_}%
+    %
+    % And now expand that command.
+    \doignoretext ^^M%
+  }%
+}
+
+\def\doignoreyyy#1{%
+  \def\temp{#1}%
+  \ifx\temp\empty			% Nothing found.
+    \let\next\doignoretextzzz
+  \else					% Found a nested condition, ...
+    \advance\doignorecount by 1
+    \let\next\doignoretextyyy		% ..., look for another.
+    % If we're here, #1 ends with ^^M\ifinfo (for example).
+  \fi
+  \next #1% the token \_STOP_ is present just after this macro.
+}
+
+% We have to swallow the remaining "\_STOP_".
+%
+\def\doignoretextzzz#1{%
+  \ifnum\doignorecount = 0	% We have just found the outermost @end.
+    \let\next\enddoignore
+  \else				% Still inside a nested condition.
+    \advance\doignorecount by -1
+    \let\next\doignoretext      % Look for the next @end.
+  \fi
+  \next
+}
+
+% Finish off ignored text.
+{ \obeylines%
+  % Ignore anything after the last `@end #1'; this matters in verbatim
+  % environments, where otherwise the newline after an ignored conditional
+  % would result in a blank line in the output.
+  \gdef\enddoignore#1^^M{\endgroup\ignorespaces}%
+}
+
+
+% @set VAR sets the variable VAR to an empty value.
+% @set VAR REST-OF-LINE sets VAR to the value REST-OF-LINE.
+%
+% Since we want to separate VAR from REST-OF-LINE (which might be
+% empty), we can't just use \parsearg; we have to insert a space of our
+% own to delimit the rest of the line, and then take it out again if we
+% didn't need it.
+% We rely on the fact that \parsearg sets \catcode`\ =10.
+%
+\parseargdef\set{\setyyy#1 \endsetyyy}
+\def\setyyy#1 #2\endsetyyy{%
+  {%
+    \makevalueexpandable
+    \def\temp{#2}%
+    \edef\next{\gdef\makecsname{SET#1}}%
+    \ifx\temp\empty
+      \next{}%
+    \else
+      \setzzz#2\endsetzzz
+    \fi
+  }%
+}
+% Remove the trailing space \setxxx inserted.
+\def\setzzz#1 \endsetzzz{\next{#1}}
+
+% @clear VAR clears (i.e., unsets) the variable VAR.
+%
+\parseargdef\clear{%
+  {%
+    \makevalueexpandable
+    \global\expandafter\let\csname SET#1\endcsname=\relax
+  }%
+}
+
+% @value{foo} gets the text saved in variable foo.
+\def\value{\begingroup\makevalueexpandable\valuexxx}
+\def\valuexxx#1{\expandablevalue{#1}\endgroup}
+{
+  \catcode`\- = \active \catcode`\_ = \active
+  %
+  \gdef\makevalueexpandable{%
+    \let\value = \expandablevalue
+    % We don't want these characters active, ...
+    \catcode`\-=\other \catcode`\_=\other
+    % ..., but we might end up with active ones in the argument if
+    % we're called from @code, as @code{@value{foo-bar_}}, though.
+    % So \let them to their normal equivalents.
+    \let-\normaldash \let_\normalunderscore
+  }
+}
+
+% We have this subroutine so that we can handle at least some @value's
+% properly in indexes (we call \makevalueexpandable in \indexdummies).
+% The command has to be fully expandable (if the variable is set), since
+% the result winds up in the index file.  This means that if the
+% variable's value contains other Texinfo commands, it's almost certain
+% it will fail (although perhaps we could fix that with sufficient work
+% to do a one-level expansion on the result, instead of complete).
+%
+\def\expandablevalue#1{%
+  \expandafter\ifx\csname SET#1\endcsname\relax
+    {[No value for ``#1'']}%
+    \message{Variable `#1', used in @value, is not set.}%
+  \else
+    \csname SET#1\endcsname
+  \fi
+}
+
+% @ifset VAR ... @end ifset reads the `...' iff VAR has been defined
+% with @set.
+%
+% To get special treatment of `@end ifset,' call \makeond and the redefine.
+%
+\makecond{ifset}
+\def\ifset{\parsearg{\doifset{\let\next=\ifsetfail}}}
+\def\doifset#1#2{%
+  {%
+    \makevalueexpandable
+    \let\next=\empty
+    \expandafter\ifx\csname SET#2\endcsname\relax
+      #1% If not set, redefine \next.
+    \fi
+    \expandafter
+  }\next
+}
+\def\ifsetfail{\doignore{ifset}}
+
+% @ifclear VAR ... @end executes the `...' iff VAR has never been
+% defined with @set, or has been undefined with @clear.
+%
+% The `\else' inside the `\doifset' parameter is a trick to reuse the
+% above code: if the variable is not set, do nothing, if it is set,
+% then redefine \next to \ifclearfail.
+%
+\makecond{ifclear}
+\def\ifclear{\parsearg{\doifset{\else \let\next=\ifclearfail}}}
+\def\ifclearfail{\doignore{ifclear}}
+
+% @ifcommandisdefined CMD ... @end executes the `...' if CMD (written
+% without the @) is in fact defined.  We can only feasibly check at the
+% TeX level, so something like `mathcode' is going to considered
+% defined even though it is not a Texinfo command.
+% 
+\makecond{ifcommanddefined}
+\def\ifcommanddefined{\parsearg{\doifcmddefined{\let\next=\ifcmddefinedfail}}}
+%
+\def\doifcmddefined#1#2{{%
+    \makevalueexpandable
+    \let\next=\empty
+    \expandafter\ifx\csname #2\endcsname\relax
+      #1% If not defined, \let\next as above.
+    \fi
+    \expandafter
+  }\next
+}
+\def\ifcmddefinedfail{\doignore{ifcommanddefined}}
+
+% @ifcommandnotdefined CMD ... handled similar to @ifclear above.
+\makecond{ifcommandnotdefined}
+\def\ifcommandnotdefined{%
+  \parsearg{\doifcmddefined{\else \let\next=\ifcmdnotdefinedfail}}}
+\def\ifcmdnotdefinedfail{\doignore{ifcommandnotdefined}}
+
+% Set the `txicommandconditionals' variable, so documents have a way to
+% test if the @ifcommand...defined conditionals are available.
+\set txicommandconditionals
+
+% @dircategory CATEGORY  -- specify a category of the dir file
+% which this file should belong to.  Ignore this in TeX.
+\let\dircategory=\comment
+
+% @defininfoenclose.
+\let\definfoenclose=\comment
+
+
+\message{indexing,}
+% Index generation facilities
+
+% Define \newwrite to be identical to plain tex's \newwrite
+% except not \outer, so it can be used within macros and \if's.
+\edef\newwrite{\makecsname{ptexnewwrite}}
+
+% \newindex {foo} defines an index named foo.
+% It automatically defines \fooindex such that
+% \fooindex ...rest of line... puts an entry in the index foo.
+% It also defines \fooindfile to be the number of the output channel for
+% the file that accumulates this index.  The file's extension is foo.
+% The name of an index should be no more than 2 characters long
+% for the sake of vms.
+%
+\def\newindex#1{%
+  \iflinks
+    \expandafter\newwrite \csname#1indfile\endcsname
+    \openout \csname#1indfile\endcsname \jobname.#1 % Open the file
+  \fi
+  \expandafter\xdef\csname#1index\endcsname{%     % Define @#1index
+    \noexpand\doindex{#1}}
+}
+
+% @defindex foo  ==  \newindex{foo}
+%
+\def\defindex{\parsearg\newindex}
+
+% Define @defcodeindex, like @defindex except put all entries in @code.
+%
+\def\defcodeindex{\parsearg\newcodeindex}
+%
+\def\newcodeindex#1{%
+  \iflinks
+    \expandafter\newwrite \csname#1indfile\endcsname
+    \openout \csname#1indfile\endcsname \jobname.#1
+  \fi
+  \expandafter\xdef\csname#1index\endcsname{%
+    \noexpand\docodeindex{#1}}%
+}
+
+
+% @synindex foo bar    makes index foo feed into index bar.
+% Do this instead of @defindex foo if you don't want it as a separate index.
+%
+% @syncodeindex foo bar   similar, but put all entries made for index foo
+% inside @code.
+%
+\def\synindex#1 #2 {\dosynindex\doindex{#1}{#2}}
+\def\syncodeindex#1 #2 {\dosynindex\docodeindex{#1}{#2}}
+
+% #1 is \doindex or \docodeindex, #2 the index getting redefined (foo),
+% #3 the target index (bar).
+\def\dosynindex#1#2#3{%
+  % Only do \closeout if we haven't already done it, else we'll end up
+  % closing the target index.
+  \expandafter \ifx\csname donesynindex#2\endcsname \relax
+    % The \closeout helps reduce unnecessary open files; the limit on the
+    % Acorn RISC OS is a mere 16 files.
+    \expandafter\closeout\csname#2indfile\endcsname
+    \expandafter\let\csname donesynindex#2\endcsname = 1
+  \fi
+  % redefine \fooindfile:
+  \expandafter\let\expandafter\temp\expandafter=\csname#3indfile\endcsname
+  \expandafter\let\csname#2indfile\endcsname=\temp
+  % redefine \fooindex:
+  \expandafter\xdef\csname#2index\endcsname{\noexpand#1{#3}}%
+}
+
+% Define \doindex, the driver for all \fooindex macros.
+% Argument #1 is generated by the calling \fooindex macro,
+%  and it is "foo", the name of the index.
+
+% \doindex just uses \parsearg; it calls \doind for the actual work.
+% This is because \doind is more useful to call from other macros.
+
+% There is also \dosubind {index}{topic}{subtopic}
+% which makes an entry in a two-level index such as the operation index.
+
+\def\doindex#1{\edef\indexname{#1}\parsearg\singleindexer}
+\def\singleindexer #1{\doind{\indexname}{#1}}
+
+% like the previous two, but they put @code around the argument.
+\def\docodeindex#1{\edef\indexname{#1}\parsearg\singlecodeindexer}
+\def\singlecodeindexer #1{\doind{\indexname}{\code{#1}}}
+
+% Take care of Texinfo commands that can appear in an index entry.
+% Since there are some commands we want to expand, and others we don't,
+% we have to laboriously prevent expansion for those that we don't.
+%
+\def\indexdummies{%
+  \escapechar = `\\     % use backslash in output files.
+  \def\@{@}% change to @@ when we switch to @ as escape char in index files.
+  \def\ {\realbackslash\space }%
+  %
+  % Need these unexpandable (because we define \tt as a dummy)
+  % definitions when @{ or @} appear in index entry text.  Also, more
+  % complicated, when \tex is in effect and \{ is a \delimiter again.
+  % We can't use \lbracecmd and \rbracecmd because texindex assumes
+  % braces and backslashes are used only as delimiters.  Perhaps we
+  % should define @lbrace and @rbrace commands a la @comma.
+  \def\{{{\tt\char123}}%
+  \def\}{{\tt\char125}}%
+  %
+  % I don't entirely understand this, but when an index entry is
+  % generated from a macro call, the \endinput which \scanmacro inserts
+  % causes processing to be prematurely terminated.  This is,
+  % apparently, because \indexsorttmp is fully expanded, and \endinput
+  % is an expandable command.  The redefinition below makes \endinput
+  % disappear altogether for that purpose -- although logging shows that
+  % processing continues to some further point.  On the other hand, it
+  % seems \endinput does not hurt in the printed index arg, since that
+  % is still getting written without apparent harm.
+  %
+  % Sample source (mac-idx3.tex, reported by Graham Percival to
+  % help-texinfo, 22may06):
+  % @macro funindex {WORD}
+  % @findex xyz
+  % @end macro
+  % ...
+  % @funindex commtest
+  %
+  % The above is not enough to reproduce the bug, but it gives the flavor.
+  %
+  % Sample whatsit resulting:
+  % . at write3{\entry{xyz}{@folio }{@code {xyz at endinput }}}
+  %
+  % So:
+  \let\endinput = \empty
+  %
+  % Do the redefinitions.
+  \commondummies
+}
+
+% For the aux and toc files, @ is the escape character.  So we want to
+% redefine everything using @ as the escape character (instead of
+% \realbackslash, still used for index files).  When everything uses @,
+% this will be simpler.
+%
+\def\atdummies{%
+  \def\@{@@}%
+  \def\ {@ }%
+  \let\{ = \lbraceatcmd
+  \let\} = \rbraceatcmd
+  %
+  % Do the redefinitions.
+  \commondummies
+  \otherbackslash
+}
+
+% Called from \indexdummies and \atdummies.
+%
+\def\commondummies{%
+  %
+  % \definedummyword defines \#1 as \string\#1\space, thus effectively
+  % preventing its expansion.  This is used only for control words,
+  % not control letters, because the \space would be incorrect for
+  % control characters, but is needed to separate the control word
+  % from whatever follows.
+  %
+  % For control letters, we have \definedummyletter, which omits the
+  % space.
+  %
+  % These can be used both for control words that take an argument and
+  % those that do not.  If it is followed by {arg} in the input, then
+  % that will dutifully get written to the index (or wherever).
+  %
+  \def\definedummyword  ##1{\def##1{\string##1\space}}%
+  \def\definedummyletter##1{\def##1{\string##1}}%
+  \let\definedummyaccent\definedummyletter
+  %
+  \commondummiesnofonts
+  %
+  \definedummyletter\_%
+  \definedummyletter\-%
+  %
+  % Non-English letters.
+  \definedummyword\AA
+  \definedummyword\AE
+  \definedummyword\DH
+  \definedummyword\L
+  \definedummyword\O
+  \definedummyword\OE
+  \definedummyword\TH
+  \definedummyword\aa
+  \definedummyword\ae
+  \definedummyword\dh
+  \definedummyword\exclamdown
+  \definedummyword\l
+  \definedummyword\o
+  \definedummyword\oe
+  \definedummyword\ordf
+  \definedummyword\ordm
+  \definedummyword\questiondown
+  \definedummyword\ss
+  \definedummyword\th
+  %
+  % Although these internal commands shouldn't show up, sometimes they do.
+  \definedummyword\bf
+  \definedummyword\gtr
+  \definedummyword\hat
+  \definedummyword\less
+  \definedummyword\sf
+  \definedummyword\sl
+  \definedummyword\tclose
+  \definedummyword\tt
+  %
+  \definedummyword\LaTeX
+  \definedummyword\TeX
+  %
+  % Assorted special characters.
+  \definedummyword\arrow
+  \definedummyword\bullet
+  \definedummyword\comma
+  \definedummyword\copyright
+  \definedummyword\registeredsymbol
+  \definedummyword\dots
+  \definedummyword\enddots
+  \definedummyword\entrybreak
+  \definedummyword\equiv
+  \definedummyword\error
+  \definedummyword\euro
+  \definedummyword\expansion
+  \definedummyword\geq
+  \definedummyword\guillemetleft
+  \definedummyword\guillemetright
+  \definedummyword\guilsinglleft
+  \definedummyword\guilsinglright
+  \definedummyword\lbracechar
+  \definedummyword\leq
+  \definedummyword\minus
+  \definedummyword\ogonek
+  \definedummyword\pounds
+  \definedummyword\point
+  \definedummyword\print
+  \definedummyword\quotedblbase
+  \definedummyword\quotedblleft
+  \definedummyword\quotedblright
+  \definedummyword\quoteleft
+  \definedummyword\quoteright
+  \definedummyword\quotesinglbase
+  \definedummyword\rbracechar
+  \definedummyword\result
+  \definedummyword\textdegree
+  %
+  % We want to disable all macros so that they are not expanded by \write.
+  \macrolist
+  %
+  \normalturnoffactive
+  %
+  % Handle some cases of @value -- where it does not contain any
+  % (non-fully-expandable) commands.
+  \makevalueexpandable
+}
+
+% \commondummiesnofonts: common to \commondummies and \indexnofonts.
+%
+\def\commondummiesnofonts{%
+  % Control letters and accents.
+  \definedummyletter\!%
+  \definedummyaccent\"%
+  \definedummyaccent\'%
+  \definedummyletter\*%
+  \definedummyaccent\,%
+  \definedummyletter\.%
+  \definedummyletter\/%
+  \definedummyletter\:%
+  \definedummyaccent\=%
+  \definedummyletter\?%
+  \definedummyaccent\^%
+  \definedummyaccent\`%
+  \definedummyaccent\~%
+  \definedummyword\u
+  \definedummyword\v
+  \definedummyword\H
+  \definedummyword\dotaccent
+  \definedummyword\ogonek
+  \definedummyword\ringaccent
+  \definedummyword\tieaccent
+  \definedummyword\ubaraccent
+  \definedummyword\udotaccent
+  \definedummyword\dotless
+  %
+  % Texinfo font commands.
+  \definedummyword\b
+  \definedummyword\i
+  \definedummyword\r
+  \definedummyword\sansserif
+  \definedummyword\sc
+  \definedummyword\slanted
+  \definedummyword\t
+  %
+  % Commands that take arguments.
+  \definedummyword\abbr
+  \definedummyword\acronym
+  \definedummyword\anchor
+  \definedummyword\cite
+  \definedummyword\code
+  \definedummyword\command
+  \definedummyword\dfn
+  \definedummyword\dmn
+  \definedummyword\email
+  \definedummyword\emph
+  \definedummyword\env
+  \definedummyword\file
+  \definedummyword\image
+  \definedummyword\indicateurl
+  \definedummyword\inforef
+  \definedummyword\kbd
+  \definedummyword\key
+  \definedummyword\math
+  \definedummyword\option
+  \definedummyword\pxref
+  \definedummyword\ref
+  \definedummyword\samp
+  \definedummyword\strong
+  \definedummyword\tie
+  \definedummyword\uref
+  \definedummyword\url
+  \definedummyword\var
+  \definedummyword\verb
+  \definedummyword\w
+  \definedummyword\xref
+}
+
+% \indexnofonts is used when outputting the strings to sort the index
+% by, and when constructing control sequence names.  It eliminates all
+% control sequences and just writes whatever the best ASCII sort string
+% would be for a given command (usually its argument).
+%
+\def\indexnofonts{%
+  % Accent commands should become @asis.
+  \def\definedummyaccent##1{\let##1\asis}%
+  % We can just ignore other control letters.
+  \def\definedummyletter##1{\let##1\empty}%
+  % All control words become @asis by default; overrides below.
+  \let\definedummyword\definedummyaccent
+  %
+  \commondummiesnofonts
+  %
+  % Don't no-op \tt, since it isn't a user-level command
+  % and is used in the definitions of the active chars like <, >, |, etc.
+  % Likewise with the other plain tex font commands.
+  %\let\tt=\asis
+  %
+  \def\ { }%
+  \def\@{@}%
+  \def\_{\normalunderscore}%
+  \def\-{}% @- shouldn't affect sorting
+  %
+  % Unfortunately, texindex is not prepared to handle braces in the
+  % content at all.  So for index sorting, we map @{ and @} to strings
+  % starting with |, since that ASCII character is between ASCII { and }.
+  \def\{{|a}%
+  \def\lbracechar{|a}%
+  %
+  \def\}{|b}%
+  \def\rbracechar{|b}%
+  %
+  % Non-English letters.
+  \def\AA{AA}%
+  \def\AE{AE}%
+  \def\DH{DZZ}%
+  \def\L{L}%
+  \def\OE{OE}%
+  \def\O{O}%
+  \def\TH{ZZZ}%
+  \def\aa{aa}%
+  \def\ae{ae}%
+  \def\dh{dzz}%
+  \def\exclamdown{!}%
+  \def\l{l}%
+  \def\oe{oe}%
+  \def\ordf{a}%
+  \def\ordm{o}%
+  \def\o{o}%
+  \def\questiondown{?}%
+  \def\ss{ss}%
+  \def\th{zzz}%
+  %
+  \def\LaTeX{LaTeX}%
+  \def\TeX{TeX}%
+  %
+  % Assorted special characters.
+  % (The following {} will end up in the sort string, but that's ok.)
+  \def\arrow{->}%
+  \def\bullet{bullet}%
+  \def\comma{,}%
+  \def\copyright{copyright}%
+  \def\dots{...}%
+  \def\enddots{...}%
+  \def\equiv{==}%
+  \def\error{error}%
+  \def\euro{euro}%
+  \def\expansion{==>}%
+  \def\geq{>=}%
+  \def\guillemetleft{<<}%
+  \def\guillemetright{>>}%
+  \def\guilsinglleft{<}%
+  \def\guilsinglright{>}%
+  \def\leq{<=}%
+  \def\minus{-}%
+  \def\point{.}%
+  \def\pounds{pounds}%
+  \def\print{-|}%
+  \def\quotedblbase{"}%
+  \def\quotedblleft{"}%
+  \def\quotedblright{"}%
+  \def\quoteleft{`}%
+  \def\quoteright{'}%
+  \def\quotesinglbase{,}%
+  \def\registeredsymbol{R}%
+  \def\result{=>}%
+  \def\textdegree{o}%
+  %
+  \expandafter\ifx\csname SETtxiindexlquoteignore\endcsname\relax
+  \else \indexlquoteignore \fi
+  %
+  % We need to get rid of all macros, leaving only the arguments (if present).
+  % Of course this is not nearly correct, but it is the best we can do for now.
+  % makeinfo does not expand macros in the argument to @deffn, which ends up
+  % writing an index entry, and texindex isn't prepared for an index sort entry
+  % that starts with \.
+  %
+  % Since macro invocations are followed by braces, we can just redefine them
+  % to take a single TeX argument.  The case of a macro invocation that
+  % goes to end-of-line is not handled.
+  %
+  \macrolist
+}
+
+% Undocumented (for FSFS 2nd ed.): @set txiindexlquoteignore makes us
+% ignore left quotes in the sort term.
+{\catcode`\`=\active
+ \gdef\indexlquoteignore{\let`=\empty}}
+
+\let\indexbackslash=0  %overridden during \printindex.
+\let\SETmarginindex=\relax % put index entries in margin (undocumented)?
+
+% Most index entries go through here, but \dosubind is the general case.
+% #1 is the index name, #2 is the entry text.
+\def\doind#1#2{\dosubind{#1}{#2}{}}
+
+% Workhorse for all \fooindexes.
+% #1 is name of index, #2 is stuff to put there, #3 is subentry --
+% empty if called from \doind, as we usually are (the main exception
+% is with most defuns, which call us directly).
+%
+\def\dosubind#1#2#3{%
+  \iflinks
+  {%
+    % Store the main index entry text (including the third arg).
+    \toks0 = {#2}%
+    % If third arg is present, precede it with a space.
+    \def\thirdarg{#3}%
+    \ifx\thirdarg\empty \else
+      \toks0 = \expandafter{\the\toks0 \space #3}%
+    \fi
+    %
+    \edef\writeto{\csname#1indfile\endcsname}%
+    %
+    \safewhatsit\dosubindwrite
+  }%
+  \fi
+}
+
+% Write the entry in \toks0 to the index file:
+%
+\def\dosubindwrite{%
+  % Put the index entry in the margin if desired.
+  \ifx\SETmarginindex\relax\else
+    \insert\margin{\hbox{\vrule height8pt depth3pt width0pt \the\toks0}}%
+  \fi
+  %
+  % Remember, we are within a group.
+  \indexdummies % Must do this here, since \bf, etc expand at this stage
+  \def\backslashcurfont{\indexbackslash}% \indexbackslash isn't defined now
+      % so it will be output as is; and it will print as backslash.
+  %
+  % Process the index entry with all font commands turned off, to
+  % get the string to sort by.
+  {\indexnofonts
+   \edef\temp{\the\toks0}% need full expansion
+   \xdef\indexsorttmp{\temp}%
+  }%
+  %
+  % Set up the complete index entry, with both the sort key and
+  % the original text, including any font commands.  We write
+  % three arguments to \entry to the .?? file (four in the
+  % subentry case), texindex reduces to two when writing the .??s
+  % sorted result.
+  \edef\temp{%
+    \write\writeto{%
+      \string\entry{\indexsorttmp}{\noexpand\folio}{\the\toks0}}%
+  }%
+  \temp
+}
+
+% Take care of unwanted page breaks/skips around a whatsit:
+%
+% If a skip is the last thing on the list now, preserve it
+% by backing up by \lastskip, doing the \write, then inserting
+% the skip again.  Otherwise, the whatsit generated by the
+% \write or \pdfdest will make \lastskip zero.  The result is that
+% sequences like this:
+% @end defun
+% @tindex whatever
+% @defun ...
+% will have extra space inserted, because the \medbreak in the
+% start of the @defun won't see the skip inserted by the @end of
+% the previous defun.
+%
+% But don't do any of this if we're not in vertical mode.  We
+% don't want to do a \vskip and prematurely end a paragraph.
+%
+% Avoid page breaks due to these extra skips, too.
+%
+% But wait, there is a catch there:
+% We'll have to check whether \lastskip is zero skip.  \ifdim is not
+% sufficient for this purpose, as it ignores stretch and shrink parts
+% of the skip.  The only way seems to be to check the textual
+% representation of the skip.
+%
+% The following is almost like \def\zeroskipmacro{0.0pt} except that
+% the ``p'' and ``t'' characters have catcode \other, not 11 (letter).
+%
+\edef\zeroskipmacro{\expandafter\the\csname z at skip\endcsname}
+%
+\newskip\whatsitskip
+\newcount\whatsitpenalty
+%
+% ..., ready, GO:
+%
+\def\safewhatsit#1{\ifhmode
+  #1%
+ \else
+  % \lastskip and \lastpenalty cannot both be nonzero simultaneously.
+  \whatsitskip = \lastskip
+  \edef\lastskipmacro{\the\lastskip}%
+  \whatsitpenalty = \lastpenalty
+  %
+  % If \lastskip is nonzero, that means the last item was a
+  % skip.  And since a skip is discardable, that means this
+  % -\whatsitskip glue we're inserting is preceded by a
+  % non-discardable item, therefore it is not a potential
+  % breakpoint, therefore no \nobreak needed.
+  \ifx\lastskipmacro\zeroskipmacro
+  \else
+    \vskip-\whatsitskip
+  \fi
+  %
+  #1%
+  %
+  \ifx\lastskipmacro\zeroskipmacro
+    % If \lastskip was zero, perhaps the last item was a penalty, and
+    % perhaps it was >=10000, e.g., a \nobreak.  In that case, we want
+    % to re-insert the same penalty (values >10000 are used for various
+    % signals); since we just inserted a non-discardable item, any
+    % following glue (such as a \parskip) would be a breakpoint.  For example:
+    %   @deffn deffn-whatever
+    %   @vindex index-whatever
+    %   Description.
+    % would allow a break between the index-whatever whatsit
+    % and the "Description." paragraph.
+    \ifnum\whatsitpenalty>9999 \penalty\whatsitpenalty \fi
+  \else
+    % On the other hand, if we had a nonzero \lastskip,
+    % this make-up glue would be preceded by a non-discardable item
+    % (the whatsit from the \write), so we must insert a \nobreak.
+    \nobreak\vskip\whatsitskip
+  \fi
+\fi}
+
+% The index entry written in the file actually looks like
+%  \entry {sortstring}{page}{topic}
+% or
+%  \entry {sortstring}{page}{topic}{subtopic}
+% The texindex program reads in these files and writes files
+% containing these kinds of lines:
+%  \initial {c}
+%     before the first topic whose initial is c
+%  \entry {topic}{pagelist}
+%     for a topic that is used without subtopics
+%  \primary {topic}
+%     for the beginning of a topic that is used with subtopics
+%  \secondary {subtopic}{pagelist}
+%     for each subtopic.
+
+% Define the user-accessible indexing commands
+% @findex, @vindex, @kindex, @cindex.
+
+\def\findex {\fnindex}
+\def\kindex {\kyindex}
+\def\cindex {\cpindex}
+\def\vindex {\vrindex}
+\def\tindex {\tpindex}
+\def\pindex {\pgindex}
+
+\def\cindexsub {\begingroup\obeylines\cindexsub}
+{\obeylines %
+\gdef\cindexsub "#1" #2^^M{\endgroup %
+\dosubind{cp}{#2}{#1}}}
+
+% Define the macros used in formatting output of the sorted index material.
+
+% @printindex causes a particular index (the ??s file) to get printed.
+% It does not print any chapter heading (usually an @unnumbered).
+%
+\parseargdef\printindex{\begingroup
+  \dobreak \chapheadingskip{10000}%
+  %
+  \smallfonts \rm
+  \tolerance = 9500
+  \plainfrenchspacing
+  \everypar = {}% don't want the \kern\-parindent from indentation suppression.
+  %
+  % See if the index file exists and is nonempty.
+  % Change catcode of @ here so that if the index file contains
+  % \initial {@}
+  % as its first line, TeX doesn't complain about mismatched braces
+  % (because it thinks @} is a control sequence).
+  \catcode`\@ = 11
+  \openin 1 \jobname.#1s
+  \ifeof 1
+    % \enddoublecolumns gets confused if there is no text in the index,
+    % and it loses the chapter title and the aux file entries for the
+    % index.  The easiest way to prevent this problem is to make sure
+    % there is some text.
+    \putwordIndexNonexistent
+  \else
+    %
+    % If the index file exists but is empty, then \openin leaves \ifeof
+    % false.  We have to make TeX try to read something from the file, so
+    % it can discover if there is anything in it.
+    \read 1 to \temp
+    \ifeof 1
+      \putwordIndexIsEmpty
+    \else
+      % Index files are almost Texinfo source, but we use \ as the escape
+      % character.  It would be better to use @, but that's too big a change
+      % to make right now.
+      \def\indexbackslash{\backslashcurfont}%
+      \catcode`\\ = 0
+      \escapechar = `\\
+      \begindoublecolumns
+      \input \jobname.#1s
+      \enddoublecolumns
+    \fi
+  \fi
+  \closein 1
+\endgroup}
+
+% These macros are used by the sorted index file itself.
+% Change them to control the appearance of the index.
+
+\def\initial#1{{%
+  % Some minor font changes for the special characters.
+  \let\tentt=\sectt \let\tt=\sectt \let\sf=\sectt
+  %
+  % Remove any glue we may have, we'll be inserting our own.
+  \removelastskip
+  %
+  % We like breaks before the index initials, so insert a bonus.
+  \nobreak
+  \vskip 0pt plus 3\baselineskip
+  \penalty 0
+  \vskip 0pt plus -3\baselineskip
+  %
+  % Typeset the initial.  Making this add up to a whole number of
+  % baselineskips increases the chance of the dots lining up from column
+  % to column.  It still won't often be perfect, because of the stretch
+  % we need before each entry, but it's better.
+  %
+  % No shrink because it confuses \balancecolumns.
+  \vskip 1.67\baselineskip plus .5\baselineskip
+  \leftline{\secbf #1}%
+  % Do our best not to break after the initial.
+  \nobreak
+  \vskip .33\baselineskip plus .1\baselineskip
+}}
+
+% \entry typesets a paragraph consisting of the text (#1), dot leaders, and
+% then page number (#2) flushed to the right margin.  It is used for index
+% and table of contents entries.  The paragraph is indented by \leftskip.
+%
+% A straightforward implementation would start like this:
+%	\def\entry#1#2{...
+% But this freezes the catcodes in the argument, and can cause problems to
+% @code, which sets - active.  This problem was fixed by a kludge---
+% ``-'' was active throughout whole index, but this isn't really right.
+% The right solution is to prevent \entry from swallowing the whole text.
+%                                 --kasal, 21nov03
+\def\entry{%
+  \begingroup
+    %
+    % Start a new paragraph if necessary, so our assignments below can't
+    % affect previous text.
+    \par
+    %
+    % Do not fill out the last line with white space.
+    \parfillskip = 0in
+    %
+    % No extra space above this paragraph.
+    \parskip = 0in
+    %
+    % Do not prefer a separate line ending with a hyphen to fewer lines.
+    \finalhyphendemerits = 0
+    %
+    % \hangindent is only relevant when the entry text and page number
+    % don't both fit on one line.  In that case, bob suggests starting the
+    % dots pretty far over on the line.  Unfortunately, a large
+    % indentation looks wrong when the entry text itself is broken across
+    % lines.  So we use a small indentation and put up with long leaders.
+    %
+    % \hangafter is reset to 1 (which is the value we want) at the start
+    % of each paragraph, so we need not do anything with that.
+    \hangindent = 2em
+    %
+    % When the entry text needs to be broken, just fill out the first line
+    % with blank space.
+    \rightskip = 0pt plus1fil
+    %
+    % A bit of stretch before each entry for the benefit of balancing
+    % columns.
+    \vskip 0pt plus1pt
+    %
+    % When reading the text of entry, convert explicit line breaks
+    % from @* into spaces.  The user might give these in long section
+    % titles, for instance.
+    \def\*{\unskip\space\ignorespaces}%
+    \def\entrybreak{\hfil\break}%
+    %
+    % Swallow the left brace of the text (first parameter):
+    \afterassignment\doentry
+    \let\temp =
+}
+\def\entrybreak{\unskip\space\ignorespaces}%
+\def\doentry{%
+    \bgroup % Instead of the swallowed brace.
+      \noindent
+      \aftergroup\finishentry
+      % And now comes the text of the entry.
+}
+\def\finishentry#1{%
+    % #1 is the page number.
+    %
+    % The following is kludged to not output a line of dots in the index if
+    % there are no page numbers.  The next person who breaks this will be
+    % cursed by a Unix daemon.
+    \setbox\boxA = \hbox{#1}%
+    \ifdim\wd\boxA = 0pt
+      \ %
+    \else
+      %
+      % If we must, put the page number on a line of its own, and fill out
+      % this line with blank space.  (The \hfil is overwhelmed with the
+      % fill leaders glue in \indexdotfill if the page number does fit.)
+      \hfil\penalty50
+      \null\nobreak\indexdotfill % Have leaders before the page number.
+      %
+      % The `\ ' here is removed by the implicit \unskip that TeX does as
+      % part of (the primitive) \par.  Without it, a spurious underfull
+      % \hbox ensues.
+      \ifpdf
+	\pdfgettoks#1.%
+	\ \the\toksA
+      \else
+	\ #1%
+      \fi
+    \fi
+    \par
+  \endgroup
+}
+
+% Like plain.tex's \dotfill, except uses up at least 1 em.
+\def\indexdotfill{\cleaders
+  \hbox{$\mathsurround=0pt \mkern1.5mu.\mkern1.5mu$}\hskip 1em plus 1fill}
+
+\def\primary #1{\line{#1\hfil}}
+
+\newskip\secondaryindent \secondaryindent=0.5cm
+\def\secondary#1#2{{%
+  \parfillskip=0in
+  \parskip=0in
+  \hangindent=1in
+  \hangafter=1
+  \noindent\hskip\secondaryindent\hbox{#1}\indexdotfill
+  \ifpdf
+    \pdfgettoks#2.\ \the\toksA % The page number ends the paragraph.
+  \else
+    #2
+  \fi
+  \par
+}}
+
+% Define two-column mode, which we use to typeset indexes.
+% Adapted from the TeXbook, page 416, which is to say,
+% the manmac.tex format used to print the TeXbook itself.
+\catcode`\@=11
+
+\newbox\partialpage
+\newdimen\doublecolumnhsize
+
+\def\begindoublecolumns{\begingroup % ended by \enddoublecolumns
+  % Grab any single-column material above us.
+  \output = {%
+    %
+    % Here is a possibility not foreseen in manmac: if we accumulate a
+    % whole lot of material, we might end up calling this \output
+    % routine twice in a row (see the doublecol-lose test, which is
+    % essentially a couple of indexes with @setchapternewpage off).  In
+    % that case we just ship out what is in \partialpage with the normal
+    % output routine.  Generally, \partialpage will be empty when this
+    % runs and this will be a no-op.  See the indexspread.tex test case.
+    \ifvoid\partialpage \else
+      \onepageout{\pagecontents\partialpage}%
+    \fi
+    %
+    \global\setbox\partialpage = \vbox{%
+      % Unvbox the main output page.
+      \unvbox\PAGE
+      \kern-\topskip \kern\baselineskip
+    }%
+  }%
+  \eject % run that output routine to set \partialpage
+  %
+  % Use the double-column output routine for subsequent pages.
+  \output = {\doublecolumnout}%
+  %
+  % Change the page size parameters.  We could do this once outside this
+  % routine, in each of @smallbook, @afourpaper, and the default 8.5x11
+  % format, but then we repeat the same computation.  Repeating a couple
+  % of assignments once per index is clearly meaningless for the
+  % execution time, so we may as well do it in one place.
+  %
+  % First we halve the line length, less a little for the gutter between
+  % the columns.  We compute the gutter based on the line length, so it
+  % changes automatically with the paper format.  The magic constant
+  % below is chosen so that the gutter has the same value (well, +-<1pt)
+  % as it did when we hard-coded it.
+  %
+  % We put the result in a separate register, \doublecolumhsize, so we
+  % can restore it in \pagesofar, after \hsize itself has (potentially)
+  % been clobbered.
+  %
+  \doublecolumnhsize = \hsize
+    \advance\doublecolumnhsize by -.04154\hsize
+    \divide\doublecolumnhsize by 2
+  \hsize = \doublecolumnhsize
+  %
+  % Double the \vsize as well.  (We don't need a separate register here,
+  % since nobody clobbers \vsize.)
+  \vsize = 2\vsize
+}
+
+% The double-column output routine for all double-column pages except
+% the last.
+%
+\def\doublecolumnout{%
+  \splittopskip=\topskip \splitmaxdepth=\maxdepth
+  % Get the available space for the double columns -- the normal
+  % (undoubled) page height minus any material left over from the
+  % previous page.
+  \dimen@ = \vsize
+  \divide\dimen@ by 2
+  \advance\dimen@ by -\ht\partialpage
+  %
+  % box0 will be the left-hand column, box2 the right.
+  \setbox0=\vsplit255 to\dimen@ \setbox2=\vsplit255 to\dimen@
+  \onepageout\pagesofar
+  \unvbox255
+  \penalty\outputpenalty
+}
+%
+% Re-output the contents of the output page -- any previous material,
+% followed by the two boxes we just split, in box0 and box2.
+\def\pagesofar{%
+  \unvbox\partialpage
+  %
+  \hsize = \doublecolumnhsize
+  \wd0=\hsize \wd2=\hsize
+  \hbox to\pagewidth{\box0\hfil\box2}%
+}
+%
+% All done with double columns.
+\def\enddoublecolumns{%
+  % The following penalty ensures that the page builder is exercised
+  % _before_ we change the output routine.  This is necessary in the
+  % following situation:
+  %
+  % The last section of the index consists only of a single entry.
+  % Before this section, \pagetotal is less than \pagegoal, so no
+  % break occurs before the last section starts.  However, the last
+  % section, consisting of \initial and the single \entry, does not
+  % fit on the page and has to be broken off.  Without the following
+  % penalty the page builder will not be exercised until \eject
+  % below, and by that time we'll already have changed the output
+  % routine to the \balancecolumns version, so the next-to-last
+  % double-column page will be processed with \balancecolumns, which
+  % is wrong:  The two columns will go to the main vertical list, with
+  % the broken-off section in the recent contributions.  As soon as
+  % the output routine finishes, TeX starts reconsidering the page
+  % break.  The two columns and the broken-off section both fit on the
+  % page, because the two columns now take up only half of the page
+  % goal.  When TeX sees \eject from below which follows the final
+  % section, it invokes the new output routine that we've set after
+  % \balancecolumns below; \onepageout will try to fit the two columns
+  % and the final section into the vbox of \pageheight (see
+  % \pagebody), causing an overfull box.
+  %
+  % Note that glue won't work here, because glue does not exercise the
+  % page builder, unlike penalties (see The TeXbook, pp. 280-281).
+  \penalty0
+  %
+  \output = {%
+    % Split the last of the double-column material.  Leave it on the
+    % current page, no automatic page break.
+    \balancecolumns
+    %
+    % If we end up splitting too much material for the current page,
+    % though, there will be another page break right after this \output
+    % invocation ends.  Having called \balancecolumns once, we do not
+    % want to call it again.  Therefore, reset \output to its normal
+    % definition right away.  (We hope \balancecolumns will never be
+    % called on to balance too much material, but if it is, this makes
+    % the output somewhat more palatable.)
+    \global\output = {\onepageout{\pagecontents\PAGE}}%
+  }%
+  \eject
+  \endgroup % started in \begindoublecolumns
+  %
+  % \pagegoal was set to the doubled \vsize above, since we restarted
+  % the current page.  We're now back to normal single-column
+  % typesetting, so reset \pagegoal to the normal \vsize (after the
+  % \endgroup where \vsize got restored).
+  \pagegoal = \vsize
+}
+%
+% Called at the end of the double column material.
+\def\balancecolumns{%
+  \setbox0 = \vbox{\unvbox255}% like \box255 but more efficient, see p.120.
+  \dimen@ = \ht0
+  \advance\dimen@ by \topskip
+  \advance\dimen@ by-\baselineskip
+  \divide\dimen@ by 2 % target to split to
+  %debug\message{final 2-column material height=\the\ht0, target=\the\dimen at .}%
+  \splittopskip = \topskip
+  % Loop until we get a decent breakpoint.
+  {%
+    \vbadness = 10000
+    \loop
+      \global\setbox3 = \copy0
+      \global\setbox1 = \vsplit3 to \dimen@
+    \ifdim\ht3>\dimen@
+      \global\advance\dimen@ by 1pt
+    \repeat
+  }%
+  %debug\message{split to \the\dimen@, column heights: \the\ht1, \the\ht3.}%
+  \setbox0=\vbox to\dimen@{\unvbox1}%
+  \setbox2=\vbox to\dimen@{\unvbox3}%
+  %
+  \pagesofar
+}
+\catcode`\@ = \other
+
+
+\message{sectioning,}
+% Chapters, sections, etc.
+
+% Let's start with @part.
+\outer\parseargdef\part{\partzzz{#1}}
+\def\partzzz#1{%
+  \chapoddpage
+  \null
+  \vskip.3\vsize  % move it down on the page a bit
+  \begingroup
+    \noindent \titlefonts\rmisbold #1\par % the text
+    \let\lastnode=\empty      % no node to associate with
+    \writetocentry{part}{#1}{}% but put it in the toc
+    \headingsoff              % no headline or footline on the part page
+    \chapoddpage
+  \endgroup
+}
+
+% \unnumberedno is an oxymoron.  But we count the unnumbered
+% sections so that we can refer to them unambiguously in the pdf
+% outlines by their "section number".  We avoid collisions with chapter
+% numbers by starting them at 10000.  (If a document ever has 10000
+% chapters, we're in trouble anyway, I'm sure.)
+\newcount\unnumberedno \unnumberedno = 10000
+\newcount\chapno
+\newcount\secno        \secno=0
+\newcount\subsecno     \subsecno=0
+\newcount\subsubsecno  \subsubsecno=0
+
+% This counter is funny since it counts through charcodes of letters A, B, ...
+\newcount\appendixno  \appendixno = `\@
+%
+% \def\appendixletter{\char\the\appendixno}
+% We do the following ugly conditional instead of the above simple
+% construct for the sake of pdftex, which needs the actual
+% letter in the expansion, not just typeset.
+%
+\def\appendixletter{%
+  \ifnum\appendixno=`A A%
+  \else\ifnum\appendixno=`B B%
+  \else\ifnum\appendixno=`C C%
+  \else\ifnum\appendixno=`D D%
+  \else\ifnum\appendixno=`E E%
+  \else\ifnum\appendixno=`F F%
+  \else\ifnum\appendixno=`G G%
+  \else\ifnum\appendixno=`H H%
+  \else\ifnum\appendixno=`I I%
+  \else\ifnum\appendixno=`J J%
+  \else\ifnum\appendixno=`K K%
+  \else\ifnum\appendixno=`L L%
+  \else\ifnum\appendixno=`M M%
+  \else\ifnum\appendixno=`N N%
+  \else\ifnum\appendixno=`O O%
+  \else\ifnum\appendixno=`P P%
+  \else\ifnum\appendixno=`Q Q%
+  \else\ifnum\appendixno=`R R%
+  \else\ifnum\appendixno=`S S%
+  \else\ifnum\appendixno=`T T%
+  \else\ifnum\appendixno=`U U%
+  \else\ifnum\appendixno=`V V%
+  \else\ifnum\appendixno=`W W%
+  \else\ifnum\appendixno=`X X%
+  \else\ifnum\appendixno=`Y Y%
+  \else\ifnum\appendixno=`Z Z%
+  % The \the is necessary, despite appearances, because \appendixletter is
+  % expanded while writing the .toc file.  \char\appendixno is not
+  % expandable, thus it is written literally, thus all appendixes come out
+  % with the same letter (or @) in the toc without it.
+  \else\char\the\appendixno
+  \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi
+  \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi}
+
+% Each @chapter defines these (using marks) as the number+name, number
+% and name of the chapter.  Page headings and footings can use
+% these.  @section does likewise.
+\def\thischapter{}
+\def\thischapternum{}
+\def\thischaptername{}
+\def\thissection{}
+\def\thissectionnum{}
+\def\thissectionname{}
+
+\newcount\absseclevel % used to calculate proper heading level
+\newcount\secbase\secbase=0 % @raisesections/@lowersections modify this count
+
+% @raisesections: treat @section as chapter, @subsection as section, etc.
+\def\raisesections{\global\advance\secbase by -1}
+\let\up=\raisesections % original BFox name
+
+% @lowersections: treat @chapter as section, @section as subsection, etc.
+\def\lowersections{\global\advance\secbase by 1}
+\let\down=\lowersections % original BFox name
+
+% we only have subsub.
+\chardef\maxseclevel = 3
+%
+% A numbered section within an unnumbered changes to unnumbered too.
+% To achieve this, remember the "biggest" unnum. sec. we are currently in:
+\chardef\unnlevel = \maxseclevel
+%
+% Trace whether the current chapter is an appendix or not:
+% \chapheadtype is "N" or "A", unnumbered chapters are ignored.
+\def\chapheadtype{N}
+
+% Choose a heading macro
+% #1 is heading type
+% #2 is heading level
+% #3 is text for heading
+\def\genhead#1#2#3{%
+  % Compute the abs. sec. level:
+  \absseclevel=#2
+  \advance\absseclevel by \secbase
+  % Make sure \absseclevel doesn't fall outside the range:
+  \ifnum \absseclevel < 0
+    \absseclevel = 0
+  \else
+    \ifnum \absseclevel > 3
+      \absseclevel = 3
+    \fi
+  \fi
+  % The heading type:
+  \def\headtype{#1}%
+  \if \headtype U%
+    \ifnum \absseclevel < \unnlevel
+      \chardef\unnlevel = \absseclevel
+    \fi
+  \else
+    % Check for appendix sections:
+    \ifnum \absseclevel = 0
+      \edef\chapheadtype{\headtype}%
+    \else
+      \if \headtype A\if \chapheadtype N%
+	\errmessage{@appendix... within a non-appendix chapter}%
+      \fi\fi
+    \fi
+    % Check for numbered within unnumbered:
+    \ifnum \absseclevel > \unnlevel
+      \def\headtype{U}%
+    \else
+      \chardef\unnlevel = 3
+    \fi
+  \fi
+  % Now print the heading:
+  \if \headtype U%
+    \ifcase\absseclevel
+	\unnumberedzzz{#3}%
+    \or \unnumberedseczzz{#3}%
+    \or \unnumberedsubseczzz{#3}%
+    \or \unnumberedsubsubseczzz{#3}%
+    \fi
+  \else
+    \if \headtype A%
+      \ifcase\absseclevel
+	  \appendixzzz{#3}%
+      \or \appendixsectionzzz{#3}%
+      \or \appendixsubseczzz{#3}%
+      \or \appendixsubsubseczzz{#3}%
+      \fi
+    \else
+      \ifcase\absseclevel
+	  \chapterzzz{#3}%
+      \or \seczzz{#3}%
+      \or \numberedsubseczzz{#3}%
+      \or \numberedsubsubseczzz{#3}%
+      \fi
+    \fi
+  \fi
+  \suppressfirstparagraphindent
+}
+
+% an interface:
+\def\numhead{\genhead N}
+\def\apphead{\genhead A}
+\def\unnmhead{\genhead U}
+
+% @chapter, @appendix, @unnumbered.  Increment top-level counter, reset
+% all lower-level sectioning counters to zero.
+%
+% Also set \chaplevelprefix, which we prepend to @float sequence numbers
+% (e.g., figures), q.v.  By default (before any chapter), that is empty.
+\let\chaplevelprefix = \empty
+%
+\outer\parseargdef\chapter{\numhead0{#1}} % normally numhead0 calls chapterzzz
+\def\chapterzzz#1{%
+  % section resetting is \global in case the chapter is in a group, such
+  % as an @include file.
+  \global\secno=0 \global\subsecno=0 \global\subsubsecno=0
+    \global\advance\chapno by 1
+  %
+  % Used for \float.
+  \gdef\chaplevelprefix{\the\chapno.}%
+  \resetallfloatnos
+  %
+  % \putwordChapter can contain complex things in translations.
+  \toks0=\expandafter{\putwordChapter}%
+  \message{\the\toks0 \space \the\chapno}%
+  %
+  % Write the actual heading.
+  \chapmacro{#1}{Ynumbered}{\the\chapno}%
+  %
+  % So @section and the like are numbered underneath this chapter.
+  \global\let\section = \numberedsec
+  \global\let\subsection = \numberedsubsec
+  \global\let\subsubsection = \numberedsubsubsec
+}
+
+\outer\parseargdef\appendix{\apphead0{#1}} % normally calls appendixzzz
+%
+\def\appendixzzz#1{%
+  \global\secno=0 \global\subsecno=0 \global\subsubsecno=0
+    \global\advance\appendixno by 1
+  \gdef\chaplevelprefix{\appendixletter.}%
+  \resetallfloatnos
+  %
+  % \putwordAppendix can contain complex things in translations.
+  \toks0=\expandafter{\putwordAppendix}%
+  \message{\the\toks0 \space \appendixletter}%
+  %
+  \chapmacro{#1}{Yappendix}{\appendixletter}%
+  %
+  \global\let\section = \appendixsec
+  \global\let\subsection = \appendixsubsec
+  \global\let\subsubsection = \appendixsubsubsec
+}
+
+% normally unnmhead0 calls unnumberedzzz:
+\outer\parseargdef\unnumbered{\unnmhead0{#1}}
+\def\unnumberedzzz#1{%
+  \global\secno=0 \global\subsecno=0 \global\subsubsecno=0
+    \global\advance\unnumberedno by 1
+  %
+  % Since an unnumbered has no number, no prefix for figures.
+  \global\let\chaplevelprefix = \empty
+  \resetallfloatnos
+  %
+  % This used to be simply \message{#1}, but TeX fully expands the
+  % argument to \message.  Therefore, if #1 contained @-commands, TeX
+  % expanded them.  For example, in `@unnumbered The @cite{Book}', TeX
+  % expanded @cite (which turns out to cause errors because \cite is meant
+  % to be executed, not expanded).
+  %
+  % Anyway, we don't want the fully-expanded definition of @cite to appear
+  % as a result of the \message, we just want `@cite' itself.  We use
+  % \the<toks register> to achieve this: TeX expands \the<toks> only once,
+  % simply yielding the contents of <toks register>.  (We also do this for
+  % the toc entries.)
+  \toks0 = {#1}%
+  \message{(\the\toks0)}%
+  %
+  \chapmacro{#1}{Ynothing}{\the\unnumberedno}%
+  %
+  \global\let\section = \unnumberedsec
+  \global\let\subsection = \unnumberedsubsec
+  \global\let\subsubsection = \unnumberedsubsubsec
+}
+
+% @centerchap is like @unnumbered, but the heading is centered.
+\outer\parseargdef\centerchap{%
+  % Well, we could do the following in a group, but that would break
+  % an assumption that \chapmacro is called at the outermost level.
+  % Thus we are safer this way:		--kasal, 24feb04
+  \let\centerparametersmaybe = \centerparameters
+  \unnmhead0{#1}%
+  \let\centerparametersmaybe = \relax
+}
+
+% @top is like @unnumbered.
+\let\top\unnumbered
+
+% Sections.
+% 
+\outer\parseargdef\numberedsec{\numhead1{#1}} % normally calls seczzz
+\def\seczzz#1{%
+  \global\subsecno=0 \global\subsubsecno=0  \global\advance\secno by 1
+  \sectionheading{#1}{sec}{Ynumbered}{\the\chapno.\the\secno}%
+}
+
+% normally calls appendixsectionzzz:
+\outer\parseargdef\appendixsection{\apphead1{#1}}
+\def\appendixsectionzzz#1{%
+  \global\subsecno=0 \global\subsubsecno=0  \global\advance\secno by 1
+  \sectionheading{#1}{sec}{Yappendix}{\appendixletter.\the\secno}%
+}
+\let\appendixsec\appendixsection
+
+% normally calls unnumberedseczzz:
+\outer\parseargdef\unnumberedsec{\unnmhead1{#1}}
+\def\unnumberedseczzz#1{%
+  \global\subsecno=0 \global\subsubsecno=0  \global\advance\secno by 1
+  \sectionheading{#1}{sec}{Ynothing}{\the\unnumberedno.\the\secno}%
+}
+
+% Subsections.
+% 
+% normally calls numberedsubseczzz:
+\outer\parseargdef\numberedsubsec{\numhead2{#1}}
+\def\numberedsubseczzz#1{%
+  \global\subsubsecno=0  \global\advance\subsecno by 1
+  \sectionheading{#1}{subsec}{Ynumbered}{\the\chapno.\the\secno.\the\subsecno}%
+}
+
+% normally calls appendixsubseczzz:
+\outer\parseargdef\appendixsubsec{\apphead2{#1}}
+\def\appendixsubseczzz#1{%
+  \global\subsubsecno=0  \global\advance\subsecno by 1
+  \sectionheading{#1}{subsec}{Yappendix}%
+                 {\appendixletter.\the\secno.\the\subsecno}%
+}
+
+% normally calls unnumberedsubseczzz:
+\outer\parseargdef\unnumberedsubsec{\unnmhead2{#1}}
+\def\unnumberedsubseczzz#1{%
+  \global\subsubsecno=0  \global\advance\subsecno by 1
+  \sectionheading{#1}{subsec}{Ynothing}%
+                 {\the\unnumberedno.\the\secno.\the\subsecno}%
+}
+
+% Subsubsections.
+% 
+% normally numberedsubsubseczzz:
+\outer\parseargdef\numberedsubsubsec{\numhead3{#1}}
+\def\numberedsubsubseczzz#1{%
+  \global\advance\subsubsecno by 1
+  \sectionheading{#1}{subsubsec}{Ynumbered}%
+                 {\the\chapno.\the\secno.\the\subsecno.\the\subsubsecno}%
+}
+
+% normally appendixsubsubseczzz:
+\outer\parseargdef\appendixsubsubsec{\apphead3{#1}}
+\def\appendixsubsubseczzz#1{%
+  \global\advance\subsubsecno by 1
+  \sectionheading{#1}{subsubsec}{Yappendix}%
+                 {\appendixletter.\the\secno.\the\subsecno.\the\subsubsecno}%
+}
+
+% normally unnumberedsubsubseczzz:
+\outer\parseargdef\unnumberedsubsubsec{\unnmhead3{#1}}
+\def\unnumberedsubsubseczzz#1{%
+  \global\advance\subsubsecno by 1
+  \sectionheading{#1}{subsubsec}{Ynothing}%
+                 {\the\unnumberedno.\the\secno.\the\subsecno.\the\subsubsecno}%
+}
+
+% These macros control what the section commands do, according
+% to what kind of chapter we are in (ordinary, appendix, or unnumbered).
+% Define them by default for a numbered chapter.
+\let\section = \numberedsec
+\let\subsection = \numberedsubsec
+\let\subsubsection = \numberedsubsubsec
+
+% Define @majorheading, @heading and @subheading
+
+\def\majorheading{%
+  {\advance\chapheadingskip by 10pt \chapbreak }%
+  \parsearg\chapheadingzzz
+}
+
+\def\chapheading{\chapbreak \parsearg\chapheadingzzz}
+\def\chapheadingzzz#1{%
+  \vbox{\chapfonts \raggedtitlesettings #1\par}%
+  \nobreak\bigskip \nobreak
+  \suppressfirstparagraphindent
+}
+
+% @heading, @subheading, @subsubheading.
+\parseargdef\heading{\sectionheading{#1}{sec}{Yomitfromtoc}{}
+  \suppressfirstparagraphindent}
+\parseargdef\subheading{\sectionheading{#1}{subsec}{Yomitfromtoc}{}
+  \suppressfirstparagraphindent}
+\parseargdef\subsubheading{\sectionheading{#1}{subsubsec}{Yomitfromtoc}{}
+  \suppressfirstparagraphindent}
+
+% These macros generate a chapter, section, etc. heading only
+% (including whitespace, linebreaking, etc. around it),
+% given all the information in convenient, parsed form.
+
+% Args are the skip and penalty (usually negative)
+\def\dobreak#1#2{\par\ifdim\lastskip<#1\removelastskip\penalty#2\vskip#1\fi}
+
+% Parameter controlling skip before chapter headings (if needed)
+\newskip\chapheadingskip
+
+% Define plain chapter starts, and page on/off switching for it.
+\def\chapbreak{\dobreak \chapheadingskip {-4000}}
+\def\chappager{\par\vfill\supereject}
+% Because \domark is called before \chapoddpage, the filler page will
+% get the headings for the next chapter, which is wrong.  But we don't
+% care -- we just disable all headings on the filler page.
+\def\chapoddpage{%
+  \chappager
+  \ifodd\pageno \else
+    \begingroup
+      \headingsoff
+      \null
+      \chappager
+    \endgroup
+  \fi
+}
+
+\def\setchapternewpage #1 {\csname CHAPPAG#1\endcsname}
+
+\def\CHAPPAGoff{%
+\global\let\contentsalignmacro = \chappager
+\global\let\pchapsepmacro=\chapbreak
+\global\let\pagealignmacro=\chappager}
+
+\def\CHAPPAGon{%
+\global\let\contentsalignmacro = \chappager
+\global\let\pchapsepmacro=\chappager
+\global\let\pagealignmacro=\chappager
+\global\def\HEADINGSon{\HEADINGSsingle}}
+
+\def\CHAPPAGodd{%
+\global\let\contentsalignmacro = \chapoddpage
+\global\let\pchapsepmacro=\chapoddpage
+\global\let\pagealignmacro=\chapoddpage
+\global\def\HEADINGSon{\HEADINGSdouble}}
+
+\CHAPPAGon
+
+% Chapter opening.
+%
+% #1 is the text, #2 is the section type (Ynumbered, Ynothing,
+% Yappendix, Yomitfromtoc), #3 the chapter number.
+%
+% To test against our argument.
+\def\Ynothingkeyword{Ynothing}
+\def\Yomitfromtockeyword{Yomitfromtoc}
+\def\Yappendixkeyword{Yappendix}
+%
+\def\chapmacro#1#2#3{%
+  % Insert the first mark before the heading break (see notes for \domark).
+  \let\prevchapterdefs=\lastchapterdefs
+  \let\prevsectiondefs=\lastsectiondefs
+  \gdef\lastsectiondefs{\gdef\thissectionname{}\gdef\thissectionnum{}%
+                        \gdef\thissection{}}%
+  %
+  \def\temptype{#2}%
+  \ifx\temptype\Ynothingkeyword
+    \gdef\lastchapterdefs{\gdef\thischaptername{#1}\gdef\thischapternum{}%
+                          \gdef\thischapter{\thischaptername}}%
+  \else\ifx\temptype\Yomitfromtockeyword
+    \gdef\lastchapterdefs{\gdef\thischaptername{#1}\gdef\thischapternum{}%
+                          \gdef\thischapter{}}%
+  \else\ifx\temptype\Yappendixkeyword
+    \toks0={#1}%
+    \xdef\lastchapterdefs{%
+      \gdef\noexpand\thischaptername{\the\toks0}%
+      \gdef\noexpand\thischapternum{\appendixletter}%
+      % \noexpand\putwordAppendix avoids expanding indigestible
+      % commands in some of the translations.
+      \gdef\noexpand\thischapter{\noexpand\putwordAppendix{}
+                                 \noexpand\thischapternum:
+                                 \noexpand\thischaptername}%
+    }%
+  \else
+    \toks0={#1}%
+    \xdef\lastchapterdefs{%
+      \gdef\noexpand\thischaptername{\the\toks0}%
+      \gdef\noexpand\thischapternum{\the\chapno}%
+      % \noexpand\putwordChapter avoids expanding indigestible
+      % commands in some of the translations.
+      \gdef\noexpand\thischapter{\noexpand\putwordChapter{}
+                                 \noexpand\thischapternum:
+                                 \noexpand\thischaptername}%
+    }%
+  \fi\fi\fi
+  %
+  % Output the mark.  Pass it through \safewhatsit, to take care of
+  % the preceding space.
+  \safewhatsit\domark
+  %
+  % Insert the chapter heading break.
+  \pchapsepmacro
+  %
+  % Now the second mark, after the heading break.  No break points
+  % between here and the heading.
+  \let\prevchapterdefs=\lastchapterdefs
+  \let\prevsectiondefs=\lastsectiondefs
+  \domark
+  %
+  {%
+    \chapfonts \rmisbold
+    %
+    % Have to define \lastsection before calling \donoderef, because the
+    % xref code eventually uses it.  On the other hand, it has to be called
+    % after \pchapsepmacro, or the headline will change too soon.
+    \gdef\lastsection{#1}%
+    %
+    % Only insert the separating space if we have a chapter/appendix
+    % number, and don't print the unnumbered ``number''.
+    \ifx\temptype\Ynothingkeyword
+      \setbox0 = \hbox{}%
+      \def\toctype{unnchap}%
+    \else\ifx\temptype\Yomitfromtockeyword
+      \setbox0 = \hbox{}% contents like unnumbered, but no toc entry
+      \def\toctype{omit}%
+    \else\ifx\temptype\Yappendixkeyword
+      \setbox0 = \hbox{\putwordAppendix{} #3\enspace}%
+      \def\toctype{app}%
+    \else
+      \setbox0 = \hbox{#3\enspace}%
+      \def\toctype{numchap}%
+    \fi\fi\fi
+    %
+    % Write the toc entry for this chapter.  Must come before the
+    % \donoderef, because we include the current node name in the toc
+    % entry, and \donoderef resets it to empty.
+    \writetocentry{\toctype}{#1}{#3}%
+    %
+    % For pdftex, we have to write out the node definition (aka, make
+    % the pdfdest) after any page break, but before the actual text has
+    % been typeset.  If the destination for the pdf outline is after the
+    % text, then jumping from the outline may wind up with the text not
+    % being visible, for instance under high magnification.
+    \donoderef{#2}%
+    %
+    % Typeset the actual heading.
+    \nobreak % Avoid page breaks at the interline glue.
+    \vbox{\raggedtitlesettings \hangindent=\wd0 \centerparametersmaybe
+          \unhbox0 #1\par}%
+  }%
+  \nobreak\bigskip % no page break after a chapter title
+  \nobreak
+}
+
+% @centerchap -- centered and unnumbered.
+\let\centerparametersmaybe = \relax
+\def\centerparameters{%
+  \advance\rightskip by 3\rightskip
+  \leftskip = \rightskip
+  \parfillskip = 0pt
+}
+
+
+% I don't think this chapter style is supported any more, so I'm not
+% updating it with the new noderef stuff.  We'll see.  --karl, 11aug03.
+%
+\def\setchapterstyle #1 {\csname CHAPF#1\endcsname}
+%
+\def\unnchfopen #1{%
+  \chapoddpage
+  \vbox{\chapfonts \raggedtitlesettings #1\par}%
+  \nobreak\bigskip\nobreak
+}
+\def\chfopen #1#2{\chapoddpage {\chapfonts
+\vbox to 3in{\vfil \hbox to\hsize{\hfil #2} \hbox to\hsize{\hfil #1} \vfil}}%
+\par\penalty 5000 %
+}
+\def\centerchfopen #1{%
+  \chapoddpage
+  \vbox{\chapfonts \raggedtitlesettings \hfill #1\hfill}%
+  \nobreak\bigskip \nobreak
+}
+\def\CHAPFopen{%
+  \global\let\chapmacro=\chfopen
+  \global\let\centerchapmacro=\centerchfopen}
+
+
+% Section titles.  These macros combine the section number parts and
+% call the generic \sectionheading to do the printing.
+%
+\newskip\secheadingskip
+\def\secheadingbreak{\dobreak \secheadingskip{-1000}}
+
+% Subsection titles.
+\newskip\subsecheadingskip
+\def\subsecheadingbreak{\dobreak \subsecheadingskip{-500}}
+
+% Subsubsection titles.
+\def\subsubsecheadingskip{\subsecheadingskip}
+\def\subsubsecheadingbreak{\subsecheadingbreak}
+
+
+% Print any size, any type, section title.
+%
+% #1 is the text, #2 is the section level (sec/subsec/subsubsec), #3 is
+% the section type for xrefs (Ynumbered, Ynothing, Yappendix), #4 is the
+% section number.
+%
+\def\seckeyword{sec}
+%
+\def\sectionheading#1#2#3#4{%
+  {%
+    \checkenv{}% should not be in an environment.
+    %
+    % Switch to the right set of fonts.
+    \csname #2fonts\endcsname \rmisbold
+    %
+    \def\sectionlevel{#2}%
+    \def\temptype{#3}%
+    %
+    % Insert first mark before the heading break (see notes for \domark).
+    \let\prevsectiondefs=\lastsectiondefs
+    \ifx\temptype\Ynothingkeyword
+      \ifx\sectionlevel\seckeyword
+        \gdef\lastsectiondefs{\gdef\thissectionname{#1}\gdef\thissectionnum{}%
+                              \gdef\thissection{\thissectionname}}%
+      \fi
+    \else\ifx\temptype\Yomitfromtockeyword
+      % Don't redefine \thissection.
+    \else\ifx\temptype\Yappendixkeyword
+      \ifx\sectionlevel\seckeyword
+        \toks0={#1}%
+        \xdef\lastsectiondefs{%
+          \gdef\noexpand\thissectionname{\the\toks0}%
+          \gdef\noexpand\thissectionnum{#4}%
+          % \noexpand\putwordSection avoids expanding indigestible
+          % commands in some of the translations.
+          \gdef\noexpand\thissection{\noexpand\putwordSection{}
+                                     \noexpand\thissectionnum:
+                                     \noexpand\thissectionname}%
+        }%
+      \fi
+    \else
+      \ifx\sectionlevel\seckeyword
+        \toks0={#1}%
+        \xdef\lastsectiondefs{%
+          \gdef\noexpand\thissectionname{\the\toks0}%
+          \gdef\noexpand\thissectionnum{#4}%
+          % \noexpand\putwordSection avoids expanding indigestible
+          % commands in some of the translations.
+          \gdef\noexpand\thissection{\noexpand\putwordSection{}
+                                     \noexpand\thissectionnum:
+                                     \noexpand\thissectionname}%
+        }%
+      \fi
+    \fi\fi\fi
+    %
+    % Go into vertical mode.  Usually we'll already be there, but we
+    % don't want the following whatsit to end up in a preceding paragraph
+    % if the document didn't happen to have a blank line.
+    \par
+    %
+    % Output the mark.  Pass it through \safewhatsit, to take care of
+    % the preceding space.
+    \safewhatsit\domark
+    %
+    % Insert space above the heading.
+    \csname #2headingbreak\endcsname
+    %
+    % Now the second mark, after the heading break.  No break points
+    % between here and the heading.
+    \let\prevsectiondefs=\lastsectiondefs
+    \domark
+    %
+    % Only insert the space after the number if we have a section number.
+    \ifx\temptype\Ynothingkeyword
+      \setbox0 = \hbox{}%
+      \def\toctype{unn}%
+      \gdef\lastsection{#1}%
+    \else\ifx\temptype\Yomitfromtockeyword
+      % for @headings -- no section number, don't include in toc,
+      % and don't redefine \lastsection.
+      \setbox0 = \hbox{}%
+      \def\toctype{omit}%
+      \let\sectionlevel=\empty
+    \else\ifx\temptype\Yappendixkeyword
+      \setbox0 = \hbox{#4\enspace}%
+      \def\toctype{app}%
+      \gdef\lastsection{#1}%
+    \else
+      \setbox0 = \hbox{#4\enspace}%
+      \def\toctype{num}%
+      \gdef\lastsection{#1}%
+    \fi\fi\fi
+    %
+    % Write the toc entry (before \donoderef).  See comments in \chapmacro.
+    \writetocentry{\toctype\sectionlevel}{#1}{#4}%
+    %
+    % Write the node reference (= pdf destination for pdftex).
+    % Again, see comments in \chapmacro.
+    \donoderef{#3}%
+    %
+    % Interline glue will be inserted when the vbox is completed.
+    % That glue will be a valid breakpoint for the page, since it'll be
+    % preceded by a whatsit (usually from the \donoderef, or from the
+    % \writetocentry if there was no node).  We don't want to allow that
+    % break, since then the whatsits could end up on page n while the
+    % section is on page n+1, thus toc/etc. are wrong.  Debian bug 276000.
+    \nobreak
+    %
+    % Output the actual section heading.
+    \vbox{\hyphenpenalty=10000 \tolerance=5000 \parindent=0pt \ptexraggedright
+          \hangindent=\wd0  % zero if no section number
+          \unhbox0 #1}%
+  }%
+  % Add extra space after the heading -- half of whatever came above it.
+  % Don't allow stretch, though.
+  \kern .5 \csname #2headingskip\endcsname
+  %
+  % Do not let the kern be a potential breakpoint, as it would be if it
+  % was followed by glue.
+  \nobreak
+  %
+  % We'll almost certainly start a paragraph next, so don't let that
+  % glue accumulate.  (Not a breakpoint because it's preceded by a
+  % discardable item.)  However, when a paragraph is not started next
+  % (\startdefun, \cartouche, \center, etc.), this needs to be wiped out
+  % or the negative glue will cause weirdly wrong output, typically
+  % obscuring the section heading with something else.
+  \vskip-\parskip
+  %
+  % This is so the last item on the main vertical list is a known
+  % \penalty > 10000, so \startdefun, etc., can recognize the situation
+  % and do the needful.
+  \penalty 10001
+}
+
+
+\message{toc,}
+% Table of contents.
+\newwrite\tocfile
+
+% Write an entry to the toc file, opening it if necessary.
+% Called from @chapter, etc.
+%
+% Example usage: \writetocentry{sec}{Section Name}{\the\chapno.\the\secno}
+% We append the current node name (if any) and page number as additional
+% arguments for the \{chap,sec,...}entry macros which will eventually
+% read this.  The node name is used in the pdf outlines as the
+% destination to jump to.
+%
+% We open the .toc file for writing here instead of at @setfilename (or
+% any other fixed time) so that @contents can be anywhere in the document.
+% But if #1 is `omit', then we don't do anything.  This is used for the
+% table of contents chapter openings themselves.
+%
+\newif\iftocfileopened
+\def\omitkeyword{omit}%
+%
+\def\writetocentry#1#2#3{%
+  \edef\writetoctype{#1}%
+  \ifx\writetoctype\omitkeyword \else
+    \iftocfileopened\else
+      \immediate\openout\tocfile = \jobname.toc
+      \global\tocfileopenedtrue
+    \fi
+    %
+    \iflinks
+      {\atdummies
+       \edef\temp{%
+         \write\tocfile{@#1entry{#2}{#3}{\lastnode}{\noexpand\folio}}}%
+       \temp
+      }%
+    \fi
+  \fi
+  %
+  % Tell \shipout to create a pdf destination on each page, if we're
+  % writing pdf.  These are used in the table of contents.  We can't
+  % just write one on every page because the title pages are numbered
+  % 1 and 2 (the page numbers aren't printed), and so are the first
+  % two pages of the document.  Thus, we'd have two destinations named
+  % `1', and two named `2'.
+  \ifpdf \global\pdfmakepagedesttrue \fi
+}
+
+
+% These characters do not print properly in the Computer Modern roman
+% fonts, so we must take special care.  This is more or less redundant
+% with the Texinfo input format setup at the end of this file.
+%
+\def\activecatcodes{%
+  \catcode`\"=\active
+  \catcode`\$=\active
+  \catcode`\<=\active
+  \catcode`\>=\active
+  \catcode`\\=\active
+  \catcode`\^=\active
+  \catcode`\_=\active
+  \catcode`\|=\active
+  \catcode`\~=\active
+}
+
+
+% Read the toc file, which is essentially Texinfo input.
+\def\readtocfile{%
+  \setupdatafile
+  \activecatcodes
+  \input \tocreadfilename
+}
+
+\newskip\contentsrightmargin \contentsrightmargin=1in
+\newcount\savepageno
+\newcount\lastnegativepageno \lastnegativepageno = -1
+
+% Prepare to read what we've written to \tocfile.
+%
+\def\startcontents#1{%
+  % If @setchapternewpage on, and @headings double, the contents should
+  % start on an odd page, unlike chapters.  Thus, we maintain
+  % \contentsalignmacro in parallel with \pagealignmacro.
+  % From: Torbjorn Granlund <tege at matematik.su.se>
+  \contentsalignmacro
+  \immediate\closeout\tocfile
+  %
+  % Don't need to put `Contents' or `Short Contents' in the headline.
+  % It is abundantly clear what they are.
+  \chapmacro{#1}{Yomitfromtoc}{}%
+  %
+  \savepageno = \pageno
+  \begingroup                  % Set up to handle contents files properly.
+    \raggedbottom              % Worry more about breakpoints than the bottom.
+    \advance\hsize by -\contentsrightmargin % Don't use the full line length.
+    %
+    % Roman numerals for page numbers.
+    \ifnum \pageno>0 \global\pageno = \lastnegativepageno \fi
+}
+
+% redefined for the two-volume lispref.  We always output on
+% \jobname.toc even if this is redefined.
+%
+\def\tocreadfilename{\jobname.toc}
+
+% Normal (long) toc.
+%
+\def\contents{%
+  \startcontents{\putwordTOC}%
+    \openin 1 \tocreadfilename\space
+    \ifeof 1 \else
+      \readtocfile
+    \fi
+    \vfill \eject
+    \contentsalignmacro % in case @setchapternewpage odd is in effect
+    \ifeof 1 \else
+      \pdfmakeoutlines
+    \fi
+    \closein 1
+  \endgroup
+  \lastnegativepageno = \pageno
+  \global\pageno = \savepageno
+}
+
+% And just the chapters.
+\def\summarycontents{%
+  \startcontents{\putwordShortTOC}%
+    %
+    \let\partentry = \shortpartentry
+    \let\numchapentry = \shortchapentry
+    \let\appentry = \shortchapentry
+    \let\unnchapentry = \shortunnchapentry
+    % We want a true roman here for the page numbers.
+    \secfonts
+    \let\rm=\shortcontrm \let\bf=\shortcontbf
+    \let\sl=\shortcontsl \let\tt=\shortconttt
+    \rm
+    \hyphenpenalty = 10000
+    \advance\baselineskip by 1pt % Open it up a little.
+    \def\numsecentry##1##2##3##4{}
+    \let\appsecentry = \numsecentry
+    \let\unnsecentry = \numsecentry
+    \let\numsubsecentry = \numsecentry
+    \let\appsubsecentry = \numsecentry
+    \let\unnsubsecentry = \numsecentry
+    \let\numsubsubsecentry = \numsecentry
+    \let\appsubsubsecentry = \numsecentry
+    \let\unnsubsubsecentry = \numsecentry
+    \openin 1 \tocreadfilename\space
+    \ifeof 1 \else
+      \readtocfile
+    \fi
+    \closein 1
+    \vfill \eject
+    \contentsalignmacro % in case @setchapternewpage odd is in effect
+  \endgroup
+  \lastnegativepageno = \pageno
+  \global\pageno = \savepageno
+}
+\let\shortcontents = \summarycontents
+
+% Typeset the label for a chapter or appendix for the short contents.
+% The arg is, e.g., `A' for an appendix, or `3' for a chapter.
+%
+\def\shortchaplabel#1{%
+  % This space should be enough, since a single number is .5em, and the
+  % widest letter (M) is 1em, at least in the Computer Modern fonts.
+  % But use \hss just in case.
+  % (This space doesn't include the extra space that gets added after
+  % the label; that gets put in by \shortchapentry above.)
+  %
+  % We'd like to right-justify chapter numbers, but that looks strange
+  % with appendix letters.  And right-justifying numbers and
+  % left-justifying letters looks strange when there is less than 10
+  % chapters.  Have to read the whole toc once to know how many chapters
+  % there are before deciding ...
+  \hbox to 1em{#1\hss}%
+}
+
+% These macros generate individual entries in the table of contents.
+% The first argument is the chapter or section name.
+% The last argument is the page number.
+% The arguments in between are the chapter number, section number, ...
+
+% Parts, in the main contents.  Replace the part number, which doesn't
+% exist, with an empty box.  Let's hope all the numbers have the same width.
+% Also ignore the page number, which is conventionally not printed.
+\def\numeralbox{\setbox0=\hbox{8}\hbox to \wd0{\hfil}}
+\def\partentry#1#2#3#4{\dochapentry{\numeralbox\labelspace#1}{}}
+%
+% Parts, in the short toc.
+\def\shortpartentry#1#2#3#4{%
+  \penalty-300
+  \vskip.5\baselineskip plus.15\baselineskip minus.1\baselineskip
+  \shortchapentry{{\bf #1}}{\numeralbox}{}{}%
+}
+
+% Chapters, in the main contents.
+\def\numchapentry#1#2#3#4{\dochapentry{#2\labelspace#1}{#4}}
+%
+% Chapters, in the short toc.
+% See comments in \dochapentry re vbox and related settings.
+\def\shortchapentry#1#2#3#4{%
+  \tocentry{\shortchaplabel{#2}\labelspace #1}{\doshortpageno\bgroup#4\egroup}%
+}
+
+% Appendices, in the main contents.
+% Need the word Appendix, and a fixed-size box.
+%
+\def\appendixbox#1{%
+  % We use M since it's probably the widest letter.
+  \setbox0 = \hbox{\putwordAppendix{} M}%
+  \hbox to \wd0{\putwordAppendix{} #1\hss}}
+%
+\def\appentry#1#2#3#4{\dochapentry{\appendixbox{#2}\labelspace#1}{#4}}
+
+% Unnumbered chapters.
+\def\unnchapentry#1#2#3#4{\dochapentry{#1}{#4}}
+\def\shortunnchapentry#1#2#3#4{\tocentry{#1}{\doshortpageno\bgroup#4\egroup}}
+
+% Sections.
+\def\numsecentry#1#2#3#4{\dosecentry{#2\labelspace#1}{#4}}
+\let\appsecentry=\numsecentry
+\def\unnsecentry#1#2#3#4{\dosecentry{#1}{#4}}
+
+% Subsections.
+\def\numsubsecentry#1#2#3#4{\dosubsecentry{#2\labelspace#1}{#4}}
+\let\appsubsecentry=\numsubsecentry
+\def\unnsubsecentry#1#2#3#4{\dosubsecentry{#1}{#4}}
+
+% And subsubsections.
+\def\numsubsubsecentry#1#2#3#4{\dosubsubsecentry{#2\labelspace#1}{#4}}
+\let\appsubsubsecentry=\numsubsubsecentry
+\def\unnsubsubsecentry#1#2#3#4{\dosubsubsecentry{#1}{#4}}
+
+% This parameter controls the indentation of the various levels.
+% Same as \defaultparindent.
+\newdimen\tocindent \tocindent = 15pt
+
+% Now for the actual typesetting. In all these, #1 is the text and #2 is the
+% page number.
+%
+% If the toc has to be broken over pages, we want it to be at chapters
+% if at all possible; hence the \penalty.
+\def\dochapentry#1#2{%
+   \penalty-300 \vskip1\baselineskip plus.33\baselineskip minus.25\baselineskip
+   \begingroup
+     \chapentryfonts
+     \tocentry{#1}{\dopageno\bgroup#2\egroup}%
+   \endgroup
+   \nobreak\vskip .25\baselineskip plus.1\baselineskip
+}
+
+\def\dosecentry#1#2{\begingroup
+  \secentryfonts \leftskip=\tocindent
+  \tocentry{#1}{\dopageno\bgroup#2\egroup}%
+\endgroup}
+
+\def\dosubsecentry#1#2{\begingroup
+  \subsecentryfonts \leftskip=2\tocindent
+  \tocentry{#1}{\dopageno\bgroup#2\egroup}%
+\endgroup}
+
+\def\dosubsubsecentry#1#2{\begingroup
+  \subsubsecentryfonts \leftskip=3\tocindent
+  \tocentry{#1}{\dopageno\bgroup#2\egroup}%
+\endgroup}
+
+% We use the same \entry macro as for the index entries.
+\let\tocentry = \entry
+
+% Space between chapter (or whatever) number and the title.
+\def\labelspace{\hskip1em \relax}
+
+\def\dopageno#1{{\rm #1}}
+\def\doshortpageno#1{{\rm #1}}
+
+\def\chapentryfonts{\secfonts \rm}
+\def\secentryfonts{\textfonts}
+\def\subsecentryfonts{\textfonts}
+\def\subsubsecentryfonts{\textfonts}
+
+
+\message{environments,}
+% @foo ... @end foo.
+
+% @tex ... @end tex    escapes into raw TeX temporarily.
+% One exception: @ is still an escape character, so that @end tex works.
+% But \@ or @@ will get a plain @ character.
+
+\envdef\tex{%
+  \setupmarkupstyle{tex}%
+  \catcode `\\=0 \catcode `\{=1 \catcode `\}=2
+  \catcode `\$=3 \catcode `\&=4 \catcode `\#=6
+  \catcode `\^=7 \catcode `\_=8 \catcode `\~=\active \let~=\tie
+  \catcode `\%=14
+  \catcode `\+=\other
+  \catcode `\"=\other
+  \catcode `\|=\other
+  \catcode `\<=\other
+  \catcode `\>=\other
+  \catcode`\`=\other
+  \catcode`\'=\other
+  \escapechar=`\\
+  %
+  % ' is active in math mode (mathcode"8000).  So reset it, and all our
+  % other math active characters (just in case), to plain's definitions.
+  \mathactive
+  %
+  \let\b=\ptexb
+  \let\bullet=\ptexbullet
+  \let\c=\ptexc
+  \let\,=\ptexcomma
+  \let\.=\ptexdot
+  \let\dots=\ptexdots
+  \let\equiv=\ptexequiv
+  \let\!=\ptexexclam
+  \let\i=\ptexi
+  \let\indent=\ptexindent
+  \let\noindent=\ptexnoindent
+  \let\{=\ptexlbrace
+  \let\+=\tabalign
+  \let\}=\ptexrbrace
+  \let\/=\ptexslash
+  \let\*=\ptexstar
+  \let\t=\ptext
+  \expandafter \let\csname top\endcsname=\ptextop  % outer
+  \let\frenchspacing=\plainfrenchspacing
+  %
+  \def\endldots{\mathinner{\ldots\ldots\ldots\ldots}}%
+  \def\enddots{\relax\ifmmode\endldots\else$\mathsurround=0pt \endldots\,$\fi}%
+  \def\@{@}%
+}
+% There is no need to define \Etex.
+
+% Define @lisp ... @end lisp.
+% @lisp environment forms a group so it can rebind things,
+% including the definition of @end lisp (which normally is erroneous).
+
+% Amount to narrow the margins by for @lisp.
+\newskip\lispnarrowing \lispnarrowing=0.4in
+
+% This is the definition that ^^M gets inside @lisp, @example, and other
+% such environments.  \null is better than a space, since it doesn't
+% have any width.
+\def\lisppar{\null\endgraf}
+
+% This space is always present above and below environments.
+\newskip\envskipamount \envskipamount = 0pt
+
+% Make spacing and below environment symmetrical.  We use \parskip here
+% to help in doing that, since in @example-like environments \parskip
+% is reset to zero; thus the \afterenvbreak inserts no space -- but the
+% start of the next paragraph will insert \parskip.
+%
+\def\aboveenvbreak{{%
+  % =10000 instead of <10000 because of a special case in \itemzzz and
+  % \sectionheading, q.v.
+  \ifnum \lastpenalty=10000 \else
+    \advance\envskipamount by \parskip
+    \endgraf
+    \ifdim\lastskip<\envskipamount
+      \removelastskip
+      % it's not a good place to break if the last penalty was \nobreak
+      % or better ...
+      \ifnum\lastpenalty<10000 \penalty-50 \fi
+      \vskip\envskipamount
+    \fi
+  \fi
+}}
+
+\let\afterenvbreak = \aboveenvbreak
+
+% \nonarrowing is a flag.  If "set", @lisp etc don't narrow margins; it will
+% also clear it, so that its embedded environments do the narrowing again.
+\let\nonarrowing=\relax
+
+% @cartouche ... @end cartouche: draw rectangle w/rounded corners around
+% environment contents.
+\font\circle=lcircle10
+\newdimen\circthick
+\newdimen\cartouter\newdimen\cartinner
+\newskip\normbskip\newskip\normpskip\newskip\normlskip
+\circthick=\fontdimen8\circle
+%
+\def\ctl{{\circle\char'013\hskip -6pt}}% 6pt from pl file: 1/2charwidth
+\def\ctr{{\hskip 6pt\circle\char'010}}
+\def\cbl{{\circle\char'012\hskip -6pt}}
+\def\cbr{{\hskip 6pt\circle\char'011}}
+\def\carttop{\hbox to \cartouter{\hskip\lskip
+        \ctl\leaders\hrule height\circthick\hfil\ctr
+        \hskip\rskip}}
+\def\cartbot{\hbox to \cartouter{\hskip\lskip
+        \cbl\leaders\hrule height\circthick\hfil\cbr
+        \hskip\rskip}}
+%
+\newskip\lskip\newskip\rskip
+
+\envdef\cartouche{%
+  \ifhmode\par\fi  % can't be in the midst of a paragraph.
+  \startsavinginserts
+  \lskip=\leftskip \rskip=\rightskip
+  \leftskip=0pt\rightskip=0pt % we want these *outside*.
+  \cartinner=\hsize \advance\cartinner by-\lskip
+  \advance\cartinner by-\rskip
+  \cartouter=\hsize
+  \advance\cartouter by 18.4pt	% allow for 3pt kerns on either
+				% side, and for 6pt waste from
+				% each corner char, and rule thickness
+  \normbskip=\baselineskip \normpskip=\parskip \normlskip=\lineskip
+  % Flag to tell @lisp, etc., not to narrow margin.
+  \let\nonarrowing = t%
+  %
+  % If this cartouche directly follows a sectioning command, we need the
+  % \parskip glue (backspaced over by default) or the cartouche can
+  % collide with the section heading.
+  \ifnum\lastpenalty>10000 \vskip\parskip \penalty\lastpenalty \fi
+  %
+  \vbox\bgroup
+      \baselineskip=0pt\parskip=0pt\lineskip=0pt
+      \carttop
+      \hbox\bgroup
+	  \hskip\lskip
+	  \vrule\kern3pt
+	  \vbox\bgroup
+	      \kern3pt
+	      \hsize=\cartinner
+	      \baselineskip=\normbskip
+	      \lineskip=\normlskip
+	      \parskip=\normpskip
+	      \vskip -\parskip
+	      \comment % For explanation, see the end of def\group.
+}
+\def\Ecartouche{%
+              \ifhmode\par\fi
+	      \kern3pt
+	  \egroup
+	  \kern3pt\vrule
+	  \hskip\rskip
+      \egroup
+      \cartbot
+  \egroup
+  \checkinserts
+}
+
+
+% This macro is called at the beginning of all the @example variants,
+% inside a group.
+\newdimen\nonfillparindent
+\def\nonfillstart{%
+  \aboveenvbreak
+  \hfuzz = 12pt % Don't be fussy
+  \sepspaces % Make spaces be word-separators rather than space tokens.
+  \let\par = \lisppar % don't ignore blank lines
+  \obeylines % each line of input is a line of output
+  \parskip = 0pt
+  % Turn off paragraph indentation but redefine \indent to emulate
+  % the normal \indent.
+  \nonfillparindent=\parindent
+  \parindent = 0pt
+  \let\indent\nonfillindent
+  %
+  \emergencystretch = 0pt % don't try to avoid overfull boxes
+  \ifx\nonarrowing\relax
+    \advance \leftskip by \lispnarrowing
+    \exdentamount=\lispnarrowing
+  \else
+    \let\nonarrowing = \relax
+  \fi
+  \let\exdent=\nofillexdent
+}
+
+\begingroup
+\obeyspaces
+% We want to swallow spaces (but not other tokens) after the fake
+% @indent in our nonfill-environments, where spaces are normally
+% active and set to @tie, resulting in them not being ignored after
+% @indent.
+\gdef\nonfillindent{\futurelet\temp\nonfillindentcheck}%
+\gdef\nonfillindentcheck{%
+\ifx\temp %
+\expandafter\nonfillindentgobble%
+\else%
+\leavevmode\nonfillindentbox%
+\fi%
+}%
+\endgroup
+\def\nonfillindentgobble#1{\nonfillindent}
+\def\nonfillindentbox{\hbox to \nonfillparindent{\hss}}
+
+% If you want all examples etc. small: @set dispenvsize small.
+% If you want even small examples the full size: @set dispenvsize nosmall.
+% This affects the following displayed environments:
+%    @example, @display, @format, @lisp
+%
+\def\smallword{small}
+\def\nosmallword{nosmall}
+\let\SETdispenvsize\relax
+\def\setnormaldispenv{%
+  \ifx\SETdispenvsize\smallword
+    % end paragraph for sake of leading, in case document has no blank
+    % line.  This is redundant with what happens in \aboveenvbreak, but
+    % we need to do it before changing the fonts, and it's inconvenient
+    % to change the fonts afterward.
+    \ifnum \lastpenalty=10000 \else \endgraf \fi
+    \smallexamplefonts \rm
+  \fi
+}
+\def\setsmalldispenv{%
+  \ifx\SETdispenvsize\nosmallword
+  \else
+    \ifnum \lastpenalty=10000 \else \endgraf \fi
+    \smallexamplefonts \rm
+  \fi
+}
+
+% We often define two environments, @foo and @smallfoo.
+% Let's do it in one command.  #1 is the env name, #2 the definition.
+\def\makedispenvdef#1#2{%
+  \expandafter\envdef\csname#1\endcsname {\setnormaldispenv #2}%
+  \expandafter\envdef\csname small#1\endcsname {\setsmalldispenv #2}%
+  \expandafter\let\csname E#1\endcsname \afterenvbreak
+  \expandafter\let\csname Esmall#1\endcsname \afterenvbreak
+}
+
+% Define two environment synonyms (#1 and #2) for an environment.
+\def\maketwodispenvdef#1#2#3{%
+  \makedispenvdef{#1}{#3}%
+  \makedispenvdef{#2}{#3}%
+}
+%
+% @lisp: indented, narrowed, typewriter font;
+% @example: same as @lisp.
+%
+% @smallexample and @smalllisp: use smaller fonts.
+% Originally contributed by Pavel at xerox.
+%
+\maketwodispenvdef{lisp}{example}{%
+  \nonfillstart
+  \tt\setupmarkupstyle{example}%
+  \let\kbdfont = \kbdexamplefont % Allow @kbd to do something special.
+  \gobble % eat return
+}
+% @display/@smalldisplay: same as @lisp except keep current font.
+%
+\makedispenvdef{display}{%
+  \nonfillstart
+  \gobble
+}
+
+% @format/@smallformat: same as @display except don't narrow margins.
+%
+\makedispenvdef{format}{%
+  \let\nonarrowing = t%
+  \nonfillstart
+  \gobble
+}
+
+% @flushleft: same as @format, but doesn't obey \SETdispenvsize.
+\envdef\flushleft{%
+  \let\nonarrowing = t%
+  \nonfillstart
+  \gobble
+}
+\let\Eflushleft = \afterenvbreak
+
+% @flushright.
+%
+\envdef\flushright{%
+  \let\nonarrowing = t%
+  \nonfillstart
+  \advance\leftskip by 0pt plus 1fill\relax
+  \gobble
+}
+\let\Eflushright = \afterenvbreak
+
+
+% @raggedright does more-or-less normal line breaking but no right
+% justification.  From plain.tex.
+\envdef\raggedright{%
+  \rightskip0pt plus2em \spaceskip.3333em \xspaceskip.5em\relax
+}
+\let\Eraggedright\par
+
+\envdef\raggedleft{%
+  \parindent=0pt \leftskip0pt plus2em
+  \spaceskip.3333em \xspaceskip.5em \parfillskip=0pt
+  \hbadness=10000 % Last line will usually be underfull, so turn off
+                  % badness reporting.
+}
+\let\Eraggedleft\par
+
+\envdef\raggedcenter{%
+  \parindent=0pt \rightskip0pt plus1em \leftskip0pt plus1em
+  \spaceskip.3333em \xspaceskip.5em \parfillskip=0pt
+  \hbadness=10000 % Last line will usually be underfull, so turn off
+                  % badness reporting.
+}
+\let\Eraggedcenter\par
+
+
+% @quotation does normal linebreaking (hence we can't use \nonfillstart)
+% and narrows the margins.  We keep \parskip nonzero in general, since
+% we're doing normal filling.  So, when using \aboveenvbreak and
+% \afterenvbreak, temporarily make \parskip 0.
+%
+\makedispenvdef{quotation}{\quotationstart}
+%
+\def\quotationstart{%
+  \indentedblockstart % same as \indentedblock, but increase right margin too.
+  \ifx\nonarrowing\relax
+    \advance\rightskip by \lispnarrowing
+  \fi
+  \parsearg\quotationlabel
+}
+
+% We have retained a nonzero parskip for the environment, since we're
+% doing normal filling.
+%
+\def\Equotation{%
+  \par
+  \ifx\quotationauthor\thisisundefined\else
+    % indent a bit.
+    \leftline{\kern 2\leftskip \sl ---\quotationauthor}%
+  \fi
+  {\parskip=0pt \afterenvbreak}%
+}
+\def\Esmallquotation{\Equotation}
+
+% If we're given an argument, typeset it in bold with a colon after.
+\def\quotationlabel#1{%
+  \def\temp{#1}%
+  \ifx\temp\empty \else
+    {\bf #1: }%
+  \fi
+}
+
+% @indentedblock is like @quotation, but indents only on the left and
+% has no optional argument.
+% 
+\makedispenvdef{indentedblock}{\indentedblockstart}
+%
+\def\indentedblockstart{%
+  {\parskip=0pt \aboveenvbreak}% because \aboveenvbreak inserts \parskip
+  \parindent=0pt
+  %
+  % @cartouche defines \nonarrowing to inhibit narrowing at next level down.
+  \ifx\nonarrowing\relax
+    \advance\leftskip by \lispnarrowing
+    \exdentamount = \lispnarrowing
+  \else
+    \let\nonarrowing = \relax
+  \fi
+}
+
+% Keep a nonzero parskip for the environment, since we're doing normal filling.
+%
+\def\Eindentedblock{%
+  \par
+  {\parskip=0pt \afterenvbreak}%
+}
+\def\Esmallindentedblock{\Eindentedblock}
+
+
+% LaTeX-like @verbatim... at end verbatim and @verb{<char>...<char>}
+% If we want to allow any <char> as delimiter,
+% we need the curly braces so that makeinfo sees the @verb command, eg:
+% `@verbx...x' would look like the '@verbx' command.  --janneke at gnu.org
+%
+% [Knuth]: Donald Ervin Knuth, 1996.  The TeXbook.
+%
+% [Knuth] p.344; only we need to do the other characters Texinfo sets
+% active too.  Otherwise, they get lost as the first character on a
+% verbatim line.
+\def\dospecials{%
+  \do\ \do\\\do\{\do\}\do\$\do\&%
+  \do\#\do\^\do\^^K\do\_\do\^^A\do\%\do\~%
+  \do\<\do\>\do\|\do\@\do+\do\"%
+  % Don't do the quotes -- if we do, @set txicodequoteundirected and
+  % @set txicodequotebacktick will not have effect on @verb and
+  % @verbatim, and ?` and !` ligatures won't get disabled.
+  %\do\`\do\'%
+}
+%
+% [Knuth] p. 380
+\def\uncatcodespecials{%
+  \def\do##1{\catcode`##1=\other}\dospecials}
+%
+% Setup for the @verb command.
+%
+% Eight spaces for a tab
+\begingroup
+  \catcode`\^^I=\active
+  \gdef\tabeightspaces{\catcode`\^^I=\active\def^^I{\ \ \ \ \ \ \ \ }}
+\endgroup
+%
+\def\setupverb{%
+  \tt  % easiest (and conventionally used) font for verbatim
+  \def\par{\leavevmode\endgraf}%
+  \setupmarkupstyle{verb}%
+  \tabeightspaces
+  % Respect line breaks,
+  % print special symbols as themselves, and
+  % make each space count
+  % must do in this order:
+  \obeylines \uncatcodespecials \sepspaces
+}
+
+% Setup for the @verbatim environment
+%
+% Real tab expansion.
+\newdimen\tabw \setbox0=\hbox{\tt\space} \tabw=8\wd0 % tab amount
+%
+% We typeset each line of the verbatim in an \hbox, so we can handle
+% tabs.  The \global is in case the verbatim line starts with an accent,
+% or some other command that starts with a begin-group.  Otherwise, the
+% entire \verbbox would disappear at the corresponding end-group, before
+% it is typeset.  Meanwhile, we can't have nested verbatim commands
+% (can we?), so the \global won't be overwriting itself.
+\newbox\verbbox
+\def\starttabbox{\global\setbox\verbbox=\hbox\bgroup}
+%
+\begingroup
+  \catcode`\^^I=\active
+  \gdef\tabexpand{%
+    \catcode`\^^I=\active
+    \def^^I{\leavevmode\egroup
+      \dimen\verbbox=\wd\verbbox % the width so far, or since the previous tab
+      \divide\dimen\verbbox by\tabw
+      \multiply\dimen\verbbox by\tabw % compute previous multiple of \tabw
+      \advance\dimen\verbbox by\tabw  % advance to next multiple of \tabw
+      \wd\verbbox=\dimen\verbbox \box\verbbox \starttabbox
+    }%
+  }
+\endgroup
+
+% start the verbatim environment.
+\def\setupverbatim{%
+  \let\nonarrowing = t%
+  \nonfillstart
+  \tt % easiest (and conventionally used) font for verbatim
+  % The \leavevmode here is for blank lines.  Otherwise, we would
+  % never \starttabox and the \egroup would end verbatim mode.
+  \def\par{\leavevmode\egroup\box\verbbox\endgraf}%
+  \tabexpand
+  \setupmarkupstyle{verbatim}%
+  % Respect line breaks,
+  % print special symbols as themselves, and
+  % make each space count.
+  % Must do in this order:
+  \obeylines \uncatcodespecials \sepspaces
+  \everypar{\starttabbox}%
+}
+
+% Do the @verb magic: verbatim text is quoted by unique
+% delimiter characters.  Before first delimiter expect a
+% right brace, after last delimiter expect closing brace:
+%
+%    \def\doverb'{'<char>#1<char>'}'{#1}
+%
+% [Knuth] p. 382; only eat outer {}
+\begingroup
+  \catcode`[=1\catcode`]=2\catcode`\{=\other\catcode`\}=\other
+  \gdef\doverb{#1[\def\next##1#1}[##1\endgroup]\next]
+\endgroup
+%
+\def\verb{\begingroup\setupverb\doverb}
+%
+%
+% Do the @verbatim magic: define the macro \doverbatim so that
+% the (first) argument ends when '@end verbatim' is reached, ie:
+%
+%     \def\doverbatim#1 at end verbatim{#1}
+%
+% For Texinfo it's a lot easier than for LaTeX,
+% because texinfo's \verbatim doesn't stop at '\end{verbatim}':
+% we need not redefine '\', '{' and '}'.
+%
+% Inspired by LaTeX's verbatim command set [latex.ltx]
+%
+\begingroup
+  \catcode`\ =\active
+  \obeylines %
+  % ignore everything up to the first ^^M, that's the newline at the end
+  % of the @verbatim input line itself.  Otherwise we get an extra blank
+  % line in the output.
+  \xdef\doverbatim#1^^M#2 at end verbatim{#2\noexpand\end\gobble verbatim}%
+  % We really want {...\end verbatim} in the body of the macro, but
+  % without the active space; thus we have to use \xdef and \gobble.
+\endgroup
+%
+\envdef\verbatim{%
+    \setupverbatim\doverbatim
+}
+\let\Everbatim = \afterenvbreak
+
+
+% @verbatiminclude FILE - insert text of file in verbatim environment.
+%
+\def\verbatiminclude{\parseargusing\filenamecatcodes\doverbatiminclude}
+%
+\def\doverbatiminclude#1{%
+  {%
+    \makevalueexpandable
+    \setupverbatim
+    \indexnofonts       % Allow `@@' and other weird things in file names.
+    \wlog{texinfo.tex: doing @verbatiminclude of #1^^J}%
+    \input #1
+    \afterenvbreak
+  }%
+}
+
+% @copying ... @end copying.
+% Save the text away for @insertcopying later.
+%
+% We save the uninterpreted tokens, rather than creating a box.
+% Saving the text in a box would be much easier, but then all the
+% typesetting commands (@smallbook, font changes, etc.) have to be done
+% beforehand -- and a) we want @copying to be done first in the source
+% file; b) letting users define the frontmatter in as flexible order as
+% possible is very desirable.
+%
+\def\copying{\checkenv{}\begingroup\scanargctxt\docopying}
+\def\docopying#1 at end copying{\endgroup\def\copyingtext{#1}}
+%
+\def\insertcopying{%
+  \begingroup
+    \parindent = 0pt  % paragraph indentation looks wrong on title page
+    \scanexp\copyingtext
+  \endgroup
+}
+
+
+\message{defuns,}
+% @defun etc.
+
+\newskip\defbodyindent \defbodyindent=.4in
+\newskip\defargsindent \defargsindent=50pt
+\newskip\deflastargmargin \deflastargmargin=18pt
+\newcount\defunpenalty
+
+% Start the processing of @deffn:
+\def\startdefun{%
+  \ifnum\lastpenalty<10000
+    \medbreak
+    \defunpenalty=10003 % Will keep this @deffn together with the
+                        % following @def command, see below.
+  \else
+    % If there are two @def commands in a row, we'll have a \nobreak,
+    % which is there to keep the function description together with its
+    % header.  But if there's nothing but headers, we need to allow a
+    % break somewhere.  Check specifically for penalty 10002, inserted
+    % by \printdefunline, instead of 10000, since the sectioning
+    % commands also insert a nobreak penalty, and we don't want to allow
+    % a break between a section heading and a defun.
+    %
+    % As a further refinement, we avoid "club" headers by signalling
+    % with penalty of 10003 after the very first @deffn in the
+    % sequence (see above), and penalty of 10002 after any following
+    % @def command.
+    \ifnum\lastpenalty=10002 \penalty2000 \else \defunpenalty=10002 \fi
+    %
+    % Similarly, after a section heading, do not allow a break.
+    % But do insert the glue.
+    \medskip  % preceded by discardable penalty, so not a breakpoint
+  \fi
+  %
+  \parindent=0in
+  \advance\leftskip by \defbodyindent
+  \exdentamount=\defbodyindent
+}
+
+\def\dodefunx#1{%
+  % First, check whether we are in the right environment:
+  \checkenv#1%
+  %
+  % As above, allow line break if we have multiple x headers in a row.
+  % It's not a great place, though.
+  \ifnum\lastpenalty=10002 \penalty3000 \else \defunpenalty=10002 \fi
+  %
+  % And now, it's time to reuse the body of the original defun:
+  \expandafter\gobbledefun#1%
+}
+\def\gobbledefun#1\startdefun{}
+
+% \printdefunline \deffnheader{text}
+%
+\def\printdefunline#1#2{%
+  \begingroup
+    % call \deffnheader:
+    #1#2 \endheader
+    % common ending:
+    \interlinepenalty = 10000
+    \advance\rightskip by 0pt plus 1fil\relax
+    \endgraf
+    \nobreak\vskip -\parskip
+    \penalty\defunpenalty  % signal to \startdefun and \dodefunx
+    % Some of the @defun-type tags do not enable magic parentheses,
+    % rendering the following check redundant.  But we don't optimize.
+    \checkparencounts
+  \endgroup
+}
+
+\def\Edefun{\endgraf\medbreak}
+
+% \makedefun{deffn} creates \deffn, \deffnx and \Edeffn;
+% the only thing remaining is to define \deffnheader.
+%
+\def\makedefun#1{%
+  \expandafter\let\csname E#1\endcsname = \Edefun
+  \edef\temp{\noexpand\domakedefun
+    \makecsname{#1}\makecsname{#1x}\makecsname{#1header}}%
+  \temp
+}
+
+% \domakedefun \deffn \deffnx \deffnheader
+%
+% Define \deffn and \deffnx, without parameters.
+% \deffnheader has to be defined explicitly.
+%
+\def\domakedefun#1#2#3{%
+  \envdef#1{%
+    \startdefun
+    \doingtypefnfalse    % distinguish typed functions from all else
+    \parseargusing\activeparens{\printdefunline#3}%
+  }%
+  \def#2{\dodefunx#1}%
+  \def#3%
+}
+
+\newif\ifdoingtypefn       % doing typed function?
+\newif\ifrettypeownline    % typeset return type on its own line?
+
+% @deftypefnnewline on|off says whether the return type of typed functions
+% are printed on their own line.  This affects @deftypefn, @deftypefun,
+% @deftypeop, and @deftypemethod.
+% 
+\parseargdef\deftypefnnewline{%
+  \def\temp{#1}%
+  \ifx\temp\onword
+    \expandafter\let\csname SETtxideftypefnnl\endcsname
+      = \empty
+  \else\ifx\temp\offword
+    \expandafter\let\csname SETtxideftypefnnl\endcsname
+      = \relax
+  \else
+    \errhelp = \EMsimple
+    \errmessage{Unknown @txideftypefnnl value `\temp',
+                must be on|off}%
+  \fi\fi
+}
+
+% Untyped functions:
+
+% @deffn category name args
+\makedefun{deffn}{\deffngeneral{}}
+
+% @deffn category class name args
+\makedefun{defop}#1 {\defopon{#1\ \putwordon}}
+
+% \defopon {category on}class name args
+\def\defopon#1#2 {\deffngeneral{\putwordon\ \code{#2}}{#1\ \code{#2}} }
+
+% \deffngeneral {subind}category name args
+%
+\def\deffngeneral#1#2 #3 #4\endheader{%
+  % Remember that \dosubind{fn}{foo}{} is equivalent to \doind{fn}{foo}.
+  \dosubind{fn}{\code{#3}}{#1}%
+  \defname{#2}{}{#3}\magicamp\defunargs{#4\unskip}%
+}
+
+% Typed functions:
+
+% @deftypefn category type name args
+\makedefun{deftypefn}{\deftypefngeneral{}}
+
+% @deftypeop category class type name args
+\makedefun{deftypeop}#1 {\deftypeopon{#1\ \putwordon}}
+
+% \deftypeopon {category on}class type name args
+\def\deftypeopon#1#2 {\deftypefngeneral{\putwordon\ \code{#2}}{#1\ \code{#2}} }
+
+% \deftypefngeneral {subind}category type name args
+%
+\def\deftypefngeneral#1#2 #3 #4 #5\endheader{%
+  \dosubind{fn}{\code{#4}}{#1}%
+  \doingtypefntrue
+  \defname{#2}{#3}{#4}\defunargs{#5\unskip}%
+}
+
+% Typed variables:
+
+% @deftypevr category type var args
+\makedefun{deftypevr}{\deftypecvgeneral{}}
+
+% @deftypecv category class type var args
+\makedefun{deftypecv}#1 {\deftypecvof{#1\ \putwordof}}
+
+% \deftypecvof {category of}class type var args
+\def\deftypecvof#1#2 {\deftypecvgeneral{\putwordof\ \code{#2}}{#1\ \code{#2}} }
+
+% \deftypecvgeneral {subind}category type var args
+%
+\def\deftypecvgeneral#1#2 #3 #4 #5\endheader{%
+  \dosubind{vr}{\code{#4}}{#1}%
+  \defname{#2}{#3}{#4}\defunargs{#5\unskip}%
+}
+
+% Untyped variables:
+
+% @defvr category var args
+\makedefun{defvr}#1 {\deftypevrheader{#1} {} }
+
+% @defcv category class var args
+\makedefun{defcv}#1 {\defcvof{#1\ \putwordof}}
+
+% \defcvof {category of}class var args
+\def\defcvof#1#2 {\deftypecvof{#1}#2 {} }
+
+% Types:
+
+% @deftp category name args
+\makedefun{deftp}#1 #2 #3\endheader{%
+  \doind{tp}{\code{#2}}%
+  \defname{#1}{}{#2}\defunargs{#3\unskip}%
+}
+
+% Remaining @defun-like shortcuts:
+\makedefun{defun}{\deffnheader{\putwordDeffunc} }
+\makedefun{defmac}{\deffnheader{\putwordDefmac} }
+\makedefun{defspec}{\deffnheader{\putwordDefspec} }
+\makedefun{deftypefun}{\deftypefnheader{\putwordDeffunc} }
+\makedefun{defvar}{\defvrheader{\putwordDefvar} }
+\makedefun{defopt}{\defvrheader{\putwordDefopt} }
+\makedefun{deftypevar}{\deftypevrheader{\putwordDefvar} }
+\makedefun{defmethod}{\defopon\putwordMethodon}
+\makedefun{deftypemethod}{\deftypeopon\putwordMethodon}
+\makedefun{defivar}{\defcvof\putwordInstanceVariableof}
+\makedefun{deftypeivar}{\deftypecvof\putwordInstanceVariableof}
+
+% \defname, which formats the name of the @def (not the args).
+% #1 is the category, such as "Function".
+% #2 is the return type, if any.
+% #3 is the function name.
+%
+% We are followed by (but not passed) the arguments, if any.
+%
+\def\defname#1#2#3{%
+  \par
+  % Get the values of \leftskip and \rightskip as they were outside the @def...
+  \advance\leftskip by -\defbodyindent
+  %
+  % Determine if we are typesetting the return type of a typed function
+  % on a line by itself.
+  \rettypeownlinefalse
+  \ifdoingtypefn  % doing a typed function specifically?
+    % then check user option for putting return type on its own line:
+    \expandafter\ifx\csname SETtxideftypefnnl\endcsname\relax \else
+      \rettypeownlinetrue
+    \fi
+  \fi
+  %
+  % How we'll format the category name.  Putting it in brackets helps
+  % distinguish it from the body text that may end up on the next line
+  % just below it.
+  \def\temp{#1}%
+  \setbox0=\hbox{\kern\deflastargmargin \ifx\temp\empty\else [\rm\temp]\fi}
+  %
+  % Figure out line sizes for the paragraph shape.  We'll always have at
+  % least two.
+  \tempnum = 2
+  %
+  % The first line needs space for \box0; but if \rightskip is nonzero,
+  % we need only space for the part of \box0 which exceeds it:
+  \dimen0=\hsize  \advance\dimen0 by -\wd0  \advance\dimen0 by \rightskip
+  %
+  % If doing a return type on its own line, we'll have another line.
+  \ifrettypeownline
+    \advance\tempnum by 1
+    \def\maybeshapeline{0in \hsize}%
+  \else
+    \def\maybeshapeline{}%
+  \fi
+  %
+  % The continuations:
+  \dimen2=\hsize  \advance\dimen2 by -\defargsindent
+  %
+  % The final paragraph shape:
+  \parshape \tempnum  0in \dimen0  \maybeshapeline  \defargsindent \dimen2
+  %
+  % Put the category name at the right margin.
+  \noindent
+  \hbox to 0pt{%
+    \hfil\box0 \kern-\hsize
+    % \hsize has to be shortened this way:
+    \kern\leftskip
+    % Intentionally do not respect \rightskip, since we need the space.
+  }%
+  %
+  % Allow all lines to be underfull without complaint:
+  \tolerance=10000 \hbadness=10000
+  \exdentamount=\defbodyindent
+  {%
+    % defun fonts. We use typewriter by default (used to be bold) because:
+    % . we're printing identifiers, they should be in tt in principle.
+    % . in languages with many accents, such as Czech or French, it's
+    %   common to leave accents off identifiers.  The result looks ok in
+    %   tt, but exceedingly strange in rm.
+    % . we don't want -- and --- to be treated as ligatures.
+    % . this still does not fix the ?` and !` ligatures, but so far no
+    %   one has made identifiers using them :).
+    \df \tt
+    \def\temp{#2}% text of the return type
+    \ifx\temp\empty\else
+      \tclose{\temp}% typeset the return type
+      \ifrettypeownline
+        % put return type on its own line; prohibit line break following:
+        \hfil\vadjust{\nobreak}\break  
+      \else
+        \space  % type on same line, so just followed by a space
+      \fi
+    \fi           % no return type
+    #3% output function name
+  }%
+  {\rm\enskip}% hskip 0.5 em of \tenrm
+  %
+  \boldbrax
+  % arguments will be output next, if any.
+}
+
+% Print arguments in slanted roman (not ttsl), inconsistently with using
+% tt for the name.  This is because literal text is sometimes needed in
+% the argument list (groff manual), and ttsl and tt are not very
+% distinguishable.  Prevent hyphenation at `-' chars.
+%
+\def\defunargs#1{%
+  % use sl by default (not ttsl),
+  % tt for the names.
+  \df \sl \hyphenchar\font=0
+  %
+  % On the other hand, if an argument has two dashes (for instance), we
+  % want a way to get ttsl.  We used to recommend @var for that, so
+  % leave the code in, but it's strange for @var to lead to typewriter.
+  % Nowadays we recommend @code, since the difference between a ttsl hyphen
+  % and a tt hyphen is pretty tiny.  @code also disables ?` !`.
+  \def\var##1{{\setupmarkupstyle{var}\ttslanted{##1}}}%
+  #1%
+  \sl\hyphenchar\font=45
+}
+
+% We want ()&[] to print specially on the defun line.
+%
+\def\activeparens{%
+  \catcode`\(=\active \catcode`\)=\active
+  \catcode`\[=\active \catcode`\]=\active
+  \catcode`\&=\active
+}
+
+% Make control sequences which act like normal parenthesis chars.
+\let\lparen = ( \let\rparen = )
+
+% Be sure that we always have a definition for `(', etc.  For example,
+% if the fn name has parens in it, \boldbrax will not be in effect yet,
+% so TeX would otherwise complain about undefined control sequence.
+{
+  \activeparens
+  \global\let(=\lparen \global\let)=\rparen
+  \global\let[=\lbrack \global\let]=\rbrack
+  \global\let& = \&
+
+  \gdef\boldbrax{\let(=\opnr\let)=\clnr\let[=\lbrb\let]=\rbrb}
+  \gdef\magicamp{\let&=\amprm}
+}
+
+\newcount\parencount
+
+% If we encounter &foo, then turn on ()-hacking afterwards
+\newif\ifampseen
+\def\amprm#1 {\ampseentrue{\bf\&#1 }}
+
+\def\parenfont{%
+  \ifampseen
+    % At the first level, print parens in roman,
+    % otherwise use the default font.
+    \ifnum \parencount=1 \rm \fi
+  \else
+    % The \sf parens (in \boldbrax) actually are a little bolder than
+    % the contained text.  This is especially needed for [ and ] .
+    \sf
+  \fi
+}
+\def\infirstlevel#1{%
+  \ifampseen
+    \ifnum\parencount=1
+      #1%
+    \fi
+  \fi
+}
+\def\bfafterword#1 {#1 \bf}
+
+\def\opnr{%
+  \global\advance\parencount by 1
+  {\parenfont(}%
+  \infirstlevel \bfafterword
+}
+\def\clnr{%
+  {\parenfont)}%
+  \infirstlevel \sl
+  \global\advance\parencount by -1
+}
+
+\newcount\brackcount
+\def\lbrb{%
+  \global\advance\brackcount by 1
+  {\bf[}%
+}
+\def\rbrb{%
+  {\bf]}%
+  \global\advance\brackcount by -1
+}
+
+\def\checkparencounts{%
+  \ifnum\parencount=0 \else \badparencount \fi
+  \ifnum\brackcount=0 \else \badbrackcount \fi
+}
+% these should not use \errmessage; the glibc manual, at least, actually
+% has such constructs (when documenting function pointers).
+\def\badparencount{%
+  \message{Warning: unbalanced parentheses in @def...}%
+  \global\parencount=0
+}
+\def\badbrackcount{%
+  \message{Warning: unbalanced square brackets in @def...}%
+  \global\brackcount=0
+}
+
+
+\message{macros,}
+% @macro.
+
+% To do this right we need a feature of e-TeX, \scantokens,
+% which we arrange to emulate with a temporary file in ordinary TeX.
+\ifx\eTeXversion\thisisundefined
+  \newwrite\macscribble
+  \def\scantokens#1{%
+    \toks0={#1}%
+    \immediate\openout\macscribble=\jobname.tmp
+    \immediate\write\macscribble{\the\toks0}%
+    \immediate\closeout\macscribble
+    \input \jobname.tmp
+  }
+\fi
+
+\def\scanmacro#1{\begingroup
+  \newlinechar`\^^M
+  \let\xeatspaces\eatspaces
+  %
+  % Undo catcode changes of \startcontents and \doprintindex
+  % When called from @insertcopying or (short)caption, we need active
+  % backslash to get it printed correctly.  Previously, we had
+  % \catcode`\\=\other instead.  We'll see whether a problem appears
+  % with macro expansion.				--kasal, 19aug04
+  \catcode`\@=0 \catcode`\\=\active \escapechar=`\@
+  %
+  % ... and for \example:
+  \spaceisspace
+  %
+  % The \empty here causes a following catcode 5 newline to be eaten as
+  % part of reading whitespace after a control sequence.  It does not
+  % eat a catcode 13 newline.  There's no good way to handle the two
+  % cases (untried: maybe e-TeX's \everyeof could help, though plain TeX
+  % would then have different behavior).  See the Macro Details node in
+  % the manual for the workaround we recommend for macros and
+  % line-oriented commands.
+  % 
+  \scantokens{#1\empty}%
+\endgroup}
+
+\def\scanexp#1{%
+  \edef\temp{\noexpand\scanmacro{#1}}%
+  \temp
+}
+
+\newcount\paramno   % Count of parameters
+\newtoks\macname    % Macro name
+\newif\ifrecursive  % Is it recursive?
+
+% List of all defined macros in the form
+%    \definedummyword\macro1\definedummyword\macro2...
+% Currently is also contains all @aliases; the list can be split
+% if there is a need.
+\def\macrolist{}
+
+% Add the macro to \macrolist
+\def\addtomacrolist#1{\expandafter \addtomacrolistxxx \csname#1\endcsname}
+\def\addtomacrolistxxx#1{%
+     \toks0 = \expandafter{\macrolist\definedummyword#1}%
+     \xdef\macrolist{\the\toks0}%
+}
+
+% Utility routines.
+% This does \let #1 = #2, with \csnames; that is,
+%   \let \csname#1\endcsname = \csname#2\endcsname
+% (except of course we have to play expansion games).
+%
+\def\cslet#1#2{%
+  \expandafter\let
+  \csname#1\expandafter\endcsname
+  \csname#2\endcsname
+}
+
+% Trim leading and trailing spaces off a string.
+% Concepts from aro-bend problem 15 (see CTAN).
+{\catcode`\@=11
+\gdef\eatspaces #1{\expandafter\trim@\expandafter{#1 }}
+\gdef\trim@ #1{\trim@@ @#1 @ #1 @ @@}
+\gdef\trim@@ #1@ #2@ #3@@{\trim@@@\empty #2 @}
+\def\unbrace#1{#1}
+\unbrace{\gdef\trim@@@ #1 } #2@{#1}
+}
+
+% Trim a single trailing ^^M off a string.
+{\catcode`\^^M=\other \catcode`\Q=3%
+\gdef\eatcr #1{\eatcra #1Q^^MQ}%
+\gdef\eatcra#1^^MQ{\eatcrb#1Q}%
+\gdef\eatcrb#1Q#2Q{#1}%
+}
+
+% Macro bodies are absorbed as an argument in a context where
+% all characters are catcode 10, 11 or 12, except \ which is active
+% (as in normal texinfo). It is necessary to change the definition of \
+% to recognize macro arguments; this is the job of \mbodybackslash.
+%
+% Non-ASCII encodings make 8-bit characters active, so un-activate
+% them to avoid their expansion.  Must do this non-globally, to
+% confine the change to the current group.
+%
+% It's necessary to have hard CRs when the macro is executed. This is
+% done by making ^^M (\endlinechar) catcode 12 when reading the macro
+% body, and then making it the \newlinechar in \scanmacro.
+%
+\def\scanctxt{% used as subroutine
+  \catcode`\"=\other
+  \catcode`\+=\other
+  \catcode`\<=\other
+  \catcode`\>=\other
+  \catcode`\@=\other
+  \catcode`\^=\other
+  \catcode`\_=\other
+  \catcode`\|=\other
+  \catcode`\~=\other
+  \ifx\declaredencoding\ascii \else \setnonasciicharscatcodenonglobal\other \fi
+}
+
+\def\scanargctxt{% used for copying and captions, not macros.
+  \scanctxt
+  \catcode`\\=\other
+  \catcode`\^^M=\other
+}
+
+\def\macrobodyctxt{% used for @macro definitions
+  \scanctxt
+  \catcode`\{=\other
+  \catcode`\}=\other
+  \catcode`\^^M=\other
+  \usembodybackslash
+}
+
+\def\macroargctxt{% used when scanning invocations
+  \scanctxt
+  \catcode`\\=0
+}
+% why catcode 0 for \ in the above?  To recognize \\ \{ \} as "escapes"
+% for the single characters \ { }.  Thus, we end up with the "commands"
+% that would be written @\ @{ @} in a Texinfo document.
+% 
+% We already have @{ and @}.  For @\, we define it here, and only for
+% this purpose, to produce a typewriter backslash (so, the @\ that we
+% define for @math can't be used with @macro calls):
+%
+\def\\{\normalbackslash}%
+% 
+% We would like to do this for \, too, since that is what makeinfo does.
+% But it is not possible, because Texinfo already has a command @, for a
+% cedilla accent.  Documents must use @comma{} instead.
+%
+% \anythingelse will almost certainly be an error of some kind.
+
+
+% \mbodybackslash is the definition of \ in @macro bodies.
+% It maps \foo\ => \csname macarg.foo\endcsname => #N
+% where N is the macro parameter number.
+% We define \csname macarg.\endcsname to be \realbackslash, so
+% \\ in macro replacement text gets you a backslash.
+%
+{\catcode`@=0 @catcode`@\=@active
+ @gdef at usembodybackslash{@let\=@mbodybackslash}
+ @gdef at mbodybackslash#1\{@csname macarg.#1 at endcsname}
+}
+\expandafter\def\csname macarg.\endcsname{\realbackslash}
+
+\def\margbackslash#1{\char`\#1 }
+
+\def\macro{\recursivefalse\parsearg\macroxxx}
+\def\rmacro{\recursivetrue\parsearg\macroxxx}
+
+\def\macroxxx#1{%
+  \getargs{#1}% now \macname is the macname and \argl the arglist
+  \ifx\argl\empty       % no arguments
+     \paramno=0\relax
+  \else
+     \expandafter\parsemargdef \argl;%
+     \if\paramno>256\relax
+       \ifx\eTeXversion\thisisundefined
+         \errhelp = \EMsimple
+         \errmessage{You need eTeX to compile a file with macros with more than 256 arguments}
+       \fi
+     \fi
+  \fi
+  \if1\csname ismacro.\the\macname\endcsname
+     \message{Warning: redefining \the\macname}%
+  \else
+     \expandafter\ifx\csname \the\macname\endcsname \relax
+     \else \errmessage{Macro name \the\macname\space already defined}\fi
+     \global\cslet{macsave.\the\macname}{\the\macname}%
+     \global\expandafter\let\csname ismacro.\the\macname\endcsname=1%
+     \addtomacrolist{\the\macname}%
+  \fi
+  \begingroup \macrobodyctxt
+  \ifrecursive \expandafter\parsermacbody
+  \else \expandafter\parsemacbody
+  \fi}
+
+\parseargdef\unmacro{%
+  \if1\csname ismacro.#1\endcsname
+    \global\cslet{#1}{macsave.#1}%
+    \global\expandafter\let \csname ismacro.#1\endcsname=0%
+    % Remove the macro name from \macrolist:
+    \begingroup
+      \expandafter\let\csname#1\endcsname \relax
+      \let\definedummyword\unmacrodo
+      \xdef\macrolist{\macrolist}%
+    \endgroup
+  \else
+    \errmessage{Macro #1 not defined}%
+  \fi
+}
+
+% Called by \do from \dounmacro on each macro.  The idea is to omit any
+% macro definitions that have been changed to \relax.
+%
+\def\unmacrodo#1{%
+  \ifx #1\relax
+    % remove this
+  \else
+    \noexpand\definedummyword \noexpand#1%
+  \fi
+}
+
+% This makes use of the obscure feature that if the last token of a
+% <parameter list> is #, then the preceding argument is delimited by
+% an opening brace, and that opening brace is not consumed.
+\def\getargs#1{\getargsxxx#1{}}
+\def\getargsxxx#1#{\getmacname #1 \relax\getmacargs}
+\def\getmacname#1 #2\relax{\macname={#1}}
+\def\getmacargs#1{\def\argl{#1}}
+
+% For macro processing make @ a letter so that we can make Texinfo private macro names.
+\edef\texiatcatcode{\the\catcode`\@}
+\catcode `@=11\relax
+
+% Parse the optional {params} list.  Set up \paramno and \paramlist
+% so \defmacro knows what to do.  Define \macarg.BLAH for each BLAH
+% in the params list to some hook where the argument si to be expanded.  If
+% there are less than 10 arguments that hook is to be replaced by ##N where N
+% is the position in that list, that is to say the macro arguments are to be
+% defined `a la TeX in the macro body.  
+%
+% That gets used by \mbodybackslash (above).
+%
+% We need to get `macro parameter char #' into several definitions.
+% The technique used is stolen from LaTeX: let \hash be something
+% unexpandable, insert that wherever you need a #, and then redefine
+% it to # just before using the token list produced.
+%
+% The same technique is used to protect \eatspaces till just before
+% the macro is used.
+%
+% If there are 10 or more arguments, a different technique is used, where the
+% hook remains in the body, and when macro is to be expanded the body is
+% processed again to replace the arguments.
+%
+% In that case, the hook is \the\toks N-1, and we simply set \toks N-1 to the
+% argument N value and then \edef  the body (nothing else will expand because of
+% the catcode regime underwhich the body was input).
+%
+% If you compile with TeX (not eTeX), and you have macros with 10 or more
+% arguments, you need that no macro has more than 256 arguments, otherwise an
+% error is produced.
+\def\parsemargdef#1;{%
+  \paramno=0\def\paramlist{}%
+  \let\hash\relax
+  \let\xeatspaces\relax
+  \parsemargdefxxx#1,;,%
+  % In case that there are 10 or more arguments we parse again the arguments
+  % list to set new definitions for the \macarg.BLAH macros corresponding to
+  % each BLAH argument. It was anyhow needed to parse already once this list
+  % in order to count the arguments, and as macros with at most 9 arguments
+  % are by far more frequent than macro with 10 or more arguments, defining
+  % twice the \macarg.BLAH macros does not cost too much processing power.
+  \ifnum\paramno<10\relax\else
+    \paramno0\relax
+    \parsemmanyargdef@@#1,;,% 10 or more arguments
+  \fi
+}
+\def\parsemargdefxxx#1,{%
+  \if#1;\let\next=\relax
+  \else \let\next=\parsemargdefxxx
+    \advance\paramno by 1
+    \expandafter\edef\csname macarg.\eatspaces{#1}\endcsname
+        {\xeatspaces{\hash\the\paramno}}%
+    \edef\paramlist{\paramlist\hash\the\paramno,}%
+  \fi\next}
+
+\def\parsemmanyargdef@@#1,{%
+  \if#1;\let\next=\relax
+  \else 
+    \let\next=\parsemmanyargdef@@
+    \edef\tempb{\eatspaces{#1}}%
+    \expandafter\def\expandafter\tempa
+       \expandafter{\csname macarg.\tempb\endcsname}%
+    % Note that we need some extra \noexpand\noexpand, this is because we
+    % don't want \the  to be expanded in the \parsermacbody  as it uses an
+    % \xdef .
+    \expandafter\edef\tempa
+      {\noexpand\noexpand\noexpand\the\toks\the\paramno}%
+    \advance\paramno by 1\relax
+  \fi\next}
+
+% These two commands read recursive and nonrecursive macro bodies.
+% (They're different since rec and nonrec macros end differently.)
+%
+
+\catcode `\@\texiatcatcode
+\long\def\parsemacbody#1 at end macro%
+{\xdef\temp{\eatcr{#1}}\endgroup\defmacro}%
+\long\def\parsermacbody#1 at end rmacro%
+{\xdef\temp{\eatcr{#1}}\endgroup\defmacro}%
+\catcode `\@=11\relax
+
+\let\endargs@\relax
+\let\nil@\relax
+\def\nilm@{\nil@}%
+\long\def\nillm@{\nil@}%
+
+% This macro is expanded during the Texinfo macro expansion, not during its
+% definition.  It gets all the arguments values and assigns them to macros
+% macarg.ARGNAME
+%
+% #1 is the macro name
+% #2 is the list of argument names
+% #3 is the list of argument values
+\def\getargvals@#1#2#3{%
+  \def\macargdeflist@{}%
+  \def\saveparamlist@{#2}% Need to keep a copy for parameter expansion.
+  \def\paramlist{#2,\nil@}%
+  \def\macroname{#1}%
+  \begingroup
+  \macroargctxt
+  \def\argvaluelist{#3,\nil@}%
+  \def\@tempa{#3}%
+  \ifx\@tempa\empty
+    \setemptyargvalues@
+  \else
+    \getargvals@@
+  \fi
+}
+
+% 
+\def\getargvals@@{%
+  \ifx\paramlist\nilm@
+      % Some sanity check needed here that \argvaluelist is also empty.
+      \ifx\argvaluelist\nillm@
+      \else
+        \errhelp = \EMsimple
+        \errmessage{Too many arguments in macro `\macroname'!}%
+      \fi
+      \let\next\macargexpandinbody@
+  \else
+    \ifx\argvaluelist\nillm@
+       % No more arguments values passed to macro.  Set remaining named-arg
+       % macros to empty.
+       \let\next\setemptyargvalues@
+    \else
+      % pop current arg name into \@tempb
+      \def\@tempa##1{\pop@{\@tempb}{\paramlist}##1\endargs@}%
+      \expandafter\@tempa\expandafter{\paramlist}%
+       % pop current argument value into \@tempc
+      \def\@tempa##1{\longpop@{\@tempc}{\argvaluelist}##1\endargs@}%
+      \expandafter\@tempa\expandafter{\argvaluelist}%
+       % Here \@tempb is the current arg name and \@tempc is the current arg value.
+       % First place the new argument macro definition into \@tempd
+       \expandafter\macname\expandafter{\@tempc}%
+       \expandafter\let\csname macarg.\@tempb\endcsname\relax
+       \expandafter\def\expandafter\@tempe\expandafter{%
+         \csname macarg.\@tempb\endcsname}%
+       \edef\@tempd{\long\def\@tempe{\the\macname}}%
+       \push@\@tempd\macargdeflist@
+       \let\next\getargvals@@
+    \fi
+  \fi
+  \next
+}
+
+\def\push@#1#2{%
+  \expandafter\expandafter\expandafter\def
+  \expandafter\expandafter\expandafter#2%
+  \expandafter\expandafter\expandafter{%
+  \expandafter#1#2}%
+}
+
+% Replace arguments by their values in the macro body, and place the result
+% in macro \@tempa
+\def\macvalstoargs@{%
+  %  To do this we use the property that token registers that are \the'ed
+  % within an \edef  expand only once. So we are going to place all argument
+  % values into respective token registers.
+  %
+  % First we save the token context, and initialize argument numbering.
+  \begingroup
+    \paramno0\relax
+    % Then, for each argument number #N, we place the corresponding argument
+    % value into a new token list register \toks#N
+    \expandafter\putargsintokens@\saveparamlist@,;,%
+    % Then, we expand the body so that argument are replaced by their
+    % values. The trick for values not to be expanded themselves is that they
+    % are within tokens and that tokens expand only once in an \edef .
+    \edef\@tempc{\csname mac.\macroname .body\endcsname}%
+    % Now we restore the token stack pointer to free the token list registers
+    % which we have used, but we make sure that expanded body is saved after
+    % group.
+    \expandafter
+  \endgroup
+  \expandafter\def\expandafter\@tempa\expandafter{\@tempc}%
+  }
+
+\def\macargexpandinbody@{% 
+  %% Define the named-macro outside of this group and then close this group. 
+  \expandafter
+  \endgroup
+  \macargdeflist@
+  % First the replace in body the macro arguments by their values, the result
+  % is in \@tempa .
+  \macvalstoargs@
+  % Then we point at the \norecurse or \gobble (for recursive) macro value
+  % with \@tempb .
+  \expandafter\let\expandafter\@tempb\csname mac.\macroname .recurse\endcsname
+  % Depending on whether it is recursive or not, we need some tailing
+  % \egroup .
+  \ifx\@tempb\gobble
+     \let\@tempc\relax
+  \else
+     \let\@tempc\egroup
+  \fi
+  % And now we do the real job:
+  \edef\@tempd{\noexpand\@tempb{\macroname}\noexpand\scanmacro{\@tempa}\@tempc}%
+  \@tempd
+}
+
+\def\putargsintokens@#1,{%
+  \if#1;\let\next\relax
+  \else
+    \let\next\putargsintokens@
+    % First we allocate the new token list register, and give it a temporary
+    % alias \@tempb .
+    \toksdef\@tempb\the\paramno
+    % Then we place the argument value into that token list register.
+    \expandafter\let\expandafter\@tempa\csname macarg.#1\endcsname
+    \expandafter\@tempb\expandafter{\@tempa}%
+    \advance\paramno by 1\relax
+  \fi
+  \next
+}
+
+% Save the token stack pointer into macro #1
+\def\texisavetoksstackpoint#1{\edef#1{\the\@cclvi}}
+% Restore the token stack pointer from number in macro #1
+\def\texirestoretoksstackpoint#1{\expandafter\mathchardef\expandafter\@cclvi#1\relax}
+% newtoks that can be used non \outer .
+\def\texinonouternewtoks{\alloc@ 5\toks \toksdef \@cclvi}
+
+% Tailing missing arguments are set to empty
+\def\setemptyargvalues@{%
+  \ifx\paramlist\nilm@
+    \let\next\macargexpandinbody@
+  \else
+    \expandafter\setemptyargvaluesparser@\paramlist\endargs@
+    \let\next\setemptyargvalues@
+  \fi
+  \next
+}
+
+\def\setemptyargvaluesparser@#1,#2\endargs@{%
+  \expandafter\def\expandafter\@tempa\expandafter{%
+    \expandafter\def\csname macarg.#1\endcsname{}}%
+  \push@\@tempa\macargdeflist@
+  \def\paramlist{#2}%
+}
+
+% #1 is the element target macro
+% #2 is the list macro
+% #3,#4\endargs@ is the list value
+\def\pop@#1#2#3,#4\endargs@{%
+   \def#1{#3}%
+   \def#2{#4}%
+}
+\long\def\longpop@#1#2#3,#4\endargs@{%
+   \long\def#1{#3}%
+   \long\def#2{#4}%
+}
+
+% This defines a Texinfo @macro. There are eight cases: recursive and
+% nonrecursive macros of zero, one, up to nine, and many arguments.
+% Much magic with \expandafter here.
+% \xdef is used so that macro definitions will survive the file
+% they're defined in; @include reads the file inside a group.
+%
+\def\defmacro{%
+  \let\hash=##% convert placeholders to macro parameter chars
+  \ifrecursive
+    \ifcase\paramno
+    % 0
+      \expandafter\xdef\csname\the\macname\endcsname{%
+        \noexpand\scanmacro{\temp}}%
+    \or % 1
+      \expandafter\xdef\csname\the\macname\endcsname{%
+         \bgroup\noexpand\macroargctxt
+         \noexpand\braceorline
+         \expandafter\noexpand\csname\the\macname xxx\endcsname}%
+      \expandafter\xdef\csname\the\macname xxx\endcsname##1{%
+         \egroup\noexpand\scanmacro{\temp}}%
+    \else
+      \ifnum\paramno<10\relax % at most 9
+        \expandafter\xdef\csname\the\macname\endcsname{%
+           \bgroup\noexpand\macroargctxt
+           \noexpand\csname\the\macname xx\endcsname}%
+        \expandafter\xdef\csname\the\macname xx\endcsname##1{%
+            \expandafter\noexpand\csname\the\macname xxx\endcsname ##1,}%
+        \expandafter\expandafter
+        \expandafter\xdef
+        \expandafter\expandafter
+          \csname\the\macname xxx\endcsname
+            \paramlist{\egroup\noexpand\scanmacro{\temp}}%
+      \else % 10 or more
+        \expandafter\xdef\csname\the\macname\endcsname{%
+          \noexpand\getargvals@{\the\macname}{\argl}%
+        }%    
+        \global\expandafter\let\csname mac.\the\macname .body\endcsname\temp
+        \global\expandafter\let\csname mac.\the\macname .recurse\endcsname\gobble
+      \fi
+    \fi
+  \else
+    \ifcase\paramno
+    % 0
+      \expandafter\xdef\csname\the\macname\endcsname{%
+        \noexpand\norecurse{\the\macname}%
+        \noexpand\scanmacro{\temp}\egroup}%
+    \or % 1
+      \expandafter\xdef\csname\the\macname\endcsname{%
+         \bgroup\noexpand\macroargctxt
+         \noexpand\braceorline
+         \expandafter\noexpand\csname\the\macname xxx\endcsname}%
+      \expandafter\xdef\csname\the\macname xxx\endcsname##1{%
+        \egroup
+        \noexpand\norecurse{\the\macname}%
+        \noexpand\scanmacro{\temp}\egroup}%
+    \else % at most 9
+      \ifnum\paramno<10\relax
+        \expandafter\xdef\csname\the\macname\endcsname{%
+           \bgroup\noexpand\macroargctxt
+           \expandafter\noexpand\csname\the\macname xx\endcsname}%
+        \expandafter\xdef\csname\the\macname xx\endcsname##1{%
+            \expandafter\noexpand\csname\the\macname xxx\endcsname ##1,}%
+        \expandafter\expandafter
+        \expandafter\xdef
+        \expandafter\expandafter
+        \csname\the\macname xxx\endcsname
+        \paramlist{%
+            \egroup
+            \noexpand\norecurse{\the\macname}%
+            \noexpand\scanmacro{\temp}\egroup}%
+      \else % 10 or more:
+        \expandafter\xdef\csname\the\macname\endcsname{%
+          \noexpand\getargvals@{\the\macname}{\argl}%
+        }%
+        \global\expandafter\let\csname mac.\the\macname .body\endcsname\temp
+        \global\expandafter\let\csname mac.\the\macname .recurse\endcsname\norecurse
+      \fi
+    \fi
+  \fi}
+
+\catcode `\@\texiatcatcode\relax
+
+\def\norecurse#1{\bgroup\cslet{#1}{macsave.#1}}
+
+% \braceorline decides whether the next nonwhitespace character is a
+% {.  If so it reads up to the closing }, if not, it reads the whole
+% line.  Whatever was read is then fed to the next control sequence
+% as an argument (by \parsebrace or \parsearg).
+% 
+\def\braceorline#1{\let\macnamexxx=#1\futurelet\nchar\braceorlinexxx}
+\def\braceorlinexxx{%
+  \ifx\nchar\bgroup\else
+    \expandafter\parsearg
+  \fi \macnamexxx}
+
+
+% @alias.
+% We need some trickery to remove the optional spaces around the equal
+% sign.  Make them active and then expand them all to nothing.
+%
+\def\alias{\parseargusing\obeyspaces\aliasxxx}
+\def\aliasxxx #1{\aliasyyy#1\relax}
+\def\aliasyyy #1=#2\relax{%
+  {%
+    \expandafter\let\obeyedspace=\empty
+    \addtomacrolist{#1}%
+    \xdef\next{\global\let\makecsname{#1}=\makecsname{#2}}%
+  }%
+  \next
+}
+
+
+\message{cross references,}
+
+\newwrite\auxfile
+\newif\ifhavexrefs    % True if xref values are known.
+\newif\ifwarnedxrefs  % True if we warned once that they aren't known.
+
+% @inforef is relatively simple.
+\def\inforef #1{\inforefzzz #1,,,,**}
+\def\inforefzzz #1,#2,#3,#4**{%
+  \putwordSee{} \putwordInfo{} \putwordfile{} \file{\ignorespaces #3{}},
+  node \samp{\ignorespaces#1{}}}
+
+% @node's only job in TeX is to define \lastnode, which is used in
+% cross-references.  The @node line might or might not have commas, and
+% might or might not have spaces before the first comma, like:
+% @node foo , bar , ...
+% We don't want such trailing spaces in the node name.
+%
+\parseargdef\node{\checkenv{}\donode #1 ,\finishnodeparse}
+%
+% also remove a trailing comma, in case of something like this:
+% @node Help-Cross,  ,  , Cross-refs
+\def\donode#1 ,#2\finishnodeparse{\dodonode #1,\finishnodeparse}
+\def\dodonode#1,#2\finishnodeparse{\gdef\lastnode{#1}}
+
+\let\nwnode=\node
+\let\lastnode=\empty
+
+% Write a cross-reference definition for the current node.  #1 is the
+% type (Ynumbered, Yappendix, Ynothing).
+%
+\def\donoderef#1{%
+  \ifx\lastnode\empty\else
+    \setref{\lastnode}{#1}%
+    \global\let\lastnode=\empty
+  \fi
+}
+
+% @anchor{NAME} -- define xref target at arbitrary point.
+%
+\newcount\savesfregister
+%
+\def\savesf{\relax \ifhmode \savesfregister=\spacefactor \fi}
+\def\restoresf{\relax \ifhmode \spacefactor=\savesfregister \fi}
+\def\anchor#1{\savesf \setref{#1}{Ynothing}\restoresf \ignorespaces}
+
+% \setref{NAME}{SNT} defines a cross-reference point NAME (a node or an
+% anchor), which consists of three parts:
+% 1) NAME-title - the current sectioning name taken from \lastsection,
+%                 or the anchor name.
+% 2) NAME-snt   - section number and type, passed as the SNT arg, or
+%                 empty for anchors.
+% 3) NAME-pg    - the page number.
+%
+% This is called from \donoderef, \anchor, and \dofloat.  In the case of
+% floats, there is an additional part, which is not written here:
+% 4) NAME-lof   - the text as it should appear in a @listoffloats.
+%
+\def\setref#1#2{%
+  \pdfmkdest{#1}%
+  \iflinks
+    {%
+      \atdummies  % preserve commands, but don't expand them
+      \edef\writexrdef##1##2{%
+	\write\auxfile{@xrdef{#1-% #1 of \setref, expanded by the \edef
+	  ##1}{##2}}% these are parameters of \writexrdef
+      }%
+      \toks0 = \expandafter{\lastsection}%
+      \immediate \writexrdef{title}{\the\toks0 }%
+      \immediate \writexrdef{snt}{\csname #2\endcsname}% \Ynumbered etc.
+      \safewhatsit{\writexrdef{pg}{\folio}}% will be written later, at \shipout
+    }%
+  \fi
+}
+
+% @xrefautosectiontitle on|off says whether @section(ing) names are used
+% automatically in xrefs, if the third arg is not explicitly specified.
+% This was provided as a "secret" @set xref-automatic-section-title
+% variable, now it's official.
+% 
+\parseargdef\xrefautomaticsectiontitle{%
+  \def\temp{#1}%
+  \ifx\temp\onword
+    \expandafter\let\csname SETxref-automatic-section-title\endcsname
+      = \empty
+  \else\ifx\temp\offword
+    \expandafter\let\csname SETxref-automatic-section-title\endcsname
+      = \relax
+  \else
+    \errhelp = \EMsimple
+    \errmessage{Unknown @xrefautomaticsectiontitle value `\temp',
+                must be on|off}%
+  \fi\fi
+}
+
+% 

+% @xref, @pxref, and @ref generate cross-references.  For \xrefX, #1 is
+% the node name, #2 the name of the Info cross-reference, #3 the printed
+% node name, #4 the name of the Info file, #5 the name of the printed
+% manual.  All but the node name can be omitted.
+%
+\def\pxref#1{\putwordsee{} \xrefX[#1,,,,,,,]}
+\def\xref#1{\putwordSee{} \xrefX[#1,,,,,,,]}
+\def\ref#1{\xrefX[#1,,,,,,,]}
+%
+\newbox\toprefbox
+\newbox\printedrefnamebox
+\newbox\infofilenamebox
+\newbox\printedmanualbox
+%
+\def\xrefX[#1,#2,#3,#4,#5,#6]{\begingroup
+  \unsepspaces
+  %
+  % Get args without leading/trailing spaces.
+  \def\printedrefname{\ignorespaces #3}%
+  \setbox\printedrefnamebox = \hbox{\printedrefname\unskip}%
+  %
+  \def\infofilename{\ignorespaces #4}%
+  \setbox\infofilenamebox = \hbox{\infofilename\unskip}%
+  %
+  \def\printedmanual{\ignorespaces #5}%
+  \setbox\printedmanualbox  = \hbox{\printedmanual\unskip}%
+  %
+  % If the printed reference name (arg #3) was not explicitly given in
+  % the @xref, figure out what we want to use.
+  \ifdim \wd\printedrefnamebox = 0pt
+    % No printed node name was explicitly given.
+    \expandafter\ifx\csname SETxref-automatic-section-title\endcsname \relax
+      % Not auto section-title: use node name inside the square brackets.
+      \def\printedrefname{\ignorespaces #1}%
+    \else
+      % Auto section-title: use chapter/section title inside
+      % the square brackets if we have it.
+      \ifdim \wd\printedmanualbox > 0pt
+        % It is in another manual, so we don't have it; use node name.
+        \def\printedrefname{\ignorespaces #1}%
+      \else
+        \ifhavexrefs
+          % We (should) know the real title if we have the xref values.
+          \def\printedrefname{\refx{#1-title}{}}%
+        \else
+          % Otherwise just copy the Info node name.
+          \def\printedrefname{\ignorespaces #1}%
+        \fi%
+      \fi
+    \fi
+  \fi
+  %
+  % Make link in pdf output.
+  \ifpdf
+    {\indexnofonts
+     \turnoffactive
+     \makevalueexpandable
+     % This expands tokens, so do it after making catcode changes, so _
+     % etc. don't get their TeX definitions.  This ignores all spaces in
+     % #4, including (wrongly) those in the middle of the filename.
+     \getfilename{#4}%
+     %
+     % This (wrongly) does not take account of leading or trailing
+     % spaces in #1, which should be ignored.
+     \edef\pdfxrefdest{#1}%
+     \ifx\pdfxrefdest\empty
+       \def\pdfxrefdest{Top}% no empty targets
+     \else
+       \txiescapepdf\pdfxrefdest  % escape PDF special chars
+     \fi
+     %
+     \leavevmode
+     \startlink attr{/Border [0 0 0]}%
+     \ifnum\filenamelength>0
+       goto file{\the\filename.pdf} name{\pdfxrefdest}%
+     \else
+       goto name{\pdfmkpgn{\pdfxrefdest}}%
+     \fi
+    }%
+    \setcolor{\linkcolor}%
+  \fi
+  %
+  % Float references are printed completely differently: "Figure 1.2"
+  % instead of "[somenode], p.3".  We distinguish them by the
+  % LABEL-title being set to a magic string.
+  {%
+    % Have to otherify everything special to allow the \csname to
+    % include an _ in the xref name, etc.
+    \indexnofonts
+    \turnoffactive
+    \expandafter\global\expandafter\let\expandafter\Xthisreftitle
+      \csname XR#1-title\endcsname
+  }%
+  \iffloat\Xthisreftitle
+    % If the user specified the print name (third arg) to the ref,
+    % print it instead of our usual "Figure 1.2".
+    \ifdim\wd\printedrefnamebox = 0pt
+      \refx{#1-snt}{}%
+    \else
+      \printedrefname
+    \fi
+    %
+    % If the user also gave the printed manual name (fifth arg), append
+    % "in MANUALNAME".
+    \ifdim \wd\printedmanualbox > 0pt
+      \space \putwordin{} \cite{\printedmanual}%
+    \fi
+  \else
+    % node/anchor (non-float) references.
+    % 
+    % If we use \unhbox to print the node names, TeX does not insert
+    % empty discretionaries after hyphens, which means that it will not
+    % find a line break at a hyphen in a node names.  Since some manuals
+    % are best written with fairly long node names, containing hyphens,
+    % this is a loss.  Therefore, we give the text of the node name
+    % again, so it is as if TeX is seeing it for the first time.
+    % 
+    \ifdim \wd\printedmanualbox > 0pt
+      % Cross-manual reference with a printed manual name.
+      % 
+      \crossmanualxref{\cite{\printedmanual\unskip}}%
+    %
+    \else\ifdim \wd\infofilenamebox > 0pt
+      % Cross-manual reference with only an info filename (arg 4), no
+      % printed manual name (arg 5).  This is essentially the same as
+      % the case above; we output the filename, since we have nothing else.
+      % 
+      \crossmanualxref{\code{\infofilename\unskip}}%
+    %
+    \else
+      % Reference within this manual.
+      %
+      % _ (for example) has to be the character _ for the purposes of the
+      % control sequence corresponding to the node, but it has to expand
+      % into the usual \leavevmode...\vrule stuff for purposes of
+      % printing. So we \turnoffactive for the \refx-snt, back on for the
+      % printing, back off for the \refx-pg.
+      {\turnoffactive
+       % Only output a following space if the -snt ref is nonempty; for
+       % @unnumbered and @anchor, it won't be.
+       \setbox2 = \hbox{\ignorespaces \refx{#1-snt}{}}%
+       \ifdim \wd2 > 0pt \refx{#1-snt}\space\fi
+      }%
+      % output the `[mynode]' via the macro below so it can be overridden.
+      \xrefprintnodename\printedrefname
+      %
+      % But we always want a comma and a space:
+      ,\space
+      %
+      % output the `page 3'.
+      \turnoffactive \putwordpage\tie\refx{#1-pg}{}%
+    \fi\fi
+  \fi
+  \endlink
+\endgroup}
+
+% Output a cross-manual xref to #1.  Used just above (twice).
+% 
+% Only include the text "Section ``foo'' in" if the foo is neither
+% missing or Top.  Thus, @xref{,,,foo,The Foo Manual} outputs simply
+% "see The Foo Manual", the idea being to refer to the whole manual.
+% 
+% But, this being TeX, we can't easily compare our node name against the
+% string "Top" while ignoring the possible spaces before and after in
+% the input.  By adding the arbitrary 7sp below, we make it much less
+% likely that a real node name would have the same width as "Top" (e.g.,
+% in a monospaced font).  Hopefully it will never happen in practice.
+% 
+% For the same basic reason, we retypeset the "Top" at every
+% reference, since the current font is indeterminate.
+% 
+\def\crossmanualxref#1{%
+  \setbox\toprefbox = \hbox{Top\kern7sp}%
+  \setbox2 = \hbox{\ignorespaces \printedrefname \unskip \kern7sp}%
+  \ifdim \wd2 > 7sp  % nonempty?
+    \ifdim \wd2 = \wd\toprefbox \else  % same as Top?
+      \putwordSection{} ``\printedrefname'' \putwordin{}\space
+    \fi
+  \fi
+  #1%
+}
+
+% This macro is called from \xrefX for the `[nodename]' part of xref
+% output.  It's a separate macro only so it can be changed more easily,
+% since square brackets don't work well in some documents.  Particularly
+% one that Bob is working on :).
+%
+\def\xrefprintnodename#1{[#1]}
+
+% Things referred to by \setref.
+%
+\def\Ynothing{}
+\def\Yomitfromtoc{}
+\def\Ynumbered{%
+  \ifnum\secno=0
+    \putwordChapter at tie \the\chapno
+  \else \ifnum\subsecno=0
+    \putwordSection at tie \the\chapno.\the\secno
+  \else \ifnum\subsubsecno=0
+    \putwordSection at tie \the\chapno.\the\secno.\the\subsecno
+  \else
+    \putwordSection at tie \the\chapno.\the\secno.\the\subsecno.\the\subsubsecno
+  \fi\fi\fi
+}
+\def\Yappendix{%
+  \ifnum\secno=0
+     \putwordAppendix at tie @char\the\appendixno{}%
+  \else \ifnum\subsecno=0
+     \putwordSection at tie @char\the\appendixno.\the\secno
+  \else \ifnum\subsubsecno=0
+    \putwordSection at tie @char\the\appendixno.\the\secno.\the\subsecno
+  \else
+    \putwordSection at tie
+      @char\the\appendixno.\the\secno.\the\subsecno.\the\subsubsecno
+  \fi\fi\fi
+}
+
+% Define \refx{NAME}{SUFFIX} to reference a cross-reference string named NAME.
+% If its value is nonempty, SUFFIX is output afterward.
+%
+\def\refx#1#2{%
+  {%
+    \indexnofonts
+    \otherbackslash
+    \expandafter\global\expandafter\let\expandafter\thisrefX
+      \csname XR#1\endcsname
+  }%
+  \ifx\thisrefX\relax
+    % If not defined, say something at least.
+    \angleleft un\-de\-fined\angleright
+    \iflinks
+      \ifhavexrefs
+        {\toks0 = {#1}% avoid expansion of possibly-complex value
+         \message{\linenumber Undefined cross reference `\the\toks0'.}}%
+      \else
+        \ifwarnedxrefs\else
+          \global\warnedxrefstrue
+          \message{Cross reference values unknown; you must run TeX again.}%
+        \fi
+      \fi
+    \fi
+  \else
+    % It's defined, so just use it.
+    \thisrefX
+  \fi
+  #2% Output the suffix in any case.
+}
+
+% This is the macro invoked by entries in the aux file.  Usually it's
+% just a \def (we prepend XR to the control sequence name to avoid
+% collisions).  But if this is a float type, we have more work to do.
+%
+\def\xrdef#1#2{%
+  {% The node name might contain 8-bit characters, which in our current
+   % implementation are changed to commands like @'e.  Don't let these
+   % mess up the control sequence name.
+    \indexnofonts
+    \turnoffactive
+    \xdef\safexrefname{#1}%
+  }%
+  %
+  \expandafter\gdef\csname XR\safexrefname\endcsname{#2}% remember this xref
+  %
+  % Was that xref control sequence that we just defined for a float?
+  \expandafter\iffloat\csname XR\safexrefname\endcsname
+    % it was a float, and we have the (safe) float type in \iffloattype.
+    \expandafter\let\expandafter\floatlist
+      \csname floatlist\iffloattype\endcsname
+    %
+    % Is this the first time we've seen this float type?
+    \expandafter\ifx\floatlist\relax
+      \toks0 = {\do}% yes, so just \do
+    \else
+      % had it before, so preserve previous elements in list.
+      \toks0 = \expandafter{\floatlist\do}%
+    \fi
+    %
+    % Remember this xref in the control sequence \floatlistFLOATTYPE,
+    % for later use in \listoffloats.
+    \expandafter\xdef\csname floatlist\iffloattype\endcsname{\the\toks0
+      {\safexrefname}}%
+  \fi
+}
+
+% Read the last existing aux file, if any.  No error if none exists.
+%
+\def\tryauxfile{%
+  \openin 1 \jobname.aux
+  \ifeof 1 \else
+    \readdatafile{aux}%
+    \global\havexrefstrue
+  \fi
+  \closein 1
+}
+
+\def\setupdatafile{%
+  \catcode`\^^@=\other
+  \catcode`\^^A=\other
+  \catcode`\^^B=\other
+  \catcode`\^^C=\other
+  \catcode`\^^D=\other
+  \catcode`\^^E=\other
+  \catcode`\^^F=\other
+  \catcode`\^^G=\other
+  \catcode`\^^H=\other
+  \catcode`\^^K=\other
+  \catcode`\^^L=\other
+  \catcode`\^^N=\other
+  \catcode`\^^P=\other
+  \catcode`\^^Q=\other
+  \catcode`\^^R=\other
+  \catcode`\^^S=\other
+  \catcode`\^^T=\other
+  \catcode`\^^U=\other
+  \catcode`\^^V=\other
+  \catcode`\^^W=\other
+  \catcode`\^^X=\other
+  \catcode`\^^Z=\other
+  \catcode`\^^[=\other
+  \catcode`\^^\=\other
+  \catcode`\^^]=\other
+  \catcode`\^^^=\other
+  \catcode`\^^_=\other
+  % It was suggested to set the catcode of ^ to 7, which would allow ^^e4 etc.
+  % in xref tags, i.e., node names.  But since ^^e4 notation isn't
+  % supported in the main text, it doesn't seem desirable.  Furthermore,
+  % that is not enough: for node names that actually contain a ^
+  % character, we would end up writing a line like this: 'xrdef {'hat
+  % b-title}{'hat b} and \xrdef does a \csname...\endcsname on the first
+  % argument, and \hat is not an expandable control sequence.  It could
+  % all be worked out, but why?  Either we support ^^ or we don't.
+  %
+  % The other change necessary for this was to define \auxhat:
+  % \def\auxhat{\def^{'hat }}% extra space so ok if followed by letter
+  % and then to call \auxhat in \setq.
+  %
+  \catcode`\^=\other
+  %
+  % Special characters.  Should be turned off anyway, but...
+  \catcode`\~=\other
+  \catcode`\[=\other
+  \catcode`\]=\other
+  \catcode`\"=\other
+  \catcode`\_=\other
+  \catcode`\|=\other
+  \catcode`\<=\other
+  \catcode`\>=\other
+  \catcode`\$=\other
+  \catcode`\#=\other
+  \catcode`\&=\other
+  \catcode`\%=\other
+  \catcode`+=\other % avoid \+ for paranoia even though we've turned it off
+  %
+  % This is to support \ in node names and titles, since the \
+  % characters end up in a \csname.  It's easier than
+  % leaving it active and making its active definition an actual \
+  % character.  What I don't understand is why it works in the *value*
+  % of the xrdef.  Seems like it should be a catcode12 \, and that
+  % should not typeset properly.  But it works, so I'm moving on for
+  % now.  --karl, 15jan04.
+  \catcode`\\=\other
+  %
+  % Make the characters 128-255 be printing characters.
+  {%
+    \count1=128
+    \def\loop{%
+      \catcode\count1=\other
+      \advance\count1 by 1
+      \ifnum \count1<256 \loop \fi
+    }%
+  }%
+  %
+  % @ is our escape character in .aux files, and we need braces.
+  \catcode`\{=1
+  \catcode`\}=2
+  \catcode`\@=0
+}
+
+\def\readdatafile#1{%
+\begingroup
+  \setupdatafile
+  \input\jobname.#1
+\endgroup}
+
+
+\message{insertions,}
+% including footnotes.
+
+\newcount \footnoteno
+
+% The trailing space in the following definition for supereject is
+% vital for proper filling; pages come out unaligned when you do a
+% pagealignmacro call if that space before the closing brace is
+% removed. (Generally, numeric constants should always be followed by a
+% space to prevent strange expansion errors.)
+\def\supereject{\par\penalty -20000\footnoteno =0 }
+
+% @footnotestyle is meaningful for Info output only.
+\let\footnotestyle=\comment
+
+{\catcode `\@=11
+%
+% Auto-number footnotes.  Otherwise like plain.
+\gdef\footnote{%
+  \let\indent=\ptexindent
+  \let\noindent=\ptexnoindent
+  \global\advance\footnoteno by \@ne
+  \edef\thisfootno{$^{\the\footnoteno}$}%
+  %
+  % In case the footnote comes at the end of a sentence, preserve the
+  % extra spacing after we do the footnote number.
+  \let\@sf\empty
+  \ifhmode\edef\@sf{\spacefactor\the\spacefactor}\ptexslash\fi
+  %
+  % Remove inadvertent blank space before typesetting the footnote number.
+  \unskip
+  \thisfootno\@sf
+  \dofootnote
+}%
+
+% Don't bother with the trickery in plain.tex to not require the
+% footnote text as a parameter.  Our footnotes don't need to be so general.
+%
+% Oh yes, they do; otherwise, @ifset (and anything else that uses
+% \parseargline) fails inside footnotes because the tokens are fixed when
+% the footnote is read.  --karl, 16nov96.
+%
+\gdef\dofootnote{%
+  \insert\footins\bgroup
+  % We want to typeset this text as a normal paragraph, even if the
+  % footnote reference occurs in (for example) a display environment.
+  % So reset some parameters.
+  \hsize=\pagewidth
+  \interlinepenalty\interfootnotelinepenalty
+  \splittopskip\ht\strutbox % top baseline for broken footnotes
+  \splitmaxdepth\dp\strutbox
+  \floatingpenalty\@MM
+  \leftskip\z at skip
+  \rightskip\z at skip
+  \spaceskip\z at skip
+  \xspaceskip\z at skip
+  \parindent\defaultparindent
+  %
+  \smallfonts \rm
+  %
+  % Because we use hanging indentation in footnotes, a @noindent appears
+  % to exdent this text, so make it be a no-op.  makeinfo does not use
+  % hanging indentation so @noindent can still be needed within footnote
+  % text after an @example or the like (not that this is good style).
+  \let\noindent = \relax
+  %
+  % Hang the footnote text off the number.  Use \everypar in case the
+  % footnote extends for more than one paragraph.
+  \everypar = {\hang}%
+  \textindent{\thisfootno}%
+  %
+  % Don't crash into the line above the footnote text.  Since this
+  % expands into a box, it must come within the paragraph, lest it
+  % provide a place where TeX can split the footnote.
+  \footstrut
+  %
+  % Invoke rest of plain TeX footnote routine.
+  \futurelet\next\fo at t
+}
+}%end \catcode `\@=11
+
+% In case a @footnote appears in a vbox, save the footnote text and create
+% the real \insert just after the vbox finished.  Otherwise, the insertion
+% would be lost.
+% Similarly, if a @footnote appears inside an alignment, save the footnote
+% text to a box and make the \insert when a row of the table is finished.
+% And the same can be done for other insert classes.  --kasal, 16nov03.
+
+% Replace the \insert primitive by a cheating macro.
+% Deeper inside, just make sure that the saved insertions are not spilled
+% out prematurely.
+%
+\def\startsavinginserts{%
+  \ifx \insert\ptexinsert
+    \let\insert\saveinsert
+  \else
+    \let\checkinserts\relax
+  \fi
+}
+
+% This \insert replacement works for both \insert\footins{foo} and
+% \insert\footins\bgroup foo\egroup, but it doesn't work for \insert27{foo}.
+%
+\def\saveinsert#1{%
+  \edef\next{\noexpand\savetobox \makeSAVEname#1}%
+  \afterassignment\next
+  % swallow the left brace
+  \let\temp =
+}
+\def\makeSAVEname#1{\makecsname{SAVE\expandafter\gobble\string#1}}
+\def\savetobox#1{\global\setbox#1 = \vbox\bgroup \unvbox#1}
+
+\def\checksaveins#1{\ifvoid#1\else \placesaveins#1\fi}
+
+\def\placesaveins#1{%
+  \ptexinsert \csname\expandafter\gobblesave\string#1\endcsname
+    {\box#1}%
+}
+
+% eat @SAVE -- beware, all of them have catcode \other:
+{
+  \def\dospecials{\do S\do A\do V\do E} \uncatcodespecials  %  ;-)
+  \gdef\gobblesave @SAVE{}
+}
+
+% initialization:
+\def\newsaveins #1{%
+  \edef\next{\noexpand\newsaveinsX \makeSAVEname#1}%
+  \next
+}
+\def\newsaveinsX #1{%
+  \csname newbox\endcsname #1%
+  \expandafter\def\expandafter\checkinserts\expandafter{\checkinserts
+    \checksaveins #1}%
+}
+
+% initialize:
+\let\checkinserts\empty
+\newsaveins\footins
+\newsaveins\margin
+
+
+% @image.  We use the macros from epsf.tex to support this.
+% If epsf.tex is not installed and @image is used, we complain.
+%
+% Check for and read epsf.tex up front.  If we read it only at @image
+% time, we might be inside a group, and then its definitions would get
+% undone and the next image would fail.
+\openin 1 = epsf.tex
+\ifeof 1 \else
+  % Do not bother showing banner with epsf.tex v2.7k (available in
+  % doc/epsf.tex and on ctan).
+  \def\epsfannounce{\toks0 = }%
+  \input epsf.tex
+\fi
+\closein 1
+%
+% We will only complain once about lack of epsf.tex.
+\newif\ifwarnednoepsf
+\newhelp\noepsfhelp{epsf.tex must be installed for images to
+  work.  It is also included in the Texinfo distribution, or you can get
+  it from ftp://tug.org/tex/epsf.tex.}
+%
+\def\image#1{%
+  \ifx\epsfbox\thisisundefined
+    \ifwarnednoepsf \else
+      \errhelp = \noepsfhelp
+      \errmessage{epsf.tex not found, images will be ignored}%
+      \global\warnednoepsftrue
+    \fi
+  \else
+    \imagexxx #1,,,,,\finish
+  \fi
+}
+%
+% Arguments to @image:
+% #1 is (mandatory) image filename; we tack on .eps extension.
+% #2 is (optional) width, #3 is (optional) height.
+% #4 is (ignored optional) html alt text.
+% #5 is (ignored optional) extension.
+% #6 is just the usual extra ignored arg for parsing stuff.
+\newif\ifimagevmode
+\def\imagexxx#1,#2,#3,#4,#5,#6\finish{\begingroup
+  \catcode`\^^M = 5     % in case we're inside an example
+  \normalturnoffactive  % allow _ et al. in names
+  % If the image is by itself, center it.
+  \ifvmode
+    \imagevmodetrue
+  \else \ifx\centersub\centerV
+    % for @center @image, we need a vbox so we can have our vertical space
+    \imagevmodetrue
+    \vbox\bgroup % vbox has better behavior than vtop herev
+  \fi\fi
+  %
+  \ifimagevmode
+    \nobreak\medskip
+    % Usually we'll have text after the image which will insert
+    % \parskip glue, so insert it here too to equalize the space
+    % above and below.
+    \nobreak\vskip\parskip
+    \nobreak
+  \fi
+  %
+  % Leave vertical mode so that indentation from an enclosing
+  %  environment such as @quotation is respected.
+  % However, if we're at the top level, we don't want the
+  %  normal paragraph indentation.
+  % On the other hand, if we are in the case of @center @image, we don't
+  %  want to start a paragraph, which will create a hsize-width box and
+  %  eradicate the centering.
+  \ifx\centersub\centerV\else \noindent \fi
+  %
+  % Output the image.
+  \ifpdf
+    \dopdfimage{#1}{#2}{#3}%
+  \else
+    % \epsfbox itself resets \epsf?size at each figure.
+    \setbox0 = \hbox{\ignorespaces #2}\ifdim\wd0 > 0pt \epsfxsize=#2\relax \fi
+    \setbox0 = \hbox{\ignorespaces #3}\ifdim\wd0 > 0pt \epsfysize=#3\relax \fi
+    \epsfbox{#1.eps}%
+  \fi
+  %
+  \ifimagevmode
+    \medskip  % space after a standalone image
+  \fi  
+  \ifx\centersub\centerV \egroup \fi
+\endgroup}
+
+
+% @float FLOATTYPE,LABEL,LOC ... @end float for displayed figures, tables,
+% etc.  We don't actually implement floating yet, we always include the
+% float "here".  But it seemed the best name for the future.
+%
+\envparseargdef\float{\eatcommaspace\eatcommaspace\dofloat#1, , ,\finish}
+
+% There may be a space before second and/or third parameter; delete it.
+\def\eatcommaspace#1, {#1,}
+
+% #1 is the optional FLOATTYPE, the text label for this float, typically
+% "Figure", "Table", "Example", etc.  Can't contain commas.  If omitted,
+% this float will not be numbered and cannot be referred to.
+%
+% #2 is the optional xref label.  Also must be present for the float to
+% be referable.
+%
+% #3 is the optional positioning argument; for now, it is ignored.  It
+% will somehow specify the positions allowed to float to (here, top, bottom).
+%
+% We keep a separate counter for each FLOATTYPE, which we reset at each
+% chapter-level command.
+\let\resetallfloatnos=\empty
+%
+\def\dofloat#1,#2,#3,#4\finish{%
+  \let\thiscaption=\empty
+  \let\thisshortcaption=\empty
+  %
+  % don't lose footnotes inside @float.
+  %
+  % BEWARE: when the floats start float, we have to issue warning whenever an
+  % insert appears inside a float which could possibly float. --kasal, 26may04
+  %
+  \startsavinginserts
+  %
+  % We can't be used inside a paragraph.
+  \par
+  %
+  \vtop\bgroup
+    \def\floattype{#1}%
+    \def\floatlabel{#2}%
+    \def\floatloc{#3}% we do nothing with this yet.
+    %
+    \ifx\floattype\empty
+      \let\safefloattype=\empty
+    \else
+      {%
+        % the floattype might have accents or other special characters,
+        % but we need to use it in a control sequence name.
+        \indexnofonts
+        \turnoffactive
+        \xdef\safefloattype{\floattype}%
+      }%
+    \fi
+    %
+    % If label is given but no type, we handle that as the empty type.
+    \ifx\floatlabel\empty \else
+      % We want each FLOATTYPE to be numbered separately (Figure 1,
+      % Table 1, Figure 2, ...).  (And if no label, no number.)
+      %
+      \expandafter\getfloatno\csname\safefloattype floatno\endcsname
+      \global\advance\floatno by 1
+      %
+      {%
+        % This magic value for \lastsection is output by \setref as the
+        % XREFLABEL-title value.  \xrefX uses it to distinguish float
+        % labels (which have a completely different output format) from
+        % node and anchor labels.  And \xrdef uses it to construct the
+        % lists of floats.
+        %
+        \edef\lastsection{\floatmagic=\safefloattype}%
+        \setref{\floatlabel}{Yfloat}%
+      }%
+    \fi
+    %
+    % start with \parskip glue, I guess.
+    \vskip\parskip
+    %
+    % Don't suppress indentation if a float happens to start a section.
+    \restorefirstparagraphindent
+}
+
+% we have these possibilities:
+% @float Foo,lbl & @caption{Cap}: Foo 1.1: Cap
+% @float Foo,lbl & no caption:    Foo 1.1
+% @float Foo & @caption{Cap}:     Foo: Cap
+% @float Foo & no caption:        Foo
+% @float ,lbl & Caption{Cap}:     1.1: Cap
+% @float ,lbl & no caption:       1.1
+% @float & @caption{Cap}:         Cap
+% @float & no caption:
+%
+\def\Efloat{%
+    \let\floatident = \empty
+    %
+    % In all cases, if we have a float type, it comes first.
+    \ifx\floattype\empty \else \def\floatident{\floattype}\fi
+    %
+    % If we have an xref label, the number comes next.
+    \ifx\floatlabel\empty \else
+      \ifx\floattype\empty \else % if also had float type, need tie first.
+        \appendtomacro\floatident{\tie}%
+      \fi
+      % the number.
+      \appendtomacro\floatident{\chaplevelprefix\the\floatno}%
+    \fi
+    %
+    % Start the printed caption with what we've constructed in
+    % \floatident, but keep it separate; we need \floatident again.
+    \let\captionline = \floatident
+    %
+    \ifx\thiscaption\empty \else
+      \ifx\floatident\empty \else
+	\appendtomacro\captionline{: }% had ident, so need a colon between
+      \fi
+      %
+      % caption text.
+      \appendtomacro\captionline{\scanexp\thiscaption}%
+    \fi
+    %
+    % If we have anything to print, print it, with space before.
+    % Eventually this needs to become an \insert.
+    \ifx\captionline\empty \else
+      \vskip.5\parskip
+      \captionline
+      %
+      % Space below caption.
+      \vskip\parskip
+    \fi
+    %
+    % If have an xref label, write the list of floats info.  Do this
+    % after the caption, to avoid chance of it being a breakpoint.
+    \ifx\floatlabel\empty \else
+      % Write the text that goes in the lof to the aux file as
+      % \floatlabel-lof.  Besides \floatident, we include the short
+      % caption if specified, else the full caption if specified, else nothing.
+      {%
+        \atdummies
+        %
+        % since we read the caption text in the macro world, where ^^M
+        % is turned into a normal character, we have to scan it back, so
+        % we don't write the literal three characters "^^M" into the aux file.
+	\scanexp{%
+	  \xdef\noexpand\gtemp{%
+	    \ifx\thisshortcaption\empty
+	      \thiscaption
+	    \else
+	      \thisshortcaption
+	    \fi
+	  }%
+	}%
+        \immediate\write\auxfile{@xrdef{\floatlabel-lof}{\floatident
+	  \ifx\gtemp\empty \else : \gtemp \fi}}%
+      }%
+    \fi
+  \egroup  % end of \vtop
+  %
+  % place the captured inserts
+  %
+  % BEWARE: when the floats start floating, we have to issue warning
+  % whenever an insert appears inside a float which could possibly
+  % float. --kasal, 26may04
+  %
+  \checkinserts
+}
+
+% Append the tokens #2 to the definition of macro #1, not expanding either.
+%
+\def\appendtomacro#1#2{%
+  \expandafter\def\expandafter#1\expandafter{#1#2}%
+}
+
+% @caption, @shortcaption
+%
+\def\caption{\docaption\thiscaption}
+\def\shortcaption{\docaption\thisshortcaption}
+\def\docaption{\checkenv\float \bgroup\scanargctxt\defcaption}
+\def\defcaption#1#2{\egroup \def#1{#2}}
+
+% The parameter is the control sequence identifying the counter we are
+% going to use.  Create it if it doesn't exist and assign it to \floatno.
+\def\getfloatno#1{%
+  \ifx#1\relax
+      % Haven't seen this figure type before.
+      \csname newcount\endcsname #1%
+      %
+      % Remember to reset this floatno at the next chap.
+      \expandafter\gdef\expandafter\resetallfloatnos
+        \expandafter{\resetallfloatnos #1=0 }%
+  \fi
+  \let\floatno#1%
+}
+
+% \setref calls this to get the XREFLABEL-snt value.  We want an @xref
+% to the FLOATLABEL to expand to "Figure 3.1".  We call \setref when we
+% first read the @float command.
+%
+\def\Yfloat{\floattype at tie \chaplevelprefix\the\floatno}%
+
+% Magic string used for the XREFLABEL-title value, so \xrefX can
+% distinguish floats from other xref types.
+\def\floatmagic{!!float!!}
+
+% #1 is the control sequence we are passed; we expand into a conditional
+% which is true if #1 represents a float ref.  That is, the magic
+% \lastsection value which we \setref above.
+%
+\def\iffloat#1{\expandafter\doiffloat#1==\finish}
+%
+% #1 is (maybe) the \floatmagic string.  If so, #2 will be the
+% (safe) float type for this float.  We set \iffloattype to #2.
+%
+\def\doiffloat#1=#2=#3\finish{%
+  \def\temp{#1}%
+  \def\iffloattype{#2}%
+  \ifx\temp\floatmagic
+}
+
+% @listoffloats FLOATTYPE - print a list of floats like a table of contents.
+%
+\parseargdef\listoffloats{%
+  \def\floattype{#1}% floattype
+  {%
+    % the floattype might have accents or other special characters,
+    % but we need to use it in a control sequence name.
+    \indexnofonts
+    \turnoffactive
+    \xdef\safefloattype{\floattype}%
+  }%
+  %
+  % \xrdef saves the floats as a \do-list in \floatlistSAFEFLOATTYPE.
+  \expandafter\ifx\csname floatlist\safefloattype\endcsname \relax
+    \ifhavexrefs
+      % if the user said @listoffloats foo but never @float foo.
+      \message{\linenumber No `\safefloattype' floats to list.}%
+    \fi
+  \else
+    \begingroup
+      \leftskip=\tocindent  % indent these entries like a toc
+      \let\do=\listoffloatsdo
+      \csname floatlist\safefloattype\endcsname
+    \endgroup
+  \fi
+}
+
+% This is called on each entry in a list of floats.  We're passed the
+% xref label, in the form LABEL-title, which is how we save it in the
+% aux file.  We strip off the -title and look up \XRLABEL-lof, which
+% has the text we're supposed to typeset here.
+%
+% Figures without xref labels will not be included in the list (since
+% they won't appear in the aux file).
+%
+\def\listoffloatsdo#1{\listoffloatsdoentry#1\finish}
+\def\listoffloatsdoentry#1-title\finish{{%
+  % Can't fully expand XR#1-lof because it can contain anything.  Just
+  % pass the control sequence.  On the other hand, XR#1-pg is just the
+  % page number, and we want to fully expand that so we can get a link
+  % in pdf output.
+  \toksA = \expandafter{\csname XR#1-lof\endcsname}%
+  %
+  % use the same \entry macro we use to generate the TOC and index.
+  \edef\writeentry{\noexpand\entry{\the\toksA}{\csname XR#1-pg\endcsname}}%
+  \writeentry
+}}
+
+
+\message{localization,}
+
+% For single-language documents, @documentlanguage is usually given very
+% early, just after @documentencoding.  Single argument is the language
+% (de) or locale (de_DE) abbreviation.
+%
+{
+  \catcode`\_ = \active
+  \globaldefs=1
+\parseargdef\documentlanguage{\begingroup
+  \let_=\normalunderscore  % normal _ character for filenames
+  \tex % read txi-??.tex file in plain TeX.
+    % Read the file by the name they passed if it exists.
+    \openin 1 txi-#1.tex
+    \ifeof 1
+      \documentlanguagetrywithoutunderscore{#1_\finish}%
+    \else
+      \globaldefs = 1  % everything in the txi-LL files needs to persist
+      \input txi-#1.tex
+    \fi
+    \closein 1
+  \endgroup % end raw TeX
+\endgroup}
+%
+% If they passed de_DE, and txi-de_DE.tex doesn't exist,
+% try txi-de.tex.
+%
+\gdef\documentlanguagetrywithoutunderscore#1_#2\finish{%
+  \openin 1 txi-#1.tex
+  \ifeof 1
+    \errhelp = \nolanghelp
+    \errmessage{Cannot read language file txi-#1.tex}%
+  \else
+    \globaldefs = 1  % everything in the txi-LL files needs to persist
+    \input txi-#1.tex
+  \fi
+  \closein 1
+}
+}% end of special _ catcode
+%
+\newhelp\nolanghelp{The given language definition file cannot be found or
+is empty.  Maybe you need to install it?  Putting it in the current
+directory should work if nowhere else does.}
+
+% This macro is called from txi-??.tex files; the first argument is the
+% \language name to set (without the "\lang@" prefix), the second and
+% third args are \{left,right}hyphenmin.
+%
+% The language names to pass are determined when the format is built.
+% See the etex.log file created at that time, e.g.,
+% /usr/local/texlive/2008/texmf-var/web2c/pdftex/etex.log.
+%
+% With TeX Live 2008, etex now includes hyphenation patterns for all
+% available languages.  This means we can support hyphenation in
+% Texinfo, at least to some extent.  (This still doesn't solve the
+% accented characters problem.)
+%
+\catcode`@=11
+\def\txisetlanguage#1#2#3{%
+  % do not set the language if the name is undefined in the current TeX.
+  \expandafter\ifx\csname lang@#1\endcsname \relax
+    \message{no patterns for #1}%
+  \else
+    \global\language = \csname lang@#1\endcsname
+  \fi
+  % but there is no harm in adjusting the hyphenmin values regardless.
+  \global\lefthyphenmin = #2\relax
+  \global\righthyphenmin = #3\relax
+}
+
+% Helpers for encodings.
+% Set the catcode of characters 128 through 255 to the specified number.
+%
+\def\setnonasciicharscatcode#1{%
+   \count255=128
+   \loop\ifnum\count255<256
+      \global\catcode\count255=#1\relax
+      \advance\count255 by 1
+   \repeat
+}
+
+\def\setnonasciicharscatcodenonglobal#1{%
+   \count255=128
+   \loop\ifnum\count255<256
+      \catcode\count255=#1\relax
+      \advance\count255 by 1
+   \repeat
+}
+
+% @documentencoding sets the definition of non-ASCII characters
+% according to the specified encoding.
+%
+\parseargdef\documentencoding{%
+  % Encoding being declared for the document.
+  \def\declaredencoding{\csname #1.enc\endcsname}%
+  %
+  % Supported encodings: names converted to tokens in order to be able
+  % to compare them with \ifx.
+  \def\ascii{\csname US-ASCII.enc\endcsname}%
+  \def\latnine{\csname ISO-8859-15.enc\endcsname}%
+  \def\latone{\csname ISO-8859-1.enc\endcsname}%
+  \def\lattwo{\csname ISO-8859-2.enc\endcsname}%
+  \def\utfeight{\csname UTF-8.enc\endcsname}%
+  %
+  \ifx \declaredencoding \ascii
+     \asciichardefs
+  %
+  \else \ifx \declaredencoding \lattwo
+     \setnonasciicharscatcode\active
+     \lattwochardefs
+  %
+  \else \ifx \declaredencoding \latone
+     \setnonasciicharscatcode\active
+     \latonechardefs
+  %
+  \else \ifx \declaredencoding \latnine
+     \setnonasciicharscatcode\active
+     \latninechardefs
+  %
+  \else \ifx \declaredencoding \utfeight
+     \setnonasciicharscatcode\active
+     \utfeightchardefs
+  %
+  \else
+    \message{Unknown document encoding #1, ignoring.}%
+  %
+  \fi % utfeight
+  \fi % latnine
+  \fi % latone
+  \fi % lattwo
+  \fi % ascii
+}
+
+% A message to be logged when using a character that isn't available
+% the default font encoding (OT1).
+%
+\def\missingcharmsg#1{\message{Character missing in OT1 encoding: #1.}}
+
+% Take account of \c (plain) vs. \, (Texinfo) difference.
+\def\cedilla#1{\ifx\c\ptexc\c{#1}\else\,{#1}\fi}
+
+% First, make active non-ASCII characters in order for them to be
+% correctly categorized when TeX reads the replacement text of
+% macros containing the character definitions.
+\setnonasciicharscatcode\active
+%
+% Latin1 (ISO-8859-1) character definitions.
+\def\latonechardefs{%
+  \gdef^^a0{\tie}
+  \gdef^^a1{\exclamdown}
+  \gdef^^a2{\missingcharmsg{CENT SIGN}}
+  \gdef^^a3{{\pounds}}
+  \gdef^^a4{\missingcharmsg{CURRENCY SIGN}}
+  \gdef^^a5{\missingcharmsg{YEN SIGN}}
+  \gdef^^a6{\missingcharmsg{BROKEN BAR}}
+  \gdef^^a7{\S}
+  \gdef^^a8{\"{}}
+  \gdef^^a9{\copyright}
+  \gdef^^aa{\ordf}
+  \gdef^^ab{\guillemetleft}
+  \gdef^^ac{$\lnot$}
+  \gdef^^ad{\-}
+  \gdef^^ae{\registeredsymbol}
+  \gdef^^af{\={}}
+  %
+  \gdef^^b0{\textdegree}
+  \gdef^^b1{$\pm$}
+  \gdef^^b2{$^2$}
+  \gdef^^b3{$^3$}
+  \gdef^^b4{\'{}}
+  \gdef^^b5{$\mu$}
+  \gdef^^b6{\P}
+  %
+  \gdef^^b7{$^.$}
+  \gdef^^b8{\cedilla\ }
+  \gdef^^b9{$^1$}
+  \gdef^^ba{\ordm}
+  %
+  \gdef^^bb{\guillemetright}
+  \gdef^^bc{$1\over4$}
+  \gdef^^bd{$1\over2$}
+  \gdef^^be{$3\over4$}
+  \gdef^^bf{\questiondown}
+  %
+  \gdef^^c0{\`A}
+  \gdef^^c1{\'A}
+  \gdef^^c2{\^A}
+  \gdef^^c3{\~A}
+  \gdef^^c4{\"A}
+  \gdef^^c5{\ringaccent A}
+  \gdef^^c6{\AE}
+  \gdef^^c7{\cedilla C}
+  \gdef^^c8{\`E}
+  \gdef^^c9{\'E}
+  \gdef^^ca{\^E}
+  \gdef^^cb{\"E}
+  \gdef^^cc{\`I}
+  \gdef^^cd{\'I}
+  \gdef^^ce{\^I}
+  \gdef^^cf{\"I}
+  %
+  \gdef^^d0{\DH}
+  \gdef^^d1{\~N}
+  \gdef^^d2{\`O}
+  \gdef^^d3{\'O}
+  \gdef^^d4{\^O}
+  \gdef^^d5{\~O}
+  \gdef^^d6{\"O}
+  \gdef^^d7{$\times$}
+  \gdef^^d8{\O}
+  \gdef^^d9{\`U}
+  \gdef^^da{\'U}
+  \gdef^^db{\^U}
+  \gdef^^dc{\"U}
+  \gdef^^dd{\'Y}
+  \gdef^^de{\TH}
+  \gdef^^df{\ss}
+  %
+  \gdef^^e0{\`a}
+  \gdef^^e1{\'a}
+  \gdef^^e2{\^a}
+  \gdef^^e3{\~a}
+  \gdef^^e4{\"a}
+  \gdef^^e5{\ringaccent a}
+  \gdef^^e6{\ae}
+  \gdef^^e7{\cedilla c}
+  \gdef^^e8{\`e}
+  \gdef^^e9{\'e}
+  \gdef^^ea{\^e}
+  \gdef^^eb{\"e}
+  \gdef^^ec{\`{\dotless i}}
+  \gdef^^ed{\'{\dotless i}}
+  \gdef^^ee{\^{\dotless i}}
+  \gdef^^ef{\"{\dotless i}}
+  %
+  \gdef^^f0{\dh}
+  \gdef^^f1{\~n}
+  \gdef^^f2{\`o}
+  \gdef^^f3{\'o}
+  \gdef^^f4{\^o}
+  \gdef^^f5{\~o}
+  \gdef^^f6{\"o}
+  \gdef^^f7{$\div$}
+  \gdef^^f8{\o}
+  \gdef^^f9{\`u}
+  \gdef^^fa{\'u}
+  \gdef^^fb{\^u}
+  \gdef^^fc{\"u}
+  \gdef^^fd{\'y}
+  \gdef^^fe{\th}
+  \gdef^^ff{\"y}
+}
+
+% Latin9 (ISO-8859-15) encoding character definitions.
+\def\latninechardefs{%
+  % Encoding is almost identical to Latin1.
+  \latonechardefs
+  %
+  \gdef^^a4{\euro}
+  \gdef^^a6{\v S}
+  \gdef^^a8{\v s}
+  \gdef^^b4{\v Z}
+  \gdef^^b8{\v z}
+  \gdef^^bc{\OE}
+  \gdef^^bd{\oe}
+  \gdef^^be{\"Y}
+}
+
+% Latin2 (ISO-8859-2) character definitions.
+\def\lattwochardefs{%
+  \gdef^^a0{\tie}
+  \gdef^^a1{\ogonek{A}}
+  \gdef^^a2{\u{}}
+  \gdef^^a3{\L}
+  \gdef^^a4{\missingcharmsg{CURRENCY SIGN}}
+  \gdef^^a5{\v L}
+  \gdef^^a6{\'S}
+  \gdef^^a7{\S}
+  \gdef^^a8{\"{}}
+  \gdef^^a9{\v S}
+  \gdef^^aa{\cedilla S}
+  \gdef^^ab{\v T}
+  \gdef^^ac{\'Z}
+  \gdef^^ad{\-}
+  \gdef^^ae{\v Z}
+  \gdef^^af{\dotaccent Z}
+  %
+  \gdef^^b0{\textdegree}
+  \gdef^^b1{\ogonek{a}}
+  \gdef^^b2{\ogonek{ }}
+  \gdef^^b3{\l}
+  \gdef^^b4{\'{}}
+  \gdef^^b5{\v l}
+  \gdef^^b6{\'s}
+  \gdef^^b7{\v{}}
+  \gdef^^b8{\cedilla\ }
+  \gdef^^b9{\v s}
+  \gdef^^ba{\cedilla s}
+  \gdef^^bb{\v t}
+  \gdef^^bc{\'z}
+  \gdef^^bd{\H{}}
+  \gdef^^be{\v z}
+  \gdef^^bf{\dotaccent z}
+  %
+  \gdef^^c0{\'R}
+  \gdef^^c1{\'A}
+  \gdef^^c2{\^A}
+  \gdef^^c3{\u A}
+  \gdef^^c4{\"A}
+  \gdef^^c5{\'L}
+  \gdef^^c6{\'C}
+  \gdef^^c7{\cedilla C}
+  \gdef^^c8{\v C}
+  \gdef^^c9{\'E}
+  \gdef^^ca{\ogonek{E}}
+  \gdef^^cb{\"E}
+  \gdef^^cc{\v E}
+  \gdef^^cd{\'I}
+  \gdef^^ce{\^I}
+  \gdef^^cf{\v D}
+  %
+  \gdef^^d0{\DH}
+  \gdef^^d1{\'N}
+  \gdef^^d2{\v N}
+  \gdef^^d3{\'O}
+  \gdef^^d4{\^O}
+  \gdef^^d5{\H O}
+  \gdef^^d6{\"O}
+  \gdef^^d7{$\times$}
+  \gdef^^d8{\v R}
+  \gdef^^d9{\ringaccent U}
+  \gdef^^da{\'U}
+  \gdef^^db{\H U}
+  \gdef^^dc{\"U}
+  \gdef^^dd{\'Y}
+  \gdef^^de{\cedilla T}
+  \gdef^^df{\ss}
+  %
+  \gdef^^e0{\'r}
+  \gdef^^e1{\'a}
+  \gdef^^e2{\^a}
+  \gdef^^e3{\u a}
+  \gdef^^e4{\"a}
+  \gdef^^e5{\'l}
+  \gdef^^e6{\'c}
+  \gdef^^e7{\cedilla c}
+  \gdef^^e8{\v c}
+  \gdef^^e9{\'e}
+  \gdef^^ea{\ogonek{e}}
+  \gdef^^eb{\"e}
+  \gdef^^ec{\v e}
+  \gdef^^ed{\'{\dotless{i}}}
+  \gdef^^ee{\^{\dotless{i}}}
+  \gdef^^ef{\v d}
+  %
+  \gdef^^f0{\dh}
+  \gdef^^f1{\'n}
+  \gdef^^f2{\v n}
+  \gdef^^f3{\'o}
+  \gdef^^f4{\^o}
+  \gdef^^f5{\H o}
+  \gdef^^f6{\"o}
+  \gdef^^f7{$\div$}
+  \gdef^^f8{\v r}
+  \gdef^^f9{\ringaccent u}
+  \gdef^^fa{\'u}
+  \gdef^^fb{\H u}
+  \gdef^^fc{\"u}
+  \gdef^^fd{\'y}
+  \gdef^^fe{\cedilla t}
+  \gdef^^ff{\dotaccent{}}
+}
+
+% UTF-8 character definitions.
+%
+% This code to support UTF-8 is based on LaTeX's utf8.def, with some
+% changes for Texinfo conventions.  It is included here under the GPL by
+% permission from Frank Mittelbach and the LaTeX team.
+%
+\newcount\countUTFx
+\newcount\countUTFy
+\newcount\countUTFz
+
+\gdef\UTFviiiTwoOctets#1#2{\expandafter
+   \UTFviiiDefined\csname u8:#1\string #2\endcsname}
+%
+\gdef\UTFviiiThreeOctets#1#2#3{\expandafter
+   \UTFviiiDefined\csname u8:#1\string #2\string #3\endcsname}
+%
+\gdef\UTFviiiFourOctets#1#2#3#4{\expandafter
+   \UTFviiiDefined\csname u8:#1\string #2\string #3\string #4\endcsname}
+
+\gdef\UTFviiiDefined#1{%
+  \ifx #1\relax
+    \message{\linenumber Unicode char \string #1 not defined for Texinfo}%
+  \else
+    \expandafter #1%
+  \fi
+}
+
+\begingroup
+  \catcode`\~13
+  \catcode`\"12
+
+  \def\UTFviiiLoop{%
+    \global\catcode\countUTFx\active
+    \uccode`\~\countUTFx
+    \uppercase\expandafter{\UTFviiiTmp}%
+    \advance\countUTFx by 1
+    \ifnum\countUTFx < \countUTFy
+      \expandafter\UTFviiiLoop
+    \fi}
+
+  \countUTFx = "C2
+  \countUTFy = "E0
+  \def\UTFviiiTmp{%
+    \xdef~{\noexpand\UTFviiiTwoOctets\string~}}
+  \UTFviiiLoop
+
+  \countUTFx = "E0
+  \countUTFy = "F0
+  \def\UTFviiiTmp{%
+    \xdef~{\noexpand\UTFviiiThreeOctets\string~}}
+  \UTFviiiLoop
+
+  \countUTFx = "F0
+  \countUTFy = "F4
+  \def\UTFviiiTmp{%
+    \xdef~{\noexpand\UTFviiiFourOctets\string~}}
+  \UTFviiiLoop
+\endgroup
+
+\begingroup
+  \catcode`\"=12
+  \catcode`\<=12
+  \catcode`\.=12
+  \catcode`\,=12
+  \catcode`\;=12
+  \catcode`\!=12
+  \catcode`\~=13
+
+  \gdef\DeclareUnicodeCharacter#1#2{%
+    \countUTFz = "#1\relax
+    %\wlog{\space\space defining Unicode char U+#1 (decimal \the\countUTFz)}%
+    \begingroup
+      \parseXMLCharref
+      \def\UTFviiiTwoOctets##1##2{%
+        \csname u8:##1\string ##2\endcsname}%
+      \def\UTFviiiThreeOctets##1##2##3{%
+        \csname u8:##1\string ##2\string ##3\endcsname}%
+      \def\UTFviiiFourOctets##1##2##3##4{%
+        \csname u8:##1\string ##2\string ##3\string ##4\endcsname}%
+      \expandafter\expandafter\expandafter\expandafter
+       \expandafter\expandafter\expandafter
+       \gdef\UTFviiiTmp{#2}%
+    \endgroup}
+
+  \gdef\parseXMLCharref{%
+    \ifnum\countUTFz < "A0\relax
+      \errhelp = \EMsimple
+      \errmessage{Cannot define Unicode char value < 00A0}%
+    \else\ifnum\countUTFz < "800\relax
+      \parseUTFviiiA,%
+      \parseUTFviiiB C\UTFviiiTwoOctets.,%
+    \else\ifnum\countUTFz < "10000\relax
+      \parseUTFviiiA;%
+      \parseUTFviiiA,%
+      \parseUTFviiiB E\UTFviiiThreeOctets.{,;}%
+    \else
+      \parseUTFviiiA;%
+      \parseUTFviiiA,%
+      \parseUTFviiiA!%
+      \parseUTFviiiB F\UTFviiiFourOctets.{!,;}%
+    \fi\fi\fi
+  }
+
+  \gdef\parseUTFviiiA#1{%
+    \countUTFx = \countUTFz
+    \divide\countUTFz by 64
+    \countUTFy = \countUTFz
+    \multiply\countUTFz by 64
+    \advance\countUTFx by -\countUTFz
+    \advance\countUTFx by 128
+    \uccode `#1\countUTFx
+    \countUTFz = \countUTFy}
+
+  \gdef\parseUTFviiiB#1#2#3#4{%
+    \advance\countUTFz by "#10\relax
+    \uccode `#3\countUTFz
+    \uppercase{\gdef\UTFviiiTmp{#2#3#4}}}
+\endgroup
+
+\def\utfeightchardefs{%
+  \DeclareUnicodeCharacter{00A0}{\tie}
+  \DeclareUnicodeCharacter{00A1}{\exclamdown}
+  \DeclareUnicodeCharacter{00A3}{\pounds}
+  \DeclareUnicodeCharacter{00A8}{\"{ }}
+  \DeclareUnicodeCharacter{00A9}{\copyright}
+  \DeclareUnicodeCharacter{00AA}{\ordf}
+  \DeclareUnicodeCharacter{00AB}{\guillemetleft}
+  \DeclareUnicodeCharacter{00AD}{\-}
+  \DeclareUnicodeCharacter{00AE}{\registeredsymbol}
+  \DeclareUnicodeCharacter{00AF}{\={ }}
+
+  \DeclareUnicodeCharacter{00B0}{\ringaccent{ }}
+  \DeclareUnicodeCharacter{00B4}{\'{ }}
+  \DeclareUnicodeCharacter{00B8}{\cedilla{ }}
+  \DeclareUnicodeCharacter{00BA}{\ordm}
+  \DeclareUnicodeCharacter{00BB}{\guillemetright}
+  \DeclareUnicodeCharacter{00BF}{\questiondown}
+
+  \DeclareUnicodeCharacter{00C0}{\`A}
+  \DeclareUnicodeCharacter{00C1}{\'A}
+  \DeclareUnicodeCharacter{00C2}{\^A}
+  \DeclareUnicodeCharacter{00C3}{\~A}
+  \DeclareUnicodeCharacter{00C4}{\"A}
+  \DeclareUnicodeCharacter{00C5}{\AA}
+  \DeclareUnicodeCharacter{00C6}{\AE}
+  \DeclareUnicodeCharacter{00C7}{\cedilla{C}}
+  \DeclareUnicodeCharacter{00C8}{\`E}
+  \DeclareUnicodeCharacter{00C9}{\'E}
+  \DeclareUnicodeCharacter{00CA}{\^E}
+  \DeclareUnicodeCharacter{00CB}{\"E}
+  \DeclareUnicodeCharacter{00CC}{\`I}
+  \DeclareUnicodeCharacter{00CD}{\'I}
+  \DeclareUnicodeCharacter{00CE}{\^I}
+  \DeclareUnicodeCharacter{00CF}{\"I}
+
+  \DeclareUnicodeCharacter{00D0}{\DH}
+  \DeclareUnicodeCharacter{00D1}{\~N}
+  \DeclareUnicodeCharacter{00D2}{\`O}
+  \DeclareUnicodeCharacter{00D3}{\'O}
+  \DeclareUnicodeCharacter{00D4}{\^O}
+  \DeclareUnicodeCharacter{00D5}{\~O}
+  \DeclareUnicodeCharacter{00D6}{\"O}
+  \DeclareUnicodeCharacter{00D8}{\O}
+  \DeclareUnicodeCharacter{00D9}{\`U}
+  \DeclareUnicodeCharacter{00DA}{\'U}
+  \DeclareUnicodeCharacter{00DB}{\^U}
+  \DeclareUnicodeCharacter{00DC}{\"U}
+  \DeclareUnicodeCharacter{00DD}{\'Y}
+  \DeclareUnicodeCharacter{00DE}{\TH}
+  \DeclareUnicodeCharacter{00DF}{\ss}
+
+  \DeclareUnicodeCharacter{00E0}{\`a}
+  \DeclareUnicodeCharacter{00E1}{\'a}
+  \DeclareUnicodeCharacter{00E2}{\^a}
+  \DeclareUnicodeCharacter{00E3}{\~a}
+  \DeclareUnicodeCharacter{00E4}{\"a}
+  \DeclareUnicodeCharacter{00E5}{\aa}
+  \DeclareUnicodeCharacter{00E6}{\ae}
+  \DeclareUnicodeCharacter{00E7}{\cedilla{c}}
+  \DeclareUnicodeCharacter{00E8}{\`e}
+  \DeclareUnicodeCharacter{00E9}{\'e}
+  \DeclareUnicodeCharacter{00EA}{\^e}
+  \DeclareUnicodeCharacter{00EB}{\"e}
+  \DeclareUnicodeCharacter{00EC}{\`{\dotless{i}}}
+  \DeclareUnicodeCharacter{00ED}{\'{\dotless{i}}}
+  \DeclareUnicodeCharacter{00EE}{\^{\dotless{i}}}
+  \DeclareUnicodeCharacter{00EF}{\"{\dotless{i}}}
+
+  \DeclareUnicodeCharacter{00F0}{\dh}
+  \DeclareUnicodeCharacter{00F1}{\~n}
+  \DeclareUnicodeCharacter{00F2}{\`o}
+  \DeclareUnicodeCharacter{00F3}{\'o}
+  \DeclareUnicodeCharacter{00F4}{\^o}
+  \DeclareUnicodeCharacter{00F5}{\~o}
+  \DeclareUnicodeCharacter{00F6}{\"o}
+  \DeclareUnicodeCharacter{00F8}{\o}
+  \DeclareUnicodeCharacter{00F9}{\`u}
+  \DeclareUnicodeCharacter{00FA}{\'u}
+  \DeclareUnicodeCharacter{00FB}{\^u}
+  \DeclareUnicodeCharacter{00FC}{\"u}
+  \DeclareUnicodeCharacter{00FD}{\'y}
+  \DeclareUnicodeCharacter{00FE}{\th}
+  \DeclareUnicodeCharacter{00FF}{\"y}
+
+  \DeclareUnicodeCharacter{0100}{\=A}
+  \DeclareUnicodeCharacter{0101}{\=a}
+  \DeclareUnicodeCharacter{0102}{\u{A}}
+  \DeclareUnicodeCharacter{0103}{\u{a}}
+  \DeclareUnicodeCharacter{0104}{\ogonek{A}}
+  \DeclareUnicodeCharacter{0105}{\ogonek{a}}
+  \DeclareUnicodeCharacter{0106}{\'C}
+  \DeclareUnicodeCharacter{0107}{\'c}
+  \DeclareUnicodeCharacter{0108}{\^C}
+  \DeclareUnicodeCharacter{0109}{\^c}
+  \DeclareUnicodeCharacter{0118}{\ogonek{E}}
+  \DeclareUnicodeCharacter{0119}{\ogonek{e}}
+  \DeclareUnicodeCharacter{010A}{\dotaccent{C}}
+  \DeclareUnicodeCharacter{010B}{\dotaccent{c}}
+  \DeclareUnicodeCharacter{010C}{\v{C}}
+  \DeclareUnicodeCharacter{010D}{\v{c}}
+  \DeclareUnicodeCharacter{010E}{\v{D}}
+
+  \DeclareUnicodeCharacter{0112}{\=E}
+  \DeclareUnicodeCharacter{0113}{\=e}
+  \DeclareUnicodeCharacter{0114}{\u{E}}
+  \DeclareUnicodeCharacter{0115}{\u{e}}
+  \DeclareUnicodeCharacter{0116}{\dotaccent{E}}
+  \DeclareUnicodeCharacter{0117}{\dotaccent{e}}
+  \DeclareUnicodeCharacter{011A}{\v{E}}
+  \DeclareUnicodeCharacter{011B}{\v{e}}
+  \DeclareUnicodeCharacter{011C}{\^G}
+  \DeclareUnicodeCharacter{011D}{\^g}
+  \DeclareUnicodeCharacter{011E}{\u{G}}
+  \DeclareUnicodeCharacter{011F}{\u{g}}
+
+  \DeclareUnicodeCharacter{0120}{\dotaccent{G}}
+  \DeclareUnicodeCharacter{0121}{\dotaccent{g}}
+  \DeclareUnicodeCharacter{0124}{\^H}
+  \DeclareUnicodeCharacter{0125}{\^h}
+  \DeclareUnicodeCharacter{0128}{\~I}
+  \DeclareUnicodeCharacter{0129}{\~{\dotless{i}}}
+  \DeclareUnicodeCharacter{012A}{\=I}
+  \DeclareUnicodeCharacter{012B}{\={\dotless{i}}}
+  \DeclareUnicodeCharacter{012C}{\u{I}}
+  \DeclareUnicodeCharacter{012D}{\u{\dotless{i}}}
+
+  \DeclareUnicodeCharacter{0130}{\dotaccent{I}}
+  \DeclareUnicodeCharacter{0131}{\dotless{i}}
+  \DeclareUnicodeCharacter{0132}{IJ}
+  \DeclareUnicodeCharacter{0133}{ij}
+  \DeclareUnicodeCharacter{0134}{\^J}
+  \DeclareUnicodeCharacter{0135}{\^{\dotless{j}}}
+  \DeclareUnicodeCharacter{0139}{\'L}
+  \DeclareUnicodeCharacter{013A}{\'l}
+
+  \DeclareUnicodeCharacter{0141}{\L}
+  \DeclareUnicodeCharacter{0142}{\l}
+  \DeclareUnicodeCharacter{0143}{\'N}
+  \DeclareUnicodeCharacter{0144}{\'n}
+  \DeclareUnicodeCharacter{0147}{\v{N}}
+  \DeclareUnicodeCharacter{0148}{\v{n}}
+  \DeclareUnicodeCharacter{014C}{\=O}
+  \DeclareUnicodeCharacter{014D}{\=o}
+  \DeclareUnicodeCharacter{014E}{\u{O}}
+  \DeclareUnicodeCharacter{014F}{\u{o}}
+
+  \DeclareUnicodeCharacter{0150}{\H{O}}
+  \DeclareUnicodeCharacter{0151}{\H{o}}
+  \DeclareUnicodeCharacter{0152}{\OE}
+  \DeclareUnicodeCharacter{0153}{\oe}
+  \DeclareUnicodeCharacter{0154}{\'R}
+  \DeclareUnicodeCharacter{0155}{\'r}
+  \DeclareUnicodeCharacter{0158}{\v{R}}
+  \DeclareUnicodeCharacter{0159}{\v{r}}
+  \DeclareUnicodeCharacter{015A}{\'S}
+  \DeclareUnicodeCharacter{015B}{\'s}
+  \DeclareUnicodeCharacter{015C}{\^S}
+  \DeclareUnicodeCharacter{015D}{\^s}
+  \DeclareUnicodeCharacter{015E}{\cedilla{S}}
+  \DeclareUnicodeCharacter{015F}{\cedilla{s}}
+
+  \DeclareUnicodeCharacter{0160}{\v{S}}
+  \DeclareUnicodeCharacter{0161}{\v{s}}
+  \DeclareUnicodeCharacter{0162}{\cedilla{t}}
+  \DeclareUnicodeCharacter{0163}{\cedilla{T}}
+  \DeclareUnicodeCharacter{0164}{\v{T}}
+
+  \DeclareUnicodeCharacter{0168}{\~U}
+  \DeclareUnicodeCharacter{0169}{\~u}
+  \DeclareUnicodeCharacter{016A}{\=U}
+  \DeclareUnicodeCharacter{016B}{\=u}
+  \DeclareUnicodeCharacter{016C}{\u{U}}
+  \DeclareUnicodeCharacter{016D}{\u{u}}
+  \DeclareUnicodeCharacter{016E}{\ringaccent{U}}
+  \DeclareUnicodeCharacter{016F}{\ringaccent{u}}
+
+  \DeclareUnicodeCharacter{0170}{\H{U}}
+  \DeclareUnicodeCharacter{0171}{\H{u}}
+  \DeclareUnicodeCharacter{0174}{\^W}
+  \DeclareUnicodeCharacter{0175}{\^w}
+  \DeclareUnicodeCharacter{0176}{\^Y}
+  \DeclareUnicodeCharacter{0177}{\^y}
+  \DeclareUnicodeCharacter{0178}{\"Y}
+  \DeclareUnicodeCharacter{0179}{\'Z}
+  \DeclareUnicodeCharacter{017A}{\'z}
+  \DeclareUnicodeCharacter{017B}{\dotaccent{Z}}
+  \DeclareUnicodeCharacter{017C}{\dotaccent{z}}
+  \DeclareUnicodeCharacter{017D}{\v{Z}}
+  \DeclareUnicodeCharacter{017E}{\v{z}}
+
+  \DeclareUnicodeCharacter{01C4}{D\v{Z}}
+  \DeclareUnicodeCharacter{01C5}{D\v{z}}
+  \DeclareUnicodeCharacter{01C6}{d\v{z}}
+  \DeclareUnicodeCharacter{01C7}{LJ}
+  \DeclareUnicodeCharacter{01C8}{Lj}
+  \DeclareUnicodeCharacter{01C9}{lj}
+  \DeclareUnicodeCharacter{01CA}{NJ}
+  \DeclareUnicodeCharacter{01CB}{Nj}
+  \DeclareUnicodeCharacter{01CC}{nj}
+  \DeclareUnicodeCharacter{01CD}{\v{A}}
+  \DeclareUnicodeCharacter{01CE}{\v{a}}
+  \DeclareUnicodeCharacter{01CF}{\v{I}}
+
+  \DeclareUnicodeCharacter{01D0}{\v{\dotless{i}}}
+  \DeclareUnicodeCharacter{01D1}{\v{O}}
+  \DeclareUnicodeCharacter{01D2}{\v{o}}
+  \DeclareUnicodeCharacter{01D3}{\v{U}}
+  \DeclareUnicodeCharacter{01D4}{\v{u}}
+
+  \DeclareUnicodeCharacter{01E2}{\={\AE}}
+  \DeclareUnicodeCharacter{01E3}{\={\ae}}
+  \DeclareUnicodeCharacter{01E6}{\v{G}}
+  \DeclareUnicodeCharacter{01E7}{\v{g}}
+  \DeclareUnicodeCharacter{01E8}{\v{K}}
+  \DeclareUnicodeCharacter{01E9}{\v{k}}
+
+  \DeclareUnicodeCharacter{01F0}{\v{\dotless{j}}}
+  \DeclareUnicodeCharacter{01F1}{DZ}
+  \DeclareUnicodeCharacter{01F2}{Dz}
+  \DeclareUnicodeCharacter{01F3}{dz}
+  \DeclareUnicodeCharacter{01F4}{\'G}
+  \DeclareUnicodeCharacter{01F5}{\'g}
+  \DeclareUnicodeCharacter{01F8}{\`N}
+  \DeclareUnicodeCharacter{01F9}{\`n}
+  \DeclareUnicodeCharacter{01FC}{\'{\AE}}
+  \DeclareUnicodeCharacter{01FD}{\'{\ae}}
+  \DeclareUnicodeCharacter{01FE}{\'{\O}}
+  \DeclareUnicodeCharacter{01FF}{\'{\o}}
+
+  \DeclareUnicodeCharacter{021E}{\v{H}}
+  \DeclareUnicodeCharacter{021F}{\v{h}}
+
+  \DeclareUnicodeCharacter{0226}{\dotaccent{A}}
+  \DeclareUnicodeCharacter{0227}{\dotaccent{a}}
+  \DeclareUnicodeCharacter{0228}{\cedilla{E}}
+  \DeclareUnicodeCharacter{0229}{\cedilla{e}}
+  \DeclareUnicodeCharacter{022E}{\dotaccent{O}}
+  \DeclareUnicodeCharacter{022F}{\dotaccent{o}}
+
+  \DeclareUnicodeCharacter{0232}{\=Y}
+  \DeclareUnicodeCharacter{0233}{\=y}
+  \DeclareUnicodeCharacter{0237}{\dotless{j}}
+
+  \DeclareUnicodeCharacter{02DB}{\ogonek{ }}
+
+  \DeclareUnicodeCharacter{1E02}{\dotaccent{B}}
+  \DeclareUnicodeCharacter{1E03}{\dotaccent{b}}
+  \DeclareUnicodeCharacter{1E04}{\udotaccent{B}}
+  \DeclareUnicodeCharacter{1E05}{\udotaccent{b}}
+  \DeclareUnicodeCharacter{1E06}{\ubaraccent{B}}
+  \DeclareUnicodeCharacter{1E07}{\ubaraccent{b}}
+  \DeclareUnicodeCharacter{1E0A}{\dotaccent{D}}
+  \DeclareUnicodeCharacter{1E0B}{\dotaccent{d}}
+  \DeclareUnicodeCharacter{1E0C}{\udotaccent{D}}
+  \DeclareUnicodeCharacter{1E0D}{\udotaccent{d}}
+  \DeclareUnicodeCharacter{1E0E}{\ubaraccent{D}}
+  \DeclareUnicodeCharacter{1E0F}{\ubaraccent{d}}
+
+  \DeclareUnicodeCharacter{1E1E}{\dotaccent{F}}
+  \DeclareUnicodeCharacter{1E1F}{\dotaccent{f}}
+
+  \DeclareUnicodeCharacter{1E20}{\=G}
+  \DeclareUnicodeCharacter{1E21}{\=g}
+  \DeclareUnicodeCharacter{1E22}{\dotaccent{H}}
+  \DeclareUnicodeCharacter{1E23}{\dotaccent{h}}
+  \DeclareUnicodeCharacter{1E24}{\udotaccent{H}}
+  \DeclareUnicodeCharacter{1E25}{\udotaccent{h}}
+  \DeclareUnicodeCharacter{1E26}{\"H}
+  \DeclareUnicodeCharacter{1E27}{\"h}
+
+  \DeclareUnicodeCharacter{1E30}{\'K}
+  \DeclareUnicodeCharacter{1E31}{\'k}
+  \DeclareUnicodeCharacter{1E32}{\udotaccent{K}}
+  \DeclareUnicodeCharacter{1E33}{\udotaccent{k}}
+  \DeclareUnicodeCharacter{1E34}{\ubaraccent{K}}
+  \DeclareUnicodeCharacter{1E35}{\ubaraccent{k}}
+  \DeclareUnicodeCharacter{1E36}{\udotaccent{L}}
+  \DeclareUnicodeCharacter{1E37}{\udotaccent{l}}
+  \DeclareUnicodeCharacter{1E3A}{\ubaraccent{L}}
+  \DeclareUnicodeCharacter{1E3B}{\ubaraccent{l}}
+  \DeclareUnicodeCharacter{1E3E}{\'M}
+  \DeclareUnicodeCharacter{1E3F}{\'m}
+
+  \DeclareUnicodeCharacter{1E40}{\dotaccent{M}}
+  \DeclareUnicodeCharacter{1E41}{\dotaccent{m}}
+  \DeclareUnicodeCharacter{1E42}{\udotaccent{M}}
+  \DeclareUnicodeCharacter{1E43}{\udotaccent{m}}
+  \DeclareUnicodeCharacter{1E44}{\dotaccent{N}}
+  \DeclareUnicodeCharacter{1E45}{\dotaccent{n}}
+  \DeclareUnicodeCharacter{1E46}{\udotaccent{N}}
+  \DeclareUnicodeCharacter{1E47}{\udotaccent{n}}
+  \DeclareUnicodeCharacter{1E48}{\ubaraccent{N}}
+  \DeclareUnicodeCharacter{1E49}{\ubaraccent{n}}
+
+  \DeclareUnicodeCharacter{1E54}{\'P}
+  \DeclareUnicodeCharacter{1E55}{\'p}
+  \DeclareUnicodeCharacter{1E56}{\dotaccent{P}}
+  \DeclareUnicodeCharacter{1E57}{\dotaccent{p}}
+  \DeclareUnicodeCharacter{1E58}{\dotaccent{R}}
+  \DeclareUnicodeCharacter{1E59}{\dotaccent{r}}
+  \DeclareUnicodeCharacter{1E5A}{\udotaccent{R}}
+  \DeclareUnicodeCharacter{1E5B}{\udotaccent{r}}
+  \DeclareUnicodeCharacter{1E5E}{\ubaraccent{R}}
+  \DeclareUnicodeCharacter{1E5F}{\ubaraccent{r}}
+
+  \DeclareUnicodeCharacter{1E60}{\dotaccent{S}}
+  \DeclareUnicodeCharacter{1E61}{\dotaccent{s}}
+  \DeclareUnicodeCharacter{1E62}{\udotaccent{S}}
+  \DeclareUnicodeCharacter{1E63}{\udotaccent{s}}
+  \DeclareUnicodeCharacter{1E6A}{\dotaccent{T}}
+  \DeclareUnicodeCharacter{1E6B}{\dotaccent{t}}
+  \DeclareUnicodeCharacter{1E6C}{\udotaccent{T}}
+  \DeclareUnicodeCharacter{1E6D}{\udotaccent{t}}
+  \DeclareUnicodeCharacter{1E6E}{\ubaraccent{T}}
+  \DeclareUnicodeCharacter{1E6F}{\ubaraccent{t}}
+
+  \DeclareUnicodeCharacter{1E7C}{\~V}
+  \DeclareUnicodeCharacter{1E7D}{\~v}
+  \DeclareUnicodeCharacter{1E7E}{\udotaccent{V}}
+  \DeclareUnicodeCharacter{1E7F}{\udotaccent{v}}
+
+  \DeclareUnicodeCharacter{1E80}{\`W}
+  \DeclareUnicodeCharacter{1E81}{\`w}
+  \DeclareUnicodeCharacter{1E82}{\'W}
+  \DeclareUnicodeCharacter{1E83}{\'w}
+  \DeclareUnicodeCharacter{1E84}{\"W}
+  \DeclareUnicodeCharacter{1E85}{\"w}
+  \DeclareUnicodeCharacter{1E86}{\dotaccent{W}}
+  \DeclareUnicodeCharacter{1E87}{\dotaccent{w}}
+  \DeclareUnicodeCharacter{1E88}{\udotaccent{W}}
+  \DeclareUnicodeCharacter{1E89}{\udotaccent{w}}
+  \DeclareUnicodeCharacter{1E8A}{\dotaccent{X}}
+  \DeclareUnicodeCharacter{1E8B}{\dotaccent{x}}
+  \DeclareUnicodeCharacter{1E8C}{\"X}
+  \DeclareUnicodeCharacter{1E8D}{\"x}
+  \DeclareUnicodeCharacter{1E8E}{\dotaccent{Y}}
+  \DeclareUnicodeCharacter{1E8F}{\dotaccent{y}}
+
+  \DeclareUnicodeCharacter{1E90}{\^Z}
+  \DeclareUnicodeCharacter{1E91}{\^z}
+  \DeclareUnicodeCharacter{1E92}{\udotaccent{Z}}
+  \DeclareUnicodeCharacter{1E93}{\udotaccent{z}}
+  \DeclareUnicodeCharacter{1E94}{\ubaraccent{Z}}
+  \DeclareUnicodeCharacter{1E95}{\ubaraccent{z}}
+  \DeclareUnicodeCharacter{1E96}{\ubaraccent{h}}
+  \DeclareUnicodeCharacter{1E97}{\"t}
+  \DeclareUnicodeCharacter{1E98}{\ringaccent{w}}
+  \DeclareUnicodeCharacter{1E99}{\ringaccent{y}}
+
+  \DeclareUnicodeCharacter{1EA0}{\udotaccent{A}}
+  \DeclareUnicodeCharacter{1EA1}{\udotaccent{a}}
+
+  \DeclareUnicodeCharacter{1EB8}{\udotaccent{E}}
+  \DeclareUnicodeCharacter{1EB9}{\udotaccent{e}}
+  \DeclareUnicodeCharacter{1EBC}{\~E}
+  \DeclareUnicodeCharacter{1EBD}{\~e}
+
+  \DeclareUnicodeCharacter{1ECA}{\udotaccent{I}}
+  \DeclareUnicodeCharacter{1ECB}{\udotaccent{i}}
+  \DeclareUnicodeCharacter{1ECC}{\udotaccent{O}}
+  \DeclareUnicodeCharacter{1ECD}{\udotaccent{o}}
+
+  \DeclareUnicodeCharacter{1EE4}{\udotaccent{U}}
+  \DeclareUnicodeCharacter{1EE5}{\udotaccent{u}}
+
+  \DeclareUnicodeCharacter{1EF2}{\`Y}
+  \DeclareUnicodeCharacter{1EF3}{\`y}
+  \DeclareUnicodeCharacter{1EF4}{\udotaccent{Y}}
+
+  \DeclareUnicodeCharacter{1EF8}{\~Y}
+  \DeclareUnicodeCharacter{1EF9}{\~y}
+
+  \DeclareUnicodeCharacter{2013}{--}
+  \DeclareUnicodeCharacter{2014}{---}
+  \DeclareUnicodeCharacter{2018}{\quoteleft}
+  \DeclareUnicodeCharacter{2019}{\quoteright}
+  \DeclareUnicodeCharacter{201A}{\quotesinglbase}
+  \DeclareUnicodeCharacter{201C}{\quotedblleft}
+  \DeclareUnicodeCharacter{201D}{\quotedblright}
+  \DeclareUnicodeCharacter{201E}{\quotedblbase}
+  \DeclareUnicodeCharacter{2022}{\bullet}
+  \DeclareUnicodeCharacter{2026}{\dots}
+  \DeclareUnicodeCharacter{2039}{\guilsinglleft}
+  \DeclareUnicodeCharacter{203A}{\guilsinglright}
+  \DeclareUnicodeCharacter{20AC}{\euro}
+
+  \DeclareUnicodeCharacter{2192}{\expansion}
+  \DeclareUnicodeCharacter{21D2}{\result}
+
+  \DeclareUnicodeCharacter{2212}{\minus}
+  \DeclareUnicodeCharacter{2217}{\point}
+  \DeclareUnicodeCharacter{2261}{\equiv}
+}% end of \utfeightchardefs
+
+
+% US-ASCII character definitions.
+\def\asciichardefs{% nothing need be done
+   \relax
+}
+
+% Make non-ASCII characters printable again for compatibility with
+% existing Texinfo documents that may use them, even without declaring a
+% document encoding.
+%
+\setnonasciicharscatcode \other
+
+
+\message{formatting,}
+
+\newdimen\defaultparindent \defaultparindent = 15pt
+
+\chapheadingskip = 15pt plus 4pt minus 2pt
+\secheadingskip = 12pt plus 3pt minus 2pt
+\subsecheadingskip = 9pt plus 2pt minus 2pt
+
+% Prevent underfull vbox error messages.
+\vbadness = 10000
+
+% Don't be very finicky about underfull hboxes, either.
+\hbadness = 6666
+
+% Following George Bush, get rid of widows and orphans.
+\widowpenalty=10000
+\clubpenalty=10000
+
+% Use TeX 3.0's \emergencystretch to help line breaking, but if we're
+% using an old version of TeX, don't do anything.  We want the amount of
+% stretch added to depend on the line length, hence the dependence on
+% \hsize.  We call this whenever the paper size is set.
+%
+\def\setemergencystretch{%
+  \ifx\emergencystretch\thisisundefined
+    % Allow us to assign to \emergencystretch anyway.
+    \def\emergencystretch{\dimen0}%
+  \else
+    \emergencystretch = .15\hsize
+  \fi
+}
+
+% Parameters in order: 1) textheight; 2) textwidth;
+% 3) voffset; 4) hoffset; 5) binding offset; 6) topskip;
+% 7) physical page height; 8) physical page width.
+%
+% We also call \setleading{\textleading}, so the caller should define
+% \textleading.  The caller should also set \parskip.
+%
+\def\internalpagesizes#1#2#3#4#5#6#7#8{%
+  \voffset = #3\relax
+  \topskip = #6\relax
+  \splittopskip = \topskip
+  %
+  \vsize = #1\relax
+  \advance\vsize by \topskip
+  \outervsize = \vsize
+  \advance\outervsize by 2\topandbottommargin
+  \pageheight = \vsize
+  %
+  \hsize = #2\relax
+  \outerhsize = \hsize
+  \advance\outerhsize by 0.5in
+  \pagewidth = \hsize
+  %
+  \normaloffset = #4\relax
+  \bindingoffset = #5\relax
+  %
+  \ifpdf
+    \pdfpageheight #7\relax
+    \pdfpagewidth #8\relax
+    % if we don't reset these, they will remain at "1 true in" of
+    % whatever layout pdftex was dumped with.
+    \pdfhorigin = 1 true in
+    \pdfvorigin = 1 true in
+  \fi
+  %
+  \setleading{\textleading}
+  %
+  \parindent = \defaultparindent
+  \setemergencystretch
+}
+
+% @letterpaper (the default).
+\def\letterpaper{{\globaldefs = 1
+  \parskip = 3pt plus 2pt minus 1pt
+  \textleading = 13.2pt
+  %
+  % If page is nothing but text, make it come out even.
+  \internalpagesizes{607.2pt}{6in}% that's 46 lines
+                    {\voffset}{.25in}%
+                    {\bindingoffset}{36pt}%
+                    {11in}{8.5in}%
+}}
+
+% Use @smallbook to reset parameters for 7x9.25 trim size.
+\def\smallbook{{\globaldefs = 1
+  \parskip = 2pt plus 1pt
+  \textleading = 12pt
+  %
+  \internalpagesizes{7.5in}{5in}%
+                    {-.2in}{0in}%
+                    {\bindingoffset}{16pt}%
+                    {9.25in}{7in}%
+  %
+  \lispnarrowing = 0.3in
+  \tolerance = 700
+  \hfuzz = 1pt
+  \contentsrightmargin = 0pt
+  \defbodyindent = .5cm
+}}
+
+% Use @smallerbook to reset parameters for 6x9 trim size.
+% (Just testing, parameters still in flux.)
+\def\smallerbook{{\globaldefs = 1
+  \parskip = 1.5pt plus 1pt
+  \textleading = 12pt
+  %
+  \internalpagesizes{7.4in}{4.8in}%
+                    {-.2in}{-.4in}%
+                    {0pt}{14pt}%
+                    {9in}{6in}%
+  %
+  \lispnarrowing = 0.25in
+  \tolerance = 700
+  \hfuzz = 1pt
+  \contentsrightmargin = 0pt
+  \defbodyindent = .4cm
+}}
+
+% Use @afourpaper to print on European A4 paper.
+\def\afourpaper{{\globaldefs = 1
+  \parskip = 3pt plus 2pt minus 1pt
+  \textleading = 13.2pt
+  %
+  % Double-side printing via postscript on Laserjet 4050
+  % prints double-sided nicely when \bindingoffset=10mm and \hoffset=-6mm.
+  % To change the settings for a different printer or situation, adjust
+  % \normaloffset until the front-side and back-side texts align.  Then
+  % do the same for \bindingoffset.  You can set these for testing in
+  % your texinfo source file like this:
+  % @tex
+  % \global\normaloffset = -6mm
+  % \global\bindingoffset = 10mm
+  % @end tex
+  \internalpagesizes{673.2pt}{160mm}% that's 51 lines
+                    {\voffset}{\hoffset}%
+                    {\bindingoffset}{44pt}%
+                    {297mm}{210mm}%
+  %
+  \tolerance = 700
+  \hfuzz = 1pt
+  \contentsrightmargin = 0pt
+  \defbodyindent = 5mm
+}}
+
+% Use @afivepaper to print on European A5 paper.
+% From romildo at urano.iceb.ufop.br, 2 July 2000.
+% He also recommends making @example and @lisp be small.
+\def\afivepaper{{\globaldefs = 1
+  \parskip = 2pt plus 1pt minus 0.1pt
+  \textleading = 12.5pt
+  %
+  \internalpagesizes{160mm}{120mm}%
+                    {\voffset}{\hoffset}%
+                    {\bindingoffset}{8pt}%
+                    {210mm}{148mm}%
+  %
+  \lispnarrowing = 0.2in
+  \tolerance = 800
+  \hfuzz = 1.2pt
+  \contentsrightmargin = 0pt
+  \defbodyindent = 2mm
+  \tableindent = 12mm
+}}
+
+% A specific text layout, 24x15cm overall, intended for A4 paper.
+\def\afourlatex{{\globaldefs = 1
+  \afourpaper
+  \internalpagesizes{237mm}{150mm}%
+                    {\voffset}{4.6mm}%
+                    {\bindingoffset}{7mm}%
+                    {297mm}{210mm}%
+  %
+  % Must explicitly reset to 0 because we call \afourpaper.
+  \globaldefs = 0
+}}
+
+% Use @afourwide to print on A4 paper in landscape format.
+\def\afourwide{{\globaldefs = 1
+  \afourpaper
+  \internalpagesizes{241mm}{165mm}%
+                    {\voffset}{-2.95mm}%
+                    {\bindingoffset}{7mm}%
+                    {297mm}{210mm}%
+  \globaldefs = 0
+}}
+
+% @pagesizes TEXTHEIGHT[,TEXTWIDTH]
+% Perhaps we should allow setting the margins, \topskip, \parskip,
+% and/or leading, also. Or perhaps we should compute them somehow.
+%
+\parseargdef\pagesizes{\pagesizesyyy #1,,\finish}
+\def\pagesizesyyy#1,#2,#3\finish{{%
+  \setbox0 = \hbox{\ignorespaces #2}\ifdim\wd0 > 0pt \hsize=#2\relax \fi
+  \globaldefs = 1
+  %
+  \parskip = 3pt plus 2pt minus 1pt
+  \setleading{\textleading}%
+  %
+  \dimen0 = #1\relax
+  \advance\dimen0 by \voffset
+  %
+  \dimen2 = \hsize
+  \advance\dimen2 by \normaloffset
+  %
+  \internalpagesizes{#1}{\hsize}%
+                    {\voffset}{\normaloffset}%
+                    {\bindingoffset}{44pt}%
+                    {\dimen0}{\dimen2}%
+}}
+
+% Set default to letter.
+%
+\letterpaper
+
+
+\message{and turning on texinfo input format.}
+
+\def^^L{\par} % remove \outer, so ^L can appear in an @comment
+
+% DEL is a comment character, in case @c does not suffice.
+\catcode`\^^? = 14
+
+% Define macros to output various characters with catcode for normal text.
+\catcode`\"=\other \def\normaldoublequote{"}
+\catcode`\$=\other \def\normaldollar{$}%$ font-lock fix
+\catcode`\+=\other \def\normalplus{+}
+\catcode`\<=\other \def\normalless{<}
+\catcode`\>=\other \def\normalgreater{>}
+\catcode`\^=\other \def\normalcaret{^}
+\catcode`\_=\other \def\normalunderscore{_}
+\catcode`\|=\other \def\normalverticalbar{|}
+\catcode`\~=\other \def\normaltilde{~}
+
+% This macro is used to make a character print one way in \tt
+% (where it can probably be output as-is), and another way in other fonts,
+% where something hairier probably needs to be done.
+%
+% #1 is what to print if we are indeed using \tt; #2 is what to print
+% otherwise.  Since all the Computer Modern typewriter fonts have zero
+% interword stretch (and shrink), and it is reasonable to expect all
+% typewriter fonts to have this, we can check that font parameter.
+%
+\def\ifusingtt#1#2{\ifdim \fontdimen3\font=0pt #1\else #2\fi}
+
+% Same as above, but check for italic font.  Actually this also catches
+% non-italic slanted fonts since it is impossible to distinguish them from
+% italic fonts.  But since this is only used by $ and it uses \sl anyway
+% this is not a problem.
+\def\ifusingit#1#2{\ifdim \fontdimen1\font>0pt #1\else #2\fi}
+
+% Turn off all special characters except @
+% (and those which the user can use as if they were ordinary).
+% Most of these we simply print from the \tt font, but for some, we can
+% use math or other variants that look better in normal text.
+
+\catcode`\"=\active
+\def\activedoublequote{{\tt\char34}}
+\let"=\activedoublequote
+\catcode`\~=\active
+\def~{{\tt\char126}}
+\chardef\hat=`\^
+\catcode`\^=\active
+\def^{{\tt \hat}}
+
+\catcode`\_=\active
+\def_{\ifusingtt\normalunderscore\_}
+\let\realunder=_
+% Subroutine for the previous macro.
+\def\_{\leavevmode \kern.07em \vbox{\hrule width.3em height.1ex}\kern .07em }
+
+\catcode`\|=\active
+\def|{{\tt\char124}}
+\chardef \less=`\<
+\catcode`\<=\active
+\def<{{\tt \less}}
+\chardef \gtr=`\>
+\catcode`\>=\active
+\def>{{\tt \gtr}}
+\catcode`\+=\active
+\def+{{\tt \char 43}}
+\catcode`\$=\active
+\def${\ifusingit{{\sl\$}}\normaldollar}%$ font-lock fix
+
+% If a .fmt file is being used, characters that might appear in a file
+% name cannot be active until we have parsed the command line.
+% So turn them off again, and have \everyjob (or @setfilename) turn them on.
+% \otherifyactive is called near the end of this file.
+\def\otherifyactive{\catcode`+=\other \catcode`\_=\other}
+
+% Used sometimes to turn off (effectively) the active characters even after
+% parsing them.
+\def\turnoffactive{%
+  \normalturnoffactive
+  \otherbackslash
+}
+
+\catcode`\@=0
+
+% \backslashcurfont outputs one backslash character in current font,
+% as in \char`\\.
+\global\chardef\backslashcurfont=`\\
+\global\let\rawbackslashxx=\backslashcurfont  % let existing .??s files work
+
+% \realbackslash is an actual character `\' with catcode other, and
+% \doublebackslash is two of them (for the pdf outlines).
+{\catcode`\\=\other @gdef at realbackslash{\} @gdef at doublebackslash{\\}}
+
+% In texinfo, backslash is an active character; it prints the backslash
+% in fixed width font.
+\catcode`\\=\active  % @ for escape char from now on.
+
+% The story here is that in math mode, the \char of \backslashcurfont
+% ends up printing the roman \ from the math symbol font (because \char
+% in math mode uses the \mathcode, and plain.tex sets
+% \mathcode`\\="026E).  It seems better for @backslashchar{} to always
+% print a typewriter backslash, hence we use an explicit \mathchar,
+% which is the decimal equivalent of "715c (class 7, e.g., use \fam;
+% ignored family value; char position "5C).  We can't use " for the
+% usual hex value because it has already been made active.
+ at def@normalbackslash{{@tt @ifmmode @mathchar29020 @else @backslashcurfont @fi}}
+ at let@backslashchar = @normalbackslash % @backslashchar{} is for user documents.
+
+% On startup, @fixbackslash assigns:
+%  @let \ = @normalbackslash
+% \rawbackslash defines an active \ to do \backslashcurfont.
+% \otherbackslash defines an active \ to be a literal `\' character with
+% catcode other.  We switch back and forth between these.
+ at gdef@rawbackslash{@let\=@backslashcurfont}
+ at gdef@otherbackslash{@let\=@realbackslash}
+
+% Same as @turnoffactive except outputs \ as {\tt\char`\\} instead of
+% the literal character `\'.  Also revert - to its normal character, in
+% case the active - from code has slipped in.
+%
+{@catcode`- = @active
+ @gdef at normalturnoffactive{%
+   @let-=@normaldash
+   @let"=@normaldoublequote
+   @let$=@normaldollar %$ font-lock fix
+   @let+=@normalplus
+   @let<=@normalless
+   @let>=@normalgreater
+   @let\=@normalbackslash
+   @let^=@normalcaret
+   @let_=@normalunderscore
+   @let|=@normalverticalbar
+   @let~=@normaltilde
+   @markupsetuplqdefault
+   @markupsetuprqdefault
+   @unsepspaces
+ }
+}
+
+% Make _ and + \other characters, temporarily.
+% This is canceled by @fixbackslash.
+ at otherifyactive
+
+% If a .fmt file is being used, we don't want the `\input texinfo' to show up.
+% That is what \eatinput is for; after that, the `\' should revert to printing
+% a backslash.
+%
+ at gdef@eatinput input texinfo{@fixbackslash}
+ at global@let\ = @eatinput
+
+% On the other hand, perhaps the file did not have a `\input texinfo'. Then
+% the first `\' in the file would cause an error. This macro tries to fix
+% that, assuming it is called before the first `\' could plausibly occur.
+% Also turn back on active characters that might appear in the input
+% file name, in case not using a pre-dumped format.
+%
+ at gdef@fixbackslash{%
+  @ifx\@eatinput @let\ = @normalbackslash @fi
+  @catcode`+=@active
+  @catcode`@_=@active
+}
+
+% Say @foo, not \foo, in error messages.
+ at escapechar = `@@
+
+% These (along with & and #) are made active for url-breaking, so need
+% active definitions as the normal characters.
+ at def@normaldot{.}
+ at def@normalquest{?}
+ at def@normalslash{/}
+
+% These look ok in all fonts, so just make them not special.
+% @hashchar{} gets its own user-level command, because of #line.
+ at catcode`@& = @other @def at normalamp{&}
+ at catcode`@# = @other @def at normalhash{#}
+ at catcode`@% = @other @def at normalpercent{%}
+
+ at let @hashchar = @normalhash
+
+ at c Finally, make ` and ' active, so that txicodequoteundirected and
+ at c txicodequotebacktick work right in, e.g., @w{@code{`foo'}}.  If we
+ at c don't make ` and ' active, @code will not get them as active chars.
+ at c Do this last of all since we use ` in the previous @catcode assignments.
+ at catcode`@'=@active
+ at catcode`@`=@active
+ at markupsetuplqdefault
+ at markupsetuprqdefault
+
+ at c Local variables:
+ at c eval: (add-hook 'write-file-hooks 'time-stamp)
+ at c page-delimiter: "^\\\\message"
+ at c time-stamp-start: "def\\\\texinfoversion{"
+ at c time-stamp-format: "%:y-%02m-%02d.%02H"
+ at c time-stamp-end: "}"
+ at c End:
+
+ at c vim:sw=2:
+
+ at ignore
+   arch-tag: e1b36e32-c96e-4135-a41a-0b2efa2ea115
+ at end ignore
diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt
new file mode 100644
index 0000000..48769de
--- /dev/null
+++ b/examples/CMakeLists.txt
@@ -0,0 +1,12 @@
+INCLUDE_DIRECTORIES(${CMAKE_BINARY_DIR}/fortran)
+LINK_DIRECTORIES(${CMAKE_BINARY_DIR}/fortran)
+FIND_LIBRARY(NETCDF_C_LIBRARY NAMES netcdf libnetcdf)
+IF(NOT NETCDF_C_LIBRARY)
+  MESSAGE(FATAL_ERROR "Cannot find netCDF C library, needed for netCDF Fortran tests.")
+ENDIF()
+
+ADD_SUBDIRECTORY(F77)
+ADD_SUBDIRECTORY(F90)
+
+SET(CUR_EXTRA_DIST CMakeLists.txt Makefile.am)
+ADD_EXTRA_DIST("${CUR_EXTRA_DIST}")
diff --git a/examples/F77/CMakeLists.txt b/examples/F77/CMakeLists.txt
new file mode 100644
index 0000000..9b68d8a
--- /dev/null
+++ b/examples/F77/CMakeLists.txt
@@ -0,0 +1,29 @@
+SET(example_F77_tests simple_xy_wr simple_xy_rd sfc_pres_temp_wr sfc_pres_temp_rd pres_temp_4D_wr pres_temp_4D_rd)
+SET(example_F77_tests_source "")
+FOREACH(F ${example_F77_tests}) 
+  SET(example_F77_tests_source ${example_F77_test_source} ${F}.f)
+ENDFOREACH()
+
+SET(prefix F77_tests)
+FOREACH(F ${example_F77_tests})
+  ADD_EXECUTABLE(${prefix}_${F} ${F}.f)
+  TARGET_LINK_LIBRARIES(${prefix}_${F} netcdff ${NETCDF_C_LIBRARY})
+  IF(MSVC)
+    SET_TARGET_PROPERTIES(${prefix}_${F} 
+      PROPERTIES LINK_FLAGS_DEBUG " /NODEFAULTLIB:MSVCRT"
+      )
+  ENDIF()
+  ADD_TEST(${prefix}_${F} ${EXECUTABLE_OUTPUT_PATH}/${prefix}_${F})
+  IF(MSVC)
+    SET_PROPERTY(TEST ${prefix}_${F} PROPERTY FOLDER "tests/")
+  ENDIF()	
+ENDFOREACH()
+
+## Specify files to be distributed by 'make dist'
+FILE(GLOB CUR_EXTRA_DIST RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/*.f ${CMAKE_CURRENT_SOURCE_DIR}/*.sh)
+SET(CUR_EXTRA_DIST ${CUR_EXTRA_DIST} CMakeLists.txt Makefile.am)
+ADD_EXTRA_DIST("${CUR_EXTRA_DIST}")
+
+SET(CLEANFILES sfc_pres_temp.nc simple_xy.nc pres_temp_4D.nc simple_nc4.nc simple_xy_nc4.nc)
+SET_DIRECTORY_PROPERTIES(PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES "${CLEANFILES}")
+
diff --git a/examples/F77/Makefile.am b/examples/F77/Makefile.am
new file mode 100644
index 0000000..c8bc634
--- /dev/null
+++ b/examples/F77/Makefile.am
@@ -0,0 +1,41 @@
+## This is a automake file, part of Unidata's netCDF package.
+# Copyright 2011, see the COPYRIGHT file for more information.
+
+# This file builds F77 examples.
+
+AM_FCFLAGS = -I$(top_srcdir)/fortran ${AM_CPPFLAGS}
+AM_FCFLAGS += $(FCFLAGS_f90)
+AM_FCFLAGS += @MOD_FLAG@$(top_builddir)/fortran
+AM_FFLAGS = ${AM_FCFLAGS}
+AM_LDFLAGS = ${top_builddir}/fortran/libnetcdff.la -lnetcdf
+
+# These are the example programs.
+TESTPROGRAMS = simple_xy_wr simple_xy_rd sfc_pres_temp_wr	\
+sfc_pres_temp_rd pres_temp_4D_wr pres_temp_4D_rd
+
+if USE_NETCDF4
+TESTPROGRAMS += simple_xy_nc4_wr simple_xy_nc4_rd
+simple_xy_nc4_wr_SOURCES = simple_xy_nc4_wr.f
+simple_xy_nc4_rd_SOURCES = simple_xy_nc4_rd.f
+endif
+
+check_PROGRAMS = $(TESTPROGRAMS)
+
+EXTRA_DIST = do_comps.sh CMakeLists.txt
+
+# Here's the source code for the programs.
+simple_xy_wr_SOURCES = simple_xy_wr.f
+simple_xy_rd_SOURCES = simple_xy_rd.f
+sfc_pres_temp_wr_SOURCES = sfc_pres_temp_wr.f
+sfc_pres_temp_rd_SOURCES = sfc_pres_temp_rd.f
+pres_temp_4D_wr_SOURCES = pres_temp_4D_wr.f
+pres_temp_4D_rd_SOURCES = pres_temp_4D_rd.f
+
+# Run all test programs, plus the do_comps.sh script, which checks
+# that all the output files are the same as the C example output
+# files.
+TESTS = $(TESTPROGRAMS) #do_comps.sh
+
+# Cleaning up files created during the process.
+CLEANFILES = simple_xy.nc sfc_pres_temp.nc pres_temp_4D.nc	\
+simple_xy_nc4.nc
diff --git a/examples/F77/Makefile.in b/examples/F77/Makefile.in
new file mode 100644
index 0000000..35c5806
--- /dev/null
+++ b/examples/F77/Makefile.in
@@ -0,0 +1,1091 @@
+# Makefile.in generated by automake 1.14.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2013 Free Software Foundation, Inc.
+
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+ at SET_MAKE@
+
+# Copyright 2011, see the COPYRIGHT file for more information.
+
+# This file builds F77 examples.
+VPATH = @srcdir@
+am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
+am__make_running_with_option = \
+  case $${target_option-} in \
+      ?) ;; \
+      *) echo "am__make_running_with_option: internal error: invalid" \
+              "target option '$${target_option-}' specified" >&2; \
+         exit 1;; \
+  esac; \
+  has_opt=no; \
+  sane_makeflags=$$MAKEFLAGS; \
+  if $(am__is_gnu_make); then \
+    sane_makeflags=$$MFLAGS; \
+  else \
+    case $$MAKEFLAGS in \
+      *\\[\ \	]*) \
+        bs=\\; \
+        sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+          | sed "s/$$bs$$bs[$$bs $$bs	]*//g"`;; \
+    esac; \
+  fi; \
+  skip_next=no; \
+  strip_trailopt () \
+  { \
+    flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+  }; \
+  for flg in $$sane_makeflags; do \
+    test $$skip_next = yes && { skip_next=no; continue; }; \
+    case $$flg in \
+      *=*|--*) continue;; \
+        -*I) strip_trailopt 'I'; skip_next=yes;; \
+      -*I?*) strip_trailopt 'I';; \
+        -*O) strip_trailopt 'O'; skip_next=yes;; \
+      -*O?*) strip_trailopt 'O';; \
+        -*l) strip_trailopt 'l'; skip_next=yes;; \
+      -*l?*) strip_trailopt 'l';; \
+      -[dEDm]) skip_next=yes;; \
+      -[JT]) skip_next=yes;; \
+    esac; \
+    case $$flg in \
+      *$$target_option*) has_opt=yes; break;; \
+    esac; \
+  done; \
+  test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+target_triplet = @target@
+ at USE_NETCDF4_TRUE@am__append_1 = simple_xy_nc4_wr simple_xy_nc4_rd
+check_PROGRAMS = $(am__EXEEXT_2)
+TESTS = $(am__EXEEXT_2)
+subdir = examples/F77
+DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \
+	$(top_srcdir)/test-driver
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \
+	$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+	$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+	$(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/config.h \
+	$(top_builddir)/libsrc/nfconfig1.inc
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+ at USE_NETCDF4_TRUE@am__EXEEXT_1 = simple_xy_nc4_wr$(EXEEXT) \
+ at USE_NETCDF4_TRUE@	simple_xy_nc4_rd$(EXEEXT)
+am__EXEEXT_2 = simple_xy_wr$(EXEEXT) simple_xy_rd$(EXEEXT) \
+	sfc_pres_temp_wr$(EXEEXT) sfc_pres_temp_rd$(EXEEXT) \
+	pres_temp_4D_wr$(EXEEXT) pres_temp_4D_rd$(EXEEXT) \
+	$(am__EXEEXT_1)
+am_pres_temp_4D_rd_OBJECTS = pres_temp_4D_rd.$(OBJEXT)
+pres_temp_4D_rd_OBJECTS = $(am_pres_temp_4D_rd_OBJECTS)
+pres_temp_4D_rd_LDADD = $(LDADD)
+AM_V_lt = $(am__v_lt_ at AM_V@)
+am__v_lt_ = $(am__v_lt_ at AM_DEFAULT_V@)
+am__v_lt_0 = --silent
+am__v_lt_1 = 
+am_pres_temp_4D_wr_OBJECTS = pres_temp_4D_wr.$(OBJEXT)
+pres_temp_4D_wr_OBJECTS = $(am_pres_temp_4D_wr_OBJECTS)
+pres_temp_4D_wr_LDADD = $(LDADD)
+am_sfc_pres_temp_rd_OBJECTS = sfc_pres_temp_rd.$(OBJEXT)
+sfc_pres_temp_rd_OBJECTS = $(am_sfc_pres_temp_rd_OBJECTS)
+sfc_pres_temp_rd_LDADD = $(LDADD)
+am_sfc_pres_temp_wr_OBJECTS = sfc_pres_temp_wr.$(OBJEXT)
+sfc_pres_temp_wr_OBJECTS = $(am_sfc_pres_temp_wr_OBJECTS)
+sfc_pres_temp_wr_LDADD = $(LDADD)
+am__simple_xy_nc4_rd_SOURCES_DIST = simple_xy_nc4_rd.f
+ at USE_NETCDF4_TRUE@am_simple_xy_nc4_rd_OBJECTS =  \
+ at USE_NETCDF4_TRUE@	simple_xy_nc4_rd.$(OBJEXT)
+simple_xy_nc4_rd_OBJECTS = $(am_simple_xy_nc4_rd_OBJECTS)
+simple_xy_nc4_rd_LDADD = $(LDADD)
+am__simple_xy_nc4_wr_SOURCES_DIST = simple_xy_nc4_wr.f
+ at USE_NETCDF4_TRUE@am_simple_xy_nc4_wr_OBJECTS =  \
+ at USE_NETCDF4_TRUE@	simple_xy_nc4_wr.$(OBJEXT)
+simple_xy_nc4_wr_OBJECTS = $(am_simple_xy_nc4_wr_OBJECTS)
+simple_xy_nc4_wr_LDADD = $(LDADD)
+am_simple_xy_rd_OBJECTS = simple_xy_rd.$(OBJEXT)
+simple_xy_rd_OBJECTS = $(am_simple_xy_rd_OBJECTS)
+simple_xy_rd_LDADD = $(LDADD)
+am_simple_xy_wr_OBJECTS = simple_xy_wr.$(OBJEXT)
+simple_xy_wr_OBJECTS = $(am_simple_xy_wr_OBJECTS)
+simple_xy_wr_LDADD = $(LDADD)
+AM_V_P = $(am__v_P_ at AM_V@)
+am__v_P_ = $(am__v_P_ at AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_ at AM_V@)
+am__v_GEN_ = $(am__v_GEN_ at AM_DEFAULT_V@)
+am__v_GEN_0 = @echo "  GEN     " $@;
+am__v_GEN_1 = 
+AM_V_at = $(am__v_at_ at AM_V@)
+am__v_at_ = $(am__v_at_ at AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 = 
+DEFAULT_INCLUDES = -I. at am__isrc@ -I$(top_builddir) -I$(top_builddir)/libsrc
+F77COMPILE = $(F77) $(AM_FFLAGS) $(FFLAGS)
+LTF77COMPILE = $(LIBTOOL) $(AM_V_lt) --tag=F77 $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=compile $(F77) $(AM_FFLAGS) $(FFLAGS)
+AM_V_F77 = $(am__v_F77_ at AM_V@)
+am__v_F77_ = $(am__v_F77_ at AM_DEFAULT_V@)
+am__v_F77_0 = @echo "  F77     " $@;
+am__v_F77_1 = 
+F77LD = $(F77)
+F77LINK = $(LIBTOOL) $(AM_V_lt) --tag=F77 $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(F77LD) $(AM_FFLAGS) $(FFLAGS) \
+	$(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_F77LD = $(am__v_F77LD_ at AM_V@)
+am__v_F77LD_ = $(am__v_F77LD_ at AM_DEFAULT_V@)
+am__v_F77LD_0 = @echo "  F77LD   " $@;
+am__v_F77LD_1 = 
+SOURCES = $(pres_temp_4D_rd_SOURCES) $(pres_temp_4D_wr_SOURCES) \
+	$(sfc_pres_temp_rd_SOURCES) $(sfc_pres_temp_wr_SOURCES) \
+	$(simple_xy_nc4_rd_SOURCES) $(simple_xy_nc4_wr_SOURCES) \
+	$(simple_xy_rd_SOURCES) $(simple_xy_wr_SOURCES)
+DIST_SOURCES = $(pres_temp_4D_rd_SOURCES) $(pres_temp_4D_wr_SOURCES) \
+	$(sfc_pres_temp_rd_SOURCES) $(sfc_pres_temp_wr_SOURCES) \
+	$(am__simple_xy_nc4_rd_SOURCES_DIST) \
+	$(am__simple_xy_nc4_wr_SOURCES_DIST) $(simple_xy_rd_SOURCES) \
+	$(simple_xy_wr_SOURCES)
+am__can_run_installinfo = \
+  case $$AM_UPDATE_INFO_DIR in \
+    n|no|NO) false;; \
+    *) (install-info --version) >/dev/null 2>&1;; \
+  esac
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates.  Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+  BEGIN { nonempty = 0; } \
+  { items[$$0] = 1; nonempty = 1; } \
+  END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique.  This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+  list='$(am__tagged_files)'; \
+  unique=`for i in $$list; do \
+    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+  done | $(am__uniquify_input)`
+ETAGS = etags
+CTAGS = ctags
+am__tty_colors_dummy = \
+  mgn= red= grn= lgn= blu= brg= std=; \
+  am__color_tests=no
+am__tty_colors = { \
+  $(am__tty_colors_dummy); \
+  if test "X$(AM_COLOR_TESTS)" = Xno; then \
+    am__color_tests=no; \
+  elif test "X$(AM_COLOR_TESTS)" = Xalways; then \
+    am__color_tests=yes; \
+  elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \
+    am__color_tests=yes; \
+  fi; \
+  if test $$am__color_tests = yes; then \
+    red=''; \
+    grn=''; \
+    lgn=''; \
+    blu=''; \
+    mgn=''; \
+    brg=''; \
+    std=''; \
+  fi; \
+}
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+  for p in $$list; do echo "$$p $$p"; done | \
+  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+    if (++n[$$2] == $(am__install_max)) \
+      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+    END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__uninstall_files_from_dir = { \
+  test -z "$$files" \
+    || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+    || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+         $(am__cd) "$$dir" && rm -f $$files; }; \
+  }
+am__recheck_rx = ^[ 	]*:recheck:[ 	]*
+am__global_test_result_rx = ^[ 	]*:global-test-result:[ 	]*
+am__copy_in_global_log_rx = ^[ 	]*:copy-in-global-log:[ 	]*
+# A command that, given a newline-separated list of test names on the
+# standard input, print the name of the tests that are to be re-run
+# upon "make recheck".
+am__list_recheck_tests = $(AWK) '{ \
+  recheck = 1; \
+  while ((rc = (getline line < ($$0 ".trs"))) != 0) \
+    { \
+      if (rc < 0) \
+        { \
+          if ((getline line2 < ($$0 ".log")) < 0) \
+	    recheck = 0; \
+          break; \
+        } \
+      else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \
+        { \
+          recheck = 0; \
+          break; \
+        } \
+      else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \
+        { \
+          break; \
+        } \
+    }; \
+  if (recheck) \
+    print $$0; \
+  close ($$0 ".trs"); \
+  close ($$0 ".log"); \
+}'
+# A command that, given a newline-separated list of test names on the
+# standard input, create the global log from their .trs and .log files.
+am__create_global_log = $(AWK) ' \
+function fatal(msg) \
+{ \
+  print "fatal: making $@: " msg | "cat >&2"; \
+  exit 1; \
+} \
+function rst_section(header) \
+{ \
+  print header; \
+  len = length(header); \
+  for (i = 1; i <= len; i = i + 1) \
+    printf "="; \
+  printf "\n\n"; \
+} \
+{ \
+  copy_in_global_log = 1; \
+  global_test_result = "RUN"; \
+  while ((rc = (getline line < ($$0 ".trs"))) != 0) \
+    { \
+      if (rc < 0) \
+         fatal("failed to read from " $$0 ".trs"); \
+      if (line ~ /$(am__global_test_result_rx)/) \
+        { \
+          sub("$(am__global_test_result_rx)", "", line); \
+          sub("[ 	]*$$", "", line); \
+          global_test_result = line; \
+        } \
+      else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \
+        copy_in_global_log = 0; \
+    }; \
+  if (copy_in_global_log) \
+    { \
+      rst_section(global_test_result ": " $$0); \
+      while ((rc = (getline line < ($$0 ".log"))) != 0) \
+      { \
+        if (rc < 0) \
+          fatal("failed to read from " $$0 ".log"); \
+        print line; \
+      }; \
+      printf "\n"; \
+    }; \
+  close ($$0 ".trs"); \
+  close ($$0 ".log"); \
+}'
+# Restructured Text title.
+am__rst_title = { sed 's/.*/   &   /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; }
+# Solaris 10 'make', and several other traditional 'make' implementations,
+# pass "-e" to $(SHELL), and POSIX 2008 even requires this.  Work around it
+# by disabling -e (using the XSI extension "set +e") if it's set.
+am__sh_e_setup = case $$- in *e*) set +e;; esac
+# Default flags passed to test drivers.
+am__common_driver_flags = \
+  --color-tests "$$am__color_tests" \
+  --enable-hard-errors "$$am__enable_hard_errors" \
+  --expect-failure "$$am__expect_failure"
+# To be inserted before the command running the test.  Creates the
+# directory for the log if needed.  Stores in $dir the directory
+# containing $f, in $tst the test, in $log the log.  Executes the
+# developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and
+# passes TESTS_ENVIRONMENT.  Set up options for the wrapper that
+# will run the test scripts (or their associated LOG_COMPILER, if
+# thy have one).
+am__check_pre = \
+$(am__sh_e_setup);					\
+$(am__vpath_adj_setup) $(am__vpath_adj)			\
+$(am__tty_colors);					\
+srcdir=$(srcdir); export srcdir;			\
+case "$@" in						\
+  */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;;	\
+    *) am__odir=.;; 					\
+esac;							\
+test "x$$am__odir" = x"." || test -d "$$am__odir" 	\
+  || $(MKDIR_P) "$$am__odir" || exit $$?;		\
+if test -f "./$$f"; then dir=./;			\
+elif test -f "$$f"; then dir=;				\
+else dir="$(srcdir)/"; fi;				\
+tst=$$dir$$f; log='$@'; 				\
+if test -n '$(DISABLE_HARD_ERRORS)'; then		\
+  am__enable_hard_errors=no; 				\
+else							\
+  am__enable_hard_errors=yes; 				\
+fi; 							\
+case " $(XFAIL_TESTS) " in				\
+  *[\ \	]$$f[\ \	]* | *[\ \	]$$dir$$f[\ \	]*) \
+    am__expect_failure=yes;;				\
+  *)							\
+    am__expect_failure=no;;				\
+esac; 							\
+$(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT)
+# A shell command to get the names of the tests scripts with any registered
+# extension removed (i.e., equivalently, the names of the test logs, with
+# the '.log' extension removed).  The result is saved in the shell variable
+# '$bases'.  This honors runtime overriding of TESTS and TEST_LOGS.  Sadly,
+# we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)",
+# since that might cause problem with VPATH rewrites for suffix-less tests.
+# See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'.
+am__set_TESTS_bases = \
+  bases='$(TEST_LOGS)'; \
+  bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \
+  bases=`echo $$bases`
+RECHECK_LOGS = $(TEST_LOGS)
+AM_RECURSIVE_TARGETS = check recheck
+TEST_SUITE_LOG = test-suite.log
+TEST_EXTENSIONS = @EXEEXT@ .test
+LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver
+LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS)
+am__set_b = \
+  case '$@' in \
+    */*) \
+      case '$*' in \
+        */*) b='$*';; \
+          *) b=`echo '$@' | sed 's/\.log$$//'`; \
+       esac;; \
+    *) \
+      b='$*';; \
+  esac
+am__test_logs1 = $(TESTS:=.log)
+am__test_logs2 = $(am__test_logs1:@EXEEXT at .log=.log)
+TEST_LOGS = $(am__test_logs2:.test.log=.log)
+TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver
+TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \
+	$(TEST_LOG_FLAGS)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+ALLOCA = @ALLOCA@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BUILD_INTERNAL_DOCS = @BUILD_INTERNAL_DOCS@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+DOT = @DOT@
+DOXYGEN = @DOXYGEN@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+F77 = @F77@
+FC = @FC@
+FCFLAGS = @FCFLAGS@
+FCFLAGS_f90 = @FCFLAGS_f90@
+FFLAGS = @FFLAGS@
+FGREP = @FGREP@
+GREP = @GREP@
+HAS_DAP = @HAS_DAP@
+HAS_F03 = @HAS_F03@
+HAS_F90 = @HAS_F90@
+HAS_NC2 = @HAS_NC2@
+HAS_NC4 = @HAS_NC4@
+HAVE_DOT = @HAVE_DOT@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MKDIR_P = @MKDIR_P@
+MOD_FLAG = @MOD_FLAG@
+NC_FLIBS = @NC_FLIBS@
+NC_LIBS = @NC_LIBS@
+NM = @NM@
+NMEDIT = @NMEDIT@
+NMFLAGS = @NMFLAGS@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+VERSION = @VERSION@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+ac_ct_F77 = @ac_ct_F77@
+ac_ct_FC = @ac_ct_FC@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target = @target@
+target_alias = @target_alias@
+target_cpu = @target_cpu@
+target_os = @target_os@
+target_vendor = @target_vendor@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+AM_FCFLAGS = -I$(top_srcdir)/fortran ${AM_CPPFLAGS} $(FCFLAGS_f90) \
+	@MOD_FLAG@$(top_builddir)/fortran
+AM_FFLAGS = ${AM_FCFLAGS}
+AM_LDFLAGS = ${top_builddir}/fortran/libnetcdff.la -lnetcdf
+
+# These are the example programs.
+TESTPROGRAMS = simple_xy_wr simple_xy_rd sfc_pres_temp_wr \
+	sfc_pres_temp_rd pres_temp_4D_wr pres_temp_4D_rd \
+	$(am__append_1)
+ at USE_NETCDF4_TRUE@simple_xy_nc4_wr_SOURCES = simple_xy_nc4_wr.f
+ at USE_NETCDF4_TRUE@simple_xy_nc4_rd_SOURCES = simple_xy_nc4_rd.f
+EXTRA_DIST = do_comps.sh CMakeLists.txt
+
+# Here's the source code for the programs.
+simple_xy_wr_SOURCES = simple_xy_wr.f
+simple_xy_rd_SOURCES = simple_xy_rd.f
+sfc_pres_temp_wr_SOURCES = sfc_pres_temp_wr.f
+sfc_pres_temp_rd_SOURCES = sfc_pres_temp_rd.f
+pres_temp_4D_wr_SOURCES = pres_temp_4D_wr.f
+pres_temp_4D_rd_SOURCES = pres_temp_4D_rd.f
+
+# Cleaning up files created during the process.
+CLEANFILES = simple_xy.nc sfc_pres_temp.nc pres_temp_4D.nc	\
+simple_xy_nc4.nc
+
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .f .lo .log .o .obj .test .test$(EXEEXT) .trs
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign examples/F77/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign examples/F77/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+
+clean-checkPROGRAMS:
+	@list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \
+	echo " rm -f" $$list; \
+	rm -f $$list || exit $$?; \
+	test -n "$(EXEEXT)" || exit 0; \
+	list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
+	echo " rm -f" $$list; \
+	rm -f $$list
+
+pres_temp_4D_rd$(EXEEXT): $(pres_temp_4D_rd_OBJECTS) $(pres_temp_4D_rd_DEPENDENCIES) $(EXTRA_pres_temp_4D_rd_DEPENDENCIES) 
+	@rm -f pres_temp_4D_rd$(EXEEXT)
+	$(AM_V_F77LD)$(F77LINK) $(pres_temp_4D_rd_OBJECTS) $(pres_temp_4D_rd_LDADD) $(LIBS)
+
+pres_temp_4D_wr$(EXEEXT): $(pres_temp_4D_wr_OBJECTS) $(pres_temp_4D_wr_DEPENDENCIES) $(EXTRA_pres_temp_4D_wr_DEPENDENCIES) 
+	@rm -f pres_temp_4D_wr$(EXEEXT)
+	$(AM_V_F77LD)$(F77LINK) $(pres_temp_4D_wr_OBJECTS) $(pres_temp_4D_wr_LDADD) $(LIBS)
+
+sfc_pres_temp_rd$(EXEEXT): $(sfc_pres_temp_rd_OBJECTS) $(sfc_pres_temp_rd_DEPENDENCIES) $(EXTRA_sfc_pres_temp_rd_DEPENDENCIES) 
+	@rm -f sfc_pres_temp_rd$(EXEEXT)
+	$(AM_V_F77LD)$(F77LINK) $(sfc_pres_temp_rd_OBJECTS) $(sfc_pres_temp_rd_LDADD) $(LIBS)
+
+sfc_pres_temp_wr$(EXEEXT): $(sfc_pres_temp_wr_OBJECTS) $(sfc_pres_temp_wr_DEPENDENCIES) $(EXTRA_sfc_pres_temp_wr_DEPENDENCIES) 
+	@rm -f sfc_pres_temp_wr$(EXEEXT)
+	$(AM_V_F77LD)$(F77LINK) $(sfc_pres_temp_wr_OBJECTS) $(sfc_pres_temp_wr_LDADD) $(LIBS)
+
+simple_xy_nc4_rd$(EXEEXT): $(simple_xy_nc4_rd_OBJECTS) $(simple_xy_nc4_rd_DEPENDENCIES) $(EXTRA_simple_xy_nc4_rd_DEPENDENCIES) 
+	@rm -f simple_xy_nc4_rd$(EXEEXT)
+	$(AM_V_F77LD)$(F77LINK) $(simple_xy_nc4_rd_OBJECTS) $(simple_xy_nc4_rd_LDADD) $(LIBS)
+
+simple_xy_nc4_wr$(EXEEXT): $(simple_xy_nc4_wr_OBJECTS) $(simple_xy_nc4_wr_DEPENDENCIES) $(EXTRA_simple_xy_nc4_wr_DEPENDENCIES) 
+	@rm -f simple_xy_nc4_wr$(EXEEXT)
+	$(AM_V_F77LD)$(F77LINK) $(simple_xy_nc4_wr_OBJECTS) $(simple_xy_nc4_wr_LDADD) $(LIBS)
+
+simple_xy_rd$(EXEEXT): $(simple_xy_rd_OBJECTS) $(simple_xy_rd_DEPENDENCIES) $(EXTRA_simple_xy_rd_DEPENDENCIES) 
+	@rm -f simple_xy_rd$(EXEEXT)
+	$(AM_V_F77LD)$(F77LINK) $(simple_xy_rd_OBJECTS) $(simple_xy_rd_LDADD) $(LIBS)
+
+simple_xy_wr$(EXEEXT): $(simple_xy_wr_OBJECTS) $(simple_xy_wr_DEPENDENCIES) $(EXTRA_simple_xy_wr_DEPENDENCIES) 
+	@rm -f simple_xy_wr$(EXEEXT)
+	$(AM_V_F77LD)$(F77LINK) $(simple_xy_wr_OBJECTS) $(simple_xy_wr_LDADD) $(LIBS)
+
+mostlyclean-compile:
+	-rm -f *.$(OBJEXT)
+
+distclean-compile:
+	-rm -f *.tab.c
+
+.f.o:
+	$(AM_V_F77)$(F77COMPILE) -c -o $@ $<
+
+.f.obj:
+	$(AM_V_F77)$(F77COMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.f.lo:
+	$(AM_V_F77)$(LTF77COMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+	-rm -f *.lo
+
+clean-libtool:
+	-rm -rf .libs _libs
+
+ID: $(am__tagged_files)
+	$(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-am
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+	set x; \
+	here=`pwd`; \
+	$(am__define_uniq_tagged_files); \
+	shift; \
+	if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+	  test -n "$$unique" || unique=$$empty_fix; \
+	  if test $$# -gt 0; then \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      "$$@" $$unique; \
+	  else \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      $$unique; \
+	  fi; \
+	fi
+ctags: ctags-am
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+	$(am__define_uniq_tagged_files); \
+	test -z "$(CTAGS_ARGS)$$unique" \
+	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+	     $$unique
+
+GTAGS:
+	here=`$(am__cd) $(top_builddir) && pwd` \
+	  && $(am__cd) $(top_srcdir) \
+	  && gtags -i $(GTAGS_ARGS) "$$here"
+cscopelist: cscopelist-am
+
+cscopelist-am: $(am__tagged_files)
+	list='$(am__tagged_files)'; \
+	case "$(srcdir)" in \
+	  [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+	  *) sdir=$(subdir)/$(srcdir) ;; \
+	esac; \
+	for i in $$list; do \
+	  if test -f "$$i"; then \
+	    echo "$(subdir)/$$i"; \
+	  else \
+	    echo "$$sdir/$$i"; \
+	  fi; \
+	done >> $(top_builddir)/cscope.files
+
+distclean-tags:
+	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+# Recover from deleted '.trs' file; this should ensure that
+# "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create
+# both 'foo.log' and 'foo.trs'.  Break the recipe in two subshells
+# to avoid problems with "make -n".
+.log.trs:
+	rm -f $< $@
+	$(MAKE) $(AM_MAKEFLAGS) $<
+
+# Leading 'am--fnord' is there to ensure the list of targets does not
+# expand to empty, as could happen e.g. with make check TESTS=''.
+am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck)
+am--force-recheck:
+	@:
+
+$(TEST_SUITE_LOG): $(TEST_LOGS)
+	@$(am__set_TESTS_bases); \
+	am__f_ok () { test -f "$$1" && test -r "$$1"; }; \
+	redo_bases=`for i in $$bases; do \
+	              am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \
+	            done`; \
+	if test -n "$$redo_bases"; then \
+	  redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \
+	  redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \
+	  if $(am__make_dryrun); then :; else \
+	    rm -f $$redo_logs && rm -f $$redo_results || exit 1; \
+	  fi; \
+	fi; \
+	if test -n "$$am__remaking_logs"; then \
+	  echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \
+	       "recursion detected" >&2; \
+	else \
+	  am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \
+	fi; \
+	if $(am__make_dryrun); then :; else \
+	  st=0;  \
+	  errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \
+	  for i in $$redo_bases; do \
+	    test -f $$i.trs && test -r $$i.trs \
+	      || { echo "$$errmsg $$i.trs" >&2; st=1; }; \
+	    test -f $$i.log && test -r $$i.log \
+	      || { echo "$$errmsg $$i.log" >&2; st=1; }; \
+	  done; \
+	  test $$st -eq 0 || exit 1; \
+	fi
+	@$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \
+	ws='[ 	]'; \
+	results=`for b in $$bases; do echo $$b.trs; done`; \
+	test -n "$$results" || results=/dev/null; \
+	all=`  grep "^$$ws*:test-result:"           $$results | wc -l`; \
+	pass=` grep "^$$ws*:test-result:$$ws*PASS"  $$results | wc -l`; \
+	fail=` grep "^$$ws*:test-result:$$ws*FAIL"  $$results | wc -l`; \
+	skip=` grep "^$$ws*:test-result:$$ws*SKIP"  $$results | wc -l`; \
+	xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \
+	xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \
+	error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \
+	if test `expr $$fail + $$xpass + $$error` -eq 0; then \
+	  success=true; \
+	else \
+	  success=false; \
+	fi; \
+	br='==================='; br=$$br$$br$$br$$br; \
+	result_count () \
+	{ \
+	    if test x"$$1" = x"--maybe-color"; then \
+	      maybe_colorize=yes; \
+	    elif test x"$$1" = x"--no-color"; then \
+	      maybe_colorize=no; \
+	    else \
+	      echo "$@: invalid 'result_count' usage" >&2; exit 4; \
+	    fi; \
+	    shift; \
+	    desc=$$1 count=$$2; \
+	    if test $$maybe_colorize = yes && test $$count -gt 0; then \
+	      color_start=$$3 color_end=$$std; \
+	    else \
+	      color_start= color_end=; \
+	    fi; \
+	    echo "$${color_start}# $$desc $$count$${color_end}"; \
+	}; \
+	create_testsuite_report () \
+	{ \
+	  result_count $$1 "TOTAL:" $$all   "$$brg"; \
+	  result_count $$1 "PASS: " $$pass  "$$grn"; \
+	  result_count $$1 "SKIP: " $$skip  "$$blu"; \
+	  result_count $$1 "XFAIL:" $$xfail "$$lgn"; \
+	  result_count $$1 "FAIL: " $$fail  "$$red"; \
+	  result_count $$1 "XPASS:" $$xpass "$$red"; \
+	  result_count $$1 "ERROR:" $$error "$$mgn"; \
+	}; \
+	{								\
+	  echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" |	\
+	    $(am__rst_title);						\
+	  create_testsuite_report --no-color;				\
+	  echo;								\
+	  echo ".. contents:: :depth: 2";				\
+	  echo;								\
+	  for b in $$bases; do echo $$b; done				\
+	    | $(am__create_global_log);					\
+	} >$(TEST_SUITE_LOG).tmp || exit 1;				\
+	mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG);			\
+	if $$success; then						\
+	  col="$$grn";							\
+	 else								\
+	  col="$$red";							\
+	  test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG);		\
+	fi;								\
+	echo "$${col}$$br$${std}"; 					\
+	echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}";	\
+	echo "$${col}$$br$${std}"; 					\
+	create_testsuite_report --maybe-color;				\
+	echo "$$col$$br$$std";						\
+	if $$success; then :; else					\
+	  echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}";		\
+	  if test -n "$(PACKAGE_BUGREPORT)"; then			\
+	    echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}";	\
+	  fi;								\
+	  echo "$$col$$br$$std";					\
+	fi;								\
+	$$success || exit 1
+
+check-TESTS:
+	@list='$(RECHECK_LOGS)';           test -z "$$list" || rm -f $$list
+	@list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list
+	@test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+	@set +e; $(am__set_TESTS_bases); \
+	log_list=`for i in $$bases; do echo $$i.log; done`; \
+	trs_list=`for i in $$bases; do echo $$i.trs; done`; \
+	log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \
+	$(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \
+	exit $$?;
+recheck: all $(check_PROGRAMS)
+	@test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+	@set +e; $(am__set_TESTS_bases); \
+	bases=`for i in $$bases; do echo $$i; done \
+	         | $(am__list_recheck_tests)` || exit 1; \
+	log_list=`for i in $$bases; do echo $$i.log; done`; \
+	log_list=`echo $$log_list`; \
+	$(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \
+	        am__force_recheck=am--force-recheck \
+	        TEST_LOGS="$$log_list"; \
+	exit $$?
+simple_xy_wr.log: simple_xy_wr$(EXEEXT)
+	@p='simple_xy_wr$(EXEEXT)'; \
+	b='simple_xy_wr'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+simple_xy_rd.log: simple_xy_rd$(EXEEXT)
+	@p='simple_xy_rd$(EXEEXT)'; \
+	b='simple_xy_rd'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+sfc_pres_temp_wr.log: sfc_pres_temp_wr$(EXEEXT)
+	@p='sfc_pres_temp_wr$(EXEEXT)'; \
+	b='sfc_pres_temp_wr'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+sfc_pres_temp_rd.log: sfc_pres_temp_rd$(EXEEXT)
+	@p='sfc_pres_temp_rd$(EXEEXT)'; \
+	b='sfc_pres_temp_rd'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+pres_temp_4D_wr.log: pres_temp_4D_wr$(EXEEXT)
+	@p='pres_temp_4D_wr$(EXEEXT)'; \
+	b='pres_temp_4D_wr'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+pres_temp_4D_rd.log: pres_temp_4D_rd$(EXEEXT)
+	@p='pres_temp_4D_rd$(EXEEXT)'; \
+	b='pres_temp_4D_rd'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+simple_xy_nc4_wr.log: simple_xy_nc4_wr$(EXEEXT)
+	@p='simple_xy_nc4_wr$(EXEEXT)'; \
+	b='simple_xy_nc4_wr'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+simple_xy_nc4_rd.log: simple_xy_nc4_rd$(EXEEXT)
+	@p='simple_xy_nc4_rd$(EXEEXT)'; \
+	b='simple_xy_nc4_rd'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+.test.log:
+	@p='$<'; \
+	$(am__set_b); \
+	$(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+ at am__EXEEXT_TRUE@.test$(EXEEXT).log:
+ at am__EXEEXT_TRUE@	@p='$<'; \
+ at am__EXEEXT_TRUE@	$(am__set_b); \
+ at am__EXEEXT_TRUE@	$(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \
+ at am__EXEEXT_TRUE@	--log-file $$b.log --trs-file $$b.trs \
+ at am__EXEEXT_TRUE@	$(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \
+ at am__EXEEXT_TRUE@	"$$tst" $(AM_TESTS_FD_REDIRECT)
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+	  else \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
+	    || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+	$(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS)
+	$(MAKE) $(AM_MAKEFLAGS) check-TESTS
+check: check-am
+all-am: Makefile
+installdirs:
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	if test -z '$(STRIP)'; then \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	      install; \
+	else \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	    "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+	fi
+mostlyclean-generic:
+	-test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS)
+	-test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs)
+	-test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+
+clean-generic:
+	-test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-checkPROGRAMS clean-generic clean-libtool \
+	mostlyclean-am
+
+distclean: distclean-am
+	-rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+	distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+	mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am:
+
+.MAKE: check-am install-am install-strip
+
+.PHONY: CTAGS GTAGS TAGS all all-am check check-TESTS check-am clean \
+	clean-checkPROGRAMS clean-generic clean-libtool cscopelist-am \
+	ctags ctags-am distclean distclean-compile distclean-generic \
+	distclean-libtool distclean-tags distdir dvi dvi-am html \
+	html-am info info-am install install-am install-data \
+	install-data-am install-dvi install-dvi-am install-exec \
+	install-exec-am install-html install-html-am install-info \
+	install-info-am install-man install-pdf install-pdf-am \
+	install-ps install-ps-am install-strip installcheck \
+	installcheck-am installdirs maintainer-clean \
+	maintainer-clean-generic mostlyclean mostlyclean-compile \
+	mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+	recheck tags tags-am uninstall uninstall-am
+
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/examples/F77/do_comps.sh b/examples/F77/do_comps.sh
new file mode 100755
index 0000000..bc19802
--- /dev/null
+++ b/examples/F77/do_comps.sh
@@ -0,0 +1,18 @@
+#!/bin/sh
+# This shell script runs the cmp test on the example programs.
+# $Id: do_comps.sh,v 1.3 2006/06/14 20:48:36 ed Exp $
+
+set -e
+echo ""
+echo "*** Testing that F77 examples produced same files as C examples."
+echo "*** checking simple_xy.nc..."
+cmp simple_xy.nc ../C/simple_xy.nc
+
+echo "*** checking sfc_pres_temp.nc..."
+cmp sfc_pres_temp.nc ../C/sfc_pres_temp.nc
+
+echo "*** checking pres_temp_4D.nc..."
+cmp pres_temp_4D.nc ../C/pres_temp_4D.nc
+
+echo "*** All F77 example comparisons worked!"
+exit 0
diff --git a/examples/F77/pres_temp_4D_rd.f b/examples/F77/pres_temp_4D_rd.f
new file mode 100644
index 0000000..da85915
--- /dev/null
+++ b/examples/F77/pres_temp_4D_rd.f
@@ -0,0 +1,169 @@
+C     This is part of the netCDF package.
+C     Copyright 2006 University Corporation for Atmospheric Research/Unidata.
+C     See COPYRIGHT file for conditions of use.
+
+C     This is an example which reads some 4D pressure and
+C     temperatures. The data file read by this program is produced by
+C     the companion program pres_temp_4D_wr.f. It is intended to
+C     illustrate the use of the netCDF Fortran 77 API.
+
+C     This program is part of the netCDF tutorial:
+C     http://www.unidata.ucar.edu/software/netcdf/docs/netcdf-tutorial
+
+C     Full documentation of the netCDF Fortran 77 API can be found at:
+C     http://www.unidata.ucar.edu/software/netcdf/docs/netcdf-f77
+
+C     $Id: pres_temp_4D_rd.f,v 1.12 2007/02/14 20:59:20 ed Exp $
+
+      program pres_temp_4D_rd
+      implicit none
+      include 'netcdf.inc'
+
+C     This is the name of the data file we will read.
+      character*(*) FILE_NAME
+      parameter (FILE_NAME='pres_temp_4D.nc')
+      integer ncid
+
+C     We are reading 4D data, a 12 x 6 x 2 lon-lat-lvl grid, with 2
+C     timesteps of data.
+      integer NDIMS, NRECS
+      parameter (NDIMS = 4, NRECS = 2)
+      integer NLVLS, NLATS, NLONS
+      parameter (NLVLS = 2, NLATS = 6, NLONS = 12)
+      character*(*) LVL_NAME, LAT_NAME, LON_NAME, REC_NAME
+      parameter (LVL_NAME = 'level')
+      parameter (LAT_NAME = 'latitude', LON_NAME = 'longitude')
+      parameter (REC_NAME = 'time')
+      integer lvl_dimid, lon_dimid, lat_dimid, rec_dimid
+
+C     The start and count arrays will tell the netCDF library where to
+C     read our data.
+      integer start(NDIMS), count(NDIMS)
+
+C     In addition to the latitude and longitude dimensions, we will also
+C     create latitude and longitude variables which will hold the actual
+C     latitudes and longitudes. Since they hold data about the
+C     coordinate system, the netCDF term for these is: "coordinate
+C     variables."
+      real lats(NLATS), lons(NLONS)
+      integer lon_varid, lat_varid
+
+C     We will read surface temperature and pressure fields. In netCDF
+C     terminology these are called "variables."
+      character*(*) PRES_NAME, TEMP_NAME
+      parameter (PRES_NAME='pressure')
+      parameter (TEMP_NAME='temperature')
+      integer pres_varid, temp_varid
+      integer dimids(NDIMS)
+
+C     We recommend that each variable carry a "units" attribute.
+      character*(*) UNITS
+      parameter (UNITS = 'units')
+      character*(*) PRES_UNITS, TEMP_UNITS, LAT_UNITS, LON_UNITS
+      parameter (PRES_UNITS = 'hPa', TEMP_UNITS = 'celsius')
+      parameter (LAT_UNITS = 'degrees_north')
+      parameter (LON_UNITS = 'degrees_east')
+
+C     Program variables to hold the data we will read in. We will only
+C     need enough space to hold one timestep of data; one record.
+      real pres_in(NLONS, NLATS, NLVLS)
+      real temp_in(NLONS, NLATS, NLVLS)
+      real SAMPLE_PRESSURE
+      parameter (SAMPLE_PRESSURE = 900.0)
+      real SAMPLE_TEMP
+      parameter (SAMPLE_TEMP = 9.0)
+
+C     Use these to calculate the values we expect to find.
+      integer START_LAT, START_LON
+      parameter (START_LAT = 25.0, START_LON = -125.0)
+
+C     Loop indices.
+      integer lvl, lat, lon, rec, i
+
+C     Error handling.
+      integer retval
+
+C     Open the file. 
+      retval = nf_open(FILE_NAME, nf_nowrite, ncid)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+
+C     Get the varids of the latitude and longitude coordinate variables.
+      retval = nf_inq_varid(ncid, LAT_NAME, lat_varid)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      retval = nf_inq_varid(ncid, LON_NAME, lon_varid)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+
+C     Read the latitude and longitude data.
+      retval = nf_get_var_real(ncid, lat_varid, lats)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      retval = nf_get_var_real(ncid, lon_varid, lons)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+
+C     Check to make sure we got what we expected.
+      do lat = 1, NLATS
+         if (lats(lat) .ne. START_LAT + (lat - 1) * 5.0) stop 2
+      end do
+      do lon = 1, NLONS
+         if (lons(lon) .ne. START_LON + (lon - 1) * 5.0) stop 2
+      end do
+
+C     Get the varids of the pressure and temperature netCDF variables.
+      retval = nf_inq_varid(ncid, PRES_NAME, pres_varid)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      retval = nf_inq_varid(ncid, TEMP_NAME, temp_varid)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+
+C     Read 1 record of NLONS*NLATS*NLVLS values, starting at the
+C     beginning of the record (the (1, 1, 1, rec) element in the netCDF
+C     file).
+      count(1) = NLONS
+      count(2) = NLATS
+      count(3) = NLVLS
+      count(4) = 1
+      start(1) = 1
+      start(2) = 1
+      start(3) = 1
+
+C     Read the surface pressure and temperature data from the file, one
+C     record at a time.
+      do rec = 1, NRECS
+         start(4) = rec
+         retval = nf_get_vara_real(ncid, pres_varid, start, count,
+     $        pres_in)
+         if (retval .ne. nf_noerr) call handle_err(retval)
+         retval = nf_get_vara_real(ncid, temp_varid, start, count,
+     $        temp_in)
+         if (retval .ne. nf_noerr) call handle_err(retval)
+
+         i = 0
+         do lvl = 1, NLVLS
+            do lat = 1, NLATS
+               do lon = 1, NLONS
+                  if (pres_in(lon, lat, lvl) .ne. SAMPLE_PRESSURE + i) 
+     $                 stop 2
+                  if (temp_in(lon, lat, lvl) .ne. SAMPLE_TEMP + i)
+     $                 stop 2
+                  i = i + 1
+               end do
+            end do
+         end do
+C     next record
+      end do
+         
+C     Close the file. This frees up any internal netCDF resources
+C     associated with the file.
+      retval = nf_close(ncid)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+
+C     If we got this far, everything worked as expected. Yipee!
+      print *,'*** SUCCESS reading example file pres_temp_4D.nc!'
+      end
+
+      subroutine handle_err(errcode)
+      implicit none
+      include 'netcdf.inc'
+      integer errcode
+
+      print *, 'Error: ', nf_strerror(errcode)
+      stop 2
+      end
diff --git a/examples/F77/pres_temp_4D_wr.f b/examples/F77/pres_temp_4D_wr.f
new file mode 100644
index 0000000..ded52f2
--- /dev/null
+++ b/examples/F77/pres_temp_4D_wr.f
@@ -0,0 +1,215 @@
+C     This is part of the netCDF package.
+C     Copyright 2006 University Corporation for Atmospheric Research/Unidata.
+C     See COPYRIGHT file for conditions of use.
+
+C     This is an example program which writes some 4D pressure and
+C     temperatures. It is intended to illustrate the use of the netCDF
+C     fortran 77 API. The companion program pres_temp_4D_rd.f shows how
+C     to read the netCDF data file created by this program.
+
+C     This program is part of the netCDF tutorial:
+C     http://www.unidata.ucar.edu/software/netcdf/docs/netcdf-tutorial
+
+C     Full documentation of the netCDF Fortran 77 API can be found at:
+C     http://www.unidata.ucar.edu/software/netcdf/docs/netcdf-f77
+
+C     $Id: pres_temp_4D_wr.f,v 1.12 2007/02/14 20:59:20 ed Exp $
+
+      program pres_temp_4D_wr
+      implicit none
+      include 'netcdf.inc'
+
+C     This is the name of the data file we will create.
+      character*(*) FILE_NAME
+      parameter (FILE_NAME = 'pres_temp_4D.nc')
+      integer ncid
+
+C     We are writing 4D data, a 12 x 6 x 2 lon-lat-lvl grid, with 2
+C     timesteps of data.
+      integer NDIMS, NRECS
+      parameter (NDIMS = 4, NRECS = 2)
+      integer NLVLS, NLATS, NLONS
+      parameter (NLVLS = 2, NLATS = 6, NLONS = 12)
+      character*(*) LVL_NAME, LAT_NAME, LON_NAME, REC_NAME
+      parameter (LVL_NAME = 'level')
+      parameter (LAT_NAME = 'latitude', LON_NAME = 'longitude')
+      parameter (REC_NAME = 'time')
+      integer lvl_dimid, lon_dimid, lat_dimid, rec_dimid
+
+C     The start and count arrays will tell the netCDF library where to
+C     write our data.
+      integer start(NDIMS), count(NDIMS)
+
+C     These program variables hold the latitudes and longitudes.
+      real lats(NLATS), lons(NLONS)
+      integer lon_varid, lat_varid
+
+C     We will create two netCDF variables, one each for temperature and
+C     pressure fields.
+      character*(*) PRES_NAME, TEMP_NAME
+      parameter (PRES_NAME='pressure')
+      parameter (TEMP_NAME='temperature')
+      integer pres_varid, temp_varid
+      integer dimids(NDIMS)
+
+C     We recommend that each variable carry a "units" attribute.
+      character*(*) UNITS
+      parameter (UNITS = 'units')
+      character*(*) PRES_UNITS, TEMP_UNITS, LAT_UNITS, LON_UNITS
+      parameter (PRES_UNITS = 'hPa', TEMP_UNITS = 'celsius')
+      parameter (LAT_UNITS = 'degrees_north')
+      parameter (LON_UNITS = 'degrees_east')
+
+C     Program variables to hold the data we will write out. We will only
+C     need enough space to hold one timestep of data; one record.
+      real pres_out(NLONS, NLATS, NLVLS)
+      real temp_out(NLONS, NLATS, NLVLS)
+      real SAMPLE_PRESSURE
+      parameter (SAMPLE_PRESSURE = 900.0)
+      real SAMPLE_TEMP
+      parameter (SAMPLE_TEMP = 9.0)
+
+C     Use these to construct some latitude and longitude data for this
+C     example.
+      integer START_LAT, START_LON
+      parameter (START_LAT = 25.0, START_LON = -125.0)
+
+C     Loop indices.
+      integer lvl, lat, lon, rec, i
+
+C     Error handling.
+      integer retval
+
+C     Create pretend data. If this wasn't an example program, we would
+C     have some real data to write, for example, model output.
+      do lat = 1, NLATS
+         lats(lat) = START_LAT + (lat - 1) * 5.0
+      end do
+      do lon = 1, NLONS
+         lons(lon) = START_LON + (lon - 1) * 5.0
+      end do
+      i = 0
+      do lvl = 1, NLVLS
+         do lat = 1, NLATS
+            do lon = 1, NLONS
+               pres_out(lon, lat, lvl) = SAMPLE_PRESSURE + i
+               temp_out(lon, lat, lvl) = SAMPLE_TEMP + i
+               i = i + 1
+            end do
+         end do
+      end do
+
+C     Create the file. 
+      retval = nf_create(FILE_NAME, nf_clobber, ncid)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+
+C     Define the dimensions. The record dimension is defined to have
+C     unlimited length - it can grow as needed. In this example it is
+C     the time dimension.
+      retval = nf_def_dim(ncid, LVL_NAME, NLVLS, lvl_dimid)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      retval = nf_def_dim(ncid, LAT_NAME, NLATS, lat_dimid)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      retval = nf_def_dim(ncid, LON_NAME, NLONS, lon_dimid)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      retval = nf_def_dim(ncid, REC_NAME, NF_UNLIMITED, rec_dimid)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+
+C     Define the coordinate variables. We will only define coordinate
+C     variables for lat and lon.  Ordinarily we would need to provide
+C     an array of dimension IDs for each variable's dimensions, but
+C     since coordinate variables only have one dimension, we can
+C     simply provide the address of that dimension ID (lat_dimid) and
+C     similarly for (lon_dimid).
+      retval = nf_def_var(ncid, LAT_NAME, NF_REAL, 1, lat_dimid, 
+     +     lat_varid)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      retval = nf_def_var(ncid, LON_NAME, NF_REAL, 1, lon_dimid, 
+     +     lon_varid)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+
+C     Assign units attributes to coordinate variables.
+      retval = nf_put_att_text(ncid, lat_varid, UNITS, len(LAT_UNITS), 
+     +     LAT_UNITS)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      retval = nf_put_att_text(ncid, lon_varid, UNITS, len(LON_UNITS), 
+     +     LON_UNITS)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+
+C     The dimids array is used to pass the dimids of the dimensions of
+C     the netCDF variables. Both of the netCDF variables we are creating
+C     share the same four dimensions. In Fortran, the unlimited
+C     dimension must come last on the list of dimids.
+      dimids(1) = lon_dimid
+      dimids(2) = lat_dimid
+      dimids(3) = lvl_dimid
+      dimids(4) = rec_dimid
+
+C     Define the netCDF variables for the pressure and temperature data.
+      retval = nf_def_var(ncid, PRES_NAME, NF_REAL, NDIMS, dimids, 
+     +     pres_varid)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      retval = nf_def_var(ncid, TEMP_NAME, NF_REAL, NDIMS, dimids, 
+     +     temp_varid)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+
+C     Assign units attributes to the netCDF variables.
+      retval = nf_put_att_text(ncid, pres_varid, UNITS, len(PRES_UNITS), 
+     +     PRES_UNITS)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      retval = nf_put_att_text(ncid, temp_varid, UNITS, len(TEMP_UNITS), 
+     +     TEMP_UNITS)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+
+C     End define mode.
+      retval = nf_enddef(ncid)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+
+C     Write the coordinate variable data. This will put the latitudes
+C     and longitudes of our data grid into the netCDF file.
+      retval = nf_put_var_real(ncid, lat_varid, lats)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      retval = nf_put_var_real(ncid, lon_varid, lons)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+
+C     These settings tell netcdf to write one timestep of data. (The
+C     setting of start(4) inside the loop below tells netCDF which
+C     timestep to write.)
+      count(1) = NLONS
+      count(2) = NLATS
+      count(3) = NLVLS
+      count(4) = 1
+      start(1) = 1
+      start(2) = 1
+      start(3) = 1
+
+C     Write the pretend data. This will write our surface pressure and
+C     surface temperature data. The arrays only hold one timestep worth
+C     of data. We will just rewrite the same data for each timestep. In
+C     a real application, the data would change between timesteps.
+      do rec = 1, NRECS
+         start(4) = rec
+         retval = nf_put_vara_real(ncid, pres_varid, start, count, 
+     +        pres_out)
+         if (retval .ne. nf_noerr) call handle_err(retval)
+         retval = nf_put_vara_real(ncid, temp_varid, start, count,
+     +        temp_out)
+         if (retval .ne. nf_noerr) call handle_err(retval)
+      end do
+
+C     Close the file. This causes netCDF to flush all buffers and make
+C     sure your data are really written to disk.
+      retval = nf_close(ncid)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+   
+      print *,'*** SUCCESS writing example file', FILE_NAME, '!'
+      end
+
+      subroutine handle_err(errcode)
+      implicit none
+      include 'netcdf.inc'
+      integer errcode
+
+      print *, 'Error: ', nf_strerror(errcode)
+      stop 2
+      end
diff --git a/examples/F77/sfc_pres_temp_rd.f b/examples/F77/sfc_pres_temp_rd.f
new file mode 100644
index 0000000..7bf62d3
--- /dev/null
+++ b/examples/F77/sfc_pres_temp_rd.f
@@ -0,0 +1,186 @@
+C     This is part of the netCDF package.
+C     Copyright 2006 University Corporation for Atmospheric Research/Unidata.
+C     See COPYRIGHT file for conditions of use.
+
+C     This is an example which reads some surface pressure and
+C     temperatures. The data file read by this program is produced
+C     comapnion program sfc_pres_temp_wr.f. It is intended to illustrate
+C     the use of the netCDF fortran 77 API.
+
+C     This program is part of the netCDF tutorial:
+C     http://www.unidata.ucar.edu/software/netcdf/docs/netcdf-tutorial
+
+C     Full documentation of the netCDF Fortran 77 API can be found at:
+C     http://www.unidata.ucar.edu/software/netcdf/docs/netcdf-f77
+
+C     $Id: sfc_pres_temp_rd.f,v 1.9 2007/02/14 20:59:20 ed Exp $
+
+      program sfc_pres_temp_rd
+      implicit none
+      include 'netcdf.inc'
+
+C     This is the name of the data file we will read.
+      character*(*) FILE_NAME
+      parameter (FILE_NAME='sfc_pres_temp.nc')
+      integer ncid
+
+C     We are reading 2D data, a 12 x 6 lon-lat grid.
+      integer NDIMS
+      parameter (NDIMS=2)
+      integer NLATS, NLONS
+      parameter (NLATS = 6, NLONS = 12)
+      character*(*) LAT_NAME, LON_NAME
+      parameter (LAT_NAME='latitude', LON_NAME='longitude')
+      integer lat_dimid, lon_dimid
+
+C     For the lat lon coordinate netCDF variables.
+      real lats(NLATS), lons(NLONS)
+      integer lat_varid, lon_varid
+
+C     We will read surface temperature and pressure fields. 
+      character*(*) PRES_NAME, TEMP_NAME
+      parameter (PRES_NAME='pressure')
+      parameter (TEMP_NAME='temperature')
+      integer pres_varid, temp_varid
+      integer dimids(NDIMS)
+
+C     To check the units attributes.
+      character*(*) UNITS
+      parameter (UNITS = 'units')
+      character*(*) PRES_UNITS, TEMP_UNITS, LAT_UNITS, LON_UNITS
+      parameter (PRES_UNITS = 'hPa', TEMP_UNITS = 'celsius')
+      parameter (LAT_UNITS = 'degrees_north')
+      parameter (LON_UNITS = 'degrees_east')
+      integer MAX_ATT_LEN
+      parameter (MAX_ATT_LEN = 80)
+      character*(MAX_ATT_LEN) pres_units_in, temp_units_in
+      character*(MAX_ATT_LEN) lat_units_in, lon_units_in
+      integer att_len
+
+C     Read the data into these arrays.
+      real pres_in(NLONS, NLATS), temp_in(NLONS, NLATS)
+
+C     These are used to calculate the values we expect to find.
+      real START_LAT, START_LON
+      parameter (START_LAT = 25.0, START_LON = -125.0)
+      real SAMPLE_PRESSURE
+      parameter (SAMPLE_PRESSURE = 900.0)
+      real SAMPLE_TEMP
+      parameter (SAMPLE_TEMP = 9.0)
+
+C     We will learn about the data file and store results in these
+C     program variables.
+      integer ndims_in, nvars_in, ngatts_in, unlimdimid_in
+
+C     Loop indices
+      integer lat, lon
+
+C     Error handling
+      integer retval
+
+C     Open the file. 
+      retval = nf_open(FILE_NAME, nf_nowrite, ncid)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+
+C     There are a number of inquiry functions in netCDF which can be
+C     used to learn about an unknown netCDF file. NF_INQ tells how many
+C     netCDF variables, dimensions, and global attributes are in the
+C     file; also the dimension id of the unlimited dimension, if there
+C     is one.
+      retval = nf_inq(ncid, ndims_in, nvars_in, ngatts_in, 
+     +     unlimdimid_in)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+
+C     In this case we know that there are 2 netCDF dimensions, 4 netCDF
+C     variables, no global attributes, and no unlimited dimension.
+      if (ndims_in .ne. 2 .or. nvars_in .ne. 4 .or. ngatts_in .ne. 0 
+     +     .or. unlimdimid_in .ne. -1) stop 2
+
+C     Get the varids of the latitude and longitude coordinate variables.
+      retval = nf_inq_varid(ncid, LAT_NAME, lat_varid)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      retval = nf_inq_varid(ncid, LON_NAME, lon_varid)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+
+C     Read the latitude and longitude data.
+      retval = nf_get_var_real(ncid, lat_varid, lats)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      retval = nf_get_var_real(ncid, lon_varid, lons)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+
+C     Check to make sure we got what we expected.
+      do lat = 1, NLATS
+         if (lats(lat) .ne. START_LAT + (lat - 1) * 5.0) stop 2
+      end do
+      do lon = 1, NLONS
+         if (lons(lon) .ne. START_LON + (lon - 1) * 5.0) stop 2
+      end do
+
+C     Get the varids of the pressure and temperature netCDF variables.
+      retval = nf_inq_varid(ncid, PRES_NAME, pres_varid)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      retval = nf_inq_varid(ncid, TEMP_NAME, temp_varid)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+
+C     Read the surface pressure and temperature data from the file.
+C     Since we know the contents of the file we know that the data
+C     arrays in this program are the correct size to hold all the data.
+      retval = nf_get_var_real(ncid, pres_varid, pres_in)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      retval = nf_get_var_real(ncid, temp_varid, temp_in)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+
+C     Check the data. It should be the same as the data we wrote.
+      do lon = 1, NLONS
+         do lat = 1, NLATS
+             if (pres_in(lon, lat) .ne. SAMPLE_PRESSURE +
+     +           (lon - 1) * NLATS + (lat - 1)) stop 2
+             if (temp_in(lon, lat) .ne. SAMPLE_TEMP +
+     +           .25 * ((lon - 1) * NLATS + (lat - 1))) stop 2
+         end do
+      end do
+
+C     Each of the netCDF variables has a "units" attribute. Let's read
+C     them and check them.
+
+      retval = nf_get_att_text(ncid, lat_varid, UNITS, lat_units_in)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      retval = nf_inq_attlen(ncid, lat_varid, UNITS, att_len)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      if (lat_units_in(1:att_len) .ne. LAT_UNITS) stop 2
+ 
+      retval = nf_get_att_text(ncid, lon_varid, UNITS, lon_units_in)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      retval = nf_inq_attlen(ncid, lon_varid, UNITS, att_len)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      if (lon_units_in(1:att_len) .ne. LON_UNITS) stop 2
+
+      retval = nf_get_att_text(ncid, pres_varid, UNITS, pres_units_in)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      retval = nf_inq_attlen(ncid, pres_varid, UNITS, att_len)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      if (pres_units_in(1:att_len) .ne. PRES_UNITS) stop 2
+
+      retval = nf_get_att_text(ncid, temp_varid, UNITS, temp_units_in)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      retval = nf_inq_attlen(ncid, temp_varid, UNITS, att_len)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      if (temp_units_in(1:att_len) .ne. TEMP_UNITS) stop 2
+
+C     Close the file. This frees up any internal netCDF resources
+C     associated with the file.
+      retval = nf_close(ncid)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+
+C     If we got this far, everything worked as expected. Yipee!
+      print *,'*** SUCCESS reading example file sfc_pres_temp.nc!'
+      end
+
+      subroutine handle_err(errcode)
+      implicit none
+      include 'netcdf.inc'
+      integer errcode
+
+      print *, 'Error: ', nf_strerror(errcode)
+      stop 2
+      end
diff --git a/examples/F77/sfc_pres_temp_wr.f b/examples/F77/sfc_pres_temp_wr.f
new file mode 100644
index 0000000..9ab4328
--- /dev/null
+++ b/examples/F77/sfc_pres_temp_wr.f
@@ -0,0 +1,176 @@
+C     This is part of the netCDF package.
+C     Copyright 2006 University Corporation for Atmospheric Research/Unidata.
+C     See COPYRIGHT file for conditions of use.
+
+C     This example writes some surface pressure and temperatures. It is
+C     intended to illustrate the use of the netCDF fortran 77 API. The
+C     companion program sfc_pres_temp_rd.f shows how to read the netCDF
+C     data file created by this program.
+
+C     This program is part of the netCDF tutorial:
+C     http://www.unidata.ucar.edu/software/netcdf/docs/netcdf-tutorial
+
+C     Full documentation of the netCDF Fortran 77 API can be found at:
+C     http://www.unidata.ucar.edu/software/netcdf/docs/netcdf-f77
+
+C     $Id: sfc_pres_temp_wr.f,v 1.10 2007/02/14 20:59:20 ed Exp $
+
+      program sfc_pres_temp_wr
+      implicit none
+      include 'netcdf.inc'
+
+C     This is the name of the data file we will create.
+      character*(*) FILE_NAME
+      parameter (FILE_NAME='sfc_pres_temp.nc')
+      integer ncid
+
+C     We are writing 2D data, a 12 x 6 lon-lat grid. We will need two
+C     netCDF dimensions.
+      integer NDIMS
+      parameter (NDIMS=2)
+      integer NLATS, NLONS
+      parameter (NLATS = 6, NLONS = 12)
+      character*(*) LAT_NAME, LON_NAME
+      parameter (LAT_NAME='latitude', LON_NAME='longitude')
+      integer lon_dimid, lat_dimid
+
+C     In addition to the latitude and longitude dimensions, we will also
+C     create latitude and longitude netCDF variables which will hold the
+C     actual latitudes and longitudes. Since they hold data about the
+C     coordinate system, the netCDF term for these is: "coordinate
+C     variables."
+      real lats(NLATS), lons(NLONS)
+      integer lat_varid, lon_varid
+      real START_LAT, START_LON
+      parameter (START_LAT = 25.0, START_LON = -125.0)
+
+C     We will write surface temperature and pressure fields. 
+      character*(*) PRES_NAME, TEMP_NAME
+      parameter (PRES_NAME='pressure')
+      parameter (TEMP_NAME='temperature')
+      integer pres_varid, temp_varid
+      integer dimids(NDIMS)
+
+C     It's good practice for each variable to carry a "units" attribute.
+      character*(*) UNITS
+      parameter (UNITS = 'units')
+      character*(*) PRES_UNITS, TEMP_UNITS, LAT_UNITS, LON_UNITS
+      parameter (PRES_UNITS = 'hPa', TEMP_UNITS = 'celsius')
+      parameter (LAT_UNITS = 'degrees_north')
+      parameter (LON_UNITS = 'degrees_east')
+
+C     We will create some pressure and temperature data to write out.
+      real pres_out(NLONS, NLATS), temp_out(NLONS, NLATS)
+      real SAMPLE_PRESSURE
+      parameter (SAMPLE_PRESSURE = 900.0)
+      real SAMPLE_TEMP
+      parameter (SAMPLE_TEMP = 9.0)
+
+C     Loop indices.
+      integer lat, lon
+
+C     Error handling.
+      integer retval
+
+C     Create pretend data. If this were not an example program, we would
+C     have some real data to write, for example, model output.
+      do lat = 1, NLATS
+         lats(lat) = START_LAT + (lat - 1) * 5.0
+      end do
+      do lon = 1, NLONS
+         lons(lon) = START_LON + (lon - 1) * 5.0
+      end do
+      do lon = 1, NLONS
+         do lat = 1, NLATS
+            pres_out(lon, lat) = SAMPLE_PRESSURE + 
+     +           (lon - 1) * NLATS + (lat - 1)
+            temp_out(lon, lat) = SAMPLE_TEMP + 
+     +           .25 * ((lon - 1) * NLATS + (lat - 1))
+         end do
+      end do
+
+C     Create the file. 
+      retval = nf_create(FILE_NAME, nf_clobber, ncid)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+
+C     Define the dimensions.
+      retval = nf_def_dim(ncid, LAT_NAME, NLATS, lat_dimid)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      retval = nf_def_dim(ncid, LON_NAME, NLONS, lon_dimid)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+
+C     Define the coordinate variables. They will hold the coordinate
+C     information, that is, the latitudes and longitudes. A varid is
+C     returned for each.
+      retval = nf_def_var(ncid, LAT_NAME, NF_REAL, 1, lat_dimid, 
+     +     lat_varid)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      retval = nf_def_var(ncid, LON_NAME, NF_REAL, 1, lon_dimid, 
+     +     lon_varid)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+
+C     Assign units attributes to coordinate var data. This attaches a
+C     text attribute to each of the coordinate variables, containing the
+C     units.
+      retval = nf_put_att_text(ncid, lat_varid, UNITS, len(LAT_UNITS), 
+     +     LAT_UNITS)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      retval = nf_put_att_text(ncid, lon_varid, UNITS, len(LON_UNITS), 
+     +     LON_UNITS)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+
+C     Define the netCDF variables. The dimids array is used to pass the
+C     dimids of the dimensions of the netCDF variables.
+      dimids(1) = lon_dimid
+      dimids(2) = lat_dimid
+      retval = nf_def_var(ncid, PRES_NAME, NF_REAL, NDIMS, dimids, 
+     +     pres_varid)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      retval = nf_def_var(ncid, TEMP_NAME, NF_REAL, NDIMS, dimids, 
+     +     temp_varid)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+
+C     Assign units attributes to the pressure and temperature netCDF
+C     variables.
+      retval = nf_put_att_text(ncid, pres_varid, UNITS, len(PRES_UNITS), 
+     +     PRES_UNITS)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      retval = nf_put_att_text(ncid, temp_varid, UNITS, len(TEMP_UNITS), 
+     +     TEMP_UNITS)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+
+C     End define mode.
+      retval = nf_enddef(ncid)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+
+C     Write the coordinate variable data. This will put the latitudes
+C     and longitudes of our data grid into the netCDF file.
+      retval = nf_put_var_real(ncid, lat_varid, lats)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      retval = nf_put_var_real(ncid, lon_varid, lons)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+
+C     Write the pretend data. This will write our surface pressure and
+C     surface temperature data. The arrays of data are the same size as
+C     the netCDF variables we have defined.
+      retval = nf_put_var_real(ncid, pres_varid, pres_out)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      retval = nf_put_var_real(ncid, temp_varid, temp_out)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+
+C     Close the file.
+      retval = nf_close(ncid)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+   
+C     If we got this far, everything worked as expected. Yipee!
+      print *,'*** SUCCESS writing example file sfc_pres_temp.nc!'
+      end
+
+      subroutine handle_err(errcode)
+      implicit none
+      include 'netcdf.inc'
+      integer errcode
+
+      print *, 'Error: ', nf_strerror(errcode)
+      stop 2
+      end
diff --git a/examples/F77/simple_xy_nc4_rd.f b/examples/F77/simple_xy_nc4_rd.f
new file mode 100644
index 0000000..f77c152
--- /dev/null
+++ b/examples/F77/simple_xy_nc4_rd.f
@@ -0,0 +1,74 @@
+C     This is part of the netCDF package.
+C     Copyright 2006 University Corporation for Atmospheric Research/Unidata.
+C     See COPYRIGHT file for conditions of use.
+      
+C     This is a simple example which reads a small dummy array, from a
+C     netCDF data file created by the companion program simple_xy_wr.f.
+      
+C     This is intended to illustrate the use of the netCDF fortran 77
+C     API. This example program is part of the netCDF tutorial, which can
+C     be found at:
+C     http://www.unidata.ucar.edu/software/netcdf/docs/netcdf-tutorial
+      
+C     Full documentation of the netCDF Fortran 77 API can be found at:
+C     http://www.unidata.ucar.edu/software/netcdf/docs/netcdf-f77
+
+C     $Id: simple_xy_nc4_rd.f,v 1.1 2007/05/04 13:33:20 ed Exp $
+
+      program simple_xy_rd
+      implicit none
+      include 'netcdf.inc'
+
+C     This is the name of the data file we will read. 
+      character*(*) FILE_NAME
+      parameter (FILE_NAME='simple_xy_nc4.nc')
+
+C     We are reading 2D data, a 12 x 6 grid. 
+      integer NX, NY
+      parameter (NX = 60, NY = 120)
+      integer data_in(NY, NX)
+
+C     This will be the netCDF ID for the file and data variable.
+      integer ncid, varid
+
+C     Loop indexes, and error handling.
+      integer x, y, retval
+
+C     Open the file. NF_NOWRITE tells netCDF we want read-only access to
+C     the file.
+      retval = nf_open(FILE_NAME, NF_NOWRITE, ncid)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+
+C     Get the varid of the data variable, based on its name.
+      retval = nf_inq_varid(ncid, 'data', varid)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+
+C     Read the data.
+      retval = nf_get_var_int(ncid, varid, data_in)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+
+C     Check the data.
+      do x = 1, NX
+         do y = 1, NY
+            if (data_in(y, x) .ne. (x - 1) * NY + (y - 1)) then
+               print *, 'data_in(', y, ', ', x, ') = ', data_in(y, x)
+               stop 2
+            end if
+         end do
+      end do
+
+C     Close the file, freeing all resources.
+      retval = nf_close(ncid)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+
+      print *,'*** SUCCESS reading example file ', FILE_NAME, '!'
+      end
+
+      subroutine handle_err(errcode)
+      implicit none
+      include 'netcdf.inc'
+      integer errcode
+
+      print *, 'Error: ', nf_strerror(errcode)
+      stop 2
+      end
diff --git a/examples/F77/simple_xy_nc4_wr.f b/examples/F77/simple_xy_nc4_wr.f
new file mode 100644
index 0000000..2a7c260
--- /dev/null
+++ b/examples/F77/simple_xy_nc4_wr.f
@@ -0,0 +1,97 @@
+C     This is part of the netCDF package.
+C     Copyright 2006 University Corporation for Atmospheric Research/Unidata.
+C     See COPYRIGHT file for conditions of use.
+
+C     This is a very simple example which writes a 2D array of
+C     sample data. To handle this in netCDF we create two shared
+C     dimensions, "x" and "y", and a netCDF variable, called "data".
+
+C     This example demonstrates the netCDF Fortran 77 API. This is part
+C     of the netCDF tutorial, which can be found at:
+C     http://www.unidata.ucar.edu/software/netcdf/docs/netcdf-tutorial
+
+C     Full documentation of the netCDF Fortran 77 API can be found at:
+C     http://www.unidata.ucar.edu/software/netcdf/docs/netcdf-f77
+
+C     $Id: simple_xy_nc4_wr.f,v 1.5 2008/02/19 22:01:49 ed Exp $
+
+      program simple_xy_wr
+      implicit none
+      include 'netcdf.inc'
+
+      character*(*) FILE_NAME
+      parameter (FILE_NAME='simple_xy_nc4.nc')
+      integer NDIMS
+      parameter (NDIMS = 2)
+      integer NX, NY
+      parameter (NX = 60, NY = 120)
+      integer ncid, varid, dimids(NDIMS)
+      integer x_dimid, y_dimid
+      integer data_out(NY, NX)
+      integer x, y, retval
+      integer chunks(2)
+      integer contiguous, shuffle, deflate, deflate_level
+
+C     Create some pretend data. If this wasn't an example program, we
+C     would have some real data to write, for example, model output.
+      do x = 1, NX
+         do y = 1, NY
+            data_out(y, x) = (x - 1) * NY + (y - 1)
+         end do
+      end do
+
+C     Create the netCDF file. The nf_netcdf4  tells netCDF to
+C     create a netCDF-4/HDF5 file.
+      retval = nf_create(FILE_NAME, NF_NETCDF4, ncid)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+
+C     Define the dimensions.
+      retval = nf_def_dim(ncid, "x", NX, x_dimid)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      retval = nf_def_dim(ncid, "y", NY, y_dimid)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+
+C     The dimids array is used to pass the IDs of the dimensions of
+C     the variables. Note that in fortran arrays are stored in
+C     column-major format.
+      dimids(2) = x_dimid
+      dimids(1) = y_dimid
+
+C     Define the variable. 
+      retval = nf_def_var(ncid, "data", NF_INT, NDIMS, dimids, varid)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+
+C     Set up chunking and compression.
+      contiguous = 0
+      chunks(1) = NY
+      chunks(2) = NX
+      shuffle = 1
+      deflate = 1
+      deflate_level = 4
+
+      retval = nf_def_var_chunking(ncid, varid, contiguous, chunks)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+
+      retval = nf_def_var_deflate(ncid, varid, shuffle, deflate,
+     &     deflate_level)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+
+C     Write the pretend data to the file.
+      retval = nf_put_var_int(ncid, varid, data_out)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+
+C     Close the file.
+      retval = nf_close(ncid)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+
+      print *,'*** SUCCESS writing example file simple_xy_nc4.nc!'
+      end
+
+      subroutine handle_err(errcode)
+      implicit none
+      include 'netcdf.inc'
+      integer errcode
+
+      print *, 'Error: ', nf_strerror(errcode)
+      stop 2
+      end
diff --git a/examples/F77/simple_xy_rd.f b/examples/F77/simple_xy_rd.f
new file mode 100644
index 0000000..ba1a20b
--- /dev/null
+++ b/examples/F77/simple_xy_rd.f
@@ -0,0 +1,74 @@
+C     This is part of the netCDF package.
+C     Copyright 2006 University Corporation for Atmospheric Research/Unidata.
+C     See COPYRIGHT file for conditions of use.
+      
+C     This is a simple example which reads a small dummy array, from a
+C     netCDF data file created by the companion program simple_xy_wr.f.
+      
+C     This is intended to illustrate the use of the netCDF fortran 77
+C     API. This example program is part of the netCDF tutorial, which can
+C     be found at:
+C     http://www.unidata.ucar.edu/software/netcdf/docs/netcdf-tutorial
+      
+C     Full documentation of the netCDF Fortran 77 API can be found at:
+C     http://www.unidata.ucar.edu/software/netcdf/docs/netcdf-f77
+
+C     $Id: simple_xy_rd.f,v 1.8 2007/02/14 20:59:20 ed Exp $
+
+      program simple_xy_rd
+      implicit none
+      include 'netcdf.inc'
+
+C     This is the name of the data file we will read. 
+      character*(*) FILE_NAME
+      parameter (FILE_NAME='simple_xy.nc')
+
+C     We are reading 2D data, a 12 x 6 grid. 
+      integer NX, NY
+      parameter (NX = 6, NY = 12)
+      integer data_in(NY, NX)
+
+C     This will be the netCDF ID for the file and data variable.
+      integer ncid, varid
+
+C     Loop indexes, and error handling.
+      integer x, y, retval
+
+C     Open the file. NF_NOWRITE tells netCDF we want read-only access to
+C     the file.
+      retval = nf_open(FILE_NAME, NF_NOWRITE, ncid)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+
+C     Get the varid of the data variable, based on its name.
+      retval = nf_inq_varid(ncid, 'data', varid)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+
+C     Read the data.
+      retval = nf_get_var_int(ncid, varid, data_in)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+
+C     Check the data.
+      do x = 1, NX
+         do y = 1, NY
+            if (data_in(y, x) .ne. (x - 1) * NY + (y - 1)) then
+               print *, 'data_in(', y, ', ', x, ') = ', data_in(y, x)
+               stop 2
+            end if
+         end do
+      end do
+
+C     Close the file, freeing all resources.
+      retval = nf_close(ncid)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+
+      print *,'*** SUCCESS reading example file ', FILE_NAME, '!'
+      end
+
+      subroutine handle_err(errcode)
+      implicit none
+      include 'netcdf.inc'
+      integer errcode
+
+      print *, 'Error: ', nf_strerror(errcode)
+      stop 2
+      end
diff --git a/examples/F77/simple_xy_wr.f b/examples/F77/simple_xy_wr.f
new file mode 100644
index 0000000..70ce394
--- /dev/null
+++ b/examples/F77/simple_xy_wr.f
@@ -0,0 +1,104 @@
+C     This is part of the netCDF package.
+C     Copyright 2006 University Corporation for Atmospheric Research/Unidata.
+C     See COPYRIGHT file for conditions of use.
+
+C     This is a very simple example which writes a 2D array of
+C     sample data. To handle this in netCDF we create two shared
+C     dimensions, "x" and "y", and a netCDF variable, called "data".
+
+C     This example demonstrates the netCDF Fortran 77 API. This is part
+C     of the netCDF tutorial, which can be found at:
+C     http://www.unidata.ucar.edu/software/netcdf/docs/netcdf-tutorial
+      
+C     Full documentation of the netCDF Fortran 77 API can be found at:
+C     http://www.unidata.ucar.edu/software/netcdf/docs/netcdf-f77
+
+C     $Id: simple_xy_wr.f,v 1.11 2008/08/20 22:29:56 russ Exp $
+
+      program simple_xy_wr
+      implicit none
+      include 'netcdf.inc'
+
+C     This is the name of the data file we will create.
+      character*(*) FILE_NAME
+      parameter (FILE_NAME='simple_xy.nc')
+
+C     We are writing 2D data, a 12 x 6 grid. 
+      integer NDIMS
+      parameter (NDIMS=2)
+      integer NX, NY
+      parameter (NX = 6, NY = 12)
+
+C     When we create netCDF files, variables and dimensions, we get back
+C     an ID for each one.
+      integer ncid, varid, dimids(NDIMS)
+      integer x_dimid, y_dimid
+
+C     This is the data array we will write. It will just be filled with
+C     a progression of integers for this example.
+      integer data_out(NY, NX)
+
+C     Loop indexes, and error handling.
+      integer x, y, retval
+
+C     Create some pretend data. If this wasn't an example program, we
+C     would have some real data to write, for example, model output.
+      do x = 1, NX
+         do y = 1, NY
+            data_out(y, x) = (x - 1) * NY + (y - 1)
+         end do
+      end do
+
+C     Always check the return code of every netCDF function call. In
+C     this example program, any retval which is not equal to nf_noerr
+C     (0) will call handle_err, which prints a netCDF error message, and
+C     then exits with a non-zero return code.
+
+C     Create the netCDF file. The nf_clobber parameter tells netCDF to
+C     overwrite this file, if it already exists.
+      retval = nf_create(FILE_NAME, NF_CLOBBER, ncid)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+
+C     Define the dimensions. NetCDF will hand back an ID for each. 
+      retval = nf_def_dim(ncid, "x", NX, x_dimid)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      retval = nf_def_dim(ncid, "y", NY, y_dimid)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+
+C     The dimids array is used to pass the IDs of the dimensions of
+C     the variables. Note that in fortran arrays are stored in
+C     column-major format.
+      dimids(2) = x_dimid
+      dimids(1) = y_dimid
+
+C     Define the variable. The type of the variable in this case is
+C     NF_INT (4-byte integer).
+      retval = nf_def_var(ncid, "data", NF_INT, NDIMS, dimids, varid)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+
+C     End define mode. This tells netCDF we are done defining metadata.
+      retval = nf_enddef(ncid)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+
+C     Write the pretend data to the file. Although netCDF supports
+C     reading and writing subsets of data, in this case we write all the
+C     data in one operation.
+      retval = nf_put_var_int(ncid, varid, data_out)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+
+C     Close the file. This frees up any internal netCDF resources
+C     associated with the file, and flushes any buffers.
+      retval = nf_close(ncid)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+
+      print *,'*** SUCCESS writing example file simple_xy.nc!'
+      end
+
+      subroutine handle_err(errcode)
+      implicit none
+      include 'netcdf.inc'
+      integer errcode
+
+      print *, 'Error: ', nf_strerror(errcode)
+      stop 2
+      end
diff --git a/examples/F90/CMakeLists.txt b/examples/F90/CMakeLists.txt
new file mode 100644
index 0000000..e45930f
--- /dev/null
+++ b/examples/F90/CMakeLists.txt
@@ -0,0 +1,28 @@
+SET(example_F90_tests simple_xy_wr simple_xy_rd sfc_pres_temp_wr sfc_pres_temp_rd pres_temp_4D_wr pres_temp_4D_rd)
+SET(example_F90_tests_source "")
+FOREACH(F ${example_F90_tests}) 
+  SET(example_F90_tests_source ${example_F90_test_source} ${F}.f90)
+ENDFOREACH()
+
+SET(prefix F90_tests)
+FOREACH(F ${example_F90_tests})
+  ADD_EXECUTABLE(${prefix}_${F} ${F}.f90)
+  TARGET_LINK_LIBRARIES(${prefix}_${F} netcdff ${NETCDF_C_LIBRARY})
+  IF(MSVC)
+    SET_TARGET_PROPERTIES(${prefix}_${F} 
+      PROPERTIES LINK_FLAGS_DEBUG " /NODEFAULTLIB:MSVCRT"
+	)
+  ENDIF()
+  ADD_TEST(${prefix}_${F} ${EXECUTABLE_OUTPUT_PATH}/${prefix}_${F})
+  IF(MSVC)
+    SET_PROPERTY(TEST ${prefix}_${F} PROPERTY FOLDER "tests/")
+  ENDIF()	
+ENDFOREACH()
+
+## Specify files to be distributed by 'make dist'
+FILE(GLOB CUR_EXTRA_DIST RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/*.f90 ${CMAKE_CURRENT_SOURCE_DIR}/*.sh)
+SET(CUR_EXTRA_DIST ${CUR_EXTRA_DIST} CMakeLists.txt Makefile.am)
+ADD_EXTRA_DIST("${CUR_EXTRA_DIST}")
+
+SET(CLEANFILES sfc_pres_temp.nc simple_xy.nc pres_temp_4D.nc simple_nc4.nc simple_xy_nc4.nc)
+SET_DIRECTORY_PROPERTIES(PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES "${CLEANFILES}")
diff --git a/examples/F90/Makefile.am b/examples/F90/Makefile.am
new file mode 100644
index 0000000..6e3aa29
--- /dev/null
+++ b/examples/F90/Makefile.am
@@ -0,0 +1,99 @@
+## This is a automake file, part of Unidata's netCDF package.
+# Copyright 2006, see the COPYRIGHT file for more information.
+
+# This file builds F90 examples.
+
+AM_FCFLAGS = -I$(top_srcdir)/fortran ${AM_CPPFLAGS}
+AM_FCFLAGS += $(FCFLAGS_f90)
+AM_FCFLAGS += @MOD_FLAG@$(top_builddir)/fortran
+AM_FFLAGS = ${AM_FCFLAGS}
+AM_LDFLAGS = ${top_builddir}/fortran/libnetcdff.la -lnetcdf
+
+# These are the example programs.
+TESTPROGRAMS = simple_xy_wr simple_xy_rd sfc_pres_temp_wr	\
+sfc_pres_temp_rd pres_temp_4D_wr pres_temp_4D_rd
+
+TESTSCRIPTS = #do_comps.sh
+
+# Here's the source code for the programs.
+simple_xy_wr_SOURCES = simple_xy_wr.f90
+simple_xy_rd_SOURCES = simple_xy_rd.f90
+sfc_pres_temp_wr_SOURCES = sfc_pres_temp_wr.f90
+sfc_pres_temp_rd_SOURCES = sfc_pres_temp_rd.f90
+pres_temp_4D_wr_SOURCES = pres_temp_4D_wr.f90
+pres_temp_4D_rd_SOURCES = pres_temp_4D_rd.f90
+
+# Cleaning up files created during the process.
+CLEANFILES = simple_xy.nc sfc_pres_temp.nc pres_temp_4D.nc
+
+if USE_NETCDF4
+
+if EXTRA_EXAMPLE_TESTS
+# This will cause netCDF-4 versions of the example programs to be
+# built.
+BUILT_SOURCES = nc4_simple_xy_wr.f90 nc4_sfc_pres_temp_wr.f90	\
+nc4_pres_temp_4D_wr.f90
+
+# How to build the example.
+nc4_simple_xy_wr_SOURCES = nc4_simple_xy_wr.f90
+nc4_sfc_pres_temp_wr_SOURCES = nc4_sfc_pres_temp_wr.f90
+nc4_pres_temp_4D_wr_SOURCES = nc4_pres_temp_4D_wr.f90
+
+# Add example to the tests run.
+TESTPROGRAMS += nc4_simple_xy_wr nc4_sfc_pres_temp_wr	\
+nc4_pres_temp_4D_wr
+
+# Add this test script.
+TESTSCRIPTS += run_nc4_comps.sh
+
+# Make sure all the files created by our netcdf-4 tests get cleaned.
+CLEANFILES += nc4_simple_xy_wr.f90 simple_xy.cdl			\
+nc4_sfc_pres_temp_wr.f90 sfc_pres_temp.cdl nc4_pres_temp_4d_wr.f90	\
+pres_temp_4d.cdl nc4_simple_xy.nc nc4_pres_temp_4d.nc			\
+nc4_sfc_pres_temp.nc
+endif #EXTRA_EXAMPLE_TESTS
+
+# Optionally add parallel i/o examples.
+if TEST_PARALLEL
+TESTPROGRAMS += simple_xy_par_wr simple_xy_par_rd simple_xy_par_wr2
+simple_xy_par_wr_SOURCES = simple_xy_par_wr.f90
+simple_xy_par_wr2_SOURCES = simple_xy_par_wr2.f90
+simple_xy_par_rd_SOURCES = simple_xy_par_rd.f90
+TESTSCRIPTS += run_f90_par_examples.sh
+CLEANFILES += simple_xy_par.nc
+endif # TEST_PARALLEL
+
+# NetCDF-4 examples.
+TESTPROGRAMS += simple_xy_nc4_wr simple_xy_nc4_rd
+simple_xy_nc4_wr_SOURCES = simple_xy_nc4_wr.f90
+simple_xy_nc4_rd_SOURCES = simple_xy_nc4_rd.f90
+CLEANFILES += simple_xy_nc4.nc
+endif #USE_NETCDF4
+
+# This target tells how to build one of the netCDF-4 examples.
+# Note old version used sed -i, but -i is not universally recognized
+nc4_simple_xy_wr.f90:
+	sed -e 's/nf90_clobber/nf90_netcdf4/' simple_xy_wr.f90 \
+	| sed -e 's/simple_xy/nc4_simple_xy/' > nc4_simple_xy_wr.f90
+
+# This target tells how to build one of the netCDF-4 examples.
+nc4_sfc_pres_temp_wr.f90:
+	sed -e 's/nf90_clobber/nf90_netcdf4/' sfc_pres_temp_wr.f90 \
+	| sed -e 's/sfc_pres_temp/nc4_sfc_pres_temp/' > nc4_sfc_pres_temp_wr.f90
+
+# This target tells how to build one of the netCDF-4 examples.
+nc4_pres_temp_4D_wr.f90:
+	sed -e 's/nf90_clobber/nf90_netcdf4/' pres_temp_4D_wr.f90 \
+	| sed -e 's/pres_temp_4D/nc4_pres_temp_4D/' > nc4_pres_temp_4D_wr.f90
+
+# Build these test programs.
+check_PROGRAMS = $(TESTPROGRAMS)
+
+# Make sure the script which compares file outputs is included in the
+# dist.
+EXTRA_DIST = do_comps.sh run_nc4_comps.sh run_f90_par_examples.sh CMakeLists.txt
+
+# Run all test programs, plus the do_comps.sh script, which checks
+# that all the output files are the same as the C example output
+# files.
+TESTS = $(TESTPROGRAMS) # $(TESTSCRIPTS)
diff --git a/examples/F90/Makefile.in b/examples/F90/Makefile.in
new file mode 100644
index 0000000..49706e6
--- /dev/null
+++ b/examples/F90/Makefile.in
@@ -0,0 +1,1257 @@
+# Makefile.in generated by automake 1.14.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2013 Free Software Foundation, Inc.
+
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+ at SET_MAKE@
+
+# Copyright 2006, see the COPYRIGHT file for more information.
+
+# This file builds F90 examples.
+VPATH = @srcdir@
+am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
+am__make_running_with_option = \
+  case $${target_option-} in \
+      ?) ;; \
+      *) echo "am__make_running_with_option: internal error: invalid" \
+              "target option '$${target_option-}' specified" >&2; \
+         exit 1;; \
+  esac; \
+  has_opt=no; \
+  sane_makeflags=$$MAKEFLAGS; \
+  if $(am__is_gnu_make); then \
+    sane_makeflags=$$MFLAGS; \
+  else \
+    case $$MAKEFLAGS in \
+      *\\[\ \	]*) \
+        bs=\\; \
+        sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+          | sed "s/$$bs$$bs[$$bs $$bs	]*//g"`;; \
+    esac; \
+  fi; \
+  skip_next=no; \
+  strip_trailopt () \
+  { \
+    flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+  }; \
+  for flg in $$sane_makeflags; do \
+    test $$skip_next = yes && { skip_next=no; continue; }; \
+    case $$flg in \
+      *=*|--*) continue;; \
+        -*I) strip_trailopt 'I'; skip_next=yes;; \
+      -*I?*) strip_trailopt 'I';; \
+        -*O) strip_trailopt 'O'; skip_next=yes;; \
+      -*O?*) strip_trailopt 'O';; \
+        -*l) strip_trailopt 'l'; skip_next=yes;; \
+      -*l?*) strip_trailopt 'l';; \
+      -[dEDm]) skip_next=yes;; \
+      -[JT]) skip_next=yes;; \
+    esac; \
+    case $$flg in \
+      *$$target_option*) has_opt=yes; break;; \
+    esac; \
+  done; \
+  test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+target_triplet = @target@
+
+# Add example to the tests run.
+ at EXTRA_EXAMPLE_TESTS_TRUE@@USE_NETCDF4_TRUE at am__append_1 = nc4_simple_xy_wr nc4_sfc_pres_temp_wr	\
+ at EXTRA_EXAMPLE_TESTS_TRUE@@USE_NETCDF4_TRUE at nc4_pres_temp_4D_wr
+
+
+# Add this test script.
+ at EXTRA_EXAMPLE_TESTS_TRUE@@USE_NETCDF4_TRUE at am__append_2 = run_nc4_comps.sh
+
+# Make sure all the files created by our netcdf-4 tests get cleaned.
+ at EXTRA_EXAMPLE_TESTS_TRUE@@USE_NETCDF4_TRUE at am__append_3 = nc4_simple_xy_wr.f90 simple_xy.cdl			\
+ at EXTRA_EXAMPLE_TESTS_TRUE@@USE_NETCDF4_TRUE at nc4_sfc_pres_temp_wr.f90 sfc_pres_temp.cdl nc4_pres_temp_4d_wr.f90	\
+ at EXTRA_EXAMPLE_TESTS_TRUE@@USE_NETCDF4_TRUE at pres_temp_4d.cdl nc4_simple_xy.nc nc4_pres_temp_4d.nc			\
+ at EXTRA_EXAMPLE_TESTS_TRUE@@USE_NETCDF4_TRUE at nc4_sfc_pres_temp.nc
+
+
+# Optionally add parallel i/o examples.
+ at TEST_PARALLEL_TRUE@@USE_NETCDF4_TRUE at am__append_4 = simple_xy_par_wr simple_xy_par_rd simple_xy_par_wr2
+ at TEST_PARALLEL_TRUE@@USE_NETCDF4_TRUE at am__append_5 = run_f90_par_examples.sh
+ at TEST_PARALLEL_TRUE@@USE_NETCDF4_TRUE at am__append_6 = simple_xy_par.nc
+
+# NetCDF-4 examples.
+ at USE_NETCDF4_TRUE@am__append_7 = simple_xy_nc4_wr simple_xy_nc4_rd
+ at USE_NETCDF4_TRUE@am__append_8 = simple_xy_nc4.nc
+check_PROGRAMS = $(am__EXEEXT_4)
+TESTS = $(am__EXEEXT_4)
+subdir = examples/F90
+DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \
+	$(top_srcdir)/test-driver
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \
+	$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+	$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+	$(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/config.h \
+	$(top_builddir)/libsrc/nfconfig1.inc
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+ at EXTRA_EXAMPLE_TESTS_TRUE@@USE_NETCDF4_TRUE at am__EXEEXT_1 = nc4_simple_xy_wr$(EXEEXT) \
+ at EXTRA_EXAMPLE_TESTS_TRUE@@USE_NETCDF4_TRUE@	nc4_sfc_pres_temp_wr$(EXEEXT) \
+ at EXTRA_EXAMPLE_TESTS_TRUE@@USE_NETCDF4_TRUE@	nc4_pres_temp_4D_wr$(EXEEXT)
+ at TEST_PARALLEL_TRUE@@USE_NETCDF4_TRUE at am__EXEEXT_2 = simple_xy_par_wr$(EXEEXT) \
+ at TEST_PARALLEL_TRUE@@USE_NETCDF4_TRUE@	simple_xy_par_rd$(EXEEXT) \
+ at TEST_PARALLEL_TRUE@@USE_NETCDF4_TRUE@	simple_xy_par_wr2$(EXEEXT)
+ at USE_NETCDF4_TRUE@am__EXEEXT_3 = simple_xy_nc4_wr$(EXEEXT) \
+ at USE_NETCDF4_TRUE@	simple_xy_nc4_rd$(EXEEXT)
+am__EXEEXT_4 = simple_xy_wr$(EXEEXT) simple_xy_rd$(EXEEXT) \
+	sfc_pres_temp_wr$(EXEEXT) sfc_pres_temp_rd$(EXEEXT) \
+	pres_temp_4D_wr$(EXEEXT) pres_temp_4D_rd$(EXEEXT) \
+	$(am__EXEEXT_1) $(am__EXEEXT_2) $(am__EXEEXT_3)
+am__nc4_pres_temp_4D_wr_SOURCES_DIST = nc4_pres_temp_4D_wr.f90
+ at EXTRA_EXAMPLE_TESTS_TRUE@@USE_NETCDF4_TRUE at am_nc4_pres_temp_4D_wr_OBJECTS = nc4_pres_temp_4D_wr.$(OBJEXT)
+nc4_pres_temp_4D_wr_OBJECTS = $(am_nc4_pres_temp_4D_wr_OBJECTS)
+nc4_pres_temp_4D_wr_LDADD = $(LDADD)
+AM_V_lt = $(am__v_lt_ at AM_V@)
+am__v_lt_ = $(am__v_lt_ at AM_DEFAULT_V@)
+am__v_lt_0 = --silent
+am__v_lt_1 = 
+am__nc4_sfc_pres_temp_wr_SOURCES_DIST = nc4_sfc_pres_temp_wr.f90
+ at EXTRA_EXAMPLE_TESTS_TRUE@@USE_NETCDF4_TRUE at am_nc4_sfc_pres_temp_wr_OBJECTS = nc4_sfc_pres_temp_wr.$(OBJEXT)
+nc4_sfc_pres_temp_wr_OBJECTS = $(am_nc4_sfc_pres_temp_wr_OBJECTS)
+nc4_sfc_pres_temp_wr_LDADD = $(LDADD)
+am__nc4_simple_xy_wr_SOURCES_DIST = nc4_simple_xy_wr.f90
+ at EXTRA_EXAMPLE_TESTS_TRUE@@USE_NETCDF4_TRUE at am_nc4_simple_xy_wr_OBJECTS = nc4_simple_xy_wr.$(OBJEXT)
+nc4_simple_xy_wr_OBJECTS = $(am_nc4_simple_xy_wr_OBJECTS)
+nc4_simple_xy_wr_LDADD = $(LDADD)
+am_pres_temp_4D_rd_OBJECTS = pres_temp_4D_rd.$(OBJEXT)
+pres_temp_4D_rd_OBJECTS = $(am_pres_temp_4D_rd_OBJECTS)
+pres_temp_4D_rd_LDADD = $(LDADD)
+am_pres_temp_4D_wr_OBJECTS = pres_temp_4D_wr.$(OBJEXT)
+pres_temp_4D_wr_OBJECTS = $(am_pres_temp_4D_wr_OBJECTS)
+pres_temp_4D_wr_LDADD = $(LDADD)
+am_sfc_pres_temp_rd_OBJECTS = sfc_pres_temp_rd.$(OBJEXT)
+sfc_pres_temp_rd_OBJECTS = $(am_sfc_pres_temp_rd_OBJECTS)
+sfc_pres_temp_rd_LDADD = $(LDADD)
+am_sfc_pres_temp_wr_OBJECTS = sfc_pres_temp_wr.$(OBJEXT)
+sfc_pres_temp_wr_OBJECTS = $(am_sfc_pres_temp_wr_OBJECTS)
+sfc_pres_temp_wr_LDADD = $(LDADD)
+am__simple_xy_nc4_rd_SOURCES_DIST = simple_xy_nc4_rd.f90
+ at USE_NETCDF4_TRUE@am_simple_xy_nc4_rd_OBJECTS =  \
+ at USE_NETCDF4_TRUE@	simple_xy_nc4_rd.$(OBJEXT)
+simple_xy_nc4_rd_OBJECTS = $(am_simple_xy_nc4_rd_OBJECTS)
+simple_xy_nc4_rd_LDADD = $(LDADD)
+am__simple_xy_nc4_wr_SOURCES_DIST = simple_xy_nc4_wr.f90
+ at USE_NETCDF4_TRUE@am_simple_xy_nc4_wr_OBJECTS =  \
+ at USE_NETCDF4_TRUE@	simple_xy_nc4_wr.$(OBJEXT)
+simple_xy_nc4_wr_OBJECTS = $(am_simple_xy_nc4_wr_OBJECTS)
+simple_xy_nc4_wr_LDADD = $(LDADD)
+am__simple_xy_par_rd_SOURCES_DIST = simple_xy_par_rd.f90
+ at TEST_PARALLEL_TRUE@@USE_NETCDF4_TRUE at am_simple_xy_par_rd_OBJECTS = simple_xy_par_rd.$(OBJEXT)
+simple_xy_par_rd_OBJECTS = $(am_simple_xy_par_rd_OBJECTS)
+simple_xy_par_rd_LDADD = $(LDADD)
+am__simple_xy_par_wr_SOURCES_DIST = simple_xy_par_wr.f90
+ at TEST_PARALLEL_TRUE@@USE_NETCDF4_TRUE at am_simple_xy_par_wr_OBJECTS = simple_xy_par_wr.$(OBJEXT)
+simple_xy_par_wr_OBJECTS = $(am_simple_xy_par_wr_OBJECTS)
+simple_xy_par_wr_LDADD = $(LDADD)
+am__simple_xy_par_wr2_SOURCES_DIST = simple_xy_par_wr2.f90
+ at TEST_PARALLEL_TRUE@@USE_NETCDF4_TRUE at am_simple_xy_par_wr2_OBJECTS = simple_xy_par_wr2.$(OBJEXT)
+simple_xy_par_wr2_OBJECTS = $(am_simple_xy_par_wr2_OBJECTS)
+simple_xy_par_wr2_LDADD = $(LDADD)
+am_simple_xy_rd_OBJECTS = simple_xy_rd.$(OBJEXT)
+simple_xy_rd_OBJECTS = $(am_simple_xy_rd_OBJECTS)
+simple_xy_rd_LDADD = $(LDADD)
+am_simple_xy_wr_OBJECTS = simple_xy_wr.$(OBJEXT)
+simple_xy_wr_OBJECTS = $(am_simple_xy_wr_OBJECTS)
+simple_xy_wr_LDADD = $(LDADD)
+AM_V_P = $(am__v_P_ at AM_V@)
+am__v_P_ = $(am__v_P_ at AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_ at AM_V@)
+am__v_GEN_ = $(am__v_GEN_ at AM_DEFAULT_V@)
+am__v_GEN_0 = @echo "  GEN     " $@;
+am__v_GEN_1 = 
+AM_V_at = $(am__v_at_ at AM_V@)
+am__v_at_ = $(am__v_at_ at AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 = 
+DEFAULT_INCLUDES = -I. at am__isrc@ -I$(top_builddir) -I$(top_builddir)/libsrc
+FCCOMPILE = $(FC) $(AM_FCFLAGS) $(FCFLAGS)
+LTFCCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=FC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=compile $(FC) $(AM_FCFLAGS) $(FCFLAGS)
+AM_V_FC = $(am__v_FC_ at AM_V@)
+am__v_FC_ = $(am__v_FC_ at AM_DEFAULT_V@)
+am__v_FC_0 = @echo "  FC      " $@;
+am__v_FC_1 = 
+FCLD = $(FC)
+FCLINK = $(LIBTOOL) $(AM_V_lt) --tag=FC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(FCLD) $(AM_FCFLAGS) $(FCFLAGS) \
+	$(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_FCLD = $(am__v_FCLD_ at AM_V@)
+am__v_FCLD_ = $(am__v_FCLD_ at AM_DEFAULT_V@)
+am__v_FCLD_0 = @echo "  FCLD    " $@;
+am__v_FCLD_1 = 
+SOURCES = $(nc4_pres_temp_4D_wr_SOURCES) \
+	$(nc4_sfc_pres_temp_wr_SOURCES) $(nc4_simple_xy_wr_SOURCES) \
+	$(pres_temp_4D_rd_SOURCES) $(pres_temp_4D_wr_SOURCES) \
+	$(sfc_pres_temp_rd_SOURCES) $(sfc_pres_temp_wr_SOURCES) \
+	$(simple_xy_nc4_rd_SOURCES) $(simple_xy_nc4_wr_SOURCES) \
+	$(simple_xy_par_rd_SOURCES) $(simple_xy_par_wr_SOURCES) \
+	$(simple_xy_par_wr2_SOURCES) $(simple_xy_rd_SOURCES) \
+	$(simple_xy_wr_SOURCES)
+DIST_SOURCES = $(am__nc4_pres_temp_4D_wr_SOURCES_DIST) \
+	$(am__nc4_sfc_pres_temp_wr_SOURCES_DIST) \
+	$(am__nc4_simple_xy_wr_SOURCES_DIST) \
+	$(pres_temp_4D_rd_SOURCES) $(pres_temp_4D_wr_SOURCES) \
+	$(sfc_pres_temp_rd_SOURCES) $(sfc_pres_temp_wr_SOURCES) \
+	$(am__simple_xy_nc4_rd_SOURCES_DIST) \
+	$(am__simple_xy_nc4_wr_SOURCES_DIST) \
+	$(am__simple_xy_par_rd_SOURCES_DIST) \
+	$(am__simple_xy_par_wr_SOURCES_DIST) \
+	$(am__simple_xy_par_wr2_SOURCES_DIST) $(simple_xy_rd_SOURCES) \
+	$(simple_xy_wr_SOURCES)
+am__can_run_installinfo = \
+  case $$AM_UPDATE_INFO_DIR in \
+    n|no|NO) false;; \
+    *) (install-info --version) >/dev/null 2>&1;; \
+  esac
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates.  Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+  BEGIN { nonempty = 0; } \
+  { items[$$0] = 1; nonempty = 1; } \
+  END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique.  This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+  list='$(am__tagged_files)'; \
+  unique=`for i in $$list; do \
+    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+  done | $(am__uniquify_input)`
+ETAGS = etags
+CTAGS = ctags
+am__tty_colors_dummy = \
+  mgn= red= grn= lgn= blu= brg= std=; \
+  am__color_tests=no
+am__tty_colors = { \
+  $(am__tty_colors_dummy); \
+  if test "X$(AM_COLOR_TESTS)" = Xno; then \
+    am__color_tests=no; \
+  elif test "X$(AM_COLOR_TESTS)" = Xalways; then \
+    am__color_tests=yes; \
+  elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \
+    am__color_tests=yes; \
+  fi; \
+  if test $$am__color_tests = yes; then \
+    red=''; \
+    grn=''; \
+    lgn=''; \
+    blu=''; \
+    mgn=''; \
+    brg=''; \
+    std=''; \
+  fi; \
+}
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+  for p in $$list; do echo "$$p $$p"; done | \
+  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+    if (++n[$$2] == $(am__install_max)) \
+      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+    END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__uninstall_files_from_dir = { \
+  test -z "$$files" \
+    || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+    || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+         $(am__cd) "$$dir" && rm -f $$files; }; \
+  }
+am__recheck_rx = ^[ 	]*:recheck:[ 	]*
+am__global_test_result_rx = ^[ 	]*:global-test-result:[ 	]*
+am__copy_in_global_log_rx = ^[ 	]*:copy-in-global-log:[ 	]*
+# A command that, given a newline-separated list of test names on the
+# standard input, print the name of the tests that are to be re-run
+# upon "make recheck".
+am__list_recheck_tests = $(AWK) '{ \
+  recheck = 1; \
+  while ((rc = (getline line < ($$0 ".trs"))) != 0) \
+    { \
+      if (rc < 0) \
+        { \
+          if ((getline line2 < ($$0 ".log")) < 0) \
+	    recheck = 0; \
+          break; \
+        } \
+      else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \
+        { \
+          recheck = 0; \
+          break; \
+        } \
+      else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \
+        { \
+          break; \
+        } \
+    }; \
+  if (recheck) \
+    print $$0; \
+  close ($$0 ".trs"); \
+  close ($$0 ".log"); \
+}'
+# A command that, given a newline-separated list of test names on the
+# standard input, create the global log from their .trs and .log files.
+am__create_global_log = $(AWK) ' \
+function fatal(msg) \
+{ \
+  print "fatal: making $@: " msg | "cat >&2"; \
+  exit 1; \
+} \
+function rst_section(header) \
+{ \
+  print header; \
+  len = length(header); \
+  for (i = 1; i <= len; i = i + 1) \
+    printf "="; \
+  printf "\n\n"; \
+} \
+{ \
+  copy_in_global_log = 1; \
+  global_test_result = "RUN"; \
+  while ((rc = (getline line < ($$0 ".trs"))) != 0) \
+    { \
+      if (rc < 0) \
+         fatal("failed to read from " $$0 ".trs"); \
+      if (line ~ /$(am__global_test_result_rx)/) \
+        { \
+          sub("$(am__global_test_result_rx)", "", line); \
+          sub("[ 	]*$$", "", line); \
+          global_test_result = line; \
+        } \
+      else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \
+        copy_in_global_log = 0; \
+    }; \
+  if (copy_in_global_log) \
+    { \
+      rst_section(global_test_result ": " $$0); \
+      while ((rc = (getline line < ($$0 ".log"))) != 0) \
+      { \
+        if (rc < 0) \
+          fatal("failed to read from " $$0 ".log"); \
+        print line; \
+      }; \
+      printf "\n"; \
+    }; \
+  close ($$0 ".trs"); \
+  close ($$0 ".log"); \
+}'
+# Restructured Text title.
+am__rst_title = { sed 's/.*/   &   /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; }
+# Solaris 10 'make', and several other traditional 'make' implementations,
+# pass "-e" to $(SHELL), and POSIX 2008 even requires this.  Work around it
+# by disabling -e (using the XSI extension "set +e") if it's set.
+am__sh_e_setup = case $$- in *e*) set +e;; esac
+# Default flags passed to test drivers.
+am__common_driver_flags = \
+  --color-tests "$$am__color_tests" \
+  --enable-hard-errors "$$am__enable_hard_errors" \
+  --expect-failure "$$am__expect_failure"
+# To be inserted before the command running the test.  Creates the
+# directory for the log if needed.  Stores in $dir the directory
+# containing $f, in $tst the test, in $log the log.  Executes the
+# developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and
+# passes TESTS_ENVIRONMENT.  Set up options for the wrapper that
+# will run the test scripts (or their associated LOG_COMPILER, if
+# thy have one).
+am__check_pre = \
+$(am__sh_e_setup);					\
+$(am__vpath_adj_setup) $(am__vpath_adj)			\
+$(am__tty_colors);					\
+srcdir=$(srcdir); export srcdir;			\
+case "$@" in						\
+  */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;;	\
+    *) am__odir=.;; 					\
+esac;							\
+test "x$$am__odir" = x"." || test -d "$$am__odir" 	\
+  || $(MKDIR_P) "$$am__odir" || exit $$?;		\
+if test -f "./$$f"; then dir=./;			\
+elif test -f "$$f"; then dir=;				\
+else dir="$(srcdir)/"; fi;				\
+tst=$$dir$$f; log='$@'; 				\
+if test -n '$(DISABLE_HARD_ERRORS)'; then		\
+  am__enable_hard_errors=no; 				\
+else							\
+  am__enable_hard_errors=yes; 				\
+fi; 							\
+case " $(XFAIL_TESTS) " in				\
+  *[\ \	]$$f[\ \	]* | *[\ \	]$$dir$$f[\ \	]*) \
+    am__expect_failure=yes;;				\
+  *)							\
+    am__expect_failure=no;;				\
+esac; 							\
+$(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT)
+# A shell command to get the names of the tests scripts with any registered
+# extension removed (i.e., equivalently, the names of the test logs, with
+# the '.log' extension removed).  The result is saved in the shell variable
+# '$bases'.  This honors runtime overriding of TESTS and TEST_LOGS.  Sadly,
+# we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)",
+# since that might cause problem with VPATH rewrites for suffix-less tests.
+# See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'.
+am__set_TESTS_bases = \
+  bases='$(TEST_LOGS)'; \
+  bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \
+  bases=`echo $$bases`
+RECHECK_LOGS = $(TEST_LOGS)
+AM_RECURSIVE_TARGETS = check recheck
+TEST_SUITE_LOG = test-suite.log
+TEST_EXTENSIONS = @EXEEXT@ .test
+LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver
+LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS)
+am__set_b = \
+  case '$@' in \
+    */*) \
+      case '$*' in \
+        */*) b='$*';; \
+          *) b=`echo '$@' | sed 's/\.log$$//'`; \
+       esac;; \
+    *) \
+      b='$*';; \
+  esac
+am__test_logs1 = $(TESTS:=.log)
+am__test_logs2 = $(am__test_logs1:@EXEEXT at .log=.log)
+TEST_LOGS = $(am__test_logs2:.test.log=.log)
+TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver
+TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \
+	$(TEST_LOG_FLAGS)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+ALLOCA = @ALLOCA@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BUILD_INTERNAL_DOCS = @BUILD_INTERNAL_DOCS@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+DOT = @DOT@
+DOXYGEN = @DOXYGEN@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+F77 = @F77@
+FC = @FC@
+FCFLAGS = @FCFLAGS@
+FCFLAGS_f90 = @FCFLAGS_f90@
+FFLAGS = @FFLAGS@
+FGREP = @FGREP@
+GREP = @GREP@
+HAS_DAP = @HAS_DAP@
+HAS_F03 = @HAS_F03@
+HAS_F90 = @HAS_F90@
+HAS_NC2 = @HAS_NC2@
+HAS_NC4 = @HAS_NC4@
+HAVE_DOT = @HAVE_DOT@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MKDIR_P = @MKDIR_P@
+MOD_FLAG = @MOD_FLAG@
+NC_FLIBS = @NC_FLIBS@
+NC_LIBS = @NC_LIBS@
+NM = @NM@
+NMEDIT = @NMEDIT@
+NMFLAGS = @NMFLAGS@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+VERSION = @VERSION@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+ac_ct_F77 = @ac_ct_F77@
+ac_ct_FC = @ac_ct_FC@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target = @target@
+target_alias = @target_alias@
+target_cpu = @target_cpu@
+target_os = @target_os@
+target_vendor = @target_vendor@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+AM_FCFLAGS = -I$(top_srcdir)/fortran ${AM_CPPFLAGS} $(FCFLAGS_f90) \
+	@MOD_FLAG@$(top_builddir)/fortran
+AM_FFLAGS = ${AM_FCFLAGS}
+AM_LDFLAGS = ${top_builddir}/fortran/libnetcdff.la -lnetcdf
+
+# These are the example programs.
+TESTPROGRAMS = simple_xy_wr simple_xy_rd sfc_pres_temp_wr \
+	sfc_pres_temp_rd pres_temp_4D_wr pres_temp_4D_rd \
+	$(am__append_1) $(am__append_4) $(am__append_7)
+TESTSCRIPTS = $(am__append_2) $(am__append_5)
+
+# Here's the source code for the programs.
+simple_xy_wr_SOURCES = simple_xy_wr.f90
+simple_xy_rd_SOURCES = simple_xy_rd.f90
+sfc_pres_temp_wr_SOURCES = sfc_pres_temp_wr.f90
+sfc_pres_temp_rd_SOURCES = sfc_pres_temp_rd.f90
+pres_temp_4D_wr_SOURCES = pres_temp_4D_wr.f90
+pres_temp_4D_rd_SOURCES = pres_temp_4D_rd.f90
+
+# Cleaning up files created during the process.
+CLEANFILES = simple_xy.nc sfc_pres_temp.nc pres_temp_4D.nc \
+	$(am__append_3) $(am__append_6) $(am__append_8)
+
+# This will cause netCDF-4 versions of the example programs to be
+# built.
+ at EXTRA_EXAMPLE_TESTS_TRUE@@USE_NETCDF4_TRUE at BUILT_SOURCES = nc4_simple_xy_wr.f90 nc4_sfc_pres_temp_wr.f90	\
+ at EXTRA_EXAMPLE_TESTS_TRUE@@USE_NETCDF4_TRUE at nc4_pres_temp_4D_wr.f90
+
+
+# How to build the example.
+ at EXTRA_EXAMPLE_TESTS_TRUE@@USE_NETCDF4_TRUE at nc4_simple_xy_wr_SOURCES = nc4_simple_xy_wr.f90
+ at EXTRA_EXAMPLE_TESTS_TRUE@@USE_NETCDF4_TRUE at nc4_sfc_pres_temp_wr_SOURCES = nc4_sfc_pres_temp_wr.f90
+ at EXTRA_EXAMPLE_TESTS_TRUE@@USE_NETCDF4_TRUE at nc4_pres_temp_4D_wr_SOURCES = nc4_pres_temp_4D_wr.f90
+ at TEST_PARALLEL_TRUE@@USE_NETCDF4_TRUE at simple_xy_par_wr_SOURCES = simple_xy_par_wr.f90
+ at TEST_PARALLEL_TRUE@@USE_NETCDF4_TRUE at simple_xy_par_wr2_SOURCES = simple_xy_par_wr2.f90
+ at TEST_PARALLEL_TRUE@@USE_NETCDF4_TRUE at simple_xy_par_rd_SOURCES = simple_xy_par_rd.f90
+ at USE_NETCDF4_TRUE@simple_xy_nc4_wr_SOURCES = simple_xy_nc4_wr.f90
+ at USE_NETCDF4_TRUE@simple_xy_nc4_rd_SOURCES = simple_xy_nc4_rd.f90
+
+# Make sure the script which compares file outputs is included in the
+# dist.
+EXTRA_DIST = do_comps.sh run_nc4_comps.sh run_f90_par_examples.sh CMakeLists.txt
+all: $(BUILT_SOURCES)
+	$(MAKE) $(AM_MAKEFLAGS) all-am
+
+.SUFFIXES:
+.SUFFIXES: .f90 .lo .log .o .obj .test .test$(EXEEXT) .trs
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign examples/F90/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign examples/F90/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+
+clean-checkPROGRAMS:
+	@list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \
+	echo " rm -f" $$list; \
+	rm -f $$list || exit $$?; \
+	test -n "$(EXEEXT)" || exit 0; \
+	list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
+	echo " rm -f" $$list; \
+	rm -f $$list
+
+nc4_pres_temp_4D_wr$(EXEEXT): $(nc4_pres_temp_4D_wr_OBJECTS) $(nc4_pres_temp_4D_wr_DEPENDENCIES) $(EXTRA_nc4_pres_temp_4D_wr_DEPENDENCIES) 
+	@rm -f nc4_pres_temp_4D_wr$(EXEEXT)
+	$(AM_V_FCLD)$(FCLINK) $(nc4_pres_temp_4D_wr_OBJECTS) $(nc4_pres_temp_4D_wr_LDADD) $(LIBS)
+
+nc4_sfc_pres_temp_wr$(EXEEXT): $(nc4_sfc_pres_temp_wr_OBJECTS) $(nc4_sfc_pres_temp_wr_DEPENDENCIES) $(EXTRA_nc4_sfc_pres_temp_wr_DEPENDENCIES) 
+	@rm -f nc4_sfc_pres_temp_wr$(EXEEXT)
+	$(AM_V_FCLD)$(FCLINK) $(nc4_sfc_pres_temp_wr_OBJECTS) $(nc4_sfc_pres_temp_wr_LDADD) $(LIBS)
+
+nc4_simple_xy_wr$(EXEEXT): $(nc4_simple_xy_wr_OBJECTS) $(nc4_simple_xy_wr_DEPENDENCIES) $(EXTRA_nc4_simple_xy_wr_DEPENDENCIES) 
+	@rm -f nc4_simple_xy_wr$(EXEEXT)
+	$(AM_V_FCLD)$(FCLINK) $(nc4_simple_xy_wr_OBJECTS) $(nc4_simple_xy_wr_LDADD) $(LIBS)
+
+pres_temp_4D_rd$(EXEEXT): $(pres_temp_4D_rd_OBJECTS) $(pres_temp_4D_rd_DEPENDENCIES) $(EXTRA_pres_temp_4D_rd_DEPENDENCIES) 
+	@rm -f pres_temp_4D_rd$(EXEEXT)
+	$(AM_V_FCLD)$(FCLINK) $(pres_temp_4D_rd_OBJECTS) $(pres_temp_4D_rd_LDADD) $(LIBS)
+
+pres_temp_4D_wr$(EXEEXT): $(pres_temp_4D_wr_OBJECTS) $(pres_temp_4D_wr_DEPENDENCIES) $(EXTRA_pres_temp_4D_wr_DEPENDENCIES) 
+	@rm -f pres_temp_4D_wr$(EXEEXT)
+	$(AM_V_FCLD)$(FCLINK) $(pres_temp_4D_wr_OBJECTS) $(pres_temp_4D_wr_LDADD) $(LIBS)
+
+sfc_pres_temp_rd$(EXEEXT): $(sfc_pres_temp_rd_OBJECTS) $(sfc_pres_temp_rd_DEPENDENCIES) $(EXTRA_sfc_pres_temp_rd_DEPENDENCIES) 
+	@rm -f sfc_pres_temp_rd$(EXEEXT)
+	$(AM_V_FCLD)$(FCLINK) $(sfc_pres_temp_rd_OBJECTS) $(sfc_pres_temp_rd_LDADD) $(LIBS)
+
+sfc_pres_temp_wr$(EXEEXT): $(sfc_pres_temp_wr_OBJECTS) $(sfc_pres_temp_wr_DEPENDENCIES) $(EXTRA_sfc_pres_temp_wr_DEPENDENCIES) 
+	@rm -f sfc_pres_temp_wr$(EXEEXT)
+	$(AM_V_FCLD)$(FCLINK) $(sfc_pres_temp_wr_OBJECTS) $(sfc_pres_temp_wr_LDADD) $(LIBS)
+
+simple_xy_nc4_rd$(EXEEXT): $(simple_xy_nc4_rd_OBJECTS) $(simple_xy_nc4_rd_DEPENDENCIES) $(EXTRA_simple_xy_nc4_rd_DEPENDENCIES) 
+	@rm -f simple_xy_nc4_rd$(EXEEXT)
+	$(AM_V_FCLD)$(FCLINK) $(simple_xy_nc4_rd_OBJECTS) $(simple_xy_nc4_rd_LDADD) $(LIBS)
+
+simple_xy_nc4_wr$(EXEEXT): $(simple_xy_nc4_wr_OBJECTS) $(simple_xy_nc4_wr_DEPENDENCIES) $(EXTRA_simple_xy_nc4_wr_DEPENDENCIES) 
+	@rm -f simple_xy_nc4_wr$(EXEEXT)
+	$(AM_V_FCLD)$(FCLINK) $(simple_xy_nc4_wr_OBJECTS) $(simple_xy_nc4_wr_LDADD) $(LIBS)
+
+simple_xy_par_rd$(EXEEXT): $(simple_xy_par_rd_OBJECTS) $(simple_xy_par_rd_DEPENDENCIES) $(EXTRA_simple_xy_par_rd_DEPENDENCIES) 
+	@rm -f simple_xy_par_rd$(EXEEXT)
+	$(AM_V_FCLD)$(FCLINK) $(simple_xy_par_rd_OBJECTS) $(simple_xy_par_rd_LDADD) $(LIBS)
+
+simple_xy_par_wr$(EXEEXT): $(simple_xy_par_wr_OBJECTS) $(simple_xy_par_wr_DEPENDENCIES) $(EXTRA_simple_xy_par_wr_DEPENDENCIES) 
+	@rm -f simple_xy_par_wr$(EXEEXT)
+	$(AM_V_FCLD)$(FCLINK) $(simple_xy_par_wr_OBJECTS) $(simple_xy_par_wr_LDADD) $(LIBS)
+
+simple_xy_par_wr2$(EXEEXT): $(simple_xy_par_wr2_OBJECTS) $(simple_xy_par_wr2_DEPENDENCIES) $(EXTRA_simple_xy_par_wr2_DEPENDENCIES) 
+	@rm -f simple_xy_par_wr2$(EXEEXT)
+	$(AM_V_FCLD)$(FCLINK) $(simple_xy_par_wr2_OBJECTS) $(simple_xy_par_wr2_LDADD) $(LIBS)
+
+simple_xy_rd$(EXEEXT): $(simple_xy_rd_OBJECTS) $(simple_xy_rd_DEPENDENCIES) $(EXTRA_simple_xy_rd_DEPENDENCIES) 
+	@rm -f simple_xy_rd$(EXEEXT)
+	$(AM_V_FCLD)$(FCLINK) $(simple_xy_rd_OBJECTS) $(simple_xy_rd_LDADD) $(LIBS)
+
+simple_xy_wr$(EXEEXT): $(simple_xy_wr_OBJECTS) $(simple_xy_wr_DEPENDENCIES) $(EXTRA_simple_xy_wr_DEPENDENCIES) 
+	@rm -f simple_xy_wr$(EXEEXT)
+	$(AM_V_FCLD)$(FCLINK) $(simple_xy_wr_OBJECTS) $(simple_xy_wr_LDADD) $(LIBS)
+
+mostlyclean-compile:
+	-rm -f *.$(OBJEXT)
+
+distclean-compile:
+	-rm -f *.tab.c
+
+.f90.o:
+	$(AM_V_FC)$(FCCOMPILE) -c -o $@ $(FCFLAGS_f90) $<
+
+.f90.obj:
+	$(AM_V_FC)$(FCCOMPILE) -c -o $@ $(FCFLAGS_f90) `$(CYGPATH_W) '$<'`
+
+.f90.lo:
+	$(AM_V_FC)$(LTFCCOMPILE) -c -o $@ $(FCFLAGS_f90) $<
+
+mostlyclean-libtool:
+	-rm -f *.lo
+
+clean-libtool:
+	-rm -rf .libs _libs
+
+ID: $(am__tagged_files)
+	$(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-am
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+	set x; \
+	here=`pwd`; \
+	$(am__define_uniq_tagged_files); \
+	shift; \
+	if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+	  test -n "$$unique" || unique=$$empty_fix; \
+	  if test $$# -gt 0; then \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      "$$@" $$unique; \
+	  else \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      $$unique; \
+	  fi; \
+	fi
+ctags: ctags-am
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+	$(am__define_uniq_tagged_files); \
+	test -z "$(CTAGS_ARGS)$$unique" \
+	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+	     $$unique
+
+GTAGS:
+	here=`$(am__cd) $(top_builddir) && pwd` \
+	  && $(am__cd) $(top_srcdir) \
+	  && gtags -i $(GTAGS_ARGS) "$$here"
+cscopelist: cscopelist-am
+
+cscopelist-am: $(am__tagged_files)
+	list='$(am__tagged_files)'; \
+	case "$(srcdir)" in \
+	  [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+	  *) sdir=$(subdir)/$(srcdir) ;; \
+	esac; \
+	for i in $$list; do \
+	  if test -f "$$i"; then \
+	    echo "$(subdir)/$$i"; \
+	  else \
+	    echo "$$sdir/$$i"; \
+	  fi; \
+	done >> $(top_builddir)/cscope.files
+
+distclean-tags:
+	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+# Recover from deleted '.trs' file; this should ensure that
+# "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create
+# both 'foo.log' and 'foo.trs'.  Break the recipe in two subshells
+# to avoid problems with "make -n".
+.log.trs:
+	rm -f $< $@
+	$(MAKE) $(AM_MAKEFLAGS) $<
+
+# Leading 'am--fnord' is there to ensure the list of targets does not
+# expand to empty, as could happen e.g. with make check TESTS=''.
+am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck)
+am--force-recheck:
+	@:
+
+$(TEST_SUITE_LOG): $(TEST_LOGS)
+	@$(am__set_TESTS_bases); \
+	am__f_ok () { test -f "$$1" && test -r "$$1"; }; \
+	redo_bases=`for i in $$bases; do \
+	              am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \
+	            done`; \
+	if test -n "$$redo_bases"; then \
+	  redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \
+	  redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \
+	  if $(am__make_dryrun); then :; else \
+	    rm -f $$redo_logs && rm -f $$redo_results || exit 1; \
+	  fi; \
+	fi; \
+	if test -n "$$am__remaking_logs"; then \
+	  echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \
+	       "recursion detected" >&2; \
+	else \
+	  am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \
+	fi; \
+	if $(am__make_dryrun); then :; else \
+	  st=0;  \
+	  errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \
+	  for i in $$redo_bases; do \
+	    test -f $$i.trs && test -r $$i.trs \
+	      || { echo "$$errmsg $$i.trs" >&2; st=1; }; \
+	    test -f $$i.log && test -r $$i.log \
+	      || { echo "$$errmsg $$i.log" >&2; st=1; }; \
+	  done; \
+	  test $$st -eq 0 || exit 1; \
+	fi
+	@$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \
+	ws='[ 	]'; \
+	results=`for b in $$bases; do echo $$b.trs; done`; \
+	test -n "$$results" || results=/dev/null; \
+	all=`  grep "^$$ws*:test-result:"           $$results | wc -l`; \
+	pass=` grep "^$$ws*:test-result:$$ws*PASS"  $$results | wc -l`; \
+	fail=` grep "^$$ws*:test-result:$$ws*FAIL"  $$results | wc -l`; \
+	skip=` grep "^$$ws*:test-result:$$ws*SKIP"  $$results | wc -l`; \
+	xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \
+	xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \
+	error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \
+	if test `expr $$fail + $$xpass + $$error` -eq 0; then \
+	  success=true; \
+	else \
+	  success=false; \
+	fi; \
+	br='==================='; br=$$br$$br$$br$$br; \
+	result_count () \
+	{ \
+	    if test x"$$1" = x"--maybe-color"; then \
+	      maybe_colorize=yes; \
+	    elif test x"$$1" = x"--no-color"; then \
+	      maybe_colorize=no; \
+	    else \
+	      echo "$@: invalid 'result_count' usage" >&2; exit 4; \
+	    fi; \
+	    shift; \
+	    desc=$$1 count=$$2; \
+	    if test $$maybe_colorize = yes && test $$count -gt 0; then \
+	      color_start=$$3 color_end=$$std; \
+	    else \
+	      color_start= color_end=; \
+	    fi; \
+	    echo "$${color_start}# $$desc $$count$${color_end}"; \
+	}; \
+	create_testsuite_report () \
+	{ \
+	  result_count $$1 "TOTAL:" $$all   "$$brg"; \
+	  result_count $$1 "PASS: " $$pass  "$$grn"; \
+	  result_count $$1 "SKIP: " $$skip  "$$blu"; \
+	  result_count $$1 "XFAIL:" $$xfail "$$lgn"; \
+	  result_count $$1 "FAIL: " $$fail  "$$red"; \
+	  result_count $$1 "XPASS:" $$xpass "$$red"; \
+	  result_count $$1 "ERROR:" $$error "$$mgn"; \
+	}; \
+	{								\
+	  echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" |	\
+	    $(am__rst_title);						\
+	  create_testsuite_report --no-color;				\
+	  echo;								\
+	  echo ".. contents:: :depth: 2";				\
+	  echo;								\
+	  for b in $$bases; do echo $$b; done				\
+	    | $(am__create_global_log);					\
+	} >$(TEST_SUITE_LOG).tmp || exit 1;				\
+	mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG);			\
+	if $$success; then						\
+	  col="$$grn";							\
+	 else								\
+	  col="$$red";							\
+	  test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG);		\
+	fi;								\
+	echo "$${col}$$br$${std}"; 					\
+	echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}";	\
+	echo "$${col}$$br$${std}"; 					\
+	create_testsuite_report --maybe-color;				\
+	echo "$$col$$br$$std";						\
+	if $$success; then :; else					\
+	  echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}";		\
+	  if test -n "$(PACKAGE_BUGREPORT)"; then			\
+	    echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}";	\
+	  fi;								\
+	  echo "$$col$$br$$std";					\
+	fi;								\
+	$$success || exit 1
+
+check-TESTS:
+	@list='$(RECHECK_LOGS)';           test -z "$$list" || rm -f $$list
+	@list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list
+	@test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+	@set +e; $(am__set_TESTS_bases); \
+	log_list=`for i in $$bases; do echo $$i.log; done`; \
+	trs_list=`for i in $$bases; do echo $$i.trs; done`; \
+	log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \
+	$(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \
+	exit $$?;
+recheck: all $(check_PROGRAMS)
+	@test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+	@set +e; $(am__set_TESTS_bases); \
+	bases=`for i in $$bases; do echo $$i; done \
+	         | $(am__list_recheck_tests)` || exit 1; \
+	log_list=`for i in $$bases; do echo $$i.log; done`; \
+	log_list=`echo $$log_list`; \
+	$(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \
+	        am__force_recheck=am--force-recheck \
+	        TEST_LOGS="$$log_list"; \
+	exit $$?
+simple_xy_wr.log: simple_xy_wr$(EXEEXT)
+	@p='simple_xy_wr$(EXEEXT)'; \
+	b='simple_xy_wr'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+simple_xy_rd.log: simple_xy_rd$(EXEEXT)
+	@p='simple_xy_rd$(EXEEXT)'; \
+	b='simple_xy_rd'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+sfc_pres_temp_wr.log: sfc_pres_temp_wr$(EXEEXT)
+	@p='sfc_pres_temp_wr$(EXEEXT)'; \
+	b='sfc_pres_temp_wr'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+sfc_pres_temp_rd.log: sfc_pres_temp_rd$(EXEEXT)
+	@p='sfc_pres_temp_rd$(EXEEXT)'; \
+	b='sfc_pres_temp_rd'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+pres_temp_4D_wr.log: pres_temp_4D_wr$(EXEEXT)
+	@p='pres_temp_4D_wr$(EXEEXT)'; \
+	b='pres_temp_4D_wr'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+pres_temp_4D_rd.log: pres_temp_4D_rd$(EXEEXT)
+	@p='pres_temp_4D_rd$(EXEEXT)'; \
+	b='pres_temp_4D_rd'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+nc4_simple_xy_wr.log: nc4_simple_xy_wr$(EXEEXT)
+	@p='nc4_simple_xy_wr$(EXEEXT)'; \
+	b='nc4_simple_xy_wr'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+nc4_sfc_pres_temp_wr.log: nc4_sfc_pres_temp_wr$(EXEEXT)
+	@p='nc4_sfc_pres_temp_wr$(EXEEXT)'; \
+	b='nc4_sfc_pres_temp_wr'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+nc4_pres_temp_4D_wr.log: nc4_pres_temp_4D_wr$(EXEEXT)
+	@p='nc4_pres_temp_4D_wr$(EXEEXT)'; \
+	b='nc4_pres_temp_4D_wr'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+simple_xy_par_wr.log: simple_xy_par_wr$(EXEEXT)
+	@p='simple_xy_par_wr$(EXEEXT)'; \
+	b='simple_xy_par_wr'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+simple_xy_par_rd.log: simple_xy_par_rd$(EXEEXT)
+	@p='simple_xy_par_rd$(EXEEXT)'; \
+	b='simple_xy_par_rd'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+simple_xy_par_wr2.log: simple_xy_par_wr2$(EXEEXT)
+	@p='simple_xy_par_wr2$(EXEEXT)'; \
+	b='simple_xy_par_wr2'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+simple_xy_nc4_wr.log: simple_xy_nc4_wr$(EXEEXT)
+	@p='simple_xy_nc4_wr$(EXEEXT)'; \
+	b='simple_xy_nc4_wr'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+simple_xy_nc4_rd.log: simple_xy_nc4_rd$(EXEEXT)
+	@p='simple_xy_nc4_rd$(EXEEXT)'; \
+	b='simple_xy_nc4_rd'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+.test.log:
+	@p='$<'; \
+	$(am__set_b); \
+	$(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+ at am__EXEEXT_TRUE@.test$(EXEEXT).log:
+ at am__EXEEXT_TRUE@	@p='$<'; \
+ at am__EXEEXT_TRUE@	$(am__set_b); \
+ at am__EXEEXT_TRUE@	$(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \
+ at am__EXEEXT_TRUE@	--log-file $$b.log --trs-file $$b.trs \
+ at am__EXEEXT_TRUE@	$(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \
+ at am__EXEEXT_TRUE@	"$$tst" $(AM_TESTS_FD_REDIRECT)
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+	  else \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
+	    || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+	$(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS)
+	$(MAKE) $(AM_MAKEFLAGS) check-TESTS
+check: $(BUILT_SOURCES)
+	$(MAKE) $(AM_MAKEFLAGS) check-am
+all-am: Makefile
+installdirs:
+install: $(BUILT_SOURCES)
+	$(MAKE) $(AM_MAKEFLAGS) install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	if test -z '$(STRIP)'; then \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	      install; \
+	else \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	    "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+	fi
+mostlyclean-generic:
+	-test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS)
+	-test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs)
+	-test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+
+clean-generic:
+	-test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+	-test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES)
+clean: clean-am
+
+clean-am: clean-checkPROGRAMS clean-generic clean-libtool \
+	mostlyclean-am
+
+distclean: distclean-am
+	-rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+	distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+	mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am:
+
+.MAKE: all check check-am install install-am install-strip
+
+.PHONY: CTAGS GTAGS TAGS all all-am check check-TESTS check-am clean \
+	clean-checkPROGRAMS clean-generic clean-libtool cscopelist-am \
+	ctags ctags-am distclean distclean-compile distclean-generic \
+	distclean-libtool distclean-tags distdir dvi dvi-am html \
+	html-am info info-am install install-am install-data \
+	install-data-am install-dvi install-dvi-am install-exec \
+	install-exec-am install-html install-html-am install-info \
+	install-info-am install-man install-pdf install-pdf-am \
+	install-ps install-ps-am install-strip installcheck \
+	installcheck-am installdirs maintainer-clean \
+	maintainer-clean-generic mostlyclean mostlyclean-compile \
+	mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+	recheck tags tags-am uninstall uninstall-am
+
+
+# This target tells how to build one of the netCDF-4 examples.
+# Note old version used sed -i, but -i is not universally recognized
+nc4_simple_xy_wr.f90:
+	sed -e 's/nf90_clobber/nf90_netcdf4/' simple_xy_wr.f90 \
+	| sed -e 's/simple_xy/nc4_simple_xy/' > nc4_simple_xy_wr.f90
+
+# This target tells how to build one of the netCDF-4 examples.
+nc4_sfc_pres_temp_wr.f90:
+	sed -e 's/nf90_clobber/nf90_netcdf4/' sfc_pres_temp_wr.f90 \
+	| sed -e 's/sfc_pres_temp/nc4_sfc_pres_temp/' > nc4_sfc_pres_temp_wr.f90
+
+# This target tells how to build one of the netCDF-4 examples.
+nc4_pres_temp_4D_wr.f90:
+	sed -e 's/nf90_clobber/nf90_netcdf4/' pres_temp_4D_wr.f90 \
+	| sed -e 's/pres_temp_4D/nc4_pres_temp_4D/' > nc4_pres_temp_4D_wr.f90
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/examples/F90/do_comps.sh b/examples/F90/do_comps.sh
new file mode 100755
index 0000000..58a85eb
--- /dev/null
+++ b/examples/F90/do_comps.sh
@@ -0,0 +1,18 @@
+#!/bin/sh
+# This shell script runs the cmp test on the example programs.
+# $Id: do_comps.sh,v 1.1 2006/06/26 15:47:53 ed Exp $
+
+set -e
+echo ""
+echo "*** Testing that F90 examples produced same files as C examples."
+echo "*** checking simple_xy.nc..."
+cmp simple_xy.nc ../C/simple_xy.nc
+
+echo "*** checking sfc_pres_temp.nc..."
+cmp sfc_pres_temp.nc ../C/sfc_pres_temp.nc
+
+echo "*** checking pres_temp_4D.nc..."
+cmp pres_temp_4D.nc ../C/pres_temp_4D.nc
+
+echo "*** All F90 example comparisons worked!"
+exit 0
diff --git a/examples/F90/nc4_pres_temp_4D_wr.f90 b/examples/F90/nc4_pres_temp_4D_wr.f90
new file mode 100644
index 0000000..c8d9ae3
--- /dev/null
+++ b/examples/F90/nc4_pres_temp_4D_wr.f90
@@ -0,0 +1,175 @@
+! This is part of the netCDF package.
+! Copyright 2006 University Corporation for Atmospheric Research/Unidata.
+! See COPYRIGHT file for conditions of use.
+
+! This is an example program which writes some 4D pressure and
+! temperatures. It is intended to illustrate the use of the netCDF
+! fortran 90 API. The companion program nc4_pres_temp_4D_rd.f shows how
+! to read the netCDF data file created by this program.
+
+! This program is part of the netCDF tutorial:
+! http://www.unidata.ucar.edu/software/netcdf/docs/netcdf-tutorial
+
+! Full documentation of the netCDF Fortran 90 API can be found at:
+! http://www.unidata.ucar.edu/software/netcdf/docs/netcdf-f90
+
+! $Id: nc4_pres_temp_4D_wr.f90,v 1.10 2010/04/06 19:32:09 ed Exp $
+
+program nc4_pres_temp_4D_wr
+  use netcdf
+  implicit none
+
+  ! This is the name of the data file we will create.
+  character (len = *), parameter :: FILE_NAME = "nc4_pres_temp_4D.nc"
+  integer :: ncid
+
+  ! We are writing 4D data, a 12 x 6 x 2 lon-lat-lvl grid, with 2
+  ! timesteps of data.
+  integer, parameter :: NDIMS = 4, NRECS = 2
+  integer, parameter :: NLVLS = 2, NLATS = 6, NLONS = 12
+  character (len = *), parameter :: LVL_NAME = "level"
+  character (len = *), parameter :: LAT_NAME = "latitude"
+  character (len = *), parameter :: LON_NAME = "longitude"
+  character (len = *), parameter :: REC_NAME = "time"
+  integer :: lvl_dimid, lon_dimid, lat_dimid, rec_dimid
+
+  ! The start and count arrays will tell the netCDF library where to
+  ! write our data.
+  integer :: start(NDIMS), count(NDIMS)
+
+  ! These program variables hold the latitudes and longitudes.
+  real :: lats(NLATS), lons(NLONS)
+  integer :: lon_varid, lat_varid
+
+  ! We will create two netCDF variables, one each for temperature and
+  ! pressure fields.
+  character (len = *), parameter :: PRES_NAME="pressure"
+  character (len = *), parameter :: TEMP_NAME="temperature"
+  integer :: pres_varid, temp_varid
+  integer :: dimids(NDIMS)
+
+  ! We recommend that each variable carry a "units" attribute.
+  character (len = *), parameter :: UNITS = "units"
+  character (len = *), parameter :: PRES_UNITS = "hPa"
+  character (len = *), parameter :: TEMP_UNITS = "celsius"
+  character (len = *), parameter :: LAT_UNITS = "degrees_north"
+  character (len = *), parameter :: LON_UNITS = "degrees_east"
+
+  ! Program variables to hold the data we will write out. We will only
+  ! need enough space to hold one timestep of data; one record.
+  real, dimension(:,:,:), allocatable :: pres_out
+  real, dimension(:,:,:), allocatable :: temp_out
+  real, parameter :: SAMPLE_PRESSURE = 900.0
+  real, parameter :: SAMPLE_TEMP = 9.0
+
+  ! Use these to construct some latitude and longitude data for this
+  ! example.
+  real, parameter :: START_LAT = 25.0, START_LON = -125.0
+
+  ! Loop indices
+  integer :: lvl, lat, lon, rec, i
+
+  ! Allocate memory.
+  allocate(pres_out(NLONS, NLATS, NLVLS))
+  allocate(temp_out(NLONS, NLATS, NLVLS))
+
+  ! Create pretend data. If this were not an example program, we would
+  ! have some real data to write, for example, model output.
+  do lat = 1, NLATS
+     lats(lat) = START_LAT + (lat - 1) * 5.0
+  end do
+  do lon = 1, NLONS
+     lons(lon) = START_LON + (lon - 1) * 5.0
+  end do
+  i = 0
+  do lvl = 1, NLVLS
+     do lat = 1, NLATS
+        do lon = 1, NLONS
+           pres_out(lon, lat, lvl) = SAMPLE_PRESSURE + i
+           temp_out(lon, lat, lvl) = SAMPLE_TEMP + i
+           i = i + 1
+        end do
+     end do
+  end do
+
+  ! Create the file. 
+  call check( nf90_create(FILE_NAME, NF90_NETCDF4, ncid) )
+  
+  ! Define the dimensions. The record dimension is defined to have
+  ! unlimited length - it can grow as needed. In this example it is
+  ! the time dimension.
+  call check( nf90_def_dim(ncid, LVL_NAME, NLVLS, lvl_dimid) )
+  call check( nf90_def_dim(ncid, LAT_NAME, NLATS, lat_dimid) )
+  call check( nf90_def_dim(ncid, LON_NAME, NLONS, lon_dimid) )
+  call check( nf90_def_dim(ncid, REC_NAME, NF90_UNLIMITED, rec_dimid) )
+
+  ! Define the coordinate variables. We will only define coordinate
+  ! variables for lat and lon.  Ordinarily we would need to provide
+  ! an array of dimension IDs for each variable's dimensions, but
+  ! since coordinate variables only have one dimension, we can
+  ! simply provide the address of that dimension ID (lat_dimid) and
+  ! similarly for (lon_dimid).
+  call check( nf90_def_var(ncid, LAT_NAME, NF90_REAL, lat_dimid, lat_varid) )
+  call check( nf90_def_var(ncid, LON_NAME, NF90_REAL, lon_dimid, lon_varid) )
+
+  ! Assign units attributes to coordinate variables.
+  call check( nf90_put_att(ncid, lat_varid, UNITS, LAT_UNITS) )
+  call check( nf90_put_att(ncid, lon_varid, UNITS, LON_UNITS) )
+
+  ! The dimids array is used to pass the dimids of the dimensions of
+  ! the netCDF variables. Both of the netCDF variables we are creating
+  ! share the same four dimensions. In Fortran, the unlimited
+  ! dimension must come last on the list of dimids.
+  dimids = (/ lon_dimid, lat_dimid, lvl_dimid, rec_dimid /)
+
+  ! Define the netCDF variables for the pressure and temperature data.
+  call check( nf90_def_var(ncid, PRES_NAME, NF90_REAL, dimids, pres_varid) )
+  call check( nf90_def_var(ncid, TEMP_NAME, NF90_REAL, dimids, temp_varid) )
+
+  ! Assign units attributes to the netCDF variables.
+  call check( nf90_put_att(ncid, pres_varid, UNITS, PRES_UNITS) )
+  call check( nf90_put_att(ncid, temp_varid, UNITS, TEMP_UNITS) )
+  
+  ! End define mode.
+  call check( nf90_enddef(ncid) )
+  
+  ! Write the coordinate variable data. This will put the latitudes
+  ! and longitudes of our data grid into the netCDF file.
+  call check( nf90_put_var(ncid, lat_varid, lats) )
+  call check( nf90_put_var(ncid, lon_varid, lons) )
+  
+  ! These settings tell netcdf to write one timestep of data. (The
+  ! setting of start(4) inside the loop below tells netCDF which
+  ! timestep to write.)
+  count = (/ NLONS, NLATS, NLVLS, 1 /)
+  start = (/ 1, 1, 1, 1 /)
+
+  ! Write the pretend data. This will write our surface pressure and
+  ! surface temperature data. The arrays only hold one timestep worth
+  ! of data. We will just rewrite the same data for each timestep. In
+  ! a real :: application, the data would change between timesteps.
+  do rec = 1, NRECS
+     start(4) = rec
+     call check( nf90_put_var(ncid, pres_varid, pres_out, start = start, &
+                              count = count) )
+     call check( nf90_put_var(ncid, temp_varid, temp_out, start = start, &
+                              count = count) )
+  end do
+  
+  ! Close the file. This causes netCDF to flush all buffers and make
+  ! sure your data are really written to disk.
+  call check( nf90_close(ncid) )
+  
+  print *,"*** SUCCESS writing example file ", FILE_NAME, "!"
+
+contains
+  subroutine check(status)
+    integer, intent ( in) :: status
+    
+    if(status /= nf90_noerr) then 
+      print *, trim(nf90_strerror(status))
+      stop 2
+    end if
+  end subroutine check  
+end program nc4_pres_temp_4D_wr
+
diff --git a/examples/F90/nc4_sfc_pres_temp_wr.f90 b/examples/F90/nc4_sfc_pres_temp_wr.f90
new file mode 100644
index 0000000..fed79c5
--- /dev/null
+++ b/examples/F90/nc4_sfc_pres_temp_wr.f90
@@ -0,0 +1,144 @@
+! This is part of the netCDF package.
+! Copyright 2006 University Corporation for Atmospheric Research/Unidata.
+! See COPYRIGHT file for conditions of use.
+
+! This example writes some surface pressure and temperatures. It is
+! intended to illustrate the use of the netCDF fortran 90 API. The
+! companion program nc4_sfc_pres_temp_rd.f90 shows how to read the netCDF
+! data file created by this program.
+
+! This program is part of the netCDF tutorial:
+! http://www.unidata.ucar.edu/software/netcdf/docs/netcdf-tutorial
+
+! Full documentation of the netCDF Fortran 90 API can be found at:
+! http://www.unidata.ucar.edu/software/netcdf/docs/netcdf-f90
+
+! $Id: nc4_sfc_pres_temp_wr.f90,v 1.12 2010/04/06 19:32:09 ed Exp $
+
+program nc4_sfc_pres_temp_wr
+  use netcdf
+  implicit none
+
+  ! This is the name of the data file we will create.
+  character (len = *), parameter :: FILE_NAME = "nc4_sfc_pres_temp.nc"
+  integer :: ncid
+
+  ! We are writing 2D data, a 12 x 6 lon-lat grid. We will need two
+  ! netCDF dimensions.
+  integer, parameter :: NDIMS = 2
+  integer, parameter :: NLATS = 6, NLONS = 12
+  character (len = *), parameter :: LAT_NAME = "latitude"
+  character (len = *), parameter :: LON_NAME = "longitude"
+  integer :: lat_dimid, lon_dimid
+
+  ! In addition to the latitude and longitude dimensions, we will also
+  ! create latitude and longitude netCDF variables which will hold the
+  ! actual latitudes and longitudes. Since they hold data about the
+  ! coordinate system, the netCDF term for these is: "coordinate
+  ! variables."
+  real :: lats(NLATS), lons(NLONS)
+  integer :: lat_varid, lon_varid
+  real, parameter :: START_LAT = 25.0, START_LON = -125.0
+
+  ! We will write surface temperature and pressure fields. 
+  character (len = *), parameter :: PRES_NAME="pressure"
+  character (len = *), parameter :: TEMP_NAME="temperature"
+  integer :: pres_varid, temp_varid
+  integer :: dimids(NDIMS)
+
+  ! It's good practice for each variable to carry a "units" attribute.
+  character (len = *), parameter :: UNITS = "units"
+  character (len = *), parameter :: PRES_UNITS = "hPa"
+  character (len = *), parameter :: TEMP_UNITS = "celsius"
+  character (len = *), parameter :: LAT_UNITS = "degrees_north"
+  character (len = *), parameter :: LON_UNITS = "degrees_east"
+
+  ! We will create some pressure and temperature data to write out.
+  real, dimension(:,:), allocatable :: temp_out
+  real, dimension(:,:), allocatable :: pres_out
+  real, parameter :: SAMPLE_PRESSURE = 900.0
+  real, parameter :: SAMPLE_TEMP = 9.0
+
+  ! Loop indices
+  integer :: lat, lon
+
+  ! Allocate memory.
+  allocate(pres_out(NLONS, NLATS))
+  allocate(temp_out(NLONS, NLATS))
+
+  ! Create pretend data. If this were not an example program, we would
+  ! have some real data to write, for example, model output.
+  do lat = 1, NLATS
+     lats(lat) = START_LAT + (lat - 1) * 5.0
+  end do
+  do lon = 1, NLONS
+     lons(lon) = START_LON + (lon - 1) * 5.0
+  end do
+  do lon = 1, NLONS
+     do lat = 1, NLATS
+        pres_out(lon, lat) = SAMPLE_PRESSURE + (lon - 1) * NLATS + (lat - 1)
+        temp_out(lon, lat) = SAMPLE_TEMP + .25 * ((lon - 1) * NLATS + (lat - 1))
+     end do
+  end do
+
+  ! Create the file. 
+  call check( nf90_create(FILE_NAME, nf90_netcdf4, ncid) )
+
+  ! Define the dimensions.
+  call check( nf90_def_dim(ncid, LAT_NAME, NLATS, lat_dimid) )
+  call check( nf90_def_dim(ncid, LON_NAME, NLONS, lon_dimid) )
+
+  ! Define the coordinate variables. They will hold the coordinate
+  ! information, that is, the latitudes and longitudes. A varid is
+  ! returned for each.
+  call check( nf90_def_var(ncid, LAT_NAME, NF90_REAL, lat_dimid, lat_varid) )
+  call check( nf90_def_var(ncid, LON_NAME, NF90_REAL, lon_dimid, lon_varid) )
+
+  ! Assign units attributes to coordinate var data. This attaches a
+  ! text attribute to each of the coordinate variables, containing the
+  ! units.
+  call check( nf90_put_att(ncid, lat_varid, UNITS, LAT_UNITS) )
+  call check( nf90_put_att(ncid, lon_varid, UNITS, LON_UNITS) )
+
+  ! Define the netCDF variables. The dimids array is used to pass the
+  ! dimids of the dimensions of the netCDF variables.
+  dimids = (/ lon_dimid, lat_dimid /)
+  call check( nf90_def_var(ncid, PRES_NAME, NF90_REAL, dimids, pres_varid) )
+  call check( nf90_def_var(ncid, TEMP_NAME, NF90_REAL, dimids, temp_varid) )
+
+  ! Assign units attributes to the pressure and temperature netCDF
+  ! variables.
+  call check( nf90_put_att(ncid, pres_varid, UNITS, PRES_UNITS) )
+  call check( nf90_put_att(ncid, temp_varid, UNITS, TEMP_UNITS) )
+
+  ! End define mode.
+  call check( nf90_enddef(ncid) )
+
+  ! Write the coordinate variable data. This will put the latitudes
+  ! and longitudes of our data grid into the netCDF file.
+  call check( nf90_put_var(ncid, lat_varid, lats) )
+  call check( nf90_put_var(ncid, lon_varid, lons) )
+
+  ! Write the pretend data. This will write our surface pressure and
+  ! surface temperature data. The arrays of data are the same size as
+  ! the netCDF variables we have defined.
+  call check( nf90_put_var(ncid, pres_varid, pres_out) )
+  call check( nf90_put_var(ncid, temp_varid, temp_out) )
+
+  ! Close the file.
+  call check( nf90_close(ncid) )
+   
+  ! If we got this far, everything worked as expected. Yipee! 
+  print *,"*** SUCCESS writing example file nc4_sfc_pres_temp.nc!"
+
+contains
+  subroutine check(status)
+    integer, intent ( in) :: status
+    
+    if(status /= nf90_noerr) then 
+      print *, trim(nf90_strerror(status))
+      stop 2
+    end if
+  end subroutine check  
+end program nc4_sfc_pres_temp_wr
+
diff --git a/examples/F90/nc4_simple_xy_wr.f90 b/examples/F90/nc4_simple_xy_wr.f90
new file mode 100644
index 0000000..5168004
--- /dev/null
+++ b/examples/F90/nc4_simple_xy_wr.f90
@@ -0,0 +1,97 @@
+!     This is part of the netCDF package.
+!     Copyright 2006 University Corporation for Atmospheric Research/Unidata.
+!     See COPYRIGHT file for conditions of use.
+
+!     This is a very simple example which writes a 2D array of
+!     sample data. To handle this in netCDF we create two shared
+!     dimensions, "x" and "y", and a netCDF variable, called "data".
+
+!     This example demonstrates the netCDF Fortran 90 API. This is part
+!     of the netCDF tutorial, which can be found at:
+!     http://www.unidata.ucar.edu/software/netcdf/docs/netcdf-tutorial
+      
+!     Full documentation of the netCDF Fortran 90 API can be found at:
+!     http://www.unidata.ucar.edu/software/netcdf/docs/netcdf-f90
+
+!     $Id: nc4_simple_xy_wr.f90,v 1.11 2010/04/06 19:32:08 ed Exp $
+
+program nc4_simple_xy_wr
+  use netcdf
+  implicit none
+
+  ! This is the name of the data file we will create.
+  character (len = *), parameter :: FILE_NAME = "nc4_simple_xy.nc"
+
+  ! We are writing 2D data, a 12 x 6 grid. 
+  integer, parameter :: NDIMS = 2
+  integer, parameter :: NX = 6, NY = 12
+
+  ! When we create netCDF files, variables and dimensions, we get back
+  ! an ID for each one.
+  integer :: ncid, varid, dimids(NDIMS)
+  integer :: x_dimid, y_dimid
+  
+  ! This is the data array we will write. It will just be filled with
+  ! a progression of integers for this example.
+  integer, dimension(:,:), allocatable :: data_out
+
+  ! Loop indexes, and error handling.
+  integer :: x, y
+
+  ! Allocate memory for data.
+  allocate(data_out(NY, NX))
+
+  ! Create some pretend data. If this wasn't an example program, we
+  ! would have some real data to write, for example, model output.
+  do x = 1, NX
+     do y = 1, NY
+        data_out(y, x) = (x - 1) * NY + (y - 1)
+     end do
+  end do
+
+  ! Always check the return code of every netCDF function call. In
+  ! this example program, wrapping netCDF calls with "call check()"
+  ! makes sure that any return which is not equal to nf90_noerr (0)
+  ! will print a netCDF error message and exit.
+
+  ! Create the netCDF file. The NF90_NETCDF4 parameter tells netCDF to
+  ! overwrite this file, if it already exists.
+  call check( nf90_create(FILE_NAME, NF90_CLOBBER, ncid) )
+
+  ! Define the dimensions. NetCDF will hand back an ID for each. 
+  call check( nf90_def_dim(ncid, "x", NX, x_dimid) )
+  call check( nf90_def_dim(ncid, "y", NY, y_dimid) )
+
+  ! The dimids array is used to pass the IDs of the dimensions of
+  ! the variables. Note that in fortran arrays are stored in
+  ! column-major format.
+  dimids =  (/ y_dimid, x_dimid /)
+
+  ! Define the variable. The type of the variable in this case is
+  ! NF90_INT (4-byte integer).
+  call check( nf90_def_var(ncid, "data", NF90_INT, dimids, varid) )
+
+  ! End define mode. This tells netCDF we are done defining metadata.
+  call check( nf90_enddef(ncid) )
+
+  ! Write the pretend data to the file. Although netCDF supports
+  ! reading and writing subsets of data, in this case we write all the
+  ! data in one operation.
+  call check( nf90_put_var(ncid, varid, data_out) )
+
+  ! Close the file. This frees up any internal netCDF resources
+  ! associated with the file, and flushes any buffers.
+  call check( nf90_close(ncid) )
+
+  print *, "*** SUCCESS writing example file nc4_simple_xy.nc! "
+
+contains
+  subroutine check(status)
+    integer, intent ( in) :: status
+    
+    if(status /= nf90_noerr) then 
+      print *, trim(nf90_strerror(status))
+      stop 2
+    end if
+  end subroutine check  
+end program nc4_simple_xy_wr
diff --git a/examples/F90/pres_temp_4D_rd.f90 b/examples/F90/pres_temp_4D_rd.f90
new file mode 100644
index 0000000..2559ad7
--- /dev/null
+++ b/examples/F90/pres_temp_4D_rd.f90
@@ -0,0 +1,143 @@
+! This is part of the netCDF package.
+! Copyright 2006 University Corporation for Atmospheric Research/Unidata.
+! See COPYRIGHT file for conditions of use.
+
+! This is an example which reads some 4D pressure and
+! temperatures. The data file read by this program is produced by
+! the companion program pres_temp_4D_wr.f90. It is intended to
+! illustrate the use of the netCDF Fortran 90 API.
+
+! This program is part of the netCDF tutorial:
+! http://www.unidata.ucar.edu/software/netcdf/docs/netcdf-tutorial
+
+! Full documentation of the netCDF Fortran 90 API can be found at:
+! http://www.unidata.ucar.edu/software/netcdf/docs/netcdf-f90
+
+! $Id: pres_temp_4D_rd.f90,v 1.9 2010/04/06 19:32:09 ed Exp $
+
+program pres_temp_4D_rd
+  use netcdf
+  implicit none
+  
+  ! This is the name of the data file we will read.
+  character (len = *), parameter :: FILE_NAME = "pres_temp_4D.nc"
+  integer :: ncid
+
+  ! We are reading 4D data, a 12 x 6 x 2 lon-lat-lvl grid, with 2
+  ! timesteps of data.
+  integer, parameter :: NDIMS = 4, NRECS = 2
+  integer, parameter :: NLVLS = 2, NLATS = 6, NLONS = 12
+  character (len = *), parameter :: LVL_NAME = "level"
+  character (len = *), parameter :: LAT_NAME = "latitude"
+  character (len = *), parameter :: LON_NAME = "longitude"
+  character (len = *), parameter :: REC_NAME = "time"
+
+  ! The start and count arrays will tell the netCDF library where to
+  ! read our data.
+  integer :: start(NDIMS), count(NDIMS)
+
+  ! In addition to the latitude and longitude dimensions, we will also
+  ! create latitude and longitude variables which will hold the actual
+  ! latitudes and longitudes. Since they hold data about the
+  ! coordinate system, the netCDF term for these is: "coordinate
+  ! variables."
+  real :: lats(NLATS), lons(NLONS)
+  integer :: lon_varid, lat_varid
+
+  ! We will read surface temperature and pressure fields. In netCDF
+  ! terminology these are called "variables."
+  character (len = *), parameter :: PRES_NAME="pressure"
+  character (len = *), parameter :: TEMP_NAME="temperature"
+  integer :: pres_varid, temp_varid
+
+  ! We recommend that each variable carry a "units" attribute.
+  character (len = *), parameter :: UNITS = "units"
+  character (len = *), parameter :: PRES_UNITS = "hPa", TEMP_UNITS = "celsius"
+  character (len = *), parameter :: LAT_UNITS = "degrees_north"
+  character (len = *), parameter :: LON_UNITS = "degrees_east"
+
+  ! Program variables to hold the data we will read in. We will only
+  ! need enough space to hold one timestep of data; one record.
+  ! Allocate memory for data.
+  real, dimension(:,:,:), allocatable :: pres_in
+  real, dimension(:,:,:), allocatable :: temp_in
+  real, parameter :: SAMPLE_PRESSURE = 900.0
+  real, parameter :: SAMPLE_TEMP = 9.0
+
+  ! Use these to calculate the values we expect to find.
+  real, parameter :: START_LAT = 25.0, START_LON = -125.0
+
+  ! Loop indices
+  integer :: lvl, lat, lon, rec, i
+
+  ! Allocate memory.
+  allocate(pres_in(NLONS, NLATS, NLVLS))
+  allocate(temp_in(NLONS, NLATS, NLVLS))
+
+  ! Open the file. 
+  call check( nf90_open(FILE_NAME, nf90_nowrite, ncid) )
+
+  ! Get the varids of the latitude and longitude coordinate variables.
+  call check( nf90_inq_varid(ncid, LAT_NAME, lat_varid) )
+  call check( nf90_inq_varid(ncid, LON_NAME, lon_varid) )
+
+  ! Read the latitude and longitude data.
+  call check( nf90_get_var(ncid, lat_varid, lats) )
+  call check( nf90_get_var(ncid, lon_varid, lons) )
+  
+  ! Check to make sure we got what we expected.
+  do lat = 1, NLATS
+     if (lats(lat) /= START_LAT + (lat - 1) * 5.0) stop 2
+  end do
+  do lon = 1, NLONS
+     if (lons(lon) /= START_LON + (lon - 1) * 5.0) stop 2
+  end do
+
+  ! Get the varids of the pressure and temperature netCDF variables.
+  call check( nf90_inq_varid(ncid, PRES_NAME, pres_varid) )
+  call check( nf90_inq_varid(ncid, TEMP_NAME, temp_varid) )
+
+  ! Read 1 record of NLONS*NLATS*NLVLS values, starting at the beginning 
+  ! of the record (the (1, 1, 1, rec) element in the netCDF file).
+  count = (/ NLONS, NLATS, NLVLS, 1 /)
+  start = (/ 1, 1, 1, 1 /)
+
+  ! Read the surface pressure and temperature data from the file, one
+  ! record at a time.
+  do rec = 1, NRECS
+     start(4) = rec
+     call check( nf90_get_var(ncid, pres_varid, pres_in, start = start, &
+                              count = count) )
+     call check( nf90_get_var(ncid, temp_varid, temp_in, start, count) )
+     
+     i = 0
+     do lvl = 1, NLVLS
+        do lat = 1, NLATS
+           do lon = 1, NLONS
+              if (pres_in(lon, lat, lvl) /= SAMPLE_PRESSURE + i) stop 2
+              if (temp_in(lon, lat, lvl) /= SAMPLE_TEMP + i) stop 2
+              i = i + 1
+           end do
+        end do
+     end do
+     ! next record
+  end do
+         
+  ! Close the file. This frees up any internal netCDF resources
+  ! associated with the file.
+  call check( nf90_close(ncid) )
+
+  ! If we got this far, everything worked as expected. Yipee! 
+  print *,"*** SUCCESS reading example file ", FILE_NAME, "!"
+
+contains
+  subroutine check(status)
+    integer, intent ( in) :: status
+    
+    if(status /= nf90_noerr) then 
+      print *, trim(nf90_strerror(status))
+      stop 2
+    end if
+  end subroutine check  
+end program pres_temp_4D_rd
+
diff --git a/examples/F90/pres_temp_4D_wr.f90 b/examples/F90/pres_temp_4D_wr.f90
new file mode 100644
index 0000000..b77d0ee
--- /dev/null
+++ b/examples/F90/pres_temp_4D_wr.f90
@@ -0,0 +1,175 @@
+! This is part of the netCDF package.
+! Copyright 2006 University Corporation for Atmospheric Research/Unidata.
+! See COPYRIGHT file for conditions of use.
+
+! This is an example program which writes some 4D pressure and
+! temperatures. It is intended to illustrate the use of the netCDF
+! fortran 90 API. The companion program pres_temp_4D_rd.f shows how
+! to read the netCDF data file created by this program.
+
+! This program is part of the netCDF tutorial:
+! http://www.unidata.ucar.edu/software/netcdf/docs/netcdf-tutorial
+
+! Full documentation of the netCDF Fortran 90 API can be found at:
+! http://www.unidata.ucar.edu/software/netcdf/docs/netcdf-f90
+
+! $Id: pres_temp_4D_wr.f90,v 1.10 2010/04/06 19:32:09 ed Exp $
+
+program pres_temp_4D_wr
+  use netcdf
+  implicit none
+
+  ! This is the name of the data file we will create.
+  character (len = *), parameter :: FILE_NAME = "pres_temp_4D.nc"
+  integer :: ncid
+
+  ! We are writing 4D data, a 12 x 6 x 2 lon-lat-lvl grid, with 2
+  ! timesteps of data.
+  integer, parameter :: NDIMS = 4, NRECS = 2
+  integer, parameter :: NLVLS = 2, NLATS = 6, NLONS = 12
+  character (len = *), parameter :: LVL_NAME = "level"
+  character (len = *), parameter :: LAT_NAME = "latitude"
+  character (len = *), parameter :: LON_NAME = "longitude"
+  character (len = *), parameter :: REC_NAME = "time"
+  integer :: lvl_dimid, lon_dimid, lat_dimid, rec_dimid
+
+  ! The start and count arrays will tell the netCDF library where to
+  ! write our data.
+  integer :: start(NDIMS), count(NDIMS)
+
+  ! These program variables hold the latitudes and longitudes.
+  real :: lats(NLATS), lons(NLONS)
+  integer :: lon_varid, lat_varid
+
+  ! We will create two netCDF variables, one each for temperature and
+  ! pressure fields.
+  character (len = *), parameter :: PRES_NAME="pressure"
+  character (len = *), parameter :: TEMP_NAME="temperature"
+  integer :: pres_varid, temp_varid
+  integer :: dimids(NDIMS)
+
+  ! We recommend that each variable carry a "units" attribute.
+  character (len = *), parameter :: UNITS = "units"
+  character (len = *), parameter :: PRES_UNITS = "hPa"
+  character (len = *), parameter :: TEMP_UNITS = "celsius"
+  character (len = *), parameter :: LAT_UNITS = "degrees_north"
+  character (len = *), parameter :: LON_UNITS = "degrees_east"
+
+  ! Program variables to hold the data we will write out. We will only
+  ! need enough space to hold one timestep of data; one record.
+  real, dimension(:,:,:), allocatable :: pres_out
+  real, dimension(:,:,:), allocatable :: temp_out
+  real, parameter :: SAMPLE_PRESSURE = 900.0
+  real, parameter :: SAMPLE_TEMP = 9.0
+
+  ! Use these to construct some latitude and longitude data for this
+  ! example.
+  real, parameter :: START_LAT = 25.0, START_LON = -125.0
+
+  ! Loop indices
+  integer :: lvl, lat, lon, rec, i
+
+  ! Allocate memory.
+  allocate(pres_out(NLONS, NLATS, NLVLS))
+  allocate(temp_out(NLONS, NLATS, NLVLS))
+
+  ! Create pretend data. If this were not an example program, we would
+  ! have some real data to write, for example, model output.
+  do lat = 1, NLATS
+     lats(lat) = START_LAT + (lat - 1) * 5.0
+  end do
+  do lon = 1, NLONS
+     lons(lon) = START_LON + (lon - 1) * 5.0
+  end do
+  i = 0
+  do lvl = 1, NLVLS
+     do lat = 1, NLATS
+        do lon = 1, NLONS
+           pres_out(lon, lat, lvl) = SAMPLE_PRESSURE + i
+           temp_out(lon, lat, lvl) = SAMPLE_TEMP + i
+           i = i + 1
+        end do
+     end do
+  end do
+
+  ! Create the file. 
+  call check( nf90_create(FILE_NAME, nf90_clobber, ncid) )
+  
+  ! Define the dimensions. The record dimension is defined to have
+  ! unlimited length - it can grow as needed. In this example it is
+  ! the time dimension.
+  call check( nf90_def_dim(ncid, LVL_NAME, NLVLS, lvl_dimid) )
+  call check( nf90_def_dim(ncid, LAT_NAME, NLATS, lat_dimid) )
+  call check( nf90_def_dim(ncid, LON_NAME, NLONS, lon_dimid) )
+  call check( nf90_def_dim(ncid, REC_NAME, NF90_UNLIMITED, rec_dimid) )
+
+  ! Define the coordinate variables. We will only define coordinate
+  ! variables for lat and lon.  Ordinarily we would need to provide
+  ! an array of dimension IDs for each variable's dimensions, but
+  ! since coordinate variables only have one dimension, we can
+  ! simply provide the address of that dimension ID (lat_dimid) and
+  ! similarly for (lon_dimid).
+  call check( nf90_def_var(ncid, LAT_NAME, NF90_REAL, lat_dimid, lat_varid) )
+  call check( nf90_def_var(ncid, LON_NAME, NF90_REAL, lon_dimid, lon_varid) )
+
+  ! Assign units attributes to coordinate variables.
+  call check( nf90_put_att(ncid, lat_varid, UNITS, LAT_UNITS) )
+  call check( nf90_put_att(ncid, lon_varid, UNITS, LON_UNITS) )
+
+  ! The dimids array is used to pass the dimids of the dimensions of
+  ! the netCDF variables. Both of the netCDF variables we are creating
+  ! share the same four dimensions. In Fortran, the unlimited
+  ! dimension must come last on the list of dimids.
+  dimids = (/ lon_dimid, lat_dimid, lvl_dimid, rec_dimid /)
+
+  ! Define the netCDF variables for the pressure and temperature data.
+  call check( nf90_def_var(ncid, PRES_NAME, NF90_REAL, dimids, pres_varid) )
+  call check( nf90_def_var(ncid, TEMP_NAME, NF90_REAL, dimids, temp_varid) )
+
+  ! Assign units attributes to the netCDF variables.
+  call check( nf90_put_att(ncid, pres_varid, UNITS, PRES_UNITS) )
+  call check( nf90_put_att(ncid, temp_varid, UNITS, TEMP_UNITS) )
+  
+  ! End define mode.
+  call check( nf90_enddef(ncid) )
+  
+  ! Write the coordinate variable data. This will put the latitudes
+  ! and longitudes of our data grid into the netCDF file.
+  call check( nf90_put_var(ncid, lat_varid, lats) )
+  call check( nf90_put_var(ncid, lon_varid, lons) )
+  
+  ! These settings tell netcdf to write one timestep of data. (The
+  ! setting of start(4) inside the loop below tells netCDF which
+  ! timestep to write.)
+  count = (/ NLONS, NLATS, NLVLS, 1 /)
+  start = (/ 1, 1, 1, 1 /)
+
+  ! Write the pretend data. This will write our surface pressure and
+  ! surface temperature data. The arrays only hold one timestep worth
+  ! of data. We will just rewrite the same data for each timestep. In
+  ! a real :: application, the data would change between timesteps.
+  do rec = 1, NRECS
+     start(4) = rec
+     call check( nf90_put_var(ncid, pres_varid, pres_out, start = start, &
+                              count = count) )
+     call check( nf90_put_var(ncid, temp_varid, temp_out, start = start, &
+                              count = count) )
+  end do
+  
+  ! Close the file. This causes netCDF to flush all buffers and make
+  ! sure your data are really written to disk.
+  call check( nf90_close(ncid) )
+  
+  print *,"*** SUCCESS writing example file ", FILE_NAME, "!"
+
+contains
+  subroutine check(status)
+    integer, intent ( in) :: status
+    
+    if(status /= nf90_noerr) then 
+      print *, trim(nf90_strerror(status))
+      stop 2
+    end if
+  end subroutine check  
+end program pres_temp_4D_wr
+
diff --git a/examples/F90/run_f90_par_examples.sh b/examples/F90/run_f90_par_examples.sh
new file mode 100755
index 0000000..291ea46
--- /dev/null
+++ b/examples/F90/run_f90_par_examples.sh
@@ -0,0 +1,3 @@
+mpiexec -n 4 ./simple_xy_par_wr
+mpiexec -n 4 ./simple_xy_par_rd
+mpiexec -n 4 ./simple_xy_par_wr2
diff --git a/examples/F90/run_nc4_comps.sh b/examples/F90/run_nc4_comps.sh
new file mode 100755
index 0000000..10e25be
--- /dev/null
+++ b/examples/F90/run_nc4_comps.sh
@@ -0,0 +1,23 @@
+#!/bin/sh
+
+# This shell script runs some test for netCDF-4. It checks that the
+# HDF5 versions of the example data files match (according to ncdump)
+# the netCDF-3 classic versions.
+
+# $Id: run_nc4_comps.sh,v 1.1 2006/11/01 13:17:48 ed Exp $
+
+set -e
+echo ""
+echo "*** Comparing HDF5 example data files with netCDF classic format versions."
+echo "*** checking simple_xy..."
+../../ncdump/ncdump -n simple_xy nc4_simple_xy.nc > simple_xy.cdl
+diff -w simple_xy.cdl $srcdir/../CDL/simple_xy.cdl
+echo "*** checking sfc_pres_temp..."
+../../ncdump/ncdump -n sfc_pres_temp nc4_sfc_pres_temp.nc > sfc_pres_temp.cdl
+diff -w sfc_pres_temp.cdl $srcdir/../CDL/sfc_pres_temp.cdl
+echo "*** checking pres_temp_4D..."
+../../ncdump/ncdump -n pres_temp_4D nc4_pres_temp_4D.nc > pres_temp_4D.cdl
+diff -w pres_temp_4D.cdl $srcdir/../CDL/pres_temp_4D.cdl
+
+echo "*** All HDF5 example data files passed!"
+exit 0
diff --git a/examples/F90/sfc_pres_temp_rd.f90 b/examples/F90/sfc_pres_temp_rd.f90
new file mode 100644
index 0000000..a27a7df
--- /dev/null
+++ b/examples/F90/sfc_pres_temp_rd.f90
@@ -0,0 +1,158 @@
+! This is part of the netCDF package.
+! Copyright 2006 University Corporation for Atmospheric Research/Unidata.
+! See COPYRIGHT file for conditions of use.
+
+! This is an example which reads some surface pressure and
+! temperatures. The data file read by this program is produced
+! comapnion program sfc_pres_temp_wr.f90. It is intended to illustrate
+! the use of the netCDF fortran 90 API.
+
+! This program is part of the netCDF tutorial:
+! http://www.unidata.ucar.edu/software/netcdf/docs/netcdf-tutorial
+
+! Full documentation of the netCDF Fortran 90 API can be found at:
+! http://www.unidata.ucar.edu/software/netcdf/docs/netcdf-f90
+
+! $Id: sfc_pres_temp_rd.f90,v 1.10 2010/04/06 19:32:09 ed Exp $
+
+program sfc_pres_temp_rd
+  use netcdf
+  implicit none
+
+  ! This is the name of the data file we will read.
+  character (len = *), parameter :: FILE_NAME = "sfc_pres_temp.nc"
+  integer :: ncid
+
+  ! We are reading 2D data, a 12 x 6 lon-lat grid.
+  integer, parameter :: NDIMS = 2
+  integer, parameter :: NLATS = 6, NLONS = 12
+  character (len = *), parameter :: LAT_NAME = "latitude"
+  character (len = *), parameter :: LON_NAME = "longitude"
+
+  ! For the lat lon coordinate netCDF variables.
+  real :: lats(NLATS), lons(NLONS)
+  integer :: lat_varid, lon_varid
+
+  ! We will read surface temperature and pressure fields. 
+  character (len = *), parameter :: PRES_NAME = "pressure"
+  character (len = *), parameter :: TEMP_NAME = "temperature"
+  integer :: pres_varid, temp_varid
+
+  ! To check the units attributes.
+  character (len = *), parameter :: UNITS = "units"
+  character (len = *), parameter :: PRES_UNITS = "hPa"
+  character (len = *), parameter :: TEMP_UNITS = "celsius"
+  character (len = *), parameter :: LAT_UNITS = "degrees_north"
+  character (len = *), parameter :: LON_UNITS = "degrees_east"
+  integer, parameter :: MAX_ATT_LEN = 80
+  integer :: att_len
+  character*(MAX_ATT_LEN) :: pres_units_in, temp_units_in
+  character*(MAX_ATT_LEN) :: lat_units_in, lon_units_in
+
+  ! Read the data into these arrays.
+  real, dimension(:,:), allocatable :: pres_in
+  real, dimension(:,:), allocatable :: temp_in
+
+  ! These are used to calculate the values we expect to find.
+  real, parameter :: START_LAT = 25.0, START_LON = -125.0
+  real, parameter :: SAMPLE_PRESSURE = 900.0
+  real, parameter :: SAMPLE_TEMP = 9.0
+
+  ! We will learn about the data file and store results in these
+  ! program variables.
+  integer :: ndims_in, nvars_in, ngatts_in, unlimdimid_in
+
+  ! Loop indices
+  integer :: lat, lon
+
+  ! Allocate memory.
+  allocate(pres_in(NLONS, NLATS))
+  allocate(temp_in(NLONS, NLATS))
+
+  ! Open the file. 
+  call check( nf90_open(FILE_NAME, nf90_nowrite, ncid) )
+
+  ! There are a number of inquiry functions in netCDF which can be
+  ! used to learn about an unknown netCDF file. NF90_INQ tells how many
+  ! netCDF variables, dimensions, and global attributes are in the
+  ! file; also the dimension id of the unlimited dimension, if there
+  ! is one.
+  call check( nf90_inquire(ncid, ndims_in, nvars_in, ngatts_in, unlimdimid_in) )
+
+  ! In this case we know that there are 2 netCDF dimensions, 4 netCDF
+  ! variables, no global attributes, and no unlimited dimension.
+  if (ndims_in /= 2 .or. nvars_in /= 4 .or. ngatts_in /= 0 &
+       .or. unlimdimid_in /= -1) stop 2
+
+  ! Get the varids of the latitude and longitude coordinate variables.
+  call check( nf90_inq_varid(ncid, LAT_NAME, lat_varid) )
+  call check( nf90_inq_varid(ncid, LON_NAME, lon_varid) )
+
+  ! Read the latitude and longitude data.
+  call check( nf90_get_var(ncid, lat_varid, lats) )
+  call check( nf90_get_var(ncid, lon_varid, lons) )
+
+  ! Check to make sure we got what we expected.
+  do lat = 1, NLATS
+     if (lats(lat) /= START_LAT + (lat - 1) * 5.0) stop 2
+  end do
+  do lon = 1, NLONS
+     if (lons(lon) /= START_LON + (lon - 1) * 5.0) stop 2
+  end do
+
+  ! Get the varids of the pressure and temperature netCDF variables.
+  call check( nf90_inq_varid(ncid, PRES_NAME, pres_varid) )
+  call check( nf90_inq_varid(ncid, TEMP_NAME, temp_varid) )
+
+  ! Read the surface pressure and temperature data from the file.
+  ! Since we know the contents of the file we know that the data
+  ! arrays in this program are the correct size to hold all the data.
+  call check( nf90_get_var(ncid, pres_varid, pres_in) )
+  call check( nf90_get_var(ncid, temp_varid, temp_in) )
+
+  ! Check the data. It should be the same as the data we wrote.
+  do lon = 1, NLONS
+     do lat = 1, NLATS
+        if (pres_in(lon, lat) /= SAMPLE_PRESSURE + &
+             (lon - 1) * NLATS + (lat - 1)) stop 2
+        if (temp_in(lon, lat) /= SAMPLE_TEMP + &
+             .25 * ((lon - 1) * NLATS + (lat - 1))) stop 2
+     end do
+  end do
+
+  ! Each of the netCDF variables has a "units" attribute. Let's read
+  ! them and check them.
+  call check( nf90_get_att(ncid, lat_varid, UNITS, lat_units_in) )
+  call check( nf90_inquire_attribute(ncid, lat_varid, UNITS, len = att_len) )
+  if (lat_units_in(1:att_len) /= LAT_UNITS) stop 2
+
+  call check( nf90_get_att(ncid, lon_varid, UNITS, lon_units_in) )
+  call check( nf90_inquire_attribute(ncid, lon_varid, UNITS, len = att_len) )
+  if (lon_units_in(1:att_len) /= LON_UNITS) stop 2
+
+  call check( nf90_get_att(ncid, pres_varid, UNITS, pres_units_in) )
+  call check( nf90_inquire_attribute(ncid, pres_varid, UNITS, len = att_len) )
+  if (pres_units_in(1:att_len) /= PRES_UNITS) stop 2
+
+  call check( nf90_get_att(ncid, temp_varid, UNITS, temp_units_in) )
+  call check( nf90_inquire_attribute(ncid, temp_varid, UNITS, len = att_len) )
+  if (temp_units_in(1:att_len) /= TEMP_UNITS) stop 2
+
+  ! Close the file. This frees up any internal netCDF resources
+  ! associated with the file.
+  call check( nf90_close(ncid) )
+
+  ! If we got this far, everything worked as expected. Yipee! 
+  print *,"*** SUCCESS reading example file sfc_pres_temp.nc!"
+
+contains
+  subroutine check(status)
+    integer, intent ( in) :: status
+    
+    if(status /= nf90_noerr) then 
+      print *, trim(nf90_strerror(status))
+      stop 2
+    end if
+  end subroutine check  
+end program sfc_pres_temp_rd
+
diff --git a/examples/F90/sfc_pres_temp_wr.f90 b/examples/F90/sfc_pres_temp_wr.f90
new file mode 100644
index 0000000..ab3e6cb
--- /dev/null
+++ b/examples/F90/sfc_pres_temp_wr.f90
@@ -0,0 +1,144 @@
+! This is part of the netCDF package.
+! Copyright 2006 University Corporation for Atmospheric Research/Unidata.
+! See COPYRIGHT file for conditions of use.
+
+! This example writes some surface pressure and temperatures. It is
+! intended to illustrate the use of the netCDF fortran 90 API. The
+! companion program sfc_pres_temp_rd.f90 shows how to read the netCDF
+! data file created by this program.
+
+! This program is part of the netCDF tutorial:
+! http://www.unidata.ucar.edu/software/netcdf/docs/netcdf-tutorial
+
+! Full documentation of the netCDF Fortran 90 API can be found at:
+! http://www.unidata.ucar.edu/software/netcdf/docs/netcdf-f90
+
+! $Id: sfc_pres_temp_wr.f90,v 1.12 2010/04/06 19:32:09 ed Exp $
+
+program sfc_pres_temp_wr
+  use netcdf
+  implicit none
+
+  ! This is the name of the data file we will create.
+  character (len = *), parameter :: FILE_NAME = "sfc_pres_temp.nc"
+  integer :: ncid
+
+  ! We are writing 2D data, a 12 x 6 lon-lat grid. We will need two
+  ! netCDF dimensions.
+  integer, parameter :: NDIMS = 2
+  integer, parameter :: NLATS = 6, NLONS = 12
+  character (len = *), parameter :: LAT_NAME = "latitude"
+  character (len = *), parameter :: LON_NAME = "longitude"
+  integer :: lat_dimid, lon_dimid
+
+  ! In addition to the latitude and longitude dimensions, we will also
+  ! create latitude and longitude netCDF variables which will hold the
+  ! actual latitudes and longitudes. Since they hold data about the
+  ! coordinate system, the netCDF term for these is: "coordinate
+  ! variables."
+  real :: lats(NLATS), lons(NLONS)
+  integer :: lat_varid, lon_varid
+  real, parameter :: START_LAT = 25.0, START_LON = -125.0
+
+  ! We will write surface temperature and pressure fields. 
+  character (len = *), parameter :: PRES_NAME="pressure"
+  character (len = *), parameter :: TEMP_NAME="temperature"
+  integer :: pres_varid, temp_varid
+  integer :: dimids(NDIMS)
+
+  ! It's good practice for each variable to carry a "units" attribute.
+  character (len = *), parameter :: UNITS = "units"
+  character (len = *), parameter :: PRES_UNITS = "hPa"
+  character (len = *), parameter :: TEMP_UNITS = "celsius"
+  character (len = *), parameter :: LAT_UNITS = "degrees_north"
+  character (len = *), parameter :: LON_UNITS = "degrees_east"
+
+  ! We will create some pressure and temperature data to write out.
+  real, dimension(:,:), allocatable :: temp_out
+  real, dimension(:,:), allocatable :: pres_out
+  real, parameter :: SAMPLE_PRESSURE = 900.0
+  real, parameter :: SAMPLE_TEMP = 9.0
+
+  ! Loop indices
+  integer :: lat, lon
+
+  ! Allocate memory.
+  allocate(pres_out(NLONS, NLATS))
+  allocate(temp_out(NLONS, NLATS))
+
+  ! Create pretend data. If this were not an example program, we would
+  ! have some real data to write, for example, model output.
+  do lat = 1, NLATS
+     lats(lat) = START_LAT + (lat - 1) * 5.0
+  end do
+  do lon = 1, NLONS
+     lons(lon) = START_LON + (lon - 1) * 5.0
+  end do
+  do lon = 1, NLONS
+     do lat = 1, NLATS
+        pres_out(lon, lat) = SAMPLE_PRESSURE + (lon - 1) * NLATS + (lat - 1)
+        temp_out(lon, lat) = SAMPLE_TEMP + .25 * ((lon - 1) * NLATS + (lat - 1))
+     end do
+  end do
+
+  ! Create the file. 
+  call check( nf90_create(FILE_NAME, nf90_clobber, ncid) )
+
+  ! Define the dimensions.
+  call check( nf90_def_dim(ncid, LAT_NAME, NLATS, lat_dimid) )
+  call check( nf90_def_dim(ncid, LON_NAME, NLONS, lon_dimid) )
+
+  ! Define the coordinate variables. They will hold the coordinate
+  ! information, that is, the latitudes and longitudes. A varid is
+  ! returned for each.
+  call check( nf90_def_var(ncid, LAT_NAME, NF90_REAL, lat_dimid, lat_varid) )
+  call check( nf90_def_var(ncid, LON_NAME, NF90_REAL, lon_dimid, lon_varid) )
+
+  ! Assign units attributes to coordinate var data. This attaches a
+  ! text attribute to each of the coordinate variables, containing the
+  ! units.
+  call check( nf90_put_att(ncid, lat_varid, UNITS, LAT_UNITS) )
+  call check( nf90_put_att(ncid, lon_varid, UNITS, LON_UNITS) )
+
+  ! Define the netCDF variables. The dimids array is used to pass the
+  ! dimids of the dimensions of the netCDF variables.
+  dimids = (/ lon_dimid, lat_dimid /)
+  call check( nf90_def_var(ncid, PRES_NAME, NF90_REAL, dimids, pres_varid) )
+  call check( nf90_def_var(ncid, TEMP_NAME, NF90_REAL, dimids, temp_varid) )
+
+  ! Assign units attributes to the pressure and temperature netCDF
+  ! variables.
+  call check( nf90_put_att(ncid, pres_varid, UNITS, PRES_UNITS) )
+  call check( nf90_put_att(ncid, temp_varid, UNITS, TEMP_UNITS) )
+
+  ! End define mode.
+  call check( nf90_enddef(ncid) )
+
+  ! Write the coordinate variable data. This will put the latitudes
+  ! and longitudes of our data grid into the netCDF file.
+  call check( nf90_put_var(ncid, lat_varid, lats) )
+  call check( nf90_put_var(ncid, lon_varid, lons) )
+
+  ! Write the pretend data. This will write our surface pressure and
+  ! surface temperature data. The arrays of data are the same size as
+  ! the netCDF variables we have defined.
+  call check( nf90_put_var(ncid, pres_varid, pres_out) )
+  call check( nf90_put_var(ncid, temp_varid, temp_out) )
+
+  ! Close the file.
+  call check( nf90_close(ncid) )
+   
+  ! If we got this far, everything worked as expected. Yipee! 
+  print *,"*** SUCCESS writing example file sfc_pres_temp.nc!"
+
+contains
+  subroutine check(status)
+    integer, intent ( in) :: status
+    
+    if(status /= nf90_noerr) then 
+      print *, trim(nf90_strerror(status))
+      stop 2
+    end if
+  end subroutine check  
+end program sfc_pres_temp_wr
+
diff --git a/examples/F90/simple_xy_nc4_rd.f90 b/examples/F90/simple_xy_nc4_rd.f90
new file mode 100644
index 0000000..dec2211
--- /dev/null
+++ b/examples/F90/simple_xy_nc4_rd.f90
@@ -0,0 +1,89 @@
+! This is part of the netCDF package.
+! Copyright 2006 University Corporation for Atmospheric Research/Unidata.
+! See COPYRIGHT file for conditions of use.
+      
+! This is a simple example which reads a small dummy array, from a
+! netCDF data file created by the companion program simple_xy_wr.f90.
+      
+! This is intended to illustrate the use of the netCDF fortran 77
+! API. This example program is part of the netCDF tutorial, which can
+! be found at:
+! http://www.unidata.ucar.edu/software/netcdf/docs/netcdf-tutorial
+      
+! Full documentation of the netCDF Fortran 90 API can be found at:
+! http://www.unidata.ucar.edu/software/netcdf/docs/netcdf-f90
+
+! $Id: simple_xy_nc4_rd.f90,v 1.3 2009/02/25 12:23:45 ed Exp $
+
+program simple_xy_rd
+  use netcdf
+  implicit none
+
+  ! This is the name of the data file and variable.
+  character (len = *), parameter :: FILE_NAME = "simple_xy_nc4.nc"
+  character (len = *), parameter :: VAR_NAME = "data"
+
+  ! We are reading 2D data, a 12 x 6 grid. 
+  integer, parameter :: NX = 6, NY = 12, MAX_DIMS = 2
+  integer :: data_in(NY, NX)
+
+  ! This will be the netCDF ID for the file and data variable.
+  integer :: ncid, varid
+
+  ! Information we will read about the variable.
+  character (len = nf90_max_name) :: name
+  integer :: xtype, ndims, dimids(MAX_DIMS), natts
+  integer :: chunksizes(MAX_DIMS), deflate_level, endianness
+  logical :: contiguous, shuffle, fletcher32
+
+  ! Loop indexes, and error handling.
+  integer :: x, y
+
+  ! Open the file. NF90_NOWRITE tells netCDF we want read-only access
+  ! to the file.
+  call check( nf90_open(FILE_NAME, NF90_NOWRITE, ncid) )
+
+  ! Get the varid of the data variable, based on its name.
+  call check( nf90_inq_varid(ncid, VAR_NAME, varid) )
+
+  ! Learn about the variable. This uses all optional parameters.
+  call check( nf90_inquire_variable(ncid, varid, name, xtype, ndims, &
+       dimids, natts, contiguous = contiguous, chunksizes = chunksizes, &
+       deflate_level = deflate_level, shuffle = shuffle, &
+       fletcher32 = fletcher32, endianness = endianness) )
+
+  ! Make sure we got the correct answers. These depend on what was set
+  ! when creating the file in simple_xy_nc4_wr.f90. Endianness will be
+  ! whatever is native for the machine that's building this example.
+  if (name .ne. VAR_NAME .or. xtype .ne. NF90_INT .or. ndims .ne. 2 .or. &
+       natts .ne. 0 .or. contiguous .or. .not. shuffle .or. &
+       deflate_level .ne. 1 .or. fletcher32) stop 3
+
+  ! Read the data.
+  call check( nf90_get_var(ncid, varid, data_in) )
+
+  ! Check the data.
+  do x = 1, NX
+     do y = 1, NY
+        if (data_in(y, x) /= (x - 1) * NY + (y - 1)) then
+           print *, "data_in(", y, ", ", x, ") = ", data_in(y, x)
+           stop "Stopped"
+        end if
+     end do
+  end do
+
+  ! Close the file, freeing all resources.
+  call check( nf90_close(ncid) )
+
+  print *,"*** SUCCESS reading example file ", FILE_NAME, "! "
+
+contains
+  subroutine check(status)
+    integer, intent ( in) :: status
+    
+    if(status /= nf90_noerr) then 
+      print *, trim(nf90_strerror(status))
+      stop 2
+    end if
+  end subroutine check  
+end program simple_xy_rd
diff --git a/examples/F90/simple_xy_nc4_wr.f90 b/examples/F90/simple_xy_nc4_wr.f90
new file mode 100644
index 0000000..adc1b8f
--- /dev/null
+++ b/examples/F90/simple_xy_nc4_wr.f90
@@ -0,0 +1,90 @@
+!     This is part of the netCDF package.  Copyright 2006 University
+!     Corporation for Atmospheric Research/Unidata.  See COPYRIGHT
+!     file for conditions of use.
+
+!     This is a very simple example which writes a 2D array of sample
+!     data. To handle this in netCDF we create two shared dimensions,
+!     "x" and "y", and a netCDF variable, called "data".
+
+!     This example demonstrates the netCDF Fortran 90 API. This is
+!     part of the netCDF tutorial, which can be found at:
+!     http://www.unidata.ucar.edu/software/netcdf/docs/netcdf-tutorial
+      
+!     Full documentation of the netCDF Fortran 90 API can be found at:
+!     http://www.unidata.ucar.edu/software/netcdf/docs/netcdf-f90
+
+!     $Id: simple_xy_nc4_wr.f90,v 1.6 2010/04/06 19:32:09 ed Exp $
+
+program simple_xy_wr
+  use netcdf
+  implicit none
+
+  character (len = *), parameter :: FILE_NAME = "simple_xy_nc4.nc"
+  integer, parameter :: NDIMS = 2
+  integer, parameter :: NX = 6, NY = 12
+  integer :: ncid, varid, dimids(NDIMS)
+  integer :: x_dimid, y_dimid
+  integer :: data_out(NY, NX)
+  integer :: chunks(2)
+  integer :: deflate_level
+  integer :: x, y
+
+  ! Create some pretend data. If this wasn't an example program, we
+  ! would have some real data to write, for example, model output.
+  do x = 1, NX
+     do y = 1, NY
+        data_out(y, x) = (x - 1) * NY + (y - 1)
+     end do
+  end do
+
+  ! Always check the return code of every netCDF function call. In
+  ! this example program, wrapping netCDF calls with "call check()"
+  ! makes sure that any return which is not equal to nf90_noerr (0)
+  ! will print a netCDF error message and exit.
+
+  ! Create the netCDF file. The nf90_clobber parameter tells netCDF to
+  ! overwrite this file, if it already exists.
+  call check( nf90_create(FILE_NAME, nf90_netcdf4, ncid) )
+
+  ! Define the dimensions. NetCDF will hand back an ID for each. 
+  call check( nf90_def_dim(ncid, "x", NX, x_dimid) )
+  call check( nf90_def_dim(ncid, "y", NY, y_dimid) )
+
+  ! The dimids array is used to pass the IDs of the dimensions of
+  ! the variables. Note that in fortran arrays are stored in
+  ! column-major format.
+  dimids =  (/ y_dimid, x_dimid /)
+
+  ! Define the variable. The type of the variable in this case is
+  ! NF90_INT (4-byte integer). Optional parameters chunking, shuffle,
+  ! and deflate_level are used.
+  chunks(1) = NY
+  chunks(2) = NX
+  deflate_level = 1
+  call check( nf90_def_var(ncid, "data", NF90_INT, dimids, varid, &
+       chunksizes = chunks, shuffle = .TRUE., deflate_level = deflate_level) )
+
+  ! End define mode. This tells netCDF we are done defining metadata.
+  call check( nf90_enddef(ncid) )
+
+  ! Write the pretend data to the file. Although netCDF supports
+  ! reading and writing subsets of data, in this case we write all the
+  ! data in one operation.
+  call check( nf90_put_var(ncid, varid, data_out) )
+
+  ! Close the file. This frees up any internal netCDF resources
+  ! associated with the file, and flushes any buffers.
+  call check( nf90_close(ncid) )
+
+  print *, '*** SUCCESS writing example file ', FILE_NAME, '!'
+
+contains
+  subroutine check(status)
+    integer, intent ( in) :: status
+    
+    if(status /= nf90_noerr) then 
+      print *, trim(nf90_strerror(status))
+      stop 2
+    end if
+  end subroutine check  
+end program simple_xy_wr
diff --git a/examples/F90/simple_xy_par_rd.f90 b/examples/F90/simple_xy_par_rd.f90
new file mode 100644
index 0000000..01fb206
--- /dev/null
+++ b/examples/F90/simple_xy_par_rd.f90
@@ -0,0 +1,96 @@
+! This is part of the netCDF package.
+! Copyright 2008 University Corporation for Atmospheric Research/Unidata.
+! See COPYRIGHT file for conditions of use.
+      
+! This is a simple example which reads a small dummy array, from a
+! netCDF data file created by the companion program
+! simple_xy_par_wr.f90. The data are read using parallel I/O.
+      
+! This is intended to illustrate the use of the netCDF fortran 90
+! API. This example program is part of the netCDF tutorial, which can
+! be found at:
+! http://www.unidata.ucar.edu/software/netcdf/docs/netcdf-tutorial
+      
+! Full documentation of the netCDF Fortran 90 API can be found at:
+! http://www.unidata.ucar.edu/software/netcdf/docs/netcdf-f90
+
+! $Id: simple_xy_par_rd.f90,v 1.2 2009/03/12 18:30:41 ed Exp $
+
+program simple_xy_par_rd
+  use netcdf
+  implicit none
+  include 'mpif.h'
+
+  ! This is the name of the data file we will read. 
+  character (len = *), parameter :: FILE_NAME = "simple_xy_par.nc"
+
+  ! These will tell where in the data file this processor should
+  ! write.
+  integer, parameter :: NDIMS = 2
+  integer :: start(NDIMS), count(NDIMS)
+  
+  ! We will read data into this array.
+  integer, allocatable :: data_in(:)
+
+  ! This will be the netCDF ID for the file and data variable.
+  integer :: ncid, varid
+
+  ! MPI stuff: number of processors, rank of this processor, and error
+  ! code.
+  integer :: p, my_rank, ierr
+
+  ! Loop indexes, and error handling.
+  integer :: x, y, stat
+
+  ! Initialize MPI, learn local rank and total number of processors.
+  call MPI_Init(ierr)
+  call MPI_Comm_rank(MPI_COMM_WORLD, my_rank, ierr)
+  call MPI_Comm_size(MPI_COMM_WORLD, p, ierr)
+
+  ! Allocate space to read in data.
+  allocate(data_in(p), stat = stat)
+  if (stat .ne. 0) stop 3
+
+  ! Open the file. NF90_NOWRITE tells netCDF we want read-only access to
+  ! the file.
+  call check( nf90_open(FILE_NAME, IOR(NF90_NOWRITE, NF90_MPIIO), ncid, &
+       comm = MPI_COMM_WORLD, info = MPI_INFO_NULL) )
+
+  ! Get the varid of the data variable, based on its name.
+  call check( nf90_inq_varid(ncid, "data", varid) )
+
+  ! Read the data.
+  start = (/ 1, my_rank + 1/)
+  count = (/ p, 1 /)
+  call check( nf90_get_var(ncid, varid, data_in, &
+       start = start, count = count) )
+
+  ! Check the data.
+  do x = 1, p
+     if (data_in(x) .ne. my_rank) then
+        print *, "data_in(", x, ") = ", data_in(x)
+        stop "Stopped"
+     endif
+  end do
+
+  ! Close the file, freeing all resources.
+  call check( nf90_close(ncid) )
+
+  ! Free my local memory.
+  deallocate(data_in)
+
+  ! MPI library must be shut down.
+  call MPI_Finalize(ierr)
+
+  if (my_rank .eq. 0) print *,"*** SUCCESS reading example file ", FILE_NAME, "! "
+
+contains
+  subroutine check(status)
+    integer, intent ( in) :: status
+    
+    if(status /= nf90_noerr) then 
+      print *, trim(nf90_strerror(status))
+      stop 2
+    end if
+  end subroutine check  
+end program simple_xy_par_rd
diff --git a/examples/F90/simple_xy_par_wr.f90 b/examples/F90/simple_xy_par_wr.f90
new file mode 100644
index 0000000..56b8de1
--- /dev/null
+++ b/examples/F90/simple_xy_par_wr.f90
@@ -0,0 +1,116 @@
+!     This is part of the netCDF package.
+!     Copyright 2006 University Corporation for Atmospheric Research/Unidata.
+!     See COPYRIGHT file for conditions of use.
+
+!     This is a very simple example which writes a 2D array of sample
+!     data. To handle this in netCDF we create two shared dimensions,
+!     "x" and "y", and a netCDF variable, called "data". It uses
+!     parallel I/O to write the file from all processors at the same
+!     time.
+
+!     This example demonstrates the netCDF Fortran 90 API. This is part
+!     of the netCDF tutorial, which can be found at:
+!     http://www.unidata.ucar.edu/software/netcdf/docs/netcdf-tutorial
+      
+!     Full documentation of the netCDF Fortran 90 API can be found at:
+!     http://www.unidata.ucar.edu/software/netcdf/docs/netcdf-f90
+
+!     $Id: simple_xy_par_wr.f90,v 1.3 2010/06/01 15:34:49 ed Exp $
+
+program simple_xy_par_wr
+  use netcdf
+  implicit none
+  include 'mpif.h'
+
+  ! This is the name of the data file we will create.
+  character (len = *), parameter :: FILE_NAME = "simple_xy_par.nc"
+
+  ! We are writing 2D data.
+  integer, parameter :: NDIMS = 2
+
+  ! When we create netCDF files, variables and dimensions, we get back
+  ! an ID for each one.
+  integer :: ncid, varid, dimids(NDIMS)
+  integer :: x_dimid, y_dimid
+
+  ! These will tell where in the data file this processor should
+  ! write.
+  integer :: start(NDIMS), count(NDIMS)
+  
+  ! This is the data array we will write. It will just be filled with
+  ! the rank of this processor.
+  integer, allocatable :: data_out(:)
+
+  ! MPI stuff: number of processors, rank of this processor, and error
+  ! code.
+  integer :: p, my_rank, ierr
+
+  ! Loop indexes, and error handling.
+  integer :: x, stat
+
+  ! Initialize MPI, learn local rank and total number of processors.
+  call MPI_Init(ierr)
+  call MPI_Comm_rank(MPI_COMM_WORLD, my_rank, ierr)
+  call MPI_Comm_size(MPI_COMM_WORLD, p, ierr)
+
+  ! Create some pretend data. We just need one row.
+  allocate(data_out(p), stat = stat)
+  if (stat .ne. 0) stop 3
+  do x = 1, p
+     data_out(x) = my_rank
+  end do
+
+  ! Create the netCDF file. The NF90_NETCDF4 flag causes a
+  ! HDF5/netCDF-4 file to be created. The comm and info parameters
+  ! cause parallel I/O to be enabled. Use either NF90_MPIIO or
+  ! NF90_MPIPOSIX to select between MPI/IO and MPI/POSIX.
+  call check(nf90_create(FILE_NAME, IOR(NF90_NETCDF4, NF90_MPIIO), ncid, &
+       comm = MPI_COMM_WORLD, info = MPI_INFO_NULL))
+
+  ! Define the dimensions. NetCDF will hand back an ID for
+  ! each. Metadata operations must take place on all processors.
+  call check(nf90_def_dim(ncid, "x", p, x_dimid))
+  call check(nf90_def_dim(ncid, "y", p, y_dimid))
+
+  ! The dimids array is used to pass the IDs of the dimensions of
+  ! the variables. Note that in fortran arrays are stored in
+  ! column-major format.
+  dimids = (/ y_dimid, x_dimid /)
+
+  ! Define the variable. The type of the variable in this case is
+  ! NF90_INT (4-byte integer).
+  call check(nf90_def_var(ncid, "data", NF90_INT, dimids, varid))
+
+  ! End define mode. This tells netCDF we are done defining
+  ! metadata. This operation is collective and all processors will
+  ! write their metadata to disk.
+  call check(nf90_enddef(ncid))
+
+  ! Write the pretend data to the file. Each processor writes one row.
+  start = (/ 1, my_rank + 1/)
+  count = (/ p, 1 /)
+  call check(nf90_put_var(ncid, varid, data_out, start = start, &
+       count = count))
+
+  ! Close the file. This frees up any internal netCDF resources
+  ! associated with the file, and flushes any buffers.
+  call check( nf90_close(ncid) )
+
+  ! Free my local memory.
+  deallocate(data_out)
+
+  ! MPI library must be shut down.
+  call MPI_Finalize(ierr)
+
+  if (my_rank .eq. 0) print *, "*** SUCCESS writing example file ", FILE_NAME, "! "
+
+contains
+  subroutine check(status)
+    integer, intent ( in) :: status
+    
+    if(status /= nf90_noerr) then 
+      print *, trim(nf90_strerror(status))
+      stop 2
+    end if
+  end subroutine check  
+end program simple_xy_par_wr
diff --git a/examples/F90/simple_xy_par_wr2.f90 b/examples/F90/simple_xy_par_wr2.f90
new file mode 100644
index 0000000..cf09bd9
--- /dev/null
+++ b/examples/F90/simple_xy_par_wr2.f90
@@ -0,0 +1,140 @@
+!     This is part of the netCDF package.
+!     Copyright 2006 University Corporation for Atmospheric Research/Unidata.
+!     See COPYRIGHT file for conditions of use.
+
+!     This is a very simple example which writes a 2D array of sample
+!     data. To handle this in netCDF we create two shared dimensions,
+!     "x" and "y", and a netCDF variable, called "data". It uses
+!     parallel I/O to write the file from all processors at the same
+!     time.
+
+!     This example demonstrates the netCDF Fortran 90 API. This is part
+!     of the netCDF tutorial, which can be found at:
+!     http://www.unidata.ucar.edu/software/netcdf/docs/netcdf-tutorial
+      
+!     Full documentation of the netCDF Fortran 90 API can be found at:
+!     http://www.unidata.ucar.edu/software/netcdf/docs/netcdf-f90
+
+!     $Id: simple_xy_par_wr.f90,v 1.3 2010/06/01 15:34:49 ed Exp $
+
+! Reto Stockli: added (to demonstrate parallel bug)
+! - added unlimited time dimension (3)
+! - added chunk size for unlimited variable writes
+! - use of MPI module instead of include file
+! - exclude first process from writing data (test independent write). 
+! - include first process for opening/metadata/closing file
+
+program simple_xy_par_wr
+
+  use netcdf
+  use mpi
+
+  implicit none
+ 
+  ! This is the name of the data file we will create.
+  character (len = *), parameter :: FILE_NAME = "simple_xy_par.nc"
+
+  ! We are writing 2D data.
+  integer, parameter :: NDIMS = 3
+
+  ! When we create netCDF files, variables and dimensions, we get back
+  ! an ID for each one.
+  integer :: ncid, varid, dimids(NDIMS)
+  integer :: x_dimid, y_dimid, t_dimid
+
+  ! add chunk size for unlimited variables
+  integer :: chunk_size(NDIMS)
+
+  ! These will tell where in the data file this processor should
+  ! write.
+  integer :: start(NDIMS), count(NDIMS)
+  
+  ! This is the data array we will write. It will just be filled with
+  ! the rank of this processor.
+  integer, allocatable :: data_out(:)
+
+  ! MPI stuff: number of processors, rank of this processor, and error
+  ! code.
+  integer :: p, my_rank, ierr
+
+  ! Loop indexes, and error handling.
+  integer :: x, stat
+
+  ! Initialize MPI, learn local rank and total number of processors.
+  call MPI_Init(ierr)
+  call MPI_Comm_rank(MPI_COMM_WORLD, my_rank, ierr)
+  call MPI_Comm_size(MPI_COMM_WORLD, p, ierr)
+
+  ! Create some pretend data. We just need one row.
+  allocate(data_out(p), stat = stat)
+  if (stat .ne. 0) stop 3
+  do x = 1, p
+     data_out(x) = my_rank
+  end do
+
+  ! Create the netCDF file. The NF90_NETCDF4 flag causes a
+  ! HDF5/netCDF-4 file to be created. The comm and info parameters
+  ! cause parallel I/O to be enabled. Use either NF90_MPIIO or
+  ! NF90_MPIPOSIX to select between MPI/IO and MPI/POSIX.
+  call check(nf90_create(FILE_NAME, IOR(NF90_NETCDF4, NF90_MPIIO), ncid, &
+       comm = MPI_COMM_WORLD, info = MPI_INFO_NULL))
+
+  ! Define the dimensions. NetCDF will hand back an ID for
+  ! each. Metadata operations must take place on all processors.
+  call check(nf90_def_dim(ncid, "x", p, x_dimid))
+  call check(nf90_def_dim(ncid, "y", p, y_dimid))
+  call check(nf90_def_dim(ncid, "t", NF90_UNLIMITED, t_dimid))
+
+  ! The dimids array is used to pass the IDs of the dimensions of
+  ! the variables. Note that in fortran arrays are stored in
+  ! column-major format.
+  dimids = (/ y_dimid, x_dimid, t_dimid /)
+
+  ! define the chunk size (1 along unlimited time dimension)
+  chunk_size = (/p , 1, 1 /)
+
+  ! Define the variable. The type of the variable in this case is
+  ! NF90_INT (4-byte integer).
+  call check(nf90_def_var(ncid, "data", NF90_INT, dimids, varid, chunksizes=chunk_size))
+
+  ! End define mode. This tells netCDF we are done defining
+  ! metadata. This operation is collective and all processors will
+  ! write their metadata to disk.
+  call check(nf90_enddef(ncid))
+
+  ! Write the pretend data to the file. Each processor writes one row.
+  start = (/ 1, my_rank + 1, 1/)
+  count = (/ p, 1, 1 /)
+
+  ! force independent write (does not help, however)
+  call check(nf90_var_par_access(ncid, varid, nf90_independent))
+
+  ! Do NOT write to first process (test independent writes)
+  ! this works fine if all processes take part of the write (comment out the if() statement below)
+  if (my_rank.ne.0) &
+  call check(nf90_put_var(ncid, varid, data_out, start = start, &
+       count = count))
+
+  ! Close the file. This frees up any internal netCDF resources
+  ! associated with the file, and flushes any buffers.
+  call check( nf90_close(ncid) )
+
+  ! Free my local memory.
+  deallocate(data_out)
+
+  ! MPI library must be shut down.
+  call MPI_Finalize(ierr)
+
+  if (my_rank .eq. 0) print *, "*** SUCCESS writing example file ", FILE_NAME, "! "
+
+contains
+  subroutine check(status)
+    integer, intent ( in) :: status
+    
+    if(status /= nf90_noerr) then 
+      print *, trim(nf90_strerror(status))
+      stop 2
+    end if
+  end subroutine check  
+end program simple_xy_par_wr
+
diff --git a/examples/F90/simple_xy_rd.f90 b/examples/F90/simple_xy_rd.f90
new file mode 100644
index 0000000..bf1586a
--- /dev/null
+++ b/examples/F90/simple_xy_rd.f90
@@ -0,0 +1,72 @@
+! This is part of the netCDF package.
+! Copyright 2006 University Corporation for Atmospheric Research/Unidata.
+! See COPYRIGHT file for conditions of use.
+      
+! This is a simple example which reads a small dummy array, from a
+! netCDF data file created by the companion program simple_xy_wr.f90.
+      
+! This is intended to illustrate the use of the netCDF fortran 90
+! API. This example program is part of the netCDF tutorial, which can
+! be found at:
+! http://www.unidata.ucar.edu/software/netcdf/docs/netcdf-tutorial
+      
+! Full documentation of the netCDF Fortran 90 API can be found at:
+! http://www.unidata.ucar.edu/software/netcdf/docs/netcdf-f90
+
+! $Id: simple_xy_rd.f90,v 1.11 2010/04/06 19:32:09 ed Exp $
+
+program simple_xy_rd
+  use netcdf
+  implicit none
+
+  ! This is the name of the data file we will read. 
+  character (len = *), parameter :: FILE_NAME = "simple_xy.nc"
+
+  ! We are reading 2D data, a 12 x 6 grid. 
+  integer, parameter :: NX = 6, NY = 12
+  integer, dimension(:,:), allocatable :: data_in
+
+  ! This will be the netCDF ID for the file and data variable.
+  integer :: ncid, varid
+
+  ! Loop indexes, and error handling.
+  integer :: x, y
+
+  ! Allocate memory for data.
+  allocate(data_in(NY, NX))
+
+  ! Open the file. NF90_NOWRITE tells netCDF we want read-only access to
+  ! the file.
+  call check( nf90_open(FILE_NAME, NF90_NOWRITE, ncid) )
+
+  ! Get the varid of the data variable, based on its name.
+  call check( nf90_inq_varid(ncid, "data", varid) )
+
+  ! Read the data.
+  call check( nf90_get_var(ncid, varid, data_in) )
+
+  ! Check the data.
+  do x = 1, NX
+     do y = 1, NY
+        if (data_in(y, x) /= (x - 1) * NY + (y - 1)) then
+           print *, "data_in(", y, ", ", x, ") = ", data_in(y, x)
+           stop "Stopped"
+        end if
+     end do
+  end do
+
+  ! Close the file, freeing all resources.
+  call check( nf90_close(ncid) )
+
+  print *,"*** SUCCESS reading example file ", FILE_NAME, "! "
+
+contains
+  subroutine check(status)
+    integer, intent ( in) :: status
+    
+    if(status /= nf90_noerr) then 
+      print *, trim(nf90_strerror(status))
+      stop 2
+    end if
+  end subroutine check  
+end program simple_xy_rd
diff --git a/examples/F90/simple_xy_wr.f90 b/examples/F90/simple_xy_wr.f90
new file mode 100644
index 0000000..d51c538
--- /dev/null
+++ b/examples/F90/simple_xy_wr.f90
@@ -0,0 +1,97 @@
+!     This is part of the netCDF package.
+!     Copyright 2006 University Corporation for Atmospheric Research/Unidata.
+!     See COPYRIGHT file for conditions of use.
+
+!     This is a very simple example which writes a 2D array of
+!     sample data. To handle this in netCDF we create two shared
+!     dimensions, "x" and "y", and a netCDF variable, called "data".
+
+!     This example demonstrates the netCDF Fortran 90 API. This is part
+!     of the netCDF tutorial, which can be found at:
+!     http://www.unidata.ucar.edu/software/netcdf/docs/netcdf-tutorial
+      
+!     Full documentation of the netCDF Fortran 90 API can be found at:
+!     http://www.unidata.ucar.edu/software/netcdf/docs/netcdf-f90
+
+!     $Id: simple_xy_wr.f90,v 1.11 2010/04/06 19:32:08 ed Exp $
+
+program simple_xy_wr
+  use netcdf
+  implicit none
+
+  ! This is the name of the data file we will create.
+  character (len = *), parameter :: FILE_NAME = "simple_xy.nc"
+
+  ! We are writing 2D data, a 12 x 6 grid. 
+  integer, parameter :: NDIMS = 2
+  integer, parameter :: NX = 6, NY = 12
+
+  ! When we create netCDF files, variables and dimensions, we get back
+  ! an ID for each one.
+  integer :: ncid, varid, dimids(NDIMS)
+  integer :: x_dimid, y_dimid
+  
+  ! This is the data array we will write. It will just be filled with
+  ! a progression of integers for this example.
+  integer, dimension(:,:), allocatable :: data_out
+
+  ! Loop indexes, and error handling.
+  integer :: x, y
+
+  ! Allocate memory for data.
+  allocate(data_out(NY, NX))
+
+  ! Create some pretend data. If this wasn't an example program, we
+  ! would have some real data to write, for example, model output.
+  do x = 1, NX
+     do y = 1, NY
+        data_out(y, x) = (x - 1) * NY + (y - 1)
+     end do
+  end do
+
+  ! Always check the return code of every netCDF function call. In
+  ! this example program, wrapping netCDF calls with "call check()"
+  ! makes sure that any return which is not equal to nf90_noerr (0)
+  ! will print a netCDF error message and exit.
+
+  ! Create the netCDF file. The nf90_clobber parameter tells netCDF to
+  ! overwrite this file, if it already exists.
+  call check( nf90_create(FILE_NAME, NF90_CLOBBER, ncid) )
+
+  ! Define the dimensions. NetCDF will hand back an ID for each. 
+  call check( nf90_def_dim(ncid, "x", NX, x_dimid) )
+  call check( nf90_def_dim(ncid, "y", NY, y_dimid) )
+
+  ! The dimids array is used to pass the IDs of the dimensions of
+  ! the variables. Note that in fortran arrays are stored in
+  ! column-major format.
+  dimids =  (/ y_dimid, x_dimid /)
+
+  ! Define the variable. The type of the variable in this case is
+  ! NF90_INT (4-byte integer).
+  call check( nf90_def_var(ncid, "data", NF90_INT, dimids, varid) )
+
+  ! End define mode. This tells netCDF we are done defining metadata.
+  call check( nf90_enddef(ncid) )
+
+  ! Write the pretend data to the file. Although netCDF supports
+  ! reading and writing subsets of data, in this case we write all the
+  ! data in one operation.
+  call check( nf90_put_var(ncid, varid, data_out) )
+
+  ! Close the file. This frees up any internal netCDF resources
+  ! associated with the file, and flushes any buffers.
+  call check( nf90_close(ncid) )
+
+  print *, "*** SUCCESS writing example file simple_xy.nc! "
+
+contains
+  subroutine check(status)
+    integer, intent ( in) :: status
+    
+    if(status /= nf90_noerr) then 
+      print *, trim(nf90_strerror(status))
+      stop 2
+    end if
+  end subroutine check  
+end program simple_xy_wr
diff --git a/examples/Makefile.am b/examples/Makefile.am
new file mode 100644
index 0000000..e35bec7
--- /dev/null
+++ b/examples/Makefile.am
@@ -0,0 +1,7 @@
+## This is a automake file, part of Unidata's netCDF package.
+# Copyright 2011, see the COPYRIGHT file for more information.
+
+# These are the subdirectories that will be built.
+SUBDIRS = F77 F90
+
+EXTRA_DIST = CMakeLists.txt
diff --git a/examples/Makefile.in b/examples/Makefile.in
new file mode 100644
index 0000000..8bbd631
--- /dev/null
+++ b/examples/Makefile.in
@@ -0,0 +1,635 @@
+# Makefile.in generated by automake 1.14.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2013 Free Software Foundation, Inc.
+
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+ at SET_MAKE@
+
+# Copyright 2011, see the COPYRIGHT file for more information.
+VPATH = @srcdir@
+am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
+am__make_running_with_option = \
+  case $${target_option-} in \
+      ?) ;; \
+      *) echo "am__make_running_with_option: internal error: invalid" \
+              "target option '$${target_option-}' specified" >&2; \
+         exit 1;; \
+  esac; \
+  has_opt=no; \
+  sane_makeflags=$$MAKEFLAGS; \
+  if $(am__is_gnu_make); then \
+    sane_makeflags=$$MFLAGS; \
+  else \
+    case $$MAKEFLAGS in \
+      *\\[\ \	]*) \
+        bs=\\; \
+        sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+          | sed "s/$$bs$$bs[$$bs $$bs	]*//g"`;; \
+    esac; \
+  fi; \
+  skip_next=no; \
+  strip_trailopt () \
+  { \
+    flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+  }; \
+  for flg in $$sane_makeflags; do \
+    test $$skip_next = yes && { skip_next=no; continue; }; \
+    case $$flg in \
+      *=*|--*) continue;; \
+        -*I) strip_trailopt 'I'; skip_next=yes;; \
+      -*I?*) strip_trailopt 'I';; \
+        -*O) strip_trailopt 'O'; skip_next=yes;; \
+      -*O?*) strip_trailopt 'O';; \
+        -*l) strip_trailopt 'l'; skip_next=yes;; \
+      -*l?*) strip_trailopt 'l';; \
+      -[dEDm]) skip_next=yes;; \
+      -[JT]) skip_next=yes;; \
+    esac; \
+    case $$flg in \
+      *$$target_option*) has_opt=yes; break;; \
+    esac; \
+  done; \
+  test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+target_triplet = @target@
+subdir = examples
+DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \
+	$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+	$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+	$(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/config.h \
+	$(top_builddir)/libsrc/nfconfig1.inc
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+AM_V_P = $(am__v_P_ at AM_V@)
+am__v_P_ = $(am__v_P_ at AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_ at AM_V@)
+am__v_GEN_ = $(am__v_GEN_ at AM_DEFAULT_V@)
+am__v_GEN_0 = @echo "  GEN     " $@;
+am__v_GEN_1 = 
+AM_V_at = $(am__v_at_ at AM_V@)
+am__v_at_ = $(am__v_at_ at AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 = 
+SOURCES =
+DIST_SOURCES =
+RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \
+	ctags-recursive dvi-recursive html-recursive info-recursive \
+	install-data-recursive install-dvi-recursive \
+	install-exec-recursive install-html-recursive \
+	install-info-recursive install-pdf-recursive \
+	install-ps-recursive install-recursive installcheck-recursive \
+	installdirs-recursive pdf-recursive ps-recursive \
+	tags-recursive uninstall-recursive
+am__can_run_installinfo = \
+  case $$AM_UPDATE_INFO_DIR in \
+    n|no|NO) false;; \
+    *) (install-info --version) >/dev/null 2>&1;; \
+  esac
+RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive	\
+  distclean-recursive maintainer-clean-recursive
+am__recursive_targets = \
+  $(RECURSIVE_TARGETS) \
+  $(RECURSIVE_CLEAN_TARGETS) \
+  $(am__extra_recursive_targets)
+AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \
+	distdir
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates.  Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+  BEGIN { nonempty = 0; } \
+  { items[$$0] = 1; nonempty = 1; } \
+  END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique.  This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+  list='$(am__tagged_files)'; \
+  unique=`for i in $$list; do \
+    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+  done | $(am__uniquify_input)`
+ETAGS = etags
+CTAGS = ctags
+DIST_SUBDIRS = $(SUBDIRS)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+am__relativize = \
+  dir0=`pwd`; \
+  sed_first='s,^\([^/]*\)/.*$$,\1,'; \
+  sed_rest='s,^[^/]*/*,,'; \
+  sed_last='s,^.*/\([^/]*\)$$,\1,'; \
+  sed_butlast='s,/*[^/]*$$,,'; \
+  while test -n "$$dir1"; do \
+    first=`echo "$$dir1" | sed -e "$$sed_first"`; \
+    if test "$$first" != "."; then \
+      if test "$$first" = ".."; then \
+        dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \
+        dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \
+      else \
+        first2=`echo "$$dir2" | sed -e "$$sed_first"`; \
+        if test "$$first2" = "$$first"; then \
+          dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \
+        else \
+          dir2="../$$dir2"; \
+        fi; \
+        dir0="$$dir0"/"$$first"; \
+      fi; \
+    fi; \
+    dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \
+  done; \
+  reldir="$$dir2"
+ACLOCAL = @ACLOCAL@
+ALLOCA = @ALLOCA@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BUILD_INTERNAL_DOCS = @BUILD_INTERNAL_DOCS@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+DOT = @DOT@
+DOXYGEN = @DOXYGEN@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+F77 = @F77@
+FC = @FC@
+FCFLAGS = @FCFLAGS@
+FCFLAGS_f90 = @FCFLAGS_f90@
+FFLAGS = @FFLAGS@
+FGREP = @FGREP@
+GREP = @GREP@
+HAS_DAP = @HAS_DAP@
+HAS_F03 = @HAS_F03@
+HAS_F90 = @HAS_F90@
+HAS_NC2 = @HAS_NC2@
+HAS_NC4 = @HAS_NC4@
+HAVE_DOT = @HAVE_DOT@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MKDIR_P = @MKDIR_P@
+MOD_FLAG = @MOD_FLAG@
+NC_FLIBS = @NC_FLIBS@
+NC_LIBS = @NC_LIBS@
+NM = @NM@
+NMEDIT = @NMEDIT@
+NMFLAGS = @NMFLAGS@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+VERSION = @VERSION@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+ac_ct_F77 = @ac_ct_F77@
+ac_ct_FC = @ac_ct_FC@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target = @target@
+target_alias = @target_alias@
+target_cpu = @target_cpu@
+target_os = @target_os@
+target_vendor = @target_vendor@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+
+# These are the subdirectories that will be built.
+SUBDIRS = F77 F90
+EXTRA_DIST = CMakeLists.txt
+all: all-recursive
+
+.SUFFIXES:
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign examples/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign examples/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+
+mostlyclean-libtool:
+	-rm -f *.lo
+
+clean-libtool:
+	-rm -rf .libs _libs
+
+# This directory's subdirectories are mostly independent; you can cd
+# into them and run 'make' without going through this Makefile.
+# To change the values of 'make' variables: instead of editing Makefiles,
+# (1) if the variable is set in 'config.status', edit 'config.status'
+#     (which will cause the Makefiles to be regenerated when you run 'make');
+# (2) otherwise, pass the desired values on the 'make' command line.
+$(am__recursive_targets):
+	@fail=; \
+	if $(am__make_keepgoing); then \
+	  failcom='fail=yes'; \
+	else \
+	  failcom='exit 1'; \
+	fi; \
+	dot_seen=no; \
+	target=`echo $@ | sed s/-recursive//`; \
+	case "$@" in \
+	  distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
+	  *) list='$(SUBDIRS)' ;; \
+	esac; \
+	for subdir in $$list; do \
+	  echo "Making $$target in $$subdir"; \
+	  if test "$$subdir" = "."; then \
+	    dot_seen=yes; \
+	    local_target="$$target-am"; \
+	  else \
+	    local_target="$$target"; \
+	  fi; \
+	  ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+	  || eval $$failcom; \
+	done; \
+	if test "$$dot_seen" = "no"; then \
+	  $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
+	fi; test -z "$$fail"
+
+ID: $(am__tagged_files)
+	$(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-recursive
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+	set x; \
+	here=`pwd`; \
+	if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
+	  include_option=--etags-include; \
+	  empty_fix=.; \
+	else \
+	  include_option=--include; \
+	  empty_fix=; \
+	fi; \
+	list='$(SUBDIRS)'; for subdir in $$list; do \
+	  if test "$$subdir" = .; then :; else \
+	    test ! -f $$subdir/TAGS || \
+	      set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \
+	  fi; \
+	done; \
+	$(am__define_uniq_tagged_files); \
+	shift; \
+	if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+	  test -n "$$unique" || unique=$$empty_fix; \
+	  if test $$# -gt 0; then \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      "$$@" $$unique; \
+	  else \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      $$unique; \
+	  fi; \
+	fi
+ctags: ctags-recursive
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+	$(am__define_uniq_tagged_files); \
+	test -z "$(CTAGS_ARGS)$$unique" \
+	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+	     $$unique
+
+GTAGS:
+	here=`$(am__cd) $(top_builddir) && pwd` \
+	  && $(am__cd) $(top_srcdir) \
+	  && gtags -i $(GTAGS_ARGS) "$$here"
+cscopelist: cscopelist-recursive
+
+cscopelist-am: $(am__tagged_files)
+	list='$(am__tagged_files)'; \
+	case "$(srcdir)" in \
+	  [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+	  *) sdir=$(subdir)/$(srcdir) ;; \
+	esac; \
+	for i in $$list; do \
+	  if test -f "$$i"; then \
+	    echo "$(subdir)/$$i"; \
+	  else \
+	    echo "$$sdir/$$i"; \
+	  fi; \
+	done >> $(top_builddir)/cscope.files
+
+distclean-tags:
+	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+	  else \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
+	    || exit 1; \
+	  fi; \
+	done
+	@list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
+	  if test "$$subdir" = .; then :; else \
+	    $(am__make_dryrun) \
+	      || test -d "$(distdir)/$$subdir" \
+	      || $(MKDIR_P) "$(distdir)/$$subdir" \
+	      || exit 1; \
+	    dir1=$$subdir; dir2="$(distdir)/$$subdir"; \
+	    $(am__relativize); \
+	    new_distdir=$$reldir; \
+	    dir1=$$subdir; dir2="$(top_distdir)"; \
+	    $(am__relativize); \
+	    new_top_distdir=$$reldir; \
+	    echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \
+	    echo "     am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \
+	    ($(am__cd) $$subdir && \
+	      $(MAKE) $(AM_MAKEFLAGS) \
+	        top_distdir="$$new_top_distdir" \
+	        distdir="$$new_distdir" \
+		am__remove_distdir=: \
+		am__skip_length_check=: \
+		am__skip_mode_fix=: \
+	        distdir) \
+	      || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+check: check-recursive
+all-am: Makefile
+installdirs: installdirs-recursive
+installdirs-am:
+install: install-recursive
+install-exec: install-exec-recursive
+install-data: install-data-recursive
+uninstall: uninstall-recursive
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-recursive
+install-strip:
+	if test -z '$(STRIP)'; then \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	      install; \
+	else \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	    "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+	fi
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-recursive
+
+clean-am: clean-generic clean-libtool mostlyclean-am
+
+distclean: distclean-recursive
+	-rm -f Makefile
+distclean-am: clean-am distclean-generic distclean-tags
+
+dvi: dvi-recursive
+
+dvi-am:
+
+html: html-recursive
+
+html-am:
+
+info: info-recursive
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-recursive
+
+install-dvi-am:
+
+install-exec-am:
+
+install-html: install-html-recursive
+
+install-html-am:
+
+install-info: install-info-recursive
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-recursive
+
+install-pdf-am:
+
+install-ps: install-ps-recursive
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-recursive
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-recursive
+
+mostlyclean-am: mostlyclean-generic mostlyclean-libtool
+
+pdf: pdf-recursive
+
+pdf-am:
+
+ps: ps-recursive
+
+ps-am:
+
+uninstall-am:
+
+.MAKE: $(am__recursive_targets) install-am install-strip
+
+.PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \
+	check-am clean clean-generic clean-libtool cscopelist-am ctags \
+	ctags-am distclean distclean-generic distclean-libtool \
+	distclean-tags distdir dvi dvi-am html html-am info info-am \
+	install install-am install-data install-data-am install-dvi \
+	install-dvi-am install-exec install-exec-am install-html \
+	install-html-am install-info install-info-am install-man \
+	install-pdf install-pdf-am install-ps install-ps-am \
+	install-strip installcheck installcheck-am installdirs \
+	installdirs-am maintainer-clean maintainer-clean-generic \
+	mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \
+	ps ps-am tags tags-am uninstall uninstall-am
+
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/fortran/CMakeLists.txt b/fortran/CMakeLists.txt
new file mode 100644
index 0000000..aa6a381
--- /dev/null
+++ b/fortran/CMakeLists.txt
@@ -0,0 +1,180 @@
+CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
+
+SET(CMAKE_VERBOSE_MAKEFILE ON)
+SET(CMAKE_BUILD_TYPE "RelWithDebInfo")
+SET(CMAKE_INCLUDE_CURRENT_DIR ON)
+
+INCLUDE_DIRECTORIES("." "${NC4F_BINARY_DIR}/libsrc")
+
+SET(netcdff_SOURCES
+  typeSizes.f90 module_netcdf_nc_data.F90 module_netcdf_nc_interfaces.f90
+  module_netcdf_nf_data.F90 module_netcdf_nf_interfaces.F90
+  module_netcdf_f03.f90
+  nf_attio.F90 nf_control.F90 nf_dim.f90 nf_misc.f90
+  nf_genatt.f90 nf_geninq.f90 nf_genvar.f90
+  nf_vario.F90 nf_var1io.F90 nf_varaio.F90
+  nf_varmio.F90 nf_varsio.F90
+)
+
+IF (USE_NETCDF4)
+  SET(netcdff_SOURCES ${netcdff_SOURCES}
+    module_netcdf4_nc_interfaces.f90
+    module_netcdf4_nf_interfaces.F90 module_netcdf4_f03.f90
+    nf_lib.c nf_nc4.f90
+    )
+ENDIF(USE_NETCDF4)
+
+IF (${USE_LOGGING})
+  SET(netcdff_SOURCES ${netcdff_SOURCES}
+    nf_logging.F90
+    )
+ENDIF(${USE_LOGGING})
+
+# SET(netcdff_DEPENDENCIES
+#   netcdf_attributes.f90 netcdf_constants.f90 netcdf_dims.f90
+#   netcdf_expanded.f90 netcdf_externals.f90 netcdf_file.f90
+#   netcdf_overloads.f90 netcdf_text_variables.f90 netcdf_variables.f90
+#   netcdf_visibility.f90 netcdf_eightbyte.f90
+#   )
+
+IF (${USE_NETCDF4})
+  SET(netcdff_SOURCES ${netcdff_SOURCES}
+    netcdf4.f90
+    )
+  # SET(netcdff_DEPENDENCIES ${netcdff_DEPENDENCIES}
+  #   netcdf4_func.f90 netcdf4_externals.f90 netcdf4_visibility.f90
+  #   netcdf4.f90 netcdf4_eightbyte.f90
+  #   netcdf4_variables.f90 netcdf4_file.f90
+  #   )
+ELSE ()
+  SET(netcdff_SOURCES ${netcdff_SOURCES}
+    netcdf.f90 netcdf3_file.f90
+    )
+ENDIF(${USE_NETCDF4})
+
+if (${BUILD_V2})
+  SET(netcdff_SOURCES ${netcdff_SOURCES}
+    nf_v2compat.c module_netcdf_fortv2_c_interfaces.f90 nf_fortv2.f90
+    )
+endif (${BUILD_V2})
+
+if (${BUILD_F03})
+  SET(LCHEADERS
+    netcdf_nc_data.mod netcdf_nc_interfaces.mod netcdf_nf_data.mod
+    netcdf_nf_interfaces.mod netcdf_f03.mod
+    )
+  if (${BUILD_V2})
+    SET(LCHEADERS ${LCHEADERS}
+      netcdf_fortv2_c_interfaces.mod
+      )
+  endif (${BUILD_V2})
+  if (${USE_NETCDF4})
+    SET(LCHEADERS ${LCHEADERS}
+      netcdf4_nc_interfaces.mod netcdf4_nf_interfaces.mod netcdf4_f03.mod
+      )
+  endif (${USE_NETCDF4})
+endif (${BUILD_F03})
+
+# These are always used
+SET(LCCOMMON typesizes.mod netcdf.mod)
+SET(COMMONHEADERS ${LCHEADERS} ${LCCOMMON})
+
+# SET(netcdff_DEPENDENCIES ${netcdff_DEPENDENCIES} ${COMMONHEADERS} )
+SET(BUILT_SOURCES ${LCHEADERS} ${LCCOMMON})
+
+# A macro for appending file2 to file1
+MACRO(APPENDFILE file1 file2)
+  file(READ ${file2} file2_bytes)
+  file(APPEND ${file1} ${file2_bytes})
+ENDMACRO(APPENDFILE file1 file2)
+
+SET(NETCDF_INC ${CMAKE_CURRENT_BINARY_DIR}/netcdf.inc)
+SET_DIRECTORY_PROPERTIES (PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES ${NETCDF_INC})
+if (EXISTS ${NETCDF_INC})
+  FILE (REMOVE ${NETCDF_INC})
+endif ()
+
+# Build netcdf.inc file from selected netcdf2, netcdf3 and netcdf4 apis
+file(APPEND ${NETCDF_INC} "!     NetCDF-3.")
+APPENDFILE(${NETCDF_INC} "netcdf3.inc")
+
+if (${USE_NETCDF4})
+  file(APPEND ${NETCDF_INC} "\n")
+  file(APPEND ${NETCDF_INC} "!     NetCDF-4.")
+  APPENDFILE(${NETCDF_INC} "netcdf4.inc")
+endif (${USE_NETCDF4})
+
+if (${BUILD_V2})
+  file(APPEND ${NETCDF_INC} "\n")
+  file(APPEND ${NETCDF_INC} "!     NetCDF-2.")
+  APPENDFILE(${NETCDF_INC} "netcdf2.inc")
+endif (${BUILD_V2})
+
+if (${USE_LOGGING})
+  file(APPEND ${NETCDF_INC} "\n")
+  file(APPEND ${NETCDF_INC} "!     This is to turn on netCDF internal logging.")
+  file(APPEND ${NETCDF_INC} "      integer nf_set_log_level")
+  file(APPEND ${NETCDF_INC} "      external nf_set_log_level")
+endif (${USE_LOGGING})
+
+SET(BUILT_SOURCES ${BUILT_SOURCES} netcdf.inc)
+
+include_directories(${CMAKE_SOURCE_DIR} ${CMAKE_SOURCE_DIR}/libsrc)
+
+# Default to shared libs on
+OPTION(BUILD_SHARED_LIBS "Configure netCDF as a shared library." ON)
+SET (LIB_TYPE STATIC)
+IF (BUILD_SHARED_LIBS)
+  SET(LIB_TYPE SHARED)
+  IF(CMAKE_COMPILER_IS_GNUCC)
+    SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fPIC")
+  ENDIF()
+ENDIF()
+
+# This is what we are building: a convenience library of Fortran 2003 functions.
+# This just builds SHARED, even though STATIC is also specified
+# ADD_LIBRARY(netcdff STATIC SHARED ${netcdff_SOURCES})
+# Builds only static, not shared
+ADD_LIBRARY(netcdff ${netcdff_SOURCES})
+TARGET_LINK_LIBRARIES(netcdff ${NETCDF_C_LIBRARY})
+TARGET_LINK_LIBRARIES(netcdff ${EXTRA_DEPS})
+SET_TARGET_PROPERTIES(netcdff PROPERTIES
+                      VERSION ${NC4F_LIB_VERSION}
+                      SOVERSION ${NC4F_SO_VERSION}
+                      )
+
+##
+# Configuration for post-install RPath
+# Adapted from http://www.cmake.org/Wiki/CMake_RPATH_handling
+##
+IF(NOT MSVC)
+  # use, i.e. don't skip the full RPATH for the build tree
+  SET(CMAKE_SKIP_BUILD_RPATH  FALSE)
+
+  # when building, don't use the install RPATH already
+  # (but later on when installing)
+  SET(CMAKE_BUILD_WITH_INSTALL_RPATH FALSE)
+
+  SET(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib")
+
+  # add the automatically determined parts of the RPATH
+  # which point to directories outside the build tree to the install RPATH
+  SET(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
+
+  # the RPATH to be used when installing, but only if it's not a system directory
+  LIST(FIND CMAKE_PLATFORM_IMPLICIT_LINK_DIRECTORIES "${CMAKE_INSTALL_PREFIX}/lib" isSystemDir)
+  IF("${isSystemDir}" STREQUAL "-1")
+    SET(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib")
+  ENDIF("${isSystemDir}" STREQUAL "-1")
+ENDIF()
+
+# Installation of the program
+INSTALL(TARGETS netcdff
+    RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}" COMPONENT bin
+    LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}" COMPONENT shlib
+    ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}" COMPONENT shlib
+    )
+INSTALL(DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/
+        DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}"
+        FILES_MATCHING PATTERN "*.mod" PATTERN "netcdf.inc"
+        )
diff --git a/fortran/Makefile.am b/fortran/Makefile.am
new file mode 100644
index 0000000..8e6525d
--- /dev/null
+++ b/fortran/Makefile.am
@@ -0,0 +1,233 @@
+## This is an automake file, part of Unidata's netCDF package.
+# Copyright 2005-2006, see the COPYRIGHT file for more information.
+
+# This file controls the building of the fortran 90 API. All testing
+# of the F90 API is done in the nf_test directory.
+
+# Remember BUILD_F90 <=> !BUILD_F03
+
+AM_LDFLAGS =
+
+BUILT_SOURCES =
+libnetcdff_la_SOURCES =
+libnetcdff_la_DEPENDENCIES =
+EXTRA_DIST =
+CLEANFILES =
+DISTCLEANFILES =
+
+libnetcdff_la_LDFLAGS = $(AM_LDFLAGS) -version-number 6:0:1
+
+# This, plus either netcdf4.f90 or netcdf.f90, is the main source.
+libnetcdff_la_SOURCES += typeSizes.f90
+
+if USE_NETCDF4
+NETCDF_O = netcdf4.o
+else
+NETCDF_O = netcdf.o
+endif
+
+# Add dependencies for source files included in "meta" source files, so the
+#       meta source is rebuilt properly when an included file is modified.
+netcdf.$(OBJEXT): netcdf_constants.f90 netcdf_externals.f90 netcdf_overloads.f90 \
+        netcdf_visibility.f90 netcdf_file.f90 netcdf3_file.f90 netcdf_dims.f90 \
+        netcdf_attributes.f90 netcdf_variables.f90 netcdf_text_variables.f90 \
+        netcdf_expanded.f90 netcdf_eightbyte.f90
+netcdf4.$(OBJEXT): netcdf_constants.f90 netcdf_externals.f90 netcdf4_externals.f90 \
+        netcdf_overloads.f90 netcdf_visibility.f90 netcdf4_visibility.f90 \
+        netcdf_file.f90 netcdf4_file.f90 netcdf_dims.f90 netcdf_attributes.f90 \
+        netcdf4_variables.f90 netcdf_text_variables.f90 netcdf_expanded.f90 \
+        netcdf4_eightbyte.f90 netcdf4_func.f90 netcdf4_overloads.f90
+
+if !BUILD_F03
+libnetcdff_la_LIBADD = ${top_builddir}/libsrc/libnetcdfc.la
+endif
+
+#if BUILD_F03
+libnetcdff_la_SOURCES += module_netcdf_nc_data.F90 module_netcdf_nc_interfaces.f90 \
+                         module_netcdf_nf_data.F90 module_netcdf_nf_interfaces.F90 \
+                         module_netcdf_f03.f90 \
+			 nf_attio.F90 nf_control.F90 nf_dim.f90 nf_misc.f90 \
+                         nf_genatt.f90 nf_geninq.f90 nf_genvar.f90 \
+                         nf_vario.F90 nf_var1io.F90 nf_varaio.F90 \
+                         nf_varmio.F90 nf_varsio.F90
+
+if USE_NETCDF4
+# Use netcdf4.f90 to build the library.
+libnetcdff_la_SOURCES += module_netcdf4_nc_interfaces.f90 \
+                         module_netcdf4_nf_interfaces.F90 module_netcdf4_f03.f90 \
+                         nf_lib.c nf_nc4.f90
+endif USE_NETCDF4
+
+if USE_LOGGING
+# add nf_logging to build
+libnetcdff_la_SOURCES += nf_logging.F90
+endif USE_LOGGING
+
+#else !BUILD_F03
+
+# The file netcdf.f90 includes all of these.
+libnetcdff_la_DEPENDENCIES += netcdf_attributes.f90 netcdf_constants.f90 netcdf_dims.f90 \
+                              netcdf_expanded.f90 netcdf_externals.f90 netcdf_file.f90 \
+                              netcdf_overloads.f90 netcdf_text_variables.f90 netcdf_variables.f90 \
+                              netcdf_visibility.f90 netcdf_eightbyte.f90
+
+if USE_NETCDF4
+libnetcdff_la_SOURCES += netcdf4.f90
+# These are the extra netCDF-4 F90 source files.
+libnetcdff_la_DEPENDENCIES += netcdf4_func.f90 netcdf4_externals.f90 netcdf4_visibility.f90 \
+                              netcdf4.f90 netcdf4_eightbyte.f90 \
+                              netcdf4_variables.f90 netcdf4_file.f90 \
+                              netcdf4_overloads.f90
+else !USE_NETCDF4
+libnetcdff_la_SOURCES += netcdf.f90 netcdf3_file.f90
+endif !USE_NETCDF4
+
+#endif !BUILD_F03
+
+if BUILD_V2
+libnetcdff_la_SOURCES += nf_v2compat.c module_netcdf_fortv2_c_interfaces.f90 nf_fortv2.f90
+endif
+
+# Tell make to rebuld fortran library if netcdf.inc has changed
+libnetcdff_la_DEPENDENCIES += netcdf.inc
+
+# All of the _DEPENDENCIES must also be in EXTRA_DIST
+EXTRA_DIST += netcdf_attributes.f90 netcdf_constants.f90 netcdf_dims.f90 \
+        netcdf_expanded.f90 netcdf_externals.f90 netcdf_file.f90 \
+        netcdf_overloads.f90 netcdf_text_variables.f90 netcdf_variables.f90 \
+        netcdf_visibility.f90 netcdf_eightbyte.f90 \
+        netcdf4_func.f90 netcdf4_externals.f90 netcdf4_visibility.f90 \
+        netcdf4.f90 netcdf4_eightbyte.f90 netcdf4_overloads.f90 \
+        netcdf4_variables.f90 netcdf4_file.f90 netcdf.inc CMakeLists.txt
+
+# Some fortran compilers change the file names of .mod files to all
+# uppercase. Just to be special.
+
+LCHEADERS =
+UCHEADERS =
+
+if BUILD_F03
+LCHEADERS += netcdf_nc_data.mod netcdf_nc_interfaces.mod netcdf_nf_data.mod \
+                   netcdf_nf_interfaces.mod netcdf_f03.mod
+UCHEADERS += NETCDF_NC_DATA.mod NETCDF_NC_INTERFACES.mod NETCDF_NF_DATA.mod \
+                   NETCDF_NF_INTERFACES.mod NETCDF_F03.mod
+if BUILD_V2
+LCHEADERS += netcdf_fortv2_c_interfaces.mod
+UCHEADERS += NETCDF_FORTV2_C_INTERFACES.mod
+endif BUILD_V2
+
+if USE_NETCDF4
+LCHEADERS += netcdf4_nc_interfaces.mod netcdf4_nf_interfaces.mod netcdf4_f03.mod
+UCHEADERS += NETCDF4_NC_INTERFACES.mod NETCDF4_NF_INTERFACES.mod NETCDF4_F03.mod
+endif USE_NETCDF4
+
+endif BUILD_F03
+
+
+# Must be consistent with previous list of uppercase headers
+# Always construct the upper case modules (may be unused)
+if BUILD_F03
+
+#if UPPER_CASE_MOD
+#NETCDF_NC_DATA.mod: module_netcdf_nc_data.o
+#NETCDF_NC_INTERFACES.mod: module_netcdf_nc_interfaces.o
+#NETCDF_NF_DATA.mod: module_netcdf_nf_data.o
+#NETCDF_NF_INTERFACES.mod: module_netcdf_nf_interfaces.o
+#NETCDF_F03.mod: module_netcdf_f03.o
+#if BUILD_V2
+#NETCDF_FORTV2_C_INTERFACES.mod: module_netcdf_fortv2_c_interfaces.o
+#endif BUILD_V2
+#else !UPPER_CASE_MOD
+netcdf_nc_data.mod: module_netcdf_nc_data.o
+netcdf_nc_interfaces.mod: module_netcdf_nc_interfaces.o
+netcdf_nf_data.mod: module_netcdf_nf_data.o
+netcdf_nf_interfaces.mod: module_netcdf_nf_interfaces.o
+netcdf_f03.mod: module_netcdf_f03.o
+if BUILD_V2
+netcdf_fortv2_c_interfaces.mod: module_netcdf_fortv2_c_interfaces.o
+endif BUILD_V2
+#endif !UPPER_CASE_MOD
+
+if USE_NETCDF4
+netcdf4_nc_interfaces.mod: module_netcdf4_nc_interfaces.o
+netcdf4_nf_interfaces.mod: module_netcdf4_nf_interfaces.o
+netcdf4_f03.mod: module_netcdf4_f03.o
+endif USE_NETCDF4
+
+endif BUILD_F03
+
+if UPPER_CASE_MOD
+$(UCHEADERS): $(LCHEADERS)
+	for lc in $(LCHEADERS) ; do \
+	uc="$${lc%%.mod}" ; \
+	uc=`echo $$uc | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'`; \
+        uc="$${uc}.mod" ; rm -f $$uc ; cp $$lc $$uc ; \
+	done
+endif UPPER_CASE_MOD
+
+# These are always used
+if UPPER_CASE_MOD
+UCCOMMON = TYPESIZES.mod NETCDF.mod
+NETCDF.mod: $(NETCDF_O)
+TYPESIZES.mod: typeSizes.o
+else !UPPER_CASE_MOD
+LCCOMMON = typesizes.mod netcdf.mod
+netcdf.mod: $(NETCDF_O)
+typesizes.mod: typeSizes.o
+endif !UPPER_CASE_MOD
+
+if UPPER_CASE_MOD
+COMMONHEADERS = $(UCHEADERS) $(UCCOMMON)
+BUILT_SOURCES += $(UCHEADERS) $(UCCOMMON) $(LCHEADERS) $(LCCOMMON)
+else !UPPER_CASE_MOD
+COMMONHEADERS = $(LCHEADERS) $(LCCOMMON)
+BUILT_SOURCES += $(LCHEADERS) $(LCCOMMON)
+endif !UPPER_CASE_MOD
+
+nodist_include_HEADERS = $(COMMONHEADERS)
+libnetcdff_la_DEPENDENCIES += $(COMMONHEADERS)
+
+# This is what we are building: a convenience library of Fortran 2003 functions.
+lib_LTLIBRARIES = libnetcdff.la
+
+nodist_include_HEADERS += netcdf.inc
+
+BUILT_SOURCES += netcdf.inc
+
+# Build netcdf.inc file from netcdf2, netcdf3 and netcdf4 files
+
+netcdf.inc: $(top_srcdir)/fortran/netcdf2.inc $(top_srcdir)/fortran/netcdf3.inc $(top_srcdir)/fortran/netcdf4.inc
+	echo '!     NetCDF-3.' > netcdf.inc
+	cat $(top_srcdir)/fortran/netcdf3.inc >> netcdf.inc
+if USE_NETCDF4
+	echo >> netcdf.inc
+	echo '!     NetCDF-4.' >> netcdf.inc
+	cat $(top_srcdir)/fortran/netcdf4.inc >> netcdf.inc
+endif
+if BUILD_V2
+	echo >> netcdf.inc
+	echo '!     NetCDF-2.' >> netcdf.inc
+	cat $(top_srcdir)/fortran/netcdf2.inc >> netcdf.inc
+endif
+if USE_LOGGING
+	echo >> netcdf.inc
+	echo '!     This is to turn on netCDF internal logging.' >> netcdf.inc
+	echo '      integer nf_set_log_level' >> netcdf.inc
+	echo '      external nf_set_log_level' >> netcdf.inc
+endif
+
+# The nfconfig.in file is turned into nfconfig.inc by the configure
+# script. The man page is generated on the developers machine for the dist
+EXTRA_DIST += netcdf.inc netcdf2.inc netcdf3.inc netcdf4.inc
+
+DISTCLEANFILES += nfconfig1.inc nfconfig.inc netcdf.inc
+
+CLEANFILES += netcdf_nc_data.mod netcdf_nc_interfaces.mod netcdf_nf_data.mod \
+              netcdf_nf_interfaces.mod netcdf_fortv2_c_interfaces.mod \
+              netcdf_f03.mod netcdf4_nc_interfaces.mod \
+              netcdf4_nf_interfaces.mod netcdf4_f03.mod
+
+CLEANFILES += $(UCHEADERS) $(UCCOMMON) $(LCHEADERS) $(LCCOMMON)
+
+# Turn off parallel builds in this directory.
+.NOTPARALLEL:
diff --git a/fortran/Makefile.in b/fortran/Makefile.in
new file mode 100644
index 0000000..1ceab9f
--- /dev/null
+++ b/fortran/Makefile.in
@@ -0,0 +1,930 @@
+# Makefile.in generated by automake 1.14.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2013 Free Software Foundation, Inc.
+
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+ at SET_MAKE@
+
+# Copyright 2005-2006, see the COPYRIGHT file for more information.
+
+# This file controls the building of the fortran 90 API. All testing
+# of the F90 API is done in the nf_test directory.
+
+# Remember BUILD_F90 <=> !BUILD_F03
+
+
+VPATH = @srcdir@
+am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
+am__make_running_with_option = \
+  case $${target_option-} in \
+      ?) ;; \
+      *) echo "am__make_running_with_option: internal error: invalid" \
+              "target option '$${target_option-}' specified" >&2; \
+         exit 1;; \
+  esac; \
+  has_opt=no; \
+  sane_makeflags=$$MAKEFLAGS; \
+  if $(am__is_gnu_make); then \
+    sane_makeflags=$$MFLAGS; \
+  else \
+    case $$MAKEFLAGS in \
+      *\\[\ \	]*) \
+        bs=\\; \
+        sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+          | sed "s/$$bs$$bs[$$bs $$bs	]*//g"`;; \
+    esac; \
+  fi; \
+  skip_next=no; \
+  strip_trailopt () \
+  { \
+    flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+  }; \
+  for flg in $$sane_makeflags; do \
+    test $$skip_next = yes && { skip_next=no; continue; }; \
+    case $$flg in \
+      *=*|--*) continue;; \
+        -*I) strip_trailopt 'I'; skip_next=yes;; \
+      -*I?*) strip_trailopt 'I';; \
+        -*O) strip_trailopt 'O'; skip_next=yes;; \
+      -*O?*) strip_trailopt 'O';; \
+        -*l) strip_trailopt 'l'; skip_next=yes;; \
+      -*l?*) strip_trailopt 'l';; \
+      -[dEDm]) skip_next=yes;; \
+      -[JT]) skip_next=yes;; \
+    esac; \
+    case $$flg in \
+      *$$target_option*) has_opt=yes; break;; \
+    esac; \
+  done; \
+  test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+target_triplet = @target@
+
+# Use netcdf4.f90 to build the library.
+ at USE_NETCDF4_TRUE@am__append_1 = module_netcdf4_nc_interfaces.f90 \
+ at USE_NETCDF4_TRUE@                         module_netcdf4_nf_interfaces.F90 module_netcdf4_f03.f90 \
+ at USE_NETCDF4_TRUE@                         nf_lib.c nf_nc4.f90
+
+
+# add nf_logging to build
+ at USE_LOGGING_TRUE@am__append_2 = nf_logging.F90
+ at USE_NETCDF4_TRUE@am__append_3 = netcdf4.f90
+# These are the extra netCDF-4 F90 source files.
+ at USE_NETCDF4_TRUE@am__append_4 = netcdf4_func.f90 netcdf4_externals.f90 netcdf4_visibility.f90 \
+ at USE_NETCDF4_TRUE@                              netcdf4.f90 netcdf4_eightbyte.f90 \
+ at USE_NETCDF4_TRUE@                              netcdf4_variables.f90 netcdf4_file.f90 \
+ at USE_NETCDF4_TRUE@                              netcdf4_overloads.f90
+
+ at USE_NETCDF4_FALSE@am__append_5 = netcdf.f90 netcdf3_file.f90
+
+#endif !BUILD_F03
+ at BUILD_V2_TRUE@am__append_6 = nf_v2compat.c module_netcdf_fortv2_c_interfaces.f90 nf_fortv2.f90
+ at BUILD_F03_TRUE@am__append_7 = netcdf_nc_data.mod netcdf_nc_interfaces.mod netcdf_nf_data.mod \
+ at BUILD_F03_TRUE@                   netcdf_nf_interfaces.mod netcdf_f03.mod
+
+ at BUILD_F03_TRUE@am__append_8 = NETCDF_NC_DATA.mod NETCDF_NC_INTERFACES.mod NETCDF_NF_DATA.mod \
+ at BUILD_F03_TRUE@                   NETCDF_NF_INTERFACES.mod NETCDF_F03.mod
+
+ at BUILD_F03_TRUE@@BUILD_V2_TRUE at am__append_9 = netcdf_fortv2_c_interfaces.mod
+ at BUILD_F03_TRUE@@BUILD_V2_TRUE at am__append_10 = NETCDF_FORTV2_C_INTERFACES.mod
+ at BUILD_F03_TRUE@@USE_NETCDF4_TRUE at am__append_11 = netcdf4_nc_interfaces.mod netcdf4_nf_interfaces.mod netcdf4_f03.mod
+ at BUILD_F03_TRUE@@USE_NETCDF4_TRUE at am__append_12 = NETCDF4_NC_INTERFACES.mod NETCDF4_NF_INTERFACES.mod NETCDF4_F03.mod
+ at UPPER_CASE_MOD_TRUE@am__append_13 = $(UCHEADERS) $(UCCOMMON) $(LCHEADERS) $(LCCOMMON)
+ at UPPER_CASE_MOD_FALSE@am__append_14 = $(LCHEADERS) $(LCCOMMON)
+subdir = fortran
+DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \
+	$(top_srcdir)/depcomp
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \
+	$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+	$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+	$(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/config.h \
+	$(top_builddir)/libsrc/nfconfig1.inc
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+  for p in $$list; do echo "$$p $$p"; done | \
+  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+    if (++n[$$2] == $(am__install_max)) \
+      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+    END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__uninstall_files_from_dir = { \
+  test -z "$$files" \
+    || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+    || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+         $(am__cd) "$$dir" && rm -f $$files; }; \
+  }
+am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(includedir)"
+LTLIBRARIES = $(lib_LTLIBRARIES)
+am__libnetcdff_la_SOURCES_DIST = typeSizes.f90 \
+	module_netcdf_nc_data.F90 module_netcdf_nc_interfaces.f90 \
+	module_netcdf_nf_data.F90 module_netcdf_nf_interfaces.F90 \
+	module_netcdf_f03.f90 nf_attio.F90 nf_control.F90 nf_dim.f90 \
+	nf_misc.f90 nf_genatt.f90 nf_geninq.f90 nf_genvar.f90 \
+	nf_vario.F90 nf_var1io.F90 nf_varaio.F90 nf_varmio.F90 \
+	nf_varsio.F90 module_netcdf4_nc_interfaces.f90 \
+	module_netcdf4_nf_interfaces.F90 module_netcdf4_f03.f90 \
+	nf_lib.c nf_nc4.f90 nf_logging.F90 netcdf4.f90 netcdf.f90 \
+	netcdf3_file.f90 nf_v2compat.c \
+	module_netcdf_fortv2_c_interfaces.f90 nf_fortv2.f90
+ at USE_NETCDF4_TRUE@am__objects_1 = module_netcdf4_nc_interfaces.lo \
+ at USE_NETCDF4_TRUE@	module_netcdf4_nf_interfaces.lo \
+ at USE_NETCDF4_TRUE@	module_netcdf4_f03.lo nf_lib.lo nf_nc4.lo
+ at USE_LOGGING_TRUE@am__objects_2 = nf_logging.lo
+ at USE_NETCDF4_TRUE@am__objects_3 = netcdf4.lo
+ at USE_NETCDF4_FALSE@am__objects_4 = netcdf.lo netcdf3_file.lo
+ at BUILD_V2_TRUE@am__objects_5 = nf_v2compat.lo \
+ at BUILD_V2_TRUE@	module_netcdf_fortv2_c_interfaces.lo \
+ at BUILD_V2_TRUE@	nf_fortv2.lo
+am_libnetcdff_la_OBJECTS = typeSizes.lo module_netcdf_nc_data.lo \
+	module_netcdf_nc_interfaces.lo module_netcdf_nf_data.lo \
+	module_netcdf_nf_interfaces.lo module_netcdf_f03.lo \
+	nf_attio.lo nf_control.lo nf_dim.lo nf_misc.lo nf_genatt.lo \
+	nf_geninq.lo nf_genvar.lo nf_vario.lo nf_var1io.lo \
+	nf_varaio.lo nf_varmio.lo nf_varsio.lo $(am__objects_1) \
+	$(am__objects_2) $(am__objects_3) $(am__objects_4) \
+	$(am__objects_5)
+libnetcdff_la_OBJECTS = $(am_libnetcdff_la_OBJECTS)
+AM_V_lt = $(am__v_lt_ at AM_V@)
+am__v_lt_ = $(am__v_lt_ at AM_DEFAULT_V@)
+am__v_lt_0 = --silent
+am__v_lt_1 = 
+libnetcdff_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=FC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(FCLD) $(AM_FCFLAGS) $(FCFLAGS) \
+	$(libnetcdff_la_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_P = $(am__v_P_ at AM_V@)
+am__v_P_ = $(am__v_P_ at AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_ at AM_V@)
+am__v_GEN_ = $(am__v_GEN_ at AM_DEFAULT_V@)
+am__v_GEN_0 = @echo "  GEN     " $@;
+am__v_GEN_1 = 
+AM_V_at = $(am__v_at_ at AM_V@)
+am__v_at_ = $(am__v_at_ at AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 = 
+DEFAULT_INCLUDES = -I. at am__isrc@ -I$(top_builddir) -I$(top_builddir)/libsrc
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__depfiles_maybe = depfiles
+am__mv = mv -f
+PPFCCOMPILE = $(FC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_FCFLAGS) $(FCFLAGS)
+LTPPFCCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=FC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=compile $(FC) $(DEFS) \
+	$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+	$(AM_FCFLAGS) $(FCFLAGS)
+AM_V_PPFC = $(am__v_PPFC_ at AM_V@)
+am__v_PPFC_ = $(am__v_PPFC_ at AM_DEFAULT_V@)
+am__v_PPFC_0 = @echo "  PPFC    " $@;
+am__v_PPFC_1 = 
+FCLD = $(FC)
+FCLINK = $(LIBTOOL) $(AM_V_lt) --tag=FC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(FCLD) $(AM_FCFLAGS) $(FCFLAGS) \
+	$(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_FCLD = $(am__v_FCLD_ at AM_V@)
+am__v_FCLD_ = $(am__v_FCLD_ at AM_DEFAULT_V@)
+am__v_FCLD_0 = @echo "  FCLD    " $@;
+am__v_FCLD_1 = 
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+	$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \
+	$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+	$(AM_CFLAGS) $(CFLAGS)
+AM_V_CC = $(am__v_CC_ at AM_V@)
+am__v_CC_ = $(am__v_CC_ at AM_DEFAULT_V@)
+am__v_CC_0 = @echo "  CC      " $@;
+am__v_CC_1 = 
+CCLD = $(CC)
+LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+	$(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CCLD = $(am__v_CCLD_ at AM_V@)
+am__v_CCLD_ = $(am__v_CCLD_ at AM_DEFAULT_V@)
+am__v_CCLD_0 = @echo "  CCLD    " $@;
+am__v_CCLD_1 = 
+FCCOMPILE = $(FC) $(AM_FCFLAGS) $(FCFLAGS)
+LTFCCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=FC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=compile $(FC) $(AM_FCFLAGS) $(FCFLAGS)
+AM_V_FC = $(am__v_FC_ at AM_V@)
+am__v_FC_ = $(am__v_FC_ at AM_DEFAULT_V@)
+am__v_FC_0 = @echo "  FC      " $@;
+am__v_FC_1 = 
+SOURCES = $(libnetcdff_la_SOURCES)
+DIST_SOURCES = $(am__libnetcdff_la_SOURCES_DIST)
+am__can_run_installinfo = \
+  case $$AM_UPDATE_INFO_DIR in \
+    n|no|NO) false;; \
+    *) (install-info --version) >/dev/null 2>&1;; \
+  esac
+HEADERS = $(nodist_include_HEADERS)
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates.  Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+  BEGIN { nonempty = 0; } \
+  { items[$$0] = 1; nonempty = 1; } \
+  END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique.  This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+  list='$(am__tagged_files)'; \
+  unique=`for i in $$list; do \
+    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+  done | $(am__uniquify_input)`
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+ALLOCA = @ALLOCA@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BUILD_INTERNAL_DOCS = @BUILD_INTERNAL_DOCS@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+DOT = @DOT@
+DOXYGEN = @DOXYGEN@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+F77 = @F77@
+FC = @FC@
+FCFLAGS = @FCFLAGS@
+FCFLAGS_f90 = @FCFLAGS_f90@
+FFLAGS = @FFLAGS@
+FGREP = @FGREP@
+GREP = @GREP@
+HAS_DAP = @HAS_DAP@
+HAS_F03 = @HAS_F03@
+HAS_F90 = @HAS_F90@
+HAS_NC2 = @HAS_NC2@
+HAS_NC4 = @HAS_NC4@
+HAVE_DOT = @HAVE_DOT@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MKDIR_P = @MKDIR_P@
+MOD_FLAG = @MOD_FLAG@
+NC_FLIBS = @NC_FLIBS@
+NC_LIBS = @NC_LIBS@
+NM = @NM@
+NMEDIT = @NMEDIT@
+NMFLAGS = @NMFLAGS@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+VERSION = @VERSION@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+ac_ct_F77 = @ac_ct_F77@
+ac_ct_FC = @ac_ct_FC@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target = @target@
+target_alias = @target_alias@
+target_cpu = @target_cpu@
+target_os = @target_os@
+target_vendor = @target_vendor@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+AM_LDFLAGS = 
+BUILT_SOURCES = $(am__append_13) $(am__append_14) netcdf.inc
+
+# This, plus either netcdf4.f90 or netcdf.f90, is the main source.
+
+#if BUILD_F03
+libnetcdff_la_SOURCES = typeSizes.f90 module_netcdf_nc_data.F90 \
+	module_netcdf_nc_interfaces.f90 module_netcdf_nf_data.F90 \
+	module_netcdf_nf_interfaces.F90 module_netcdf_f03.f90 \
+	nf_attio.F90 nf_control.F90 nf_dim.f90 nf_misc.f90 \
+	nf_genatt.f90 nf_geninq.f90 nf_genvar.f90 nf_vario.F90 \
+	nf_var1io.F90 nf_varaio.F90 nf_varmio.F90 nf_varsio.F90 \
+	$(am__append_1) $(am__append_2) $(am__append_3) \
+	$(am__append_5) $(am__append_6)
+
+#else !BUILD_F03
+
+# The file netcdf.f90 includes all of these.
+
+# Tell make to rebuld fortran library if netcdf.inc has changed
+libnetcdff_la_DEPENDENCIES = netcdf_attributes.f90 \
+	netcdf_constants.f90 netcdf_dims.f90 netcdf_expanded.f90 \
+	netcdf_externals.f90 netcdf_file.f90 netcdf_overloads.f90 \
+	netcdf_text_variables.f90 netcdf_variables.f90 \
+	netcdf_visibility.f90 netcdf_eightbyte.f90 $(am__append_4) \
+	netcdf.inc $(COMMONHEADERS)
+
+# All of the _DEPENDENCIES must also be in EXTRA_DIST
+
+# The nfconfig.in file is turned into nfconfig.inc by the configure
+# script. The man page is generated on the developers machine for the dist
+EXTRA_DIST = netcdf_attributes.f90 netcdf_constants.f90 \
+	netcdf_dims.f90 netcdf_expanded.f90 netcdf_externals.f90 \
+	netcdf_file.f90 netcdf_overloads.f90 netcdf_text_variables.f90 \
+	netcdf_variables.f90 netcdf_visibility.f90 \
+	netcdf_eightbyte.f90 netcdf4_func.f90 netcdf4_externals.f90 \
+	netcdf4_visibility.f90 netcdf4.f90 netcdf4_eightbyte.f90 \
+	netcdf4_overloads.f90 netcdf4_variables.f90 netcdf4_file.f90 \
+	netcdf.inc CMakeLists.txt netcdf.inc netcdf2.inc netcdf3.inc \
+	netcdf4.inc
+CLEANFILES = netcdf_nc_data.mod netcdf_nc_interfaces.mod \
+	netcdf_nf_data.mod netcdf_nf_interfaces.mod \
+	netcdf_fortv2_c_interfaces.mod netcdf_f03.mod \
+	netcdf4_nc_interfaces.mod netcdf4_nf_interfaces.mod \
+	netcdf4_f03.mod $(UCHEADERS) $(UCCOMMON) $(LCHEADERS) \
+	$(LCCOMMON)
+DISTCLEANFILES = nfconfig1.inc nfconfig.inc netcdf.inc
+libnetcdff_la_LDFLAGS = $(AM_LDFLAGS) -version-number 6:0:1
+ at USE_NETCDF4_FALSE@NETCDF_O = netcdf.o
+ at USE_NETCDF4_TRUE@NETCDF_O = netcdf4.o
+ at BUILD_F03_FALSE@libnetcdff_la_LIBADD = ${top_builddir}/libsrc/libnetcdfc.la
+
+# Some fortran compilers change the file names of .mod files to all
+# uppercase. Just to be special.
+LCHEADERS = $(am__append_7) $(am__append_9) $(am__append_11)
+UCHEADERS = $(am__append_8) $(am__append_10) $(am__append_12)
+
+# These are always used
+ at UPPER_CASE_MOD_TRUE@UCCOMMON = TYPESIZES.mod NETCDF.mod
+ at UPPER_CASE_MOD_FALSE@LCCOMMON = typesizes.mod netcdf.mod
+ at UPPER_CASE_MOD_FALSE@COMMONHEADERS = $(LCHEADERS) $(LCCOMMON)
+ at UPPER_CASE_MOD_TRUE@COMMONHEADERS = $(UCHEADERS) $(UCCOMMON)
+nodist_include_HEADERS = $(COMMONHEADERS) netcdf.inc
+
+# This is what we are building: a convenience library of Fortran 2003 functions.
+lib_LTLIBRARIES = libnetcdff.la
+all: $(BUILT_SOURCES)
+	$(MAKE) $(AM_MAKEFLAGS) all-am
+
+.SUFFIXES:
+.SUFFIXES: .F90 .c .f90 .lo .o .obj
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign fortran/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign fortran/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+
+install-libLTLIBRARIES: $(lib_LTLIBRARIES)
+	@$(NORMAL_INSTALL)
+	@list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \
+	list2=; for p in $$list; do \
+	  if test -f $$p; then \
+	    list2="$$list2 $$p"; \
+	  else :; fi; \
+	done; \
+	test -z "$$list2" || { \
+	  echo " $(MKDIR_P) '$(DESTDIR)$(libdir)'"; \
+	  $(MKDIR_P) "$(DESTDIR)$(libdir)" || exit 1; \
+	  echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \
+	  $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \
+	}
+
+uninstall-libLTLIBRARIES:
+	@$(NORMAL_UNINSTALL)
+	@list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \
+	for p in $$list; do \
+	  $(am__strip_dir) \
+	  echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \
+	  $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \
+	done
+
+clean-libLTLIBRARIES:
+	-test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES)
+	@list='$(lib_LTLIBRARIES)'; \
+	locs=`for p in $$list; do echo $$p; done | \
+	      sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \
+	      sort -u`; \
+	test -z "$$locs" || { \
+	  echo rm -f $${locs}; \
+	  rm -f $${locs}; \
+	}
+
+libnetcdff.la: $(libnetcdff_la_OBJECTS) $(libnetcdff_la_DEPENDENCIES) $(EXTRA_libnetcdff_la_DEPENDENCIES) 
+	$(AM_V_FCLD)$(libnetcdff_la_LINK) -rpath $(libdir) $(libnetcdff_la_OBJECTS) $(libnetcdff_la_LIBADD) $(LIBS)
+
+mostlyclean-compile:
+	-rm -f *.$(OBJEXT)
+
+distclean-compile:
+	-rm -f *.tab.c
+
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nf_lib.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nf_v2compat.Plo at am__quote@
+
+.F90.o:
+	$(AM_V_PPFC)$(PPFCCOMPILE) -c -o $@ $<
+
+.F90.obj:
+	$(AM_V_PPFC)$(PPFCCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.F90.lo:
+	$(AM_V_PPFC)$(LTPPFCCOMPILE) -c -o $@ $<
+
+.c.o:
+ at am__fastdepCC_TRUE@	$(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\
+ at am__fastdepCC_TRUE@	$(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+ at am__fastdepCC_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.Po
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(COMPILE) -c -o $@ $<
+
+.c.obj:
+ at am__fastdepCC_TRUE@	$(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\
+ at am__fastdepCC_TRUE@	$(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\
+ at am__fastdepCC_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.Po
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.c.lo:
+ at am__fastdepCC_TRUE@	$(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\
+ at am__fastdepCC_TRUE@	$(LTCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+ at am__fastdepCC_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LTCOMPILE) -c -o $@ $<
+
+.f90.o:
+	$(AM_V_FC)$(FCCOMPILE) -c -o $@ $(FCFLAGS_f90) $<
+
+.f90.obj:
+	$(AM_V_FC)$(FCCOMPILE) -c -o $@ $(FCFLAGS_f90) `$(CYGPATH_W) '$<'`
+
+.f90.lo:
+	$(AM_V_FC)$(LTFCCOMPILE) -c -o $@ $(FCFLAGS_f90) $<
+
+mostlyclean-libtool:
+	-rm -f *.lo
+
+clean-libtool:
+	-rm -rf .libs _libs
+install-nodist_includeHEADERS: $(nodist_include_HEADERS)
+	@$(NORMAL_INSTALL)
+	@list='$(nodist_include_HEADERS)'; test -n "$(includedir)" || list=; \
+	if test -n "$$list"; then \
+	  echo " $(MKDIR_P) '$(DESTDIR)$(includedir)'"; \
+	  $(MKDIR_P) "$(DESTDIR)$(includedir)" || exit 1; \
+	fi; \
+	for p in $$list; do \
+	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+	  echo "$$d$$p"; \
+	done | $(am__base_list) | \
+	while read files; do \
+	  echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(includedir)'"; \
+	  $(INSTALL_HEADER) $$files "$(DESTDIR)$(includedir)" || exit $$?; \
+	done
+
+uninstall-nodist_includeHEADERS:
+	@$(NORMAL_UNINSTALL)
+	@list='$(nodist_include_HEADERS)'; test -n "$(includedir)" || list=; \
+	files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+	dir='$(DESTDIR)$(includedir)'; $(am__uninstall_files_from_dir)
+
+ID: $(am__tagged_files)
+	$(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-am
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+	set x; \
+	here=`pwd`; \
+	$(am__define_uniq_tagged_files); \
+	shift; \
+	if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+	  test -n "$$unique" || unique=$$empty_fix; \
+	  if test $$# -gt 0; then \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      "$$@" $$unique; \
+	  else \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      $$unique; \
+	  fi; \
+	fi
+ctags: ctags-am
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+	$(am__define_uniq_tagged_files); \
+	test -z "$(CTAGS_ARGS)$$unique" \
+	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+	     $$unique
+
+GTAGS:
+	here=`$(am__cd) $(top_builddir) && pwd` \
+	  && $(am__cd) $(top_srcdir) \
+	  && gtags -i $(GTAGS_ARGS) "$$here"
+cscopelist: cscopelist-am
+
+cscopelist-am: $(am__tagged_files)
+	list='$(am__tagged_files)'; \
+	case "$(srcdir)" in \
+	  [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+	  *) sdir=$(subdir)/$(srcdir) ;; \
+	esac; \
+	for i in $$list; do \
+	  if test -f "$$i"; then \
+	    echo "$(subdir)/$$i"; \
+	  else \
+	    echo "$$sdir/$$i"; \
+	  fi; \
+	done >> $(top_builddir)/cscope.files
+
+distclean-tags:
+	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+	  else \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
+	    || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+check: $(BUILT_SOURCES)
+	$(MAKE) $(AM_MAKEFLAGS) check-am
+all-am: Makefile $(LTLIBRARIES) $(HEADERS)
+installdirs:
+	for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(includedir)"; do \
+	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
+	done
+install: $(BUILT_SOURCES)
+	$(MAKE) $(AM_MAKEFLAGS) install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	if test -z '$(STRIP)'; then \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	      install; \
+	else \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	    "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+	fi
+mostlyclean-generic:
+
+clean-generic:
+	-test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+	-test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+	-test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES)
+clean: clean-am
+
+clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \
+	mostlyclean-am
+
+distclean: distclean-am
+	-rm -rf ./$(DEPDIR)
+	-rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+	distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am: install-nodist_includeHEADERS
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am: install-libLTLIBRARIES
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+	-rm -rf ./$(DEPDIR)
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+	mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-libLTLIBRARIES uninstall-nodist_includeHEADERS
+
+.MAKE: all check install install-am install-strip
+
+.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \
+	clean-libLTLIBRARIES clean-libtool cscopelist-am ctags \
+	ctags-am distclean distclean-compile distclean-generic \
+	distclean-libtool distclean-tags distdir dvi dvi-am html \
+	html-am info info-am install install-am install-data \
+	install-data-am install-dvi install-dvi-am install-exec \
+	install-exec-am install-html install-html-am install-info \
+	install-info-am install-libLTLIBRARIES install-man \
+	install-nodist_includeHEADERS install-pdf install-pdf-am \
+	install-ps install-ps-am install-strip installcheck \
+	installcheck-am installdirs maintainer-clean \
+	maintainer-clean-generic mostlyclean mostlyclean-compile \
+	mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+	tags tags-am uninstall uninstall-am uninstall-libLTLIBRARIES \
+	uninstall-nodist_includeHEADERS
+
+
+# Add dependencies for source files included in "meta" source files, so the
+#       meta source is rebuilt properly when an included file is modified.
+netcdf.$(OBJEXT): netcdf_constants.f90 netcdf_externals.f90 netcdf_overloads.f90 \
+        netcdf_visibility.f90 netcdf_file.f90 netcdf3_file.f90 netcdf_dims.f90 \
+        netcdf_attributes.f90 netcdf_variables.f90 netcdf_text_variables.f90 \
+        netcdf_expanded.f90 netcdf_eightbyte.f90
+netcdf4.$(OBJEXT): netcdf_constants.f90 netcdf_externals.f90 netcdf4_externals.f90 \
+        netcdf_overloads.f90 netcdf_visibility.f90 netcdf4_visibility.f90 \
+        netcdf_file.f90 netcdf4_file.f90 netcdf_dims.f90 netcdf_attributes.f90 \
+        netcdf4_variables.f90 netcdf_text_variables.f90 netcdf_expanded.f90 \
+        netcdf4_eightbyte.f90 netcdf4_func.f90 netcdf4_overloads.f90
+
+# Must be consistent with previous list of uppercase headers
+# Always construct the upper case modules (may be unused)
+
+#if UPPER_CASE_MOD
+#NETCDF_NC_DATA.mod: module_netcdf_nc_data.o
+#NETCDF_NC_INTERFACES.mod: module_netcdf_nc_interfaces.o
+#NETCDF_NF_DATA.mod: module_netcdf_nf_data.o
+#NETCDF_NF_INTERFACES.mod: module_netcdf_nf_interfaces.o
+#NETCDF_F03.mod: module_netcdf_f03.o
+#if BUILD_V2
+#NETCDF_FORTV2_C_INTERFACES.mod: module_netcdf_fortv2_c_interfaces.o
+#endif BUILD_V2
+#else !UPPER_CASE_MOD
+ at BUILD_F03_TRUE@netcdf_nc_data.mod: module_netcdf_nc_data.o
+ at BUILD_F03_TRUE@netcdf_nc_interfaces.mod: module_netcdf_nc_interfaces.o
+ at BUILD_F03_TRUE@netcdf_nf_data.mod: module_netcdf_nf_data.o
+ at BUILD_F03_TRUE@netcdf_nf_interfaces.mod: module_netcdf_nf_interfaces.o
+ at BUILD_F03_TRUE@netcdf_f03.mod: module_netcdf_f03.o
+ at BUILD_F03_TRUE@@BUILD_V2_TRUE at netcdf_fortv2_c_interfaces.mod: module_netcdf_fortv2_c_interfaces.o
+#endif !UPPER_CASE_MOD
+
+ at BUILD_F03_TRUE@@USE_NETCDF4_TRUE at netcdf4_nc_interfaces.mod: module_netcdf4_nc_interfaces.o
+ at BUILD_F03_TRUE@@USE_NETCDF4_TRUE at netcdf4_nf_interfaces.mod: module_netcdf4_nf_interfaces.o
+ at BUILD_F03_TRUE@@USE_NETCDF4_TRUE at netcdf4_f03.mod: module_netcdf4_f03.o
+
+ at UPPER_CASE_MOD_TRUE@$(UCHEADERS): $(LCHEADERS)
+ at UPPER_CASE_MOD_TRUE@	for lc in $(LCHEADERS) ; do \
+ at UPPER_CASE_MOD_TRUE@	uc="$${lc%%.mod}" ; \
+ at UPPER_CASE_MOD_TRUE@	uc=`echo $$uc | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'`; \
+ at UPPER_CASE_MOD_TRUE@        uc="$${uc}.mod" ; rm -f $$uc ; cp $$lc $$uc ; \
+ at UPPER_CASE_MOD_TRUE@	done
+ at UPPER_CASE_MOD_TRUE@NETCDF.mod: $(NETCDF_O)
+ at UPPER_CASE_MOD_TRUE@TYPESIZES.mod: typeSizes.o
+ at UPPER_CASE_MOD_FALSE@netcdf.mod: $(NETCDF_O)
+ at UPPER_CASE_MOD_FALSE@typesizes.mod: typeSizes.o
+
+# Build netcdf.inc file from netcdf2, netcdf3 and netcdf4 files
+
+netcdf.inc: $(top_srcdir)/fortran/netcdf2.inc $(top_srcdir)/fortran/netcdf3.inc $(top_srcdir)/fortran/netcdf4.inc
+	echo '!     NetCDF-3.' > netcdf.inc
+	cat $(top_srcdir)/fortran/netcdf3.inc >> netcdf.inc
+ at USE_NETCDF4_TRUE@	echo >> netcdf.inc
+ at USE_NETCDF4_TRUE@	echo '!     NetCDF-4.' >> netcdf.inc
+ at USE_NETCDF4_TRUE@	cat $(top_srcdir)/fortran/netcdf4.inc >> netcdf.inc
+ at BUILD_V2_TRUE@	echo >> netcdf.inc
+ at BUILD_V2_TRUE@	echo '!     NetCDF-2.' >> netcdf.inc
+ at BUILD_V2_TRUE@	cat $(top_srcdir)/fortran/netcdf2.inc >> netcdf.inc
+ at USE_LOGGING_TRUE@	echo >> netcdf.inc
+ at USE_LOGGING_TRUE@	echo '!     This is to turn on netCDF internal logging.' >> netcdf.inc
+ at USE_LOGGING_TRUE@	echo '      integer nf_set_log_level' >> netcdf.inc
+ at USE_LOGGING_TRUE@	echo '      external nf_set_log_level' >> netcdf.inc
+
+# Turn off parallel builds in this directory.
+.NOTPARALLEL:
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/fortran/module_netcdf4_f03.f90 b/fortran/module_netcdf4_f03.f90
new file mode 100755
index 0000000..77de7ff
--- /dev/null
+++ b/fortran/module_netcdf4_f03.f90
@@ -0,0 +1,42 @@
+Module netcdf4_f03
+
+! Module to provide inheritance of Netcdf4 data and interfaces from nf_data
+! and nf_interfaces modules. Not really needed by netCDF but provided for
+! folks writing new code or updating old code who would prefer using
+! modules instead of the old netcdf.inc include file.
+
+! Written by: Richard Weed, Ph.D.
+!             Center for Advanced Vehicular Systems 
+!             Mississippi State University
+!             rweed at cavs.msstate.edu
+          
+
+! License (and other Lawyer Language)
+ 
+! This software is released under the Apache 2.0 Open Source License. The
+! full text of the License can be viewed at :
+!
+!   http:www.apache.org/licenses/LICENSE-2.0.html
+!
+! The author grants to the University Corporation for Atmospheric Research
+! (UCAR), Boulder, CO, USA the right to revise and extend the software
+! without restriction. However, the author retains all copyrights and
+! intellectual property rights explicitly stated in or implied by the
+! Apache license
+
+! Version 1.0 - April 2009 - Separate module for netcdf 4 for now to
+!                            to simplify build process
+
+! This module can be used as a replacement for an include to netcdf.inc
+! The module is named netcdf4_f03 to differentiate it from the
+! netcdf_f03 module
+
+
+ USE netcdf_nf_data        ! Brings in the nf interface error flags etc. 
+ USE netcdf_nf_interfaces  ! Brings in explicit interfaces to nf_ routines
+ USE netcdf4_nf_interfaces ! Bring in netcdf4 interfaces
+
+ Implicit NONE
+
+!------------------------------- End of Module netcdf4_f03 ---------------------
+ End Module netcdf4_f03
diff --git a/fortran/module_netcdf4_nc_interfaces.f90 b/fortran/module_netcdf4_nc_interfaces.f90
new file mode 100755
index 0000000..f013836
--- /dev/null
+++ b/fortran/module_netcdf4_nc_interfaces.f90
@@ -0,0 +1,1173 @@
+Module netcdf4_nc_interfaces
+
+! Fortran interfaces to netCDF4 C functions using FORTRAN 2003 C 
+! Interoperability features. These interfaces are for the base
+! netCDF C routines in the libsrc4 directory and the results from
+! running CPP on the fort-xxx.c routines to get the cfortran.h
+! generated interfaces
+
+! Written by: Richard Weed, Ph.D.
+!             Center for Advanced Vehicular Systems 
+!             Mississippi State University
+!             rweed at cavs.msstate.edu
+
+
+! License (and other Lawyer Language)
+ 
+! This software is released under the Apache 2.0 Open Source License. The
+! full text of the License can be viewed at :
+!
+!   http:www.apache.org/licenses/LICENSE-2.0.html
+!
+! The author grants to the University Corporation for Atmospheric Research
+! (UCAR), Boulder, CO, USA the right to revise and extend the software
+! without restriction. However, the author retains all copyrights and
+! intellectual property rights explicitly stated in or implied by the
+! Apache license
+
+! Version 1.: June.  2007 - Initial version - split from ntecdf_nc_interfaces 
+! Version 2.: April, 2009 - Interfaces based on netcdf-4.0.1 source         
+! Version 3.: April, 2010 - Interfaces based on netcdf-4.1.1 source         
+! Version 4.: Aug,   2013 - Added nc_rename_grp interfaces for netcdf-C 4.3.1
+
+ USE netcdf_nc_interfaces
+
+ Implicit NONE
+
+!--------- Define default C interface parameters from netcdf.h ---------------
+
+! Begin explicit interfaces for nc_ functions. Note that some interfaces
+! expect data to be passed as C_PTR type variables. These data are arrays
+! that could have a NULL pointer passed instead of the array. Also, note
+! the use of generic interfaces to support routines that handle text data
+! to allow text to be passed as either a single string or an array of
+! single characters
+
+! Also note that each interface has an explicit USE ISO_C_BINDING. A better
+! solution is to use the F2003 IMPORT statement (I originally had it this way)
+! However its best to leave the interfaces as is for now because there might
+! be a few compilers out there that support most of the C-interop facility but
+! for some reason haven't implemented IMPORT yet. 
+
+! NETCDF 4 functions supported by FORTRAN interface
+
+!----------------------------- nc_create_par_fortran -------------------------
+Interface
+ Function nc_create_par_fortran(path, cmode, comm, info, ncidp) BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_INT, C_CHAR
+
+ Character(KIND=C_CHAR), Intent(IN)  :: path(*)
+ Integer(KIND=C_INT),    VALUE       :: cmode, comm, info
+ Integer(KIND=C_INT),    Intent(OUT) :: ncidp
+
+ Integer(KIND=C_INT)                 :: nc_create_par_fortran
+
+ End Function nc_create_par_fortran
+End Interface
+!----------------------------- nc_open_par_fortran ---------------------------
+Interface
+ Function nc_open_par_fortran(path, mode, comm, info, ncidp) BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_INT, C_CHAR
+
+ Character(KIND=C_CHAR), Intent(IN)  :: path(*)
+ Integer(KIND=C_INT),    VALUE       :: mode, comm, info
+ Integer(KIND=C_INT),    Intent(OUT) :: ncidp
+
+ Integer(KIND=C_INT)                 :: nc_open_par_fortran
+
+ End Function nc_open_par_fortran
+End Interface
+!------------------------------- nc_var_par_access ----------------------------
+Interface
+ Function nc_var_par_access(ncid, varid, par_access) BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_INT
+
+ Integer(KIND=C_INT), VALUE :: ncid, varid, par_access
+
+ Integer(KIND=C_INT)        :: nc_var_par_access
+
+ End Function nc_var_par_access
+End Interface
+!------------------------------- nc_inq_ncid ----------------------------------
+Interface
+ Function nc_inq_ncid(ncid, name, grp_ncid) BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_INT, C_CHAR
+
+ Integer(KIND=C_INT),    VALUE         :: ncid
+ Character(KIND=C_CHAR), Intent(IN)    :: name(*)
+ Integer(KIND=C_INT),    Intent(INOUT) :: grp_ncid
+
+ Integer(KIND=C_INT)                   :: nc_inq_ncid
+
+ End Function nc_inq_ncid
+End Interface
+!------------------------------- nc_inq_grps ----------------------------------
+Interface
+ Function nc_inq_grps(ncid, numgrps, ncids) BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_INT
+
+ Integer(KIND=C_INT), VALUE         :: ncid
+ Integer(KIND=C_INT), Intent(INOUT) :: numgrps
+ Integer(KIND=C_INT), Intent(INOUT) :: ncids(*)
+
+ Integer(KIND=C_INT)                :: nc_inq_grps
+
+ End Function nc_inq_grps
+End Interface
+!------------------------------- nc_inq_grpname -------------------------------
+Interface
+ Function nc_inq_grpname(ncid, name) BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_INT, C_CHAR
+
+ Integer(KIND=C_INT),    VALUE         :: ncid
+ Character(KIND=C_CHAR), Intent(INOUT) :: name(*)
+
+ Integer(KIND=C_INT)                   :: nc_inq_grpname
+
+ End Function nc_inq_grpname
+End Interface
+!------------------------------- nc_inq_grpname_full --------------------------
+Interface
+ Function nc_inq_grpname_full(ncid, nlen, name) BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_INT, C_SIZE_T, C_CHAR
+
+ Integer(KIND=C_INT),    VALUE         :: ncid
+ Integer(KIND=C_SIZE_T), Intent(INOUT) :: nlen
+ Character(KIND=C_CHAR), Intent(INOUT) :: name(*)
+
+ Integer(KIND=C_INT)                   :: nc_inq_grpname_full
+
+ End Function nc_inq_grpname_full
+End Interface
+!------------------------------- nc_inq_grpname_len ---------------------------
+Interface
+ Function nc_inq_grpname_len(ncid, nlen) BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_INT, C_SIZE_T
+
+ Integer(KIND=C_INT),    VALUE         :: ncid
+ Integer(KIND=C_SIZE_T), Intent(INOUT) :: nlen
+
+ Integer(KIND=C_INT)                   :: nc_inq_grpname_len
+
+ End Function nc_inq_grpname_len
+End Interface
+!------------------------------- nc_inq_grp_full_ncid -------------------------
+Interface
+ Function nc_inq_grp_full_ncid(ncid, full_name, grp_ncid) BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_INT, C_CHAR
+
+ Integer(KIND=C_INT),    VALUE         :: ncid
+ Integer(KIND=C_INT),    Intent(INOUT) :: grp_ncid
+ Character(KIND=C_CHAR), Intent(INOUT) :: full_name(*)
+
+ Integer(KIND=C_INT)                   :: nc_inq_grp_full_ncid
+
+ End Function nc_inq_grp_full_ncid
+End Interface
+!------------------------------- nc_inq_grp_parent ----------------------------
+Interface
+ Function nc_inq_grp_parent(ncid, parent_ncid) BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_INT
+
+ Integer(KIND=C_INT), VALUE         :: ncid
+ Integer(KIND=C_INT), Intent(INOUT) :: parent_ncid
+
+ Integer(KIND=C_INT)                :: nc_inq_grp_parent
+
+ End Function nc_inq_grp_parent
+End Interface
+!------------------------------- nc_inq_grp_ncid ------------------------------
+Interface
+ Function nc_inq_grp_ncid(ncid, grp_name, grp_ncid) BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_INT, C_CHAR
+
+ Integer(KIND=C_INT),    VALUE         :: ncid
+ Character(KIND=C_CHAR), Intent(IN)    :: grp_name(*)
+ Integer(KIND=C_INT),    Intent(INOUT) :: grp_ncid
+
+ Integer(KIND=C_INT)                   :: nc_inq_grp_ncid
+
+ End Function nc_inq_grp_ncid
+End Interface
+!------------------------------- nc_inq_varids_f ------------------------------
+Interface
+ Function nc_inq_varids_f(ncid, nvars, varids) BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_INT
+
+ Integer(KIND=C_INT), VALUE         :: ncid
+ Integer(KIND=C_INT), Intent(INOUT) :: nvars
+ Integer(KIND=C_INT), Intent(INOUT) :: varids(*)
+
+ Integer(KIND=C_INT)                :: nc_inq_varids_f
+
+ End Function nc_inq_varids_f
+End Interface
+!------------------------------- nc_inq_dimids_f ------------------------------
+Interface
+ Function nc_inq_dimids_f(ncid, ndims, dimids, parent) BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_INT
+
+ Integer(KIND=C_INT), VALUE         :: ncid, parent
+ Integer(KIND=C_INT), Intent(INOUT) :: ndims
+ Integer(KIND=C_INT), Intent(INOUT) :: dimids(*)
+
+ Integer(KIND=C_INT)                :: nc_inq_dimids_f
+
+ End Function nc_inq_dimids_f
+End Interface
+!------------------------------- nc_inq_typeids -------------------------------
+Interface
+ Function nc_inq_typeids(ncid, ntypes, typeids) BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_INT
+
+ Integer(KIND=C_INT), VALUE         :: ncid
+ Integer(KIND=C_INT), Intent(INOUT) :: ntypes
+ Integer(KIND=C_INT), Intent(INOUT) :: typeids(*)
+
+ Integer(KIND=C_INT)                :: nc_inq_typeids
+
+ End Function nc_inq_typeids
+End Interface
+!------------------------------- nc_inq_typeid --------------------------------
+Interface
+ Function nc_inq_typeid(ncid, name, typeid) BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_INT, C_CHAR
+
+ Integer(KIND=C_INT), VALUE         :: ncid
+ Character(KIND=C_CHAR), Intent(IN) :: name(*)
+ Integer(KIND=C_INT), Intent(INOUT) :: typeid
+
+ Integer(KIND=C_INT)                :: nc_inq_typeid
+
+ End Function nc_inq_typeid
+End Interface
+!------------------------------- nc_def_grp -----------------------------------
+Interface
+ Function nc_def_grp(parent_ncid, name, new_ncid) BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_INT, C_CHAR
+
+ Integer(KIND=C_INT),    VALUE         :: parent_ncid
+ Character(KIND=C_CHAR), Intent(IN)    :: name(*)
+ Integer(KIND=C_INT),    Intent(INOUT) :: new_ncid
+
+ Integer(KIND=C_INT)                   :: nc_def_grp
+
+ End Function nc_def_grp
+End Interface
+!------------------------------- nc_rename_grp --------------------------------
+Interface
+ Function nc_rename_grp(grpid, name) BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_INT, C_CHAR
+
+ Integer(KIND=C_INT),    VALUE         :: grpid
+ Character(KIND=C_CHAR), Intent(IN)    :: name(*)
+
+ Integer(KIND=C_INT)                   :: nc_rename_grp
+
+ End Function nc_rename_grp
+End Interface
+!------------------------------- nc_def_compound ------------------------------
+Interface
+ Function nc_def_compound(ncid, isize, name, typeidp) BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_INT, C_SIZE_T, C_CHAR
+
+ Integer(KIND=C_INT),    VALUE         :: ncid
+ Integer(KIND=C_SIZE_T), VALUE         :: isize
+ Character(KIND=C_CHAR), Intent(IN)    :: name(*)
+ Integer(KIND=C_INT),    Intent(INOUT) :: typeidp
+
+ Integer(KIND=C_INT)                   :: nc_def_compound
+
+ End Function nc_def_compound
+End Interface
+!------------------------------- nc_insert_compound ---------------------------
+Interface
+ Function nc_insert_compound(ncid, xtype, name, offset, field_typeid) BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_INT, C_SIZE_T, C_CHAR
+
+ Integer(KIND=C_INT),    VALUE      :: ncid
+ Integer(KIND=C_INT),    VALUE      :: xtype, field_typeid ! nc_type in C 
+ Integer(KIND=C_SIZE_T), VALUE      :: offset
+ Character(KIND=C_CHAR), Intent(IN) :: name(*)
+
+ Integer(KIND=C_INT)                :: nc_insert_compound
+
+ End Function nc_insert_compound
+End Interface
+!------------------------------- nc_insert_array_compound_f -------------------
+Interface
+ Function nc_insert_array_compound_f(ncid, xtype, name, offset, field_typeid, &
+                                     ndims, dim_sizes) BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_INT, C_SIZE_T, C_CHAR
+
+ Integer(KIND=C_INT),    VALUE         :: ncid, ndims
+ Integer(KIND=C_INT),    VALUE         :: xtype, field_typeid  ! nc_type in C
+ Integer(KIND=C_SIZE_T), VALUE         :: offset
+ Character(KIND=C_CHAR), Intent(IN)    :: name(*)
+ Integer(KIND=C_INT),    Intent(INOUT) :: dim_sizes(*)
+
+ Integer(KIND=C_INT)                   :: nc_insert_array_compound_f
+
+ End Function nc_insert_array_compound_f
+End Interface
+!------------------------------- nc_inq_type ----------------------------------
+Interface
+ Function nc_inq_type(ncid, xtype, name, isize) BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_INT, C_SIZE_T, C_CHAR
+
+ Integer(KIND=C_INT),    VALUE         :: ncid
+ Integer(KIND=C_INT),    VALUE         :: xtype ! nc_type in C
+ Character(KIND=C_CHAR), Intent(IN)    :: name(*)
+ Integer(KIND=C_SIZE_T), Intent(INOUT) :: isize
+
+ Integer(KIND=C_INT)                   :: nc_inq_type
+
+ End Function nc_inq_type
+End Interface
+!------------------------------- nc_inq_compound -----------------------------
+Interface
+ Function nc_inq_compound(ncid, xtype, name, isize, nfieldsp) BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_INT, C_SIZE_T, C_CHAR
+
+ Integer(KIND=C_INT),    VALUE         :: ncid
+ Integer(KIND=C_INT),    VALUE         :: xtype ! nc_type in C
+ Character(KIND=C_CHAR), Intent(INOUT) :: name(*)
+ Integer(KIND=C_SIZE_T), Intent(INOUT) :: isize, nfieldsp
+
+ Integer(KIND=C_INT)                   :: nc_inq_compound
+
+ End Function nc_inq_compound
+End Interface
+!------------------------------- nc_inq_compound_name -------------------------
+Interface
+ Function nc_inq_compound_name(ncid, xtype, name) BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_INT, C_SIZE_T, C_CHAR
+
+ Integer(KIND=C_INT),    VALUE         :: ncid
+ Integer(KIND=C_INT),    VALUE         :: xtype ! nc_type in C
+ Character(KIND=C_CHAR), Intent(INOUT) :: name(*)
+
+ Integer(KIND=C_INT)                   :: nc_inq_compound_name
+
+ End Function nc_inq_compound_name
+End Interface
+!------------------------------- nc_inq_compound_size -------------------------
+Interface
+ Function nc_inq_compound_size(ncid, xtype, isize) BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_INT, C_SIZE_T
+
+ Integer(KIND=C_INT),    VALUE         :: ncid
+ Integer(KIND=C_INT),    VALUE         :: xtype ! nc_type in C
+ Integer(KIND=C_SIZE_T), Intent(INOUT) :: isize
+
+ Integer(KIND=C_INT)                   :: nc_inq_compound_size
+
+ End Function nc_inq_compound_size
+End Interface
+!------------------------------- nc_inq_compound_nfields ----------------------
+Interface
+ Function nc_inq_compound_nfields(ncid, xtype, nfieldsp) BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_INT, C_SIZE_T
+
+ Integer(KIND=C_INT),    VALUE         :: ncid
+ Integer(KIND=C_INT),    VALUE         :: xtype ! nc_type in C
+ Integer(KIND=C_SIZE_T), Intent(INOUT) :: nfieldsp
+
+ Integer(KIND=C_INT)                   :: nc_inq_compound_nfields
+
+ End Function nc_inq_compound_nfields
+End Interface
+!------------------------------- nc_inq_compound_field_f ----------------------
+Interface
+ Function nc_inq_compound_field_f(ncid, xtype, fieldid, name, offsetp, &
+                                  field_typeidp, ndimsp, dim_sizesp) BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_INT, C_SIZE_T, C_CHAR
+
+ Integer(KIND=C_INT),    VALUE         :: ncid, fieldid
+ Integer(KIND=C_INT),    VALUE         :: xtype  ! nc_type in C
+ Integer(KIND=C_INT),    Intent(INOUT) :: field_typeidp  ! nc_type in C
+ Integer(KIND=C_SIZE_T), Intent(INOUT) :: offsetp
+ Character(KIND=C_CHAR), Intent(INOUT) :: name(*)
+ Integer(KIND=C_INT),    Intent(INOUT) :: ndimsp
+ Integer(KIND=C_INT),    Intent(INOUT) :: dim_sizesp(*)
+
+ Integer(KIND=C_INT)                   :: nc_inq_compound_field_f
+
+ End Function nc_inq_compound_field_f
+End Interface
+!------------------------------- nc_inq_compound_fieldoffset ------------------
+Interface
+ Function nc_inq_compound_fieldoffset(ncid, xtype, fieldid, offsetp) BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_INT, C_SIZE_T
+
+ Integer(KIND=C_INT),    VALUE         :: ncid, fieldid
+ Integer(KIND=C_INT),    VALUE         :: xtype ! nc_type in C
+ Integer(KIND=C_SIZE_T), Intent(INOUT) :: offsetp 
+
+ Integer(KIND=C_INT)                   :: nc_inq_compound_fieldoffset
+
+ End Function nc_inq_compound_fieldoffset
+End Interface
+!------------------------------- nc_inq_compound_fieldname --------------------
+Interface
+ Function nc_inq_compound_fieldname(ncid, xtype, fieldid, name) BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_INT, C_CHAR
+
+ Integer(KIND=C_INT),    VALUE         :: ncid, fieldid
+ Integer(KIND=C_INT),    VALUE         :: xtype ! nc_type in C
+ Character(KIND=C_CHAR), Intent(INOUT) :: name(*)
+
+ Integer(KIND=C_INT)                   :: nc_inq_compound_fieldname
+
+ End Function nc_inq_compound_fieldname
+End Interface
+!------------------------------- nc_inq_compound_fieldindex -------------------
+Interface
+ Function nc_inq_compound_fieldindex(ncid, xtype, name, fieldidp) BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_INT, C_CHAR
+
+ Integer(KIND=C_INT),    VALUE         :: ncid
+ Integer(KIND=C_INT),    VALUE         :: xtype ! nc_type in C
+ Character(KIND=C_CHAR), Intent(IN)    :: name(*)
+ Integer(KIND=C_INT),    Intent(INOUT) :: fieldidp
+
+ Integer(KIND=C_INT)                   :: nc_inq_compound_fieldindex
+
+ End Function nc_inq_compound_fieldindex
+End Interface
+!------------------------------- nc_inq_compound_fieldtype --------------------
+Interface
+ Function nc_inq_compound_fieldtype(ncid, xtype, fieldid, field_typeidp) BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_INT
+
+ Integer(KIND=C_INT), VALUE         :: ncid, fieldid
+ Integer(KIND=C_INT), VALUE         :: xtype ! nc_type in C
+ Integer(KIND=C_INT), Intent(INOUT) :: field_typeidp ! nc_type in C
+
+ Integer(KIND=C_INT)                :: nc_inq_compound_fieldtype
+
+ End Function nc_inq_compound_fieldtype
+End Interface
+!------------------------------- nc_inq_compound_fieldndims -------------------
+Interface
+ Function nc_inq_compound_fieldndims(ncid, xtype, fieldid, ndimsp) BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_INT
+
+ Integer(KIND=C_INT), VALUE         :: ncid, fieldid
+ Integer(KIND=C_INT), VALUE         :: xtype ! nc_type in C
+ Integer(KIND=C_INT), Intent(INOUT) :: ndimsp
+
+ Integer(KIND=C_INT)                :: nc_inq_compound_fieldndims
+
+ End Function nc_inq_compound_fieldndims
+End Interface
+!------------------------------- nc_inq_compound_fielddim_sizes ---------------
+Interface
+ Function nc_inq_compound_fielddim_sizes(ncid, xtype, fieldid, dim_sizes) BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_INT
+
+ Integer(KIND=C_INT), VALUE         :: ncid, fieldid
+ Integer(KIND=C_INT), VALUE         :: xtype ! nc_type in C
+ Integer(KIND=C_INT), Intent(INOUT) :: dim_sizes(*)
+
+ Integer(KIND=C_INT)                :: nc_inq_compound_fielddim_sizes
+
+ End Function nc_inq_compound_fielddim_sizes
+End Interface
+!------------------------------- nc_def_vlen ----------------------------------
+Interface
+ Function nc_def_vlen(ncid, name, base_typeid, xtypep) BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_INT, C_CHAR
+
+ Integer(KIND=C_INT),    VALUE         :: ncid
+ Integer(KIND=C_INT),    VALUE         :: base_typeid ! nc_type in C
+ Integer(KIND=C_INT),    Intent(INOUT) :: xtypep ! nc_type in C 
+ Character(KIND=C_CHAR), Intent(IN)    :: name(*)
+
+ Integer(KIND=C_INT)                   :: nc_def_vlen
+
+ End Function nc_def_vlen
+End Interface
+!------------------------------- nc_inq_vlen ----------------------------------
+Interface
+ Function nc_inq_vlen(ncid, xtype, name, datum_sizep, base_nc_typep) BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_INT, C_SIZE_T, C_CHAR
+
+ Integer(KIND=C_INT),    VALUE         :: ncid
+ Integer(KIND=C_INT),    VALUE         :: xtype ! nc_type in C
+ Integer(KIND=C_SIZE_T), Intent(INOUT) :: datum_sizep
+ Integer(KIND=C_INT),    Intent(INOUT) :: base_nc_typep ! nc_type in C 
+ Character(KIND=C_CHAR), Intent(INOUT) :: name(*)
+
+ Integer(KIND=C_INT)                   :: nc_inq_vlen
+
+ End Function nc_inq_vlen
+End Interface
+!------------------------------- nc_inq_user_type -----------------------------
+Interface
+ Function nc_inq_user_type(ncid, xtype, name, isize, base_nc_typep, &
+                           nfieldsp, classp) BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_INT, C_SIZE_T, C_CHAR
+
+ Integer(KIND=C_INT),    VALUE         :: ncid
+ Integer(KIND=C_INT),    VALUE         :: xtype ! nc_type in C
+ Integer(KIND=C_SIZE_T), Intent(INOUT) :: isize , nfieldsp
+ Integer(KIND=C_INT),    Intent(INOUT) :: base_nc_typep ! nc_type in C 
+ Integer(KIND=C_INT),    Intent(INOUT) :: classp
+ Character(KIND=C_CHAR), Intent(INOUT) :: name(*)
+
+ Integer(KIND=C_INT)                   :: nc_inq_user_type
+
+ End Function nc_inq_user_type
+End Interface
+!------------------------------- nc_def_enum ----------------------------------
+Interface
+ Function nc_def_enum(ncid, base_typeid, name, typeidp) BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_INT, C_CHAR
+
+ Integer(KIND=C_INT),    VALUE       :: ncid
+ Integer(KIND=C_INT),    VALUE       :: base_typeid ! nc_type in C
+ Integer(KIND=C_INT),    Intent(OUT) :: typeidp ! nc_type in C 
+ Character(KIND=C_CHAR), Intent(IN)  :: name(*)
+
+ Integer(KIND=C_INT)                 :: nc_def_enum
+
+ End Function nc_def_enum
+End Interface
+!------------------------------- nc_insert_enum -------------------------------
+Interface
+ Function nc_insert_enum(ncid, xtype, name, values) BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_INT, C_CHAR, C_PTR
+
+ Integer(KIND=C_INT),    VALUE      :: ncid
+ Integer(KIND=C_INT),    VALUE      :: xtype ! nc_type in C
+ Type(C_PTR),            VALUE      :: values  ! void pointer in C
+ Character(KIND=C_CHAR), Intent(IN) :: name(*)
+
+ Integer(KIND=C_INT)                :: nc_insert_enum
+
+ End Function nc_insert_enum
+End Interface
+!------------------------------- nc_inq_enum ----------------------------------
+Interface
+ Function nc_inq_enum(ncid, xtype, name, base_nc_typep, base_sizep, &
+                      num_membersp) BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_INT, C_SIZE_T, C_CHAR
+
+ Integer(KIND=C_INT),    VALUE         :: ncid
+ Integer(KIND=C_INT),    VALUE         :: xtype ! nc_type in C
+ Integer(KIND=C_INT),    Intent(INOUT) :: base_nc_typep ! nc_type in C 
+ Integer(KIND=C_SIZE_T), Intent(INOUT) :: base_sizep, num_membersp 
+ Character(KIND=C_CHAR), Intent(INOUT) :: name(*)
+
+ Integer(KIND=C_INT)                   :: nc_inq_enum
+
+ End Function nc_inq_enum
+End Interface
+!------------------------------- nc_inq_enum_member ---------------------------
+Interface
+ Function nc_inq_enum_member(ncid, xtype, idx, name, value) BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_INT, C_CHAR
+
+ Integer(KIND=C_INT),    VALUE         :: ncid, idx
+ Integer(KIND=C_INT),    VALUE         :: xtype ! nc_type in C
+ Character(KIND=C_CHAR), Intent(OUT)   :: value(*)
+ Character(KIND=C_CHAR), Intent(INOUT) :: name(*)
+
+ Integer(KIND=C_INT)                   :: nc_inq_enum_member
+
+ End Function nc_inq_enum_member
+End Interface
+!------------------------------- nc_inq_enum_ident ----------------------------
+Interface
+ Function nc_inq_enum_ident(ncid, xtype, val, name) BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_INT, C_LONG_LONG, C_CHAR
+
+ Integer(KIND=C_INT),       VALUE         :: ncid
+ Integer(KIND=C_INT),       VALUE         :: xtype ! nc_type in C
+ Integer(KIND=C_LONG_LONG), VALUE         :: val 
+ Character(KIND=C_CHAR),    Intent(INOUT) :: name(*)
+
+ Integer(KIND=C_INT)                      :: nc_inq_enum_ident
+
+ End Function nc_inq_enum_ident
+End Interface
+!------------------------------- nc_def_opaque --------------------------------
+Interface
+ Function nc_def_opaque(ncid, isize, name, xtypep) BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_INT, C_SIZE_T, C_CHAR
+
+ Integer(KIND=C_INT),    VALUE       :: ncid
+ Integer(KIND=C_SIZE_T), VALUE       :: isize
+ Character(KIND=C_CHAR), Intent(IN)  :: name(*)
+ Integer(KIND=C_INT),    Intent(OUT) :: xtypep ! nc_type in C
+
+ Integer(KIND=C_INT)                 :: nc_def_opaque
+
+ End Function nc_def_opaque
+End Interface
+!------------------------------- nc_inq_opaque --------------------------------
+Interface
+ Function nc_inq_opaque(ncid, xtype, name, sizep) BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_INT, C_SIZE_T, C_CHAR
+
+ Integer(KIND=C_INT),    VALUE       :: ncid
+ Integer(KIND=C_INT),    VALUE       :: xtype ! nc_type in C
+ Integer(KIND=C_SIZE_T), Intent(OUT) :: sizep
+ Character(KIND=C_CHAR), Intent(OUT) :: name(*)
+
+ Integer(KIND=C_INT)                 :: nc_inq_opaque
+
+ End Function nc_inq_opaque
+End Interface
+!------------------------------- nc_def_var_fill ------------------------------
+Interface
+ Function nc_def_var_fill(ncid, varid, no_fill, cfill_value_p) BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_INT, C_PTR
+
+ Integer(KIND=C_INT), VALUE :: ncid, varid, no_fill
+ Type(C_PTR),         VALUE :: cfill_value_p
+
+ Integer(KIND=C_INT)        :: nc_def_var_fill
+
+ End Function nc_def_var_fill
+End Interface
+!------------------------------- nc_inq_var_fill ------------------------------
+Interface
+ Function nc_inq_var_fill(ncid, varid, no_fill, fill_value) BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_INT, C_CHAR
+
+ Integer(KIND=C_INT),    VALUE         :: ncid, varid
+ Integer(KIND=C_INT),    Intent(INOUT) :: no_fill
+ Character(KIND=C_CHAR), Intent(INOUT) :: fill_value(*)
+
+ Integer(KIND=C_INT)                   :: nc_inq_var_fill
+
+ End Function nc_inq_var_fill
+End Interface
+!------------------------------- nc_inq_var_szip ------------------------------
+Interface
+ Function nc_inq_var_szip(ncid, varid, options_mask, pixels_per_block) BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_INT
+
+ Integer(KIND=C_INT), VALUE         :: ncid, varid
+ Integer(KIND=C_INT), Intent(INOUT) :: options_mask, pixels_per_block 
+
+ Integer(KIND=C_INT)                :: nc_inq_var_szip
+
+ End Function nc_inq_var_szip
+End Interface
+!------------------------------- nc_def_var_fletcher32 ------------------------
+Interface
+ Function nc_def_var_fletcher32(ncid, varid, fletcher32) BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_INT
+
+ Integer(KIND=C_INT), VALUE :: ncid, varid, fletcher32
+
+ Integer(KIND=C_INT)        :: nc_def_var_fletcher32
+
+ End Function nc_def_var_fletcher32
+End Interface
+!------------------------------- nc_inq_var_fletcher32 ------------------------
+Interface
+ Function nc_inq_var_fletcher32(ncid, varid, fletcher32) BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_INT
+
+ Integer(KIND=C_INT), VALUE         :: ncid, varid
+ Integer(KIND=C_INT), Intent(INOUT) :: fletcher32
+
+ Integer(KIND=C_INT)                :: nc_inq_var_fletcher32
+
+ End Function nc_inq_var_fletcher32
+End Interface
+!------------------------------- nc_def_var_deflate ---------------------------
+Interface
+ Function nc_def_var_deflate(ncid, varid, shuffle, deflate, deflate_level) BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_INT
+
+ Integer(KIND=C_INT), VALUE :: ncid, varid, shuffle, deflate, deflate_level
+
+ Integer(KIND=C_INT)        :: nc_def_var_deflate
+
+ End Function nc_def_var_deflate
+End Interface
+!------------------------------- nc_inq_var_deflate ---------------------------
+Interface
+ Function nc_inq_var_deflate(ncid, varid, shuffle, deflate, deflate_level) BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_INT
+
+ Integer(KIND=C_INT), VALUE         :: ncid, varid
+ Integer(KIND=C_INT), Intent(INOUT) :: shuffle, deflate, deflate_level
+
+ Integer(KIND=C_INT)                :: nc_inq_var_deflate
+
+ End Function nc_inq_var_deflate
+End Interface
+!------------------------------- nc_def_var_chunking --------------------------
+Interface
+ Function nc_def_var_chunking(ncid, varid, contiguousp, chunksizesp) BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_INT, C_SIZE_T
+
+ Integer(KIND=C_INT),    VALUE         :: ncid, varid, contiguousp
+ Integer(KIND=C_SIZE_T), Intent(INOUT) :: chunksizesp
+
+ Integer(KIND=C_INT)                   :: nc_def_var_chunking
+
+ End Function nc_def_var_chunking
+End Interface
+!------------------------------- nc_inq_var_chunking --------------------------
+Interface
+ Function nc_inq_var_chunking(ncid, varid, contiguousp, chunksizesp) BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_INT, C_SIZE_T
+
+ Integer(KIND=C_INT),    VALUE         :: ncid, varid
+ Integer(KIND=C_INT),    Intent(INOUT) :: contiguousp
+ Integer(KIND=C_SIZE_T), Intent(INOUT) :: chunksizesp(*)
+
+ Integer(KIND=C_INT)                   :: nc_inq_var_chunking
+
+ End Function nc_inq_var_chunking
+End Interface
+!------------------------------- nc_def_var_chunking_ints ---------------------
+Interface
+ Function nc_def_var_chunking_ints(ncid, varid, contiguousp, chunksizesp) BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_INT, C_PTR
+
+ Integer(KIND=C_INT), VALUE :: ncid, varid, contiguousp
+ Type(C_PTR),         VALUE :: chunksizesp
+
+ Integer(KIND=C_INT)        :: nc_def_var_chunking_ints
+
+ End Function nc_def_var_chunking_ints
+End Interface
+!------------------------------- nc_inq_var_chunking_ints ---------------------
+Interface
+ Function nc_inq_var_chunking_ints(ncid, varid, contiguousp, chunksizesp) BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_INT
+
+ Integer(KIND=C_INT), VALUE         :: ncid, varid
+ Integer(KIND=C_INT), Intent(INOUT) :: contiguousp
+ Integer(KIND=C_INT), Intent(INOUT) :: chunksizesp(*)
+
+ Integer(KIND=C_INT)                :: nc_inq_var_chunking_ints
+
+ End Function nc_inq_var_chunking_ints
+End Interface
+!------------------------------- nc_def_var_endian --------------------------
+Interface
+ Function nc_def_var_endian(ncid, varid, endiann) BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_INT
+
+ Integer(KIND=C_INT), VALUE :: ncid, varid, endiann
+
+ Integer(KIND=C_INT)        :: nc_def_var_endian
+
+ End Function nc_def_var_endian
+End Interface
+!------------------------------- nc_inq_var_endian --------------------------
+Interface
+ Function nc_inq_var_endian(ncid, varid, endiann) BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_INT
+
+ Integer(KIND=C_INT), VALUE         :: ncid, varid
+ Integer(KIND=C_INT), Intent(INOUT) :: endiann
+
+ Integer(KIND=C_INT)                :: nc_inq_var_endian
+
+ End Function nc_inq_var_endian
+End Interface
+!------------------------------- nc_put_att -----------------------------------
+Interface
+ Function nc_put_att(ncid, varid, name, xtype, nlen, op) BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_INT, C_CHAR, C_SIZE_T, C_PTR
+
+ Integer(KIND=C_INT),    VALUE      :: ncid, varid, xtype
+ Integer(KIND=C_SIZE_T), VALUE      :: nlen
+ Character(KIND=C_CHAR), Intent(IN) :: name(*)
+ Type(C_PTR),            VALUE      :: op
+
+ Integer(KIND=C_INT)                :: nc_put_att
+
+ End Function nc_put_att
+End Interface
+!------------------------------- nc_get_att -----------------------------------
+Interface
+ Function nc_get_att(ncid, varid, name, op) BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_INT, C_CHAR
+
+ Integer(KIND=C_INT),    VALUE       :: ncid, varid
+ Character(KIND=C_CHAR), Intent(IN)  :: name(*)
+ Character(KIND=C_CHAR), Intent(OUT) :: op(*)
+
+ Integer(KIND=C_INT)                 :: nc_get_att
+
+ End Function nc_get_att
+End Interface
+!------------------------------- nc_put_vlen_element --------------------------
+Interface
+ Function nc_put_vlen_element(ncid, xtype, vlen_element, nlen, op) BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_INT, C_SIZE_T, C_PTR, C_CHAR
+
+ Integer(KIND=C_INT),    VALUE         :: ncid, xtype 
+ Integer(KIND=C_SIZE_T), VALUE         :: nlen 
+ Character(KIND=C_CHAR), INTENT(INOUT) :: vlen_element(*)
+ Type(C_PTR),            VALUE         :: op
+
+ Integer(KIND=C_INT)                   :: nc_put_vlen_element
+
+ End Function nc_put_vlen_element
+End Interface
+!------------------------------- nc_get_vlen_element --------------------------
+Interface
+ Function nc_get_vlen_element(ncid, xtype, vlen_element, nlen, op) BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_INT, C_CHAR, C_SIZE_T, C_PTR
+
+ Integer(KIND=C_INT),    VALUE         :: ncid, xtype 
+ Integer(KIND=C_SIZE_T), Intent(INOUT) :: nlen 
+ Character(KIND=C_CHAR), INTENT(INOUT) :: vlen_element(*)
+ Character(KIND=C_CHAR), Intent(INOUT) :: op(*)
+
+ Integer(KIND=C_INT)                   :: nc_get_vlen_element
+
+ End Function nc_get_vlen_element
+End Interface
+!------------------------------- nc_free_vlen ---------------------------------
+Interface
+ Function nc_free_vlen(vl) BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_PTR, C_INT
+
+ Type(C_PTR), VALUE  :: vl
+
+ Integer(KIND=C_INT) :: nc_free_vlen
+
+ End Function nc_free_vlen
+End Interface
+!------------------------------- nc_free_vlens -------------------------------
+Interface
+ Function nc_free_vlens(len, vl) BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_PTR, C_INT, C_SIZE_T
+  
+ Integer(C_SIZE_T), Intent(IN) :: len
+ Type(C_PTR),       VALUE      :: vl
+
+ Integer(KIND=C_INT)           :: nc_free_vlens
+
+ End Function nc_free_vlens
+End Interface
+!------------------------------- nc_free_string ------------------------------
+Interface
+ Function nc_free_string(len, vl) BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_PTR, C_INT, C_SIZE_T
+  
+ Integer(C_SIZE_T), Intent(IN) :: len
+ Type(C_PTR),       VALUE      :: vl
+
+ Integer(KIND=C_INT)           :: nc_free_string
+
+ End Function nc_free_string
+End Interface
+!------------------------------- nc_put_var1_longlong -------------------------
+Interface
+ Function nc_put_var1_longlong(ncid, varid, indexp, op) BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_INT, C_LONG_LONG, C_PTR
+
+ Integer(KIND=C_INT),       VALUE      :: ncid, varid
+ Type(C_PTR),               VALUE      :: indexp
+ Integer(KIND=C_LONG_LONG), Intent(IN) :: op
+
+ Integer(KIND=C_INT)                   :: nc_put_var1_longlong
+
+ End Function nc_put_var1_longlong
+End Interface
+!------------------------------- nc_get_var1_longlong -------------------------
+Interface
+ Function nc_get_var1_longlong(ncid, varid, indexp, ip) BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_INT, C_LONG_LONG, C_PTR
+
+ Integer(KIND=C_INT),       VALUE       :: ncid, varid
+ Type(C_PTR),               VALUE       :: indexp
+ Integer(KIND=C_LONG_LONG), Intent(OUT) :: ip
+
+ Integer(KIND=C_INT)                    :: nc_get_var1_longlong
+
+ End Function nc_get_var1_longlong
+End Interface
+!--------------------------------- nc_put_vara_longlong -----------------------
+Interface
+ Function nc_put_vara_longlong(ncid, varid, startp, countp, op) BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_INT, C_LONG_LONG, C_PTR
+
+ Integer(KIND=C_INT),       VALUE      :: ncid, varid
+ Type(C_PTR),               VALUE      :: startp, countp
+ Integer(KIND=C_LONG_LONG), Intent(IN) :: op(*)
+
+ Integer(KIND=C_INT)                   :: nc_put_vara_longlong
+
+ End Function nc_put_vara_longlong
+End Interface
+!--------------------------------- nc_get_vara_longlong -----------------------
+Interface
+ Function nc_get_vara_longlong(ncid, varid, startp, countp, ip) BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_INT, C_LONG_LONG, C_PTR
+
+ Integer(KIND=C_INT),       VALUE       :: ncid, varid
+ Type(C_PTR),               VALUE       :: startp, countp
+ Integer(KIND=C_LONG_LONG), Intent(OUT) :: ip(*)
+
+ Integer(KIND=C_INT)                    :: nc_get_vara_longlong
+
+ End Function nc_get_vara_longlong
+End Interface
+!--------------------------------- nc_put_varm_longlong ----------------------
+Interface
+ Function nc_put_varm_longlong(ncid, varid, startp, countp, stridep, imapp, &
+                               op) BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_INT, C_PTR, C_LONG_LONG
+
+ Integer(KIND=C_INT),       VALUE      :: ncid, varid
+ Type(C_PTR),               VALUE      :: startp, countp, stridep, imapp
+ Integer(KIND=C_LONG_LONG), Intent(IN) :: op(*)
+
+ Integer(KIND=C_INT)                   :: nc_put_varm_longlong
+
+ End Function nc_put_varm_longlong
+End Interface
+!--------------------------------- nc_get_varm_longlong -----------------------
+Interface
+ Function nc_get_varm_longlong(ncid, varid, startp, countp, stridep, imapp, &
+                               ip) BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_INT, C_PTR, C_LONG_LONG
+
+ Integer(KIND=C_INT),       VALUE       :: ncid, varid
+ Type(C_PTR),               VALUE       :: startp, countp, stridep, imapp
+ Integer(KIND=C_LONG_LONG), Intent(OUT) :: ip(*)
+
+ Integer(KIND=C_INT)                    :: nc_get_varm_longlong
+
+ End Function nc_get_varm_longlong
+End Interface
+!--------------------------------- nc_put_vars_longlong -----------------------
+Interface
+ Function nc_put_vars_longlong(ncid, varid, startp, countp, stridep, op) BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_INT, C_PTR, C_LONG_LONG
+
+ Integer(KIND=C_INT),       VALUE      :: ncid, varid
+ Type(C_PTR),               VALUE      :: startp, countp, stridep
+ Integer(KIND=C_LONG_LONG), Intent(IN) :: op(*)
+
+ Integer(KIND=C_INT)                   :: nc_put_vars_longlong
+
+ End Function nc_put_vars_longlong
+End Interface
+!--------------------------------- nc_get_vars_longlong -----------------------
+Interface
+ Function nc_get_vars_longlong(ncid, varid, startp, countp, stridep, ip) BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_INT, C_PTR, C_LONG_LONG
+
+ Integer(KIND=C_INT),       VALUE       :: ncid, varid
+ Type(C_PTR),               VALUE       :: startp, countp, stridep
+ Integer(KIND=C_LONG_LONG), Intent(OUT) :: ip(*)
+
+ Integer(KIND=C_INT)                    :: nc_get_vars_longlong
+
+ End Function nc_get_vars_longlong
+End Interface
+!------------------------------- nc_put_var_longlong --------------------------
+Interface
+ Function nc_put_var_longlong(ncid, varid, op) BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_INT, C_LONG_LONG
+
+ Integer(KIND=C_INT),       VALUE      :: ncid, varid
+ Integer(KIND=C_LONG_LONG), Intent(IN) :: op(*)
+
+ Integer(KIND=C_INT)                   :: nc_put_var_longlong
+
+ End Function nc_put_var_longlong
+End Interface
+!------------------------------- nc_get_var_longlong --------------------------
+Interface
+ Function nc_get_var_longlong(ncid, varid, ip) BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_INT, C_LONG_LONG
+
+ Integer(KIND=C_INT),       VALUE       :: ncid, varid
+ Integer(KIND=C_LONG_LONG), Intent(OUT) :: ip(*)
+
+ Integer(KIND=C_INT)                    :: nc_get_var_longlong
+
+ End Function nc_get_var_longlong
+End Interface
+!------------------------------- nc_set_chunk_cache_ints ----------------------
+Interface
+ Function nc_set_chunk_cache_ints(size, nelems, preemption) BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_INT
+
+ Integer(KIND=C_INT), VALUE :: size, nelems, preemption 
+
+ Integer(KIND=C_INT)        :: nc_set_chunk_cache_ints
+
+ End Function nc_set_chunk_cache_ints
+End Interface
+!------------------------------- nc_get_chunk_cache_ints ----------------------
+Interface
+ Function nc_get_chunk_cache_ints(size, nelems, preemption) BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_INT
+
+ Integer(KIND=C_INT), Intent(INOUT) :: size, nelems, preemption 
+
+ Integer(KIND=C_INT)                :: nc_get_chunk_cache_ints
+
+ End Function nc_get_chunk_cache_ints
+End Interface
+!------------------------------- nc_set_var_chunk_cache_ints ------------------
+Interface
+ Function nc_set_var_chunk_cache_ints(ncid, varid, size, nelems, preemption) BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_INT
+
+ Integer(KIND=C_INT), VALUE :: ncid, varid, size, nelems, preemption 
+
+ Integer(KIND=C_INT)        :: nc_set_var_chunk_cache_ints
+
+ End Function nc_set_var_chunk_cache_ints
+End Interface
+!------------------------------- nc_get_var_chunk_cache_ints ------------------
+Interface
+ Function nc_get_var_chunk_cache_ints(ncid, varid, size, nelems, preemption) BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_INT
+
+ Integer(KIND=C_INT), VALUE         :: ncid, varid
+ Integer(KIND=C_INT), Intent(INOUT) :: size, nelems, preemption
+ Integer(KIND=C_INT)                :: nc_get_var_chunk_cache_ints
+
+ End Function nc_get_var_chunk_cache_ints
+End Interface
+!------------------------------- nc_set_chunk_cache ---------------------------
+Interface
+ Function nc_set_chunk_cache(size, nelems, preemption) BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_SIZE_T, C_FLOAT, C_INT
+
+ Integer(KIND=C_SIZE_T), VALUE :: size, nelems
+ Real(KIND=C_FLOAT),     VALUE :: preemption 
+
+ Integer(KIND=C_INT)           :: nc_set_chunk_cache
+
+ End Function nc_set_chunk_cache
+End Interface
+!------------------------------- nc_get_chunk_cache ---------------------------
+Interface
+ Function nc_get_chunk_cache(size, nelems, preemption) BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_SIZE_T, C_FLOAT, C_INT
+
+ Integer(KIND=C_SIZE_T), Intent(INOUT) :: size, nelems
+ Real(KIND=C_FLOAT),     Intent(INOUT) :: preemption 
+
+ Integer(KIND=C_INT)                   :: nc_get_chunk_cache
+
+ End Function nc_get_chunk_cache
+End Interface
+!---------------------------------- nc_put_var --------------------------------
+Interface
+ Function nc_put_var(ncid, varid, op) BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_INT, C_PTR
+
+ Integer(KIND=C_INT), VALUE :: ncid, varid
+ Type(C_PTR),         VALUE :: op
+
+ Integer(KIND=C_INT)        :: nc_put_var
+
+ End Function nc_put_var
+End Interface
+!---------------------------------- nc_get_var --------------------------------
+Interface
+ Function nc_get_var(ncid, varid, ip) BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_INT, C_CHAR
+
+ Integer(KIND=C_INT),    VALUE         :: ncid, varid
+ Character(KIND=C_CHAR), Intent(INOUT) :: ip(*)
+
+ Integer(KIND=C_INT)                   :: nc_get_var
+
+ End Function nc_get_var
+End Interface
+
+!--------------------------End of Module netcdf4_c_interfaces -----------------
+End Module netcdf4_nc_interfaces
diff --git a/fortran/module_netcdf4_nf_interfaces.F90 b/fortran/module_netcdf4_nf_interfaces.F90
new file mode 100755
index 0000000..6dcb9f1
--- /dev/null
+++ b/fortran/module_netcdf4_nf_interfaces.F90
@@ -0,0 +1,929 @@
+Module netcdf4_nf_interfaces
+
+! Explicit interfaces for Netcdf4 FORTRAN 2003 nf FORTRAN interface routines
+
+! We exclude functions for netCDF4 that pass data of any type to/from void
+! pointers in C using a C_CHAR string array. We do provide external statements
+! for these routines 
+
+! Written by: Richard Weed, Ph.D.
+!             Center for Advanced Vehicular Systems 
+!             Mississippi State University
+!             rweed at cavs.msstate.edu
+!
+! The author grants to the University Center for Atmospheric Research
+! (UCAR), Boulder, CO, USA the right to revise and extend the software
+! without restriction. However, the author retains all copyrights and
+! intellectual property rights explicitly stated in or implied by the
+! Apache license
+
+! Version 1. April 2009 - Initial module based on netCDF 4.0.1 interfaces
+!                         A separate module is required to avoid a
+!                         module dependency problem
+! Version 2. April 2010 - Updated to Netcdf 4.1.1
+! Version 3. Aug.  2013 - Made nf_def_var_fill and nf_inq_var_fill external
+!                         to support new nf90_ non-integer fill characters
+!                         Added interface for new nf_rename_grp function 
+!                         Changed interface type defs to USE netcdf_nf_data
+
+! Most legacy programs don't need to use this module. However, I've created
+! it to support FORTRAN programmers who like to provide explicit interfaces
+! for all subroutines and functions in their codes. Therefore, this module is
+! is primarily for people writing new programs.
+
+!           Explicit interfaces to netCDF 4 specific FORTRAN functions
+
+!-------------------------------- nf_create_par -------------------------------
+Interface
+ Function nf_create_par (path, cmode, comm, info, ncid) RESULT(status)
+
+ Integer,          Intent(IN)  :: cmode, comm, info
+ Character(LEN=*), Intent(IN)  :: path
+ Integer,          Intent(OUT) :: ncid
+ Integer                       :: status
+
+ End Function nf_create_par
+End Interface
+!-------------------------------- nf_open_par --------------------------------
+Interface
+ Function nf_open_par (path, mode, comm, info, ncid) RESULT(status)
+
+ Integer,          Intent(IN)  :: mode, comm, info
+ Character(LEN=*), Intent(IN)  :: path
+ Integer,          Intent(OUT) :: ncid
+ Integer                       :: status
+
+ End Function nf_open_par
+End Interface
+!-------------------------------- nf_var_par_access -------------------------
+Interface
+ Function nf_var_par_access( ncid, varid, iaccess) RESULT (status)
+
+ Integer, Intent(IN) :: ncid, varid, iaccess
+ Integer             :: status
+
+ End Function nf_var_par_access
+End Interface
+!-------------------------------- nf_inq_ncid ---------------------------------
+Interface
+ Function nf_inq_ncid( ncid, name, groupid) RESULT (status)
+
+ Integer,          Intent(IN)  :: ncid
+ Character(LEN=*), Intent(IN)  :: name
+ Integer,          Intent(OUT) :: groupid
+ Integer                       :: status
+
+ End Function nf_inq_ncid
+End Interface
+!-------------------------------- nf_inq_grps ---------------------------------
+Interface
+ Function nf_inq_grps( ncid, numgrps, ncids) RESULT (status)
+
+ Integer, Intent(IN)    :: ncid
+ Integer, Intent(OUT)   :: numgrps
+ Integer, Intent(INOUT) :: ncids(*)
+ Integer                :: status
+
+ End Function nf_inq_grps
+End Interface
+!-------------------------------- nf_inq_grpname ------------------------------
+Interface
+ Function nf_inq_grpname( ncid, name) RESULT (status)
+
+ Integer,          Intent(IN)  :: ncid
+ Character(LEN=*), Intent(OUT) :: name
+ Integer                       :: status
+
+ End Function nf_inq_grpname
+End Interface
+!-------------------------------- nf_inq_grpname_full -------------------------
+Interface
+ Function nf_inq_grpname_full( ncid, nlen, name) RESULT (status)
+
+ Integer,          Intent(IN)  :: ncid
+ Integer,          Intent(OUT) :: nlen 
+ Character(LEN=*), Intent(OUT) :: name
+ Integer                       :: status
+
+ End Function nf_inq_grpname_full
+End Interface
+!-------------------------------- nf_inq_grpname_len -------------------------
+Interface
+ Function nf_inq_grpname_len( ncid, nlen) RESULT (status)
+
+ Integer, Intent(IN)  :: ncid
+ Integer, Intent(OUT) :: nlen 
+ Integer              :: status
+
+ End Function nf_inq_grpname_len
+End Interface
+!-------------------------------- nf_inq_grp_parent ---------------------------
+Interface
+ Function nf_inq_grp_parent( ncid,parent_ncid) RESULT (status)
+
+ Integer, Intent(IN)    :: ncid
+ Integer, Intent(INOUT) :: parent_ncid
+ Integer                :: status
+
+ End Function nf_inq_grp_parent
+End Interface
+!-------------------------------- nf_inq_grp_full_ncid ------------------------
+Interface
+ Function nf_inq_grp_full_ncid( ncid, grp_name, grp_ncid) RESULT (status)
+
+ Integer,          Intent(IN)    :: ncid
+ Character(LEN=*), Intent(IN)    :: grp_name
+ Integer,          Intent(INOUT) :: grp_ncid
+ Integer                         :: status
+
+ End Function nf_inq_grp_full_ncid
+End Interface
+!-------------------------------- nf_inq_grp_ncid -----------------------------
+Interface
+ Function nf_inq_grp_ncid( ncid, grp_name, parent_ncid) RESULT (status)
+
+ Integer,          Intent(IN)    :: ncid
+ Character(LEN=*), Intent(IN)    :: grp_name
+ Integer,          Intent(INOUT) :: parent_ncid
+ Integer                         :: status
+
+ End Function nf_inq_grp_ncid
+End Interface
+!-------------------------------- nf_inq_varids -------------------------------
+Interface
+ Function nf_inq_varids( ncid, nvars, varids) RESULT (status)
+
+ Integer, Intent(IN)    :: ncid
+ Integer, Intent(OUT)   :: nvars 
+ Integer, Intent(INOUT) :: varids(*)
+ Integer                :: status
+
+ End Function nf_inq_varids
+End Interface
+!-------------------------------- nf_inq_dimids -------------------------------
+Interface
+ Function nf_inq_dimids( ncid, ndims, dimids, include_parents) RESULT (status)
+
+ Integer, Intent(IN)    :: ncid, include_parents
+ Integer, Intent(OUT)   :: ndims
+ Integer, Intent(INOUT) :: dimids(*)
+ Integer                :: status
+
+ End Function nf_inq_dimids
+End Interface
+!-------------------------------- nf_inq_typeids ------------------------------
+Interface
+ Function nf_inq_typeids( ncid, ntypes, typeids) RESULT (status)
+
+ Integer, Intent(IN)    :: ncid
+ Integer, Intent(OUT)   :: ntypes
+ Integer, Intent(INOUT) :: typeids(*)
+ Integer                :: status
+
+ End Function nf_inq_typeids
+End Interface
+!-------------------------------- nf_inq_typeid ------------------------------
+Interface
+ Function nf_inq_typeid(ncid, name, typeid) RESULT (status)
+
+ Integer,          Intent(IN)  :: ncid 
+ Character(LEN=*), Intent(IN)  :: name
+ Integer,          Intent(OUT) :: typeid
+ Integer                       :: status
+
+ End Function nf_inq_typeid
+End Interface
+!-------------------------------- nf_def_grp ---------------------------------
+Interface
+ Function nf_def_grp( parent_ncid, name, new_ncid) RESULT (status)
+
+ Integer,          Intent(IN)  :: parent_ncid
+ Character(LEN=*), Intent(IN)  :: name
+ Integer,          Intent(OUT) :: new_ncid
+ Integer                       :: status
+
+ End Function nf_def_grp
+End Interface
+!-------------------------------- nf_rename_grp -------------------------------
+Interface
+ Function nf_rename_grp( grpid, name) RESULT (status)
+
+! rename previously defined group
+
+ USE netcdf4_nc_interfaces
+
+ Implicit NONE
+
+ Integer,          Intent(IN)  :: grpid
+ Character(LEN=*), Intent(IN)  :: name
+ Integer                       :: status
+
+ End Function nf_rename_grp
+End Interface
+!-------------------------------- nf_def_compound -----------------------------
+Interface
+ Function nf_def_compound( ncid, isize, name, typeid) RESULT (status)
+
+ Integer,          Intent(IN)  :: ncid, isize
+ Character(LEN=*), Intent(IN)  :: name
+ Integer,          Intent(OUT) :: typeid 
+ Integer                       :: status
+
+ End Function nf_def_compound
+End Interface
+!-------------------------------- nf_insert_compound --------------------------
+Interface
+ Function nf_insert_compound( ncid, xtype, name, offset, field_typeid) &
+                              RESULT (status)
+
+ Integer,          Intent(IN) :: ncid, xtype, field_typeid, offset 
+ Character(LEN=*), Intent(IN) :: name
+ Integer                      :: status
+
+ End Function nf_insert_compound
+End Interface
+!-------------------------------- nf_insert_array_compound --------------------
+Interface
+ Function nf_insert_array_compound( ncid, xtype, name, offset, field_typeid, &
+                                    ndims, dim_sizes) RESULT (status)
+
+ Integer,          Intent(IN)    :: ncid, xtype, field_typeid, offset, ndims
+ Integer,          Intent(INOUT) :: dim_sizes(*)
+ Character(LEN=*), Intent(IN)    :: name
+ Integer                         :: status
+
+ End Function nf_insert_array_compound
+End Interface
+!-------------------------------- nf_inq_type ---------------------------------
+Interface
+ Function nf_inq_type( ncid, xtype, name, isize) RESULT (status)
+
+ Integer,          Intent(IN)  :: ncid, xtype
+ Character(LEN=*), Intent(IN)  :: name
+ Integer,          Intent(OUT) :: isize
+ Integer                       :: status
+
+ End Function nf_inq_type
+End Interface
+!-------------------------------- nf_inq_compound -----------------------------
+Interface
+ Function nf_inq_compound( ncid, xtype, name, isize, nfields) RESULT (status)
+
+ Integer,          Intent(IN)    :: ncid, xtype
+ Character(LEN=*), Intent(INOUT) :: name
+ Integer,          Intent(INOUT) :: isize, nfields
+ Integer                         :: status
+
+ End Function nf_inq_compound
+End Interface
+!-------------------------------- nf_inq_compound_name ------------------------
+Interface
+ Function nf_inq_compound_name( ncid, xtype, name) RESULT (status)
+
+ Integer,          Intent(IN)  :: ncid, xtype
+ Character(LEN=*), Intent(OUT) :: name
+ Integer                       :: status
+
+ End Function nf_inq_compound_name
+End Interface
+!-------------------------------- nf_inq_compound_size -------------------------
+Interface
+ Function nf_inq_compound_size( ncid, xtype, isize) RESULT (status)
+
+ Integer, Intent(IN)    :: ncid, xtype
+ Integer, Intent(INOUT) :: isize
+ Integer                :: status
+
+ End Function nf_inq_compound_size
+End Interface
+!-------------------------------- nf_inq_compound_nfields ----------------------
+Interface
+ Function nf_inq_compound_nfields( ncid, xtype, nfields) RESULT (status)
+
+ Integer, Intent(IN)    :: ncid, xtype
+ Integer, Intent(INOUT) :: nfields
+ Integer                :: status
+
+ End Function nf_inq_compound_nfields
+End Interface
+!-------------------------------- nf_inq_compound_field -----------------------
+Interface
+ Function nf_inq_compound_field( ncid, xtype, fieldid, name, offset, &
+                                field_typeid, ndims, dim_sizes) RESULT (status)
+
+ Integer,          Intent(IN)  :: ncid, xtype, fieldid
+ Character(LEN=*), Intent(OUT) :: name
+ Integer,          Intent(OUT) :: offset, field_typeid, ndims
+ Integer,          Intent(OUT) :: dim_sizes(*)
+ Integer                       :: status
+
+ End Function nf_inq_compound_field
+End Interface
+!-------------------------------- nf_inq_compound_fieldname -------------------
+Interface
+ Function nf_inq_compound_fieldname(ncid, xtype, fieldid, name) RESULT(status)
+
+ Integer,          Intent(IN)  :: ncid, xtype, fieldid
+ Character(LEN=*), Intent(OUT) :: name
+ Integer                       :: status
+
+ End Function nf_inq_compound_fieldname
+End Interface
+!-------------------------------- nf_inq_compound_fieldindex ------------------
+Interface
+ Function nf_inq_compound_fieldindex( ncid, xtype, name, fieldid) &
+                                      RESULT (status)
+
+ Integer,          Intent(IN)  :: ncid, xtype
+ Character(LEN=*), Intent(IN)  :: name
+ Integer,          Intent(OUT) :: fieldid
+ Integer                       :: status
+
+ End Function nf_inq_compound_fieldindex
+End Interface
+!-------------------------------- nf_inq_compound_fieldoffset ----------------
+Interface
+ Function nf_inq_compound_fieldoffset( ncid, xtype, fieldid, offset) &
+                                      RESULT (status)
+
+ Integer, Intent(IN)  :: ncid, xtype, fieldid
+ Integer, Intent(OUT) :: offset
+ Integer              :: status
+
+ End Function nf_inq_compound_fieldoffset
+End Interface
+!-------------------------------- nf_inq_compound_fieldtype -------------------
+Interface
+ Function nf_inq_compound_fieldtype( ncid, xtype, fieldid, field_typeid) &
+                                     RESULT (status)
+
+ Integer, Intent(IN)  :: ncid, xtype, fieldid
+ Integer, Intent(OUT) :: field_typeid
+ Integer              :: status
+
+ End Function nf_inq_compound_fieldtype
+End Interface
+!-------------------------------- nf_inq_compound_fieldndims ------------------
+Interface
+ Function nf_inq_compound_fieldndims( ncid, xtype, fieldid, ndims) &
+                                      RESULT (status)
+
+ Integer, Intent(IN)  :: ncid, xtype, fieldid
+ Integer, Intent(OUT) :: ndims
+ Integer              :: status
+
+ End Function nf_inq_compound_fieldndims
+End Interface
+!-------------------------------- nf_inq_compound_fielddim_sizes --------------
+Interface
+ Function nf_inq_compound_fielddim_sizes( ncid, xtype, fieldid, dim_sizes) &
+                                          RESULT (status)
+
+ Integer, Intent(IN)    :: ncid, xtype, fieldid
+ Integer, Intent(INOUT) :: dim_sizes(*)
+ Integer                :: status
+
+ End Function nf_inq_compound_fielddim_sizes
+End Interface
+!-------------------------------- nf_def_vlen ---------------------------------
+Interface
+ Function nf_def_vlen( ncid, name, base_typeid, xtype) RESULT (status)
+
+ Integer,          Intent(IN)  :: ncid, base_typeid 
+ Character(LEN=*), Intent(IN)  :: name
+ Integer,          Intent(OUT) :: xtype
+ Integer                       :: status
+
+ End Function nf_def_vlen
+End Interface
+!-------------------------------- nf_inq_vlen ---------------------------------
+Interface
+ Function nf_inq_vlen( ncid, xtype, name, datum_size, base_type) RESULT(status) 
+
+ Integer,          Intent(IN)  :: ncid, xtype
+ Character(LEN=*), Intent(OUT) :: name
+ Integer,          Intent(OUT) :: datum_size, base_type
+ Integer                       :: status
+
+ End Function nf_inq_vlen
+End Interface
+!-------------------------------- nf_inq_user_type ----------------------------
+Interface
+ Function nf_inq_user_type( ncid, xtype, name, isize, base_type, nfields, &
+                            iclass) RESULT (status)
+
+ Integer,          Intent(IN)    :: ncid, xtype
+ Character(LEN=*), Intent(INOUT) :: name
+ Integer,          Intent(OUT)   :: isize, nfields, base_type, iclass
+ Integer                         :: status
+
+ End Function nf_inq_user_type
+End Interface
+!-------------------------------- nf_def_enum ---------------------------------
+Interface
+ Function nf_def_enum( ncid, base_typeid, name, typeid) RESULT (status)
+
+ Integer,          Intent(IN)  :: ncid, base_typeid 
+ Character(LEN=*), Intent(IN)  :: name
+ Integer,          Intent(OUT) :: typeid
+ Integer                       :: status
+
+ End Function nf_def_enum
+End Interface
+!-------------------------------- nf_insert_enum -------------------------------
+! Commented out for now since we pass to/from a void pointer using
+! a C_CHAR string which will be non-compatible with different data
+! types being passed
+!Interface
+! Function nf_insert_enum( ncid, xtype, name, value) RESULT (status)
+
+! USE netcdf_nf_data
+
+! Integer,                Intent(IN)         :: ncid, xtype
+! Character(LEN=*),       Intent(IN)         :: name
+! Character(KIND=C_CHAR), Intent(IN), TARGET :: value(*)
+! Integer                                    :: status
+
+! End Function nf_insert_enum
+!End Interface
+!-------------------------------- nf_inq_enum ---------------------------------
+Interface
+ Function nf_inq_enum( ncid, xtype, name, base_nf_type, base_size, &
+                       num_members) RESULT (status)
+
+! USE netcdf_nf_data
+
+ Integer,          Intent(IN)    :: ncid, xtype
+ Character(LEN=*), Intent(INOUT) :: name
+ Integer,          Intent(INOUT) :: base_nf_type, base_size, num_members
+ Integer                         :: status
+
+ End Function nf_inq_enum
+End Interface
+!-------------------------------- nf_inq_enum_member --------------------------
+! Commented out for now since we pass to/from a void pointer using
+! a C_CHAR string which will be non-compatible with different data
+! types being passed
+!Interface
+! Function nf_inq_enum_member( ncid, xtype, idx, name, value) RESULT (status)
+
+! USE netcdf_nf_data
+
+! Integer,                Intent(IN)  :: ncid, xtype, idx
+! Character(LEN=*),       Intent(OUT) :: name
+! Character(KIND=C_CHAR), Intent(OUT) :: value(*)
+! Integer                             :: status
+
+! End Function nf_inq_enum_member
+!End Interface
+!-------------------------------- nf_inq_enum_ident --------------------------
+Interface
+ Function nf_inq_enum_ident( ncid, xtype, value, name) RESULT (status)
+
+ Integer,          Intent(IN)    :: ncid, xtype, value 
+ Character(LEN=*), Intent(INOUT) :: name
+ Integer                         :: status
+
+ End Function nf_inq_enum_ident
+End Interface
+!-------------------------------- nf_def_opaque -------------------------------
+Interface
+ Function nf_def_opaque( ncid, isize, name, xtype) RESULT (status)
+
+ Integer,          Intent(IN)  :: ncid, isize
+ Character(LEN=*), Intent(IN)  :: name
+ Integer,          Intent(OUT) :: xtype
+ Integer                       :: status
+
+ End Function nf_def_opaque
+End Interface
+!-------------------------------- nf_inq_opaque -------------------------------
+Interface
+ Function nf_inq_opaque( ncid, xtype, name, isize) RESULT (status)
+
+ Integer,          Intent(IN)    :: ncid, xtype
+ Character(LEN=*), Intent(INOUT) :: name
+ Integer,          Intent(OUT)   :: isize
+ Integer                         :: status
+
+ End Function nf_inq_opaque
+End Interface
+!-------------------------------- nf_def_var_chunking -------------------------
+Interface
+ Function nf_def_var_chunking( ncid, varid, contiguous, chunksizes) &
+                               RESULT(status)
+
+ Integer, Intent(IN)    :: ncid, varid, contiguous
+ Integer, Intent(INOUT) :: chunksizes(*)
+ Integer                :: status
+
+ End Function nf_def_var_chunking
+End Interface
+!-------------------------------- nf_inq_var_chunking -------------------------
+Interface
+ Function nf_inq_var_chunking( ncid, varid, contiguous, chunksizes) &
+                               RESULT (status)
+
+ Integer, Intent(IN)    :: ncid, varid
+ Integer, Intent(INOUT) :: contiguous
+ Integer, Intent(INOUT) :: chunksizes(*)
+ Integer                :: status
+
+ End Function nf_inq_var_chunking
+End Interface
+!-------------------------------- nf_def_var_deflate --------------------------
+Interface
+ Function nf_def_var_deflate( ncid, varid, shuffle, deflate, deflate_level) &
+                               RESULT (status)
+
+ Integer, Intent(IN) :: ncid, varid, shuffle, deflate, deflate_level
+ Integer             :: status
+
+ End Function nf_def_var_deflate
+End Interface
+!-------------------------------- nf_inq_var_deflate -------------------------
+Interface
+ Function nf_inq_var_deflate( ncid, varid, shuffle, deflate, deflate_level) &
+                               RESULT (status)
+
+ Integer, Intent(IN)  :: ncid, varid
+ Integer, Intent(OUT) :: shuffle, deflate, deflate_level
+ Integer              :: status
+
+ End Function nf_inq_var_deflate
+End Interface
+!-------------------------------- nf_inq_var_szip -----------------------------
+Interface
+ Function nf_inq_var_szip(ncid, varid, options_mask, pixels_per_block) RESULT(status)
+
+ Implicit NONE
+
+ Integer, Intent(IN)    :: ncid, varid
+ Integer, Intent(INOUT) :: options_mask, pixels_per_block
+ Integer                :: status
+
+ End Function nf_inq_var_szip
+End Interface
+!-------------------------------- nf_def_var_fletcher32 ------------------------
+Interface
+ Function nf_def_var_fletcher32( ncid, varid, fletcher32) RESULT(status)
+
+ Integer, Intent(IN) :: ncid, varid, fletcher32
+ Integer             :: status
+
+ End Function nf_def_var_fletcher32
+End Interface
+!-------------------------------- nf_inq_var_fletcher32 ------------------------
+Interface
+ Function nf_inq_var_fletcher32( ncid, varid, fletcher32) RESULT(status)
+
+ Integer, Intent(IN)  :: ncid, varid
+ Integer, Intent(OUT) :: fletcher32
+ Integer              :: status
+
+ End Function nf_inq_var_fletcher32
+End Interface
+!-------------------------------- nf_def_var_fill -----------------------------
+!Interface
+! Function nf_def_var_fill( ncid, varid, no_fill, fill_value) RESULT(status)
+
+! Integer, Intent(IN)    :: ncid, varid, no_fill
+! Integer, Intent(IN)    :: fill_value 
+! Integer                :: status
+
+! End Function nf_def_var_fill
+!End Interface
+!-------------------------------- nf_inq_var_fill -----------------------------
+!Interface
+! Function nf_inq_var_fill( ncid, varid, no_fill, fill_value) RESULT(status)
+
+! Integer, Intent(IN)    :: ncid, varid
+! Integer, Intent(OUT)   :: no_fill
+! Integer, Intent(INOUT) :: fill_value 
+! Integer                :: status
+
+! End Function nf_inq_var_fill
+!End Interface
+!-------------------------------- nf_def_var_endian ---------------------------
+Interface
+ Function nf_def_var_endian( ncid, varid, endiann) RESULT(status)
+
+ Integer, Intent(IN) :: ncid, varid, endiann
+ Integer             :: status
+
+ End Function nf_def_var_endian
+End Interface
+!-------------------------------- nf_inq_var_endian ---------------------------
+Interface
+ Function nf_inq_var_endian( ncid, varid, endiann) RESULT(status)
+
+ Integer, Intent(IN)  :: ncid, varid
+ Integer, Intent(OUT) :: endiann
+ Integer              :: status
+
+ End Function nf_inq_var_endian
+End Interface
+!--------------------------------- nf_put_att --------------------------------
+! Commented out because we use C_CHAR array to pass data of different
+! type to a C void pointer
+!Interface
+! Function nf_put_att(ncid, varid, name, xtype, nlen, value) RESULT(status)
+ 
+! USE netcdf_nf_data
+
+! Integer,                Intent(IN)         :: ncid, varid, nlen, xtype
+! Character(LEN=*),       Intent(IN)         :: name
+! Character(KIND=C_CHAR), Intent(IN), TARGET :: value(*)
+! Integer                                    :: status
+
+! End Function nf_put_att
+!--------------------------------- nf_get_att --------------------------------
+! Commented out because we use C_CHAR array to pass data of different
+! type to a C void pointer
+!Interface
+! Function nf_get_att(ncid, varid, name, value) RESULT(status)
+
+! USE netcdf_nf_data
+
+! Implicit NONE
+
+! Integer,                Intent(IN)    :: ncid, varid
+! Character(LEN=*),       Intent(IN)    :: name
+! Character(KIND=C_CHAR), Intent(INOUT) :: value(*)
+! Integer                               :: status
+
+! End Function nf_get_att
+!End Interface
+!--------------------------------- nf_put_vlen_element ------------------------
+! Commented out because we use C_CHAR array to pass data of different
+! type to a C void pointer
+!Interface
+! Function nf_put_vlen_element(ncid, xtype, vlen_element, nlen, value)&
+!                               RESULT(status)
+
+! USE netcdf_nf_data
+
+! Integer,                Intent(IN)            :: ncid, xtype, nlen
+! Character(LEN=*),       Intent(INOUT), TARGET :: vlen_element
+! Character(KIND=C_CHAR), Intent(IN),    TARGET :: value(*)
+! Integer                                       :: status
+
+! End Function nf_put_vlen_element
+!End Interface
+!--------------------------------- nf_get_vlen_element ------------------------
+! Commented out because we use C_CHAR array to pass data of different
+! type to a C void pointer
+!Interface
+! Function nf_get_vlen_element(ncid, xtype, vlen_element, nlen, value) &
+!                              RESULT(status)
+
+! USE netcdf_nf_data
+
+! Implicit NONE
+
+! Integer,                Intent(IN)            :: ncid, xtype
+! Integer,                Intent(INOUT)         :: nlen
+! Character(LEN=*),       Intent(INOUT), TARGET :: vlen_element
+! Character(KIND=C_CHAR), Intent(INOUT)         :: value(*)
+! Integer                                       :: status
+
+! End Function nf_get_vlen_element
+!End Interface
+!--------------------------------- nf_free_vlenn -------------------------------
+! Commented out because we use C_CHAR array to pass data of different
+! type to a C void pointer
+!Interface
+! Function nf_free_vlen(vl) RESULT(status)
+
+! Character(KIND=C_CHAR), Intent(IN), TARGET :: vl(*)
+! Integer                                    :: status
+
+! End Function nf_free_vlen
+!End Interface
+!--------------------------------- nf_put_var ---------------------------------
+! Commented out because we use C_CHAR array to pass data of different
+! type to a C void pointer
+!Interface
+! Function nf_put_var(ncid, varid, values) RESULT(status)
+
+! USE netcdf_nf_data
+
+! Integer,                Intent(IN)         :: ncid, varid
+! Character(KIND=C_CHAR), Intent(IN), TARGET :: values(*)
+! Integer                                    :: status
+
+! End Function nf_put_var
+!End Interface
+!--------------------------------- nf_get_var ---------------------------------
+! Commented out because we use C_CHAR array to pass data of different
+! type to a C void pointer
+!Interface
+! Function nf_get_var(ncid, varid, values) RESULT(status)
+
+! USE netcdf_nf_data
+
+! Integer,                Intent(IN)         :: ncid, varid
+! Character(KIND=C_CHAR), Intent(INOUT),     :: values(*)
+! Integer                                    :: status
+
+! End Function nf_get_var
+!End Interface
+!--------------------------------- nf_put_var1_int64 --------------------------
+Interface
+ Function nf_put_var1_int64(ncid, varid, ndex, ival) RESULT(status)
+
+ USE netcdf_nf_data, ONLY: IK8
+
+ Integer,           Intent(IN) :: ncid, varid
+ Integer,           Intent(IN) :: ndex(*)
+ Integer(KIND=IK8), Intent(IN) :: ival
+ Integer                       :: status
+
+ End Function nf_put_var1_int64
+End Interface
+!--------------------------------- nf_put_vara_int64 --------------------------
+Interface
+ Function nf_put_vara_int64(ncid, varid, start, counts, ivals) RESULT(status)
+
+ USE netcdf_nf_data, ONLY: IK8
+
+ Integer,           Intent(IN) :: ncid, varid
+ Integer,           Intent(IN) :: start(*), counts(*)
+ Integer(KIND=IK8), Intent(IN) :: ivals(*)
+ Integer                       :: status
+
+ End Function nf_put_vara_int64
+End Interface
+!--------------------------------- nf_put_vars_int64 --------------------------
+Interface
+ Function nf_put_vars_int64(ncid, varid, start, counts, strides, ivals) &
+                             RESULT(status)
+ 
+ USE netcdf_nf_data, ONLY: IK8
+
+ Integer,           Intent(IN) :: ncid, varid
+ Integer,           Intent(IN) :: start(*), counts(*), strides(*)
+ Integer(KIND=IK8), Intent(IN) :: ivals(*)
+ Integer                       :: status
+
+ End Function nf_put_vars_int64
+End Interface
+!--------------------------------- nf_put_varm_int64 -------------------------
+Interface
+ Function nf_put_varm_int64(ncid, varid, start, counts, strides, maps, &
+                            ivals) RESULT(status)
+
+ USE netcdf_nf_data, ONLY: IK8
+
+ Integer,           Intent(IN) :: ncid, varid
+ Integer,           Intent(IN) :: start(*), counts(*), strides(*), maps(*)
+ Integer(KIND=IK8), Intent(IN) :: ivals(*)
+ Integer                       :: status
+
+ End Function nf_put_varm_int64
+End Interface
+!--------------------------------- nf_put_var_int64 --------------------------
+Interface
+ Function nf_put_var_int64(ncid, varid, ivals) RESULT(status)
+
+ USE netcdf_nf_data, ONLY: IK8
+
+ Integer,           Intent(IN) :: ncid, varid
+ Integer(KIND=IK8), Intent(IN) :: ivals(*)
+ Integer                       :: status
+
+ End Function nf_put_var_int64
+End Interface
+!--------------------------------- nf_get_var1_int64 -------------------------
+Interface
+ Function nf_get_var1_int64(ncid, varid, ndex, ival) RESULT(status)
+
+ USE netcdf_nf_data, ONLY: IK8
+
+ Integer,           Intent(IN)  :: ncid, varid
+ Integer,           Intent(IN)  :: ndex(*)
+ Integer(KIND=IK8), Intent(OUT) :: ival
+ Integer                        :: status
+
+ End Function nf_get_var1_int64
+End Interface
+!--------------------------------- nf_get_vara_int -------------------------
+Interface
+ Function nf_get_vara_int64(ncid, varid, start, counts, ivals) RESULT(status)
+
+ USE netcdf_nf_data, ONLY: IK8
+
+ Integer,           Intent(IN)  :: ncid, varid
+ Integer,           Intent(IN)  :: start(*), counts(*)
+ Integer(KIND=IK8), Intent(OUT) :: ivals(*)
+ Integer                        :: status
+
+ End Function nf_get_vara_int64
+End Interface
+!--------------------------------- nf_get_vars_int64 --------------------------
+Interface
+ Function nf_get_vars_int64(ncid, varid, start, counts, strides, ivals) &
+                             RESULT(status)
+
+ USE netcdf_nf_data, ONLY: IK8
+
+ Integer,           Intent(IN)  :: ncid, varid
+ Integer,           Intent(IN)  :: start(*), counts(*), strides(*)
+ Integer(KIND=IK8), Intent(OUT) :: ivals(*)
+ Integer                        :: status
+
+ End Function nf_get_vars_int64
+End Interface
+!--------------------------------- nf_get_varm_int64 -------------------------
+Interface
+ Function nf_get_varm_int64(ncid, varid, start, counts, strides, maps, &
+                            ivals) RESULT(status)
+
+ USE netcdf_nf_data, ONLY: IK8
+
+ Integer,           Intent(IN)  :: ncid, varid
+ Integer,           Intent(IN)  :: start(*), counts(*), strides(*), maps(*)
+ Integer(KIND=IK8), Intent(OUT) :: ivals(*)
+ Integer                        :: status
+
+ End Function nf_get_varm_int64
+End Interface
+!--------------------------------- nf_get_var_int64 --------------------------
+Interface
+ Function nf_get_var_int64(ncid, varid, ivals) RESULT(status)
+
+ USE netcdf_nf_data, ONLY: IK8
+
+ Integer,           Intent(IN)  :: ncid, varid
+ Integer(KIND=IK8), Intent(OUT) :: ivals(*)
+ Integer                        :: status
+
+ End Function nf_get_var_int64
+End Interface
+!--------------------------------- nf_set_chunk_cache -------------------------
+Interface
+ Function nf_set_chunk_cache(chunk_size, nelems, preemption) RESULT(status)
+
+ Integer, Intent(IN) :: chunk_size, nelems, preemption
+ Integer             :: status
+
+ End Function nf_set_chunk_cache
+End Interface
+!--------------------------------- nf_get_chunk_cache -------------------------
+Interface
+ Function nf_get_chunk_cache(chunk_size, nelems, preemption) RESULT(status)
+
+ Integer, Intent(INOUT) :: chunk_size, nelems, preemption
+ Integer                :: status
+
+ End Function nf_get_chunk_cache
+End Interface
+!--------------------------------- nf_set_var_chunk_cache ---------------------
+Interface
+ Function nf_set_var_chunk_cache(ncid, varid, chunk_size, nelems, preemption) RESULT(status)
+
+! USE netcdf_nf_data
+
+ Implicit NONE
+
+ Integer, Intent(IN) :: ncid, varid, chunk_size, nelems, preemption
+ Integer             :: status
+
+ End Function nf_set_var_chunk_cache
+End Interface
+!--------------------------------- nf_get_var_chunk_cache ---------------------
+Interface
+ Function nf_get_var_chunk_cache(ncid, varid, chunk_size, nelems, preemption) RESULT(status)
+
+! get chunk cache size. Note this follows the fort-nc4 version which uses
+! uses nc_get_var_chunk_cache_ints to avoid size_t issues with fortran. 
+
+! USE netcdf_nf_data
+
+ Implicit NONE
+
+ Integer, Intent(IN)    :: ncid, varid
+ Integer, Intent(INOUT) :: chunk_size, nelems, preemption
+ Integer                :: status
+
+ End Function nf_get_var_chunk_cache
+End Interface
+
+! Declare external values for functions that use C_CHAR strings to pass
+! data of different types
+
+ Integer, External :: nf_insert_enum
+ Integer, External :: nf_inq_enum_member
+ Integer, External :: nf_put_att
+ Integer, External :: nf_get_att
+ Integer, External :: nf_put_vlen_element
+ Integer, External :: nf_get_vlen_element
+ Integer, External :: nf_free_vlen
+ Integer, External :: nf_free_vlens
+ Integer, External :: nf_free_string
+ Integer, External :: nf_put_var
+ Integer, External :: nf_get_var
+ Integer, External :: nf_def_var_fill
+ Integer, External :: nf_inq_var_fill
+
+End Module netcdf4_nf_interfaces
diff --git a/fortran/module_netcdf_f03.f90 b/fortran/module_netcdf_f03.f90
new file mode 100755
index 0000000..e8a0c90
--- /dev/null
+++ b/fortran/module_netcdf_f03.f90
@@ -0,0 +1,39 @@
+Module netcdf_f03
+
+!> Module to provide inheritance of data and interfaces from nf_data and
+!! nf_interfaces modules. Not really needed by netCDF but provided for
+!! folks writing new code or updating old code who would prefer using
+!! modules instead of the old netcdf.inc include file.
+
+!! Written by: Richard Weed, Ph.D.
+!!             Center for Advanced Vehicular Systems
+!!             Mississippi State University
+!!             rweed at cavs.msstate.edu
+
+!! License (and other Lawyer Language)
+
+!! This software is released under the Apache 2.0 Open Source License. The
+!! full text of the License can be viewed at :
+!!
+!!   http:www.apache.org/licenses/LICENSE-2.0.html
+!!
+!! The author grants to the University Corporation for Atmospheric Research
+!! (UCAR), Boulder, CO, USA the right to revise and extend the software
+!! without restriction. However, the author retains all copyrights and
+!! intellectual property rights explicitly stated in or implied by the
+!! Apache license
+
+!! Version 1.0 - Sept. 2005 - Initial Cray X1 version
+!! Version 2.0 - April 2009 - Added netcdf4 interfaces
+
+!! This module can be used as a replacement for an include to netcdf.inc
+!! The module is named netcdf_f03 to avoid a conflict with the netcdf
+!! module generated by the Fortran 90 interfaces
+
+ USE netcdf_nf_data        ! Brings in the nf interface error flags etc.
+ USE netcdf_nf_interfaces  ! Brings in explicit interfaces to nf_ routines
+
+ Implicit NONE
+
+!!------------------------------- End of Module netcdf_f03 ---------------------
+ End Module netcdf_f03
diff --git a/fortran/module_netcdf_fortv2_c_interfaces.f90 b/fortran/module_netcdf_fortv2_c_interfaces.f90
new file mode 100755
index 0000000..90b1f53
--- /dev/null
+++ b/fortran/module_netcdf_fortv2_c_interfaces.f90
@@ -0,0 +1,690 @@
+Module netcdf_fortv2_c_interfaces
+
+! Fortran 20003 interfaces to C routines in fort_v2compat.c called by
+! the V2 Fortran interfaces. Interface routine names are the same
+! as the C routine names.
+
+! Written by : Richard Weed, Ph.D.
+!              Center for Advanced Vehicular Systems 
+!              Mississipi State University
+!              rweed at cavs.msstate.edu
+
+
+! License (and other Lawyer Language)
+ 
+! This software is released under the Apache 2.0 Open Source License. The
+! full text of the License can be viewed at :
+!
+!   http:www.apache.org/licenses/LICENSE-2.0.html
+!
+! The author grants to the University Corporation for Atmospheric Research
+! (UCAR), Boulder, CO, USA the right to revise and extend the software
+! without restriction. However, the author retains all copyrights and
+! intellectual property rights explicitly stated in or implied by the
+! Apache license
+
+! Version 1.: May,   2006 - Initial version 2 interfaces
+! Version 2.; April, 2009 - Redone to reflect passing void data types
+!                           in C with C_PTR and C_CHAR strings and 
+!                           NetCDF 4.0.1
+! Version 3.; April, 2010 - Updated to NetCDF 4.1.1
+
+! USE ISO_C_BINDING
+
+! USE NETCDF_NC_DATA,       ONLY: C_PTRDIFF_T
+! USE NETCDF_NC_INTERFACES, ONLY: addCNullChar, stripCNullChar
+ USE NETCDF_NC_INTERFACES
+
+ Implicit NONE
+
+! The following interfaces are for the netCDF V2 functions. Note that
+! the actual C routines return a void pointer for arrays etc. This
+! forced me to adopt a commonly used kludge for interfacing old Fortran
+! 77 with C, namely, passing the void pointer to an array of C_CHARs.
+
+! Also note that each interface has an explicit USE ISO_C_BINDING. A better
+! solution is to use the F2003 IMPORT statement (I originally had it this way)
+! However its best to leave the interfaces as is for now because there might
+! be a few compilers out there that support most of the C-interop facility but
+! for some reason haven't implemented IMPORT yet.
+
+!  Begin fortv2 C interface definitions
+
+!-------------------------------- c_ncpopt ------------------------------------
+Interface
+ Subroutine c_ncpopt(val) BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_INT
+
+ Integer(KIND=C_INT), VALUE :: val
+
+ End Subroutine c_ncpopt
+End Interface
+!-------------------------------- c_ncgopt ------------------------------------
+Interface
+ Subroutine c_ncgopt(val) BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_INT
+
+ Integer(KIND=C_INT), Intent(OUT) :: val
+
+ End Subroutine c_ncgopt
+End Interface
+!-------------------------------- c_nccre -------------------------------------
+Interface
+ Function c_nccre(pathname, clobmode, rcode) BIND(C)
+ 
+ USE ISO_C_BINDING, ONLY: C_INT, C_CHAR
+
+ Character(KIND=C_CHAR), Intent(IN)  :: pathname(*)
+ Integer(KIND=C_INT),    VALUE       :: clobmode 
+ Integer(KIND=C_INT),    Intent(OUT) :: rcode 
+ 
+ Integer(KIND=C_INT)                 :: c_nccre
+
+ End Function c_nccre
+End Interface
+!-------------------------------- c_ncopn -------------------------------------
+Interface
+ Function c_ncopn(pathname, rwmode, rcode) BIND(C)
+ 
+ USE ISO_C_BINDING, ONLY: C_INT, C_CHAR
+
+ Character(KIND=C_CHAR), Intent(IN)  :: pathname(*)
+ Integer(KIND=C_INT),    VALUE       :: rwmode 
+ Integer(KIND=C_INT),    Intent(OUT) :: rcode
+ 
+ Integer(KIND=C_INT)                 :: c_ncopn
+
+ End Function c_ncopn
+End Interface
+!-------------------------------- c_ncddef ------------------------------------
+Interface
+ Function c_ncddef(ncid, dimname, dimlen, rcode) BIND(C)
+ 
+ USE ISO_C_BINDING, ONLY: C_INT, C_CHAR
+
+ Integer(KIND=C_INT),    VALUE       :: ncid, dimlen
+ Character(KIND=C_CHAR), Intent(IN)  :: dimname(*)
+ Integer(KIND=C_INT),    Intent(OUT) :: rcode
+ 
+ Integer(KIND=C_INT)                 :: c_ncddef
+
+ End Function c_ncddef
+End Interface
+!-------------------------------- c_ncdid -------------------------------------
+Interface
+ Function c_ncdid(ncid, dimname, rcode) BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_INT, C_CHAR
+
+ Integer(KIND=C_INT),    VALUE       :: ncid
+ Character(KIND=C_CHAR), Intent(IN)  :: dimname(*)
+ Integer(KIND=C_INT),    Intent(OUT) :: rcode
+ 
+ Integer(KIND=C_INT)                 :: c_ncdid
+
+ End Function c_ncdid
+End Interface
+!-------------------------------- c_ncvdef ------------------------------------
+Interface
+ Function c_ncvdef(ncid, varname, datatype, ndims, dimids, rcode) BIND(C)
+ 
+ USE ISO_C_BINDING, ONLY: C_INT, C_CHAR
+
+ Integer(KIND=C_INT),    VALUE       :: ncid
+ Character(KIND=C_CHAR), Intent(IN)  :: varname(*)
+ Integer(KIND=C_INT),    VALUE       :: datatype ! nc_type variable in C
+ Integer(KIND=C_INT),    VALUE       :: ndims
+ Integer(KIND=C_INT),    Intent(IN)  :: dimids(*)
+ Integer(KIND=C_INT),    Intent(OUT) :: rcode
+
+ Integer(KIND=C_INT)                 :: c_ncvdef
+
+ End Function c_ncvdef
+End Interface
+!-------------------------------- c_ncvid -------------------------------------
+Interface
+ Function c_ncvid(ncid, varname, rcode) BIND(C)
+ 
+ USE ISO_C_BINDING, ONLY: C_INT, C_CHAR
+
+ Integer(KIND=C_INT),    VALUE       :: ncid
+ Character(KIND=C_CHAR), Intent(IN)  :: varname(*)
+ Integer(KIND=C_INT),    Intent(OUT) :: rcode
+
+ Integer(KIND=C_INT)                 :: c_ncvid
+
+ End Function c_ncvid
+End Interface
+!-------------------------------- c_nctlen ------------------------------------
+Interface
+ Function c_nctlen(datatype, rcode) BIND(C)
+ 
+ USE ISO_C_BINDING, ONLY: C_INT
+
+ Integer(KIND=C_INT), VALUE       :: datatype ! nc_type var in C
+ Integer(KIND=C_INT), Intent(OUT) :: rcode
+
+ Integer(KIND=C_INT)              :: c_nctlen
+
+ End Function c_nctlen
+End Interface
+!-------------------------------- c_ncclos ------------------------------------
+Interface
+ Subroutine c_ncclos(ncid, rcode) BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_INT
+
+ Integer(KIND=C_INT), VALUE       :: ncid 
+ Integer(KIND=C_INT), Intent(OUT) :: rcode
+
+ End Subroutine c_ncclos
+End Interface
+!-------------------------------- c_ncredf ------------------------------------
+Interface
+ Subroutine c_ncredf(ncid, rcode) BIND(C)
+ 
+ USE ISO_C_BINDING, ONLY: C_INT
+
+ Integer(KIND=C_INT), VALUE       :: ncid 
+ Integer(KIND=C_INT), Intent(OUT) :: rcode
+
+ End Subroutine c_ncredf
+End Interface
+!-------------------------------- c_ncendf ------------------------------------
+Interface
+ Subroutine c_ncendf(ncid, rcode) BIND(C)
+ 
+ USE ISO_C_BINDING, ONLY: C_INT
+
+ Integer(KIND=C_INT), VALUE       :: ncid 
+ Integer(KIND=C_INT), Intent(OUT) :: rcode
+
+ End Subroutine c_ncendf
+End Interface
+!-------------------------------- c_ncinq -------------------------------------
+Interface
+ Subroutine c_ncinq(ncid, indims, invars, inatts, irecdim, rcode) BIND(C)
+ 
+ USE ISO_C_BINDING, ONLY: C_INT
+
+ Integer(KIND=C_INT), VALUE       :: ncid
+ Integer(KIND=C_INT), Intent(OUT) :: indims, invars, inatts, irecdim, rcode
+
+ End Subroutine c_ncinq
+End Interface
+!-------------------------------- c_ncsnc -------------------------------------
+Interface
+ Subroutine c_ncsnc(ncid, rcode) BIND(C)
+ 
+ USE ISO_C_BINDING, ONLY: C_INT
+
+ Integer(KIND=C_INT), VALUE       :: ncid 
+ Integer(KIND=C_INT), Intent(OUT) :: rcode
+
+ End Subroutine c_ncsnc
+End Interface
+!-------------------------------- c_ncabor ------------------------------------
+Interface
+ Subroutine c_ncabor(ncid, rcode) BIND(C)
+ 
+ USE ISO_C_BINDING, ONLY: C_INT
+
+ Integer(KIND=C_INT), VALUE       :: ncid 
+ Integer(KIND=C_INT), Intent(OUT) :: rcode
+
+ End Subroutine c_ncabor
+End Interface
+!-------------------------------- c_ncdinq -----------------------------------
+Interface
+ Subroutine c_ncdinq(ncid, dimid, dimname, size, rcode) BIND(C)
+ 
+ USE ISO_C_BINDING, ONLY: C_INT, C_CHAR
+
+ Integer(KIND=C_INT),    VALUE       :: ncid , dimid
+ Character(KIND=C_CHAR), Intent(OUT) :: dimname(*)
+ Integer(KIND=C_INT),    Intent(OUT) :: size, rcode
+
+ End Subroutine c_ncdinq
+End Interface
+!-------------------------------- c_ncdren ------------------------------------
+Interface
+ Subroutine c_ncdren(ncid, dimid, dimname, rcode) BIND(C)
+ 
+ USE ISO_C_BINDING, ONLY: C_INT, C_CHAR
+
+ Integer(KIND=C_INT),    VALUE       :: ncid , dimid
+ Character(KIND=C_CHAR), Intent(IN)  :: dimname(*)
+ Integer(KIND=C_INT),    Intent(OUT) :: rcode
+
+ End Subroutine c_ncdren
+End Interface
+!-------------------------------- c_ncviq -------------------------------------
+Interface
+ Subroutine c_ncvinq(ncid, varid, varname, datatype, indims, dimarray, &
+                      inatts, rcode) BIND(C)
+ 
+ USE ISO_C_BINDING, ONLY: C_INT, C_CHAR
+
+ Integer(KIND=C_INT),    VALUE         :: ncid , varid
+ Character(KIND=C_CHAR), Intent(INOUT) :: varname(*)
+ Integer(KIND=C_INT),    Intent(OUT)   :: datatype ! nc_type var in C
+ Integer(KIND=C_INT),    Intent(OUT)   :: dimarray(*)
+ Integer(KIND=C_INT),    Intent(OUT)   :: indims, inatts, rcode
+
+ End Subroutine c_ncvinq
+End Interface
+!-------------------------------- c_ncvpt1 ------------------------------------
+Interface
+ Subroutine c_ncvpt1(ncid, varid, indices, value, rcode) BIND(C) 
+ 
+ USE ISO_C_BINDING, ONLY: C_INT, C_PTR
+
+ Integer(KIND=C_INT), VALUE       :: ncid , varid
+ TYPE(C_PTR),         VALUE       :: indices
+ Type(C_PTR),         VALUE       :: value
+ Integer(KIND=C_INT), Intent(OUT) :: rcode
+
+ End Subroutine c_ncvpt1
+End Interface
+!-------------------------------- c_ncvp1c ------------------------------------
+Interface
+ Subroutine c_ncvp1c(ncid, varid, indices, value, rcode) BIND(C) 
+ 
+ USE ISO_C_BINDING, ONLY: C_INT, C_PTR, C_CHAR
+
+ Integer(KIND=C_INT),    VALUE       :: ncid , varid
+ TYPE(C_PTR),            VALUE       :: indices
+ Character(KIND=C_CHAR), Intent(IN)  :: value(*) ! void in C
+ Integer(KIND=C_INT),    Intent(OUT) :: rcode
+
+ End Subroutine c_ncvp1c
+End Interface
+!-------------------------------- c_ncvpt -------------------------------------
+Interface
+ Subroutine c_ncvpt(ncid, varid, start, count, value, rcode) BIND(C) 
+ 
+ USE ISO_C_BINDING, ONLY: C_INT, C_PTR
+
+ Integer(KIND=C_INT), VALUE       :: ncid , varid
+ Type(C_PTR),         VALUE       :: start, count
+ Type(C_PTR),         VALUE       :: value
+ Integer(KIND=C_INT), Intent(OUT) :: rcode
+
+ End Subroutine c_ncvpt
+End Interface
+!-------------------------------- c_ncvptc ------------------------------------
+Interface
+ Subroutine c_ncvptc(ncid, varid, start, count, value, lenstr, rcode) BIND(C)
+ 
+ USE ISO_C_BINDING, ONLY: C_INT, C_PTR, C_CHAR
+
+ Integer(KIND=C_INT),    VALUE       :: ncid , varid, lenstr
+ Type(C_PTR),            VALUE       :: start, count
+ Character(KIND=C_CHAR), Intent(IN)  :: value(*) ! char in C
+ Integer(KIND=C_INT),    Intent(OUT) :: rcode
+
+ End Subroutine c_ncvptc
+End Interface
+!-------------------------------- c_ncvptg ------------------------------------
+Interface
+ Subroutine c_ncvptg(ncid, varid, start, count, strides, imap, value, &
+                      rcode) BIND(C)
+ 
+ USE ISO_C_BINDING, ONLY: C_INT, C_PTR
+
+ Integer(KIND=C_INT), VALUE       :: ncid , varid
+ Type(C_PTR),         VALUE       :: start, count, strides, imap
+ Type(C_PTR),         VALUE       :: value
+ Integer(KIND=C_INT), Intent(OUT) :: rcode
+
+ End Subroutine c_ncvptg
+End Interface
+!-------------------------------- c_ncvpgc ------------------------------------
+Interface
+ Subroutine c_ncvpgc(ncid, varid, start, count, strides, imap, value, &
+                        rcode) BIND(C) 
+ 
+ USE ISO_C_BINDING, ONLY: C_INT, C_PTR, C_CHAR
+
+ Integer(KIND=C_INT),    VALUE       :: ncid , varid
+ Type(C_PTR),            VALUE       :: start, count, strides, imap
+ Character(KIND=C_CHAR), Intent(IN)  :: value(*) ! char in C
+ Integer(KIND=C_INT),    Intent(OUT) :: rcode
+
+ End Subroutine c_ncvpgc
+End Interface
+!-------------------------------- c_ncvgt1 ------------------------------------
+Interface
+ Subroutine c_ncvgt1(ncid, varid, indices, value, rcode) BIND(C)
+ 
+ USE ISO_C_BINDING, ONLY: C_INT, C_PTR, C_CHAR
+
+ Integer(KIND=C_INT),    VALUE       :: ncid , varid
+ Type(C_PTR),            VALUE       :: indices
+ Character(KIND=C_CHAR), Intent(OUT) :: value(*) ! void in C
+ Integer(KIND=C_INT),    Intent(OUT) :: rcode
+
+ End Subroutine c_ncvgt1
+End Interface
+!-------------------------------- c_ncvg1c ------------------------------------
+Interface
+ Subroutine c_ncvg1c(ncid, varid, indices, value, rcode) BIND(C)
+ 
+ USE ISO_C_BINDING, ONLY: C_INT, C_PTR, C_CHAR
+
+ Integer(KIND=C_INT),    VALUE         :: ncid , varid
+ Type(C_PTR),            VALUE         :: indices
+ Character(KIND=C_CHAR), Intent(INOUT) :: value(*) ! char in C
+ Integer(KIND=C_INT),    Intent(OUT)   :: rcode
+
+ End Subroutine c_ncvg1c
+End Interface
+!-------------------------------- c_ncvgt -------------------------------------
+Interface
+ Subroutine c_ncvgt(ncid, varid, start, count, value, rcode) BIND(C)
+ 
+ USE ISO_C_BINDING, ONLY: C_INT, C_PTR, C_CHAR
+
+ Integer(KIND=C_INT),    VALUE       :: ncid , varid
+ Type(C_PTR),            VALUE       :: start, count
+ Character(KIND=C_CHAR), Intent(OUT) :: value(*) ! void in C
+ Integer(KIND=C_INT),    Intent(OUT) :: rcode
+
+ End Subroutine c_ncvgt
+End Interface
+!-------------------------------- c_ncvgtc ------------------------------------
+Interface
+ Subroutine c_ncvgtc(ncid, varid, start, count, value, lenstr, rcode) BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_INT, C_PTR, C_CHAR
+
+ Integer(KIND=C_INT),    VALUE         :: ncid , varid, lenstr
+ Type(C_PTR),            VALUE         :: start, count
+ Character(KIND=C_CHAR), Intent(INOUT) :: value(*) ! char in C
+ Integer(KIND=C_INT),    Intent(OUT)   :: rcode
+
+ End Subroutine c_ncvgtc
+End Interface
+!-------------------------------- c_ncvgtg ------------------------------------
+Interface
+ Subroutine c_ncvgtg(ncid, varid, start, count, strides, imap, value, &
+                      rcode) BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_INT, C_PTR, C_CHAR
+
+ Integer(KIND=C_INT),    VALUE       :: ncid , varid
+ Type(C_PTR),            VALUE       :: start, count, strides,  imap
+ Character(KIND=C_CHAR), Intent(OUT) :: value(*) ! void in C
+ Integer(KIND=C_INT),    Intent(OUT) :: rcode
+
+ End Subroutine c_ncvgtg
+End Interface
+!-------------------------------- c_ncvggc ------------------------------------
+Interface
+ Subroutine c_ncvggc(ncid, varid, start, count, strides, imap, value, &
+                      rcode) BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_INT, C_PTR, C_CHAR
+
+ Integer(KIND=C_INT),    VALUE       :: ncid , varid
+ Type(C_PTR),            VALUE       :: start, count, strides, imap
+ Character(KIND=C_CHAR), Intent(OUT) :: value(*) ! char in C
+ Integer(KIND=C_INT),    Intent(OUT) :: rcode
+
+ End Subroutine c_ncvggc
+End Interface
+!-------------------------------- c_ncvren ------------------------------------
+Interface
+ Subroutine c_ncvren(ncid, varid, varname, rcode) BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_INT, C_CHAR
+
+ Integer(KIND=C_INT),    VALUE       :: ncid , varid
+ Character(KIND=C_CHAR), Intent(IN)  :: varname(*)
+ Integer(KIND=C_INT),    Intent(OUT) :: rcode
+
+ End Subroutine c_ncvren
+End Interface
+!-------------------------------- c_ncapt -------------------------------------
+Interface
+ Subroutine c_ncapt(ncid, varid, attname, datatype, attlen, value, &
+                     rcode) BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_INT, C_SIZE_T, C_CHAR, C_PTR
+
+ Integer(KIND=C_INT),    VALUE       :: ncid , varid
+ Character(KIND=C_CHAR), Intent(IN)  :: attname(*)
+ Integer(KIND=C_INT),    VALUE       :: datatype ! nc_type var in C
+ Integer(KIND=C_SIZE_T), VALUE       :: attlen
+ Type(C_PTR),            VALUE       :: value ! void in C
+ Integer(KIND=C_INT),    Intent(OUT) :: rcode
+
+ End Subroutine c_ncapt
+End Interface
+!-------------------------------- c_ncaptc ------------------------------------
+Interface
+ Subroutine c_ncaptc(ncid, varid, attname, datatype, attlen, string, &
+                      rcode) BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_INT, C_SIZE_T, C_CHAR
+
+ Integer(KIND=C_INT),    VALUE       :: ncid , varid
+ Character(KIND=C_CHAR), Intent(IN)  :: attname(*)
+ Integer(KIND=C_INT),    VALUE       :: datatype ! nc_type var in C
+ Integer(KIND=C_SIZE_T), VALUE       :: attlen
+ Character(KIND=C_CHAR), Intent(IN)  :: string(*) ! char in C
+ Integer(KIND=C_INT),    Intent(OUT) :: rcode
+
+ End Subroutine c_ncaptc
+End Interface
+!-------------------------------- c_ncainq ------------------------------------
+Interface
+ Subroutine c_ncainq(ncid, varid, attname, datatype, attlen, rcode) BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_INT, C_CHAR
+
+ Integer(KIND=C_INT),    VALUE       :: ncid , varid
+ Character(KIND=C_CHAR), Intent(IN)  :: attname(*)
+ Integer(KIND=C_INT),    Intent(OUT) :: datatype ! nc_type var in C
+ Integer(KIND=C_INT),    Intent(OUT) :: attlen
+ Integer(KIND=C_INT),    Intent(OUT) :: rcode
+
+ End Subroutine c_ncainq
+End Interface
+!-------------------------------- c_ncagt -------------------------------------
+Interface
+ Subroutine c_ncagt(ncid, varid, attname, value, rcode) BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_INT, C_CHAR
+
+ Integer(KIND=C_INT),    VALUE       :: ncid , varid
+ Character(KIND=C_CHAR), Intent(IN)  :: attname(*)
+ Character(KIND=C_CHAR), Intent(OUT) :: value(*) ! void in C
+ Integer(KIND=C_INT),    Intent(OUT) :: rcode
+
+ End Subroutine c_ncagt
+End Interface
+!-------------------------------- c_ncagtc ------------------------------------
+Interface
+ Subroutine c_ncagtc(ncid, varid, attname, value, attlen, rcode) BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_INT, C_CHAR
+
+ Integer(KIND=C_INT),    VALUE       :: ncid , varid, attlen
+ Character(KIND=C_CHAR), Intent(IN)  :: attname(*)
+ Character(KIND=C_CHAR), Intent(OUT) :: value(*) ! char in C
+ Integer(KIND=C_INT),    Intent(OUT) :: rcode
+
+ End Subroutine c_ncagtc
+End Interface
+!-------------------------------- c_ncacpy ------------------------------------
+Interface
+ Subroutine c_ncacpy(inncid, invarid, attname, outncid, outvarid, &
+                      rcode) BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_INT, C_CHAR
+
+ Integer(KIND=C_INT),    VALUE       :: inncid , invarid, outncid, outvarid 
+ Character(KIND=C_CHAR), Intent(IN)  :: attname(*)
+ Integer(KIND=C_INT),    Intent(OUT) :: rcode
+
+ End Subroutine c_ncacpy
+End Interface
+!-------------------------------- c_ncanam ------------------------------------
+Interface
+ Subroutine c_ncanam(ncid, varid, attnum, newname, rcode) BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_INT, C_CHAR
+
+ Integer(KIND=C_INT),    VALUE         :: ncid , varid, attnum
+ Character(KIND=C_CHAR), Intent(INOUT) :: newname(*)
+ Integer(KIND=C_INT),    Intent(OUT)   :: rcode
+
+ End Subroutine c_ncanam
+End Interface
+!-------------------------------- c_ncaren ------------------------------------
+Interface
+ Subroutine c_ncaren(ncid, varid, attnam, newname, rcode) BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_INT, C_CHAR
+
+ Integer(KIND=C_INT),    VALUE       :: ncid , varid
+ Character(KIND=C_CHAR), Intent(IN)  :: attnam(*), newname(*)
+ Integer(KIND=C_INT),    Intent(OUT) :: rcode
+
+ End Subroutine c_ncaren
+End Interface
+!-------------------------------- c_ncadel ------------------------------------
+Interface
+ Subroutine c_ncadel(ncid, varid, attname, rcode) BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_INT, C_CHAR
+
+ Integer(KIND=C_INT),    VALUE       :: ncid , varid
+ Character(KIND=C_CHAR), Intent(IN)  :: attname(*)
+ Integer(KIND=C_INT),    Intent(OUT) :: rcode
+
+ End Subroutine c_ncadel
+End Interface
+!-------------------------------- c_ncsfil ------------------------------------
+Interface
+ Function c_ncsfil(ncid, fillmode, rcode) BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_INT
+
+ Integer(KIND=C_INT), VALUE       :: ncid , fillmode 
+ Integer(KIND=C_INT), Intent(OUT) :: rcode
+
+ Integer(KIND=C_INT)              :: c_ncsfil
+
+ End Function c_ncsfil
+End Interface
+!---------------------------------v2data_size ---------------------------------
+Interface
+ Function v2data_size(datatype) BIND(C) 
+!
+! New function added to fort-v2compat.c
+!
+ USE ISO_C_BINDING, ONLY: C_INT, C_SIZE_T
+
+ Integer(KIND=C_INT),   VALUE :: datatype
+ Integer(KIND=C_SIZE_T)       :: v2data_size
+
+ End Function v2data_size  
+End Interface
+
+CONTAINS
+
+Subroutine convert_v2_imap(cncid, cvarid, fmap, cmap, inullp)
+
+! Replacement for f2c_v2imap C function. Uses v2data_size to return
+! data size defined for C code. A futher test will be made using
+! C interop value.s for FORTRAN side
+!
+!   USE ISO_C_BINDING, ONLY: C_INT, C_SIZE_T
+!   USE NETCDF_NC_DATA, ONLY: C_PTRDIFF_T
+!   USE netcdf_nc_interfaces, ONLY: NC_CHAR, NC_SHORT, NC_INT, NC_FLOAT, &
+!                                   NC_BYTE, NC_DOUBLE, NC_MAX_VAR_DIMS, &
+
+! USE netcdf_nc_interfaces, ONLY: nc_inq_vartype, nc_inq_varndims,     &
+!                                 nc_inq_vardimid, nc_inq_dimlen,      &
+!                                 NC_NOERR , NC_MAX_VAR_DIMS
+   
+ Implicit NONE
+
+ Integer(KIND=C_INT),       Intent(IN)    :: cncid, cvarid
+ Integer(KIND=C_INT),       Intent(IN)    :: fmap(*)
+ Integer(KIND=C_PTRDIFF_T), Intent(INOUT) :: cmap(*)
+ Integer,                   Intent(OUT)   :: inullp
+
+ Integer(KIND=C_INT)    :: rank, datatype, cstat1, cstat2, cstat3, cstat4
+ Integer(KIND=C_SIZE_T) :: total, length, csize
+ Integer(KIND=C_INT)    :: dimids(NC_MAX_VAR_DIMS)
+ Integer                :: ii, idim
+
+!
+ inullp=0
+
+ cstat1 = nc_inq_vartype(cncid, cvarid, datatype)
+ cstat2 = nc_inq_varndims(cncid, cvarid, rank)
+
+! Return if nc_inq_vartype or nc_inq_varndims returns an error
+! code. Set inullp to trigger use of NULL pointer in calling 
+! routine
+ 
+ If (cstat1/=NC_NOERR) Then
+   inullp=1
+   Return
+ EndIf
+ If (cstat2/=NC_NOERR) Then
+   inullp=1
+   Return
+ EndIf
+ If (rank <= 0) Then
+   inullp=1
+   Return
+ EndIf
+
+ If (fmap(1)==0) Then ! Special Fortran version 2 sematics
+   cstat3 = nc_inq_vardimid(cncid, cvarid, dimids)
+   If (cstat3 /= NC_NOERR) Then
+     inullp=1
+     Return
+   EndIf
+!
+   total = 1
+   Loop1: Do ii=1, rank
+     idim = rank-ii+1
+     cmap(idim) = total
+     cstat4 = nc_inq_dimlen(cncid, dimids(idim), length)
+     If (cstat4 /= NC_NOERR) Then
+       inullp=1
+       Exit Loop1
+     EndIf
+     total = total*length
+   EndDo Loop1
+   If (inullp==1) Return
+
+ Else ! Standard version 2 format - Use KIND parameters to set size
+
+! Get C data type size using v2data_size. Unfortunately, the F03
+! standard didn't specify a C_SIZEOF function. This will be
+! remedied in the next upgrade to FORTRAN (2008) but for now
+! we will rely on a C function to provide the value
+
+   csize = v2data_size(datatype) 
+   If (csize <= 0) Then
+      inullp=1
+      Return 
+   EndIf
+
+   cmap(1:rank) = fmap(rank:1:-1) / csize
+
+ EndIf
+
+End Subroutine convert_v2_imap
+
+!-------------------- End module_netcdf_fortv2_c_interfaces -------------------
+End Module netcdf_fortv2_c_interfaces
diff --git a/fortran/module_netcdf_nc_data.F90 b/fortran/module_netcdf_nc_data.F90
new file mode 100755
index 0000000..624b2a1
--- /dev/null
+++ b/fortran/module_netcdf_nc_data.F90
@@ -0,0 +1,338 @@
+Module netcdf_nc_data
+
+! Data types and flags for Fortran2003 interfaces to NetCDF C routines
+!
+! Written by: Richard Weed, Ph.D.
+!             Center for Advanced Vehicular Systems     
+!             Mississippi State University
+!             rweed at cavs.msstate.edu
+
+
+! License (and other Lawyer Language)
+ 
+! This software is released under the Apache 2.0 Open Source License. The
+! full text of the License can be viewed at :
+!
+!   http:www.apache.org/licenses/LICENSE-2.0.html
+!
+! The author grants to the University Corporation for Atmospheric Research
+! (UCAR), Boulder, CO, USA the right to revise and extend the software
+! without restriction. However, the author retains all copyrights and
+! intellectual property rights explicitly stated in or implied by the
+! Apache license
+
+! Version 1.:  Sept. 2005 - Initial Cray X1 version
+! Version 2.:  May 2006   - Updated to support g95
+! Version 3.:  June 2006  - Updated to include netCDF 4 functions
+! Version 4.:  July 2007  - Modified to work with 3.6.2 build system
+! Version 5.:  April 2009 - Updated to NetCDF 4.0.1
+! Version 6.:  April 2010 - Updated to NetCDF 4.1.1
+! Version 7.:  Feb.  2012 - Added support for F2008 Intrinsic kinds
+! Version 8.:  Feb.  2013 - Updated for netcdf fortran-4.4
+! Version 9.:  April 2014 - Changed C_PTRDIFF_T to UCAR definitions
+
+ USE ISO_C_BINDING  ! All subsequent USE associations of netcdf_nc_data
+                    ! will inherit ISO_C_BINDING data
+
+! The following will allow us to use the Fortran 2008 default intrinsic
+! kind variables contained in Fortran 2008 ISO_FORTRAN_ENV module when
+! compilers support it. Actually most of the major compilers (and even
+! the latest gfortran) support these now (Feb. 2012)
+ 
+#ifdef HAVE_F2008
+ USE ISO_FORTRAN_ENV, ONLY: REAL32, REAL64, INT8, INT16, INT32, INT64
+#endif
+ Implicit NONE
+
+#include "nfconfig.inc"
+
+#ifndef HAVE_F2008
+ 
+! Create our own REAL32, REAL64, INT8, INT16, INT32, INT64 if we don't have F2008
+! ISO_FORTRAN_ENV module
+
+ Integer, Parameter, PRIVATE :: REAL32 = SELECTED_REAL_KIND(P=6,  R=37)   ! float 
+ Integer, Parameter, PRIVATE :: REAL64 = SELECTED_REAL_KIND(P=13, R=307)  ! double
+ Integer, Parameter, PRIVATE :: INT8   = SELECTED_INT_KIND( 2)
+ Integer, Parameter, PRIVATE :: INT16  = SELECTED_INT_KIND( 4)
+ Integer, Parameter, PRIVATE :: INT32  = SELECTED_INT_KIND( 9)            ! int
+ Integer, Parameter, PRIVATE :: INT64  = SELECTED_INT_KIND(18)            ! long long
+#endif
+
+! Set KIND parameters to shorter names used in f03 interface routines etc.
+
+ Integer, Parameter :: RK4 = REAL32
+ Integer, Parameter :: RK8 = REAL64
+ Integer, Parameter :: IK1 = INT8
+ Integer, Parameter :: IK2 = INT16
+ Integer, Parameter :: IK4 = INT32
+ Integer, Parameter :: IK8 = INT64
+ 
+! Define processor/compiler dependent parameters for ptrdiff_t, signed char,
+! and short types. Note prtdiff_t was not defined in the FORTRAN 2003
+! standard as an interoperable type in ISO_C_BINDING but was added as part of
+! the recent TS29113 Technical Specification "Futher Interoperability with C" 
+! passed in 2012. For now we will make our own using C_INT32_T or C_INT64_T
+! but allow users to use the default definition for compilers that support 
+! TS29113 (like gfortran 4.8). Default will be C_INTPTR_T 
+
+#ifndef HAVE_TS29113_SUPPORT
+#if (SIZEOF_PTRDIFF_T == 4)
+ Integer, Parameter :: C_PTRDIFF_T = C_INT32_T
+#elif (SIZEOF_PTRDIFF_T == 8)
+ Integer, Parameter :: C_PTRDIFF_T = C_INT64_T
+#else
+ Integer, Parameter :: C_PTRDIFF_T = C_INTPTR_T
+#endif
+#endif
+
+! Set KIND parameters for 1 and 2 byte integers if the system 
+! supports them based on what is set by configure in nfconfig.inc.
+! The routines that use these values will issue an EBADTYPE error
+! and exit if C_SIGNED_CHAR and C_SHORT are not supported in
+! ISO_C_BINDING
+
+! Set the KINDs to default integers otherwise.
+
+! INT1 KINDs
+
+#ifdef NF_INT1_IS_C_SIGNED_CHAR
+ Integer, Parameter :: CINT1 = C_SIGNED_CHAR
+ Integer, Parameter :: NFINT1 = IK1
+#elif NF_INT1_IS_C_SHORT
+ Integer, Parameter :: CINT1 = C_SHORT
+ Integer, Parameter :: NFINT1 = IK2
+#elif NF_INT1_IS_C_INT
+ Integer, Parameter :: CINT1 = C_INT
+ Integer, Parameter :: NFINT1 = IK4
+#elif NF_INT1_IS_C_LONG
+ Integer, Parameter :: CINT1 = C_LONG
+ Integer, Parameter :: NFINT1 = IK8
+#else
+ Integer, Parameter :: CINT1 = C_SIGNED_CHAR
+ Integer, Parameter :: NFINT1 = IK1
+#endif
+
+! INT2 KINDs
+
+#ifdef NF_INT2_IS_C_SHORT
+ Integer, Parameter :: CINT2 = C_SHORT
+ Integer, Parameter :: NFINT2 = IK2
+#elif NF_INT2_IS_C_INT
+ Integer, Parameter :: CINT2 = C_INT
+ Integer, Parameter :: NFINT2 = IK4
+#elif NF_INT2_IS_C_LONG
+ Integer, Parameter :: CINT2 = C_LONG
+ Integer, Parameter :: NFINT2 = IK8
+#else
+ Integer, Parameter :: CINT2 = C_SHORT
+ Integer, Parameter :: NFINT2 = IK2
+#endif
+
+! Set Fortran default integer kind. This
+! should take care of the case were default
+! integer is a 64 bit int (ala prehistoric
+! CRAYS) 
+
+#ifdef NF_INT_IS_C_LONG
+ Integer, Parameter :: CINT = C_LONG
+ Integer, Parameter :: NFINT = IK8 
+#else
+ Integer, Parameter :: CINT = C_INT
+ Integer, Parameter :: NFINT = IK4
+#endif
+
+! Set Fortran default real kind. This should
+! take care of the case were the default real
+! type is a 64 bit real (ala prehistoric CRAYs) 
+
+#ifdef NF_REAL_IS_C_DOUBLE
+  Integer, Parameter :: NFREAL = RK8
+#else
+  Integer, Parameter :: NFREAL = RK4
+#endif
+ 
+!--------- Define default C interface parameters from netcdf.h   ---------------
+! This is not a complete impementation of the C header files but 
+! defines NC_ values equivalent to the values in the netcdf.inc files
+! excludeing the V2 values
+
+!                     NETCDF3 data
+!               
+! Define enumerator nc_type data as integers
+
+ Integer(KIND=C_INT), Parameter :: NC_NAT    = 0
+ Integer(KIND=C_INT), Parameter :: NC_BYTE   = 1
+ Integer(KIND=C_INT), Parameter :: NC_CHAR   = 2
+ Integer(KIND=C_INT), Parameter :: NC_SHORT  = 3
+ Integer(KIND=C_INT), Parameter :: NC_INT    = 4
+ Integer(KIND=C_INT), Parameter :: NC_FLOAT  = 5
+ Integer(KIND=C_INT), Parameter :: NC_DOUBLE = 6
+
+! Default fill values
+
+ Character(KIND=C_CHAR),      Parameter :: NC_FILL_CHAR   = C_NULL_CHAR 
+ Integer(KIND=C_SIGNED_CHAR), Parameter :: NC_FILL_BYTE   = -127_C_SIGNED_CHAR
+ Integer(KIND=C_SHORT),       Parameter :: NC_FILL_SHORT  = -32767_C_SHORT
+ Integer(KIND=C_INT),         Parameter :: NC_FILL_INT    = -2147483647_C_INT
+ Real(KIND=C_FLOAT),          Parameter :: NC_FILL_FLOAT  = 9.9692099683868690E+36
+ Real(KIND=C_DOUBLE),         Parameter :: NC_FILL_DOUBLE = 9.9692099683868690D+36
+
+! Mode flags for opening and creating datasets
+
+ Integer(KIND=C_INT), Parameter :: NC_NOWRITE          = 0
+ Integer(KIND=C_INT), Parameter :: NC_WRITE            = 1
+ Integer(KIND=C_INT), Parameter :: NC_CLOBBER          = 0
+ Integer(KIND=C_INT), Parameter :: NC_NOCLOBBER        = 4
+ Integer(KIND=C_INT), Parameter :: NC_FILL             = 0
+ Integer(KIND=C_INT), Parameter :: NC_NOFILL           = 256
+ Integer(KIND=C_INT), Parameter :: NC_LOCK             = 1024
+ Integer(KIND=C_INT), Parameter :: NC_SHARE            = 2048
+ Integer(KIND=C_INT), Parameter :: NC_STRICT_NC3       = 8
+ Integer(KIND=C_INT), Parameter :: NC_64BIT_OFFSET     = 512
+ Integer(KIND=C_INT), Parameter :: NC_SIZEHINT_DEFAULT = 0
+ Integer(KIND=C_INT), Parameter :: NC_ALIGN_CHUNK      = -1
+ Integer(KIND=C_INT), Parameter :: NC_FORMAT_CLASSIC   = 1
+ Integer(KIND=C_INT), Parameter :: NC_FORMAT_64BIT     = 2
+ Integer(KIND=C_INT), Parameter :: NC_DISKLESS         = 8
+ Integer(KIND=C_INT), Parameter :: NC_MMAP             = 16
+
+
+! Unlimited dimension size argument and global attibute ID
+
+ Integer(KIND=C_INT),  Parameter :: NC_UNLIMITED = 0
+ Integer(KIND=C_INT),  Parameter :: NC_GLOBAL    = 0 
+
+! Implementation limits (WARNING!  SHOULD BE THE SAME AS C INTERFACE)
+
+ Integer(KIND=C_INT), Parameter :: NC_MAX_DIMS     = 1024 
+ Integer(KIND=C_INT), Parameter :: NC_MAX_ATTRS    = 8192 
+ Integer(KIND=C_INT), Parameter :: NC_MAX_VARS     = 8192 
+ Integer(KIND=C_INT), Parameter :: NC_MAX_NAME     = 256 
+ Integer(KIND=C_INT), Parameter :: NC_MAX_VAR_DIMS = NC_MAX_DIMS
+
+! Error codes
+
+ Integer(KIND=C_INT), Parameter :: NC_NOERR        =  0
+ Integer(KIND=C_INT), Parameter :: NC2_ERR         = -1
+ Integer(KIND=C_INT), Parameter :: NC_SYSERR       = -31
+ Integer(KIND=C_INT), Parameter :: NC_EXDR         = -32
+ Integer(KIND=C_INT), Parameter :: NC_EBADID       = -33
+ Integer(KIND=C_INT), Parameter :: NC_EBFILE       = -34
+ Integer(KIND=C_INT), Parameter :: NC_EEXIST       = -35
+ Integer(KIND=C_INT), Parameter :: NC_EINVAL       = -36
+ Integer(KIND=C_INT), Parameter :: NC_EPERM        = -37
+ Integer(KIND=C_INT), Parameter :: NC_ENOTINDEFINE = -38
+ Integer(KIND=C_INT), Parameter :: NC_EINDEFINE    = -39
+ Integer(KIND=C_INT), Parameter :: NC_EINVALCOORDS = -40
+ Integer(KIND=C_INT), Parameter :: NC_EMAXDIMS     = -41
+ Integer(KIND=C_INT), Parameter :: NC_ENAMEINUSE   = -42
+ Integer(KIND=C_INT), Parameter :: NC_ENOTATT      = -43
+ Integer(KIND=C_INT), Parameter :: NC_EMAXATTS     = -44
+ Integer(KIND=C_INT), Parameter :: NC_EBADTYPE     = -45
+ Integer(KIND=C_INT), Parameter :: NC_EBADDIM      = -46
+ Integer(KIND=C_INT), Parameter :: NC_EUNLIMPOS    = -47
+ Integer(KIND=C_INT), Parameter :: NC_EMAXVARS     = -48
+ Integer(KIND=C_INT), Parameter :: NC_ENOTVAR      = -49
+ Integer(KIND=C_INT), Parameter :: NC_EGLOBAL      = -50
+ Integer(KIND=C_INT), Parameter :: NC_ENOTNC       = -51
+ Integer(KIND=C_INT), Parameter :: NC_ESTS         = -52
+ Integer(KIND=C_INT), Parameter :: NC_EMAXNAME     = -53
+ Integer(KIND=C_INT), Parameter :: NC_EUNLIMIT     = -54
+ Integer(KIND=C_INT), Parameter :: NC_ENORECVARS   = -55
+ Integer(KIND=C_INT), Parameter :: NC_ECHAR        = -56
+ Integer(KIND=C_INT), Parameter :: NC_EEDGE        = -57
+ Integer(KIND=C_INT), Parameter :: NC_ESTRIDE      = -58
+ Integer(KIND=C_INT), Parameter :: NC_EBADNAME     = -59
+ Integer(KIND=C_INT), Parameter :: NC_ERANGE       = -60
+ Integer(KIND=C_INT), Parameter :: NC_ENOMEM       = -61
+ Integer(KIND=C_INT), Parameter :: NC_EVARSIZE     = -62
+ Integer(KIND=C_INT), Parameter :: NC_EDIMSIZE     = -63
+ Integer(KIND=C_INT), Parameter :: NC_ETRUNC       = -64
+
+! Error handling codes
+
+ Integer(KIND=C_INT), Parameter :: NC_FATAL   = 1
+ Integer(KIND=C_INT), Parameter :: NC_VERBOSE = 2
+
+#ifdef USE_NETCDF4
+!                          NETCDF4 data
+ Integer(KIND=C_INT), Parameter :: NC_FORMAT_NETCDF4         = 3
+ Integer(KIND=C_INT), Parameter :: NC_FORMAT_NETCDF4_CLASSIC = 4
+ Integer(KIND=C_INT), Parameter :: NC_NETCDF4                = 4096
+ Integer(KIND=C_INT), Parameter :: NC_CLASSIC_MODEL          = 256
+
+! extra netcdf4 types
+ Integer(KIND=C_INT), Parameter :: NC_LONG     = NC_INT
+ Integer(KIND=C_INT), Parameter :: NC_UBYTE    = 7
+ Integer(KIND=C_INT), Parameter :: NC_USHORT   = 8 
+ Integer(KIND=C_INT), Parameter :: NC_UINT     = 9
+ Integer(KIND=C_INT), Parameter :: NC_INT64    = 10 
+ Integer(KIND=C_INT), Parameter :: NC_UINT64   = 11 
+ Integer(KIND=C_INT), Parameter :: NC_STRING   = 12
+ Integer(KIND=C_INT), Parameter :: NC_VLEN     = 13
+ Integer(KIND=C_INT), Parameter :: NC_OPAQUE   = 14
+ Integer(KIND=C_INT), Parameter :: NC_ENUM     = 15
+ Integer(KIND=C_INT), Parameter :: NC_COMPOUND = 16
+
+!extra netcd4 fill values
+ Integer(KIND=C_INT),       Parameter :: NC_FILL_UBYTE  = 255
+ Integer(KIND=C_INT),       Parameter :: NC_FILL_USHORT = 65535
+ Integer(KIND=C_LONG_LONG), Parameter :: NC_FILL_UINT   = 4294967295_C_LONG_LONG
+ Integer(KIND=C_LONG_LONG), Parameter :: NC_FILL_INT64  = -9223372036854775806_C_LONG_LONG
+
+! extra netcdf4 variable flags 
+ Integer(KIND=C_INT), Parameter :: NC_CHUNK_SEQ      = 0 
+ Integer(KIND=C_INT), Parameter :: NC_CHUNK_SUB      = 1 
+ Integer(KIND=C_INT), Parameter :: NC_CHUNK_SIZES    = 2 
+ Integer(KIND=C_INT), Parameter :: NC_ENDIAN_NATIVE  = 0 
+ Integer(KIND=C_INT), Parameter :: NC_ENDIAN_LITTLE  = 1 
+ Integer(KIND=C_INT), Parameter :: NC_ENDIAN_BIG     = 2 
+ Integer(KIND=C_INT), Parameter :: NC_CHUNKED        = 0
+ Integer(KIND=C_INT), Parameter :: NC_NOTCONTIGUOUS  = 0
+ Integer(KIND=C_INT), Parameter :: NC_CONTIGUOUS     = 1
+ Integer(KIND=C_INT), Parameter :: NC_NOCHECKSUM     = 0
+ Integer(KIND=C_INT), Parameter :: NC_FLETCHER32     = 1
+ Integer(KIND=C_INT), Parameter :: NC_NOSHUFFLE      = 0
+ Integer(KIND=C_INT), Parameter :: NC_SHUFFLE        = 1
+ Integer(KIND=C_INT), Parameter :: NC_INDEPENDENT    = 0
+ Integer(KIND=C_INT), Parameter :: NC_COLLECTIVE     = 1
+
+! flags for parallel i/o
+
+ Integer(KIND=C_INT), Parameter :: NC_MPIIO          = 8192
+ Integer(KIND=C_INT), Parameter :: NC_MPIPOSIX       = 16384
+ Integer(KIND=C_INT), Parameter :: NC_PNETCDF        = 32768
+
+ Integer(KIND=C_INT), Parameter :: NC_SZIP_EC_OPTION_MASK = 4
+ Integer(KIND=C_INT), Parameter :: NC_SZIP_NN_OPTION_MASK = 32
+
+! extra netcdf4 error flags
+ Integer(KIND=C_INT), Parameter :: NC_EHDFERR        = -101
+ Integer(KIND=C_INT), Parameter :: NC_ECANTREAD      = -102
+ Integer(KIND=C_INT), Parameter :: NC_ECANTWRITE     = -103
+ Integer(KIND=C_INT), Parameter :: NC_ECANTCREATE    = -104
+ Integer(KIND=C_INT), Parameter :: NC_EFILEMETA      = -105
+ Integer(KIND=C_INT), Parameter :: NC_EDIMMETA       = -106
+ Integer(KIND=C_INT), Parameter :: NC_EATTMETA       = -107
+ Integer(KIND=C_INT), Parameter :: NC_EVARMETA       = -108
+ Integer(KIND=C_INT), Parameter :: NC_ENOCOMPOUND    = -109
+ Integer(KIND=C_INT), Parameter :: NC_EATTEXISTS     = -110
+ Integer(KIND=C_INT), Parameter :: NC_ENOTNC4        = -111
+ Integer(KIND=C_INT), Parameter :: NC_ESTRICTNC3     = -112
+ Integer(KIND=C_INT), Parameter :: NC_ENOTNC3        = -113
+ Integer(KIND=C_INT), Parameter :: NC_ENOPAR         = -114
+ Integer(KIND=C_INT), Parameter :: NC_EPARINIT       = -115
+ Integer(KIND=C_INT), Parameter :: NC_EBADGRPID      = -116
+ Integer(KIND=C_INT), Parameter :: NC_EBADTYPID      = -117
+ Integer(KIND=C_INT), Parameter :: NC_ETYPDEFINED    = -118
+ Integer(KIND=C_INT), Parameter :: NC_EBADFIELD      = -119
+ Integer(KIND=C_INT), Parameter :: NC_EBADCLASS      = -120
+ Integer(KIND=C_INT), Parameter :: NC_EMAPTYPE       = -121
+ Integer(KIND=C_INT), Parameter :: NC_ELATEFILL      = -122
+ Integer(KIND=C_INT), Parameter :: NC_ELATEDEF       = -123
+ Integer(KIND=C_INT), Parameter :: NC_EDIMSCALE      = -124
+ Integer(KIND=C_INT), Parameter :: NC_ENOGRP         = -125
+#endif
+!------------------------------------------------------------------------------
+End Module netcdf_nc_data
diff --git a/fortran/module_netcdf_nc_interfaces.f90 b/fortran/module_netcdf_nc_interfaces.f90
new file mode 100755
index 0000000..2204ce2
--- /dev/null
+++ b/fortran/module_netcdf_nc_interfaces.f90
@@ -0,0 +1,2315 @@
+Module netcdf_nc_interfaces
+
+! Fortran interfaces to netCDF C functions using FORTRAN 2003 C
+! Interoperability features. These interfaces are for the base
+! netCDF C routines in the libsrc directory
+
+! Written by: Richard Weed, Ph.D.
+!             Center for Advanced Vehicular Systems
+!             Mississippi State University
+!             rweed at cavs.msstate.edu
+
+
+! License (and other Lawyer Language)
+
+! This software is released under the Apache 2.0 Open Source License. The
+! full text of the License can be viewed at :
+!
+!   http:www.apache.org/licenses/LICENSE-2.0.html
+!
+! The author grants to the University Corporation for Atmospheric Research
+! (UCAR), Boulder, CO, USA the right to revise and extend the software
+! without restriction. However, the author retains all copyrights and
+! intellectual property rights explicitly stated in or implied by the
+! Apache license
+
+! Version 1.:  Sept. 2005 - Initial Cray X1 version
+! Version 2.:  May   2006 - Updated to support g95
+! Version 3.:  June  2006 - Updated to include netCDF 4 functions
+! Version 4.:  April 2009 - Updated to match netCDF 4.0.1 release
+! Version 5.:  April 2010 - Updated to match netCDF 4.1.1 release
+! Version 6.:  April 2013 - Added nc_inq_path support for fortran 4.4 beta
+
+ USE netcdf_nc_data
+
+ Implicit NONE
+
+!> module procedure interfaces for utility routines
+
+ Interface addCNullChar
+  module procedure addCNullChar
+ End Interface
+
+ Interface stripCNullChar
+  module procedure stripCNullChar
+ End Interface
+
+!> Begin explicit interfaces for base nc_ functions. Note that some interfaces
+!! expect data to be passed as C_PTR type variables. These data are arrays
+!! that could have a NULL pointer passed instead of the array. All strings
+!! are passed as C_CHAR interoperable strings. Most data in put routines
+!! that map to a void pointer in C are passed as a Type(C_PTR) value.
+!! Data from get routine that pass as a void pointer in C are passed as
+!! a C_CHAR string.
+
+!! Also note that each interface has an explicit USE ISO_C_BINDING. A better
+!! solution is to use the F2003 IMPORT statement (I originally had it this way)
+!! However its best to leave the interfaces as is for now because there might
+!! be a few compilers out there that support most of the C-interop facility but
+!! for some reason haven't implemented IMPORT yet.
+
+!---------------------------------- nc_strerror -------------------------------
+Interface
+ Function nc_strerror(ncerr) BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_INT, C_PTR
+
+ Integer(KIND=C_INT), VALUE :: ncerr
+
+ Type(C_PTR)                :: nc_strerror
+
+ End Function nc_strerror
+End Interface
+!---------------------------------- nc_inq_libvers ----------------------------
+Interface
+ Function nc_inq_libvers() BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_PTR
+
+ Type(C_PTR) :: nc_inq_libvers
+
+ End Function nc_inq_libvers
+End Interface
+!---------------------------------- nc_create ---------------------------------
+Interface
+ Function nc_create(path, cmode, ncidp) BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_CHAR, C_INT
+
+ Character(KIND=C_CHAR), Intent(IN)  :: path(*)
+ Integer(KIND=C_INT),    VALUE       :: cmode
+ Integer(KIND=C_INT),    Intent(OUT) :: ncidp
+
+ Integer(KIND=C_INT)                 :: nc_create
+
+ End Function nc_create
+End Interface
+!---------------------------------- nc__create --------------------------------
+Interface
+ Function nc__create(path, cmode, initialsz, chunksizehintp, ncidp) BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_CHAR, C_INT, C_SIZE_T
+
+ Character(KIND=C_CHAR), Intent(IN)  :: path(*)
+ Integer(KIND=C_INT),    VALUE       :: cmode
+ Integer(KIND=C_SIZE_T), VALUE       :: initialsz
+ Integer(KIND=C_SIZE_T), Intent(IN)  :: chunksizehintp
+ Integer(KIND=C_INT),    Intent(OUT) :: ncidp
+
+ Integer(KIND=C_INT)                 :: nc__create
+
+ End Function nc__create
+End Interface
+!---------------------------------- nc__create_mp -----------------------------
+Interface
+ Function nc__create_mp(path, cmode, initialsz, basepe, chunksizehintp, ncidp) &
+                        BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_CHAR, C_INT, C_SIZE_T, C_PTR
+
+ Character(KIND=C_CHAR), Intent(IN)  :: path(*)
+ Integer(KIND=C_INT),    VALUE       :: cmode
+ Integer(KIND=C_SIZE_T), VALUE       :: initialsz
+ Integer(KIND=C_SIZE_T), Intent(IN)  :: chunksizehintp
+ Type(C_PTR),            VALUE       :: basepe
+ Integer(KIND=C_INT),    Intent(OUT) :: ncidp
+
+ Integer(KIND=C_INT)                 :: nc__create_mp
+
+ End Function nc__create_mp
+End Interface
+!---------------------------------- nc_open -----------------------------------
+Interface
+ Function nc_open(path, mode, ncidp) BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_CHAR, C_INT
+
+ Character(KIND=C_CHAR), Intent(IN)  :: path(*)
+ Integer(KIND=C_INT),    VALUE       :: mode
+ Integer(KIND=C_INT),    Intent(OUT) :: ncidp
+
+ Integer(KIND=C_INT)                 :: nc_open
+
+ End Function nc_open
+End Interface
+!---------------------------------- nc__open ----------------------------------
+Interface
+ Function nc__open(path, mode, chunksizehintp, ncidp) BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_CHAR, C_INT, C_SIZE_T
+
+ Character(KIND=C_CHAR), Intent(IN)  :: path(*)
+ Integer(KIND=C_INT),    VALUE       :: mode
+ Integer(KIND=C_SIZE_T), Intent(IN)  :: chunksizehintp
+ Integer(KIND=C_INT),    Intent(OUT) :: ncidp
+
+ Integer(KIND=C_INT)                 :: nc__open
+
+ End Function nc__open
+End Interface
+!---------------------------------- nc__open_mp -------------------------------
+Interface
+ Function nc__open_mp(path, mode, basepe, chunksizehintp, ncidp) BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_CHAR, C_INT, C_SIZE_T, C_PTR
+
+ Character(KIND=C_CHAR), Intent(IN)  :: path(*)
+ Integer(KIND=C_INT),    VALUE       :: mode
+ Integer(KIND=C_SIZE_T), Intent(IN)  :: chunksizehintp
+ Integer(KIND=C_INT),    Intent(OUT) :: ncidp
+ Type(C_PTR),            VALUE       :: basepe
+
+ Integer(KIND=C_INT)                 :: nc__open_mp
+
+ End Function nc__open_mp
+End Interface
+!---------------------------------- nc_inq_path -----------------------------
+Interface
+ Function nc_inq_path(ncid, pathlen, path) BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_INT, C_SIZE_T, C_CHAR
+
+ Integer(KIND=C_INT),    VALUE         :: ncid
+ Integer(KIND=C_SIZE_T), Intent(INOUT) :: pathlen
+ Character(KIND=C_CHAR), Intent(INOUT) :: path(*)
+
+ Integer(KIND=C_INT)                   :: nc_inq_path
+
+ End Function nc_inq_path
+End Interface
+!---------------------------------- nc_set_fill -------------------------------
+Interface
+ Function nc_set_fill(ncid, fillmode, old_modep) BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_INT
+
+ Integer(KIND=C_INT), VALUE       :: ncid
+ Integer(KIND=C_INT), VALUE       :: fillmode
+ Integer(KIND=C_INT), Intent(OUT) :: old_modep
+
+ Integer(KIND=C_INT)              :: nc_set_fill
+
+ End Function nc_set_fill
+End Interface
+!---------------------------------- nc_redef ----------------------------------
+Interface
+ Function nc_redef(ncid) BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_INT
+
+ Integer(KIND=C_INT), VALUE :: ncid
+
+ Integer(KIND=C_INT)        :: nc_redef
+
+ End Function nc_redef
+End Interface
+!---------------------------------- nc_enddef ---------------------------------
+Interface
+ Function nc_enddef(ncid) BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_INT
+
+ Integer(KIND=C_INT), VALUE :: ncid
+
+ Integer(KIND=C_INT)        :: nc_enddef
+
+ End Function nc_enddef
+End Interface
+!---------------------------------- nc__enddef --------------------------------
+Interface
+ Function nc__enddef(ncid, h_minfree, v_align, v_minfree, r_align) BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_INT, C_SIZE_T
+
+ Integer(KIND=C_INT),    VALUE :: ncid
+ Integer(KIND=C_SIZE_T), VALUE :: h_minfree, v_align, v_minfree, r_align
+
+ Integer(KIND=C_INT)           :: nc__enddef
+
+ End Function nc__enddef
+End Interface
+!---------------------------------- nc_sync -----------------------------------
+Interface
+ Function nc_sync(ncid) BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_INT
+
+ Integer(KIND=C_INT), VALUE :: ncid
+
+ Integer(KIND=C_INT)        :: nc_sync
+
+ End Function nc_sync
+End Interface
+!---------------------------------- nc_abort ----------------------------------
+Interface
+ Function nc_abort(ncid) BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_INT
+
+ Integer(KIND=C_INT), VALUE :: ncid
+
+ Integer(KIND=C_INT)        :: nc_abort
+
+ End Function nc_abort
+End Interface
+!---------------------------------- nc_close ----------------------------------
+Interface
+ Function nc_close(ncid) BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_INT
+
+ Integer(KIND=C_INT), VALUE :: ncid
+
+ Integer(KIND=C_INT)        :: nc_close
+
+ End Function nc_close
+End Interface
+!---------------------------------- nc_delete --------------------------------
+Interface
+ Function nc_delete(path) BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_INT, C_CHAR
+
+ Character(KIND=C_CHAR), Intent(IN) :: path(*)
+
+ Integer(KIND=C_INT)                :: nc_delete
+
+ End Function nc_delete
+End Interface
+!---------------------------------- nc_delete_mp -----------------------------
+Interface
+ Function nc_delete_mp(path, pe) BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_INT, C_CHAR
+
+ Character(KIND=C_CHAR), Intent(IN) :: path(*)
+ Integer(KIND=C_INT),    VALUE      :: pe
+
+ Integer(KIND=C_INT)                :: nc_delete_mp
+
+ End Function nc_delete_mp
+End Interface
+!---------------------------------- nc_set_base_pe ----------------------------
+Interface
+ Function nc_set_base_pe(ncid, pe) BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_INT
+
+ Integer(KIND=C_INT), VALUE :: ncid, pe
+
+ Integer(KIND=C_INT)        :: nc_set_base_pe
+
+ End Function nc_set_base_pe
+End Interface
+!---------------------------------- nc_inq_base_pe ----------------------------
+Interface
+ Function nc_inq_base_pe(ncid, pe) BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_INT
+
+ Integer(KIND=C_INT), VALUE       :: ncid
+ Integer(KIND=C_INT), Intent(OUT) ::  pe
+
+ Integer(KIND=C_INT)              :: nc_inq_base_pe
+
+ End Function nc_inq_base_pe
+End Interface
+!---------------------------------- nc_inq ------------------------------------
+Interface
+ Function nc_inq(ncid, ndimsp, nvarsp, ngattsp, unlimdimidp) BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_INT
+
+ Integer(KIND=C_INT), VALUE       :: ncid
+ Integer(KIND=C_INT), Intent(OUT) :: ndimsp, nvarsp, ngattsp, unlimdimidp
+
+ Integer(KIND=C_INT)              :: nc_inq
+
+ End Function nc_inq
+End Interface
+!---------------------------------- nc_inq_ndims ------------------------------
+Interface
+ Function nc_inq_ndims(ncid, ndimsp) BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_INT
+
+ Integer(KIND=C_INT), VALUE       :: ncid
+ Integer(KIND=C_INT), Intent(OUT) ::  ndimsp
+
+ Integer(KIND=C_INT)              :: nc_inq_ndims
+
+ End Function nc_inq_ndims
+End Interface
+!---------------------------------- nc_inq_nvars ------------------------------
+Interface
+ Function nc_inq_nvars(ncid, nvarsp) BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_INT
+
+ Integer(KIND=C_INT), VALUE       :: ncid
+ Integer(KIND=C_INT), Intent(OUT) ::  nvarsp
+
+ Integer(KIND=C_INT)              :: nc_inq_nvars
+
+ End Function nc_inq_nvars
+End Interface
+!---------------------------------- nc_inq_natts ------------------------------
+Interface
+ Function nc_inq_natts(ncid, ngattsp) BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_INT
+
+ Integer(KIND=C_INT), VALUE       :: ncid
+ Integer(KIND=C_INT), Intent(OUT) :: ngattsp
+
+ Integer(KIND=C_INT)              :: nc_inq_natts
+
+ End Function nc_inq_natts
+End Interface
+!---------------------------------- nc_inq_unlimdim ---------------------------
+Interface
+ Function nc_inq_unlimdim(ncid, unlimdimidp) BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_INT
+
+ Integer(KIND=C_INT), VALUE       :: ncid
+ Integer(KIND=C_INT), Intent(OUT) :: unlimdimidp
+
+ Integer(KIND=C_INT)              :: nc_inq_unlimdim
+
+ End Function nc_inq_unlimdim
+End Interface
+!---------------------------------- nc_inq_format -----------------------------
+Interface
+ Function nc_inq_format(ncid, formatp) BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_INT
+
+ Integer(KIND=C_INT), VALUE       :: ncid
+ Integer(KIND=C_INT), Intent(OUT) :: formatp
+
+ Integer(KIND=C_INT)              :: nc_inq_format
+
+ End Function nc_inq_format
+End Interface
+!---------------------------------- nc_def_dim --------------------------------
+Interface
+ Function nc_def_dim(ncid, name, nlen, idp) BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_INT, C_SIZE_T, C_CHAR
+
+ Integer(KIND=C_INT),    VALUE         :: ncid
+ Character(KIND=C_CHAR), Intent(IN)    :: name(*)
+ Integer(KIND=C_SIZE_T), VALUE         :: nlen
+ Integer(KIND=C_INT),    Intent(INOUT) :: idp
+
+ Integer(KIND=C_INT)                   :: nc_def_dim
+
+ End Function nc_def_dim
+End Interface
+!---------------------------------- nc_inq_dimid ------------------------------
+Interface
+ Function nc_inq_dimid(ncid, name, idp) BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_INT, C_CHAR
+
+ Integer(KIND=C_INT),    VALUE         :: ncid
+ Character(KIND=C_CHAR), Intent(IN)    :: name(*)
+ Integer(KIND=C_INT),    Intent(INOUT) :: idp
+
+ Integer(KIND=C_INT)                   :: nc_inq_dimid
+
+ End Function nc_inq_dimid
+End Interface
+!---------------------------------- nc_inq_dim --------------------------------
+Interface
+ Function nc_inq_dim(ncid, dimid, name, lenp) BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_INT, C_SIZE_T, C_CHAR
+
+ Integer(KIND=C_INT),    VALUE         :: ncid
+ Integer(KIND=C_INT),    VALUE         :: dimid
+ Character(KIND=C_CHAR), Intent(INOUT) :: name(*)
+ Integer(KIND=C_SIZE_T), Intent(OUT)   :: lenp
+
+ Integer(KIND=C_INT)                   :: nc_inq_dim
+
+ End Function nc_inq_dim
+End Interface
+!---------------------------------- nc_inq_dimname ----------------------------
+Interface
+ Function nc_inq_dimname(ncid, dimid, name) BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_INT, C_CHAR
+
+ Integer(KIND=C_INT),    VALUE         :: ncid
+ Integer(KIND=C_INT),    VALUE         :: dimid
+ Character(KIND=C_CHAR), Intent(INOUT) :: name(*)
+
+ Integer(KIND=C_INT)                   :: nc_inq_dimname
+
+ End Function nc_inq_dimname
+End Interface
+!---------------------------------- nc_inq_dimlen -----------------------------
+Interface
+ Function nc_inq_dimlen(ncid, dimid, lenp) BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_INT, C_SIZE_T
+
+ Integer(KIND=C_INT),    VALUE       :: ncid
+ Integer(KIND=C_INT),    VALUE       :: dimid
+ Integer(KIND=C_SIZE_T), Intent(OUT) :: lenp
+
+ Integer(KIND=C_INT)                 :: nc_inq_dimlen
+
+ End Function nc_inq_dimlen
+End Interface
+!---------------------------------- nc_rename_dim -----------------------------
+Interface
+ Function nc_rename_dim(ncid, dimid, name) BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_INT, C_CHAR
+
+ Integer(KIND=C_INT),    VALUE      :: ncid
+ Integer(KIND=C_INT),    VALUE      :: dimid
+ Character(KIND=C_CHAR), Intent(IN) :: name(*)
+
+ Integer(KIND=C_INT)                :: nc_rename_dim
+
+ End Function nc_rename_dim
+End Interface
+!---------------------------------- nc_def_var --------------------------------
+Interface
+ Function nc_def_var(ncid, name, xtype, ndims, dimidsp, varidp) BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_INT, C_CHAR
+
+ Integer(KIND=C_INT),    VALUE       :: ncid
+ Character(KIND=C_CHAR), Intent(IN)  :: name(*)
+ Integer(KIND=C_INT),    VALUE       :: xtype
+ Integer(KIND=C_INT),    VALUE       :: ndims
+ Integer(KIND=C_INT),    Intent(IN)  :: dimidsp(*)
+ Integer(KIND=C_INT),    Intent(OUT) :: varidp
+
+ Integer(KIND=C_INT)                 :: nc_def_var
+
+ End Function nc_def_var
+End Interface
+!---------------------------------- nc_inq_var --------------------------------
+Interface
+ Function nc_inq_var(ncid, varid, name, xtypep, ndimsp, dimidsp, nattsp) &
+                     BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_INT, C_CHAR
+
+ Integer(KIND=C_INT),    VALUE       :: ncid, varid
+ Character(KIND=C_CHAR), Intent(OUT) :: name(*)
+ Integer(KIND=C_INT),    Intent(OUT) :: xtypep
+ Integer(KIND=C_INT),    Intent(OUT) :: ndimsp
+ Integer(KIND=C_INT),    Intent(OUT) :: dimidsp(*)
+ Integer(KIND=C_INT),    Intent(OUT) :: nattsp
+
+ Integer(KIND=C_INT)                 :: nc_inq_var
+
+ End Function nc_inq_var
+End Interface
+!---------------------------------- nc_inq_varid ------------------------------
+Interface
+ Function nc_inq_varid(ncid, name, varidp) BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_INT, C_CHAR
+
+ Integer(KIND=C_INT),    VALUE       :: ncid
+ Character(KIND=C_CHAR), Intent(IN)  :: name(*)
+ Integer(KIND=C_INT),    Intent(OUT) :: varidp
+
+ Integer(KIND=C_INT)                 :: nc_inq_varid
+
+ End Function nc_inq_varid
+End Interface
+!---------------------------------- nc_inq_varname ----------------------------
+Interface
+ Function nc_inq_varname(ncid, varid, name) BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_INT, C_CHAR
+
+ Integer(KIND=C_INT),    VALUE       :: ncid, varid
+ Character(KIND=C_CHAR), Intent(OUT) :: name(*)
+
+ Integer(KIND=C_INT)                 :: nc_inq_varname
+
+ End Function nc_inq_varname
+End Interface
+!---------------------------------- nc_inq_vartype ----------------------------
+Interface
+ Function nc_inq_vartype(ncid, varid, xtypep) BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_INT
+
+ Integer(KIND=C_INT), VALUE       :: ncid, varid
+ Integer(KIND=C_INT), Intent(OUT) :: xtypep
+
+ Integer(KIND=C_INT)              :: nc_inq_vartype
+
+ End Function nc_inq_vartype
+End Interface
+!---------------------------------- nc_inq_varndims ---------------------------
+Interface
+ Function nc_inq_varndims(ncid, varid, ndimsp) BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_INT
+
+ Integer(KIND=C_INT), VALUE       :: ncid, varid
+ Integer(KIND=C_INT), Intent(OUT) :: ndimsp
+
+ Integer(KIND=C_INT)              :: nc_inq_varndims
+
+ End Function nc_inq_varndims
+End Interface
+!---------------------------------- nc_inq_vardimid ---------------------------
+Interface
+ Function nc_inq_vardimid(ncid, varid, dimidsp) BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_INT
+
+ Integer(KIND=C_INT), VALUE       :: ncid, varid
+ Integer(KIND=C_INT), Intent(OUT) :: dimidsp(*)
+
+ Integer(KIND=C_INT)              :: nc_inq_vardimid
+
+ End Function nc_inq_vardimid
+End Interface
+!---------------------------------- nc_inq_varnatts ---------------------------
+Interface
+ Function nc_inq_varnatts(ncid, varid, nattsp) BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_INT
+
+ Integer(KIND=C_INT), VALUE       :: ncid, varid
+ Integer(KIND=C_INT), Intent(OUT) :: nattsp
+
+ Integer(KIND=C_INT)              :: nc_inq_varnatts
+
+ End Function nc_inq_varnatts
+End Interface
+!---------------------------------- nc_rename_var -----------------------------
+Interface
+ Function nc_rename_var(ncid, varid, name) BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_INT, C_CHAR
+
+ Integer(KIND=C_INT),    VALUE      :: ncid, varid
+ Character(KIND=C_CHAR), Intent(IN) :: name(*)
+
+ Integer(KIND=C_INT)                :: nc_rename_var
+
+ End Function nc_rename_var
+End Interface
+!---------------------------------- nc_put_var_text ---------------------------
+Interface
+ Function nc_put_var_text(ncid, varid, op) BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_INT, C_CHAR
+
+ Integer(KIND=C_INT),    VALUE      :: ncid, varid
+ Character(KIND=C_CHAR), Intent(IN) :: op(*)
+
+ Integer(KIND=C_INT)                :: nc_put_var_text
+
+ End Function nc_put_var_text
+End Interface
+!---------------------------------- nc_get_var_text ---------------------------
+Interface
+ Function nc_get_var_text(ncid, varid, ip) BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_INT, C_CHAR
+
+ Integer(KIND=C_INT),    VALUE         :: ncid, varid
+ Character(KIND=C_CHAR), Intent(INOUT) :: ip(*)
+
+ Integer(KIND=C_INT)                   :: nc_get_var_text
+
+ End Function nc_get_var_text
+End Interface
+!---------------------------------- nc_put_var_uchar --------------------------
+Interface
+ Function nc_put_var_uchar(ncid, varid, op) BIND(C)
+
+ USE ISO_C_BINDING,  ONLY: C_INT
+ USE NETCDF_NC_DATA, ONLY: CINT1
+
+ Integer(KIND=C_INT), VALUE      :: ncid, varid
+ Integer(KIND=CINT1), Intent(IN) :: op(*)
+
+ Integer(KIND=C_INT)             :: nc_put_var_uchar
+
+ End Function nc_put_var_uchar
+End Interface
+!---------------------------------- nc_get_var_uchar --------------------------
+Interface
+ Function nc_get_var_uchar(ncid, varid, ip) BIND(C)
+
+ USE ISO_C_BINDING,  ONLY: C_INT
+ USE NETCDF_NC_DATA, ONLY: CINT1
+
+ Integer(KIND=C_INT), VALUE       :: ncid, varid
+ Integer(KIND=CINT1), Intent(OUT) :: ip(*)
+
+ Integer(KIND=C_INT)              :: nc_get_var_uchar
+
+ End Function nc_get_var_uchar
+End Interface
+!---------------------------------- nc_put_var_schar --------------------------
+Interface
+ Function nc_put_var_schar(ncid, varid, op) BIND(C)
+
+ USE ISO_C_BINDING,  ONLY: C_INT
+ USE NETCDF_NC_DATA, ONLY: CINT1
+
+ Integer(KIND=C_INT), VALUE      :: ncid, varid
+ Integer(KIND=CINT1), Intent(IN) :: op(*)
+
+ Integer(KIND=C_INT)             :: nc_put_var_schar
+
+ End Function nc_put_var_schar
+End Interface
+!---------------------------------- nc_get_var_schar --------------------------
+Interface
+ Function nc_get_var_schar(ncid, varid, ip) BIND(C)
+
+ USE ISO_C_BINDING,  ONLY: C_INT
+ USE NETCDF_NC_DATA, ONLY: CINT1
+
+ Integer(KIND=C_INT),  VALUE       :: ncid, varid
+ Integer(KIND=CINT1),  Intent(OUT) :: ip(*)
+
+ Integer(KIND=C_INT)               :: nc_get_var_schar
+
+ End Function nc_get_var_schar
+End Interface
+!---------------------------------- nc_put_var_short --------------------------
+Interface
+ Function nc_put_var_short(ncid, varid, op) BIND(C)
+
+ USE ISO_C_BINDING,  ONLY: C_INT
+ USE NETCDF_NC_DATA, ONLY: CINT2
+
+ Integer(KIND=C_INT), VALUE      :: ncid, varid
+ Integer(KIND=CINT2), Intent(IN) :: op(*)
+
+ Integer(KIND=C_INT)             :: nc_put_var_short
+
+ End Function nc_put_var_short
+End Interface
+!---------------------------------- nc_get_var_short --------------------------
+Interface
+ Function nc_get_var_short(ncid, varid, ip) BIND(C)
+
+ USE ISO_C_BINDING,  ONLY: C_INT
+ USE NETCDF_NC_DATA, ONLY: CINT2
+
+ Integer(KIND=C_INT), VALUE       :: ncid, varid
+ Integer(KIND=CINT2), Intent(OUT) :: ip(*)
+
+ Integer(KIND=C_INT)              :: nc_get_var_short
+
+ End Function nc_get_var_short
+End Interface
+!---------------------------------- nc_put_var_int ----------------------------
+Interface
+ Function nc_put_var_int(ncid, varid, op) BIND(C)
+
+ USE ISO_C_BINDING,  ONLY: C_INT
+ USE NETCDF_NC_DATA, ONLY: CINT
+
+ Integer(KIND=C_INT), VALUE     :: ncid, varid
+ Integer(KIND=CINT), Intent(IN) :: op(*)
+
+ Integer(KIND=C_INT)            :: nc_put_var_int
+
+ End Function nc_put_var_int
+End Interface
+!---------------------------------- nc_get_var_int ----------------------------
+Interface
+ Function nc_get_var_int(ncid, varid, ip) BIND(C)
+
+ USE ISO_C_BINDING,  ONLY: C_INT
+ USE NETCDF_NC_DATA, ONLY: CINT
+
+ Integer(KIND=C_INT), VALUE       :: ncid, varid
+ Integer(KIND=CINT),  Intent(OUT) :: ip(*)
+
+ Integer(KIND=C_INT)              :: nc_get_var_int
+
+ End Function nc_get_var_int
+End Interface
+!---------------------------------- nc_put_var_long ----------------------------
+Interface
+ Function nc_put_var_long(ncid, varid, op) BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_INT, C_LONG
+
+ Integer(KIND=C_INT),  VALUE      :: ncid, varid
+ Integer(KIND=C_LONG), Intent(IN) :: op(*)
+
+ Integer(KIND=C_INT)              :: nc_put_var_long
+
+ End Function nc_put_var_long
+End Interface
+!---------------------------------- nc_get_var_long ---------------------------
+Interface
+ Function nc_get_var_long(ncid, varid, ip) BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_INT, C_LONG
+
+ Integer(KIND=C_INT),  VALUE       :: ncid, varid
+ Integer(KIND=C_LONG), Intent(OUT) :: ip(*)
+
+ Integer(KIND=C_INT)               :: nc_get_var_long
+
+ End Function nc_get_var_long
+End Interface
+!---------------------------------- nc_put_var_float --------------------------
+Interface
+ Function nc_put_var_float(ncid, varid, op) BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_INT, C_FLOAT
+
+ Integer(KIND=C_INT), VALUE      :: ncid, varid
+ Real(KIND=C_FLOAT),  Intent(IN) :: op(*)
+
+ Integer(KIND=C_INT)             :: nc_put_var_float
+
+ End Function nc_put_var_float
+End Interface
+!---------------------------------- nc_get_var_float --------------------------
+Interface
+ Function nc_get_var_float(ncid, varid, ip) BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_INT, C_FLOAT
+
+ Implicit NONE
+
+ Integer(KIND=C_INT), VALUE       :: ncid, varid
+ Real(KIND=C_FLOAT),  Intent(OUT) :: ip(*)
+
+ Integer(KIND=C_INT)              :: nc_get_var_float
+
+ End Function nc_get_var_float
+End Interface
+!---------------------------------- nc_put_var_double -------------------------
+Interface
+ Function nc_put_var_double(ncid, varid, op) BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_INT, C_DOUBLE
+
+ Integer(KIND=C_INT), VALUE      :: ncid, varid
+ Real(KIND=C_DOUBLE), Intent(IN) :: op(*)
+
+ Integer(KIND=C_INT)             :: nc_put_var_double
+
+ End Function nc_put_var_double
+End Interface
+!---------------------------------- nc_get_var_double -------------------------
+Interface
+ Function nc_get_var_double(ncid, varid, ip) BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_INT, C_DOUBLE
+
+ Integer(KIND=C_INT), VALUE       :: ncid, varid
+ Real(KIND=C_DOUBLE), Intent(OUT) :: ip(*)
+
+ Integer(KIND=C_INT)              :: nc_get_var_double
+
+ End Function nc_get_var_double
+End Interface
+!---------------------------------- nc_put_var1_text --------------------------
+Interface
+ Function nc_put_var1_text(ncid, varid, indexp, op) BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_INT, C_PTR, C_CHAR
+
+ Integer(KIND=C_INT),   VALUE      :: ncid, varid
+ Type(C_PTR),           VALUE      :: indexp
+ Character(LEN=C_CHAR), Intent(IN) :: op
+
+ Integer(KIND=C_INT)               :: nc_put_var1_text
+
+ End Function nc_put_var1_text
+End Interface
+!---------------------------------- nc_get_var1_test --------------------------
+Interface
+ Function nc_get_var1_text(ncid, varid, indexp, ip) BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_INT, C_PTR, C_CHAR
+
+ Integer(KIND=C_INT),    VALUE       :: ncid, varid
+ Type(C_PTR),            VALUE       :: indexp
+ Character(KIND=C_CHAR), Intent(OUT) :: ip
+
+ Integer(KIND=C_INT)                 :: nc_get_var1_text
+
+ End Function nc_get_var1_text
+End Interface
+!---------------------------------- nc_put_var1_uchar -------------------------
+Interface
+ Function nc_put_var1_uchar(ncid, varid, indexp, op) BIND(C)
+
+ USE ISO_C_BINDING,  ONLY: C_INT, C_PTR
+ USE NETCDF_NC_DATA, ONLY: CINT1
+
+ Integer(KIND=C_INT),  VALUE      :: ncid, varid
+ Type(C_PTR),          VALUE      :: indexp
+ Integer(KIND=CINT1),  Intent(IN) :: op
+
+ Integer(KIND=C_INT)              :: nc_put_var1_uchar
+
+ End Function nc_put_var1_uchar
+End Interface
+!---------------------------------- nc_get_var1_uchar -------------------------
+Interface
+ Function nc_get_var1_uchar(ncid, varid, indexp, ip) BIND(C)
+
+ USE ISO_C_BINDING,  ONLY: C_INT, C_PTR
+ USE NETCDF_NC_DATA, ONLY: CINT1
+
+ Integer(KIND=C_INT),  VALUE       :: ncid, varid
+ Type(C_PTR),          VALUE       :: indexp
+ Integer(KIND=CINT1),  Intent(OUT) :: ip
+
+ Integer(KIND=C_INT)               :: nc_get_var1_uchar
+
+ End Function nc_get_var1_uchar
+End Interface
+!---------------------------------- nc_put_var1_schar -------------------------
+Interface
+ Function nc_put_var1_schar(ncid, varid, indexp, op) BIND(C)
+
+ USE ISO_C_BINDING,  ONLY: C_INT, C_PTR
+ USE NETCDF_NC_DATA, ONLY: CINT1
+
+ Integer(KIND=C_INT),  VALUE      :: ncid, varid
+ Type(C_PTR),          VALUE      :: indexp
+ Integer(KIND=CINT1),  Intent(IN) :: op
+
+ Integer(KIND=C_INT)              :: nc_put_var1_schar
+
+ End Function nc_put_var1_schar
+End Interface
+!---------------------------------- nc_get_var1_schar -------------------------
+Interface
+ Function nc_get_var1_schar(ncid, varid, indexp, ip) BIND(C)
+
+ USE ISO_C_BINDING,  ONLY: C_INT, C_PTR
+ USE NETCDF_NC_DATA, ONLY: CINT1
+
+ Integer(KIND=C_INT),  VALUE       :: ncid, varid
+ Type(C_PTR),          VALUE       :: indexp
+ Integer(KIND=CINT1),  Intent(OUT) :: ip
+
+ Integer(KIND=C_INT)               :: nc_get_var1_schar
+
+ End Function nc_get_var1_schar
+End Interface
+!---------------------------------- nc_put_var1_short -------------------------
+Interface
+ Function nc_put_var1_short(ncid, varid, indexp, op) BIND(C)
+
+ USE ISO_C_BINDING,  ONLY: C_INT, C_PTR
+ USE NETCDF_NC_DATA, ONLY: CINT2
+
+ Integer(KIND=C_INT), VALUE      :: ncid, varid
+ Type(C_PTR),         VALUE      :: indexp
+ Integer(KIND=CINT2), Intent(IN) :: op
+
+ Integer(KIND=C_INT)             :: nc_put_var1_short
+
+ End Function nc_put_var1_short
+End Interface
+!---------------------------------- nc_get_var1_short -------------------------
+Interface
+ Function nc_get_var1_short(ncid, varid, indexp, ip) BIND(C)
+
+ USE ISO_C_BINDING,  ONLY: C_INT, C_PTR
+ USE NETCDF_NC_DATA, ONLY: CINT2
+
+ Integer(KIND=C_INT), VALUE       :: ncid, varid
+ Type(C_PTR),         VALUE       :: indexp
+ Integer(KIND=CINT2), Intent(OUT) :: ip
+
+ Integer(KIND=C_INT)              :: nc_get_var1_short
+
+ End Function nc_get_var1_short
+End Interface
+!---------------------------------- nc_put_var1_int ---------------------------
+Interface
+ Function nc_put_var1_int(ncid, varid, indexp, op) BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_INT, C_PTR
+
+ Integer(KIND=C_INT), VALUE      :: ncid, varid
+ Type(C_PTR),         VALUE      :: indexp
+ Integer(KIND=C_INT), Intent(IN) :: op
+
+ Integer(KIND=C_INT)             :: nc_put_var1_int
+
+ End Function nc_put_var1_int
+End Interface
+!---------------------------------- nc_get_var1_int ---------------------------
+Interface
+ Function nc_get_var1_int(ncid, varid, indexp, ip) BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_INT, C_PTR
+
+ Integer(KIND=C_INT), VALUE       :: ncid, varid
+ Type(C_PTR),         VALUE       :: indexp
+ Integer(KIND=C_INT), Intent(OUT) :: ip
+
+ Integer(KIND=C_INT)              :: nc_get_var1_int
+
+ End Function nc_get_var1_int
+End Interface
+!---------------------------------- nc_put_var1_long --------------------------
+Interface
+ Function nc_put_var1_long(ncid, varid, indexp, op) BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_INT, C_LONG, C_PTR
+
+ Integer(KIND=C_INT),  VALUE      :: ncid, varid
+ Type(C_PTR),          VALUE      :: indexp
+ Integer(KIND=C_LONG), Intent(IN) :: op
+
+ Integer(KIND=C_INT)              :: nc_put_var1_long
+
+ End Function nc_put_var1_long
+End Interface
+!---------------------------------- nc_get_var1_long --------------------------
+Interface
+ Function nc_get_var1_long(ncid, varid, indexp, ip) BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_INT, C_LONG, C_PTR
+
+ Integer(KIND=C_INT),  VALUE       :: ncid, varid
+ Type(C_PTR),          VALUE       :: indexp
+ Integer(KIND=C_LONG), Intent(OUT) :: ip
+
+ Integer(KIND=C_INT)               :: nc_get_var1_long
+
+ End Function nc_get_var1_long
+End Interface
+!---------------------------------- nc_put_var1_float -------------------------
+Interface
+ Function nc_put_var1_float(ncid, varid, indexp, op) BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_INT, C_FLOAT, C_PTR
+
+ Integer(KIND=C_INT), VALUE      :: ncid, varid
+ Type(C_PTR),         VALUE      :: indexp
+ Real(KIND=C_FLOAT),  Intent(IN) :: op
+
+ Integer(KIND=C_INT)             :: nc_put_var1_float
+
+ End Function nc_put_var1_float
+End Interface
+!---------------------------------- nc_get_var1_float -------------------------
+Interface
+ Function nc_get_var1_float(ncid, varid, indexp, ip) BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_INT, C_FLOAT, C_PTR
+
+ Integer(KIND=C_INT), VALUE       :: ncid, varid
+ Type(C_PTR),         VALUE       :: indexp
+ Real(KIND=C_FLOAT),  Intent(OUT) :: ip
+
+ Integer(KIND=C_INT)              :: nc_get_var1_float
+
+ End Function nc_get_var1_float
+End Interface
+!---------------------------------- nc_put_var1_double ------------------------
+Interface
+ Function nc_put_var1_double(ncid, varid, indexp, op) BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_INT, C_DOUBLE, C_PTR
+
+ Integer(KIND=C_INT), VALUE      :: ncid, varid
+ Type(C_PTR),         VALUE      :: indexp
+ Real(KIND=C_DOUBLE), Intent(IN) :: op
+
+ Integer(KIND=C_INT)             :: nc_put_var1_double
+
+ End Function nc_put_var1_double
+End Interface
+!---------------------------------- nc_get_var1_double ------------------------
+Interface
+ Function nc_get_var1_double(ncid, varid, indexp, ip) BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_INT, C_DOUBLE, C_PTR
+
+ Integer(KIND=C_INT), VALUE       :: ncid, varid
+ Type(C_PTR),         VALUE       :: indexp
+ Real(KIND=C_DOUBLE), Intent(OUT) :: ip
+
+ Integer(KIND=C_INT)              :: nc_get_var1_double
+
+ End Function nc_get_var1_double
+End Interface
+!---------------------------------- nc_put_var1 ------------------------------
+Interface
+ Function nc_put_var1(ncid, varid, indexp, op) BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_INT, C_PTR, C_CHAR
+
+ Integer(KIND=C_INT), VALUE :: ncid, varid
+ Type(C_PTR),         VALUE :: indexp
+ Type(C_PTR),         VALUE :: op
+
+ Integer(KIND=C_INT)        :: nc_put_var1
+
+ End Function nc_put_var1
+End Interface
+!---------------------------------- nc_get_var1 ------------------------------
+Interface
+ Function nc_get_var1(ncid, varid, indexp, op) BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_INT, C_PTR, C_CHAR
+
+ Integer(KIND=C_INT),    VALUE         :: ncid, varid
+ Type(C_PTR),            VALUE         :: indexp
+ Character(KIND=C_CHAR), Intent(INOUT) :: op(*) ! op is actually void * in C
+
+ Integer(KIND=C_INT)                   :: nc_get_var1
+
+ End Function nc_get_var1
+End Interface
+!---------------------------------- nc_put_vara_text --------------------------
+Interface
+ Function nc_put_vara_text(ncid, varid, startp, countp, op)  BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_INT, C_PTR, C_CHAR
+
+ Integer(KIND=C_INT),    VALUE      :: ncid, varid
+ Type(C_PTR),            VALUE      :: startp, countp
+ Character(KIND=C_CHAR), Intent(IN) :: op(*)
+
+ Integer(KIND=C_INT)                :: nc_put_vara_text
+
+ End Function nc_put_vara_text
+End Interface
+!---------------------------------- nc_get_vara_text --------------------------
+Interface
+ Function nc_get_vara_text(ncid, varid, startp, countp, ip)  BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_INT, C_PTR, C_CHAR
+
+ Integer(KIND=C_INT),    VALUE       :: ncid, varid
+ Type(C_PTR),            VALUE       :: startp, countp
+ Character(KIND=C_CHAR), Intent(OUT) :: ip(*)
+
+ Integer(KIND=C_INT)                 :: nc_get_vara_text
+
+ End Function nc_get_vara_text
+End Interface
+!---------------------------------- nc_put_vara_uchar -------------------------
+Interface
+ Function nc_put_vara_uchar(ncid, varid, startp, countp, op) BIND(C)
+
+ USE ISO_C_BINDING,  ONLY: C_INT, C_PTR
+ USE NETCDF_NC_DATA, ONLY: CINT1
+
+ Integer(KIND=C_INT), VALUE      :: ncid, varid
+ Type(C_PTR),         VALUE      :: startp, countp
+ Integer(KIND=CINT1), Intent(IN) :: op(*)
+
+ Integer(KIND=C_INT)             :: nc_put_vara_uchar
+
+ End Function nc_put_vara_uchar
+End Interface
+!---------------------------------- nc_get_vara_uchar -------------------------
+Interface
+ Function nc_get_vara_uchar(ncid, varid, startp, countp, ip) BIND(C)
+
+ USE ISO_C_BINDING,  ONLY: C_INT, C_PTR
+ USE NETCDF_NC_DATA, ONLY: CINT1
+
+ Integer(KIND=C_INT), VALUE       :: ncid, varid
+ Type(C_PTR),         VALUE       :: startp, countp
+ Integer(KIND=CINT1), Intent(OUT) :: ip(*)
+
+ Integer(KIND=C_INT)              :: nc_get_vara_uchar
+
+ End Function nc_get_vara_uchar
+End Interface
+!---------------------------------- nc_put_vara_schar -------------------------
+Interface
+ Function nc_put_vara_schar(ncid, varid, startp, countp, op) BIND(C)
+
+ USE ISO_C_BINDING,  ONLY: C_INT, C_PTR
+ USE NETCDF_NC_DATA, ONLY: CINT1
+
+ Integer(KIND=C_INT), VALUE      :: ncid, varid
+ Type(C_PTR),         VALUE      :: startp, countp
+ Integer(KIND=CINT1), Intent(IN) :: op(*)
+
+ Integer(KIND=C_INT)             :: nc_put_vara_schar
+
+ End Function nc_put_vara_schar
+End Interface
+!---------------------------------- nc_get_vara_schar -------------------------
+Interface
+ Function nc_get_vara_schar(ncid, varid, startp, countp, ip) BIND(C)
+
+ USE ISO_C_BINDING,  ONLY: C_INT, C_PTR
+ USE NETCDF_NC_DATA, ONLY: CINT1
+
+ Integer(KIND=C_INT), VALUE       :: ncid, varid
+ Type(C_PTR),         VALUE       :: startp, countp
+ Integer(KIND=CINT1), Intent(OUT) :: ip(*)
+
+ Integer(KIND=C_INT)              :: nc_get_vara_schar
+
+ End Function nc_get_vara_schar
+End Interface
+!---------------------------------- nc_put_vara_short -------------------------
+Interface
+ Function nc_put_vara_short(ncid, varid, startp, countp, op) BIND(C)
+
+ USE ISO_C_BINDING,  ONLY: C_INT, C_PTR
+ USE NETCDF_NC_DATA, ONLY: CINT2
+
+ Integer(KIND=C_INT), VALUE      :: ncid, varid
+ Type(C_PTR),         VALUE      :: startp, countp
+ Integer(KIND=CINT2), Intent(IN) :: op(*)
+
+ Integer(KIND=C_INT)             :: nc_put_vara_short
+
+ End Function nc_put_vara_short
+End Interface
+!---------------------------------- nc_get_vara_short -------------------------
+Interface
+ Function nc_get_vara_short(ncid, varid, startp, countp, ip) BIND(C)
+
+ USE ISO_C_BINDING,  ONLY: C_INT, C_PTR
+ USE NETCDF_NC_DATA, ONLY: CINT2
+
+ Integer(KIND=C_INT), VALUE       :: ncid, varid
+ Type(C_PTR),         VALUE       :: startp, countp
+ Integer(KIND=CINT2), Intent(OUT) :: ip(*)
+
+ Integer(KIND=C_INT)              :: nc_get_vara_short
+
+ End Function nc_get_vara_short
+End Interface
+!--------------------------------- nc_put_vara_int ----------------------------
+Interface
+ Function nc_put_vara_int(ncid, varid, startp, countp, op) BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_INT, C_PTR
+ USE NETCDF_NC_DATA, ONLY: CINT
+
+ Integer(KIND=C_INT), VALUE      :: ncid, varid
+ Type(C_PTR),         VALUE      :: startp, countp
+ Integer(KIND=CINT),  Intent(IN) :: op(*)
+
+ Integer(KIND=C_INT)             :: nc_put_vara_int
+
+ End Function nc_put_vara_int
+End Interface
+!--------------------------------- nc_get_vara_int ----------------------------
+Interface
+ Function nc_get_vara_int(ncid, varid, startp, countp, ip) BIND(C)
+
+ USE ISO_C_BINDING,  ONLY: C_INT, C_PTR
+ USE NETCDF_NC_DATA, ONLY: CINT
+
+ Integer(KIND=C_INT), VALUE       :: ncid, varid
+ Type(C_PTR),         VALUE       :: startp, countp
+ Integer(KIND=CINT),  Intent(OUT) :: ip(*)
+
+ Integer(KIND=C_INT)              :: nc_get_vara_int
+
+ End Function nc_get_vara_int
+End Interface
+!--------------------------------- nc_put_vara_long ---------------------------
+Interface
+ Function nc_put_vara_long(ncid, varid, startp, countp, op) BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_INT, C_LONG, C_PTR
+
+ Integer(KIND=C_INT),  VALUE      :: ncid, varid
+ Type(C_PTR),          VALUE      :: startp, countp
+ Integer(KIND=C_LONG), Intent(IN) :: op(*)
+
+ Integer(KIND=C_INT)              :: nc_put_vara_long
+
+ End Function nc_put_vara_long
+End Interface
+!--------------------------------- nc_get_vara_long ---------------------------
+Interface
+ Function nc_get_vara_long(ncid, varid, startp, countp, ip) BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_INT, C_LONG, C_PTR
+
+ Integer(KIND=C_INT),  VALUE       :: ncid, varid
+ Type(C_PTR),          VALUE       :: startp, countp
+ Integer(KIND=C_LONG), Intent(OUT) :: ip(*)
+
+ Integer(KIND=C_INT)               :: nc_get_vara_long
+
+ End Function nc_get_vara_long
+End Interface
+!--------------------------------- nc_put_vara_float --------------------------
+Interface
+ Function nc_put_vara_float(ncid, varid, startp, countp, op) BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_INT, C_FLOAT, C_PTR
+
+ Integer(KIND=C_INT), VALUE      :: ncid, varid
+ Type(C_PTR),         VALUE      :: startp, countp
+ Real(KIND=C_FLOAT),  Intent(IN) :: op(*)
+
+ Integer(KIND=C_INT)             :: nc_put_vara_float
+
+ End Function nc_put_vara_float
+End Interface
+!--------------------------------- nc_get_vara_float --------------------------
+Interface
+ Function nc_get_vara_float(ncid, varid, startp, countp, ip) BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_INT, C_FLOAT, C_PTR
+
+ Integer(KIND=C_INT), VALUE       :: ncid, varid
+ Type(C_PTR),         VALUE       :: startp, countp
+ Real(KIND=C_FLOAT),  Intent(OUT) :: ip(*)
+
+ Integer(KIND=C_INT)              :: nc_get_vara_float
+
+ End Function nc_get_vara_float
+End Interface
+!--------------------------------- nc_put_vara_double -------------------------
+Interface
+ Function nc_put_vara_double(ncid, varid, startp, countp, op) BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_INT, C_DOUBLE, C_PTR
+
+ Integer(KIND=C_INT), VALUE      :: ncid, varid
+ Type(C_PTR),         VALUE      :: startp, countp
+ Real(KIND=C_DOUBLE), Intent(IN) :: op(*)
+
+ Integer(KIND=C_INT)             :: nc_put_vara_double
+
+ End Function nc_put_vara_double
+End Interface
+!--------------------------------- nc_get_vara_double -------------------------
+Interface
+ Function nc_get_vara_double(ncid, varid, startp, countp, ip) BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_INT, C_DOUBLE, C_PTR
+
+ Integer(KIND=C_INT), VALUE       :: ncid, varid
+ Type(C_PTR),         VALUE       :: startp, countp
+ Real(KIND=C_DOUBLE), Intent(OUT) :: ip(*)
+
+ Integer(KIND=C_INT)              :: nc_get_vara_double
+
+ End Function nc_get_vara_double
+End Interface
+!---------------------------------- nc_put_vara -------------------------------
+Interface
+ Function nc_put_vara(ncid, varid, startp, countp, op)  BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_INT, C_PTR
+
+ Integer(KIND=C_INT), VALUE :: ncid, varid
+ Type(C_PTR),         VALUE :: startp, countp
+ Type(C_PTR),         VALUE :: op
+
+ Integer(KIND=C_INT)        :: nc_put_vara
+
+ End Function nc_put_vara
+End Interface
+!---------------------------------- nc_get_vara -------------------------------
+Interface
+ Function nc_get_vara(ncid, varid, startp, countp, ip)  BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_INT, C_PTR, C_CHAR
+
+ Integer(KIND=C_INT),    VALUE         :: ncid, varid
+ Type(C_PTR),            VALUE         :: startp, countp
+ Character(KIND=C_CHAR), Intent(INOUT) :: ip(*)
+
+ Integer(KIND=C_INT)                   :: nc_get_vara
+
+ End Function nc_get_vara
+End Interface
+!--------------------------------- nc_put_vars_text ---------------------------
+Interface
+ Function nc_put_vars_text(ncid, varid, startp, countp, stridep, op)  BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_INT, C_PTR, C_CHAR
+
+ Integer(KIND=C_INT),    VALUE      :: ncid, varid
+ Type(C_PTR),            VALUE      :: startp, countp, stridep
+ Character(KIND=C_CHAR), Intent(IN) :: op(*)
+
+ Integer(KIND=C_INT)                :: nc_put_vars_text
+
+ End Function nc_put_vars_text
+End Interface
+!--------------------------------- nc_get_vars_text ---------------------------
+Interface
+ Function nc_get_vars_text(ncid, varid, startp, countp, stridep, ip)  BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_INT, C_PTR, C_CHAR
+
+ Integer(KIND=C_INT),    VALUE       :: ncid, varid
+ Type(C_PTR),            VALUE       :: startp, countp, stridep
+ Character(KIND=C_CHAR), Intent(OUT) :: ip(*)
+
+ Integer(KIND=C_INT)                 :: nc_get_vars_text
+
+ End Function nc_get_vars_text
+End Interface
+!--------------------------------- nc_put_vars_uchar --------------------------
+Interface
+ Function nc_put_vars_uchar(ncid, varid, startp, countp, stridep, op) BIND(C)
+
+ USE ISO_C_BINDING,  ONLY: C_INT, C_PTR
+ USE NETCDF_NC_DATA, ONLY: CINT1
+
+ Integer(KIND=C_INT), VALUE      :: ncid, varid
+ Type(C_PTR),         VALUE      :: startp, countp, stridep
+ Integer(KIND=CINT1), Intent(IN) :: op(*)
+
+ Integer(KIND=C_INT)             :: nc_put_vars_uchar
+
+ End Function nc_put_vars_uchar
+End Interface
+!--------------------------------- nc_get_vars_uchar --------------------------
+Interface
+ Function nc_get_vars_uchar(ncid, varid, startp, countp, stridep, ip) BIND(C)
+
+ USE ISO_C_BINDING,  ONLY: C_INT, C_PTR
+ USE NETCDF_NC_DATA, ONLY: CINT1
+
+ Integer(KIND=C_INT), VALUE       :: ncid, varid
+ Type(C_PTR),         VALUE       :: startp, countp, stridep
+ Integer(KIND=CINT1), Intent(OUT) :: ip(*)
+
+ Integer(KIND=C_INT)              :: nc_get_vars_uchar
+
+ End Function nc_get_vars_uchar
+End Interface
+!--------------------------------- nc_put_vars_schar --------------------------
+Interface
+ Function nc_put_vars_schar(ncid, varid, startp, countp, stridep, op) BIND(C)
+
+ USE ISO_C_BINDING,  ONLY: C_INT, C_PTR
+ USE NETCDF_NC_DATA, ONLY: CINT1
+
+ Integer(KIND=C_INT), VALUE      :: ncid, varid
+ Type(C_PTR),         VALUE      :: startp, countp, stridep
+ Integer(KIND=CINT1), Intent(IN) :: op(*)
+
+ Integer(KIND=C_INT)             :: nc_put_vars_schar
+
+ End Function nc_put_vars_schar
+End Interface
+!--------------------------------- nc_get_vars_schar --------------------------
+Interface
+ Function nc_get_vars_schar(ncid, varid, startp, countp, stridep, ip) BIND(C)
+
+ USE ISO_C_BINDING,  ONLY: C_INT, C_PTR
+ USE NETCDF_NC_DATA, ONLY: CINT1
+
+ Integer(KIND=C_INT), VALUE       :: ncid, varid
+ Type(C_PTR),         VALUE       :: startp, countp, stridep
+ Integer(KIND=CINT1), Intent(OUT) :: ip(*)
+
+ Integer(KIND=C_INT)              :: nc_get_vars_schar
+
+ End Function nc_get_vars_schar
+End Interface
+!--------------------------------- nc_put_vars_short --------------------------
+Interface
+ Function nc_put_vars_short(ncid, varid, startp, countp, stridep, op) BIND(C)
+
+ USE ISO_C_BINDING,  ONLY: C_INT, C_PTR
+ USE NETCDF_NC_DATA, ONLY: CINT2
+
+ Integer(KIND=C_INT), VALUE      :: ncid, varid
+ Type(C_PTR),         VALUE      :: startp, countp, stridep
+ Integer(KIND=CINT2), Intent(IN) :: op(*)
+
+ Integer(KIND=C_INT)             :: nc_put_vars_short
+
+ End Function nc_put_vars_short
+End Interface
+!--------------------------------- nc_get_vars_short --------------------------
+Interface
+ Function nc_get_vars_short(ncid, varid, startp, countp, stridep, ip) BIND(C)
+
+ USE ISO_C_BINDING,  ONLY: C_INT,  C_PTR
+ USE NETCDF_NC_DATA, ONLY: CINT2
+
+ Integer(KIND=C_INT), VALUE       :: ncid, varid
+ Type(C_PTR),         VALUE       :: startp, countp, stridep
+ Integer(KIND=CINT2), Intent(OUT) :: ip(*)
+
+ Integer(KIND=C_INT)              :: nc_get_vars_short
+
+ End Function nc_get_vars_short
+End Interface
+!--------------------------------- nc_put_vars_int ----------------------------
+Interface
+ Function nc_put_vars_int(ncid, varid, startp, countp, stridep, op) BIND(C)
+
+ USE ISO_C_BINDING,  ONLY: C_INT, C_PTR
+ USE NETCDF_NC_DATA, ONLY: CINT
+
+ Integer(KIND=C_INT), VALUE      :: ncid, varid
+ Type(C_PTR),         VALUE      :: startp, countp, stridep
+ Integer(KIND=CINT),  Intent(IN) :: op(*)
+
+ Integer(KIND=C_INT)             :: nc_put_vars_int
+
+ End Function nc_put_vars_int
+End Interface
+!--------------------------------- nc_get_vars_int ----------------------------
+Interface
+ Function nc_get_vars_int(ncid, varid, startp, countp, stridep, ip) BIND(C)
+
+ USE ISO_C_BINDING,  ONLY: C_INT, C_PTR
+ USE NETCDF_NC_DATA, ONLY: CINT
+
+ Integer(KIND=C_INT), VALUE       :: ncid, varid
+ Type(C_PTR),         VALUE       :: startp, countp, stridep
+ Integer(KIND=CINT),  Intent(OUT) :: ip(*)
+
+ Integer(KIND=C_INT)              :: nc_get_vars_int
+
+ End Function nc_get_vars_int
+End Interface
+!--------------------------------- nc_put_vars_long ---------------------------
+Interface
+ Function nc_put_vars_long(ncid, varid, startp, countp, stridep, op) BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_INT, C_LONG, C_PTR
+
+ Integer(KIND=C_INT),  VALUE      :: ncid, varid
+ Type(C_PTR),          VALUE      :: startp, countp, stridep
+ Integer(KIND=C_LONG), Intent(IN) :: op(*)
+
+ Integer(KIND=C_INT)              :: nc_put_vars_long
+
+ End Function nc_put_vars_long
+End Interface
+!--------------------------------- nc_get_vars_long ---------------------------
+Interface
+ Function nc_get_vars_long(ncid, varid, startp, countp, stridep, ip) BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_INT, C_LONG, C_PTR
+
+ Integer(KIND=C_INT),  VALUE       :: ncid, varid
+ Type(C_PTR),          VALUE       :: startp, countp, stridep
+ Integer(KIND=C_LONG), Intent(OUT) :: ip(*)
+
+ Integer(KIND=C_INT)               :: nc_get_vars_long
+
+ End Function nc_get_vars_long
+End Interface
+!--------------------------------- nc_put_vars_float --------------------------
+Interface
+ Function nc_put_vars_float(ncid, varid, startp, countp, stridep, op) BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_INT, C_FLOAT, C_PTR
+
+ Integer(KIND=C_INT), VALUE      :: ncid, varid
+ Type(C_PTR),         VALUE      :: startp, countp, stridep
+ Real(KIND=C_FLOAT),  Intent(IN) :: op(*)
+
+ Integer(KIND=C_INT)             :: nc_put_vars_float
+
+ End Function nc_put_vars_float
+End Interface
+!--------------------------------- nc_get_vars_float --------------------------
+Interface
+ Function nc_get_vars_float(ncid, varid, startp, countp, stridep, ip) BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_INT, C_FLOAT, C_PTR
+
+ Integer(KIND=C_INT), VALUE       :: ncid, varid
+ Type(C_PTR),         VALUE       :: startp, countp, stridep
+ Real(KIND=C_FLOAT),  Intent(OUT) :: ip(*)
+
+ Integer(KIND=C_INT)              :: nc_get_vars_float
+
+ End Function nc_get_vars_float
+End Interface
+!--------------------------------- nc_put_vars_double -------------------------
+Interface
+ Function nc_put_vars_double(ncid, varid, startp, countp, stridep, op) BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_INT, C_DOUBLE, C_PTR
+
+ Integer(KIND=C_INT), VALUE      :: ncid, varid
+ Type(C_PTR),         VALUE      :: startp, countp, stridep
+ Real(KIND=C_DOUBLE), Intent(IN) :: op(*)
+
+ Integer(KIND=C_INT)             :: nc_put_vars_double
+
+ End Function nc_put_vars_double
+End Interface
+!--------------------------------- nc_get_vars_double -------------------------
+Interface
+ Function nc_get_vars_double(ncid, varid, startp, countp, stridep, ip) BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_INT, C_DOUBLE, C_PTR
+
+ Integer(KIND=C_INT), VALUE       :: ncid, varid
+ Type(C_PTR),         VALUE       :: startp, countp, stridep
+ Real(KIND=C_DOUBLE), Intent(OUT) :: ip(*)
+
+ Integer(KIND=C_INT)              :: nc_get_vars_double
+
+ End Function nc_get_vars_double
+End Interface
+!--------------------------------- nc_put_vars --------------------------------
+Interface
+ Function nc_put_vars(ncid, varid, startp, countp, stridep, op)  BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_INT, C_PTR
+
+ Integer(KIND=C_INT), VALUE :: ncid, varid
+ Type(C_PTR),         VALUE :: startp, countp, stridep
+ Type(C_PTR),         VALUE :: op
+
+ Integer(KIND=C_INT)        :: nc_put_vars
+
+ End Function nc_put_vars
+End Interface
+!--------------------------------- nc_get_vars ---------------------------
+Interface
+ Function nc_get_vars(ncid, varid, startp, countp, stridep, ip)  BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_INT, C_PTR, C_CHAR
+
+ Integer(KIND=C_INT),    VALUE         :: ncid, varid
+ Type(C_PTR),            VALUE         :: startp, countp, stridep
+ Character(KIND=C_CHAR), Intent(INOUT) :: ip(*)
+
+ Integer(KIND=C_INT)                   :: nc_get_vars
+
+ End Function nc_get_vars
+End Interface
+!--------------------------------- nc_put_varm_text ---------------------------
+Interface
+! array of characters
+ Function nc_put_varm_text(ncid, varid, startp, countp, stridep, imapp,op)  &
+                             BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_INT, C_PTR, C_CHAR
+
+ Integer(KIND=C_INT),    VALUE      :: ncid, varid
+ Type(C_PTR),            VALUE      :: startp, countp, stridep, imapp
+ Character(KIND=C_CHAR), Intent(IN) :: op(*)
+
+ Integer(KIND=C_INT)                :: nc_put_varm_text
+
+ End Function nc_put_varm_text
+End Interface
+!--------------------------------- nc_get_varm_text ---------------------------
+Interface
+ Function nc_get_varm_text(ncid, varid, startp, countp, stridep, imapp,ip)  &
+                           BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_INT, C_PTR, C_CHAR
+
+ Integer(KIND=C_INT),    VALUE       :: ncid, varid
+ Type(C_PTR),            VALUE       :: startp, countp, stridep, imapp
+ Character(KIND=C_CHAR), Intent(OUT) :: ip(*)
+
+ Integer(KIND=C_INT)                 :: nc_get_varm_text
+
+ End Function nc_get_varm_text
+End Interface
+!--------------------------------- nc_put_varm_uchar --------------------------
+Interface
+ Function nc_put_varm_uchar(ncid, varid, startp, countp, stridep, imapp, op)  &
+                            BIND(C)
+
+ USE ISO_C_BINDING,  ONLY: C_INT, C_PTR
+ USE NETCDF_NC_DATA, ONLY: CINT1
+
+ Integer(KIND=C_INT), VALUE      :: ncid, varid
+ Type(C_PTR),         VALUE      :: startp, countp, stridep, imapp
+ Integer(KIND=CINT1), Intent(IN) :: op(*)
+
+ Integer(KIND=C_INT)             :: nc_put_varm_uchar
+
+ End Function nc_put_varm_uchar
+End Interface
+!--------------------------------- nc_get_varm_uchar --------------------------
+Interface
+ Function nc_get_varm_uchar(ncid, varid, startp, countp, stridep, imapp, ip)  &
+                            BIND(C)
+
+ USE ISO_C_BINDING,  ONLY: C_INT, C_PTR
+ USE NETCDF_NC_DATA, ONLY: CINT1
+
+ Integer(KIND=C_INT), VALUE       :: ncid, varid
+ Type(C_PTR),         VALUE       :: startp, countp, stridep, imapp
+ Integer(KIND=CINT1), Intent(OUT) :: ip(*)
+
+ Integer(KIND=C_INT)              :: nc_get_varm_uchar
+
+ End Function nc_get_varm_uchar
+End Interface
+!--------------------------------- nc_put_varm_schar --------------------------
+Interface
+ Function nc_put_varm_schar(ncid, varid, startp, countp, stridep, imapp, op)  &
+                            BIND(C)
+
+ USE ISO_C_BINDING,  ONLY: C_INT, C_PTR
+ USE NETCDF_NC_DATA, ONLY: CINT1
+
+ Integer(KIND=C_INT), VALUE      :: ncid, varid
+ Type(C_PTR),         VALUE      :: startp, countp, stridep, imapp
+ Integer(KIND=CINT1), Intent(IN) :: op(*)
+
+ Integer(KIND=C_INT)             :: nc_put_varm_schar
+
+ End Function nc_put_varm_schar
+End Interface
+!--------------------------------- nc_get_varm_schar --------------------------
+Interface
+ Function nc_get_varm_schar(ncid, varid, startp, countp, stridep, imapp, ip)  &
+                            BIND(C)
+
+ USE ISO_C_BINDING,  ONLY: C_INT, C_PTR
+ USE NETCDF_NC_DATA, ONLY: CINT1
+
+ Integer(KIND=C_INT), VALUE       :: ncid, varid
+ Type(C_PTR),         VALUE       :: startp, countp, stridep, imapp
+ Integer(KIND=CINT1), Intent(OUT) :: ip(*)
+
+ Integer(KIND=C_INT)              :: nc_get_varm_schar
+
+ End Function nc_get_varm_schar
+End Interface
+!--------------------------------- nc_put_varm_short --------------------------
+Interface
+ Function nc_put_varm_short(ncid, varid, startp, countp, stridep, imapp, op)  &
+                            BIND(C)
+
+ USE ISO_C_BINDING,  ONLY: C_INT, C_PTR
+ USE NETCDF_NC_DATA, ONLY: CINT2
+
+ Integer(KIND=C_INT), VALUE      :: ncid, varid
+ Type(C_PTR),         VALUE      :: startp, countp, stridep, imapp
+ Integer(KIND=CINT2), Intent(IN) :: op(*)
+
+ Integer(KIND=C_INT)             :: nc_put_varm_short
+
+ End Function nc_put_varm_short
+End Interface
+!--------------------------------- nc_get_varm_short --------------------------
+Interface
+ Function nc_get_varm_short(ncid, varid, startp, countp, stridep, imapp, ip)  &
+                            BIND(C)
+
+ USE ISO_C_BINDING,  ONLY: C_INT, C_PTR
+ USE NETCDF_NC_DATA, ONLY: CINT2
+
+ Integer(KIND=C_INT), VALUE       :: ncid, varid
+ Type(C_PTR),         VALUE       :: startp, countp, stridep, imapp
+ Integer(KIND=CINT2), Intent(OUT) :: ip(*)
+
+ Integer(KIND=C_INT)              :: nc_get_varm_short
+
+ End Function nc_get_varm_short
+End Interface
+!--------------------------------- nc_put_varm_int ----------------------------
+Interface
+ Function nc_put_varm_int(ncid, varid, startp, countp, stridep, imapp, op)  &
+                          BIND(C)
+
+ USE ISO_C_BINDING,  ONLY: C_INT, C_PTR
+ USE NETCDF_NC_DATA, ONLY: CINT
+
+ Integer(KIND=C_INT), VALUE      :: ncid, varid
+ Type(C_PTR),         VALUE      :: startp, countp, stridep, imapp
+ Integer(KIND=CINT),  Intent(IN) :: op(*)
+
+ Integer(KIND=C_INT)             :: nc_put_varm_int
+
+ End Function nc_put_varm_int
+End Interface
+!--------------------------------- nc_get_varm_int ----------------------------
+Interface
+ Function nc_get_varm_int(ncid, varid, startp, countp, stridep, imapp, ip)  &
+                          BIND(C)
+
+ USE ISO_C_BINDING,  ONLY: C_INT, C_PTR
+ USE NETCDF_NC_DATA, ONLY: CINT
+
+ Integer(KIND=C_INT), VALUE       :: ncid, varid
+ Type(C_PTR),         VALUE       :: startp, countp, stridep, imapp
+ Integer(KIND=CINT),  Intent(OUT) :: ip(*)
+
+ Integer(KIND=C_INT)              :: nc_get_varm_int
+
+ End Function nc_get_varm_int
+End Interface
+!--------------------------------- nc_put_varm_long ---------------------------
+Interface
+ Function nc_put_varm_long(ncid, varid, startp, countp, stridep, imapp, op)  &
+                           BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_INT, C_LONG, C_PTR
+
+ Integer(KIND=C_INT),  VALUE      :: ncid, varid
+ Type(C_PTR),          VALUE      :: startp, countp, stridep, imapp
+ Integer(KIND=C_LONG), Intent(IN) :: op(*)
+
+ Integer(KIND=C_INT)              :: nc_put_varm_long
+
+ End Function nc_put_varm_long
+End Interface
+!--------------------------------- nc_get_varm_long ---------------------------
+Interface
+ Function nc_get_varm_long(ncid, varid, startp, countp, stridep, imapp, ip)  &
+                           BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_INT, C_LONG, C_PTR
+
+ Integer(KIND=C_INT),  VALUE       :: ncid, varid
+ Type(C_PTR),          VALUE       :: startp, countp, stridep, imapp
+ Integer(KIND=C_LONG), Intent(OUT) :: ip(*)
+
+ Integer(KIND=C_INT)               :: nc_get_varm_long
+
+ End Function nc_get_varm_long
+End Interface
+!--------------------------------- nc_put_varm_float --------------------------
+Interface
+ Function nc_put_varm_float(ncid, varid, startp, countp, stridep, imapp, op)  &
+                            BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_INT, C_FLOAT, C_PTR
+
+ Integer(KIND=C_INT), VALUE      :: ncid, varid
+ Type(C_PTR),         VALUE      :: startp, countp, stridep, imapp
+ Real(KIND=C_FLOAT),  Intent(IN) :: op(*)
+
+ Integer(KIND=C_INT)             :: nc_put_varm_float
+
+ End Function nc_put_varm_float
+End Interface
+!--------------------------------- nc_get_varm_float --------------------------
+Interface
+ Function nc_get_varm_float(ncid, varid, startp, countp, stridep, imapp, ip)  &
+                            BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_INT, C_FLOAT, C_PTR
+
+ Integer(KIND=C_INT), VALUE       :: ncid, varid
+ Type(C_PTR),         VALUE       :: startp, countp, stridep, imapp
+ Real(KIND=C_FLOAT),  Intent(OUT) :: ip(*)
+
+ Integer(KIND=C_INT)              :: nc_get_varm_float
+
+ End Function nc_get_varm_float
+End Interface
+!--------------------------------- nc_put_varm_double -------------------------
+Interface
+ Function nc_put_varm_double(ncid, varid, startp, countp, stridep,imapp, op)  &
+                             BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_INT, C_DOUBLE, C_PTR
+
+ Integer(KIND=C_INT), VALUE      :: ncid, varid
+ Type(C_PTR),         VALUE      :: startp, countp, stridep, imapp
+ Real(KIND=C_DOUBLE), Intent(IN) :: op(*)
+
+ Integer(KIND=C_INT)             :: nc_put_varm_double
+
+ End Function nc_put_varm_double
+End Interface
+!--------------------------------- nc_get_varm_double -------------------------
+Interface
+ Function nc_get_varm_double(ncid, varid, startp, countp, stridep,imapp, ip)  &
+                             BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_INT, C_DOUBLE, C_PTR
+
+ Integer(KIND=C_INT), VALUE       :: ncid, varid
+ Type(C_PTR),         VALUE       :: startp, countp, stridep, imapp
+ Real(KIND=C_DOUBLE), Intent(OUT) :: ip(*)
+
+ Integer(KIND=C_INT)              :: nc_get_varm_double
+
+ End Function nc_get_varm_double
+End Interface
+!--------------------------------- nc_inq_att --------------------------------
+Interface
+ Function nc_inq_att(ncid, varid, name, xtypep, lenp)  BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_INT, C_SIZE_T, C_CHAR
+
+ Integer(KIND=C_INT),    VALUE       :: ncid, varid
+ Character(KIND=C_CHAR), Intent(IN)  :: name(*)
+ Integer(KIND=C_INT),    Intent(OUT) :: xtypep
+ Integer(KIND=C_SIZE_T), Intent(OUT) :: lenp
+
+ Integer(KIND=C_INT)                 :: nc_inq_att
+
+ End Function nc_inq_att
+End Interface
+!--------------------------------- nc_inq_attid ------------------------------
+Interface
+ Function nc_inq_attid(ncid, varid, name, attnump)   BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_INT, C_CHAR
+
+ Integer(KIND=C_INT),    VALUE       :: ncid, varid
+ Character(KIND=C_CHAR), Intent(IN)  :: name(*)
+ Integer(KIND=C_INT),    Intent(OUT) :: attnump
+
+ Integer(KIND=C_INT)                 :: nc_inq_attid
+
+ End Function nc_inq_attid
+End Interface
+!--------------------------------- nc_inq_atttype ----------------------------
+Interface
+ Function nc_inq_atttype(ncid, varid, name, xtypep)   BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_INT, C_CHAR
+
+ Integer(KIND=C_INT),    VALUE       :: ncid, varid
+ Character(KIND=C_CHAR), Intent(IN)  :: name(*)
+ Integer(KIND=C_INT),    Intent(OUT) :: xtypep
+
+ Integer(KIND=C_INT)                 :: nc_inq_atttype
+
+ End Function nc_inq_atttype
+End Interface
+!--------------------------------- nc_inq_attlen -----------------------------
+Interface
+ Function nc_inq_attlen(ncid, varid, name, lenp)   BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_INT, C_SIZE_T, C_CHAR
+
+ Integer(KIND=C_INT),    VALUE       :: ncid, varid
+ Character(KIND=C_CHAR), Intent(IN)  :: name(*)
+ Integer(KIND=C_SIZE_T), Intent(OUT) :: lenp
+
+ Integer(KIND=C_INT)                 :: nc_inq_attlen
+
+ End Function nc_inq_attlen
+End Interface
+!--------------------------------- nc_inq_attname ----------------------------
+Interface
+ Function nc_inq_attname(ncid, varid, attnum, name)   BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_INT, C_CHAR
+
+ Integer(KIND=C_INT),    VALUE         :: ncid, varid, attnum
+ Character(KIND=C_CHAR), Intent(INOUT) :: name(*)
+
+ Integer(KIND=C_INT)                   :: nc_inq_attname
+
+ End Function nc_inq_attname
+End Interface
+!--------------------------------- nc_copy_att -------------------------------
+Interface
+ Function nc_copy_att(ncid_in, varid_in, name, ncid_out, varid_out )  BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_INT, C_CHAR
+
+ Integer(KIND=C_INT),    VALUE      :: ncid_in, varid_in, varid_out, &
+                                       ncid_out
+ Character(KIND=C_CHAR), Intent(IN) :: name(*)
+
+ Integer(KIND=C_INT)                :: nc_copy_att
+
+ End Function nc_copy_att
+End Interface
+!--------------------------------- nc_rename_att -----------------------------
+Interface
+ Function nc_rename_att(ncid, varid, name, newname)   BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_INT, C_CHAR
+
+ Integer(KIND=C_INT),    VALUE      :: ncid, varid
+ Character(KIND=C_CHAR), Intent(IN) :: name(*), newname(*)
+
+ Integer(KIND=C_INT)                :: nc_rename_att
+
+ End Function nc_rename_att
+End Interface
+!--------------------------------- nc_del_att --------------------------------
+Interface
+ Function nc_del_att(ncid, varid, name)  BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_INT, C_CHAR
+
+ Integer(KIND=C_INT),    VALUE      :: ncid, varid
+ Character(KIND=C_CHAR), Intent(IN) :: name(*)
+
+ Integer(KIND=C_INT)                :: nc_del_att
+
+ End Function nc_del_att
+End Interface
+!--------------------------------- nc_put_att_text ---------------------------
+Interface
+ Function nc_put_att_text(ncid, varid, name, nlen, op) BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_INT, C_SIZE_T, C_CHAR
+
+ Integer(KIND=C_INT),    VALUE      :: ncid, varid
+ Integer(KIND=C_SIZE_T), VALUE      :: nlen
+ Character(KIND=C_CHAR), Intent(IN) :: name(*)
+ Character(KIND=C_CHAR), Intent(IN) :: op(*)
+
+ Integer(KIND=C_INT)                :: nc_put_att_text
+
+ End Function nc_put_att_text
+End Interface
+!--------------------------------- nc_get_att_text ---------------------------
+Interface
+ Function nc_get_att_text(ncid, varid, name, ip) BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_INT, C_CHAR
+
+ Integer(KIND=C_INT),    VALUE       :: ncid, varid
+ Character(KIND=C_CHAR), Intent(IN)  :: name(*)
+ Character(KIND=C_CHAR), Intent(OUT) :: ip(*)
+
+ Integer(KIND=C_INT)                 :: nc_get_att_text
+
+ End Function nc_get_att_text
+End Interface
+!--------------------------------- nc_put_att_uchar --------------------------
+Interface
+ Function nc_put_att_uchar(ncid, varid, name, xtype, nlen, op)   BIND(C)
+
+ USE ISO_C_BINDING,  ONLY: C_INT, C_SIZE_T, C_CHAR
+ USE NETCDF_NC_DATA, ONLY: CINT1
+
+ Integer(KIND=C_INT),    VALUE      :: ncid, varid
+ Integer(KIND=C_SIZE_T), VALUE      :: nlen
+ Integer(KIND=C_INT),    VALUE      :: xtype
+ Character(KIND=C_CHAR), Intent(IN) :: name(*)
+ Integer(KIND=CINT1),    Intent(IN) :: op(*)
+
+ Integer(KIND=C_INT)                :: nc_put_att_uchar
+
+ End Function nc_put_att_uchar
+End Interface
+!--------------------------------- nc_get_att_uchar --------------------------
+Interface
+ Function nc_get_att_uchar(ncid, varid, name, ip)   BIND(C)
+
+ USE ISO_C_BINDING,  ONLY: C_INT, C_CHAR
+ USE NETCDF_NC_DATA, ONLY: CINT1
+
+ Integer(KIND=C_INT),    VALUE       :: ncid, varid
+ Character(KIND=C_CHAR), Intent(IN)  :: name(*)
+ Integer(KIND=CINT1),    Intent(OUT) :: ip(*)
+
+ Integer(KIND=C_INT)                 :: nc_get_att_uchar
+
+ End Function nc_get_att_uchar
+End Interface
+!--------------------------------- nc_put_att_schar --------------------------
+Interface
+ Function nc_put_att_schar(ncid, varid, name, xtype, nlen, op)   BIND(C)
+
+ USE ISO_C_BINDING,  ONLY: C_INT, C_SIZE_T, C_CHAR
+ USE NETCDF_NC_DATA, ONLY: CINT1
+
+ Integer(KIND=C_INT),    VALUE      :: ncid, varid
+ Integer(KIND=C_SIZE_T), VALUE      :: nlen
+ Integer(KIND=C_INT),    VALUE      :: xtype
+ Character(KIND=C_CHAR), Intent(IN) :: name(*)
+ Integer(KIND=CINT1),    Intent(IN) :: op(*)
+
+ Integer(KIND=C_INT)                :: nc_put_att_schar
+
+ End Function nc_put_att_schar
+End Interface
+!--------------------------------- nc_get_att_schar --------------------------
+Interface
+ Function nc_get_att_schar(ncid, varid, name, ip)   BIND(C)
+
+ USE ISO_C_BINDING,  ONLY: C_INT, C_CHAR
+ USE NETCDF_NC_DATA, ONLY: CINT1
+
+ Integer(KIND=C_INT),    VALUE       :: ncid, varid
+ Character(KIND=C_CHAR), Intent(IN)  :: name(*)
+ Integer(KIND=CINT1),    Intent(OUT) :: ip(*)
+
+ Integer(KIND=C_INT)                 :: nc_get_att_schar
+
+ End Function nc_get_att_schar
+End Interface
+!--------------------------------- nc_put_att_short --------------------------
+Interface
+ Function nc_put_att_short(ncid, varid, name, xtype, nlen, op)   BIND(C)
+
+ USE ISO_C_BINDING,  ONLY: C_INT, C_SIZE_T, C_CHAR
+ USE NETCDF_NC_DATA, ONLY: CINT2
+
+ Integer(KIND=C_INT),    VALUE      :: ncid, varid
+ Integer(KIND=C_SIZE_T), VALUE      :: nlen
+ Integer(KIND=C_INT),    VALUE      :: xtype
+ Character(KIND=C_CHAR), Intent(IN) :: name(*)
+ Integer(KIND=CINT2),    Intent(IN) :: op(*)
+
+ Integer(KIND=C_INT)                :: nc_put_att_short
+
+ End Function nc_put_att_short
+End Interface
+!--------------------------------- nc_get_att_short --------------------------
+Interface
+ Function nc_get_att_short(ncid, varid, name, ip)   BIND(C)
+
+ USE ISO_C_BINDING,  ONLY: C_INT, C_CHAR
+ USE NETCDF_NC_DATA, ONLY: CINT2
+
+ Integer(KIND=C_INT),    VALUE       :: ncid, varid
+ Character(KIND=C_CHAR), Intent(IN)  :: name(*)
+ Integer(KIND=CINT2),    Intent(OUT) :: ip(*)
+
+ Integer(KIND=C_INT)                 :: nc_get_att_short
+
+ End Function nc_get_att_short
+End Interface
+!--------------------------------- nc_put_att_int --------------------------
+Interface
+ Function nc_put_att_int(ncid, varid, name, xtype, nlen, op)   BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_INT, C_SIZE_T, C_CHAR
+
+ Integer(KIND=C_INT),    VALUE      :: ncid, varid
+ Integer(KIND=C_SIZE_T), VALUE      :: nlen
+ Integer(KIND=C_INT),    VALUE      :: xtype
+ Character(KIND=C_CHAR), Intent(IN) :: name(*)
+ Integer(KIND=C_INT),    Intent(IN) :: op(*)
+
+ Integer(KIND=C_INT)                :: nc_put_att_int
+
+ End Function nc_put_att_int
+End Interface
+!--------------------------------- nc_get_att_int -----------------------------
+Interface
+ Function nc_get_att_int(ncid, varid, name, ip)   BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_INT, C_CHAR
+
+ Integer(KIND=C_INT),    VALUE       :: ncid, varid
+ Character(KIND=C_CHAR), Intent(IN)  :: name(*)
+ Integer(KIND=C_INT),    Intent(OUT) :: ip(*)
+
+ Integer(KIND=C_INT)                 :: nc_get_att_int
+
+ End Function nc_get_att_int
+End Interface
+!--------------------------------- nc_put_att_long --------------------------
+Interface
+ Function nc_put_att_long(ncid, varid, name, xtype, nlen, op)   BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_INT, C_SIZE_T, C_LONG, C_CHAR
+
+ Integer(KIND=C_INT),    VALUE      :: ncid, varid
+ Integer(KIND=C_SIZE_T), VALUE      :: nlen
+ Integer(KIND=C_INT),    VALUE      :: xtype
+ Character(KIND=C_CHAR), Intent(IN) :: name(*)
+ Integer(KIND=C_LONG),   Intent(IN) :: op(*)
+
+ Integer(KIND=C_INT)                :: nc_put_att_long
+
+ End Function nc_put_att_long
+End Interface
+!--------------------------------- nc_get_att_long --------------------------
+Interface
+ Function nc_get_att_long(ncid, varid, name, ip)   BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_INT, C_LONG, C_CHAR
+
+ Integer(KIND=C_INT),    VALUE       :: ncid, varid
+ Character(KIND=C_CHAR), Intent(IN)  :: name(*)
+ Integer(KIND=C_LONG),   Intent(OUT) :: ip(*)
+
+ Integer(KIND=C_INT)                 :: nc_get_att_long
+
+ End Function nc_get_att_long
+End Interface
+!--------------------------------- nc_put_att_float --------------------------
+Interface
+ Function nc_put_att_float(ncid, varid, name, xtype, nlen, op)   BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_INT, C_SIZE_T, C_FLOAT, C_CHAR
+
+ Integer(KIND=C_INT),    VALUE      :: ncid, varid
+ Integer(KIND=C_SIZE_T), VALUE      :: nlen
+ Integer(KIND=C_INT),    VALUE      :: xtype
+ Character(KIND=C_CHAR), Intent(IN) :: name(*)
+ Real(KIND=C_FLOAT),     Intent(IN) :: op(*)
+
+ Integer(KIND=C_INT) :: nc_put_att_float
+
+ End Function nc_put_att_float
+End Interface
+!--------------------------------- nc_get_att_float --------------------------
+Interface
+ Function nc_get_att_float(ncid, varid, name, ip)   BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_INT, C_FLOAT, C_CHAR
+
+ Integer(KIND=C_INT),    VALUE       :: ncid, varid
+ Character(KIND=C_CHAR), Intent(IN)  :: name(*)
+ Real(KIND=C_FLOAT),     Intent(OUT) :: ip(*)
+
+ Integer(KIND=C_INT)                 :: nc_get_att_float
+
+ End Function nc_get_att_float
+End Interface
+!--------------------------------- nc_put_att_double -------------------------
+Interface
+ Function nc_put_att_double(ncid, varid, name, xtype, nlen, op) BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_INT, C_SIZE_T, C_DOUBLE, C_CHAR
+
+ Integer(KIND=C_INT),    VALUE      :: ncid, varid
+ Integer(KIND=C_SIZE_T), VALUE      :: nlen
+ Integer(KIND=C_INT),    VALUE      :: xtype
+ Character(KIND=C_CHAR), Intent(IN) :: name(*)
+ Real(KIND=C_DOUBLE),    Intent(IN) :: op(*)
+
+ Integer(KIND=C_INT)                :: nc_put_att_double
+
+ End Function nc_put_att_double
+End Interface
+!------------------------------- nc_get_att_double -------------------------
+Interface
+ Function nc_get_att_double(ncid, varid, name, ip) BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_INT, C_DOUBLE, C_CHAR
+
+ Integer(KIND=C_INT),    VALUE       :: ncid, varid
+ Character(KIND=C_CHAR), Intent(IN)  :: name(*)
+ Real(KIND=C_DOUBLE),    Intent(OUT) :: ip(*)
+
+ Integer(KIND=C_INT)                 :: nc_get_att_double
+
+ End Function nc_get_att_double
+End Interface
+!------------------------------- nc_copy_var --------------------------------
+Interface
+ Function nc_copy_var(ncid_in, varid, ncid_out)  BIND(C)
+
+ USE ISO_C_BINDING, ONLY: C_INT
+
+ Integer(KIND=C_INT), VALUE :: ncid_in, varid, ncid_out
+
+ Integer(KIND=C_INT)        :: nc_copy_var
+
+ End Function nc_copy_var
+End Interface
+!------------------------------- nc_set_default_format -----------------------
+Interface
+ Function nc_set_default_format(newform, old_format)  BIND(C)
+!
+ USE ISO_C_BINDING, ONLY: C_INT
+
+ Integer(KIND=C_INT), VALUE       :: newform
+ Integer(KIND=C_INT), Intent(OUT) :: old_format
+
+ Integer(KIND=C_INT)              :: nc_set_default_format
+
+ End Function nc_set_default_format
+End Interface
+!---------------------------- Start of module procedures ---------------------
+CONTAINS
+
+! Utilities to support C interface routines
+
+!----------------------------------- addCNullChar -----------------------------
+ Function addCNullChar(string, nlen) Result(cstring)
+
+! Add a C_NULL_CHAR to a string to create a C compatible
+! string. Assumes target variable will be of length
+! LEN(string)+1. Trailing blanks will be stripped
+! from string and length of trimmed string will
+! be returned in nlen
+
+! USE ISO_C_BINDING
+
+ Implicit NONE
+
+ Character(LEN=*), Intent(IN)    :: string
+ Integer,          Intent(INOUT) :: nlen
+
+ Character(LEN=(LEN(string)+1))  :: cstring
+
+ Integer :: inull
+
+
+! first check to see if we already have a C NULL char attached
+! to string and strip trailing blanks. We will overwrite it if
+! we do
+
+ nlen  = LEN_TRIM(string)
+ inull = SCAN(string, C_NULL_CHAR)
+
+ If (inull > 1) nlen = inull - 1
+ nlen = MAX(1,nlen)  ! Make sure nlen is at least 1
+
+! append null char to trimmed string
+
+ cstring = REPEAT(" ", LEN(cstring)) ! init to blanks
+ cstring = string(1:nlen)//C_NULL_CHAR
+
+ End Function addCNullChar
+!----------------------------------- stripCNullChar ----------------------------
+ Function StripCNullChar(cstring, nlen) Result(string)
+
+! Check cstring for a C NULL char, strip it off and
+! return regular string. Limit length of cstring loaded
+! into string to nlen
+
+! USE ISO_C_BINDING, ONLY: C_NULL_CHAR
+
+ Implicit NONE
+
+ Character(LEN=*), Intent(IN) :: cstring
+ Integer,          Intent(IN) :: nlen
+
+ Character(LEN=nlen)          :: string
+
+ Integer :: ie, inull
+
+ ie    = LEN_TRIM(cstring)
+ inull = SCAN(cstring, C_NULL_CHAR)
+
+ If (inull > 1) ie=inull-1
+ ie = MAX(1, MIN(ie,nlen)) ! limit ie to 1 or nlen
+
+ string       = REPEAT(" ", nlen)
+ string(1:ie) = cstring(1:ie)
+
+ End Function StripCNullChar
+!
+!----------------------------End of Module netcdf_c_interfaces ----------------
+End Module netcdf_nc_interfaces
diff --git a/fortran/module_netcdf_nf_data.F90 b/fortran/module_netcdf_nf_data.F90
new file mode 100755
index 0000000..ce10fcc
--- /dev/null
+++ b/fortran/module_netcdf_nf_data.F90
@@ -0,0 +1,315 @@
+Module netcdf_nf_data
+
+! Module for Netcdf FORTRAN 2003 nf parameters. This includes all the
+! error condition parameters, external data types, fill values etc.
+! for netCDF2,3,4
+
+! Written by: Richard Weed, Ph.D.
+!             Center for Advanced Vehicular Systems 
+!             Mississippi State University
+!             rweed at cavs.msstate.edu
+
+
+! License (and other Lawyer Language)
+ 
+! This software is released under the Apache 2.0 Open Source License. The
+! full text of the License can be viewed at :
+!
+!   http:www.apache.org/licenses/LICENSE-2.0.html
+!
+! The author grants to the University Corporation for Atmospheric Research
+! (UCAR), Boulder, CO, USA the right to revise and extend the software
+! without restriction. However, the author retains all copyrights and
+! intellectual property rights explicitly stated in or implied by the
+! Apache license
+
+! Version 1. Sept. 2005 - initial Cray X1 version for netcdf 3.6,0
+! Version 2. Apr.  2005 - updated to be consistent with netcdf 3.6.1
+! Version 3. Apr.  2009 - updated for netCDF 4.0.1
+! Version 4. Apr.  2010 - updated for netCDF 4.1.1
+! Version 5. Feb.  2013 - Updated for netCDF 4.4
+
+! This module is provided as a replacement for parts of the netcdf2.inc,
+! netcdf3.inc and netcdf4.inc include files. It does not include the 
+! external statements for the nf_ functions. The latter are not needed
+! if you use the interfaces in module_netcdf_nf_interfaces. If you
+! want the externals, just use the include files.
+
+ USE netcdf_nc_data
+                                                         
+ Implicit NONE
+
+#include "nfconfig.inc"
+
+! Define values found in netcdf2.inc, netcdf3.inc, and netcdf4.inc
+! Also some additional values from the NC_DATA interfaces
+!                
+! Define enumerator nc_type data as integers
+
+ Integer, Parameter ::  NF_NAT    = NC_NAT 
+ Integer, Parameter ::  NF_BYTE   = NC_BYTE 
+ Integer, Parameter ::  NF_INT1   = NF_BYTE
+ Integer, Parameter ::  NF_CHAR   = NC_CHAR 
+ Integer, Parameter ::  NF_SHORT  = NC_SHORT 
+ Integer, Parameter ::  NF_INT2   = NF_SHORT
+ Integer, Parameter ::  NF_INT    = NC_INT 
+ Integer, Parameter ::  NF_FLOAT  = NC_FLOAT 
+ Integer, Parameter ::  NF_REAL   = NF_FLOAT
+ Integer, Parameter ::  NF_DOUBLE = NC_DOUBLE 
+
+! Default fill values
+
+ Integer,          Parameter :: NF_FILL_CHAR  = IACHAR(NC_FILL_CHAR) 
+ Integer(IK1),     Parameter :: NF_FILL_BYTE  = NC_FILL_BYTE
+ Integer(IK2),     Parameter :: NF_FILL_SHORT = NC_FILL_SHORT
+ Integer,          Parameter :: NF_FILL_INT   = NC_FILL_INT
+
+ Real(RK4),        Parameter :: NF_FILL_FLOAT  = NC_FILL_FLOAT
+ Real(RK4),        Parameter :: NF_FILL_REAL   = NF_FILL_FLOAT
+ Real(RK4),        Parameter :: NF_FILL_REAL4  = NF_FILL_FLOAT 
+ Real(RK8),        Parameter :: NF_FILL_DOUBLE = NC_FILL_DOUBLE
+ Real(RK8),        Parameter :: NF_FILL_REAL8  = NF_FILL_DOUBLE 
+
+! Mode flags for opening and creating datasets
+
+ Integer, Parameter :: NF_NOWRITE          = NC_NOWRITE 
+ Integer, Parameter :: NF_WRITE            = NC_WRITE 
+ Integer, Parameter :: NF_CLOBBER          = NC_CLOBBER 
+ Integer, Parameter :: NF_NOCLOBBER        = NC_NOCLOBBER 
+ Integer, Parameter :: NF_FILL             = NC_FILL 
+ Integer, Parameter :: NF_NOFILL           = NC_NOFILL 
+ Integer, Parameter :: NF_LOCK             = NC_LOCK 
+ Integer, Parameter :: NF_SHARE            = NC_SHARE 
+ Integer, Parameter :: NF_STRICT_NC3       = NC_STRICT_NC3 
+ Integer, Parameter :: NF_64BIT_OFFSET     = NC_64BIT_OFFSET 
+ Integer, Parameter :: NF_SIZEHINT_DEFAULT = NC_SIZEHINT_DEFAULT 
+ Integer, Parameter :: NF_ALIGN_CHUNK      = NC_ALIGN_CHUNK
+ Integer, Parameter :: NF_FORMAT_CLASSIC   = NC_FORMAT_CLASSIC
+ Integer, Parameter :: NF_FORMAT_64BIT     = NC_FORMAT_64BIT 
+ Integer, Parameter :: NF_DISKLESS         = NC_DISKLESS 
+ Integer, Parameter :: NF_MMAP             = NC_MMAP
+
+! Unlimited dimension size argument and global attibute ID
+
+ Integer,  Parameter :: NF_UNLIMITED = NC_UNLIMITED 
+ Integer,  Parameter :: NF_GLOBAL    = NC_GLOBAL 
+
+! Implementation limits (WARNING!  SHOULD BE THE SAME AS C INTERFACE)
+
+ Integer, Parameter :: NF_MAX_DIMS     = NC_MAX_DIMS 
+ Integer, Parameter :: NF_MAX_ATTRS    = NC_MAX_ATTRS 
+ Integer, Parameter :: NF_MAX_VARS     = NC_MAX_VARS 
+ Integer, Parameter :: NF_MAX_NAME     = NC_MAX_NAME 
+ Integer, Parameter :: NF_MAX_VAR_DIMS = NC_MAX_DIMS
+
+! Error codes
+
+ Integer, Parameter :: NF_NOERR        = NC_NOERR 
+ Integer, Parameter :: NF2_ERR         = NC2_ERR 
+ Integer, Parameter :: NF_SYSERR       = NC_SYSERR 
+ Integer, Parameter :: NF_EXDR         = NC_EXDR 
+ Integer, Parameter :: NF_EBADID       = NC_EBADID 
+ Integer, Parameter :: NF_EBFILE       = NC_EBFILE 
+ Integer, Parameter :: NF_EEXIST       = NC_EEXIST 
+ Integer, Parameter :: NF_EINVAL       = NC_EINVAL 
+ Integer, Parameter :: NF_EPERM        = NC_EPERM 
+ Integer, Parameter :: NF_ENOTINDEFINE = NC_ENOTINDEFINE
+ Integer, Parameter :: NF_EINDEFINE    = NC_EINDEFINE
+ Integer, Parameter :: NF_EINVALCOORDS = NC_EINVALCOORDS
+ Integer, Parameter :: NF_EMAXDIMS     = NC_EMAXDIMS
+ Integer, Parameter :: NF_ENAMEINUSE   = NC_ENAMEINUSE
+ Integer, Parameter :: NF_ENOTATT      = NC_ENOTATT
+ Integer, Parameter :: NF_EMAXATTS     = NC_EMAXATTS
+ Integer, Parameter :: NF_EBADTYPE     = NC_EBADTYPE
+ Integer, Parameter :: NF_EBADDIM      = NC_EBADDIM
+ Integer, Parameter :: NF_EUNLIMPOS    = NC_EUNLIMPOS
+ Integer, Parameter :: NF_EMAXVARS     = NC_EMAXVARS
+ Integer, Parameter :: NF_ENOTVAR      = NC_ENOTVAR 
+ Integer, Parameter :: NF_EGLOBAL      = NC_EGLOBAL 
+ Integer, Parameter :: NF_ENOTNC       = NC_ENOTNC
+ Integer, Parameter :: NF_ESTS         = NC_ESTS
+ Integer, Parameter :: NF_EMAXNAME     = NC_EMAXNAME
+ Integer, Parameter :: NF_EUNLIMIT     = NC_EUNLIMIT
+ Integer, Parameter :: NF_ENORECVARS   = NC_ENORECVARS
+ 
+ Integer, Parameter :: NF_ECHAR        = NC_ECHAR 
+ Integer, Parameter :: NF_EEDGE        = NC_EEDGE
+ Integer, Parameter :: NF_ESTRIDE      = NC_ESTRIDE 
+ Integer, Parameter :: NF_EBADNAME     = NC_EBADNAME
+ Integer, Parameter :: NF_ERANGE       = NC_ERANGE
+ Integer, Parameter :: NF_ENOMEM       = NC_ENOMEM
+ Integer, Parameter :: NF_EVARSIZE     = NC_EVARSIZE
+ Integer, Parameter :: NF_EDIMSIZE     = NC_EDIMSIZE 
+ Integer, Parameter :: NF_ETRUNC       = NC_ETRUNC 
+
+! Error handling codes
+
+ Integer, Parameter :: NF_FATAL   = NC_FATAL 
+ Integer, Parameter :: NF_VERBOSE = NC_VERBOSE 
+
+#ifdef USE_NETCDF4
+
+! NETCDF4 parameters 
+
+! data types
+
+ Integer, Parameter :: NF_LONG     = NC_LONG
+ Integer, Parameter :: NF_UBYTE    = NC_UBYTE 
+ Integer, Parameter :: NF_USHORT   = NC_USHORT 
+ Integer, Parameter :: NF_UINT     = NC_UINT 
+ Integer, Parameter :: NF_INT64    = NC_INT64 
+ Integer, Parameter :: NF_UINT64   = NC_UINT64 
+ Integer, Parameter :: NF_STRING   = NC_STRING 
+ Integer, Parameter :: NF_VLEN     = NC_VLEN 
+ Integer, Parameter :: NF_OPAQUE   = NC_OPAQUE 
+ Integer, Parameter :: NF_ENUM     = NC_ENUM 
+ Integer, Parameter :: NF_COMPOUND = NC_COMPOUND
+
+! Netcdf4 fill flags - for some reason the F90 values are different
+
+ Integer,      Parameter :: NF_FILL_UBYTE  = NC_FILL_UBYTE 
+ Integer,      Parameter :: NF_FILL_UINT1  = NF_FILL_UBYTE 
+ Integer,      Parameter :: NF_FILL_USHORT = NC_FILL_USHORT
+ Integer,      Parameter :: NF_FILL_UINT2  = NF_FILL_USHORT
+ Integer(IK8), Parameter :: NF_FILL_UINT   = NC_FILL_UINT
+ Integer(IK8), Parameter :: NF_FILL_INT64  = NC_FILL_INT64 
+
+! new format types
+ Integer, Parameter :: NF_FORMAT_NETCDF4         = NC_FORMAT_NETCDF4 
+ Integer, Parameter :: NF_FORMAT_NETCDF4_CLASSIC = NC_FORMAT_NETCDF4_CLASSIC
+ 
+! Netcdf4 create mode flags
+ Integer, Parameter :: NF_NETCDF4        = NC_NETCDF4 
+ Integer, Parameter :: NF_HDF5           = NF_NETCDF4 ! deprecated
+ Integer, Parameter :: NF_CLASSIC_MODEL  = NC_CLASSIC_MODEL 
+! Netcdf4 variable flags
+ Integer, Parameter :: NF_CHUNK_SEQ      = NC_CHUNK_SEQ 
+ Integer, Parameter :: NF_CHUNK_SUB      = NC_CHUNK_SUB 
+ Integer, Parameter :: NF_CHUNK_SIZES    = NC_CHUNK_SIZES 
+ Integer, Parameter :: NF_ENDIAN_NATIVE  = NC_ENDIAN_NATIVE 
+ Integer, Parameter :: NF_ENDIAN_LITTLE  = NC_ENDIAN_LITTLE 
+ Integer, Parameter :: NF_ENDIAN_BIG     = NC_ENDIAN_BIG 
+ Integer, Parameter :: NF_CHUNKED        = NC_CHUNKED 
+ Integer, Parameter :: NF_NOTCONTIGUOUS  = NC_NOTCONTIGUOUS 
+ Integer, Parameter :: NF_CONTIGUOUS     = NC_CONTIGUOUS 
+ Integer, Parameter :: NF_NOCHECKSUM     = NC_NOCHECKSUM 
+ Integer, Parameter :: NF_FLETCHER32     = NC_FLETCHER32 
+ Integer, Parameter :: NF_NOSHUFFLE      = NC_NOSHUFFLE
+ Integer, Parameter :: NF_SHUFFLE        = NC_SHUFFLE 
+ Integer, Parameter :: NF_INDEPENDENT    = NC_INDEPENDENT 
+ Integer, Parameter :: NF_COLLECTIVE     = NC_COLLECTIVE
+
+! Flags for parallel I/O
+
+ Integer, Parameter :: NF_MPIIO          = NC_MPIIO 
+ Integer, Parameter :: NF_MPIPOSIX       = NC_MPIPOSIX 
+ Integer, Parameter :: NF_PNETCDF        = NC_PNETCDF
+
+! SZIP flags
+ 
+ Integer, Parameter :: NF_SZIP_EC_OPTION_MASK = NC_SZIP_EC_OPTION_MASK 
+ Integer, Parameter :: NF_SZIP_NN_OPTION_MASK = NC_SZIP_NN_OPTION_MASK 
+
+! Netcdf4 error flags
+
+ Integer, Parameter :: NF_EHDFERR        = NC_EHDFERR 
+ Integer, Parameter :: NF_ECANTREAD      = NC_ECANTREAD 
+ Integer, Parameter :: NF_ECANTWRITE     = NC_ECANTWRITE 
+ Integer, Parameter :: NF_ECANTCREATE    = NC_ECANTCREATE 
+ Integer, Parameter :: NF_EFILEMETA      = NC_EFILEMETA 
+ Integer, Parameter :: NF_EDIMMETA       = NC_EDIMMETA 
+ Integer, Parameter :: NF_EATTMETA       = NC_EATTMETA
+ Integer, Parameter :: NF_EVARMETA       = NC_EVARMETA 
+ Integer, Parameter :: NF_ENOCOMPOUND    = NC_ENOCOMPOUND 
+ Integer, Parameter :: NF_EATTEXISTS     = NC_EATTEXISTS 
+ Integer, Parameter :: NF_ENOTNC4        = NC_ENOTNC4 
+ Integer, Parameter :: NF_ESTRICTNC3     = NC_ESTRICTNC3 
+ Integer, Parameter :: NF_ENOTNC3        = NC_ENOTNC3 
+ Integer, Parameter :: NF_ENOPAR         = NC_ENOPAR
+ Integer, Parameter :: NF_EPARINIT       = NC_EPARINIT 
+ Integer, Parameter :: NF_EBADGRPID      = NC_EBADGRPID
+ Integer, Parameter :: NF_EBADTYPID      = NC_EBADTYPID
+ Integer, Parameter :: NF_ETYPDEFINED    = NC_ETYPDEFINED
+ Integer, Parameter :: NF_EBADFIELD      = NC_EBADFIELD
+ Integer, Parameter :: NF_EBADCLASS      = NC_EBADCLASS 
+ Integer, Parameter :: NF_EMAPTYPE       = NC_EMAPTYPE 
+ Integer, Parameter :: NF_ELATEFILL      = NC_ELATEFILL 
+ Integer, Parameter :: NF_ELATEDEF       = NC_ELATEDEF 
+ Integer, Parameter :: NF_EDIMSCALE      = NC_EDIMSCALE 
+ Integer, Parameter :: NF_ENOGRP         = NC_ENOGRP 
+#endif
+
+#ifndef NO_NETCDF_2
+! V2 interface values
+
+ Integer, Parameter :: NCBYTE     = NF_BYTE 
+ Integer, Parameter :: NCCHAR     = NF_CHAR 
+ Integer, Parameter :: NCSHORT    = NF_SHORT 
+ Integer, Parameter :: NCLONG     = NF_INT 
+ Integer, Parameter :: NCFLOAT    = NF_FLOAT 
+ Integer, Parameter :: NCDOUBLE   = NF_DOUBLE 
+
+ Integer, Parameter :: NCRDWR     = NF_WRITE 
+ Integer, Parameter :: NCCREATE   = 2
+ Integer, Parameter :: NCEXCL     = 4
+ Integer, Parameter :: NCINDEF    = 8
+ Integer, Parameter :: NCNSYNC    = 16
+ Integer, Parameter :: NCHSYNC    = 32
+ Integer, Parameter :: NCNDIRTY   = 64
+ Integer, Parameter :: NCHDIRTY   = 128
+ Integer, Parameter :: NCFILL     = NF_FILL 
+ Integer, Parameter :: NCNOFILL   = NF_NOFILL 
+ Integer, Parameter :: NCLINK     = 32768
+
+ Integer, Parameter :: NCNOWRIT   = NF_NOWRITE 
+ Integer, Parameter :: NCWRITE    = NF_WRITE
+ Integer, Parameter :: NCCLOB     = NF_CLOBBER
+ Integer, Parameter :: NCNOCLOB   = NF_NOCLOBBER
+
+ Integer, Parameter :: NCUNLIM    = NF_UNLIMITED 
+ Integer, Parameter :: NCGLOBAL   = NF_GLOBAL 
+
+ Integer, Parameter :: MAXNCOP    = 64
+ Integer, Parameter :: MAXNCDIM   = NF_MAX_DIMS 
+ Integer, Parameter :: MAXNCATT   = NF_MAX_ATTRS 
+ Integer, Parameter :: MAXNCVAR   = NF_MAX_VARS 
+ Integer, Parameter :: MAXNCNAM   = NF_MAX_NAME 
+ Integer, Parameter :: MAXVDIMS   = MAXNCDIM
+
+ Integer, Parameter :: NCNOERR    = NF_NOERR
+ Integer, Parameter :: NCEBADID   = NF_EBADID
+ Integer, Parameter :: NCENFILE   = -31
+ Integer, Parameter :: NCEEXIST   = NF_EEXIST
+ Integer, Parameter :: NCEINVAL   = NF_EINVAL
+ Integer, Parameter :: NCEPERM    = NF_EPERM
+ Integer, Parameter :: NCENOTIN   = NF_ENOTINDEFINE
+ Integer, Parameter :: NCEINDEF   = NF_EINDEFINE
+ Integer, Parameter :: NCECOORD   = NF_EINVALCOORDS
+ Integer, Parameter :: NCEMAXDS   = NF_EMAXDIMS
+ Integer, Parameter :: NCENAME    = NF_ENAMEINUSE
+ Integer, Parameter :: NCEMAXAT   = NF_EMAXATTS
+ Integer, Parameter :: NCEBADTY   = NF_EBADTYPE
+ Integer, Parameter :: NCEBADD    = NF_EBADDIM
+ Integer, Parameter :: NCEUNLIM   = NF_EUNLIMPOS
+ Integer, Parameter :: NCEMAXVS   = NF_EMAXVARS
+ Integer, Parameter :: NCENOTVR   = NF_ENOTVAR
+ Integer, Parameter :: NCEGLOB    = NF_EGLOBAL
+ Integer, Parameter :: NCNOTNC    = NF_ENOTNC
+ Integer, Parameter :: NCESTC     = NF_ESTS
+ Integer, Parameter :: NCENTOOL   = NF_EMAXNAME
+ Integer, Parameter :: NCFOOBAR   = 32
+ Integer, Parameter :: NCSYSERR   = NF_SYSERR 
+
+ Integer, Parameter :: NCFATAL    = NF_FATAL 
+ Integer, Parameter :: NCVERBOS   = NF_VERBOSE 
+
+ Integer,      Parameter :: FILCHAR  = NF_FILL_CHAR 
+ Integer(IK1), Parameter :: FILBYTE  = NF_FILL_BYTE 
+ Integer(IK2), Parameter :: FILSHORT = NF_FILL_SHORT 
+ Integer,      Parameter :: FILLONG  = NF_FILL_INT 
+ Real(RK4),    Parameter :: FILFLOAT = NF_FILL_FLOAT 
+ Real(RK8),    Parameter :: FILDOUB  = NF_FILL_DOUBLE 
+#endif
+
+!------------------------------------------------------------------------------
+End Module netcdf_nf_data
diff --git a/fortran/module_netcdf_nf_interfaces.F90 b/fortran/module_netcdf_nf_interfaces.F90
new file mode 100755
index 0000000..1c86664
--- /dev/null
+++ b/fortran/module_netcdf_nf_interfaces.F90
@@ -0,0 +1,1660 @@
+Module netcdf_nf_interfaces
+
+! Explicit interfaces for Netcdf FORTRAN 2003 nf FORTRAN interface routines
+! Generic interfaces are provided for routines that process text data to
+! handle the case where you are using this interface module and are passing
+! an array of single characters (ala C) instead of a character string.
+
+! We choose not to provide explicit interfaces for the V2 routines and
+! newer functions for netCDF4 that pass data of any type to/from void
+! pointers in C using a C_CHAR string array. We do provide external
+! statements for the V2 functions as done in netcdf2.inc
+
+! Written by: Richard Weed, Ph.D.
+!             Center for Advanced Vehicular Systems 
+!             Mississippi State University
+!             rweed at cavs.msstate.edu
+
+
+! License (and other Lawyer Language)
+ 
+! This software is released under the Apache 2.0 Open Source License. The
+! full text of the License can be viewed at :
+!
+!   http:www.apache.org/licenses/LICENSE-2.0.html
+!
+! The author grants to the University Corporation for Atmospheric Research
+! (UCAR), Boulder, CO, USA the right to revise and extend the software
+! without restriction. However, the author retains all copyrights and
+! intellectual property rights explicitly stated in or implied by the
+! Apache license
+
+! Version 1. Sept. 2005 - Initial Cray X1 version
+! Version 2. May, 2006  - Updated to support g95
+! Version 3. April 2009 - Updated for netCDF 4.0.1
+! Version 4. April 2010 - Updated for netCDF 4.1.1
+! Version 5. Feb.  2013 - Added nf_inq_path support for fortran 4.4
+         
+! Most legacy programs don't need to use this module. However, I've created
+! it to support FORTRAN programmers who like to provide explicit interfaces
+! for all subroutines and functions in their codes. Therefore, this module is
+! is primarily for people writting new programs.
+
+ Implicit NONE
+
+#include "nfconfig.inc"
+
+!-------------------- Explicit Interfaces for nf routines ------------------
+
+! Misc functions first
+!-------------------------------- nf_inq_libvers -------------------------------
+Interface
+ Function nf_inq_libvers() RESULT(vermsg)
+
+ Character(LEN=80) :: vermsg
+
+ End Function nf_inq_libvers
+End Interface
+!-------------------------------- nf_strerror ---------------------------------
+Interface
+ Function nf_strerror(nerr) RESULT(errmsg)
+
+ Integer, Intent(IN) :: nerr
+
+ Character(LEN=80)   :: errmsg
+
+ End Function nf_strerror
+End Interface
+!-------------------------------- nf_issyserr ---------------------------------
+Interface
+ Function nf_issyserr(nerr) RESULT(status)
+
+ Integer, Intent(IN) :: nerr
+ Logical             :: status
+
+ End Function nf_issyserr
+End Interface
+
+! Control routines
+!-------------------------------- nf_create -----------------------------------
+Interface
+ Function nf_create(path, cmode, ncid) RESULT (status)
+
+ Character(LEN=*), Intent(IN)  :: path
+ Integer,          Intent(IN)  :: cmode
+ Integer,          Intent(OUT) :: ncid
+ Integer                       :: status
+
+ End Function nf_create
+End Interface
+!-------------------------------- nf__create ----------------------------------
+Interface
+ Function nf__create(path, cmode, initialsz, chunksizehintp, ncid) &
+                        RESULT(status)
+
+ Character(LEN=*), Intent(IN)  :: path
+ Integer,          Intent(IN)  :: cmode, initialsz, chunksizehintp
+ Integer,          Intent(OUT) :: ncid
+ Integer                       :: status
+
+ End Function nf__create
+End Interface
+!-------------------------------- nf__create_mp -------------------------------
+Interface
+ Function nf__create_mp(path, cmode, initialsz, basepe, chunksizehintp, ncid) &
+                        RESULT(status)
+
+ Character(LEN=*), Intent(IN)  :: path
+ Integer,          Intent(IN)  :: cmode, initialsz, chunksizehintp, basepe
+ Integer,          Intent(OUT) :: ncid
+ Integer                       :: status
+
+ End Function nf__create_mp
+End Interface
+!-------------------------------- nf_open -------------------------------------
+Interface
+ Function nf_open(path, mode, ncid) RESULT (status)
+
+ Character(LEN=*), Intent(IN)    :: path
+ Integer,          Intent(IN)    :: mode
+ Integer,          Intent(INOUT) :: ncid
+ Integer                         :: status
+
+ End Function nf_open
+End Interface
+!-------------------------------- nf__open ------------------------------------
+Interface
+ Function nf__open(path, mode, chunksizehintp, ncid) RESULT (status)
+
+ Character(LEN=*), Intent(IN)    :: path
+ Integer,          Intent(IN)    :: mode, chunksizehintp
+ Integer,          Intent(INOUT) :: ncid
+ Integer                         :: status
+
+ End Function nf__open
+End Interface
+!-------------------------------- nf__open_mp ---------------------------------
+Interface
+ Function nf__open_mp(path, mode, basepe, chunksizehintp, ncid) RESULT (status)
+
+ Character(LEN=*), Intent(IN)    :: path
+ Integer,          Intent(IN)    :: mode, chunksizehintp, basepe
+ Integer,          Intent(INOUT) :: ncid
+ Integer                         :: status
+
+ End Function nf__open_mp
+End Interface
+!-------------------------------- nf_inq_path ---------------------------------
+Interface
+ Function nf_inq_path(ncid, pathlen, path) RESULT (status)
+
+ Integer,          Intent(IN)    :: ncid
+ Integer,          Intent(INOUT) :: pathlen
+ Character(LEN=*), Intent(INOUT) :: path
+ Integer                         :: status
+
+ End Function nf_inq_path
+End Interface
+!-------------------------------- nf_set_fill ---------------------------------
+Interface
+ Function nf_set_fill(ncid, fillmode, old_mode) RESULT(status)
+
+ Integer, Intent(IN)  :: ncid, fillmode
+ Integer, Intent(OUT) :: old_mode
+ Integer              :: status
+
+ End Function nf_set_fill
+End Interface
+!-------------------------------- nf_set_default_format -----------------------
+Interface
+ Function nf_set_default_format(newform, old_format) RESULT(status)
+
+ Integer, Intent(IN)  :: newform
+ Integer, Intent(OUT) :: old_format
+ Integer              :: status
+
+ End Function nf_set_default_format
+End Interface
+!-------------------------------- nf_redef -----------------------------------
+Interface
+ Function nf_redef(ncid) RESULT(status)
+
+ Integer, Intent(IN) :: ncid
+ Integer             :: status
+
+ End Function nf_redef
+End Interface
+!-------------------------------- nf_enddef -----------------------------------
+Interface
+ Function nf_enddef(ncid) RESULT(status)
+
+ Integer, Intent(IN) :: ncid
+ Integer             :: status
+
+ End Function nf_enddef
+End Interface
+!-------------------------------- nf__enddef ---------------------------------
+Interface
+ Function nf__enddef(ncid, h_minfree, v_align, v_minfree, r_align) &
+                        RESULT(status)
+
+ Integer, Intent(IN) :: ncid, h_minfree, v_align, v_minfree, r_align
+ Integer             :: status
+
+ End Function nf__enddef
+End Interface
+
+!-------------------------------- nf_sync -------------------------------------
+Interface
+ Function nf_sync(ncid) RESULT(status)
+
+ Integer, Intent(IN) :: ncid
+ Integer             :: status
+
+ End Function nf_sync
+End Interface
+!-------------------------------- nf_abort -----------------------------------
+Interface
+ Function nf_abort(ncid) RESULT(status)
+
+ Integer, Intent(IN) :: ncid
+ Integer             :: status
+
+ End Function nf_abort
+End Interface
+!-------------------------------- nf_close -------------------------------------
+Interface
+ Function nf_close(ncid) RESULT(status)
+
+ Integer, Intent(IN) :: ncid
+ Integer             :: status
+
+ End Function nf_close
+End Interface
+!-------------------------------- nf_delete -----------------------------------
+Interface
+ Function nf_delete(path) RESULT(status)
+
+ Character(LEN=*), Intent(IN) :: path
+ Integer                      :: status
+
+ End Function nf_delete
+End Interface
+!-------------------------------- nf_delete_mp ---------------------------------
+Interface
+ Function nf_delete_mp(path, pe) RESULT(status)
+
+ Character(LEN=*), Intent(IN) :: path
+ Integer,          Intent(IN) :: pe
+ Integer                      :: status
+
+ End Function nf_delete_mp
+End Interface
+!-------------------------------- nf_set_base_pe ------------------------------
+Interface
+ Function nf_set_base_pe(ncid, pe) RESULT(status)
+
+ Integer, Intent(IN) :: ncid, pe
+ Integer             :: status
+
+ End Function nf_set_base_pe
+End Interface
+!-------------------------------- nf_inq_base_pe ------------------------------
+Interface
+ Function nf_inq_base_pe(ncid, pe) RESULT(status)
+
+ Integer, Intent(IN)  :: ncid
+ Integer, Intent(OUT) :: pe
+ Integer              :: status
+
+ End Function nf_inq_base_pe
+End Interface
+
+! Dimension definition and inquiry functions
+
+!-------------------------------- nf_def_dim ----------------------------------
+Interface
+ Function nf_def_dim(ncid, name, dlen, dimid) RESULT (status)
+
+ Integer,          Intent(IN)  :: ncid, dlen
+ Integer,          Intent(OUT) :: dimid
+ Character(LEN=*), Intent(IN)  :: name
+ Integer                       :: status
+
+ End Function nf_def_dim
+End Interface
+!-------------------------------- nf_inq_dim ----------------------------------
+Interface
+ Function nf_inq_dim(ncid, dimid, name, dlen) RESULT (status)
+
+ Integer,          Intent(IN)   :: ncid, dimid
+ Integer,          Intent(OUT)  :: dlen
+ Character(LEN=*), Intent(OUT)  :: name
+ Integer                        :: status
+
+ End Function nf_inq_dim
+End Interface
+!-------------------------------- nf_inq_dimid --------------------------------
+Interface
+ Function nf_inq_dimid(ncid, name, dimid) RESULT (status)
+
+ Integer,          Intent(IN)  :: ncid
+ Integer,          Intent(OUT) :: dimid
+ Character(LEN=*), Intent(IN)  :: name
+ Integer                       :: status
+
+ End Function nf_inq_dimid
+End Interface
+!-------------------------------- nf_inq_dimlen -------------------------------
+Interface
+ Function nf_inq_dimlen(ncid, dimid, dlen) RESULT (status)
+
+ Integer, Intent(IN)  :: ncid, dimid
+ Integer, Intent(OUT) :: dlen
+ Integer              :: status
+
+ End Function nf_inq_dimlen
+End Interface
+!-------------------------------- nf_inq_dimname ------------------------------
+Interface
+ Function nf_inq_dimname (ncid, dimid, name) RESULT (status)
+
+ Integer,          Intent(IN)   :: ncid, dimid
+ Character(LEN=*), Intent(OUT)  :: name
+ Integer                        :: status
+
+ End Function nf_inq_dimname
+End Interface
+!-------------------------------- nf_rename_dim --------------------------------
+Interface
+ Function nf_rename_dim(ncid, dimid, name) RESULT (status)
+
+ Integer,          Intent(IN)  :: ncid, dimid
+ Character(LEN=*), Intent(IN)  :: name
+ Integer                       :: status
+
+ End Function nf_rename_dim
+End Interface
+
+! General inquiry functions
+
+!-------------------------------- nf_inq --------------------------------------
+Interface
+ Function nf_inq(ncid, ndims, nvars, ngatts, unlimdimid) RESULT(status)
+
+ Integer, Intent(IN)  :: ncid
+ Integer, Intent(OUT) :: ndims, nvars, ngatts, unlimdimid
+ Integer              :: status
+
+ End Function nf_inq
+End Interface
+!-------------------------------- nf_inq_ndims --------------------------------
+Interface
+ Function nf_inq_ndims(ncid, ndims) RESULT(status)
+
+ Integer, Intent(IN)  :: ncid
+ Integer, Intent(OUT) :: ndims
+ Integer              :: status
+
+ End Function nf_inq_ndims
+End Interface
+!-------------------------------- nf_inq_nvars --------------------------------
+Interface
+ Function nf_inq_nvars(ncid, nvars) RESULT(status)
+
+ Integer, Intent(IN)  :: ncid
+ Integer, Intent(OUT) :: nvars
+ Integer              :: status
+
+ End Function nf_inq_nvars
+End Interface
+!-------------------------------- nf_inq_natts --------------------------------
+Interface
+ Function nf_inq_natts(ncid, ngatts) RESULT(status)
+
+ Integer, Intent(IN)  :: ncid
+ Integer, Intent(OUT) :: ngatts
+ Integer              :: status
+
+ End Function nf_inq_natts
+End Interface
+!-------------------------------- nf_inq_unlimdim -----------------------------
+Interface
+ Function nf_inq_unlimdim(ncid, unlimdimid) RESULT(status)
+
+ Integer, Intent(IN)  :: ncid
+ Integer, Intent(OUT) :: unlimdimid
+ Integer              :: status
+
+ End Function nf_inq_unlimdim
+End Interface
+!-------------------------------- nf_inq_format -------------------------------
+Interface
+ Function nf_inq_format(ncid, format_type) RESULT(status)
+
+ Integer, Intent(IN)  :: ncid
+ Integer, Intent(OUT) :: format_type
+ Integer              :: status
+
+ End Function nf_inq_format
+End Interface
+
+! General variable functions
+
+!-------------------------------- nf_def_var -----------------------------------
+Interface
+ Function nf_def_var(ncid, name, xtype, nvdims, vdims, varid) RESULT (status)
+
+ Integer,          Intent(IN)  :: ncid, xtype, nvdims
+ Integer,          Intent(IN)  :: vdims(*)
+ Integer,          Intent(OUT) :: varid
+ Character(LEN=*), Intent(IN)  :: name
+ Integer                       :: status
+
+ End Function nf_def_var
+End Interface
+!-------------------------------- nf_inq_varndims -----------------------------
+Interface
+ Function nf_inq_varndims(ncid, varid, vndims) RESULT (status)
+
+ Integer, Intent(IN)  :: ncid, varid
+ Integer, Intent(OUT) :: vndims
+ Integer              :: status
+
+ End Function nf_inq_varndims
+End Interface
+!-------------------------------- nf_inq_var ----------------------------------
+Interface
+ Function nf_inq_var(ncid, varid, name, xtype, ndims, dimids, natts) &
+                        RESULT (status)
+
+ Integer,          Intent(IN)  :: ncid, varid
+ Character(LEN=*), Intent(OUT) :: name
+ Integer,          Intent(OUT) :: dimids(*)
+ Integer,          Intent(OUT) :: ndims, xtype, natts
+ Integer                       :: status
+
+ End Function nf_inq_var
+End Interface
+!-------------------------------- nf_inq_vardimid -----------------------------
+Interface
+ Function nf_inq_vardimid(ncid, varid, dimids) RESULT (status)
+
+ Integer, Intent(IN)  :: ncid, varid
+ Integer, Intent(OUT) :: dimids(*)
+ Integer              :: status
+
+ End Function nf_inq_vardimid
+End Interface
+!-------------------------------- nf_inq_varid --------------------------------
+Interface
+ Function nf_inq_varid(ncid, name, varid) RESULT (status)
+
+ Integer,          Intent(IN)  :: ncid
+ Integer,          Intent(OUT) :: varid
+ Character(LEN=*), Intent(IN)  :: name
+ Integer                       :: status
+
+ End Function nf_inq_varid
+End Interface
+!-------------------------------- nf_inq_varname ------------------------------
+Interface
+ Function nf_inq_varname (ncid, varid, name) RESULT (status)
+
+ Integer,          Intent(IN)   :: ncid, varid
+ Character(LEN=*), Intent(OUT)  :: name
+ Integer                        :: status
+
+ End Function nf_inq_varname
+End Interface
+!-------------------------------- nf_inq_vartype ------------------------------
+Interface
+ Function nf_inq_vartype(ncid, varid, xtype) RESULT(status)
+
+ Integer, Intent(IN)  :: ncid, varid
+ Integer, Intent(OUT) :: xtype
+ Integer              :: status
+
+ End Function nf_inq_vartype
+End Interface
+!-------------------------------- nf_inq_varnatts -----------------------------
+Interface
+ Function nf_inq_varnatts(ncid, varid, nvatts) RESULT(status)
+
+ Integer, Intent(IN)  :: ncid, varid
+ Integer, Intent(OUT) :: nvatts
+ Integer              :: status
+
+ End Function nf_inq_varnatts
+End Interface
+!-------------------------------- nf_rename_var -------------------------------
+Interface
+ Function nf_rename_var(ncid, varid, name) RESULT (status)
+
+ Integer,          Intent(IN) :: ncid, varid
+ Character(LEN=*), Intent(IN) :: name
+ Integer                      :: status
+
+ End Function nf_rename_var
+End Interface
+!-------------------------------- nf_copy_var ---------------------------------
+Interface
+ Function nf_copy_var(ncid_in, varid, ncid_out) RESULT(status)
+
+ Integer, Intent(IN) :: ncid_in, varid, ncid_out
+ Integer             :: status
+
+ End Function nf_copy_var
+End Interface
+
+! General attribute functions
+
+!-------------------------------- nf_inq_att ----------------------------------
+Interface
+ Function nf_inq_att(ncid, varid, name, xtype, nlen) RESULT(status)
+
+ Integer,          Intent(IN)  :: ncid, varid
+ Integer,          Intent(OUT) :: nlen, xtype
+ Character(LEN=*), Intent(IN)  :: name
+ Integer                       :: status
+
+ End Function nf_inq_att
+End Interface
+!-------------------------------- nf_inq_atttype ---------------------------
+Interface
+ Function nf_inq_atttype(ncid, varid, name, xtype) RESULT(status)
+
+ Integer,          Intent(IN)  :: ncid, varid
+ Integer,          Intent(OUT) :: xtype
+ Character(LEN=*), Intent(IN)  :: name
+ Integer                       :: status
+
+ End Function nf_inq_atttype
+End Interface
+!-------------------------------- nf_inq_attlen -------------------------------
+Interface
+ Function nf_inq_attlen(ncid, varid, name, nlen) RESULT(status)
+
+ Integer,          Intent(IN)  :: ncid, varid
+ Integer,          Intent(OUT) :: nlen
+ Character(LEN=*), Intent(IN)  :: name
+ Integer                       :: status
+
+ End Function nf_inq_attlen
+End Interface
+!-------------------------------- nf_inq_attid --------------------------------
+Interface
+ Function nf_inq_attid(ncid, varid, name, attnum) RESULT(status)
+
+ Integer,          Intent(IN)  :: ncid, varid
+ Integer,          Intent(OUT) :: attnum
+ Character(LEN=*), Intent(IN)  :: name
+ Integer                       :: status
+
+ End Function nf_inq_attid
+End Interface
+!-------------------------------- nf_inq_attname ------------------------------
+Interface
+ Function nf_inq_attname(ncid, varid, attnum, name) RESULT(status)
+
+ Integer,          Intent(IN)  :: ncid, varid, attnum
+ Character(LEN=*), Intent(OUT) :: name
+ Integer                       :: status
+
+ End Function nf_inq_attname
+End Interface
+!-------------------------------- nf_copy_att ---------------------------------
+Interface
+ Function nf_copy_att(ncid_in, varid_in, name, ncid_out, varid_out) &
+                         RESULT(status)
+
+ Integer,          Intent(IN)  :: ncid_in, varid_in, ncid_out, varid_out
+ Character(LEN=*), Intent(IN)  :: name
+ Integer                       :: status
+
+ End Function nf_copy_att
+End Interface
+!-------------------------------- nf_rename_att -------------------------------
+Interface
+ Function nf_rename_att(ncid, varid, name, newname) RESULT(status)
+
+ Integer,          Intent(IN) :: ncid, varid
+ Character(LEN=*), Intent(IN) :: name, newname
+ Integer                      :: status
+
+ End Function nf_rename_att
+End Interface
+!-------------------------------- nf_del_att ----------------------------------
+Interface
+ Function nf_del_att(ncid, varid, name) RESULT(status)
+
+ Integer,          Intent(IN) :: ncid, varid
+ Character(LEN=*), Intent(IN) :: name
+ Integer                      :: status
+
+ End Function nf_del_att
+End Interface
+
+! var1 put and get functions
+
+!--------------------------------- nf_put_var1_text ---------------------------
+Interface
+ Function nf_put_var1_text(ncid, varid, ndex, chval) RESULT(status)
+
+ Integer,          Intent(IN) :: ncid, varid
+ Integer,          Intent(IN) :: ndex(*)
+ Character(LEN=1), Intent(IN) :: chval
+ Integer                      :: status
+
+ End Function nf_put_var1_text
+End Interface
+!--------------------------------- nf_put_var1_int1 ------------------------
+Interface
+ Function nf_put_var1_int1(ncid, varid, ndex, ival) RESULT(status)
+
+ USE netcdf_nf_data, ONLY: NFINT1
+
+ Integer,         Intent(IN) :: ncid, varid
+ Integer,         Intent(IN) :: ndex(*)
+ Integer(NFINT1), Intent(IN) :: ival
+ Integer                     :: status
+
+ End Function nf_put_var1_int1
+End Interface
+!--------------------------------- nf_put_var1_int2 ------------------------
+Interface
+ Function nf_put_var1_int2(ncid, varid, ndex, ival) RESULT(status)
+
+ USE netcdf_nf_data, ONLY: NFINT2
+
+ Integer,         Intent(IN) :: ncid, varid
+ Integer,         Intent(IN) :: ndex(*)
+ Integer(NFINT2), Intent(IN) :: ival
+ Integer                     :: status
+
+ End Function nf_put_var1_int2
+End Interface
+!--------------------------------- nf_put_var1_int -------------------------
+Interface
+ Function nf_put_var1_int(ncid, varid, ndex, ival) RESULT(status)
+
+ USE netcdf_nf_data, ONLY: NFINT
+ Integer,        Intent(IN) :: ncid, varid
+ Integer,        Intent(IN) :: ndex(*)
+ Integer(NFINT), Intent(IN) :: ival
+ Integer                    :: status
+
+ End Function nf_put_var1_int
+End Interface
+!--------------------------------- nf_put_var1_real ------------------------
+Interface
+ Function nf_put_var1_real(ncid, varid, ndex, rval) RESULT(status)
+
+ USE netcdf_nf_data, ONLY: NFREAL
+
+ Integer,      Intent(IN) :: ncid, varid
+ Integer,      Intent(IN) :: ndex(*)
+ Real(NFREAL), Intent(IN) :: rval
+ Integer                  :: status
+
+ End Function nf_put_var1_real
+End Interface
+!--------------------------------- nf_put_var1_double ----------------------
+Interface
+ Function nf_put_var1_double(ncid, varid, ndex, dval) RESULT(status)
+
+ USE netcdf_nf_data, ONLY: RK8
+
+ Integer,   Intent(IN) :: ncid, varid
+ Integer,   Intent(IN) :: ndex(*)
+ Real(RK8), Intent(IN) :: dval
+ Integer               :: status
+
+ End Function nf_put_var1_double
+End Interface
+!--------------------------------- nf_get_var1_text ------------------------
+Interface
+ Function nf_get_var1_text(ncid, varid, ndex, chval) RESULT(status)
+
+ Integer,          Intent(IN)  :: ncid, varid
+ Integer,          Intent(IN)  :: ndex(*)
+ Character(LEN=1), Intent(OUT) :: chval
+ Integer                       :: status
+
+ End Function nf_get_var1_text
+End Interface
+!--------------------------------- nf_get_var1_int1 ------------------------
+Interface
+ Function nf_get_var1_int1(ncid, varid, ndex, ival) RESULT(status)
+
+ USE netcdf_nf_data, ONLY: NFINT1
+
+ Integer,         Intent(IN)  :: ncid, varid
+ Integer,         Intent(IN)  :: ndex(*)
+ Integer(NFINT1), Intent(OUT) :: ival
+ Integer                      :: status
+
+ End Function nf_get_var1_int1
+End Interface
+!--------------------------------- nf_get_var1_int2 ------------------------
+Interface
+ Function nf_get_var1_int2(ncid, varid, ndex, ival) RESULT(status)
+
+ USE netcdf_nf_data, ONLY: NFINT2
+
+ Integer,         Intent(IN)  :: ncid, varid
+ Integer,         Intent(IN)  :: ndex(*)
+ Integer(NFINT2), Intent(OUT) :: ival
+ Integer                      :: status
+
+ End Function nf_get_var1_int2
+End Interface
+!--------------------------------- nf_get_var1_int -------------------------
+Interface
+ Function nf_get_var1_int(ncid, varid, ndex, ival) RESULT(status)
+
+ USE netcdf_nf_data, ONLY: NFINT
+ Integer,        Intent(IN)  :: ncid, varid
+ Integer,        Intent(IN)  :: ndex(*)
+ Integer(NFINT), Intent(OUT) :: ival
+ Integer                     :: status
+
+ End Function nf_get_var1_int
+End Interface
+!--------------------------------- nf_get_var1_real ------------------------
+Interface
+ Function nf_get_var1_real(ncid, varid, ndex, rval) RESULT(status)
+
+ USE netcdf_nf_data, ONLY: NFREAL
+
+ Integer,      Intent(IN)  :: ncid, varid
+ Integer,      Intent(IN)  :: ndex(*)
+ Real(NFREAL), Intent(OUT) :: rval
+ Integer                   :: status
+
+ End Function nf_get_var1_real
+End Interface
+!--------------------------------- nf_get_var1_double ----------------------
+Interface
+ Function nf_get_var1_double(ncid, varid, ndex, rval) RESULT(status)
+
+ USE netcdf_nf_data, ONLY: RK8
+
+ Integer,   Intent(IN)  :: ncid, varid
+ Integer,   Intent(IN)  :: ndex(*)
+ Real(RK8), Intent(OUT) :: rval
+ Integer                :: status
+
+ End Function nf_get_var1_double
+End Interface
+
+! var put and get functions
+
+!--------------------------------- nf_put_var_text -------------------------
+Interface nf_put_var_text
+ Function nf_put_var_text(ncid, varid, text) RESULT(status)
+
+ Integer,          Intent(IN) :: ncid, varid
+ Character(LEN=*), Intent(IN) :: text
+ Integer                      :: status
+
+ End Function nf_put_var_text
+! Array of characters
+ Function nf_put_var_text_a(ncid, varid, text) RESULT(status)
+
+ Integer,          Intent(IN) :: ncid, varid
+ Character(LEN=1), Intent(IN) :: text(*)
+ Integer                      :: status
+
+ End Function nf_put_var_text_a
+End Interface
+!--------------------------------- nf_put_var_int1 -------------------------
+Interface
+ Function nf_put_var_int1(ncid, varid, i1vals) RESULT(status)
+
+ USE netcdf_nf_data, ONLY: NFINT1
+
+ Integer,         Intent(IN) :: ncid, varid
+ Integer(NFINT1), Intent(IN) :: i1vals(*)
+ Integer                     :: status
+
+ End Function nf_put_var_int1
+End Interface
+!--------------------------------- nf_put_var_int2 -------------------------
+Interface
+ Function nf_put_var_int2(ncid, varid, i2vals) RESULT(status)
+
+ USE netcdf_nf_data, ONLY: NFINT2
+
+ Integer,         Intent(IN) :: ncid, varid
+ Integer(NFINT2), Intent(IN) :: i2vals(*)
+ Integer                     :: status
+
+ End Function nf_put_var_int2
+End Interface
+!--------------------------------- nf_put_var_int --------------------------
+Interface
+ Function nf_put_var_int(ncid, varid, ivals) RESULT(status)
+
+ USE netcdf_nf_data, ONLY: NFINT
+
+ Integer,        Intent(IN) :: ncid, varid
+ Integer(NFINT), Intent(IN) :: ivals(*)
+ Integer             :: status
+
+ End Function nf_put_var_int
+End Interface
+!--------------------------------- nf_put_var_real -------------------------
+Interface
+ Function nf_put_var_real(ncid, varid, rvals) RESULT(status)
+
+ USE netcdf_nf_data, ONLY: NFREAL
+
+ Integer,      Intent(IN) :: ncid, varid
+ Real(NFREAL), Intent(IN) :: rvals(*)
+ Integer                  :: status
+
+ End Function nf_put_var_real
+End Interface
+!--------------------------------- nf_put_var_double -----------------------
+Interface
+ Function nf_put_var_double(ncid, varid, dvals) RESULT(status)
+
+ USE netcdf_nf_data, ONLY: RK8
+
+ Integer,   Intent(IN) :: ncid, varid
+ Real(RK8), Intent(IN) :: dvals(*)
+ Integer               :: status
+
+ End Function nf_put_var_double
+End Interface
+!--------------------------------- nf_get_var_text ------------------------
+Interface nf_get_var_text
+ Function nf_get_var_text(ncid, varid, text) RESULT(status)
+
+ Integer,          Intent(IN)  :: ncid, varid
+ Character(LEN=*), Intent(OUT) :: text
+ Integer                       :: status
+
+ End Function nf_get_var_text
+! array of characters
+ Function nf_get_var_text_a(ncid, varid, text) RESULT(status)
+
+ Integer,          Intent(IN)  :: ncid, varid
+ Character(LEN=1), Intent(OUT) :: text(*)
+ Integer                       :: status
+
+ End Function nf_get_var_text_a
+End Interface
+!--------------------------------- nf_get_var_int1 -------------------------
+Interface
+ Function nf_get_var_int1(ncid, varid, i1vals) RESULT(status)
+
+ USE netcdf_nf_data, ONLY: NFINT1
+
+ Integer,         Intent(IN)  :: ncid, varid
+ Integer(NFINT1), Intent(OUT) :: i1vals(*)
+ Integer                      :: status
+
+ End Function nf_get_var_int1
+End Interface
+!--------------------------------- nf_get_var_int2 -------------------------
+Interface
+ Function nf_get_var_int2(ncid, varid, i2vals) RESULT(status)
+
+ USE netcdf_nf_data, ONLY: NFINT2
+
+ Integer,         Intent(IN)  :: ncid, varid
+ Integer(NFINT2), Intent(OUT) :: i2vals(*)
+ Integer                      :: status
+
+ End Function nf_get_var_int2
+End Interface
+!--------------------------------- nf_get_var_int --------------------------
+Interface
+ Function nf_get_var_int(ncid, varid, ivals) RESULT(status)
+
+ USE netcdf_nf_data, ONLY: NFINT
+ 
+ Integer,        Intent(IN)  :: ncid, varid
+ Integer(NFINT), Intent(OUT) :: ivals(*)
+ Integer                     :: status
+
+ End Function nf_get_var_int
+End Interface
+!--------------------------------- nf_get_var_real -------------------------
+Interface
+ Function nf_get_var_real(ncid, varid, rvals) RESULT(status)
+
+ USE netcdf_nf_data, ONLY: NFREAL
+
+ Integer,      Intent(IN)  :: ncid, varid
+ Real(NFREAL), Intent(OUT) :: rvals(*)
+ Integer                   :: status
+
+ End Function nf_get_var_real
+End Interface
+!--------------------------------- nf_get_var_double -----------------------
+Interface
+ Function nf_get_var_double(ncid, varid, dvals) RESULT(status)
+
+ USE netcdf_nf_data, ONLY: RK8
+
+ Integer,   Intent(IN)  :: ncid, varid
+ Real(RK8), Intent(OUT) :: dvals(*)
+ Integer                :: status
+
+ End Function nf_get_var_double
+End Interface
+
+! vars put and get functions
+
+!--------------------------------- nf_put_vars_text ------------------------
+Interface nf_put_vars_text
+ Function nf_put_vars_text(ncid, varid, start, counts, strides, text) &
+                              RESULT(status)
+
+ Integer,          Intent(IN) :: ncid, varid
+ Integer,          Intent(IN) :: start(*), counts(*), strides(*)
+ Character(LEN=*), Intent(IN) :: text
+ Integer                      :: status
+
+ End Function nf_put_vars_text
+! array of characters
+ Function nf_put_vars_text_a(ncid, varid, start, counts, strides, text) &
+                              RESULT(status)
+
+ Integer,          Intent(IN) :: ncid, varid
+ Integer,          Intent(IN) :: start(*), counts(*), strides(*)
+ Character(LEN=1), Intent(IN) :: text(*)
+ Integer                      :: status
+
+ End Function nf_put_vars_text_a
+End Interface
+!--------------------------------- nf_put_vars_int1 ------------------------
+Interface
+ Function nf_put_vars_int1(ncid, varid, start, counts, strides, i1vals) &
+                              RESULT(status)
+
+ USE netcdf_nf_data, ONLY: NFINT1
+
+ Integer,         Intent(IN) :: ncid, varid
+ Integer,         Intent(IN) :: start(*), counts(*), strides(*)
+ Integer(NFINT1), Intent(IN) :: i1vals(*)
+ Integer                     :: status
+
+ End Function nf_put_vars_int1
+End Interface
+!--------------------------------- nf_put_vars_int2 ------------------------
+Interface
+ Function nf_put_vars_int2(ncid, varid, start, counts, strides, i2vals) &
+                              RESULT(status)
+
+ USE netcdf_nf_data, ONLY: NFINT2
+
+ Integer,         Intent(IN) :: ncid, varid
+ Integer,         Intent(IN) :: start(*), counts(*), strides(*)
+ Integer(NFINT2), Intent(IN) :: i2vals(*)
+ Integer                     :: status
+
+ End Function nf_put_vars_int2
+End Interface
+!--------------------------------- nf_put_vars_int -------------------------
+Interface
+ Function nf_put_vars_int(ncid, varid, start, counts, strides, ivals) &
+                             RESULT(status)
+
+ USE netcdf_nf_data, ONLY: NFINT
+
+ Integer,        Intent(IN) :: ncid, varid
+ Integer,        Intent(IN) :: start(*), counts(*), strides(*)
+ Integer(NFINT), Intent(IN) :: ivals(*)
+ Integer                    :: status
+
+ End Function nf_put_vars_int
+End Interface
+!--------------------------------- nf_put_vars_real ------------------------
+Interface
+ Function nf_put_vars_real(ncid, varid, start, counts, strides, rvals) &
+                              RESULT(status)
+
+ USE netcdf_nf_data, ONLY: NFREAL
+
+ Integer,      Intent(IN) :: ncid, varid
+ Integer,      Intent(IN) :: start(*), counts(*), strides(*)
+ Real(NFREAL), Intent(IN) :: rvals(*)
+ Integer                  :: status
+
+ End Function nf_put_vars_real
+End Interface
+!--------------------------------- nf_put_vars_double ----------------------
+Interface
+ Function nf_put_vars_double(ncid, varid, start, counts, strides, dvals) &
+                                RESULT(status)
+
+ USE netcdf_nf_data, ONLY: RK8
+
+ Integer,   Intent(IN) :: ncid, varid
+ Integer,   Intent(IN) :: start(*), counts(*), strides(*)
+ Real(RK8), Intent(IN) :: dvals(*)
+ Integer               :: status
+
+ End Function nf_put_vars_double
+End Interface
+!--------------------------------- nf_get_vars_text ------------------------
+Interface nf_get_vars_text
+ Function nf_get_vars_text(ncid, varid, start, counts, strides, text) &
+                                RESULT(status)
+
+ Integer,          Intent(IN)  :: ncid, varid
+ Integer,          Intent(IN)  :: start(*), counts(*), strides(*)
+ Character(LEN=*), Intent(OUT) :: text
+ Integer                       :: status
+
+ End Function nf_get_vars_text
+! array of characters
+ Function nf_get_vars_text_a(ncid, varid, start, counts, strides, text) &
+                                RESULT(status)
+
+ Integer,          Intent(IN)  :: ncid, varid
+ Integer,          Intent(IN)  :: start(*), counts(*), strides(*)
+ Character(LEN=1), Intent(OUT) :: text(*)
+ Integer                       :: status
+
+ End Function nf_get_vars_text_a
+End Interface
+!--------------------------------- nf_get_vars_int1 ------------------------
+Interface
+ Function nf_get_vars_int1(ncid, varid, start, counts, strides, i1vals) &
+                              RESULT(status)
+
+ USE netcdf_nf_data, ONLY: NFINT1
+
+ Integer,         Intent(IN)  :: ncid, varid
+ Integer,         Intent(IN)  :: start(*), counts(*), strides(*)
+ Integer(NFINT1), Intent(OUT) :: i1vals(*)
+ Integer                      :: status
+
+ End Function nf_get_vars_int1
+End Interface
+!--------------------------------- nf_get_vars_int2 ------------------------
+Interface
+ Function nf_get_vars_int2(ncid, varid, start, counts, strides, i2vals) &
+                              RESULT(status)
+
+ USE netcdf_nf_data, ONLY: NFINT2
+
+ Integer,         Intent(IN)  :: ncid, varid
+ Integer,         Intent(IN)  :: start(*), counts(*), strides(*)
+ Integer(NFINT2), Intent(OUT) :: i2vals(*)
+ Integer                      :: status
+
+ End Function nf_get_vars_int2
+End Interface
+!--------------------------------- nf_get_vars_int -------------------------
+Interface
+ Function nf_get_vars_int(ncid, varid, start, counts, strides, ivals) &
+                             RESULT(status)
+
+ USE netcdf_nf_data, ONLY: NFINT
+
+ Integer,        Intent(IN)  :: ncid, varid
+ Integer,        Intent(IN)  :: start(*), counts(*), strides(*)
+ Integer(NFINT), Intent(OUT) :: ivals(*)
+ Integer                     :: status
+
+ End Function nf_get_vars_int
+End Interface
+!--------------------------------- nf_get_vars_real ------------------------
+Interface
+ Function nf_get_vars_real(ncid, varid, start, counts, strides, rvals) &
+                              RESULT(status)
+
+ USE netcdf_nf_data, ONLY: NFREAL
+
+ Integer,      Intent(IN)  :: ncid, varid
+ Integer,      Intent(IN)  :: start(*), counts(*), strides(*)
+ Real(NFREAL), Intent(OUT) :: rvals(*)
+ Integer                   :: status
+
+ End Function nf_get_vars_real
+End Interface
+!--------------------------------- nf_get_vars_double ----------------------
+Interface
+ Function nf_get_vars_double(ncid, varid, start, counts, strides, dvals) &
+                                RESULT(status)
+
+ USE netcdf_nf_data, ONLY: RK8
+
+ Integer,   Intent(IN)  :: ncid, varid
+ Integer,   Intent(IN)  :: start(*), counts(*), strides(*)
+ Real(RK8), Intent(OUT) :: dvals(*)
+ Integer                :: status
+
+ End Function nf_get_vars_double
+End Interface
+
+! varm put and get functions
+
+!--------------------------------- nf_put_varm_text ------------------------
+Interface nf_put_varm_text
+ Function nf_put_varm_text(ncid, varid, start, counts, strides, maps, &
+                                text) RESULT(status)
+
+
+
+ Integer,          Intent(IN) :: ncid, varid
+ Integer,          Intent(IN) :: start(*), counts(*), strides(*), maps(*)
+ Character(LEN=*), Intent(IN) :: text
+ Integer                      :: status
+
+ End Function nf_put_varm_text
+! array of characters
+ Function nf_put_varm_text_a(ncid, varid, start, counts, strides, maps, &
+                                text) RESULT(status)
+
+ Integer,          Intent(IN) :: ncid, varid
+ Integer,          Intent(IN) :: start(*), counts(*), strides(*), maps(*)
+ Character(LEN=1), Intent(IN) :: text(*)
+ Integer                      :: status
+
+ End Function nf_put_varm_text_a
+End Interface
+!--------------------------------- nf_put_varm_int1 ------------------------
+Interface
+ Function nf_put_varm_int1(ncid, varid, start, counts, strides, maps, &
+                              i1vals) RESULT(status)
+
+ USE netcdf_nf_data, ONLY: NFINT1
+
+ Integer,         Intent(IN) :: ncid, varid
+ Integer,         Intent(IN) :: start(*), counts(*), strides(*), maps(*)
+ Integer(NFINT1), Intent(IN) :: i1vals(*)
+ Integer                     :: status
+
+ End Function nf_put_varm_int1
+End Interface
+!--------------------------------- nf_put_varm_int2 ------------------------
+Interface
+ Function nf_put_varm_int2(ncid, varid, start, counts, strides, maps, &
+                              i2vals) RESULT(status)
+
+ USE netcdf_nf_data, ONLY: NFINT2
+
+ Integer,         Intent(IN) :: ncid, varid
+ Integer,         Intent(IN) :: start(*), counts(*), strides(*), maps(*)
+ Integer(NFINT2), Intent(IN) :: i2vals(*)
+ Integer                     :: status
+
+ End Function nf_put_varm_int2
+End Interface
+!--------------------------------- nf_put_varm_int -------------------------
+Interface
+ Function nf_put_varm_int(ncid, varid, start, counts, strides, maps, &
+                             ivals) RESULT(status)
+
+ USE netcdf_nf_data, ONLY: NFINT
+
+ Integer,        Intent(IN) :: ncid, varid
+ Integer,        Intent(IN) :: start(*), counts(*), strides(*), maps(*)
+ Integer(NFINT), Intent(IN) :: ivals(*)
+ Integer                    :: status
+
+ End Function nf_put_varm_int
+End Interface
+
+!--------------------------------- nf_put_varm_real ------------------------
+Interface
+ Function nf_put_varm_real(ncid, varid, start, counts, strides, maps, &
+                              rvals) RESULT(status)
+
+ USE netcdf_nf_data, ONLY: NFREAL
+
+ Integer,      Intent(IN) :: ncid, varid
+ Integer,      Intent(IN) :: start(*), counts(*), strides(*), maps(*)
+ Real(NFREAL), Intent(IN) :: rvals(*)
+ Integer                  :: status
+
+ End Function nf_put_varm_real
+End Interface
+!--------------------------------- nf_put_varm_double ----------------------
+Interface
+ Function nf_put_varm_double(ncid, varid, start, counts, strides, maps, &
+                                dvals) RESULT(status)
+
+ USE netcdf_nf_data, ONLY: RK8
+
+ Integer,   Intent(IN) :: ncid, varid
+ Integer,   Intent(IN) :: start(*), counts(*), strides(*), maps(*)
+ Real(RK8), Intent(IN) :: dvals(*)
+ Integer               :: status
+
+ End Function nf_put_varm_double
+End Interface
+!--------------------------------- nf_get_varm_text ------------------------
+Interface nf_get_varm_text
+ Function nf_get_varm_text(ncid, varid, start, counts, strides, maps, &
+                                text) RESULT(status)
+
+ Integer,          Intent(IN)  :: ncid, varid
+ Integer,          Intent(IN)  :: start(*), counts(*), strides(*), maps(*)
+ Character(LEN=*), Intent(OUT) :: text
+ Integer                       :: status
+
+ End Function nf_get_varm_text
+! array of characters
+ Function nf_get_varm_text_a(ncid, varid, start, counts, strides, maps, &
+                                text) RESULT(status)
+
+ Integer,          Intent(IN)  :: ncid, varid
+ Integer,          Intent(IN)  :: start(*), counts(*), strides(*), maps(*)
+ Character(LEN=1), Intent(OUT) :: text(*)
+ Integer                       :: status
+
+ End Function nf_get_varm_text_a
+End Interface
+!--------------------------------- nf_get_varm_int1 ------------------------
+Interface
+ Function nf_get_varm_int1(ncid, varid, start, counts, strides, maps, &
+                              i1vals) RESULT(status)
+
+ USE netcdf_nf_data, ONLY: NFINT1
+
+ Integer,         Intent(IN)  :: ncid, varid
+ Integer,         Intent(IN)  :: start(*), counts(*), strides(*), maps(*)
+ Integer(NFINT1), Intent(OUT) :: i1vals(*)
+ Integer                      :: status
+
+ End Function nf_get_varm_int1
+End Interface
+!--------------------------------- nf_get_varm_int2 ------------------------
+Interface
+ Function nf_get_varm_int2(ncid, varid, start, counts, strides, maps, &
+                              i2vals) RESULT(status)
+
+ USE netcdf_nf_data, ONLY: NFINT2
+
+ Integer,         Intent(IN)  :: ncid, varid
+ Integer,         Intent(IN)  :: start(*), counts(*), strides(*), maps(*)
+ Integer(NFINT2), Intent(OUT) :: i2vals(*)
+ Integer                      :: status
+
+ End Function nf_get_varm_int2
+End Interface
+!--------------------------------- nf_get_varm_int -------------------------
+Interface
+ Function nf_get_varm_int(ncid, varid, start, counts, strides, maps, &
+                             ivals) RESULT(status)
+
+ USE netcdf_nf_data, ONLY: NFINT
+
+ Integer,        Intent(IN)  :: ncid, varid
+ Integer,        Intent(IN)  :: start(*), counts(*), strides(*), maps(*)
+ Integer(NFINT), Intent(OUT) :: ivals(*)
+ Integer                     :: status
+
+ End Function nf_get_varm_int
+End Interface
+!--------------------------------- nf_get_varm_real ------------------------
+Interface
+ Function nf_get_varm_real(ncid, varid, start, counts, strides, maps, &
+                              rvals) RESULT(status)
+
+ USE netcdf_nf_data, ONLY: NFREAL
+
+ Integer,      Intent(IN)  :: ncid, varid
+ Integer,      Intent(IN)  :: start(*), counts(*), strides(*), maps(*)
+ Real(NFREAL), Intent(OUT) :: rvals(*)
+ Integer                   :: status
+
+ End Function nf_get_varm_real
+End Interface
+!--------------------------------- nf_get_varm_double ----------------------
+Interface
+ Function nf_get_varm_double(ncid, varid, start, counts, strides, maps, &
+                             dvals) RESULT(status)
+
+ USE netcdf_nf_data, ONLY: RK8
+
+ Integer,   Intent(IN)  :: ncid, varid
+ Integer,   Intent(IN)  :: start(*), counts(*), strides(*), maps(*)
+ Real(RK8), Intent(OUT) :: dvals(*)
+ Integer                :: status
+
+ End Function nf_get_varm_double
+End Interface
+
+! vara put and get routines
+
+!--------------------------------- nf_put_vara_text ------------------------
+Interface nf_put_vara_text
+ Function nf_put_vara_text(ncid, varid, start, counts, text) RESULT(status)
+
+ Integer,          Intent(IN) :: ncid, varid
+ Integer,          Intent(IN) :: start(*), counts(*)
+ Character(LEN=*), Intent(IN) :: text
+ Integer                      :: status
+
+ End Function nf_put_vara_text
+! array of characters
+ Function nf_put_vara_text_a(ncid, varid, start, counts, text) RESULT(status)
+
+ Integer,          Intent(IN) :: ncid, varid
+ Integer,          Intent(IN) :: start(*), counts(*)
+ Character(LEN=1), Intent(IN) :: text(*)
+ Integer                      :: status
+
+ End Function nf_put_vara_text_a
+End Interface
+!--------------------------------- nf_put_vara_int1 ------------------------
+Interface
+ Function nf_put_vara_int1(ncid, varid, start, counts, i1vals) RESULT(status)
+
+ USE netcdf_nf_data, ONLY: NFINT1
+
+ Integer,         Intent(IN) :: ncid, varid
+ Integer,         Intent(IN) :: start(*), counts(*)
+ Integer(NFINT1), Intent(IN) :: i1vals(*)
+ Integer                     :: status
+
+ End Function nf_put_vara_int1
+End Interface
+!--------------------------------- nf_put_vara_int2 ------------------------
+Interface
+ Function nf_put_vara_int2(ncid, varid, start, counts, i2vals) RESULT(status)
+
+ USE netcdf_nf_data, ONLY: NFINT2
+
+ Integer,         Intent(IN) :: ncid, varid
+ Integer,         Intent(IN) :: start(*), counts(*)
+ Integer(NFINT2), Intent(IN) :: i2vals(*)
+ Integer                     :: status
+
+ End Function nf_put_vara_int2
+End Interface
+!--------------------------------- nf_put_vara_int -------------------------
+Interface
+ Function nf_put_vara_int(ncid, varid, start, counts, ivals) RESULT(status)
+
+ USE netcdf_nf_data, ONLY: NFINT
+
+ Integer,        Intent(IN) :: ncid, varid
+ Integer,        Intent(IN) :: start(*), counts(*)
+ Integer(NFINT), Intent(IN) :: ivals(*)
+ Integer                    :: status
+
+ End Function nf_put_vara_int
+End Interface
+!--------------------------------- nf_put_vara_real ------------------------
+Interface
+ Function nf_put_vara_real(ncid, varid, start, counts, rvals) RESULT(status)
+
+ USE netcdf_nf_data, ONLY: NFREAL
+
+ Integer,      Intent(IN) :: ncid, varid
+ Integer,      Intent(IN) :: start(*), counts(*)
+ Real(NFREAL), Intent(IN) :: rvals(*)
+ Integer                  :: status
+
+ End Function nf_put_vara_real
+End Interface
+!--------------------------------- nf_put_vara_double ----------------------
+Interface
+ Function nf_put_vara_double(ncid, varid, start, counts, dvals) &
+                                RESULT(status)
+
+ USE netcdf_nf_data, ONLY: RK8
+
+ Integer,   Intent(IN) :: ncid, varid
+ Integer,   Intent(IN) :: start(*), counts(*)
+ Real(RK8), Intent(IN) :: dvals(*)
+ Integer               :: status
+
+ End Function nf_put_vara_double
+End Interface
+!--------------------------------- nf_get_vara_text ------------------------
+Interface nf_get_vara_text
+ Function nf_get_vara_text(ncid, varid, start, counts, text) RESULT(status)
+
+ Integer,          Intent(IN)  :: ncid, varid
+ Integer,          Intent(IN)  :: start(*), counts(*)
+ Character(LEN=*), Intent(OUT) :: text
+ Integer                       :: status
+
+ End Function nf_get_vara_text
+! array of characters
+ Function nf_get_vara_text_a(ncid, varid, start, counts, text) RESULT(status)
+
+ Integer,          Intent(IN)  :: ncid, varid
+ Integer,          Intent(IN)  :: start(*), counts(*)
+ Character(LEN=1), Intent(OUT) :: text(*)
+ Integer                       :: status
+
+ End Function nf_get_vara_text_a
+End Interface
+!--------------------------------- nf_get_vara_int1 ------------------------
+Interface
+ Function nf_get_vara_int1(ncid, varid, start, counts, i1vals) RESULT(status)
+
+ USE netcdf_nf_data, ONLY: NFINT1
+
+ Integer,         Intent(IN)  :: ncid, varid
+ Integer,         Intent(IN)  :: start(*), counts(*)
+ Integer(NFINT1), Intent(OUT) :: i1vals(*)
+ Integer                      :: status
+
+ End Function nf_get_vara_int1
+End Interface
+!--------------------------------- nf_get_vara_int2 ------------------------
+Interface
+ Function nf_get_vara_int2(ncid, varid, start, counts, i2vals) RESULT(status)
+
+ USE netcdf_nf_data, ONLY: NFINT2
+
+ Integer,         Intent(IN)  :: ncid, varid
+ Integer,         Intent(IN)  :: start(*), counts(*)
+ Integer(NFINT2), Intent(OUT) :: i2vals(*)
+ Integer                      :: status
+
+ End Function nf_get_vara_int2
+End Interface
+!--------------------------------- nf_get_vara_int -------------------------
+Interface
+ Function nf_get_vara_int(ncid, varid, start, counts, ivals) RESULT(status)
+
+ USE netcdf_nf_data, ONLY: NFINT
+
+ Integer,        Intent(IN)  :: ncid, varid
+ Integer,        Intent(IN)  :: start(*), counts(*)
+ Integer(NFINT), Intent(OUT) :: ivals(*)
+ Integer                     :: status
+
+ End Function nf_get_vara_int
+End Interface
+!--------------------------------- nf_get_vara_real ------------------------
+Interface
+ Function nf_get_vara_real(ncid, varid, start, counts, rvals) RESULT(status)
+
+ USE netcdf_nf_data, ONLY: NFREAL
+
+ Integer,      Intent(IN)  :: ncid, varid
+ Integer,      Intent(IN)  :: start(*), counts(*)
+ Real(NFREAL), Intent(OUT) :: rvals(*)
+ Integer                   :: status
+
+ End Function nf_get_vara_real
+End Interface
+!--------------------------------- nf_get_vara_double ----------------------
+Interface
+ Function nf_get_vara_double(ncid, varid, start, counts, dvals) &
+                                RESULT(status)
+
+ USE netcdf_nf_data, ONLY: RK8
+
+ Integer,   Intent(IN)  :: ncid, varid
+ Integer,   Intent(IN)  :: start(*), counts(*)
+ Real(RK8), Intent(OUT) :: dvals(*)
+ Integer                :: status
+
+ End Function nf_get_vara_double
+End Interface
+!--------------------------------- nf_put_att_text -------------------------
+Interface nf_put_att_text
+ Function nf_put_att_text(ncid, varid, name, nlen, text) RESULT(status)
+
+ Integer,          Intent(IN) :: ncid, varid, nlen
+ Character(LEN=*), Intent(IN) :: name, text
+ Integer                      :: status
+
+ End Function nf_put_att_text
+! array of characters
+ Function nf_put_att_text_a(ncid, varid, name, nlen, text) RESULT(status)
+
+ Integer,          Intent(IN) :: ncid, varid, nlen
+ Character(LEN=*), Intent(IN) :: name
+ Character(LEN=1), Intent(IN) :: text(*)
+ Integer                      :: status
+
+ End Function nf_put_att_text_a
+End Interface
+!--------------------------------- nf_put_att_int1 -------------------------
+Interface
+ Function nf_put_att_int1(ncid, varid, name, xtype, nlen, i1vals) &
+                             RESULT(status)
+
+ USE netcdf_nf_data, ONLY: NFINT1
+
+ Integer,          Intent(IN) :: ncid, varid, nlen, xtype
+ Character(LEN=*), Intent(IN) :: name
+ Integer(NFINT1),  Intent(IN) :: i1vals(*)
+ Integer                      :: status
+
+ End Function nf_put_att_int1
+End Interface
+!--------------------------------- nf_put_att_int2 -------------------------
+Interface
+ Function nf_put_att_int2(ncid, varid, name, xtype, nlen, i2vals) &
+                             RESULT(status)
+
+ USE netcdf_nf_data, ONLY: NFINT2
+
+ Integer,          Intent(IN) :: ncid, varid, nlen, xtype
+ Character(LEN=*), Intent(IN) :: name
+ Integer(NFINT2),  Intent(IN) :: i2vals(*)
+ Integer                      :: status
+
+ End Function nf_put_att_int2
+End Interface
+!--------------------------------- nf_put_att_int --------------------------
+Interface
+ Function nf_put_att_int(ncid, varid, name, xtype, nlen, ivals) &
+                            RESULT(status)
+
+ USE netcdf_nf_data, ONLY: NFINT
+
+ Integer,          Intent(IN) :: ncid, varid, nlen, xtype
+ Character(LEN=*), Intent(IN) :: name
+ Integer(NFINT),   Intent(IN) :: ivals(*)
+ Integer                      :: status
+
+ End Function nf_put_att_int
+End Interface
+!--------------------------------- nf_put_att_real -------------------------
+Interface
+ Function nf_put_att_real(ncid, varid, name, xtype, nlen, rvals) &
+                             RESULT(status)
+
+ USE netcdf_nf_data, ONLY: NFREAL
+
+ Integer,          Intent(IN) :: ncid, varid, nlen, xtype
+ Character(LEN=*), Intent(IN) :: name
+ Real(NFREAL),     Intent(IN) :: rvals(*)
+ Integer                      :: status
+
+ End Function nf_put_att_real
+End Interface
+!--------------------------------- nf_put_att_double -----------------------
+Interface
+ Function nf_put_att_double(ncid, varid, name, xtype, nlen, dvals) &
+                               RESULT(status)
+
+ USE netcdf_nf_data, ONLY: RK8
+
+ Integer,          Intent(IN) :: ncid, varid, nlen, xtype
+ Character(LEN=*), Intent(IN) :: name
+ Real(RK8),        Intent(IN) :: dvals(*)
+ Integer                      :: status
+
+ End Function nf_put_att_double
+End Interface
+!--------------------------------- nf_get_att_text -------------------------
+Interface nf_get_att_text
+ Function nf_get_att_text(ncid, varid, name, text) RESULT(status)
+
+ Integer,          Intent(IN)  :: ncid, varid
+ Character(LEN=*), Intent(IN)  :: name
+ Character(LEN=*), Intent(OUT) :: text
+ Integer                       :: status
+
+ End Function nf_get_att_text
+! Array of characters
+ Function nf_get_att_text_a(ncid, varid, name, text) RESULT(status)
+
+ Integer,          Intent(IN)  :: ncid, varid
+ Character(LEN=*), Intent(IN)  :: name
+ Character(LEN=1), Intent(OUT) :: text(*)
+ Integer                       :: status
+
+ End Function nf_get_att_text_a
+End Interface
+!--------------------------------- nf_get_att_int1 -------------------------
+Interface
+ Function nf_get_att_int1(ncid, varid, name, i1vals) RESULT(status)
+
+ USE netcdf_nf_data, ONLY: NFINT1
+
+ Integer,          Intent(IN)  :: ncid, varid
+ Character(LEN=*), Intent(IN)  :: name
+ Integer(NFINT1),  Intent(OUT) :: i1vals(*)
+ Integer                       :: status
+
+ End Function nf_get_att_int1
+End Interface
+!--------------------------------- nf_get_att_int2 -------------------------
+Interface
+ Function nf_get_att_int2(ncid, varid, name, i2vals) RESULT(status)
+
+ USE netcdf_nf_data, ONLY: NFINT2
+
+ Integer,          Intent(IN)  :: ncid, varid
+ Character(LEN=*), Intent(IN)  :: name
+ Integer(NFINT2),  Intent(OUT) :: i2vals(*)
+ Integer                       :: status
+
+ End Function nf_get_att_int2
+End Interface
+!--------------------------------- nf_get_att_int --------------------------
+Interface
+ Function nf_get_att_int(ncid, varid, name, ivals) RESULT(status)
+
+ USE netcdf_nf_data, ONLY: NFINT
+
+ Integer,          Intent(IN)  :: ncid, varid
+ Character(LEN=*), Intent(IN)  :: name
+ Integer(NFINT),   Intent(OUT) :: ivals(*)
+ Integer                       :: status
+
+ End Function nf_get_att_int
+End Interface
+!--------------------------------- nf_get_att_real -------------------------
+Interface
+ Function nf_get_att_real(ncid, varid, name, rvals) RESULT(status)
+
+ USE netcdf_nf_data, ONLY: NFREAL
+
+ Integer,          Intent(IN)  :: ncid, varid
+ Character(LEN=*), Intent(IN)  :: name
+ Real(NFREAL),     Intent(OUT) :: rvals(*)
+ Integer                       :: status
+
+ End Function nf_get_att_real
+End Interface
+!--------------------------------- nf_get_att_double -----------------------
+Interface
+ Function nf_get_att_double(ncid, varid, name, dvals) RESULT(status)
+
+ USE netcdf_nf_data, ONLY: RK8
+
+
+ Integer,          Intent(IN)  :: ncid, varid
+ Character(LEN=*), Intent(IN)  :: name
+ Real(RK8),        Intent(OUT) :: dvals(*)
+ Integer                       :: status
+
+ End Function nf_get_att_double
+End Interface
+
+! Externals for functions that use C_CHAR strings to pass data to void
+! pointers
+
+ Integer, External :: nf_put_var1
+ Integer, External :: nf_get_var1
+ Integer, External :: nf_put_vars
+ Integer, External :: nf_get_vars
+ Integer, External :: nf_put_vara
+ Integer, External :: nf_get_vara
+
+#ifndef NO_NETCDF_2
+! External definitons for Netcdf2 functions 
+ Integer, External :: nccre 
+ Integer, External :: ncopn 
+ Integer, External :: ncddef
+ Integer, External :: ncdid
+ Integer, External :: ncvdef
+ Integer, External :: ncvid
+ Integer, External :: nctlen
+ Integer, External :: ncsfil
+#endif
+!--------------------------- End Module netcdf_nf_interfaces - ----------------
+
+End Module netcdf_nf_interfaces
diff --git a/fortran/netcdf.f90 b/fortran/netcdf.f90
new file mode 100644
index 0000000..49f8f19
--- /dev/null
+++ b/fortran/netcdf.f90
@@ -0,0 +1,59 @@
+! Description:
+!  
+! Input Parameters:
+!   None.
+!
+! Output Parameters:
+!   Many public constants are defined in "netcdf_constants.f90". The names follow 
+!     the Fortran 77 names, with nf90_ used as a prefix instead of nf_77. 
+!   Functions are made accessable through PUBLIC:: statements in "netcdf_visibility.f90". 
+!     Only the functions listed in this file are available in the interface. 
+!
+! References and Credits:
+!   Written by
+!    Robert Pincus
+!    Cooperative Institue for Meteorological Satellite Studies
+!    University of Wisconsin - Madison
+!    1225 W. Dayton St. 
+!    Madison, Wisconsin 53706
+!    Robert.Pincus at ssec.wisc.edu
+!
+! Design Notes:
+!   Module elements are private by default. 
+!   Many functions have optional arguments. In order to keep the interface easy to use, 
+!     we've reordered the arguments (relative to the F77 interface) in some functions. 
+!   The external datatype of attributes is the same as the internal type. 
+!   By default, data is read from or put into the lowest part of the netCDF array with stride 1. 
+!   We've made heavy use of overloading, especially in the variable put and get routines. 
+!     A single function exists for putting all variables; a single function exists for getting 
+!     variables. 
+!   Text variables must be treated somewhat differently. When a character variable is defined, the
+!     fastest-varying index (first index in Fortran) must be the maxiumu length of the character 
+!     string. N dimensional arrays of strings passed to the put or get functions are written/read
+!     from dimensions 2:N+1. The number of values along the first dimension is determined by the
+!     length of the argument character string. 
+!
+ module netcdf
+  use typeSizes, only: OneByteInt, TwoByteInt, FourByteInt, EightByteInt, &
+                       FourByteReal, EightByteReal
+  implicit none
+  private
+  ! as of version 4.4, the following are merged:
+  ! - netcdf_constants.f90 and netcdf4_constants.f90
+  !
+  ! Update the dependencies in the Makefile.am when modifying the list of
+  !     included files.
+  include "netcdf_constants.f90"
+  include "netcdf_externals.f90"
+  include "netcdf_overloads.f90"
+  include "netcdf_visibility.f90"
+contains
+  include "netcdf_file.f90"
+  include "netcdf3_file.f90"
+  include "netcdf_dims.f90"
+  include "netcdf_attributes.f90"
+  include "netcdf_variables.f90"
+  include "netcdf_text_variables.f90"
+  include "netcdf_expanded.f90"
+  include "netcdf_eightbyte.f90"
+end module netcdf
diff --git a/fortran/netcdf.inc b/fortran/netcdf.inc
new file mode 100644
index 0000000..1371bcb
--- /dev/null
+++ b/fortran/netcdf.inc
@@ -0,0 +1,1740 @@
+!     NetCDF-3.
+!
+! netcdf version 3 fortran interface:
+!
+
+!
+! external netcdf data types:
+!
+      integer nf_byte
+      integer nf_int1
+      integer nf_char
+      integer nf_short
+      integer nf_int2
+      integer nf_int
+      integer nf_float
+      integer nf_real
+      integer nf_double
+
+      parameter (nf_byte = 1)
+      parameter (nf_int1 = nf_byte)
+      parameter (nf_char = 2)
+      parameter (nf_short = 3)
+      parameter (nf_int2 = nf_short)
+      parameter (nf_int = 4)
+      parameter (nf_float = 5)
+      parameter (nf_real = nf_float)
+      parameter (nf_double = 6)
+
+!
+! default fill values:
+!
+      integer           nf_fill_byte
+      integer           nf_fill_int1
+      integer           nf_fill_char
+      integer           nf_fill_short
+      integer           nf_fill_int2
+      integer           nf_fill_int
+      real              nf_fill_float
+      real              nf_fill_real
+      doubleprecision   nf_fill_double
+
+      parameter (nf_fill_byte = -127)
+      parameter (nf_fill_int1 = nf_fill_byte)
+      parameter (nf_fill_char = 0)
+      parameter (nf_fill_short = -32767)
+      parameter (nf_fill_int2 = nf_fill_short)
+      parameter (nf_fill_int = -2147483647)
+      parameter (nf_fill_float = 9.9692099683868690e+36)
+      parameter (nf_fill_real = nf_fill_float)
+      parameter (nf_fill_double = 9.9692099683868690d+36)
+
+!
+! mode flags for opening and creating a netcdf dataset:
+!
+      integer nf_nowrite
+      integer nf_write
+      integer nf_clobber
+      integer nf_noclobber
+      integer nf_fill
+      integer nf_nofill
+      integer nf_lock
+      integer nf_share
+      integer nf_64bit_offset
+      integer nf_sizehint_default
+      integer nf_align_chunk
+      integer nf_format_classic
+      integer nf_format_64bit
+      integer nf_diskless
+      integer nf_mmap
+
+      parameter (nf_nowrite = 0)
+      parameter (nf_write = 1)
+      parameter (nf_clobber = 0)
+      parameter (nf_noclobber = 4)
+      parameter (nf_fill = 0)
+      parameter (nf_nofill = 256)
+      parameter (nf_lock = 1024)
+      parameter (nf_share = 2048)
+      parameter (nf_64bit_offset = 512)
+      parameter (nf_sizehint_default = 0)
+      parameter (nf_align_chunk = -1)
+      parameter (nf_format_classic = 1)
+      parameter (nf_format_64bit = 2)
+      parameter (nf_diskless = 8)
+      parameter (nf_mmap = 16)
+
+!
+! size argument for defining an unlimited dimension:
+!
+      integer nf_unlimited
+      parameter (nf_unlimited = 0)
+
+!
+! global attribute id:
+!
+      integer nf_global
+      parameter (nf_global = 0)
+
+!
+! implementation limits:
+!
+      integer nf_max_dims
+      integer nf_max_attrs
+      integer nf_max_vars
+      integer nf_max_name
+      integer nf_max_var_dims
+
+      parameter (nf_max_dims = 1024)
+      parameter (nf_max_attrs = 8192)
+      parameter (nf_max_vars = 8192)
+      parameter (nf_max_name = 256)
+      parameter (nf_max_var_dims = nf_max_dims)
+
+!
+! error codes:
+!
+      integer nf_noerr
+      integer nf_ebadid
+      integer nf_eexist
+      integer nf_einval
+      integer nf_eperm
+      integer nf_enotindefine
+      integer nf_eindefine
+      integer nf_einvalcoords
+      integer nf_emaxdims
+      integer nf_enameinuse
+      integer nf_enotatt
+      integer nf_emaxatts
+      integer nf_ebadtype
+      integer nf_ebaddim
+      integer nf_eunlimpos
+      integer nf_emaxvars
+      integer nf_enotvar
+      integer nf_eglobal
+      integer nf_enotnc
+      integer nf_ests
+      integer nf_emaxname
+      integer nf_eunlimit
+      integer nf_enorecvars
+      integer nf_echar
+      integer nf_eedge
+      integer nf_estride
+      integer nf_ebadname
+      integer nf_erange
+      integer nf_enomem
+      integer nf_evarsize
+      integer nf_edimsize
+      integer nf_etrunc
+
+      parameter (nf_noerr = 0)
+      parameter (nf_ebadid = -33)
+      parameter (nf_eexist = -35)
+      parameter (nf_einval = -36)
+      parameter (nf_eperm = -37)
+      parameter (nf_enotindefine = -38)
+      parameter (nf_eindefine = -39)
+      parameter (nf_einvalcoords = -40)
+      parameter (nf_emaxdims = -41)
+      parameter (nf_enameinuse = -42)
+      parameter (nf_enotatt = -43)
+      parameter (nf_emaxatts = -44)
+      parameter (nf_ebadtype = -45)
+      parameter (nf_ebaddim = -46)
+      parameter (nf_eunlimpos = -47)
+      parameter (nf_emaxvars = -48)
+      parameter (nf_enotvar = -49)
+      parameter (nf_eglobal = -50)
+      parameter (nf_enotnc = -51)
+      parameter (nf_ests = -52)
+      parameter (nf_emaxname = -53)
+      parameter (nf_eunlimit = -54)
+      parameter (nf_enorecvars = -55)
+      parameter (nf_echar = -56)
+      parameter (nf_eedge = -57)
+      parameter (nf_estride = -58)
+      parameter (nf_ebadname = -59)
+      parameter (nf_erange = -60)
+      parameter (nf_enomem = -61)
+      parameter (nf_evarsize = -62)
+      parameter (nf_edimsize = -63)
+      parameter (nf_etrunc = -64)
+!
+! error handling modes:
+!
+      integer  nf_fatal
+      integer nf_verbose
+
+      parameter (nf_fatal = 1)
+      parameter (nf_verbose = 2)
+
+!
+! miscellaneous routines:
+!
+      character*80   nf_inq_libvers
+      external       nf_inq_libvers
+
+      character*80   nf_strerror
+!                         (integer             ncerr)
+      external       nf_strerror
+
+      logical        nf_issyserr
+!                         (integer             ncerr)
+      external       nf_issyserr
+
+!
+! control routines:
+!
+      integer         nf_inq_base_pe
+!                         (integer             ncid,
+!                          integer             pe)
+      external        nf_inq_base_pe
+
+      integer         nf_set_base_pe
+!                         (integer             ncid,
+!                          integer             pe)
+      external        nf_set_base_pe
+
+      integer         nf_create
+!                         (character*(*)       path,
+!                          integer             cmode,
+!                          integer             ncid)
+      external        nf_create
+
+      integer         nf__create
+!                         (character*(*)       path,
+!                          integer             cmode,
+!                          integer             initialsz,
+!                          integer             chunksizehint,
+!                          integer             ncid)
+      external        nf__create
+
+      integer         nf__create_mp
+!                         (character*(*)       path,
+!                          integer             cmode,
+!                          integer             initialsz,
+!                          integer             basepe,
+!                          integer             chunksizehint,
+!                          integer             ncid)
+      external        nf__create_mp
+
+      integer         nf_open
+!                         (character*(*)       path,
+!                          integer             mode,
+!                          integer             ncid)
+      external        nf_open
+
+      integer         nf__open
+!                         (character*(*)       path,
+!                          integer             mode,
+!                          integer             chunksizehint,
+!                          integer             ncid)
+      external        nf__open
+
+      integer         nf__open_mp
+!                         (character*(*)       path,
+!                          integer             mode,
+!                          integer             basepe,
+!                          integer             chunksizehint,
+!                          integer             ncid)
+      external        nf__open_mp
+
+      integer         nf_set_fill
+!                         (integer             ncid,
+!                          integer             fillmode,
+!                          integer             old_mode)
+      external        nf_set_fill
+
+      integer         nf_set_default_format
+!                          (integer             format,
+!                          integer             old_format)
+      external        nf_set_default_format
+
+      integer         nf_redef
+!                         (integer             ncid)
+      external        nf_redef
+
+      integer         nf_enddef
+!                         (integer             ncid)
+      external        nf_enddef
+
+      integer         nf__enddef
+!                         (integer             ncid,
+!                          integer             h_minfree,
+!                          integer             v_align,
+!                          integer             v_minfree,
+!                          integer             r_align)
+      external        nf__enddef
+
+      integer         nf_sync
+!                         (integer             ncid)
+      external        nf_sync
+
+      integer         nf_abort
+!                         (integer             ncid)
+      external        nf_abort
+
+      integer         nf_close
+!                         (integer             ncid)
+      external        nf_close
+
+      integer         nf_delete
+!                         (character*(*)       ncid)
+      external        nf_delete
+
+!
+! general inquiry routines:
+!
+
+      integer         nf_inq
+!                         (integer             ncid,
+!                          integer             ndims,
+!                          integer             nvars,
+!                          integer             ngatts,
+!                          integer             unlimdimid)
+      external        nf_inq
+
+! new inquire path
+
+      integer nf_inq_path
+      external nf_inq_path
+
+      integer         nf_inq_ndims
+!                         (integer             ncid,
+!                          integer             ndims)
+      external        nf_inq_ndims
+
+      integer         nf_inq_nvars
+!                         (integer             ncid,
+!                          integer             nvars)
+      external        nf_inq_nvars
+
+      integer         nf_inq_natts
+!                         (integer             ncid,
+!                          integer             ngatts)
+      external        nf_inq_natts
+
+      integer         nf_inq_unlimdim
+!                         (integer             ncid,
+!                          integer             unlimdimid)
+      external        nf_inq_unlimdim
+
+      integer         nf_inq_format
+!                         (integer             ncid,
+!                          integer             format)
+      external        nf_inq_format
+
+!
+! dimension routines:
+!
+
+      integer         nf_def_dim
+!                         (integer             ncid,
+!                          character(*)        name,
+!                          integer             len,
+!                          integer             dimid)
+      external        nf_def_dim
+
+      integer         nf_inq_dimid
+!                         (integer             ncid,
+!                          character(*)        name,
+!                          integer             dimid)
+      external        nf_inq_dimid
+
+      integer         nf_inq_dim
+!                         (integer             ncid,
+!                          integer             dimid,
+!                          character(*)        name,
+!                          integer             len)
+      external        nf_inq_dim
+
+      integer         nf_inq_dimname
+!                         (integer             ncid,
+!                          integer             dimid,
+!                          character(*)        name)
+      external        nf_inq_dimname
+
+      integer         nf_inq_dimlen
+!                         (integer             ncid,
+!                          integer             dimid,
+!                          integer             len)
+      external        nf_inq_dimlen
+
+      integer         nf_rename_dim
+!                         (integer             ncid,
+!                          integer             dimid,
+!                          character(*)        name)
+      external        nf_rename_dim
+
+!
+! general attribute routines:
+!
+
+      integer         nf_inq_att
+!                         (integer             ncid,
+!                          integer             varid,
+!                          character(*)        name,
+!                          integer             xtype,
+!                          integer             len)
+      external        nf_inq_att
+
+      integer         nf_inq_attid
+!                         (integer             ncid,
+!                          integer             varid,
+!                          character(*)        name,
+!                          integer             attnum)
+      external        nf_inq_attid
+
+      integer         nf_inq_atttype
+!                         (integer             ncid,
+!                          integer             varid,
+!                          character(*)        name,
+!                          integer             xtype)
+      external        nf_inq_atttype
+
+      integer         nf_inq_attlen
+!                         (integer             ncid,
+!                          integer             varid,
+!                          character(*)        name,
+!                          integer             len)
+      external        nf_inq_attlen
+
+      integer         nf_inq_attname
+!                         (integer             ncid,
+!                          integer             varid,
+!                          integer             attnum,
+!                          character(*)        name)
+      external        nf_inq_attname
+
+      integer         nf_copy_att
+!                         (integer             ncid_in,
+!                          integer             varid_in,
+!                          character(*)        name,
+!                          integer             ncid_out,
+!                          integer             varid_out)
+      external        nf_copy_att
+
+      integer         nf_rename_att
+!                         (integer             ncid,
+!                          integer             varid,
+!                          character(*)        curname,
+!                          character(*)        newname)
+      external        nf_rename_att
+
+      integer         nf_del_att
+!                         (integer             ncid,
+!                          integer             varid,
+!                          character(*)        name)
+      external        nf_del_att
+
+!
+! attribute put/get routines:
+!
+
+      integer         nf_put_att_text
+!                         (integer             ncid,
+!                          integer             varid,
+!                          character(*)        name,
+!                          integer             len,
+!                          character(*)        text)
+      external        nf_put_att_text
+
+      integer         nf_get_att_text
+!                         (integer             ncid,
+!                          integer             varid,
+!                          character(*)        name,
+!                          character(*)        text)
+      external        nf_get_att_text
+
+      integer         nf_put_att_int1
+!                         (integer             ncid,
+!                          integer             varid,
+!                          character(*)        name,
+!                          integer             xtype,
+!                          integer             len,
+!                          nf_int1_t           i1vals(1))
+      external        nf_put_att_int1
+
+      integer         nf_get_att_int1
+!                         (integer             ncid,
+!                          integer             varid,
+!                          character(*)        name,
+!                          nf_int1_t           i1vals(1))
+      external        nf_get_att_int1
+
+      integer         nf_put_att_int2
+!                         (integer             ncid,
+!                          integer             varid,
+!                          character(*)        name,
+!                          integer             xtype,
+!                          integer             len,
+!                          nf_int2_t           i2vals(1))
+      external        nf_put_att_int2
+
+      integer         nf_get_att_int2
+!                         (integer             ncid,
+!                          integer             varid,
+!                          character(*)        name,
+!                          nf_int2_t           i2vals(1))
+      external        nf_get_att_int2
+
+      integer         nf_put_att_int
+!                         (integer             ncid,
+!                          integer             varid,
+!                          character(*)        name,
+!                          integer             xtype,
+!                          integer             len,
+!                          integer             ivals(1))
+      external        nf_put_att_int
+
+      integer         nf_get_att_int
+!                         (integer             ncid,
+!                          integer             varid,
+!                          character(*)        name,
+!                          integer             ivals(1))
+      external        nf_get_att_int
+
+      integer         nf_put_att_real
+!                         (integer             ncid,
+!                          integer             varid,
+!                          character(*)        name,
+!                          integer             xtype,
+!                          integer             len,
+!                          real                rvals(1))
+      external        nf_put_att_real
+
+      integer         nf_get_att_real
+!                         (integer             ncid,
+!                          integer             varid,
+!                          character(*)        name,
+!                          real                rvals(1))
+      external        nf_get_att_real
+
+      integer         nf_put_att_double
+!                         (integer             ncid,
+!                          integer             varid,
+!                          character(*)        name,
+!                          integer             xtype,
+!                          integer             len,
+!                          double              dvals(1))
+      external        nf_put_att_double
+
+      integer         nf_get_att_double
+!                         (integer             ncid,
+!                          integer             varid,
+!                          character(*)        name,
+!                          double              dvals(1))
+      external        nf_get_att_double
+
+!
+! general variable routines:
+!
+
+      integer         nf_def_var
+!                         (integer             ncid,
+!                          character(*)        name,
+!                          integer             datatype,
+!                          integer             ndims,
+!                          integer             dimids(1),
+!                          integer             varid)
+      external        nf_def_var
+
+      integer         nf_inq_var
+!                         (integer             ncid,
+!                          integer             varid,
+!                          character(*)        name,
+!                          integer             datatype,
+!                          integer             ndims,
+!                          integer             dimids(1),
+!                          integer             natts)
+      external        nf_inq_var
+
+      integer         nf_inq_varid
+!                         (integer             ncid,
+!                          character(*)        name,
+!                          integer             varid)
+      external        nf_inq_varid
+
+      integer         nf_inq_varname
+!                         (integer             ncid,
+!                          integer             varid,
+!                          character(*)        name)
+      external        nf_inq_varname
+
+      integer         nf_inq_vartype
+!                         (integer             ncid,
+!                          integer             varid,
+!                          integer             xtype)
+      external        nf_inq_vartype
+
+      integer         nf_inq_varndims
+!                         (integer             ncid,
+!                          integer             varid,
+!                          integer             ndims)
+      external        nf_inq_varndims
+
+      integer         nf_inq_vardimid
+!                         (integer             ncid,
+!                          integer             varid,
+!                          integer             dimids(1))
+      external        nf_inq_vardimid
+
+      integer         nf_inq_varnatts
+!                         (integer             ncid,
+!                          integer             varid,
+!                          integer             natts)
+      external        nf_inq_varnatts
+
+      integer         nf_rename_var
+!                         (integer             ncid,
+!                          integer             varid,
+!                          character(*)        name)
+      external        nf_rename_var
+
+      integer         nf_copy_var
+!                         (integer             ncid_in,
+!                          integer             varid,
+!                          integer             ncid_out)
+      external        nf_copy_var
+
+!
+! entire variable put/get routines:
+!
+
+      integer         nf_put_var_text
+!                         (integer             ncid,
+!                          integer             varid,
+!                          character(*)        text)
+      external        nf_put_var_text
+
+      integer         nf_get_var_text
+!                         (integer             ncid,
+!                          integer             varid,
+!                          character(*)        text)
+      external        nf_get_var_text
+
+      integer         nf_put_var_int1
+!                         (integer             ncid,
+!                          integer             varid,
+!                          nf_int1_t           i1vals(1))
+      external        nf_put_var_int1
+
+      integer         nf_get_var_int1
+!                         (integer             ncid,
+!                          integer             varid,
+!                          nf_int1_t           i1vals(1))
+      external        nf_get_var_int1
+
+      integer         nf_put_var_int2
+!                         (integer             ncid,
+!                          integer             varid,
+!                          nf_int2_t           i2vals(1))
+      external        nf_put_var_int2
+
+      integer         nf_get_var_int2
+!                         (integer             ncid,
+!                          integer             varid,
+!                          nf_int2_t           i2vals(1))
+      external        nf_get_var_int2
+
+      integer         nf_put_var_int
+!                         (integer             ncid,
+!                          integer             varid,
+!                          integer             ivals(1))
+      external        nf_put_var_int
+
+      integer         nf_get_var_int
+!                         (integer             ncid,
+!                          integer             varid,
+!                          integer             ivals(1))
+      external        nf_get_var_int
+
+      integer         nf_put_var_real
+!                         (integer             ncid,
+!                          integer             varid,
+!                          real                rvals(1))
+      external        nf_put_var_real
+
+      integer         nf_get_var_real
+!                         (integer             ncid,
+!                          integer             varid,
+!                          real                rvals(1))
+      external        nf_get_var_real
+
+      integer         nf_put_var_double
+!                         (integer             ncid,
+!                          integer             varid,
+!                          doubleprecision     dvals(1))
+      external        nf_put_var_double
+
+      integer         nf_get_var_double
+!                         (integer             ncid,
+!                          integer             varid,
+!                          doubleprecision     dvals(1))
+      external        nf_get_var_double
+
+!
+! single variable put/get routines:
+!
+
+      integer         nf_put_var1_text
+!                         (integer             ncid,
+!                          integer             varid,
+!                          integer             index(1),
+!                          character*1         text)
+      external        nf_put_var1_text
+
+      integer         nf_get_var1_text
+!                         (integer             ncid,
+!                          integer             varid,
+!                          integer             index(1),
+!                          character*1         text)
+      external        nf_get_var1_text
+
+      integer         nf_put_var1_int1
+!                         (integer             ncid,
+!                          integer             varid,
+!                          integer             index(1),
+!                          nf_int1_t           i1val)
+      external        nf_put_var1_int1
+
+      integer         nf_get_var1_int1
+!                         (integer             ncid,
+!                          integer             varid,
+!                          integer             index(1),
+!                          nf_int1_t           i1val)
+      external        nf_get_var1_int1
+
+      integer         nf_put_var1_int2
+!                         (integer             ncid,
+!                          integer             varid,
+!                          integer             index(1),
+!                          nf_int2_t           i2val)
+      external        nf_put_var1_int2
+
+      integer         nf_get_var1_int2
+!                         (integer             ncid,
+!                          integer             varid,
+!                          integer             index(1),
+!                          nf_int2_t           i2val)
+      external        nf_get_var1_int2
+
+      integer         nf_put_var1_int
+!                         (integer             ncid,
+!                          integer             varid,
+!                          integer             index(1),
+!                          integer             ival)
+      external        nf_put_var1_int
+
+      integer         nf_get_var1_int
+!                         (integer             ncid,
+!                          integer             varid,
+!                          integer             index(1),
+!                          integer             ival)
+      external        nf_get_var1_int
+
+      integer         nf_put_var1_real
+!                         (integer             ncid,
+!                          integer             varid,
+!                          integer             index(1),
+!                          real                rval)
+      external        nf_put_var1_real
+
+      integer         nf_get_var1_real
+!                         (integer             ncid,
+!                          integer             varid,
+!                          integer             index(1),
+!                          real                rval)
+      external        nf_get_var1_real
+
+      integer         nf_put_var1_double
+!                         (integer             ncid,
+!                          integer             varid,
+!                          integer             index(1),
+!                          doubleprecision     dval)
+      external        nf_put_var1_double
+
+      integer         nf_get_var1_double
+!                         (integer             ncid,
+!                          integer             varid,
+!                          integer             index(1),
+!                          doubleprecision     dval)
+      external        nf_get_var1_double
+
+!
+! variable array put/get routines:
+!
+
+      integer         nf_put_vara_text
+!                         (integer             ncid,
+!                          integer             varid,
+!                          integer             start(1),
+!                          integer             count(1),
+!                          character(*)        text)
+      external        nf_put_vara_text
+
+      integer         nf_get_vara_text
+!                         (integer             ncid,
+!                          integer             varid,
+!                          integer             start(1),
+!                          integer             count(1),
+!                          character(*)        text)
+      external        nf_get_vara_text
+
+      integer         nf_put_vara_int1
+!                         (integer             ncid,
+!                          integer             varid,
+!                          integer             start(1),
+!                          integer             count(1),
+!                          nf_int1_t           i1vals(1))
+      external        nf_put_vara_int1
+
+      integer         nf_get_vara_int1
+!                         (integer             ncid,
+!                          integer             varid,
+!                          integer             start(1),
+!                          integer             count(1),
+!                          nf_int1_t           i1vals(1))
+      external        nf_get_vara_int1
+
+      integer         nf_put_vara_int2
+!                         (integer             ncid,
+!                          integer             varid,
+!                          integer             start(1),
+!                          integer             count(1),
+!                          nf_int2_t           i2vals(1))
+      external        nf_put_vara_int2
+
+      integer         nf_get_vara_int2
+!                         (integer             ncid,
+!                          integer             varid,
+!                          integer             start(1),
+!                          integer             count(1),
+!                          nf_int2_t           i2vals(1))
+      external        nf_get_vara_int2
+
+      integer         nf_put_vara_int
+!                         (integer             ncid,
+!                          integer             varid,
+!                          integer             start(1),
+!                          integer             count(1),
+!                          integer             ivals(1))
+      external        nf_put_vara_int
+
+      integer         nf_get_vara_int
+!                         (integer             ncid,
+!                          integer             varid,
+!                          integer             start(1),
+!                          integer             count(1),
+!                          integer             ivals(1))
+      external        nf_get_vara_int
+
+      integer         nf_put_vara_real
+!                         (integer             ncid,
+!                          integer             varid,
+!                          integer             start(1),
+!                          integer             count(1),
+!                          real                rvals(1))
+      external        nf_put_vara_real
+
+      integer         nf_get_vara_real
+!                         (integer             ncid,
+!                          integer             varid,
+!                          integer             start(1),
+!                          integer             count(1),
+!                          real                rvals(1))
+      external        nf_get_vara_real
+
+      integer         nf_put_vara_double
+!                         (integer             ncid,
+!                          integer             varid,
+!                          integer             start(1),
+!                          integer             count(1),
+!                          doubleprecision     dvals(1))
+      external        nf_put_vara_double
+
+      integer         nf_get_vara_double
+!                         (integer             ncid,
+!                          integer             varid,
+!                          integer             start(1),
+!                          integer             count(1),
+!                          doubleprecision     dvals(1))
+      external        nf_get_vara_double
+
+!
+! strided variable put/get routines:
+!
+
+      integer         nf_put_vars_text
+!                         (integer             ncid,
+!                          integer             varid,
+!                          integer             start(1),
+!                          integer             count(1),
+!                          integer             stride(1),
+!                          character(*)        text)
+      external        nf_put_vars_text
+
+      integer         nf_get_vars_text
+!                         (integer             ncid,
+!                          integer             varid,
+!                          integer             start(1),
+!                          integer             count(1),
+!                          integer             stride(1),
+!                          character(*)        text)
+      external        nf_get_vars_text
+
+      integer         nf_put_vars_int1
+!                         (integer             ncid,
+!                          integer             varid,
+!                          integer             start(1),
+!                          integer             count(1),
+!                          integer             stride(1),
+!                          nf_int1_t           i1vals(1))
+      external        nf_put_vars_int1
+
+      integer         nf_get_vars_int1
+!                         (integer             ncid,
+!                          integer             varid,
+!                          integer             start(1),
+!                          integer             count(1),
+!                          integer             stride(1),
+!                          nf_int1_t           i1vals(1))
+      external        nf_get_vars_int1
+
+      integer         nf_put_vars_int2
+!                         (integer             ncid,
+!                          integer             varid,
+!                          integer             start(1),
+!                          integer             count(1),
+!                          integer             stride(1),
+!                          nf_int2_t           i2vals(1))
+      external        nf_put_vars_int2
+
+      integer         nf_get_vars_int2
+!                         (integer             ncid,
+!                          integer             varid,
+!                          integer             start(1),
+!                          integer             count(1),
+!                          integer             stride(1),
+!                          nf_int2_t           i2vals(1))
+      external        nf_get_vars_int2
+
+      integer         nf_put_vars_int
+!                         (integer             ncid,
+!                          integer             varid,
+!                          integer             start(1),
+!                          integer             count(1),
+!                          integer             stride(1),
+!                          integer             ivals(1))
+      external        nf_put_vars_int
+
+      integer         nf_get_vars_int
+!                         (integer             ncid,
+!                          integer             varid,
+!                          integer             start(1),
+!                          integer             count(1),
+!                          integer             stride(1),
+!                          integer             ivals(1))
+      external        nf_get_vars_int
+
+      integer         nf_put_vars_real
+!                         (integer             ncid,
+!                          integer             varid,
+!                          integer             start(1),
+!                          integer             count(1),
+!                          integer             stride(1),
+!                          real                rvals(1))
+      external        nf_put_vars_real
+
+      integer         nf_get_vars_real
+!                         (integer             ncid,
+!                          integer             varid,
+!                          integer             start(1),
+!                          integer             count(1),
+!                          integer             stride(1),
+!                          real                rvals(1))
+      external        nf_get_vars_real
+
+      integer         nf_put_vars_double
+!                         (integer             ncid,
+!                          integer             varid,
+!                          integer             start(1),
+!                          integer             count(1),
+!                          integer             stride(1),
+!                          doubleprecision     dvals(1))
+      external        nf_put_vars_double
+
+      integer         nf_get_vars_double
+!                         (integer             ncid,
+!                          integer             varid,
+!                          integer             start(1),
+!                          integer             count(1),
+!                          integer             stride(1),
+!                          doubleprecision     dvals(1))
+      external        nf_get_vars_double
+
+!
+! mapped variable put/get routines:
+!
+
+      integer         nf_put_varm_text
+!                         (integer             ncid,
+!                          integer             varid,
+!                          integer             start(1),
+!                          integer             count(1),
+!                          integer             stride(1),
+!                          integer             imap(1),
+!                          character(*)        text)
+      external        nf_put_varm_text
+
+      integer         nf_get_varm_text
+!                         (integer             ncid,
+!                          integer             varid,
+!                          integer             start(1),
+!                          integer             count(1),
+!                          integer             stride(1),
+!                          integer             imap(1),
+!                          character(*)        text)
+      external        nf_get_varm_text
+
+      integer         nf_put_varm_int1
+!                         (integer             ncid,
+!                          integer             varid,
+!                          integer             start(1),
+!                          integer             count(1),
+!                          integer             stride(1),
+!                          integer             imap(1),
+!                          nf_int1_t           i1vals(1))
+      external        nf_put_varm_int1
+
+      integer         nf_get_varm_int1
+!                         (integer             ncid,
+!                          integer             varid,
+!                          integer             start(1),
+!                          integer             count(1),
+!                          integer             stride(1),
+!                          integer             imap(1),
+!                          nf_int1_t           i1vals(1))
+      external        nf_get_varm_int1
+
+      integer         nf_put_varm_int2
+!                         (integer             ncid,
+!                          integer             varid,
+!                          integer             start(1),
+!                          integer             count(1),
+!                          integer             stride(1),
+!                          integer             imap(1),
+!                          nf_int2_t           i2vals(1))
+      external        nf_put_varm_int2
+
+      integer         nf_get_varm_int2
+!                         (integer             ncid,
+!                          integer             varid,
+!                          integer             start(1),
+!                          integer             count(1),
+!                          integer             stride(1),
+!                          integer             imap(1),
+!                          nf_int2_t           i2vals(1))
+      external        nf_get_varm_int2
+
+      integer         nf_put_varm_int
+!                         (integer             ncid,
+!                          integer             varid,
+!                          integer             start(1),
+!                          integer             count(1),
+!                          integer             stride(1),
+!                          integer             imap(1),
+!                          integer             ivals(1))
+      external        nf_put_varm_int
+
+      integer         nf_get_varm_int
+!                         (integer             ncid,
+!                          integer             varid,
+!                          integer             start(1),
+!                          integer             count(1),
+!                          integer             stride(1),
+!                          integer             imap(1),
+!                          integer             ivals(1))
+      external        nf_get_varm_int
+
+      integer         nf_put_varm_real
+!                         (integer             ncid,
+!                          integer             varid,
+!                          integer             start(1),
+!                          integer             count(1),
+!                          integer             stride(1),
+!                          integer             imap(1),
+!                          real                rvals(1))
+      external        nf_put_varm_real
+
+      integer         nf_get_varm_real
+!                         (integer             ncid,
+!                          integer             varid,
+!                          integer             start(1),
+!                          integer             count(1),
+!                          integer             stride(1),
+!                          integer             imap(1),
+!                          real                rvals(1))
+      external        nf_get_varm_real
+
+      integer         nf_put_varm_double
+!                         (integer             ncid,
+!                          integer             varid,
+!                          integer             start(1),
+!                          integer             count(1),
+!                          integer             stride(1),
+!                          integer             imap(1),
+!                          doubleprecision     dvals(1))
+      external        nf_put_varm_double
+
+      integer         nf_get_varm_double
+!                         (integer             ncid,
+!                          integer             varid,
+!                          integer             start(1),
+!                          integer             count(1),
+!                          integer             stride(1),
+!                          integer             imap(1),
+!                          doubleprecision     dvals(1))
+      external        nf_get_varm_double
+
+
+!     NetCDF-4.
+!     This is part of netCDF-4. Copyright 2006, UCAR, See COPYRIGHT
+!     file for distribution information.
+
+!     Netcdf version 4 fortran interface.
+
+!     $Id: netcdf4.inc,v 1.28 2010/05/25 13:53:02 ed Exp $
+
+!     New netCDF-4 types.
+      integer nf_ubyte
+      integer nf_ushort
+      integer nf_uint
+      integer nf_int64
+      integer nf_uint64
+      integer nf_string
+      integer nf_vlen
+      integer nf_opaque
+      integer nf_enum
+      integer nf_compound
+
+      parameter (nf_ubyte = 7)
+      parameter (nf_ushort = 8)
+      parameter (nf_uint = 9)
+      parameter (nf_int64 = 10)
+      parameter (nf_uint64 = 11)
+      parameter (nf_string = 12)
+      parameter (nf_vlen = 13)
+      parameter (nf_opaque = 14)
+      parameter (nf_enum = 15)
+      parameter (nf_compound = 16)
+
+!     New netCDF-4 fill values.
+      integer           nf_fill_ubyte
+      integer           nf_fill_ushort
+!      real              nf_fill_uint
+!      real              nf_fill_int64
+!      real              nf_fill_uint64
+      parameter (nf_fill_ubyte = 255)
+      parameter (nf_fill_ushort = 65535)
+
+!     New constants.
+      integer nf_format_netcdf4
+      parameter (nf_format_netcdf4 = 3)
+
+      integer nf_format_netcdf4_classic
+      parameter (nf_format_netcdf4_classic = 4)
+
+      integer nf_netcdf4
+      parameter (nf_netcdf4 = 4096)
+
+      integer nf_classic_model
+      parameter (nf_classic_model = 256)
+
+      integer nf_chunk_seq
+      parameter (nf_chunk_seq = 0)
+      integer nf_chunk_sub
+      parameter (nf_chunk_sub = 1)
+      integer nf_chunk_sizes
+      parameter (nf_chunk_sizes = 2)
+
+      integer nf_endian_native
+      parameter (nf_endian_native = 0)
+      integer nf_endian_little
+      parameter (nf_endian_little = 1)
+      integer nf_endian_big
+      parameter (nf_endian_big = 2)
+
+!     For NF_DEF_VAR_CHUNKING
+      integer nf_chunked
+      parameter (nf_chunked = 0)
+      integer nf_contiguous
+      parameter (nf_contiguous = 1)
+
+!     For NF_DEF_VAR_FLETCHER32
+      integer nf_nochecksum
+      parameter (nf_nochecksum = 0)
+      integer nf_fletcher32
+      parameter (nf_fletcher32 = 1)
+
+!     For NF_DEF_VAR_DEFLATE
+      integer nf_noshuffle
+      parameter (nf_noshuffle = 0)
+      integer nf_shuffle
+      parameter (nf_shuffle = 1)
+
+!     For NF_DEF_VAR_SZIP
+      integer nf_szip_ec_option_mask
+      parameter (nf_szip_ec_option_mask = 4)
+      integer nf_szip_nn_option_mask
+      parameter (nf_szip_nn_option_mask = 32)
+
+!     For parallel I/O.
+      integer nf_mpiio      
+      parameter (nf_mpiio = 8192)
+      integer nf_mpiposix
+      parameter (nf_mpiposix = 16384)
+      integer nf_pnetcdf
+      parameter (nf_pnetcdf = 32768)
+
+!     For NF_VAR_PAR_ACCESS.
+      integer nf_independent
+      parameter (nf_independent = 0)
+      integer nf_collective
+      parameter (nf_collective = 1)
+
+!     New error codes.
+      integer nf_ehdferr        ! Error at HDF5 layer. 
+      parameter (nf_ehdferr = -101)
+      integer nf_ecantread      ! Can't read. 
+      parameter (nf_ecantread = -102)
+      integer nf_ecantwrite     ! Can't write. 
+      parameter (nf_ecantwrite = -103)
+      integer nf_ecantcreate    ! Can't create. 
+      parameter (nf_ecantcreate = -104)
+      integer nf_efilemeta      ! Problem with file metadata. 
+      parameter (nf_efilemeta = -105)
+      integer nf_edimmeta       ! Problem with dimension metadata. 
+      parameter (nf_edimmeta = -106)
+      integer nf_eattmeta       ! Problem with attribute metadata. 
+      parameter (nf_eattmeta = -107)
+      integer nf_evarmeta       ! Problem with variable metadata. 
+      parameter (nf_evarmeta = -108)
+      integer nf_enocompound    ! Not a compound type. 
+      parameter (nf_enocompound = -109)
+      integer nf_eattexists     ! Attribute already exists. 
+      parameter (nf_eattexists = -110)
+      integer nf_enotnc4        ! Attempting netcdf-4 operation on netcdf-3 file.   
+      parameter (nf_enotnc4 = -111)
+      integer nf_estrictnc3     ! Attempting netcdf-4 operation on strict nc3 netcdf-4 file.   
+      parameter (nf_estrictnc3 = -112)
+      integer nf_enotnc3        ! Attempting netcdf-3 operation on netcdf-4 file.   
+      parameter (nf_enotnc3 = -113)
+      integer nf_enopar         ! Parallel operation on file opened for non-parallel access.   
+      parameter (nf_enopar = -114)
+      integer nf_eparinit       ! Error initializing for parallel access.   
+      parameter (nf_eparinit = -115)
+      integer nf_ebadgrpid      ! Bad group ID.   
+      parameter (nf_ebadgrpid = -116)
+      integer nf_ebadtypid      ! Bad type ID.   
+      parameter (nf_ebadtypid = -117)
+      integer nf_etypdefined    ! Type has already been defined and may not be edited. 
+      parameter (nf_etypdefined = -118)
+      integer nf_ebadfield      ! Bad field ID.   
+      parameter (nf_ebadfield = -119)
+      integer nf_ebadclass      ! Bad class.   
+      parameter (nf_ebadclass = -120)
+      integer nf_emaptype       ! Mapped access for atomic types only.   
+      parameter (nf_emaptype = -121)
+      integer nf_elatefill      ! Attempt to define fill value when data already exists. 
+      parameter (nf_elatefill = -122)
+      integer nf_elatedef       ! Attempt to define var properties, like deflate, after enddef. 
+      parameter (nf_elatedef = -123)
+      integer nf_edimscale      ! Probem with HDF5 dimscales. 
+      parameter (nf_edimscale = -124)
+      integer nf_enogrp       ! No group found.
+      parameter (nf_enogrp = -125)
+
+
+!     New functions.
+
+!     Parallel I/O.
+      integer nf_create_par
+      external nf_create_par
+
+      integer nf_open_par
+      external nf_open_par
+
+      integer nf_var_par_access
+      external nf_var_par_access
+
+!     Functions to handle groups.
+      integer nf_inq_ncid
+      external nf_inq_ncid
+
+      integer nf_inq_grps
+      external nf_inq_grps
+
+      integer nf_inq_grpname
+      external nf_inq_grpname
+
+      integer nf_inq_grpname_full
+      external nf_inq_grpname_full
+
+      integer nf_inq_grpname_len
+      external nf_inq_grpname_len
+
+      integer nf_inq_grp_parent
+      external nf_inq_grp_parent
+
+      integer nf_inq_grp_ncid
+      external nf_inq_grp_ncid
+
+      integer nf_inq_grp_full_ncid
+      external nf_inq_grp_full_ncid
+
+      integer nf_inq_varids
+      external nf_inq_varids
+
+      integer nf_inq_dimids
+      external nf_inq_dimids
+
+      integer nf_def_grp
+      external nf_def_grp
+
+!     New rename grp function
+
+      integer nf_rename_grp
+      external nf_rename_grp
+
+!     New options for netCDF variables.
+      integer nf_def_var_deflate
+      external nf_def_var_deflate
+
+      integer nf_inq_var_deflate
+      external nf_inq_var_deflate
+
+      integer nf_def_var_fletcher32
+      external nf_def_var_fletcher32
+
+      integer nf_inq_var_fletcher32
+      external nf_inq_var_fletcher32
+
+      integer nf_def_var_chunking
+      external nf_def_var_chunking
+
+      integer nf_inq_var_chunking
+      external nf_inq_var_chunking
+
+      integer nf_def_var_fill
+      external nf_def_var_fill
+
+      integer nf_inq_var_fill
+      external nf_inq_var_fill
+
+      integer nf_def_var_endian
+      external nf_def_var_endian
+
+      integer nf_inq_var_endian
+      external nf_inq_var_endian
+
+!     User defined types.
+      integer nf_inq_typeids
+      external nf_inq_typeids
+
+      integer nf_inq_typeid
+      external nf_inq_typeid
+
+      integer nf_inq_type
+      external nf_inq_type
+
+      integer nf_inq_user_type
+      external nf_inq_user_type
+
+!     User defined types - compound types.
+      integer nf_def_compound
+      external nf_def_compound
+
+      integer nf_insert_compound
+      external nf_insert_compound
+
+      integer nf_insert_array_compound
+      external nf_insert_array_compound
+
+      integer nf_inq_compound
+      external nf_inq_compound
+
+      integer nf_inq_compound_name
+      external nf_inq_compound_name
+
+      integer nf_inq_compound_size
+      external nf_inq_compound_size
+
+      integer nf_inq_compound_nfields
+      external nf_inq_compound_nfields
+
+      integer nf_inq_compound_field
+      external nf_inq_compound_field
+
+      integer nf_inq_compound_fieldname
+      external nf_inq_compound_fieldname
+
+      integer nf_inq_compound_fieldindex
+      external nf_inq_compound_fieldindex
+
+      integer nf_inq_compound_fieldoffset
+      external nf_inq_compound_fieldoffset
+
+      integer nf_inq_compound_fieldtype
+      external nf_inq_compound_fieldtype
+
+      integer nf_inq_compound_fieldndims
+      external nf_inq_compound_fieldndims
+
+      integer nf_inq_compound_fielddim_sizes
+      external nf_inq_compound_fielddim_sizes
+
+!     User defined types - variable length arrays.
+      integer nf_def_vlen
+      external nf_def_vlen
+
+      integer nf_inq_vlen
+      external nf_inq_vlen
+
+      integer nf_free_vlen
+      external nf_free_vlen
+
+!     User defined types - enums.
+      integer nf_def_enum
+      external nf_def_enum
+
+      integer nf_insert_enum
+      external nf_insert_enum
+
+      integer nf_inq_enum
+      external nf_inq_enum
+
+      integer nf_inq_enum_member
+      external nf_inq_enum_member
+
+      integer nf_inq_enum_ident
+      external nf_inq_enum_ident
+
+!     User defined types - opaque.
+      integer nf_def_opaque
+      external nf_def_opaque
+
+      integer nf_inq_opaque
+      external nf_inq_opaque
+
+!     Write and read attributes of any type, including user defined
+!     types.
+      integer nf_put_att
+      external nf_put_att
+      integer nf_get_att
+      external nf_get_att
+
+!     Write and read variables of any type, including user defined
+!     types.
+      integer nf_put_var
+      external nf_put_var
+      integer nf_put_var1
+      external nf_put_var1
+      integer nf_put_vara
+      external nf_put_vara
+      integer nf_put_vars
+      external nf_put_vars
+      integer nf_get_var
+      external nf_get_var
+      integer nf_get_var1
+      external nf_get_var1
+      integer nf_get_vara
+      external nf_get_vara
+      integer nf_get_vars
+      external nf_get_vars
+
+!     64-bit int functions.
+      integer nf_put_var1_int64
+      external nf_put_var1_int64
+      integer nf_put_vara_int64
+      external nf_put_vara_int64
+      integer nf_put_vars_int64
+      external nf_put_vars_int64
+      integer nf_put_varm_int64
+      external nf_put_varm_int64
+      integer nf_put_var_int64
+      external nf_put_var_int64
+      integer nf_get_var1_int64
+      external nf_get_var1_int64
+      integer nf_get_vara_int64
+      external nf_get_vara_int64
+      integer nf_get_vars_int64
+      external nf_get_vars_int64
+      integer nf_get_varm_int64
+      external nf_get_varm_int64
+      integer nf_get_var_int64
+      external nf_get_var_int64
+
+!     For helping F77 users with VLENs.
+      integer nf_get_vlen_element
+      external nf_get_vlen_element
+      integer nf_put_vlen_element
+      external nf_put_vlen_element
+
+!     For dealing with file level chunk cache.
+      integer nf_set_chunk_cache
+      external nf_set_chunk_cache
+      integer nf_get_chunk_cache
+      external nf_get_chunk_cache
+
+!     For dealing with per variable chunk cache.
+      integer nf_set_var_chunk_cache
+      external nf_set_var_chunk_cache
+      integer nf_get_var_chunk_cache
+      external nf_get_var_chunk_cache
+
+!     NetCDF-2.
+!ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
+! begin netcdf 2.4 backward compatibility:
+!
+
+!      
+! functions in the fortran interface
+!
+      integer nccre
+      integer ncopn
+      integer ncddef
+      integer ncdid
+      integer ncvdef
+      integer ncvid
+      integer nctlen
+      integer ncsfil
+
+      external nccre
+      external ncopn
+      external ncddef
+      external ncdid
+      external ncvdef
+      external ncvid
+      external nctlen
+      external ncsfil
+
+
+      integer ncrdwr
+      integer nccreat
+      integer ncexcl
+      integer ncindef
+      integer ncnsync
+      integer nchsync
+      integer ncndirty
+      integer nchdirty
+      integer nclink
+      integer ncnowrit
+      integer ncwrite
+      integer ncclob
+      integer ncnoclob
+      integer ncglobal
+      integer ncfill
+      integer ncnofill
+      integer maxncop
+      integer maxncdim
+      integer maxncatt
+      integer maxncvar
+      integer maxncnam
+      integer maxvdims
+      integer ncnoerr
+      integer ncebadid
+      integer ncenfile
+      integer nceexist
+      integer nceinval
+      integer nceperm
+      integer ncenotin
+      integer nceindef
+      integer ncecoord
+      integer ncemaxds
+      integer ncename
+      integer ncenoatt
+      integer ncemaxat
+      integer ncebadty
+      integer ncebadd
+      integer ncests
+      integer nceunlim
+      integer ncemaxvs
+      integer ncenotvr
+      integer nceglob
+      integer ncenotnc
+      integer ncfoobar
+      integer ncsyserr
+      integer ncfatal
+      integer ncverbos
+      integer ncentool
+
+
+!
+! netcdf data types:
+!
+      integer ncbyte
+      integer ncchar
+      integer ncshort
+      integer nclong
+      integer ncfloat
+      integer ncdouble
+
+      parameter(ncbyte = 1)
+      parameter(ncchar = 2)
+      parameter(ncshort = 3)
+      parameter(nclong = 4)
+      parameter(ncfloat = 5)
+      parameter(ncdouble = 6)
+
+!     
+!     masks for the struct nc flag field; passed in as 'mode' arg to
+!     nccreate and ncopen.
+!     
+
+!     read/write, 0 => readonly 
+      parameter(ncrdwr = 1)
+!     in create phase, cleared by ncendef 
+      parameter(nccreat = 2)
+!     on create destroy existing file 
+      parameter(ncexcl = 4)
+!     in define mode, cleared by ncendef 
+      parameter(ncindef = 8)
+!     synchronise numrecs on change (x'10')
+      parameter(ncnsync = 16)
+!     synchronise whole header on change (x'20')
+      parameter(nchsync = 32)
+!     numrecs has changed (x'40')
+      parameter(ncndirty = 64)  
+!     header info has changed (x'80')
+      parameter(nchdirty = 128)
+!     prefill vars on endef and increase of record, the default behavior
+      parameter(ncfill = 0)
+!     do not fill vars on endef and increase of record (x'100')
+      parameter(ncnofill = 256)
+!     isa link (x'8000')
+      parameter(nclink = 32768)
+
+!     
+!     'mode' arguments for nccreate and ncopen
+!     
+      parameter(ncnowrit = 0)
+      parameter(ncwrite = ncrdwr)
+      parameter(ncclob = nf_clobber)
+      parameter(ncnoclob = nf_noclobber)
+
+!     
+!     'size' argument to ncdimdef for an unlimited dimension
+!     
+      integer ncunlim
+      parameter(ncunlim = 0)
+
+!     
+!     attribute id to put/get a global attribute
+!     
+      parameter(ncglobal  = 0)
+
+!     
+!     advisory maximums:
+!     
+      parameter(maxncop = 64)
+      parameter(maxncdim = 1024)
+      parameter(maxncatt = 8192)
+      parameter(maxncvar = 8192)
+!     not enforced 
+      parameter(maxncnam = 256)
+      parameter(maxvdims = maxncdim)
+
+!     
+!     global netcdf error status variable
+!     initialized in error.c
+!     
+
+!     no error 
+      parameter(ncnoerr = nf_noerr)
+!     not a netcdf id 
+      parameter(ncebadid = nf_ebadid)
+!     too many netcdfs open 
+      parameter(ncenfile = -31)   ! nc_syserr
+!     netcdf file exists && ncnoclob
+      parameter(nceexist = nf_eexist)
+!     invalid argument 
+      parameter(nceinval = nf_einval)
+!     write to read only 
+      parameter(nceperm = nf_eperm)
+!     operation not allowed in data mode 
+      parameter(ncenotin = nf_enotindefine )   
+!     operation not allowed in define mode 
+      parameter(nceindef = nf_eindefine)   
+!     coordinates out of domain 
+      parameter(ncecoord = nf_einvalcoords)
+!     maxncdims exceeded 
+      parameter(ncemaxds = nf_emaxdims)
+!     string match to name in use 
+      parameter(ncename = nf_enameinuse)   
+!     attribute not found 
+      parameter(ncenoatt = nf_enotatt)
+!     maxncattrs exceeded 
+      parameter(ncemaxat = nf_emaxatts)
+!     not a netcdf data type 
+      parameter(ncebadty = nf_ebadtype)
+!     invalid dimension id 
+      parameter(ncebadd = nf_ebaddim)
+!     ncunlimited in the wrong index 
+      parameter(nceunlim = nf_eunlimpos)
+!     maxncvars exceeded 
+      parameter(ncemaxvs = nf_emaxvars)
+!     variable not found 
+      parameter(ncenotvr = nf_enotvar)
+!     action prohibited on ncglobal varid 
+      parameter(nceglob = nf_eglobal)
+!     not a netcdf file 
+      parameter(ncenotnc = nf_enotnc)
+      parameter(ncests = nf_ests)
+      parameter (ncentool = nf_emaxname) 
+      parameter(ncfoobar = 32)
+      parameter(ncsyserr = -31)
+
+!     
+!     global options variable. used to determine behavior of error handler.
+!     initialized in lerror.c
+!     
+      parameter(ncfatal = 1)
+      parameter(ncverbos = 2)
+
+!
+!     default fill values.  these must be the same as in the c interface.
+!
+      integer filbyte
+      integer filchar
+      integer filshort
+      integer fillong
+      real filfloat
+      doubleprecision fildoub
+
+      parameter (filbyte = -127)
+      parameter (filchar = 0)
+      parameter (filshort = -32767)
+      parameter (fillong = -2147483647)
+      parameter (filfloat = 9.9692099683868690e+36)
+      parameter (fildoub = 9.9692099683868690e+36)
diff --git a/fortran/netcdf2.inc b/fortran/netcdf2.inc
new file mode 100644
index 0000000..7a04ae1
--- /dev/null
+++ b/fortran/netcdf2.inc
@@ -0,0 +1,224 @@
+!ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
+! begin netcdf 2.4 backward compatibility:
+!
+
+!      
+! functions in the fortran interface
+!
+      integer nccre
+      integer ncopn
+      integer ncddef
+      integer ncdid
+      integer ncvdef
+      integer ncvid
+      integer nctlen
+      integer ncsfil
+
+      external nccre
+      external ncopn
+      external ncddef
+      external ncdid
+      external ncvdef
+      external ncvid
+      external nctlen
+      external ncsfil
+
+
+      integer ncrdwr
+      integer nccreat
+      integer ncexcl
+      integer ncindef
+      integer ncnsync
+      integer nchsync
+      integer ncndirty
+      integer nchdirty
+      integer nclink
+      integer ncnowrit
+      integer ncwrite
+      integer ncclob
+      integer ncnoclob
+      integer ncglobal
+      integer ncfill
+      integer ncnofill
+      integer maxncop
+      integer maxncdim
+      integer maxncatt
+      integer maxncvar
+      integer maxncnam
+      integer maxvdims
+      integer ncnoerr
+      integer ncebadid
+      integer ncenfile
+      integer nceexist
+      integer nceinval
+      integer nceperm
+      integer ncenotin
+      integer nceindef
+      integer ncecoord
+      integer ncemaxds
+      integer ncename
+      integer ncenoatt
+      integer ncemaxat
+      integer ncebadty
+      integer ncebadd
+      integer ncests
+      integer nceunlim
+      integer ncemaxvs
+      integer ncenotvr
+      integer nceglob
+      integer ncenotnc
+      integer ncfoobar
+      integer ncsyserr
+      integer ncfatal
+      integer ncverbos
+      integer ncentool
+
+
+!
+! netcdf data types:
+!
+      integer ncbyte
+      integer ncchar
+      integer ncshort
+      integer nclong
+      integer ncfloat
+      integer ncdouble
+
+      parameter(ncbyte = 1)
+      parameter(ncchar = 2)
+      parameter(ncshort = 3)
+      parameter(nclong = 4)
+      parameter(ncfloat = 5)
+      parameter(ncdouble = 6)
+
+!     
+!     masks for the struct nc flag field; passed in as 'mode' arg to
+!     nccreate and ncopen.
+!     
+
+!     read/write, 0 => readonly 
+      parameter(ncrdwr = 1)
+!     in create phase, cleared by ncendef 
+      parameter(nccreat = 2)
+!     on create destroy existing file 
+      parameter(ncexcl = 4)
+!     in define mode, cleared by ncendef 
+      parameter(ncindef = 8)
+!     synchronise numrecs on change (x'10')
+      parameter(ncnsync = 16)
+!     synchronise whole header on change (x'20')
+      parameter(nchsync = 32)
+!     numrecs has changed (x'40')
+      parameter(ncndirty = 64)  
+!     header info has changed (x'80')
+      parameter(nchdirty = 128)
+!     prefill vars on endef and increase of record, the default behavior
+      parameter(ncfill = 0)
+!     do not fill vars on endef and increase of record (x'100')
+      parameter(ncnofill = 256)
+!     isa link (x'8000')
+      parameter(nclink = 32768)
+
+!     
+!     'mode' arguments for nccreate and ncopen
+!     
+      parameter(ncnowrit = 0)
+      parameter(ncwrite = ncrdwr)
+      parameter(ncclob = nf_clobber)
+      parameter(ncnoclob = nf_noclobber)
+
+!     
+!     'size' argument to ncdimdef for an unlimited dimension
+!     
+      integer ncunlim
+      parameter(ncunlim = 0)
+
+!     
+!     attribute id to put/get a global attribute
+!     
+      parameter(ncglobal  = 0)
+
+!     
+!     advisory maximums:
+!     
+      parameter(maxncop = 64)
+      parameter(maxncdim = 1024)
+      parameter(maxncatt = 8192)
+      parameter(maxncvar = 8192)
+!     not enforced 
+      parameter(maxncnam = 256)
+      parameter(maxvdims = maxncdim)
+
+!     
+!     global netcdf error status variable
+!     initialized in error.c
+!     
+
+!     no error 
+      parameter(ncnoerr = nf_noerr)
+!     not a netcdf id 
+      parameter(ncebadid = nf_ebadid)
+!     too many netcdfs open 
+      parameter(ncenfile = -31)   ! nc_syserr
+!     netcdf file exists && ncnoclob
+      parameter(nceexist = nf_eexist)
+!     invalid argument 
+      parameter(nceinval = nf_einval)
+!     write to read only 
+      parameter(nceperm = nf_eperm)
+!     operation not allowed in data mode 
+      parameter(ncenotin = nf_enotindefine )   
+!     operation not allowed in define mode 
+      parameter(nceindef = nf_eindefine)   
+!     coordinates out of domain 
+      parameter(ncecoord = nf_einvalcoords)
+!     maxncdims exceeded 
+      parameter(ncemaxds = nf_emaxdims)
+!     string match to name in use 
+      parameter(ncename = nf_enameinuse)   
+!     attribute not found 
+      parameter(ncenoatt = nf_enotatt)
+!     maxncattrs exceeded 
+      parameter(ncemaxat = nf_emaxatts)
+!     not a netcdf data type 
+      parameter(ncebadty = nf_ebadtype)
+!     invalid dimension id 
+      parameter(ncebadd = nf_ebaddim)
+!     ncunlimited in the wrong index 
+      parameter(nceunlim = nf_eunlimpos)
+!     maxncvars exceeded 
+      parameter(ncemaxvs = nf_emaxvars)
+!     variable not found 
+      parameter(ncenotvr = nf_enotvar)
+!     action prohibited on ncglobal varid 
+      parameter(nceglob = nf_eglobal)
+!     not a netcdf file 
+      parameter(ncenotnc = nf_enotnc)
+      parameter(ncests = nf_ests)
+      parameter (ncentool = nf_emaxname) 
+      parameter(ncfoobar = 32)
+      parameter(ncsyserr = -31)
+
+!     
+!     global options variable. used to determine behavior of error handler.
+!     initialized in lerror.c
+!     
+      parameter(ncfatal = 1)
+      parameter(ncverbos = 2)
+
+!
+!     default fill values.  these must be the same as in the c interface.
+!
+      integer filbyte
+      integer filchar
+      integer filshort
+      integer fillong
+      real filfloat
+      doubleprecision fildoub
+
+      parameter (filbyte = -127)
+      parameter (filchar = 0)
+      parameter (filshort = -32767)
+      parameter (fillong = -2147483647)
+      parameter (filfloat = 9.9692099683868690e+36)
+      parameter (fildoub = 9.9692099683868690e+36)
diff --git a/fortran/netcdf3.inc b/fortran/netcdf3.inc
new file mode 100755
index 0000000..0a4b9c2
--- /dev/null
+++ b/fortran/netcdf3.inc
@@ -0,0 +1,1118 @@
+!
+! netcdf version 3 fortran interface:
+!
+
+!
+! external netcdf data types:
+!
+      integer nf_byte
+      integer nf_int1
+      integer nf_char
+      integer nf_short
+      integer nf_int2
+      integer nf_int
+      integer nf_float
+      integer nf_real
+      integer nf_double
+
+      parameter (nf_byte = 1)
+      parameter (nf_int1 = nf_byte)
+      parameter (nf_char = 2)
+      parameter (nf_short = 3)
+      parameter (nf_int2 = nf_short)
+      parameter (nf_int = 4)
+      parameter (nf_float = 5)
+      parameter (nf_real = nf_float)
+      parameter (nf_double = 6)
+
+!
+! default fill values:
+!
+      integer           nf_fill_byte
+      integer           nf_fill_int1
+      integer           nf_fill_char
+      integer           nf_fill_short
+      integer           nf_fill_int2
+      integer           nf_fill_int
+      real              nf_fill_float
+      real              nf_fill_real
+      doubleprecision   nf_fill_double
+
+      parameter (nf_fill_byte = -127)
+      parameter (nf_fill_int1 = nf_fill_byte)
+      parameter (nf_fill_char = 0)
+      parameter (nf_fill_short = -32767)
+      parameter (nf_fill_int2 = nf_fill_short)
+      parameter (nf_fill_int = -2147483647)
+      parameter (nf_fill_float = 9.9692099683868690e+36)
+      parameter (nf_fill_real = nf_fill_float)
+      parameter (nf_fill_double = 9.9692099683868690d+36)
+
+!
+! mode flags for opening and creating a netcdf dataset:
+!
+      integer nf_nowrite
+      integer nf_write
+      integer nf_clobber
+      integer nf_noclobber
+      integer nf_fill
+      integer nf_nofill
+      integer nf_lock
+      integer nf_share
+      integer nf_64bit_offset
+      integer nf_sizehint_default
+      integer nf_align_chunk
+      integer nf_format_classic
+      integer nf_format_64bit
+      integer nf_diskless
+      integer nf_mmap
+
+      parameter (nf_nowrite = 0)
+      parameter (nf_write = 1)
+      parameter (nf_clobber = 0)
+      parameter (nf_noclobber = 4)
+      parameter (nf_fill = 0)
+      parameter (nf_nofill = 256)
+      parameter (nf_lock = 1024)
+      parameter (nf_share = 2048)
+      parameter (nf_64bit_offset = 512)
+      parameter (nf_sizehint_default = 0)
+      parameter (nf_align_chunk = -1)
+      parameter (nf_format_classic = 1)
+      parameter (nf_format_64bit = 2)
+      parameter (nf_diskless = 8)
+      parameter (nf_mmap = 16)
+
+!
+! size argument for defining an unlimited dimension:
+!
+      integer nf_unlimited
+      parameter (nf_unlimited = 0)
+
+!
+! global attribute id:
+!
+      integer nf_global
+      parameter (nf_global = 0)
+
+!
+! implementation limits:
+!
+      integer nf_max_dims
+      integer nf_max_attrs
+      integer nf_max_vars
+      integer nf_max_name
+      integer nf_max_var_dims
+
+      parameter (nf_max_dims = 1024)
+      parameter (nf_max_attrs = 8192)
+      parameter (nf_max_vars = 8192)
+      parameter (nf_max_name = 256)
+      parameter (nf_max_var_dims = nf_max_dims)
+
+!
+! error codes:
+!
+      integer nf_noerr
+      integer nf_ebadid
+      integer nf_eexist
+      integer nf_einval
+      integer nf_eperm
+      integer nf_enotindefine
+      integer nf_eindefine
+      integer nf_einvalcoords
+      integer nf_emaxdims
+      integer nf_enameinuse
+      integer nf_enotatt
+      integer nf_emaxatts
+      integer nf_ebadtype
+      integer nf_ebaddim
+      integer nf_eunlimpos
+      integer nf_emaxvars
+      integer nf_enotvar
+      integer nf_eglobal
+      integer nf_enotnc
+      integer nf_ests
+      integer nf_emaxname
+      integer nf_eunlimit
+      integer nf_enorecvars
+      integer nf_echar
+      integer nf_eedge
+      integer nf_estride
+      integer nf_ebadname
+      integer nf_erange
+      integer nf_enomem
+      integer nf_evarsize
+      integer nf_edimsize
+      integer nf_etrunc
+
+      parameter (nf_noerr = 0)
+      parameter (nf_ebadid = -33)
+      parameter (nf_eexist = -35)
+      parameter (nf_einval = -36)
+      parameter (nf_eperm = -37)
+      parameter (nf_enotindefine = -38)
+      parameter (nf_eindefine = -39)
+      parameter (nf_einvalcoords = -40)
+      parameter (nf_emaxdims = -41)
+      parameter (nf_enameinuse = -42)
+      parameter (nf_enotatt = -43)
+      parameter (nf_emaxatts = -44)
+      parameter (nf_ebadtype = -45)
+      parameter (nf_ebaddim = -46)
+      parameter (nf_eunlimpos = -47)
+      parameter (nf_emaxvars = -48)
+      parameter (nf_enotvar = -49)
+      parameter (nf_eglobal = -50)
+      parameter (nf_enotnc = -51)
+      parameter (nf_ests = -52)
+      parameter (nf_emaxname = -53)
+      parameter (nf_eunlimit = -54)
+      parameter (nf_enorecvars = -55)
+      parameter (nf_echar = -56)
+      parameter (nf_eedge = -57)
+      parameter (nf_estride = -58)
+      parameter (nf_ebadname = -59)
+      parameter (nf_erange = -60)
+      parameter (nf_enomem = -61)
+      parameter (nf_evarsize = -62)
+      parameter (nf_edimsize = -63)
+      parameter (nf_etrunc = -64)
+!
+! error handling modes:
+!
+      integer  nf_fatal
+      integer nf_verbose
+
+      parameter (nf_fatal = 1)
+      parameter (nf_verbose = 2)
+
+!
+! miscellaneous routines:
+!
+      character*80   nf_inq_libvers
+      external       nf_inq_libvers
+
+      character*80   nf_strerror
+!                         (integer             ncerr)
+      external       nf_strerror
+
+      logical        nf_issyserr
+!                         (integer             ncerr)
+      external       nf_issyserr
+
+!
+! control routines:
+!
+      integer         nf_inq_base_pe
+!                         (integer             ncid,
+!                          integer             pe)
+      external        nf_inq_base_pe
+
+      integer         nf_set_base_pe
+!                         (integer             ncid,
+!                          integer             pe)
+      external        nf_set_base_pe
+
+      integer         nf_create
+!                         (character*(*)       path,
+!                          integer             cmode,
+!                          integer             ncid)
+      external        nf_create
+
+      integer         nf__create
+!                         (character*(*)       path,
+!                          integer             cmode,
+!                          integer             initialsz,
+!                          integer             chunksizehint,
+!                          integer             ncid)
+      external        nf__create
+
+      integer         nf__create_mp
+!                         (character*(*)       path,
+!                          integer             cmode,
+!                          integer             initialsz,
+!                          integer             basepe,
+!                          integer             chunksizehint,
+!                          integer             ncid)
+      external        nf__create_mp
+
+      integer         nf_open
+!                         (character*(*)       path,
+!                          integer             mode,
+!                          integer             ncid)
+      external        nf_open
+
+      integer         nf__open
+!                         (character*(*)       path,
+!                          integer             mode,
+!                          integer             chunksizehint,
+!                          integer             ncid)
+      external        nf__open
+
+      integer         nf__open_mp
+!                         (character*(*)       path,
+!                          integer             mode,
+!                          integer             basepe,
+!                          integer             chunksizehint,
+!                          integer             ncid)
+      external        nf__open_mp
+
+      integer         nf_set_fill
+!                         (integer             ncid,
+!                          integer             fillmode,
+!                          integer             old_mode)
+      external        nf_set_fill
+
+      integer         nf_set_default_format
+!                          (integer             format,
+!                          integer             old_format)
+      external        nf_set_default_format
+
+      integer         nf_redef
+!                         (integer             ncid)
+      external        nf_redef
+
+      integer         nf_enddef
+!                         (integer             ncid)
+      external        nf_enddef
+
+      integer         nf__enddef
+!                         (integer             ncid,
+!                          integer             h_minfree,
+!                          integer             v_align,
+!                          integer             v_minfree,
+!                          integer             r_align)
+      external        nf__enddef
+
+      integer         nf_sync
+!                         (integer             ncid)
+      external        nf_sync
+
+      integer         nf_abort
+!                         (integer             ncid)
+      external        nf_abort
+
+      integer         nf_close
+!                         (integer             ncid)
+      external        nf_close
+
+      integer         nf_delete
+!                         (character*(*)       ncid)
+      external        nf_delete
+
+!
+! general inquiry routines:
+!
+
+      integer         nf_inq
+!                         (integer             ncid,
+!                          integer             ndims,
+!                          integer             nvars,
+!                          integer             ngatts,
+!                          integer             unlimdimid)
+      external        nf_inq
+
+! new inquire path
+
+      integer nf_inq_path
+      external nf_inq_path
+
+      integer         nf_inq_ndims
+!                         (integer             ncid,
+!                          integer             ndims)
+      external        nf_inq_ndims
+
+      integer         nf_inq_nvars
+!                         (integer             ncid,
+!                          integer             nvars)
+      external        nf_inq_nvars
+
+      integer         nf_inq_natts
+!                         (integer             ncid,
+!                          integer             ngatts)
+      external        nf_inq_natts
+
+      integer         nf_inq_unlimdim
+!                         (integer             ncid,
+!                          integer             unlimdimid)
+      external        nf_inq_unlimdim
+
+      integer         nf_inq_format
+!                         (integer             ncid,
+!                          integer             format)
+      external        nf_inq_format
+
+!
+! dimension routines:
+!
+
+      integer         nf_def_dim
+!                         (integer             ncid,
+!                          character(*)        name,
+!                          integer             len,
+!                          integer             dimid)
+      external        nf_def_dim
+
+      integer         nf_inq_dimid
+!                         (integer             ncid,
+!                          character(*)        name,
+!                          integer             dimid)
+      external        nf_inq_dimid
+
+      integer         nf_inq_dim
+!                         (integer             ncid,
+!                          integer             dimid,
+!                          character(*)        name,
+!                          integer             len)
+      external        nf_inq_dim
+
+      integer         nf_inq_dimname
+!                         (integer             ncid,
+!                          integer             dimid,
+!                          character(*)        name)
+      external        nf_inq_dimname
+
+      integer         nf_inq_dimlen
+!                         (integer             ncid,
+!                          integer             dimid,
+!                          integer             len)
+      external        nf_inq_dimlen
+
+      integer         nf_rename_dim
+!                         (integer             ncid,
+!                          integer             dimid,
+!                          character(*)        name)
+      external        nf_rename_dim
+
+!
+! general attribute routines:
+!
+
+      integer         nf_inq_att
+!                         (integer             ncid,
+!                          integer             varid,
+!                          character(*)        name,
+!                          integer             xtype,
+!                          integer             len)
+      external        nf_inq_att
+
+      integer         nf_inq_attid
+!                         (integer             ncid,
+!                          integer             varid,
+!                          character(*)        name,
+!                          integer             attnum)
+      external        nf_inq_attid
+
+      integer         nf_inq_atttype
+!                         (integer             ncid,
+!                          integer             varid,
+!                          character(*)        name,
+!                          integer             xtype)
+      external        nf_inq_atttype
+
+      integer         nf_inq_attlen
+!                         (integer             ncid,
+!                          integer             varid,
+!                          character(*)        name,
+!                          integer             len)
+      external        nf_inq_attlen
+
+      integer         nf_inq_attname
+!                         (integer             ncid,
+!                          integer             varid,
+!                          integer             attnum,
+!                          character(*)        name)
+      external        nf_inq_attname
+
+      integer         nf_copy_att
+!                         (integer             ncid_in,
+!                          integer             varid_in,
+!                          character(*)        name,
+!                          integer             ncid_out,
+!                          integer             varid_out)
+      external        nf_copy_att
+
+      integer         nf_rename_att
+!                         (integer             ncid,
+!                          integer             varid,
+!                          character(*)        curname,
+!                          character(*)        newname)
+      external        nf_rename_att
+
+      integer         nf_del_att
+!                         (integer             ncid,
+!                          integer             varid,
+!                          character(*)        name)
+      external        nf_del_att
+
+!
+! attribute put/get routines:
+!
+
+      integer         nf_put_att_text
+!                         (integer             ncid,
+!                          integer             varid,
+!                          character(*)        name,
+!                          integer             len,
+!                          character(*)        text)
+      external        nf_put_att_text
+
+      integer         nf_get_att_text
+!                         (integer             ncid,
+!                          integer             varid,
+!                          character(*)        name,
+!                          character(*)        text)
+      external        nf_get_att_text
+
+      integer         nf_put_att_int1
+!                         (integer             ncid,
+!                          integer             varid,
+!                          character(*)        name,
+!                          integer             xtype,
+!                          integer             len,
+!                          nf_int1_t           i1vals(1))
+      external        nf_put_att_int1
+
+      integer         nf_get_att_int1
+!                         (integer             ncid,
+!                          integer             varid,
+!                          character(*)        name,
+!                          nf_int1_t           i1vals(1))
+      external        nf_get_att_int1
+
+      integer         nf_put_att_int2
+!                         (integer             ncid,
+!                          integer             varid,
+!                          character(*)        name,
+!                          integer             xtype,
+!                          integer             len,
+!                          nf_int2_t           i2vals(1))
+      external        nf_put_att_int2
+
+      integer         nf_get_att_int2
+!                         (integer             ncid,
+!                          integer             varid,
+!                          character(*)        name,
+!                          nf_int2_t           i2vals(1))
+      external        nf_get_att_int2
+
+      integer         nf_put_att_int
+!                         (integer             ncid,
+!                          integer             varid,
+!                          character(*)        name,
+!                          integer             xtype,
+!                          integer             len,
+!                          integer             ivals(1))
+      external        nf_put_att_int
+
+      integer         nf_get_att_int
+!                         (integer             ncid,
+!                          integer             varid,
+!                          character(*)        name,
+!                          integer             ivals(1))
+      external        nf_get_att_int
+
+      integer         nf_put_att_real
+!                         (integer             ncid,
+!                          integer             varid,
+!                          character(*)        name,
+!                          integer             xtype,
+!                          integer             len,
+!                          real                rvals(1))
+      external        nf_put_att_real
+
+      integer         nf_get_att_real
+!                         (integer             ncid,
+!                          integer             varid,
+!                          character(*)        name,
+!                          real                rvals(1))
+      external        nf_get_att_real
+
+      integer         nf_put_att_double
+!                         (integer             ncid,
+!                          integer             varid,
+!                          character(*)        name,
+!                          integer             xtype,
+!                          integer             len,
+!                          double              dvals(1))
+      external        nf_put_att_double
+
+      integer         nf_get_att_double
+!                         (integer             ncid,
+!                          integer             varid,
+!                          character(*)        name,
+!                          double              dvals(1))
+      external        nf_get_att_double
+
+!
+! general variable routines:
+!
+
+      integer         nf_def_var
+!                         (integer             ncid,
+!                          character(*)        name,
+!                          integer             datatype,
+!                          integer             ndims,
+!                          integer             dimids(1),
+!                          integer             varid)
+      external        nf_def_var
+
+      integer         nf_inq_var
+!                         (integer             ncid,
+!                          integer             varid,
+!                          character(*)        name,
+!                          integer             datatype,
+!                          integer             ndims,
+!                          integer             dimids(1),
+!                          integer             natts)
+      external        nf_inq_var
+
+      integer         nf_inq_varid
+!                         (integer             ncid,
+!                          character(*)        name,
+!                          integer             varid)
+      external        nf_inq_varid
+
+      integer         nf_inq_varname
+!                         (integer             ncid,
+!                          integer             varid,
+!                          character(*)        name)
+      external        nf_inq_varname
+
+      integer         nf_inq_vartype
+!                         (integer             ncid,
+!                          integer             varid,
+!                          integer             xtype)
+      external        nf_inq_vartype
+
+      integer         nf_inq_varndims
+!                         (integer             ncid,
+!                          integer             varid,
+!                          integer             ndims)
+      external        nf_inq_varndims
+
+      integer         nf_inq_vardimid
+!                         (integer             ncid,
+!                          integer             varid,
+!                          integer             dimids(1))
+      external        nf_inq_vardimid
+
+      integer         nf_inq_varnatts
+!                         (integer             ncid,
+!                          integer             varid,
+!                          integer             natts)
+      external        nf_inq_varnatts
+
+      integer         nf_rename_var
+!                         (integer             ncid,
+!                          integer             varid,
+!                          character(*)        name)
+      external        nf_rename_var
+
+      integer         nf_copy_var
+!                         (integer             ncid_in,
+!                          integer             varid,
+!                          integer             ncid_out)
+      external        nf_copy_var
+
+!
+! entire variable put/get routines:
+!
+
+      integer         nf_put_var_text
+!                         (integer             ncid,
+!                          integer             varid,
+!                          character(*)        text)
+      external        nf_put_var_text
+
+      integer         nf_get_var_text
+!                         (integer             ncid,
+!                          integer             varid,
+!                          character(*)        text)
+      external        nf_get_var_text
+
+      integer         nf_put_var_int1
+!                         (integer             ncid,
+!                          integer             varid,
+!                          nf_int1_t           i1vals(1))
+      external        nf_put_var_int1
+
+      integer         nf_get_var_int1
+!                         (integer             ncid,
+!                          integer             varid,
+!                          nf_int1_t           i1vals(1))
+      external        nf_get_var_int1
+
+      integer         nf_put_var_int2
+!                         (integer             ncid,
+!                          integer             varid,
+!                          nf_int2_t           i2vals(1))
+      external        nf_put_var_int2
+
+      integer         nf_get_var_int2
+!                         (integer             ncid,
+!                          integer             varid,
+!                          nf_int2_t           i2vals(1))
+      external        nf_get_var_int2
+
+      integer         nf_put_var_int
+!                         (integer             ncid,
+!                          integer             varid,
+!                          integer             ivals(1))
+      external        nf_put_var_int
+
+      integer         nf_get_var_int
+!                         (integer             ncid,
+!                          integer             varid,
+!                          integer             ivals(1))
+      external        nf_get_var_int
+
+      integer         nf_put_var_real
+!                         (integer             ncid,
+!                          integer             varid,
+!                          real                rvals(1))
+      external        nf_put_var_real
+
+      integer         nf_get_var_real
+!                         (integer             ncid,
+!                          integer             varid,
+!                          real                rvals(1))
+      external        nf_get_var_real
+
+      integer         nf_put_var_double
+!                         (integer             ncid,
+!                          integer             varid,
+!                          doubleprecision     dvals(1))
+      external        nf_put_var_double
+
+      integer         nf_get_var_double
+!                         (integer             ncid,
+!                          integer             varid,
+!                          doubleprecision     dvals(1))
+      external        nf_get_var_double
+
+!
+! single variable put/get routines:
+!
+
+      integer         nf_put_var1_text
+!                         (integer             ncid,
+!                          integer             varid,
+!                          integer             index(1),
+!                          character*1         text)
+      external        nf_put_var1_text
+
+      integer         nf_get_var1_text
+!                         (integer             ncid,
+!                          integer             varid,
+!                          integer             index(1),
+!                          character*1         text)
+      external        nf_get_var1_text
+
+      integer         nf_put_var1_int1
+!                         (integer             ncid,
+!                          integer             varid,
+!                          integer             index(1),
+!                          nf_int1_t           i1val)
+      external        nf_put_var1_int1
+
+      integer         nf_get_var1_int1
+!                         (integer             ncid,
+!                          integer             varid,
+!                          integer             index(1),
+!                          nf_int1_t           i1val)
+      external        nf_get_var1_int1
+
+      integer         nf_put_var1_int2
+!                         (integer             ncid,
+!                          integer             varid,
+!                          integer             index(1),
+!                          nf_int2_t           i2val)
+      external        nf_put_var1_int2
+
+      integer         nf_get_var1_int2
+!                         (integer             ncid,
+!                          integer             varid,
+!                          integer             index(1),
+!                          nf_int2_t           i2val)
+      external        nf_get_var1_int2
+
+      integer         nf_put_var1_int
+!                         (integer             ncid,
+!                          integer             varid,
+!                          integer             index(1),
+!                          integer             ival)
+      external        nf_put_var1_int
+
+      integer         nf_get_var1_int
+!                         (integer             ncid,
+!                          integer             varid,
+!                          integer             index(1),
+!                          integer             ival)
+      external        nf_get_var1_int
+
+      integer         nf_put_var1_real
+!                         (integer             ncid,
+!                          integer             varid,
+!                          integer             index(1),
+!                          real                rval)
+      external        nf_put_var1_real
+
+      integer         nf_get_var1_real
+!                         (integer             ncid,
+!                          integer             varid,
+!                          integer             index(1),
+!                          real                rval)
+      external        nf_get_var1_real
+
+      integer         nf_put_var1_double
+!                         (integer             ncid,
+!                          integer             varid,
+!                          integer             index(1),
+!                          doubleprecision     dval)
+      external        nf_put_var1_double
+
+      integer         nf_get_var1_double
+!                         (integer             ncid,
+!                          integer             varid,
+!                          integer             index(1),
+!                          doubleprecision     dval)
+      external        nf_get_var1_double
+
+!
+! variable array put/get routines:
+!
+
+      integer         nf_put_vara_text
+!                         (integer             ncid,
+!                          integer             varid,
+!                          integer             start(1),
+!                          integer             count(1),
+!                          character(*)        text)
+      external        nf_put_vara_text
+
+      integer         nf_get_vara_text
+!                         (integer             ncid,
+!                          integer             varid,
+!                          integer             start(1),
+!                          integer             count(1),
+!                          character(*)        text)
+      external        nf_get_vara_text
+
+      integer         nf_put_vara_int1
+!                         (integer             ncid,
+!                          integer             varid,
+!                          integer             start(1),
+!                          integer             count(1),
+!                          nf_int1_t           i1vals(1))
+      external        nf_put_vara_int1
+
+      integer         nf_get_vara_int1
+!                         (integer             ncid,
+!                          integer             varid,
+!                          integer             start(1),
+!                          integer             count(1),
+!                          nf_int1_t           i1vals(1))
+      external        nf_get_vara_int1
+
+      integer         nf_put_vara_int2
+!                         (integer             ncid,
+!                          integer             varid,
+!                          integer             start(1),
+!                          integer             count(1),
+!                          nf_int2_t           i2vals(1))
+      external        nf_put_vara_int2
+
+      integer         nf_get_vara_int2
+!                         (integer             ncid,
+!                          integer             varid,
+!                          integer             start(1),
+!                          integer             count(1),
+!                          nf_int2_t           i2vals(1))
+      external        nf_get_vara_int2
+
+      integer         nf_put_vara_int
+!                         (integer             ncid,
+!                          integer             varid,
+!                          integer             start(1),
+!                          integer             count(1),
+!                          integer             ivals(1))
+      external        nf_put_vara_int
+
+      integer         nf_get_vara_int
+!                         (integer             ncid,
+!                          integer             varid,
+!                          integer             start(1),
+!                          integer             count(1),
+!                          integer             ivals(1))
+      external        nf_get_vara_int
+
+      integer         nf_put_vara_real
+!                         (integer             ncid,
+!                          integer             varid,
+!                          integer             start(1),
+!                          integer             count(1),
+!                          real                rvals(1))
+      external        nf_put_vara_real
+
+      integer         nf_get_vara_real
+!                         (integer             ncid,
+!                          integer             varid,
+!                          integer             start(1),
+!                          integer             count(1),
+!                          real                rvals(1))
+      external        nf_get_vara_real
+
+      integer         nf_put_vara_double
+!                         (integer             ncid,
+!                          integer             varid,
+!                          integer             start(1),
+!                          integer             count(1),
+!                          doubleprecision     dvals(1))
+      external        nf_put_vara_double
+
+      integer         nf_get_vara_double
+!                         (integer             ncid,
+!                          integer             varid,
+!                          integer             start(1),
+!                          integer             count(1),
+!                          doubleprecision     dvals(1))
+      external        nf_get_vara_double
+
+!
+! strided variable put/get routines:
+!
+
+      integer         nf_put_vars_text
+!                         (integer             ncid,
+!                          integer             varid,
+!                          integer             start(1),
+!                          integer             count(1),
+!                          integer             stride(1),
+!                          character(*)        text)
+      external        nf_put_vars_text
+
+      integer         nf_get_vars_text
+!                         (integer             ncid,
+!                          integer             varid,
+!                          integer             start(1),
+!                          integer             count(1),
+!                          integer             stride(1),
+!                          character(*)        text)
+      external        nf_get_vars_text
+
+      integer         nf_put_vars_int1
+!                         (integer             ncid,
+!                          integer             varid,
+!                          integer             start(1),
+!                          integer             count(1),
+!                          integer             stride(1),
+!                          nf_int1_t           i1vals(1))
+      external        nf_put_vars_int1
+
+      integer         nf_get_vars_int1
+!                         (integer             ncid,
+!                          integer             varid,
+!                          integer             start(1),
+!                          integer             count(1),
+!                          integer             stride(1),
+!                          nf_int1_t           i1vals(1))
+      external        nf_get_vars_int1
+
+      integer         nf_put_vars_int2
+!                         (integer             ncid,
+!                          integer             varid,
+!                          integer             start(1),
+!                          integer             count(1),
+!                          integer             stride(1),
+!                          nf_int2_t           i2vals(1))
+      external        nf_put_vars_int2
+
+      integer         nf_get_vars_int2
+!                         (integer             ncid,
+!                          integer             varid,
+!                          integer             start(1),
+!                          integer             count(1),
+!                          integer             stride(1),
+!                          nf_int2_t           i2vals(1))
+      external        nf_get_vars_int2
+
+      integer         nf_put_vars_int
+!                         (integer             ncid,
+!                          integer             varid,
+!                          integer             start(1),
+!                          integer             count(1),
+!                          integer             stride(1),
+!                          integer             ivals(1))
+      external        nf_put_vars_int
+
+      integer         nf_get_vars_int
+!                         (integer             ncid,
+!                          integer             varid,
+!                          integer             start(1),
+!                          integer             count(1),
+!                          integer             stride(1),
+!                          integer             ivals(1))
+      external        nf_get_vars_int
+
+      integer         nf_put_vars_real
+!                         (integer             ncid,
+!                          integer             varid,
+!                          integer             start(1),
+!                          integer             count(1),
+!                          integer             stride(1),
+!                          real                rvals(1))
+      external        nf_put_vars_real
+
+      integer         nf_get_vars_real
+!                         (integer             ncid,
+!                          integer             varid,
+!                          integer             start(1),
+!                          integer             count(1),
+!                          integer             stride(1),
+!                          real                rvals(1))
+      external        nf_get_vars_real
+
+      integer         nf_put_vars_double
+!                         (integer             ncid,
+!                          integer             varid,
+!                          integer             start(1),
+!                          integer             count(1),
+!                          integer             stride(1),
+!                          doubleprecision     dvals(1))
+      external        nf_put_vars_double
+
+      integer         nf_get_vars_double
+!                         (integer             ncid,
+!                          integer             varid,
+!                          integer             start(1),
+!                          integer             count(1),
+!                          integer             stride(1),
+!                          doubleprecision     dvals(1))
+      external        nf_get_vars_double
+
+!
+! mapped variable put/get routines:
+!
+
+      integer         nf_put_varm_text
+!                         (integer             ncid,
+!                          integer             varid,
+!                          integer             start(1),
+!                          integer             count(1),
+!                          integer             stride(1),
+!                          integer             imap(1),
+!                          character(*)        text)
+      external        nf_put_varm_text
+
+      integer         nf_get_varm_text
+!                         (integer             ncid,
+!                          integer             varid,
+!                          integer             start(1),
+!                          integer             count(1),
+!                          integer             stride(1),
+!                          integer             imap(1),
+!                          character(*)        text)
+      external        nf_get_varm_text
+
+      integer         nf_put_varm_int1
+!                         (integer             ncid,
+!                          integer             varid,
+!                          integer             start(1),
+!                          integer             count(1),
+!                          integer             stride(1),
+!                          integer             imap(1),
+!                          nf_int1_t           i1vals(1))
+      external        nf_put_varm_int1
+
+      integer         nf_get_varm_int1
+!                         (integer             ncid,
+!                          integer             varid,
+!                          integer             start(1),
+!                          integer             count(1),
+!                          integer             stride(1),
+!                          integer             imap(1),
+!                          nf_int1_t           i1vals(1))
+      external        nf_get_varm_int1
+
+      integer         nf_put_varm_int2
+!                         (integer             ncid,
+!                          integer             varid,
+!                          integer             start(1),
+!                          integer             count(1),
+!                          integer             stride(1),
+!                          integer             imap(1),
+!                          nf_int2_t           i2vals(1))
+      external        nf_put_varm_int2
+
+      integer         nf_get_varm_int2
+!                         (integer             ncid,
+!                          integer             varid,
+!                          integer             start(1),
+!                          integer             count(1),
+!                          integer             stride(1),
+!                          integer             imap(1),
+!                          nf_int2_t           i2vals(1))
+      external        nf_get_varm_int2
+
+      integer         nf_put_varm_int
+!                         (integer             ncid,
+!                          integer             varid,
+!                          integer             start(1),
+!                          integer             count(1),
+!                          integer             stride(1),
+!                          integer             imap(1),
+!                          integer             ivals(1))
+      external        nf_put_varm_int
+
+      integer         nf_get_varm_int
+!                         (integer             ncid,
+!                          integer             varid,
+!                          integer             start(1),
+!                          integer             count(1),
+!                          integer             stride(1),
+!                          integer             imap(1),
+!                          integer             ivals(1))
+      external        nf_get_varm_int
+
+      integer         nf_put_varm_real
+!                         (integer             ncid,
+!                          integer             varid,
+!                          integer             start(1),
+!                          integer             count(1),
+!                          integer             stride(1),
+!                          integer             imap(1),
+!                          real                rvals(1))
+      external        nf_put_varm_real
+
+      integer         nf_get_varm_real
+!                         (integer             ncid,
+!                          integer             varid,
+!                          integer             start(1),
+!                          integer             count(1),
+!                          integer             stride(1),
+!                          integer             imap(1),
+!                          real                rvals(1))
+      external        nf_get_varm_real
+
+      integer         nf_put_varm_double
+!                         (integer             ncid,
+!                          integer             varid,
+!                          integer             start(1),
+!                          integer             count(1),
+!                          integer             stride(1),
+!                          integer             imap(1),
+!                          doubleprecision     dvals(1))
+      external        nf_put_varm_double
+
+      integer         nf_get_varm_double
+!                         (integer             ncid,
+!                          integer             varid,
+!                          integer             start(1),
+!                          integer             count(1),
+!                          integer             stride(1),
+!                          integer             imap(1),
+!                          doubleprecision     dvals(1))
+      external        nf_get_varm_double
+
diff --git a/fortran/netcdf3_file.f90 b/fortran/netcdf3_file.f90
new file mode 100644
index 0000000..5eb7601
--- /dev/null
+++ b/fortran/netcdf3_file.f90
@@ -0,0 +1,43 @@
+! This is part of the netCDF F90 API, or. Copyright 2006 UCAR. See COPYRIGHT file
+! for details.
+
+! This file contains the netcdf-3 file open and create functions.
+
+! $Id: netcdf4_constants.f90,v 1.14 2010/05/25 13:53:00 ed Exp $
+! -------
+function nf90_open(path, mode, ncid, chunksize)
+  character (len = *), intent(in   ) :: path
+  integer,             intent(in   ) :: mode
+  integer,             intent(  out) :: ncid
+  integer, optional,   intent(inout) :: chunksize
+  integer                            :: nf90_open
+
+  if(present(chunksize)) then
+     nf90_open = nf__open(path, mode, chunksize, ncid)
+  else
+     nf90_open = nf_open(path, mode, ncid)
+  end if
+end function nf90_open
+! -------
+function nf90_create(path, cmode, ncid, initialsize, chunksize)
+  character (len = *), intent(in   ) :: path
+  integer,             intent(in   ) :: cmode
+  integer,             intent(  out) :: ncid
+  integer, optional,   intent(in   ) :: initialsize
+  integer, optional,   intent(inout) :: chunksize
+  integer                            :: nf90_create
+
+  integer :: fileSize, chunk
+
+  if(.not. (present(initialsize) .or. present(chunksize)) ) then
+     nf90_create = nf_create(path, cmode, ncid)
+  else
+     ! Default values per man page
+     filesize = 0; chunk = nf90_sizehint_default
+     if(present(initialsize)) filesize = initialsize
+     if(present(chunksize  )) chunk    = chunksize
+     nf90_create = nf__create(path, cmode, filesize, chunk, ncid)
+     ! Pass back the value actually used
+     if(present(chunksize  )) chunksize = chunk
+  end if
+end function nf90_create
diff --git a/fortran/netcdf4.f90 b/fortran/netcdf4.f90
new file mode 100644
index 0000000..138a6c6
--- /dev/null
+++ b/fortran/netcdf4.f90
@@ -0,0 +1,67 @@
+! Description:
+!  
+! Input Parameters:
+!   None.
+!
+! Output Parameters:
+!   Many public constants are defined in "netcdf_constants.f90". The names follow 
+!     the Fortran 77 names, with nf90_ used as a prefix instead of nf_77. 
+!   Functions are made accessable through PUBLIC:: statements in "netcdf_visibility.f90". 
+!     Only the functions listed in this file are available in the interface. 
+!
+! References and Credits:
+!   Written by
+!    Robert Pincus
+!    Cooperative Institue for Meteorological Satellite Studies
+!    University of Wisconsin - Madison
+!    1225 W. Dayton St. 
+!    Madison, Wisconsin 53706
+!    Robert.Pincus at ssec.wisc.edu
+!
+! Design Notes:
+!   Module elements are private by default. 
+!   Many functions have optional arguments. In order to keep the interface easy to use, 
+!     we've reordered the arguments (relative to the F77 interface) in some functions. 
+!   The external datatype of attributes is the same as the internal type. 
+!   By default, data is read from or put into the lowest part of the netCDF array with stride 1. 
+!   We've made heavy use of overloading, especially in the variable put and get routines. 
+!     A single function exists for putting all variables; a single function exists for getting 
+!     variables. 
+!   Text variables must be treated somewhat differently. When a character variable is defined, the
+!     fastest-varying index (first index in Fortran) must be the maxiumu length of the character 
+!     string. N dimensional arrays of strings passed to the put or get functions are written/read
+!     from dimensions 2:N+1. The number of values along the first dimension is determined by the
+!     length of the argument character string. 
+!
+! NOTE: The netcdf4.f90 version of this file was created by Ed
+! Hartnett in 2006 to support the netCDF-4 API.
+!
+ module netcdf
+  use typeSizes, only: OneByteInt, TwoByteInt, FourByteInt, EightByteInt, &
+                       FourByteReal, EightByteReal
+  implicit none
+  private
+  
+  ! as of version 4.4, the following are merged:
+  ! - netcdf_constants.f90 and netcdf4_constants.f90
+  !
+  ! Update the dependencies in the Makefile.am when modifying the list of
+  !     included files.
+  include "netcdf_constants.f90"
+  include "netcdf_externals.f90"
+  include "netcdf4_externals.f90"
+  include "netcdf_overloads.f90"
+  include "netcdf4_overloads.f90"
+  include "netcdf_visibility.f90"
+  include "netcdf4_visibility.f90"
+contains
+  include "netcdf_file.f90"
+  include "netcdf4_file.f90"
+  include "netcdf_dims.f90"
+  include "netcdf_attributes.f90"
+  include "netcdf4_variables.f90"
+  include "netcdf_text_variables.f90"
+  include "netcdf_expanded.f90"
+  include "netcdf4_eightbyte.f90"
+  include "netcdf4_func.f90"
+end module netcdf
diff --git a/fortran/netcdf4.inc b/fortran/netcdf4.inc
new file mode 100755
index 0000000..3366837
--- /dev/null
+++ b/fortran/netcdf4.inc
@@ -0,0 +1,393 @@
+!     This is part of netCDF-4. Copyright 2006, UCAR, See COPYRIGHT
+!     file for distribution information.
+
+!     Netcdf version 4 fortran interface.
+
+!     $Id: netcdf4.inc,v 1.28 2010/05/25 13:53:02 ed Exp $
+
+!     New netCDF-4 types.
+      integer nf_ubyte
+      integer nf_ushort
+      integer nf_uint
+      integer nf_int64
+      integer nf_uint64
+      integer nf_string
+      integer nf_vlen
+      integer nf_opaque
+      integer nf_enum
+      integer nf_compound
+
+      parameter (nf_ubyte = 7)
+      parameter (nf_ushort = 8)
+      parameter (nf_uint = 9)
+      parameter (nf_int64 = 10)
+      parameter (nf_uint64 = 11)
+      parameter (nf_string = 12)
+      parameter (nf_vlen = 13)
+      parameter (nf_opaque = 14)
+      parameter (nf_enum = 15)
+      parameter (nf_compound = 16)
+
+!     New netCDF-4 fill values.
+      integer           nf_fill_ubyte
+      integer           nf_fill_ushort
+!      real              nf_fill_uint
+!      real              nf_fill_int64
+!      real              nf_fill_uint64
+      parameter (nf_fill_ubyte = 255)
+      parameter (nf_fill_ushort = 65535)
+
+!     New constants.
+      integer nf_format_netcdf4
+      parameter (nf_format_netcdf4 = 3)
+
+      integer nf_format_netcdf4_classic
+      parameter (nf_format_netcdf4_classic = 4)
+
+      integer nf_netcdf4
+      parameter (nf_netcdf4 = 4096)
+
+      integer nf_classic_model
+      parameter (nf_classic_model = 256)
+
+      integer nf_chunk_seq
+      parameter (nf_chunk_seq = 0)
+      integer nf_chunk_sub
+      parameter (nf_chunk_sub = 1)
+      integer nf_chunk_sizes
+      parameter (nf_chunk_sizes = 2)
+
+      integer nf_endian_native
+      parameter (nf_endian_native = 0)
+      integer nf_endian_little
+      parameter (nf_endian_little = 1)
+      integer nf_endian_big
+      parameter (nf_endian_big = 2)
+
+!     For NF_DEF_VAR_CHUNKING
+      integer nf_chunked
+      parameter (nf_chunked = 0)
+      integer nf_contiguous
+      parameter (nf_contiguous = 1)
+
+!     For NF_DEF_VAR_FLETCHER32
+      integer nf_nochecksum
+      parameter (nf_nochecksum = 0)
+      integer nf_fletcher32
+      parameter (nf_fletcher32 = 1)
+
+!     For NF_DEF_VAR_DEFLATE
+      integer nf_noshuffle
+      parameter (nf_noshuffle = 0)
+      integer nf_shuffle
+      parameter (nf_shuffle = 1)
+
+!     For NF_DEF_VAR_SZIP
+      integer nf_szip_ec_option_mask
+      parameter (nf_szip_ec_option_mask = 4)
+      integer nf_szip_nn_option_mask
+      parameter (nf_szip_nn_option_mask = 32)
+
+!     For parallel I/O.
+      integer nf_mpiio      
+      parameter (nf_mpiio = 8192)
+      integer nf_mpiposix
+      parameter (nf_mpiposix = 16384)
+      integer nf_pnetcdf
+      parameter (nf_pnetcdf = 32768)
+
+!     For NF_VAR_PAR_ACCESS.
+      integer nf_independent
+      parameter (nf_independent = 0)
+      integer nf_collective
+      parameter (nf_collective = 1)
+
+!     New error codes.
+      integer nf_ehdferr        ! Error at HDF5 layer. 
+      parameter (nf_ehdferr = -101)
+      integer nf_ecantread      ! Can't read. 
+      parameter (nf_ecantread = -102)
+      integer nf_ecantwrite     ! Can't write. 
+      parameter (nf_ecantwrite = -103)
+      integer nf_ecantcreate    ! Can't create. 
+      parameter (nf_ecantcreate = -104)
+      integer nf_efilemeta      ! Problem with file metadata. 
+      parameter (nf_efilemeta = -105)
+      integer nf_edimmeta       ! Problem with dimension metadata. 
+      parameter (nf_edimmeta = -106)
+      integer nf_eattmeta       ! Problem with attribute metadata. 
+      parameter (nf_eattmeta = -107)
+      integer nf_evarmeta       ! Problem with variable metadata. 
+      parameter (nf_evarmeta = -108)
+      integer nf_enocompound    ! Not a compound type. 
+      parameter (nf_enocompound = -109)
+      integer nf_eattexists     ! Attribute already exists. 
+      parameter (nf_eattexists = -110)
+      integer nf_enotnc4        ! Attempting netcdf-4 operation on netcdf-3 file.   
+      parameter (nf_enotnc4 = -111)
+      integer nf_estrictnc3     ! Attempting netcdf-4 operation on strict nc3 netcdf-4 file.   
+      parameter (nf_estrictnc3 = -112)
+      integer nf_enotnc3        ! Attempting netcdf-3 operation on netcdf-4 file.   
+      parameter (nf_enotnc3 = -113)
+      integer nf_enopar         ! Parallel operation on file opened for non-parallel access.   
+      parameter (nf_enopar = -114)
+      integer nf_eparinit       ! Error initializing for parallel access.   
+      parameter (nf_eparinit = -115)
+      integer nf_ebadgrpid      ! Bad group ID.   
+      parameter (nf_ebadgrpid = -116)
+      integer nf_ebadtypid      ! Bad type ID.   
+      parameter (nf_ebadtypid = -117)
+      integer nf_etypdefined    ! Type has already been defined and may not be edited. 
+      parameter (nf_etypdefined = -118)
+      integer nf_ebadfield      ! Bad field ID.   
+      parameter (nf_ebadfield = -119)
+      integer nf_ebadclass      ! Bad class.   
+      parameter (nf_ebadclass = -120)
+      integer nf_emaptype       ! Mapped access for atomic types only.   
+      parameter (nf_emaptype = -121)
+      integer nf_elatefill      ! Attempt to define fill value when data already exists. 
+      parameter (nf_elatefill = -122)
+      integer nf_elatedef       ! Attempt to define var properties, like deflate, after enddef. 
+      parameter (nf_elatedef = -123)
+      integer nf_edimscale      ! Probem with HDF5 dimscales. 
+      parameter (nf_edimscale = -124)
+      integer nf_enogrp       ! No group found.
+      parameter (nf_enogrp = -125)
+
+
+!     New functions.
+
+!     Parallel I/O.
+      integer nf_create_par
+      external nf_create_par
+
+      integer nf_open_par
+      external nf_open_par
+
+      integer nf_var_par_access
+      external nf_var_par_access
+
+!     Functions to handle groups.
+      integer nf_inq_ncid
+      external nf_inq_ncid
+
+      integer nf_inq_grps
+      external nf_inq_grps
+
+      integer nf_inq_grpname
+      external nf_inq_grpname
+
+      integer nf_inq_grpname_full
+      external nf_inq_grpname_full
+
+      integer nf_inq_grpname_len
+      external nf_inq_grpname_len
+
+      integer nf_inq_grp_parent
+      external nf_inq_grp_parent
+
+      integer nf_inq_grp_ncid
+      external nf_inq_grp_ncid
+
+      integer nf_inq_grp_full_ncid
+      external nf_inq_grp_full_ncid
+
+      integer nf_inq_varids
+      external nf_inq_varids
+
+      integer nf_inq_dimids
+      external nf_inq_dimids
+
+      integer nf_def_grp
+      external nf_def_grp
+
+!     New rename grp function
+
+      integer nf_rename_grp
+      external nf_rename_grp
+
+!     New options for netCDF variables.
+      integer nf_def_var_deflate
+      external nf_def_var_deflate
+
+      integer nf_inq_var_deflate
+      external nf_inq_var_deflate
+
+      integer nf_def_var_fletcher32
+      external nf_def_var_fletcher32
+
+      integer nf_inq_var_fletcher32
+      external nf_inq_var_fletcher32
+
+      integer nf_def_var_chunking
+      external nf_def_var_chunking
+
+      integer nf_inq_var_chunking
+      external nf_inq_var_chunking
+
+      integer nf_def_var_fill
+      external nf_def_var_fill
+
+      integer nf_inq_var_fill
+      external nf_inq_var_fill
+
+      integer nf_def_var_endian
+      external nf_def_var_endian
+
+      integer nf_inq_var_endian
+      external nf_inq_var_endian
+
+!     User defined types.
+      integer nf_inq_typeids
+      external nf_inq_typeids
+
+      integer nf_inq_typeid
+      external nf_inq_typeid
+
+      integer nf_inq_type
+      external nf_inq_type
+
+      integer nf_inq_user_type
+      external nf_inq_user_type
+
+!     User defined types - compound types.
+      integer nf_def_compound
+      external nf_def_compound
+
+      integer nf_insert_compound
+      external nf_insert_compound
+
+      integer nf_insert_array_compound
+      external nf_insert_array_compound
+
+      integer nf_inq_compound
+      external nf_inq_compound
+
+      integer nf_inq_compound_name
+      external nf_inq_compound_name
+
+      integer nf_inq_compound_size
+      external nf_inq_compound_size
+
+      integer nf_inq_compound_nfields
+      external nf_inq_compound_nfields
+
+      integer nf_inq_compound_field
+      external nf_inq_compound_field
+
+      integer nf_inq_compound_fieldname
+      external nf_inq_compound_fieldname
+
+      integer nf_inq_compound_fieldindex
+      external nf_inq_compound_fieldindex
+
+      integer nf_inq_compound_fieldoffset
+      external nf_inq_compound_fieldoffset
+
+      integer nf_inq_compound_fieldtype
+      external nf_inq_compound_fieldtype
+
+      integer nf_inq_compound_fieldndims
+      external nf_inq_compound_fieldndims
+
+      integer nf_inq_compound_fielddim_sizes
+      external nf_inq_compound_fielddim_sizes
+
+!     User defined types - variable length arrays.
+      integer nf_def_vlen
+      external nf_def_vlen
+
+      integer nf_inq_vlen
+      external nf_inq_vlen
+
+      integer nf_free_vlen
+      external nf_free_vlen
+
+!     User defined types - enums.
+      integer nf_def_enum
+      external nf_def_enum
+
+      integer nf_insert_enum
+      external nf_insert_enum
+
+      integer nf_inq_enum
+      external nf_inq_enum
+
+      integer nf_inq_enum_member
+      external nf_inq_enum_member
+
+      integer nf_inq_enum_ident
+      external nf_inq_enum_ident
+
+!     User defined types - opaque.
+      integer nf_def_opaque
+      external nf_def_opaque
+
+      integer nf_inq_opaque
+      external nf_inq_opaque
+
+!     Write and read attributes of any type, including user defined
+!     types.
+      integer nf_put_att
+      external nf_put_att
+      integer nf_get_att
+      external nf_get_att
+
+!     Write and read variables of any type, including user defined
+!     types.
+      integer nf_put_var
+      external nf_put_var
+      integer nf_put_var1
+      external nf_put_var1
+      integer nf_put_vara
+      external nf_put_vara
+      integer nf_put_vars
+      external nf_put_vars
+      integer nf_get_var
+      external nf_get_var
+      integer nf_get_var1
+      external nf_get_var1
+      integer nf_get_vara
+      external nf_get_vara
+      integer nf_get_vars
+      external nf_get_vars
+
+!     64-bit int functions.
+      integer nf_put_var1_int64
+      external nf_put_var1_int64
+      integer nf_put_vara_int64
+      external nf_put_vara_int64
+      integer nf_put_vars_int64
+      external nf_put_vars_int64
+      integer nf_put_varm_int64
+      external nf_put_varm_int64
+      integer nf_put_var_int64
+      external nf_put_var_int64
+      integer nf_get_var1_int64
+      external nf_get_var1_int64
+      integer nf_get_vara_int64
+      external nf_get_vara_int64
+      integer nf_get_vars_int64
+      external nf_get_vars_int64
+      integer nf_get_varm_int64
+      external nf_get_varm_int64
+      integer nf_get_var_int64
+      external nf_get_var_int64
+
+!     For helping F77 users with VLENs.
+      integer nf_get_vlen_element
+      external nf_get_vlen_element
+      integer nf_put_vlen_element
+      external nf_put_vlen_element
+
+!     For dealing with file level chunk cache.
+      integer nf_set_chunk_cache
+      external nf_set_chunk_cache
+      integer nf_get_chunk_cache
+      external nf_get_chunk_cache
+
+!     For dealing with per variable chunk cache.
+      integer nf_set_var_chunk_cache
+      external nf_set_var_chunk_cache
+      integer nf_get_var_chunk_cache
+      external nf_get_var_chunk_cache
diff --git a/fortran/netcdf4_eightbyte.f90 b/fortran/netcdf4_eightbyte.f90
new file mode 100644
index 0000000..b669cea
--- /dev/null
+++ b/fortran/netcdf4_eightbyte.f90
@@ -0,0 +1,808 @@
+function nf90_put_var_1D_EightByteInt(ncid, varid, values, start, count, stride, map)
+  integer,                         intent( in) :: ncid, varid
+  integer (kind = EightByteInt), dimension(:), intent( in) :: values
+  integer, dimension(:), optional, intent( in) :: start, count, stride, map
+  integer                                      :: nf90_put_var_1D_EightByteInt
+  
+  integer, dimension(nf90_max_var_dims) :: localStart, localCount, localStride, localMap
+  integer                               :: numDims, counter, format_num
+  
+  ! Set local arguments to default values
+  numDims                 = size(shape(values))
+  localStart (:         ) = 1
+  localCount (:numDims  ) = shape(values)
+  localCount (numDims+1:) = 1
+  localStride(:         ) = 1
+  localMap   (:numDims  ) = (/ 1, (product(localCount(:counter)), counter = 1, numDims - 1) /)
+  
+  if(present(start))  localStart (:size(start) )  = start(:)
+  if(present(count))  localCount (:size(count) )  = count(:)
+  if(present(stride)) localStride(:size(stride)) = stride(:)
+  nf90_put_var_1D_EightByteInt = nf_inq_format(ncid, format_num)
+  if (nf90_put_var_1D_EightByteInt .eq. nf90_noerr) then
+     if (format_num .eq. nf90_format_netcdf4) then
+        if(present(map))  then
+           localMap   (:size(map))    = map(:)
+           nf90_put_var_1D_EightByteInt = &
+                nf_put_varm_int64(ncid, varid, localStart, localCount, localStride, localMap, values)
+        else if(present(stride)) then
+           nf90_put_var_1D_EightByteInt = &
+                nf_put_vars_int64(ncid, varid, localStart, localCount, localStride, values)
+        else
+           nf90_put_var_1D_EightByteInt = &
+                nf_put_vara_int64(ncid, varid, localStart, localCount, values)
+        end if
+     else
+        if(present(map))  then
+           localMap   (:size(map))    = map(:)
+           nf90_put_var_1D_EightByteInt = &
+                nf_put_varm_int(ncid, varid, localStart, localCount, localStride, localMap, int(values))
+        else if(present(stride)) then
+           nf90_put_var_1D_EightByteInt = &
+                nf_put_vars_int(ncid, varid, localStart, localCount, localStride, int(values))
+        else
+           nf90_put_var_1D_EightByteInt = &
+                nf_put_vara_int(ncid, varid, localStart, localCount, int(values))
+        end if
+     endif
+  endif
+end function nf90_put_var_1D_EightByteInt
+
+function nf90_put_var_2D_EightByteInt(ncid, varid, values, start, count, stride, map)
+  integer,                         intent( in) :: ncid, varid
+  integer (kind = EightByteInt), dimension(:, :), &
+       intent( in) :: values
+  integer, dimension(:), optional, intent( in) :: start, count, stride, map
+  integer                                      :: nf90_put_var_2D_EightByteInt
+
+  integer, dimension(nf90_max_var_dims) :: localStart, localCount, localStride, localMap
+  integer                               :: numDims, counter, format_num
+
+  ! Set local arguments to default values
+  numDims                 = size(shape(values))
+  localStart (:         ) = 1
+  localCount (:numDims  ) = shape(values)
+  localCount (numDims+1:) = 1
+  localStride(:         ) = 1
+  localMap   (:numDims  ) = (/ 1, (product(localCount(:counter)), counter = 1, numDims - 1) /)
+
+  if(present(start))  localStart (:size(start) )  = start(:)
+  if(present(count))  localCount (:size(count) )  = count(:)
+  if(present(stride)) localStride(:size(stride)) = stride(:)
+  nf90_put_var_2D_EightByteInt = nf_inq_format(ncid, format_num)
+  if (nf90_put_var_2D_EightByteInt .eq. nf90_noerr) then
+     if (format_num .eq. nf90_format_netcdf4) then
+        if(present(map))  then
+           localMap   (:size(map))    = map(:)
+           nf90_put_var_2D_EightByteInt = &
+                nf_put_varm_int64(ncid, varid, localStart, localCount, localStride, localMap, values)
+        else if(present(stride)) then
+           nf90_put_var_2D_EightByteInt = &
+                nf_put_vars_int64(ncid, varid, localStart, localCount, localStride, values)
+        else
+           nf90_put_var_2D_EightByteInt = &
+                nf_put_vara_int64(ncid, varid, localStart, localCount, values)
+        end if
+     else
+        if(present(map))  then
+           localMap   (:size(map))    = map(:)
+           nf90_put_var_2D_EightByteInt = &
+                nf_put_varm_int(ncid, varid, localStart, localCount, localStride, localMap, int(values))
+        else if(present(stride)) then
+           nf90_put_var_2D_EightByteInt = &
+                nf_put_vars_int(ncid, varid, localStart, localCount, localStride, int(values))
+        else
+           nf90_put_var_2D_EightByteInt = &
+                nf_put_vara_int(ncid, varid, localStart, localCount, int(values))
+        end if
+     endif
+  endif
+
+end function nf90_put_var_2D_EightByteInt
+
+
+function nf90_put_var_3D_EightByteInt(ncid, varid, values, start, count, stride, map)
+  integer,                         intent( in) :: ncid, varid
+  integer (kind = EightByteInt), dimension(:, :, :), &
+       intent( in) :: values
+  integer, dimension(:), optional, intent( in) :: start, count, stride, map
+  integer                                      :: nf90_put_var_3D_EightByteInt
+
+  integer, dimension(nf90_max_var_dims) :: localStart, localCount, localStride, localMap
+  integer                               :: numDims, counter, format_num
+
+  ! Set local arguments to default values
+  numDims                 = size(shape(values))
+  localStart (:         ) = 1
+  localCount (:numDims  ) = shape(values)
+  localCount (numDims+1:) = 1
+  localStride(:         ) = 1
+  localMap   (:numDims  ) = (/ 1, (product(localCount(:counter)), counter = 1, numDims - 1) /)
+
+  if(present(start))  localStart (:size(start) )  = start(:)
+  if(present(count))  localCount (:size(count) )  = count(:)
+  if(present(stride)) localStride(:size(stride)) = stride(:)
+  nf90_put_var_3D_EightByteInt = nf_inq_format(ncid, format_num)
+  if (nf90_put_var_3D_EightByteInt .eq. nf90_noerr) then
+     if (format_num .eq. nf90_format_netcdf4) then
+        if(present(map))  then
+           localMap   (:size(map))    = map(:)
+           nf90_put_var_3D_EightByteInt = &
+                nf_put_varm_int64(ncid, varid, localStart, localCount, localStride, localMap, values)
+        else if(present(stride)) then
+           nf90_put_var_3D_EightByteInt = &
+                nf_put_vars_int64(ncid, varid, localStart, localCount, localStride, values)
+        else
+           nf90_put_var_3D_EightByteInt = &
+                nf_put_vara_int64(ncid, varid, localStart, localCount, values)
+        end if
+     else
+        if(present(map))  then
+           localMap   (:size(map))    = map(:)
+           nf90_put_var_3D_EightByteInt = &
+                nf_put_varm_int(ncid, varid, localStart, localCount, localStride, localMap, int(values))
+        else if(present(stride)) then
+           nf90_put_var_3D_EightByteInt = &
+                nf_put_vars_int(ncid, varid, localStart, localCount, localStride, int(values))
+        else
+           nf90_put_var_3D_EightByteInt = &
+                nf_put_vara_int(ncid, varid, localStart, localCount, int(values))
+        end if
+     endif
+  endif
+end function nf90_put_var_3D_EightByteInt
+
+
+function nf90_put_var_4D_EightByteInt(ncid, varid, values, start, count, stride, map)
+  integer,                         intent( in) :: ncid, varid
+  integer (kind = EightByteInt), dimension(:, :, :, :), &
+       intent( in) :: values
+  integer, dimension(:), optional, intent( in) :: start, count, stride, map
+  integer                                      :: nf90_put_var_4D_EightByteInt
+
+  integer, dimension(nf90_max_var_dims) :: localStart, localCount, localStride, localMap
+  integer                               :: numDims, counter, format_num
+
+  ! Set local arguments to default values
+  numDims                 = size(shape(values))
+  localStart (:         ) = 1
+  localCount (:numDims  ) = shape(values)
+  localCount (numDims+1:) = 1
+  localStride(:         ) = 1
+  localMap   (:numDims  ) = (/ 1, (product(localCount(:counter)), counter = 1, numDims - 1) /)
+
+  if(present(start))  localStart (:size(start) )  = start(:)
+  if(present(count))  localCount (:size(count) )  = count(:)
+  if(present(stride)) localStride(:size(stride)) = stride(:)
+  nf90_put_var_4D_EightByteInt = nf_inq_format(ncid, format_num)
+  if (nf90_put_var_4D_EightByteInt .eq. nf90_noerr) then
+     if (format_num .eq. nf90_format_netcdf4) then
+        if(present(map))  then
+           localMap   (:size(map))    = map(:)
+           nf90_put_var_4D_EightByteInt = &
+                nf_put_varm_int64(ncid, varid, localStart, localCount, localStride, localMap, values)
+        else if(present(stride)) then
+           nf90_put_var_4D_EightByteInt = &
+                nf_put_vars_int64(ncid, varid, localStart, localCount, localStride, values)
+        else
+           nf90_put_var_4D_EightByteInt = &
+                nf_put_vara_int64(ncid, varid, localStart, localCount, values)
+        end if
+     else
+        if(present(map))  then
+           localMap   (:size(map))    = map(:)
+           nf90_put_var_4D_EightByteInt = &
+                nf_put_varm_int(ncid, varid, localStart, localCount, localStride, localMap, int(values))
+        else if(present(stride)) then
+           nf90_put_var_4D_EightByteInt = &
+                nf_put_vars_int(ncid, varid, localStart, localCount, localStride, int(values))
+        else
+           nf90_put_var_4D_EightByteInt = &
+                nf_put_vara_int(ncid, varid, localStart, localCount, int(values))
+        end if
+     end if
+  end if
+end function nf90_put_var_4D_EightByteInt
+
+
+function nf90_put_var_5D_EightByteInt(ncid, varid, values, start, count, stride, map)
+  integer,                         intent( in) :: ncid, varid
+  integer (kind = EightByteInt), dimension(:, :, :, :, :), &
+       intent( in) :: values
+  integer, dimension(:), optional, intent( in) :: start, count, stride, map
+  integer                                      :: nf90_put_var_5D_EightByteInt
+
+  integer, dimension(nf90_max_var_dims) :: localStart, localCount, localStride, localMap
+  integer                               :: numDims, counter, format_num
+
+  ! Set local arguments to default values
+  numDims                 = size(shape(values))
+  localStart (:         ) = 1
+  localCount (:numDims  ) = shape(values)
+  localCount (numDims+1:) = 1
+  localStride(:         ) = 1
+  localMap   (:numDims  ) = (/ 1, (product(localCount(:counter)), counter = 1, numDims - 1) /)
+
+  if(present(start))  localStart (:size(start) )  = start(:)
+  if(present(count))  localCount (:size(count) )  = count(:)
+  if(present(stride)) localStride(:size(stride)) = stride(:)
+  nf90_put_var_5D_EightByteInt = nf_inq_format(ncid, format_num)
+  if (nf90_put_var_5D_EightByteInt .eq. nf90_noerr) then
+     if (format_num .eq. nf90_format_netcdf4) then
+        if(present(map))  then
+           localMap   (:size(map))    = map(:)
+           nf90_put_var_5D_EightByteInt = &
+                nf_put_varm_int64(ncid, varid, localStart, localCount, localStride, localMap, values)
+        else if(present(stride)) then
+           nf90_put_var_5D_EightByteInt = &
+                nf_put_vars_int64(ncid, varid, localStart, localCount, localStride, values)
+        else
+           nf90_put_var_5D_EightByteInt = &
+                nf_put_vara_int64(ncid, varid, localStart, localCount, values)
+        end if
+     else
+        if(present(map))  then
+           localMap   (:size(map))    = map(:)
+           nf90_put_var_5D_EightByteInt = &
+                nf_put_varm_int(ncid, varid, localStart, localCount, localStride, localMap, int(values))
+        else if(present(stride)) then
+           nf90_put_var_5D_EightByteInt = &
+                nf_put_vars_int(ncid, varid, localStart, localCount, localStride, int(values))
+        else
+           nf90_put_var_5D_EightByteInt = &
+                nf_put_vara_int(ncid, varid, localStart, localCount, int(values))
+        end if
+     end if
+  end if
+end function nf90_put_var_5D_EightByteInt
+
+
+function nf90_put_var_6D_EightByteInt(ncid, varid, values, start, count, stride, map)
+  integer,                         intent( in) :: ncid, varid
+  integer (kind = EightByteInt), dimension(:, :, :, :, :, :), &
+       intent( in) :: values
+  integer, dimension(:), optional, intent( in) :: start, count, stride, map
+  integer                                      :: nf90_put_var_6D_EightByteInt
+
+  integer, dimension(nf90_max_var_dims) :: localStart, localCount, localStride, localMap
+  integer                               :: numDims, counter, format_num
+
+  ! Set local arguments to default values
+  numDims                 = size(shape(values))
+  localStart (:         ) = 1
+  localCount (:numDims  ) = shape(values)
+  localCount (numDims+1:) = 1
+  localStride(:         ) = 1
+  localMap   (:numDims  ) = (/ 1, (product(localCount(:counter)), counter = 1, numDims - 1) /)
+
+  if(present(start))  localStart (:size(start) )  = start(:)
+  if(present(count))  localCount (:size(count) )  = count(:)
+  if(present(stride)) localStride(:size(stride)) = stride(:)
+  nf90_put_var_6D_EightByteInt = nf_inq_format(ncid, format_num)
+  if (nf90_put_var_6D_EightByteInt .eq. nf90_noerr) then
+     if (format_num .eq. nf90_format_netcdf4) then
+        if(present(map))  then
+           localMap   (:size(map))    = map(:)
+           nf90_put_var_6D_EightByteInt = &
+                nf_put_varm_int64(ncid, varid, localStart, localCount, localStride, localMap, values)
+        else if(present(stride)) then
+           nf90_put_var_6D_EightByteInt = &
+                nf_put_vars_int64(ncid, varid, localStart, localCount, localStride, values)
+        else
+           nf90_put_var_6D_EightByteInt = &
+                nf_put_vara_int64(ncid, varid, localStart, localCount, values)
+        end if
+     else
+        if(present(map))  then
+           localMap   (:size(map))    = map(:)
+           nf90_put_var_6D_EightByteInt = &
+                nf_put_varm_int(ncid, varid, localStart, localCount, localStride, localMap, int(values))
+        else if(present(stride)) then
+           nf90_put_var_6D_EightByteInt = &
+                nf_put_vars_int(ncid, varid, localStart, localCount, localStride, int(values))
+        else
+           nf90_put_var_6D_EightByteInt = &
+                nf_put_vara_int(ncid, varid, localStart, localCount, int(values))
+        end if
+     end if
+  end if
+end function nf90_put_var_6D_EightByteInt
+
+
+function nf90_put_var_7D_EightByteInt(ncid, varid, values, start, count, stride, map)
+  integer,                         intent( in) :: ncid, varid
+  integer (kind = EightByteInt), dimension(:, :, :, :, :, :, :), &
+       intent( in) :: values
+  integer, dimension(:), optional, intent( in) :: start, count, stride, map
+  integer                                      :: nf90_put_var_7D_EightByteInt
+
+  integer, dimension(nf90_max_var_dims) :: localStart, localCount, localStride, localMap
+  integer                               :: numDims, counter, format_num
+
+  ! Set local arguments to default values
+  numDims                 = size(shape(values))
+  localStart (:         ) = 1
+  localCount (:numDims  ) = shape(values)
+  localCount (numDims+1:) = 1
+  localStride(:         ) = 1
+  localMap   (:numDims  ) = (/ 1, (product(localCount(:counter)), counter = 1, numDims - 1) /)
+
+  if(present(start))  localStart (:size(start) )  = start(:)
+  if(present(count))  localCount (:size(count) )  = count(:)
+  if(present(stride)) localStride(:size(stride)) = stride(:)
+  nf90_put_var_7D_EightByteInt = nf_inq_format(ncid, format_num)
+  if (nf90_put_var_7D_EightByteInt .eq. nf90_noerr) then
+     if (format_num .eq. nf90_format_netcdf4) then
+        if(present(map))  then
+           localMap   (:size(map))    = map(:)
+           nf90_put_var_7D_EightByteInt = &
+                nf_put_varm_int64(ncid, varid, localStart, localCount, localStride, localMap, values)
+        else if(present(stride)) then
+           nf90_put_var_7D_EightByteInt = &
+                nf_put_vars_int64(ncid, varid, localStart, localCount, localStride, values)
+        else
+           nf90_put_var_7D_EightByteInt = &
+                nf_put_vara_int64(ncid, varid, localStart, localCount, values)
+        end if
+     else
+        if(present(map))  then
+           localMap   (:size(map))    = map(:)
+           nf90_put_var_7D_EightByteInt = &
+                nf_put_varm_int(ncid, varid, localStart, localCount, localStride, localMap, int(values))
+        else if(present(stride)) then
+           nf90_put_var_7D_EightByteInt = &
+                nf_put_vars_int(ncid, varid, localStart, localCount, localStride, int(values))
+        else
+           nf90_put_var_7D_EightByteInt = &
+                nf_put_vara_int(ncid, varid, localStart, localCount, int(values))
+        end if
+     end if
+  end if
+end function nf90_put_var_7D_EightByteInt
+
+
+function nf90_get_var_1D_EightByteInt(ncid, varid, values, start, count, stride, map)
+  integer,                         intent( in) :: ncid, varid
+  integer (kind = EightByteInt), dimension(:), &
+       intent(out) :: values
+  integer, dimension(:), optional, intent( in) :: start, count, stride, map
+  integer                                      :: nf90_get_var_1D_EightByteInt
+
+  integer, dimension(nf90_max_var_dims) :: localStart, localCount, localStride, localMap
+  integer                               :: numDims, counter, format_num
+  integer, dimension(size(values))      :: defaultIntArray
+  integer (kind = EightByteInt), dimension(size(values))      :: defaultInt8Array
+
+  ! Set local arguments to default values
+  numDims                 = size(shape(values))
+  localStart (:         ) = 1
+  localCount (:numDims  ) = shape(values)
+  localCount (numDims+1:) = 1
+  localStride(:         ) = 1
+  localMap   (:numDims  ) = (/ 1, (product(localCount(:counter)), counter = 1, numDims - 1) /)
+
+  if(present(start))  localStart (:size(start) )  = start(:)
+  if(present(count))  localCount (:size(count) )  = count(:)
+  if(present(stride)) localStride(:size(stride)) = stride(:)
+  nf90_get_var_1D_EightByteInt = nf_inq_format(ncid, format_num)
+  if (nf90_get_var_1D_EightByteInt .eq. nf90_noerr) then
+     if (format_num .eq. nf90_format_netcdf4) then
+        if(present(map))  then
+           localMap   (:size(map))    = map(:)
+           nf90_get_var_1D_EightByteInt = &
+                nf_get_varm_int64(ncid, varid, localStart, localCount, localStride, localMap, defaultInt8Array)
+        else if(present(stride)) then
+           nf90_get_var_1D_EightByteInt = &
+                nf_get_vars_int64(ncid, varid, localStart, localCount, localStride, defaultInt8Array)
+        else
+           nf90_get_var_1D_EightByteInt = &
+                nf_get_vara_int64(ncid, varid, localStart, localCount, defaultInt8Array)
+        end if
+        values(:) = reshape(defaultInt8Array(:), shape(values))
+     else
+        if(present(map))  then
+           localMap   (:size(map))    = map(:)
+           nf90_get_var_1D_EightByteInt = &
+                nf_get_varm_int(ncid, varid, localStart, localCount, localStride, localMap, defaultIntArray)
+        else if(present(stride)) then
+           nf90_get_var_1D_EightByteInt = &
+                nf_get_vars_int(ncid, varid, localStart, localCount, localStride, defaultIntArray)
+        else
+           nf90_get_var_1D_EightByteInt = &
+                nf_get_vara_int(ncid, varid, localStart, localCount, defaultIntArray)
+        end if
+        values(:) = reshape(defaultIntArray(:), shape(values))
+     endif
+  endif
+end function nf90_get_var_1D_EightByteInt
+
+
+function nf90_get_var_2D_EightByteInt(ncid, varid, values, start, count, stride, map)
+  integer,                         intent( in) :: ncid, varid
+  integer (kind = EightByteInt), dimension(:, :), &
+       intent(out) :: values
+  integer, dimension(:), optional, intent( in) :: start, count, stride, map
+  integer                                      :: nf90_get_var_2D_EightByteInt
+
+  integer, dimension(nf90_max_var_dims) :: localStart, localCount, localStride, localMap
+  integer                               :: numDims, counter, format_num
+  integer, dimension(size(values))      :: defaultIntArray
+  integer (kind = EightByteInt), dimension(size(values))      :: defaultInt8Array
+
+  ! Set local arguments to default values
+  numDims                 = size(shape(values))
+  localStart (:         ) = 1
+  localCount (:numDims  ) = shape(values)
+  localCount (numDims+1:) = 1
+  localStride(:         ) = 1
+  localMap   (:numDims  ) = (/ 1, (product(localCount(:counter)), counter = 1, numDims - 1) /)
+
+  if(present(start))  localStart (:size(start) )  = start(:)
+  if(present(count))  localCount (:size(count) )  = count(:)
+  if(present(stride)) localStride(:size(stride)) = stride(:)
+  nf90_get_var_2D_EightByteInt = nf_inq_format(ncid, format_num)
+  if (nf90_get_var_2D_EightByteInt .eq. nf90_noerr) then
+     if (format_num .eq. nf90_format_netcdf4) then
+        if(present(map))  then
+           localMap   (:size(map))    = map(:)
+           nf90_get_var_2D_EightByteInt = &
+                nf_get_varm_int64(ncid, varid, localStart, localCount, localStride, localMap, defaultInt8Array)
+        else if(present(stride)) then
+           nf90_get_var_2D_EightByteInt = &
+                nf_get_vars_int64(ncid, varid, localStart, localCount, localStride, defaultInt8Array)
+        else
+           nf90_get_var_2D_EightByteInt = &
+                nf_get_vara_int64(ncid, varid, localStart, localCount, defaultInt8Array)
+        end if
+        values(:, :) = reshape(defaultInt8Array(:), shape(values))
+     else
+        if(present(map))  then
+           localMap   (:size(map))    = map(:)
+           nf90_get_var_2D_EightByteInt = &
+                nf_get_varm_int(ncid, varid, localStart, localCount, localStride, localMap, defaultIntArray)
+        else if(present(stride)) then
+           nf90_get_var_2D_EightByteInt = &
+                nf_get_vars_int(ncid, varid, localStart, localCount, localStride, defaultIntArray)
+        else
+           nf90_get_var_2D_EightByteInt = &
+                nf_get_vara_int(ncid, varid, localStart, localCount, defaultIntArray)
+        end if
+        values(:, :) = reshape(defaultIntArray(:), shape(values))
+     end if
+  end if
+end function nf90_get_var_2D_EightByteInt
+
+
+function nf90_get_var_3D_EightByteInt(ncid, varid, values, start, count, stride, map)
+  integer,                         intent( in) :: ncid, varid
+  integer (kind = EightByteInt), dimension(:, :, :), &
+       intent(out) :: values
+  integer, dimension(:), optional, intent( in) :: start, count, stride, map
+  integer                                      :: nf90_get_var_3D_EightByteInt
+
+  integer, dimension(nf90_max_var_dims) :: localStart, localCount, localStride, localMap
+  integer                               :: numDims, counter, format_num
+  integer, dimension(size(values))      :: defaultIntArray
+  integer (kind = EightByteInt), dimension(size(values))      :: defaultInt8Array
+
+  ! Set local arguments to default values
+  numDims                 = size(shape(values))
+  localStart (:         ) = 1
+  localCount (:numDims  ) = shape(values)
+  localCount (numDims+1:) = 1
+  localStride(:         ) = 1
+  localMap   (:numDims  ) = (/ 1, (product(localCount(:counter)), counter = 1, numDims - 1) /)
+
+  if(present(start))  localStart (:size(start) )  = start(:)
+  if(present(count))  localCount (:size(count) )  = count(:)
+  if(present(stride)) localStride(:size(stride)) = stride(:)
+  nf90_get_var_3D_EightByteInt = nf_inq_format(ncid, format_num)
+  if (nf90_get_var_3D_EightByteInt .eq. nf90_noerr) then
+     if (format_num .eq. nf90_format_netcdf4) then
+        if(present(map))  then
+           localMap   (:size(map))    = map(:)
+           nf90_get_var_3D_EightByteInt = &
+                nf_get_varm_int64(ncid, varid, localStart, localCount, localStride, localMap, defaultInt8Array)
+        else if(present(stride)) then
+           nf90_get_var_3D_EightByteInt = &
+                nf_get_vars_int64(ncid, varid, localStart, localCount, localStride, defaultInt8Array)
+        else
+           nf90_get_var_3D_EightByteInt = &
+                nf_get_vara_int64(ncid, varid, localStart, localCount, defaultInt8Array)
+        end if
+        values(:, :, :) = reshape(defaultInt8Array(:), shape(values))
+     else
+        if(present(map))  then
+           localMap   (:size(map))    = map(:)
+           nf90_get_var_3D_EightByteInt = &
+                nf_get_varm_int(ncid, varid, localStart, localCount, localStride, localMap, defaultIntArray)
+        else if(present(stride)) then
+           nf90_get_var_3D_EightByteInt = &
+                nf_get_vars_int(ncid, varid, localStart, localCount, localStride, defaultIntArray)
+        else
+           nf90_get_var_3D_EightByteInt = &
+                nf_get_vara_int(ncid, varid, localStart, localCount, defaultIntArray)
+        end if
+        values(:, :, :) = reshape(defaultIntArray(:), shape(values))
+     end if
+  end if
+end function nf90_get_var_3D_EightByteInt
+
+
+function nf90_get_var_4D_EightByteInt(ncid, varid, values, start, count, stride, map)
+  integer,                         intent( in) :: ncid, varid
+  integer (kind = EightByteInt), dimension(:, :, :, :), &
+       intent(out) :: values
+  integer, dimension(:), optional, intent( in) :: start, count, stride, map
+  integer                                      :: nf90_get_var_4D_EightByteInt
+
+  integer, dimension(nf90_max_var_dims) :: localStart, localCount, localStride, localMap
+  integer                               :: numDims, counter, format_num
+  integer, dimension(size(values))      :: defaultIntArray
+  integer (kind = EightByteInt), dimension(size(values))      :: defaultInt8Array
+
+  ! Set local arguments to default values
+  numDims                 = size(shape(values))
+  localStart (:         ) = 1
+  localCount (:numDims  ) = shape(values)
+  localCount (numDims+1:) = 1
+  localStride(:         ) = 1
+  localMap   (:numDims  ) = (/ 1, (product(localCount(:counter)), counter = 1, numDims - 1) /)
+
+  if(present(start))  localStart (:size(start) )  = start(:)
+  if(present(count))  localCount (:size(count) )  = count(:)
+  if(present(stride)) localStride(:size(stride)) = stride(:)
+  nf90_get_var_4D_EightByteInt = nf_inq_format(ncid, format_num)
+  if (nf90_get_var_4D_EightByteInt .eq. nf90_noerr) then
+     if (format_num .eq. nf90_format_netcdf4) then
+        if(present(map))  then
+           localMap   (:size(map))    = map(:)
+           nf90_get_var_4D_EightByteInt = &
+                nf_get_varm_int64(ncid, varid, localStart, localCount, localStride, localMap, defaultInt8Array)
+        else if(present(stride)) then
+           nf90_get_var_4D_EightByteInt = &
+                nf_get_vars_int64(ncid, varid, localStart, localCount, localStride, defaultInt8Array)
+        else
+           nf90_get_var_4D_EightByteInt = &
+                nf_get_vara_int64(ncid, varid, localStart, localCount, defaultInt8Array)
+        end if
+        values(:, :, :, :) = reshape(defaultInt8Array(:), shape(values))
+     else
+        if(present(map))  then
+           localMap   (:size(map))    = map(:)
+           nf90_get_var_4D_EightByteInt = &
+                nf_get_varm_int(ncid, varid, localStart, localCount, localStride, localMap, defaultIntArray)
+        else if(present(stride)) then
+           nf90_get_var_4D_EightByteInt = &
+                nf_get_vars_int(ncid, varid, localStart, localCount, localStride, defaultIntArray)
+        else
+           nf90_get_var_4D_EightByteInt = &
+                nf_get_vara_int(ncid, varid, localStart, localCount, defaultIntArray)
+        end if
+        values(:, :, :, :) = reshape(defaultIntArray(:), shape(values))
+     end if
+  end if
+end function nf90_get_var_4D_EightByteInt
+
+
+function nf90_get_var_5D_EightByteInt(ncid, varid, values, start, count, stride, map)
+  integer,                         intent( in) :: ncid, varid
+  integer (kind = EightByteInt), dimension(:, :, :, :, :), &
+       intent(out) :: values
+  integer, dimension(:), optional, intent( in) :: start, count, stride, map
+  integer                                      :: nf90_get_var_5D_EightByteInt
+
+  integer, dimension(nf90_max_var_dims) :: localStart, localCount, localStride, localMap
+  integer                               :: numDims, counter, format_num
+  integer, dimension(size(values))      :: defaultIntArray
+  integer (kind = EightByteInt), dimension(size(values))      :: defaultInt8Array
+
+  ! Set local arguments to default values
+  numDims                 = size(shape(values))
+  localStart (:         ) = 1
+  localCount (:numDims  ) = shape(values)
+  localCount (numDims+1:) = 1
+  localStride(:         ) = 1
+  localMap   (:numDims  ) = (/ 1, (product(localCount(:counter)), counter = 1, numDims - 1) /)
+
+  if(present(start))  localStart (:size(start) )  = start(:)
+  if(present(count))  localCount (:size(count) )  = count(:)
+  if(present(stride)) localStride(:size(stride)) = stride(:)
+  nf90_get_var_5D_EightByteInt = nf_inq_format(ncid, format_num)
+  if (nf90_get_var_5D_EightByteInt .eq. nf90_noerr) then
+     if (format_num .eq. nf90_format_netcdf4) then
+        if(present(map))  then
+           localMap   (:size(map))    = map(:)
+           nf90_get_var_5D_EightByteInt = &
+                nf_get_varm_int64(ncid, varid, localStart, localCount, localStride, localMap, defaultInt8Array)
+        else if(present(stride)) then
+           nf90_get_var_5D_EightByteInt = &
+                nf_get_vars_int64(ncid, varid, localStart, localCount, localStride, defaultInt8Array)
+        else
+           nf90_get_var_5D_EightByteInt = &
+                nf_get_vara_int64(ncid, varid, localStart, localCount, defaultInt8Array)
+        end if
+        values(:, :, :, :, :) = reshape(defaultInt8Array(:), shape(values))
+     else
+        if(present(map))  then
+           localMap   (:size(map))    = map(:)
+           nf90_get_var_5D_EightByteInt = &
+                nf_get_varm_int(ncid, varid, localStart, localCount, localStride, localMap, defaultIntArray)
+        else if(present(stride)) then
+           nf90_get_var_5D_EightByteInt = &
+                nf_get_vars_int(ncid, varid, localStart, localCount, localStride, defaultIntArray)
+        else
+           nf90_get_var_5D_EightByteInt = &
+                nf_get_vara_int(ncid, varid, localStart, localCount, defaultIntArray)
+        end if
+        values(:, :, :, :, :) = reshape(defaultIntArray(:), shape(values))
+     end if
+  end if
+end function nf90_get_var_5D_EightByteInt
+
+
+function nf90_get_var_6D_EightByteInt(ncid, varid, values, start, count, stride, map)
+  integer,                         intent( in) :: ncid, varid
+  integer (kind = EightByteInt), dimension(:, :, :, :, :, :), &
+       intent(out) :: values
+  integer, dimension(:), optional, intent( in) :: start, count, stride, map
+  integer                                      :: nf90_get_var_6D_EightByteInt
+
+  integer, dimension(nf90_max_var_dims) :: localStart, localCount, localStride, localMap
+  integer                               :: numDims, counter, format_num
+  integer, dimension(size(values))      :: defaultIntArray
+  integer (kind = EightByteInt), dimension(size(values))      :: defaultInt8Array
+
+  ! Set local arguments to default values
+  numDims                 = size(shape(values))
+  localStart (:         ) = 1
+  localCount (:numDims  ) = shape(values)
+  localCount (numDims+1:) = 1
+  localStride(:         ) = 1
+  localMap   (:numDims  ) = (/ 1, (product(localCount(:counter)), counter = 1, numDims - 1) /)
+
+  if(present(start))  localStart (:size(start) )  = start(:)
+  if(present(count))  localCount (:size(count) )  = count(:)
+  if(present(stride)) localStride(:size(stride)) = stride(:)
+  nf90_get_var_6D_EightByteInt = nf_inq_format(ncid, format_num)
+  if (nf90_get_var_6D_EightByteInt .eq. nf90_noerr) then
+     if (format_num .eq. nf90_format_netcdf4) then
+        if(present(map))  then
+           localMap   (:size(map))    = map(:)
+           nf90_get_var_6D_EightByteInt = &
+                nf_get_varm_int64(ncid, varid, localStart, localCount, localStride, localMap, defaultInt8Array)
+        else if(present(stride)) then
+           nf90_get_var_6D_EightByteInt = &
+                nf_get_vars_int64(ncid, varid, localStart, localCount, localStride, defaultInt8Array)
+        else
+           nf90_get_var_6D_EightByteInt = &
+                nf_get_vara_int64(ncid, varid, localStart, localCount, defaultInt8Array)
+        end if
+        values(:, :, :, :, :, :) = reshape(defaultInt8Array(:), shape(values))
+     else
+        if(present(map))  then
+           localMap   (:size(map))    = map(:)
+           nf90_get_var_6D_EightByteInt = &
+                nf_get_varm_int(ncid, varid, localStart, localCount, localStride, localMap, defaultIntArray)
+        else if(present(stride)) then
+           nf90_get_var_6D_EightByteInt = &
+                nf_get_vars_int(ncid, varid, localStart, localCount, localStride, defaultIntArray)
+        else
+           nf90_get_var_6D_EightByteInt = &
+                nf_get_vara_int(ncid, varid, localStart, localCount, defaultIntArray)
+        end if
+        values(:, :, :, :, :, :) = reshape(defaultIntArray(:), shape(values))
+     end if
+  end if
+end function nf90_get_var_6D_EightByteInt
+
+
+function nf90_get_var_7D_EightByteInt(ncid, varid, values, start, count, stride, map)
+  integer,                         intent( in) :: ncid, varid
+  integer (kind = EightByteInt), dimension(:, :, :, :, :, :, :), &
+       intent(out) :: values
+  integer, dimension(:), optional, intent( in) :: start, count, stride, map
+  integer                                      :: nf90_get_var_7D_EightByteInt
+
+  integer, dimension(nf90_max_var_dims) :: localStart, localCount, localStride, localMap
+  integer                               :: numDims, counter, format_num
+  integer, dimension(size(values))      :: defaultIntArray
+  integer (kind = EightByteInt), dimension(size(values))      :: defaultInt8Array
+
+  ! Set local arguments to default values
+  numDims                 = size(shape(values))
+  localStart (:         ) = 1
+  localCount (:numDims  ) = shape(values)
+  localCount (numDims+1:) = 1
+  localStride(:         ) = 1
+  localMap   (:numDims  ) = (/ 1, (product(localCount(:counter)), counter = 1, numDims - 1) /)
+
+  if(present(start))  localStart (:size(start) )  = start(:)
+  if(present(count))  localCount (:size(count) )  = count(:)
+  if(present(stride)) localStride(:size(stride)) = stride(:)
+  nf90_get_var_7D_EightByteInt = nf_inq_format(ncid, format_num)
+  if (nf90_get_var_7D_EightByteInt .eq. nf90_noerr) then
+     if (format_num .eq. nf90_format_netcdf4) then
+        if(present(map))  then
+           localMap   (:size(map))    = map(:)
+           nf90_get_var_7D_EightByteInt = &
+                nf_get_varm_int64(ncid, varid, localStart, localCount, localStride, localMap, defaultInt8Array)
+        else if(present(stride)) then
+           nf90_get_var_7D_EightByteInt = &
+                nf_get_vars_int64(ncid, varid, localStart, localCount, localStride, defaultInt8Array)
+        else
+           nf90_get_var_7D_EightByteInt = &
+                nf_get_vara_int64(ncid, varid, localStart, localCount, defaultInt8Array)
+        end if
+        values(:, :, :, :, :, :, :) = reshape(defaultInt8Array(:), shape(values))
+     else
+        if(present(map))  then
+           localMap   (:size(map))    = map(:)
+           nf90_get_var_7D_EightByteInt = &
+                nf_get_varm_int(ncid, varid, localStart, localCount, localStride, localMap, defaultIntArray)
+        else if(present(stride)) then
+           nf90_get_var_7D_EightByteInt = &
+                nf_get_vars_int(ncid, varid, localStart, localCount, localStride, defaultIntArray)
+        else
+           nf90_get_var_7D_EightByteInt = &
+                nf_get_vara_int(ncid, varid, localStart, localCount, defaultIntArray)
+        end if
+        values(:, :, :, :, :, :, :) = reshape(defaultIntArray(:), shape(values))
+     end if
+  end if
+  
+end function nf90_get_var_7D_EightByteInt
+
+
+function nf90_put_var_EightByteInt(ncid, varid, values, start)
+  integer,                         intent( in) :: ncid, varid
+  integer (kind = EightByteInt), intent( in) :: values
+  integer, dimension(:), optional, intent( in) :: start
+  integer                                      :: nf90_put_var_EightByteInt
+
+  integer, dimension(nf90_max_var_dims) :: localIndex
+  integer                               :: counter, format_num
+
+  ! Set local arguments to default values
+  localIndex(:) = 1
+  if(present(start)) localIndex(:size(start)) = start(:)
+
+  nf90_put_var_EightByteInt = nf_inq_format(ncid, format_num)
+  if (nf90_put_var_EightByteInt .eq. nf90_noerr) then
+     if (format_num .eq. nf90_format_netcdf4) then
+        nf90_put_var_EightByteInt = nf_put_var1_int64(ncid, varid, localIndex, values)
+     else
+        nf90_put_var_EightByteInt = nf_put_var1_int(ncid, varid, localIndex, int(values))
+     endif
+  endif
+end function nf90_put_var_EightByteInt
+
+
+function nf90_get_var_EightByteInt(ncid, varid, values, start)
+  integer,                         intent( in) :: ncid, varid
+  integer (kind = EightByteInt), intent(out) :: values
+  integer, dimension(:), optional, intent( in) :: start
+  integer                                      :: nf90_get_var_EightByteInt
+
+  integer, dimension(nf90_max_var_dims) :: localIndex
+  integer                               :: counter, format_num
+  integer                               :: defaultInteger
+  integer (kind = EightByteInt)         :: defaultInteger8
+
+  ! Set local arguments to default values
+  localIndex(:) = 1
+  if(present(start)) localIndex(:size(start)) = start(:)
+
+  nf90_get_var_EightByteInt = nf_inq_format(ncid, format_num)
+  if (nf90_get_var_EightByteInt .eq. nf90_noerr) then
+     if (format_num .eq. nf90_format_netcdf4) then
+        nf90_get_var_EightByteInt = nf_get_var1_int64(ncid, varid, localIndex, defaultInteger8)
+        values = defaultInteger8
+     else
+        nf90_get_var_EightByteInt = nf_get_var1_int(ncid, varid, localIndex, defaultInteger)
+        values = defaultInteger
+     endif
+  endif
+end function nf90_get_var_EightByteInt
+
+
diff --git a/fortran/netcdf4_externals.f90 b/fortran/netcdf4_externals.f90
new file mode 100644
index 0000000..c195b33
--- /dev/null
+++ b/fortran/netcdf4_externals.f90
@@ -0,0 +1,32 @@
+! This is part of the netCDF-4 fortran 90 API.
+! Copyright 2006, UCAR
+! $Id: netcdf4_externals.f90,v 1.21 2010/01/20 13:06:15 ed Exp $
+
+  ! Extra netCDF-4 functions 
+
+  integer, external :: nf_create_par, nf_open_par, nf_var_par_access, &
+       nf_inq_ncid, nf_inq_grps, nf_inq_grpname, nf_inq_grpname_full, &
+       nf_inq_grpname_len, nf_inq_grp_parent, nf_inq_grp_ncid, nf_inq_grp_full_ncid, nf_inq_varids, &
+       nf_inq_dimids, nf_inq_typeids, nf_inq_typeid, nf_def_grp, nf_def_compound, &
+       nf_insert_compound, nf_insert_array_compound, nf_inq_type, &
+       nf_inq_compound, nf_inq_compound_name, nf_inq_compound_size, &
+       nf_inq_compound_nfields, nf_inq_compound_field, &
+       nf_inq_compound_fieldname, nf_inq_compound_fieldindex, &
+       nf_inq_compound_fieldtype, nf_inq_compound_fieldndims, &
+       nf_inq_compound_fielddim_sizes, nf_inq_compound_fieldoffset, &
+       nf_def_vlen, nf_inq_vlen, nf_free_vlen, nf_inq_user_type, &
+       nf_def_enum, nf_insert_enum, nf_inq_enum, nf_inq_enum_member, &
+       nf_inq_enum_ident, nf_def_opaque, nf_inq_opaque, &
+       nf_def_var_chunking, nf_def_var_deflate, &
+       nf_def_var_fletcher32, nf_inq_var_chunking, nf_inq_var_deflate, &
+       nf_inq_var_fletcher32, nf_inq_var_endian, nf_def_var_endian, &
+       nf_def_var_fill, nf_inq_var_fill, nf_get_att, nf_put_att, &
+       nf_put_vars, nf_get_vars, nf_put_vlen_element, &
+       nf_put_var1_int64, nf_put_vara_int64, nf_put_vars_int64, &
+       nf_put_varm_int64, nf_put_var_int64, nf_get_var1_int64, &
+       nf_get_vara_int64, nf_get_vars_int64, nf_get_varm_int64, &
+       nf_get_var_int64, nf_get_chunk_cache, nf_set_chunk_cache, &
+       nf_inq_var_szip, nf_free_vlens, nf_free_string, &
+       nf_set_var_chunk_cache, nf_get_var_chunk_cache, nf_rename_grp
+
+  
diff --git a/fortran/netcdf4_file.f90 b/fortran/netcdf4_file.f90
new file mode 100644
index 0000000..320d239
--- /dev/null
+++ b/fortran/netcdf4_file.f90
@@ -0,0 +1,155 @@
+! This is part of netCDF-4. Copyright 2006 UCAR. See COPYRIGHT file
+! for details.
+
+! This file contains the netcdf-4 file open and create functions.
+
+! $Id: netcdf4_constants.f90,v 1.14 2010/05/25 13:53:00 ed Exp $
+! -------
+function nf90_open(path, mode, ncid, chunksize, cache_size, cache_nelems, &
+     cache_preemption, comm, info)
+  implicit none
+  character (len = *), intent(in) :: path
+  integer, intent(in) :: mode
+  integer, intent(out) :: ncid
+  integer, optional, intent(inout) :: chunksize
+  integer, optional, intent(in) :: cache_size, cache_nelems
+  real, optional, intent(in) :: cache_preemption
+  integer, optional, intent(in) :: comm, info
+  integer :: size_in, nelems_in, preemption_in
+  integer :: size_out, nelems_out, preemption_out, ret
+  integer :: nf90_open
+
+  ! If using parallel, both comm and info must be provided.
+  if (present(comm) .and. .not. present(info)) then
+     nf90_open = NF90_EINVAL;
+     return
+  end if
+
+  ! If the user specified chuck cache parameters, use them. But user
+  ! may have specified one, two, or three settings. Leave the others
+  ! unchanged.
+  if (present(cache_size) .or. present(cache_nelems) .or. &
+       present(cache_preemption)) then
+     ret = nf_get_chunk_cache(size_in, nelems_in, preemption_in)
+     if (ret .ne. nf90_noerr) then
+        nf90_open = ret
+        return
+     end if
+     if (present(cache_size)) then
+        size_out = cache_size
+     else
+        size_out = size_in
+     end if
+     if (present(cache_nelems)) then
+        nelems_out = cache_nelems
+     else
+        nelems_out = nelems_in
+     end if
+     if (present(cache_preemption)) then
+        preemption_out = cache_preemption
+     else
+        preemption_out = preemption_in
+     end if
+     nf90_open = nf_set_chunk_cache(size_out, nelems_out, preemption_out)
+     if (nf90_open .ne. nf90_noerr) return
+  end if
+
+  ! Do the open.
+  if(present(chunksize)) then
+     nf90_open = nf__open(path, mode, chunksize, ncid)
+  else
+     if (present(comm)) then
+        nf90_open = nf_open_par(path, mode, comm, info, ncid)
+     else
+        nf90_open = nf_open(path, mode, ncid)
+     end if
+  end if
+  if (nf90_open .ne. nf90_noerr) return
+
+  ! If settings were changed, reset chunk chache to original settings.
+  if (present(cache_size) .or. present(cache_nelems) .or. &
+       present(cache_preemption)) then
+     nf90_open = nf_set_chunk_cache(size_in, nelems_in, preemption_in)
+  end if
+
+end function nf90_open
+! -------
+function nf90_create(path, cmode, ncid, initialsize, chunksize, cache_size, &
+     cache_nelems, cache_preemption, comm, info)
+  implicit none
+  character (len = *), intent(in) :: path
+  integer, intent(in) :: cmode
+  integer, intent(out) :: ncid
+  integer, optional, intent(in) :: initialsize
+  integer, optional, intent(inout) :: chunksize
+  integer, optional, intent(in) :: cache_size, cache_nelems
+  integer, optional, intent(in) :: cache_preemption
+  integer, optional, intent(in) :: comm, info
+  integer :: size_in, nelems_in, preemption_in
+  integer :: size_out, nelems_out, preemption_out, ret
+  integer :: nf90_create
+  integer :: fileSize, chunk
+  integer :: x
+
+  ! Just ignore options netCDF-3 options for netCDF-4 files, or
+  ! netCDF-4 options, for netCDF-3 files, so that the same user code
+  ! can work for both cases.
+
+  ! If using parallel, but comm and info must be provided.
+  if (present(comm) .and. .not. present(info)) then
+     nf90_create = NF90_EINVAL;
+     return
+  end if
+
+  ! If the user specified chuck cache parameters, use them. But user
+  ! may have specified one, two, or three settings. Leave the others
+  ! unchanged.
+  if (present(cache_size) .or. present(cache_nelems) .or. &
+       present(cache_preemption)) then
+     nf90_create = nf_get_chunk_cache(size_in, nelems_in, preemption_in)
+     if (nf90_create .ne. nf90_noerr) return
+     if (present(cache_size)) then
+        size_out = cache_size
+     else
+        size_out = size_in
+     end if
+     if (present(cache_nelems)) then
+        nelems_out = cache_nelems
+     else
+        nelems_out = nelems_in
+     end if
+     if (present(cache_preemption)) then
+        preemption_out = cache_preemption
+     else
+        preemption_out = preemption_in
+     end if
+     nf90_create = nf_set_chunk_cache(size_out, nelems_out, preemption_out)
+     if (nf90_create .ne. nf90_noerr) return
+  end if
+
+  ! Do the file create.
+  if(.not. (present(initialsize) .or. present(chunksize)) ) then
+     if (present(comm)) then
+        nf90_create = nf_create_par(path, cmode, comm, info, ncid)
+     else
+        nf90_create = nf_create(path, cmode, ncid)
+     end if
+  else
+     ! Default values per man page
+     filesize = 0; chunk = nf90_sizehint_default
+     if(present(initialsize)) filesize = initialsize
+     if(present(chunksize  )) chunk    = chunksize
+     nf90_create = nf__create(path, cmode, filesize, chunk, ncid)
+     ! Pass back the value actually used
+     if(present(chunksize  )) chunksize = chunk
+  end if
+  if (nf90_create .ne. nf90_noerr) return
+
+  ! If settings were changed, reset chunk chache to original settings.
+  if (present(cache_size) .or. present(cache_nelems) .or. &
+       present(cache_preemption)) then
+     nf90_create = nf_set_chunk_cache(size_in, nelems_in, preemption_in)
+  end if
+
+
+end function nf90_create
diff --git a/fortran/netcdf4_func.f90 b/fortran/netcdf4_func.f90
new file mode 100644
index 0000000..4da5f46
--- /dev/null
+++ b/fortran/netcdf4_func.f90
@@ -0,0 +1,781 @@
+  !
+  ! NetCDF-4 extra routines:
+  !
+  ! -----------
+  function nf90_create_par(path, cmode, comm, info, ncid, cache_size, &
+       cache_nelems, cache_preemption)
+    character (len = *), intent(in) :: path
+    integer, intent(in) :: cmode
+    integer, intent(in) :: comm
+    integer, intent(in) :: info
+    integer, intent(out) :: ncid
+    integer, optional, intent(in) :: cache_size, cache_nelems
+    real, optional, intent(in) :: cache_preemption
+    integer :: size_in, nelems_in, preemption_in
+    integer :: size_out, nelems_out, preemption_out, ret
+    integer :: nf90_create_par
+    
+    ! If the user specified chuck cache parameters, use them. But user
+    ! may have specified one, two, or three settings. Leave the others
+    ! unchanged.
+    if (present(cache_size) .or. present(cache_nelems) .or. &
+         present(cache_preemption)) then
+       ret = nf_get_chunk_cache(size_in, nelems_in, preemption_in)
+       if (ret .ne. nf90_noerr) then
+          nf90_create_par = ret
+          return
+       end if
+       if (present(cache_size)) then
+          size_out = cache_size
+       else
+          size_out = size_in
+       end if
+       if (present(cache_nelems)) then
+          nelems_out = cache_nelems
+       else
+          nelems_out = nelems_in
+       end if
+       if (present(cache_preemption)) then
+          preemption_out = cache_preemption
+       else
+          preemption_out = preemption_in
+       end if
+       nf90_create_par = nf_set_chunk_cache(size_out, nelems_out, preemption_out)
+       if (nf90_create_par .ne. nf90_noerr) return
+    end if 
+
+    nf90_create_par = nf_create_par(path, cmode, comm, info, ncid)
+  end function nf90_create_par
+  ! -----------
+  function nf90_open_par(path, cmode, comm, info, ncid, cache_size, &
+       cache_nelems, cache_preemption)
+    character (len = *), intent(in) :: path
+    integer, intent(in) :: cmode
+    integer, intent(in) :: comm
+    integer, intent(in) :: info
+    integer, intent(out) :: ncid
+    integer, optional, intent(in) :: cache_size, cache_nelems
+    real, optional, intent(in) :: cache_preemption
+    integer :: size_in, nelems_in, preemption_in
+    integer :: size_out, nelems_out, preemption_out, ret
+    integer :: nf90_open_par
+  
+    ! If the user specified chuck cache parameters, use them. But user
+    ! may have specified one, two, or three settings. Leave the others
+    ! unchanged.
+    if (present(cache_size) .or. present(cache_nelems) .or. &
+         present(cache_preemption)) then
+       ret = nf_get_chunk_cache(size_in, nelems_in, preemption_in)
+       if (ret .ne. nf90_noerr) then
+          nf90_open_par = ret
+          return
+       end if
+       if (present(cache_size)) then
+          size_out = cache_size
+       else
+          size_out = size_in
+       end if
+       if (present(cache_nelems)) then
+          nelems_out = cache_nelems
+       else
+          nelems_out = nelems_in
+       end if
+       if (present(cache_preemption)) then
+          preemption_out = cache_preemption
+       else
+          preemption_out = preemption_in
+       end if
+       nf90_open_par = nf_set_chunk_cache(size_out, nelems_out, preemption_out)
+       if (nf90_open_par .ne. nf90_noerr) return
+    end if 
+
+    nf90_open_par = nf_open_par(path, cmode, comm, info, ncid)
+  end function nf90_open_par
+  ! -----------
+  function nf90_var_par_access(ncid, varid, access)
+    integer, intent(in) :: ncid
+    integer, intent(in) :: varid
+    integer, intent(in) :: access
+    integer :: nf90_var_par_access
+  
+    nf90_var_par_access = nf_var_par_access(ncid, varid, access)
+  end function nf90_var_par_access
+  ! -----------
+  function nf90_inq_ncid(ncid, name, grp_ncid)
+    integer, intent(in) :: ncid
+    character (len = *), intent(in) :: name
+    integer, intent(out) :: grp_ncid
+    integer :: nf90_inq_ncid
+  
+    nf90_inq_ncid = nf_inq_ncid(ncid, name, grp_ncid)
+  end function nf90_inq_ncid
+  ! -----------
+  function nf90_inq_grps(ncid, numgrps, ncids)
+    integer, intent(in) :: ncid
+    integer, intent(out) :: numgrps
+    integer, dimension(:), intent(out) :: ncids
+    integer :: nf90_inq_grps
+  
+    nf90_inq_grps = nf_inq_grps(ncid, numgrps, ncids)
+  end function nf90_inq_grps
+  ! -----------
+  function nf90_inq_grpname_len(ncid, len)
+    integer, intent(in) :: ncid
+    integer, intent(out) :: len
+    integer :: nf90_inq_grpname_len
+  
+    nf90_inq_grpname_len = nf_inq_grpname_len(ncid, len)
+  end function nf90_inq_grpname_len
+  ! -----------
+  function nf90_inq_grp_ncid(ncid, name, grpid)
+    integer, intent(in) :: ncid
+    character (len = *), intent(in) :: name
+    integer, intent(out) :: grpid
+    integer :: nf90_inq_grp_ncid
+  
+    nf90_inq_grp_ncid = nf_inq_grp_ncid(ncid, name, grpid)
+  end function nf90_inq_grp_ncid
+  ! -----------
+  function nf90_inq_grp_full_ncid(ncid, full_name, grpid)
+    integer, intent(in) :: ncid
+    character (len = *), intent(in) :: full_name
+    integer, intent(out) :: grpid
+    integer :: nf90_inq_grp_full_ncid
+  
+    nf90_inq_grp_full_ncid = nf_inq_grp_full_ncid(ncid, full_name, grpid)
+  end function nf90_inq_grp_full_ncid
+  ! -----------
+  function nf90_inq_grp_parent(ncid, parent_ncid)
+    integer, intent(in) :: ncid
+    integer, intent(out) :: parent_ncid
+    integer :: nf90_inq_grp_parent
+  
+    nf90_inq_grp_parent = nf_inq_grp_parent(ncid, parent_ncid)
+  end function nf90_inq_grp_parent
+  ! -----------
+  function nf90_inq_grpname(ncid, name)
+    integer, intent(in) :: ncid
+    character (len = *), intent(out) :: name
+    integer :: nf90_inq_grpname
+  
+    nf90_inq_grpname = nf_inq_grpname(ncid, name)
+  end function nf90_inq_grpname
+  ! -----------
+  function nf90_inq_grpname_full(ncid, len, name)
+    integer, intent(in) :: ncid
+    integer, intent(out) :: len
+    character (len = *), intent(out) :: name
+    integer :: nf90_inq_grpname_full
+  
+    nf90_inq_grpname_full = nf_inq_grpname_full(ncid, len, name)
+  end function nf90_inq_grpname_full
+  ! -----------
+  function nf90_inq_varids(ncid, nvars, varids)
+    integer, intent(in) :: ncid
+    integer, intent(out) :: nvars
+    integer, dimension(:), intent(out) :: varids
+    integer :: nf90_inq_varids
+  
+    nf90_inq_varids = nf_inq_varids(ncid, nvars, varids)
+  end function nf90_inq_varids
+  ! -----------
+  function nf90_inq_dimids(ncid, ndims, dimids, include_parents)
+    integer, intent(in) :: ncid
+    integer, intent(out) :: ndims
+    integer, dimension(:), intent(out) :: dimids
+    integer, intent(out) :: include_parents
+    integer :: nf90_inq_dimids
+  
+    nf90_inq_dimids = nf_inq_dimids(ncid, ndims, dimids, include_parents)
+  end function nf90_inq_dimids
+  ! -----------
+  function nf90_inq_typeids(ncid, ntypes, typeids)
+    integer, intent(in) :: ncid
+    integer, optional, intent(out) :: ntypes
+    integer, dimension(:), optional, intent(out) :: typeids
+    integer :: nf90_inq_typeids
+    
+    nf90_inq_typeids = nf_inq_typeids(ncid, ntypes, typeids)
+
+  end function nf90_inq_typeids
+  ! -----------
+  function nf90_inq_typeid(ncid, name, typeid)
+    integer, intent(in) :: ncid
+    character (len = *), intent(in) :: name
+    integer, optional, intent(out) :: typeid
+    integer :: nf90_inq_typeid
+    
+    nf90_inq_typeid = nf_inq_typeid(ncid, name, typeid)
+
+  end function nf90_inq_typeid
+  ! -----------
+  function nf90_def_grp(parent_ncid, name, new_ncid)
+    integer, intent(in) :: parent_ncid
+    character (len = *), intent(in) :: name
+    integer, intent(out) :: new_ncid
+    integer :: nf90_def_grp
+  
+    nf90_def_grp = nf_def_grp(parent_ncid, name, new_ncid)
+  end function nf90_def_grp
+  ! -----------
+  function nf90_rename_grp(grpid, name)
+    integer, intent(in) :: grpid
+    character (len = *), intent(in) :: name
+    integer :: nf90_rename_grp
+
+    nf90_rename_grp = nf_rename_grp(grpid, name)
+  end function nf90_rename_grp
+  ! -----------
+  function nf90_def_compound(ncid, size, name, typeid)
+    integer, intent(in) :: ncid
+    integer, intent(in) :: size
+    character (len = *), intent(in) :: name
+    integer, intent(out) :: typeid
+    integer :: nf90_def_compound
+  
+    nf90_def_compound = nf_def_compound(ncid, size, name, typeid)
+  end function nf90_def_compound
+  ! -----------
+  function nf90_insert_compound(ncid, xtype, name, offset, field_typeid)
+    integer, intent(in) :: ncid
+    integer, intent(in) :: xtype
+    character (len = *), intent(in) :: name
+    integer, intent(in) :: offset
+    integer, intent(in) :: field_typeid
+    integer :: nf90_insert_compound
+  
+    nf90_insert_compound = nf_insert_compound(ncid, xtype, name, offset, field_typeid)
+  end function nf90_insert_compound
+  ! -----------
+  function nf90_insert_array_compound(ncid, xtype, name, offset, field_typeid, &
+       ndims, dim_sizes)
+    integer, intent(in) :: ncid
+    integer, intent(in) :: xtype
+    character (len = *), intent(in) :: name
+    integer, intent(in) :: offset
+    integer, intent(in) :: field_typeid
+    integer, intent(in) :: ndims
+    integer, intent(in) :: dim_sizes
+    integer :: nf90_insert_array_compound
+  
+    nf90_insert_array_compound = nf_insert_array_compound(ncid, xtype, name, &
+         offset, field_typeid, ndims, dim_sizes)
+  end function nf90_insert_array_compound
+  ! -----------
+  function nf90_inq_type(ncid, xtype, name, size)
+    integer, intent(in) :: ncid
+    integer, intent(in) :: xtype
+    character (len = *), intent(out) :: name
+    integer, intent(out) :: size
+    integer :: nf90_inq_type
+  
+    nf90_inq_type = nf_inq_type(ncid, xtype, name, size)
+  end function nf90_inq_type
+  ! -----------
+  function nf90_inq_compound(ncid, xtype, name, size, nfields)
+    integer, intent(in) :: ncid
+    integer, intent(in) :: xtype
+    character (len = *), intent(out) :: name
+    integer, intent(out) :: size
+    integer, intent(out) :: nfields
+    integer :: nf90_inq_compound
+  
+    nf90_inq_compound = nf_inq_compound(ncid, xtype, name, size, nfields)
+  end function nf90_inq_compound
+  ! -----------
+  function nf90_inq_compound_name(ncid, xtype, name)
+    integer, intent(in) :: ncid
+    integer, intent(in) :: xtype
+    character (len = *), intent(out) :: name
+    integer :: nf90_inq_compound_name
+  
+    nf90_inq_compound_name = nf_inq_compound_name(ncid, xtype, name)
+  end function nf90_inq_compound_name
+  ! -----------
+  function nf90_inq_compound_size(ncid, xtype, size)
+    integer, intent(in) :: ncid
+    integer, intent(in) :: xtype
+    integer, intent(out) :: size
+    integer :: nf90_inq_compound_size
+  
+    nf90_inq_compound_size = nf_inq_compound_size(ncid, xtype, size)
+  end function nf90_inq_compound_size
+  ! -----------
+  function nf90_inq_compound_nfields(ncid, xtype, nfields)
+    integer, intent(in) :: ncid
+    integer, intent(in) :: xtype
+    integer, intent(out) :: nfields
+    integer :: nf90_inq_compound_nfields
+  
+    nf90_inq_compound_nfields = nf_inq_compound_nfields(ncid, xtype, nfields)
+  end function nf90_inq_compound_nfields
+  ! -----------
+  function nf90_inq_compound_field(ncid, xtype, fieldid, name, offset, &
+       field_typeid, ndims, dim_sizes)
+    integer, intent(in) :: ncid
+    integer, intent(in) :: xtype
+    integer, intent(in) :: fieldid
+    character (len = *), intent(out) :: name
+    integer, intent(out) :: offset
+    integer, intent(out) :: field_typeid
+    integer, intent(out) :: ndims
+    integer, intent(out) :: dim_sizes
+    integer :: nf90_inq_compound_field
+  
+    nf90_inq_compound_field = nf_inq_compound_field(ncid, xtype, fieldid, name, offset, &
+       field_typeid, ndims, dim_sizes)
+  end function nf90_inq_compound_field
+  ! -----------
+  function nf90_inq_compound_fieldname(ncid, xtype, fieldid, name)
+    integer, intent(in) :: ncid
+    integer, intent(in) :: xtype
+    integer, intent(in) :: fieldid
+    character (len = *), intent(out) :: name
+    integer :: nf90_inq_compound_fieldname
+  
+    nf90_inq_compound_fieldname = nf_inq_compound_fieldname(ncid, xtype, fieldid, name)
+  end function nf90_inq_compound_fieldname
+  ! -----------
+  function nf90_inq_compound_fieldindex(ncid, xtype, name, fieldid)
+    integer, intent(in) :: ncid
+    integer, intent(in) :: xtype
+    character (len = *), intent(in) :: name
+    integer, intent(out) :: fieldid
+    integer :: nf90_inq_compound_fieldindex
+  
+    nf90_inq_compound_fieldindex = nf_inq_compound_fieldindex(ncid, xtype, name, fieldid)
+  end function nf90_inq_compound_fieldindex
+  ! -----------
+  function nf90_inq_compound_fieldoffset(ncid, xtype, fieldid, offset)
+    integer, intent(in) :: ncid
+    integer, intent(in) :: xtype
+    integer, intent(in) :: fieldid
+    integer, intent(out) :: offset
+    integer :: nf90_inq_compound_fieldoffset
+  
+    nf90_inq_compound_fieldoffset = nf_inq_compound_fieldoffset(ncid, xtype, fieldid, offset)
+  end function nf90_inq_compound_fieldoffset
+  ! -----------
+  function nf90_inq_compound_fieldtype(ncid, xtype, fieldid, field_typeid)
+    integer, intent(in) :: ncid
+    integer, intent(in) :: xtype
+    integer, intent(in) :: fieldid
+    integer, intent(out) :: field_typeid
+    integer :: nf90_inq_compound_fieldtype
+  
+    nf90_inq_compound_fieldtype = nf_inq_compound_fieldtype(ncid, xtype, fieldid, field_typeid)
+  end function nf90_inq_compound_fieldtype
+  ! -----------
+  function nf90_inq_compound_fieldndims(ncid, xtype, fieldid, ndims)
+    integer, intent(in) :: ncid
+    integer, intent(in) :: xtype
+    integer, intent(in) :: fieldid
+    integer, intent(out) :: ndims
+    integer :: nf90_inq_compound_fieldndims
+  
+    nf90_inq_compound_fieldndims = nf_inq_compound_fieldndims(ncid, xtype, fieldid, ndims)
+  end function nf90_inq_compound_fieldndims
+  ! -----------
+  function nf90_inq_cmp_fielddim_sizes(ncid, xtype, fieldid, dim_sizes)
+    integer, intent(in) :: ncid
+    integer, intent(in) :: xtype
+    integer, intent(in) :: fieldid
+    integer, intent(out) :: dim_sizes
+    integer :: nf90_inq_cmp_fielddim_sizes
+  
+    nf90_inq_cmp_fielddim_sizes = nf_inq_compound_fielddim_sizes(ncid, xtype, fieldid, dim_sizes)
+  end function nf90_inq_cmp_fielddim_sizes
+  ! -----------
+  function nf90_def_vlen(ncid, name, base_typeid, xtypeid)
+    integer, intent(in) :: ncid
+    character (len = *), intent(in) :: name
+    integer, intent(in) :: base_typeid
+    integer, intent(out) :: xtypeid
+    integer :: nf90_def_vlen
+  
+    nf90_def_vlen = nf_def_vlen(ncid, name, base_typeid, xtypeid)
+  end function nf90_def_vlen
+  ! -----------
+  function nf90_inq_vlen(ncid, xtype, name, datum_size, base_nc_type)
+    integer, intent(in) :: ncid
+    integer, intent(in) :: xtype
+    character (len = *), intent(out) :: name
+    integer, intent(out) :: datum_size
+    integer, intent(out) :: base_nc_type
+    integer :: nf90_inq_vlen
+  
+    nf90_inq_vlen = nf_inq_vlen(ncid, xtype, name, datum_size, base_nc_type)
+  end function nf90_inq_vlen
+  ! -----------
+  function nf90_free_vlen(vl)
+    character (len = *), intent(in) :: vl
+    integer :: nf90_free_vlen
+  
+    nf90_free_vlen = nf_free_vlen(vl)
+  end function nf90_free_vlen
+!   ! -----------
+  function nf90_def_enum(ncid, base_typeid, name, typeid)
+    integer, intent(in) :: ncid
+    integer, intent(in) :: base_typeid
+    character (len = *), intent(in) :: name
+    integer, intent(out) :: typeid
+    integer :: nf90_def_enum
+  
+    nf90_def_enum = nf_def_enum(ncid, base_typeid, name, typeid)
+  end function nf90_def_enum
+!   ! -----------
+  function nf90_inq_user_type(ncid, xtype, name, size, base_typeid, nfields, class)
+    integer, intent(in) :: ncid
+    integer, intent(in) :: xtype
+    character (len = *), intent(out) :: name
+    integer, intent(out) :: size
+    integer, intent(out) :: base_typeid
+    integer, intent(out) :: nfields
+    integer, intent(out) :: class
+    integer :: nf90_inq_user_type
+  
+    nf90_inq_user_type = nf_inq_user_type(ncid, xtype, name, size, base_typeid, nfields, class)
+  end function nf90_inq_user_type
+  ! -----------
+  function nf90_insert_enum(ncid, xtype, name, value)
+    integer, intent(in) :: ncid
+    integer, intent(in) :: xtype
+    character (len = *), intent(in) :: name
+    integer, intent(in) :: value
+    integer :: nf90_insert_enum
+  
+    nf90_insert_enum = nf_insert_enum(ncid, xtype, name, value)
+  end function nf90_insert_enum
+  ! -----------
+  function nf90_inq_enum(ncid, xtype, name, base_nc_type, base_size, num_members)
+    integer, intent(in) :: ncid
+    integer, intent(in) :: xtype
+    character (len = *), intent(out) :: name
+    integer, intent(out) :: base_nc_type
+    integer, intent(out) :: base_size
+    integer, intent(out) :: num_members
+    integer :: nf90_inq_enum
+  
+    nf90_inq_enum = nf_inq_enum(ncid, xtype, name, base_nc_type, base_size, num_members)
+  end function nf90_inq_enum
+  ! -----------
+  function nf90_inq_enum_member(ncid, xtype, idx, name, value)
+    integer, intent(in) :: ncid
+    integer, intent(in) :: xtype
+    integer, intent(in) :: idx
+    character (len = *), intent(out) :: name
+    integer, intent(in) :: value
+    integer :: nf90_inq_enum_member
+  
+    nf90_inq_enum_member = nf_inq_enum_member(ncid, xtype, idx, name, value)
+  end function nf90_inq_enum_member
+  ! -----------
+  function nf90_inq_enum_ident(ncid, xtype, value, idx)
+    integer, intent(in) :: ncid
+    integer, intent(in) :: xtype
+    integer, intent(in) :: value
+    integer, intent(out) :: idx
+    integer :: nf90_inq_enum_ident
+  
+    nf90_inq_enum_ident = nf_inq_enum_ident(ncid, xtype, value, idx)
+  end function nf90_inq_enum_ident
+  ! -----------
+  function nf90_def_opaque(ncid, size, name, xtype)
+    integer, intent(in) :: ncid
+    integer, intent(in) :: size
+    character (len = *), intent(in) :: name
+    integer, intent(out) :: xtype
+    integer :: nf90_def_opaque
+  
+    nf90_def_opaque = nf_def_opaque(ncid, size, name, xtype)
+  end function nf90_def_opaque
+  ! -----------
+  function nf90_inq_opaque(ncid, xtype, name, size)
+    integer, intent(in) :: ncid
+    integer, intent(in) :: xtype
+    character (len = *), intent(out) :: name
+    integer, intent(out) :: size
+    integer :: nf90_inq_opaque
+  
+    nf90_inq_opaque = nf_inq_opaque(ncid, xtype, name, size)
+  end function nf90_inq_opaque
+  ! -----------
+  function nf90_def_var_chunking(ncid, varid, contiguous, chunksizes)
+    integer, intent(in) :: ncid
+    integer, intent(in) :: varid
+    integer, intent(in) :: contiguous
+    integer, dimension(:), intent(in) :: chunksizes
+    integer :: nf90_def_var_chunking
+  
+    nf90_def_var_chunking = nf_def_var_chunking(ncid, varid, contiguous, chunksizes)
+  end function nf90_def_var_chunking
+  ! -----------
+  function nf90_def_var_deflate(ncid, varid, shuffle, deflate, deflate_level)
+    integer, intent(in) :: ncid
+    integer, intent(in) :: varid
+    integer, intent(in) :: shuffle
+    integer, intent(in) :: deflate
+    integer, intent(in) :: deflate_level
+    integer :: nf90_def_var_deflate
+  
+    nf90_def_var_deflate = nf_def_var_deflate(ncid, varid, shuffle, deflate, deflate_level)
+  end function nf90_def_var_deflate
+  ! -----------
+  function nf90_def_var_fletcher32(ncid, varid, fletcher32)
+    integer, intent(in) :: ncid
+    integer, intent(in) :: varid
+    integer, intent(in) :: fletcher32
+    integer :: nf90_def_var_fletcher32
+  
+    nf90_def_var_fletcher32 = nf_def_var_fletcher32(ncid, varid, fletcher32)
+  end function nf90_def_var_fletcher32
+  ! -----------
+  function nf90_inq_var_chunking(ncid, varid, contiguous, chunksizes)
+    integer, intent(in) :: ncid
+    integer, intent(in) :: varid
+    integer, intent(out) :: contiguous
+    integer, dimension(:), intent(out) :: chunksizes
+    integer :: nf90_inq_var_chunking
+  
+    nf90_inq_var_chunking = nf_inq_var_chunking(ncid, varid, contiguous, chunksizes)
+  end function nf90_inq_var_chunking
+  ! -----------
+  function nf90_inq_var_deflate(ncid, varid, shuffle, deflate, deflate_level)
+    integer, intent(in) :: ncid
+    integer, intent(in) :: varid
+    integer, intent(out) :: shuffle
+    integer, intent(out) :: deflate
+    integer, intent(out) :: deflate_level
+    integer :: nf90_inq_var_deflate
+  
+    nf90_inq_var_deflate = nf_inq_var_deflate(ncid, varid, shuffle, deflate, deflate_level)
+  end function nf90_inq_var_deflate
+  ! -----------
+  function nf90_inq_var_fletcher32(ncid, varid, fletcher32)
+    integer, intent(in) :: ncid
+    integer, intent(in) :: varid
+    integer, intent(out) :: fletcher32
+    integer :: nf90_inq_var_fletcher32
+  
+    nf90_inq_var_fletcher32 = nf_inq_var_fletcher32(ncid, varid, fletcher32)
+  end function nf90_inq_var_fletcher32
+  ! -----------
+  function nf90_def_var_endian(ncid, varid, endian)
+    integer, intent(in) :: ncid
+    integer, intent(in) :: varid
+    integer, intent(in) :: endian
+    integer :: nf90_def_var_endian
+  
+    nf90_def_var_endian = nf_def_var_endian(ncid, varid, endian)
+  end function nf90_def_var_endian
+  ! -----------
+  function nf90_inq_var_endian(ncid, varid, endian)
+    integer, intent(in) :: ncid
+    integer, intent(in) :: varid
+    integer, intent(out) :: endian
+    integer :: nf90_inq_var_endian
+  
+    nf90_inq_var_endian = nf_inq_var_endian(ncid, varid, endian)
+  end function nf90_inq_var_endian
+  ! -----------
+!  function nf90_def_var_fill(ncid, varid, no_fill, fill)
+!    integer, intent(in) :: ncid
+!    integer, intent(in) :: varid
+!    integer, intent(in) :: no_fill
+!    integer, intent(in) :: fill
+!    integer :: nf90_def_var_fill
+  
+!    nf90_def_var_fill = nf_def_var_fill(ncid, varid, no_fill, fill)
+!  end function nf90_def_var_fill
+  ! -----------
+!  function nf90_inq_var_fill(ncid, varid, no_fill, fill)
+!    integer, intent(in) :: ncid
+!    integer, intent(in) :: varid
+!    integer, intent(out) :: no_fill
+!    integer, intent(out) :: fill
+!    integer :: nf90_inq_var_fill
+  
+!    nf90_inq_var_fill = nf_inq_var_fill(ncid, varid, no_fill, fill)
+!  end function nf90_inq_var_fill
+
+  function nf90_def_var_fill_OneByteInt(ncid, varid, no_fill, fill)
+    integer, intent(in)                  :: ncid
+    integer, intent(in)                  :: varid
+    integer, intent(in)                  :: no_fill
+    integer(kind=OneByteInt), intent(in) :: fill
+    integer :: nf90_def_var_fill_OneByteInt
+  
+    nf90_def_var_fill_OneByteInt = nf_def_var_fill(ncid, varid, no_fill, fill)
+  end function nf90_def_var_fill_OneByteInt
+  ! -----------
+  function nf90_def_var_fill_TwoByteInt(ncid, varid, no_fill, fill)
+    integer, intent(in)                  :: ncid
+    integer, intent(in)                  :: varid
+    integer, intent(in)                  :: no_fill
+    integer(kind=TwoByteInt), intent(in) :: fill
+    integer :: nf90_def_var_fill_TwoByteInt
+  
+    nf90_def_var_fill_TwoByteInt = nf_def_var_fill(ncid, varid, no_fill, fill)
+  end function nf90_def_var_fill_TwoByteInt
+  ! -----------
+  function nf90_def_var_fill_FourByteInt(ncid, varid, no_fill, fill)
+    integer, intent(in)                  :: ncid
+    integer, intent(in)                  :: varid
+    integer, intent(in)                  :: no_fill
+    integer(kind=FourByteInt), intent(in) :: fill
+    integer :: nf90_def_var_fill_FourByteInt
+  
+    nf90_def_var_fill_FourByteInt = nf_def_var_fill(ncid, varid, no_fill, fill)
+  end function nf90_def_var_fill_FourByteInt
+  ! -----------
+  function nf90_def_var_fill_EightByteInt(ncid, varid, no_fill, fill)
+    integer, intent(in)                  :: ncid
+    integer, intent(in)                  :: varid
+    integer, intent(in)                  :: no_fill
+    integer(kind=EightByteInt), intent(in) :: fill
+    integer :: nf90_def_var_fill_EightByteInt
+  
+    nf90_def_var_fill_EightByteInt = nf_def_var_fill(ncid, varid, no_fill, fill)
+  end function nf90_def_var_fill_EightByteInt
+  ! -----------
+  function nf90_def_var_fill_FourByteReal(ncid, varid, no_fill, fill)
+    integer, intent(in)                  :: ncid
+    integer, intent(in)                  :: varid
+    integer, intent(in)                  :: no_fill
+    real(kind=FourByteReal), intent(in) :: fill
+    integer :: nf90_def_var_fill_FourByteReal
+  
+    nf90_def_var_fill_FourByteReal = nf_def_var_fill(ncid, varid, no_fill, fill)
+  end function nf90_def_var_fill_FourByteReal
+  ! -----------
+  function nf90_def_var_fill_EightByteReal(ncid, varid, no_fill, fill)
+    integer, intent(in)                  :: ncid
+    integer, intent(in)                  :: varid
+    integer, intent(in)                  :: no_fill
+    real(kind=EightByteReal), intent(in) :: fill
+    integer :: nf90_def_var_fill_EightByteReal
+  
+    nf90_def_var_fill_EightByteReal = nf_def_var_fill(ncid, varid, no_fill, fill)
+  end function nf90_def_var_fill_EightByteReal
+  ! -----------
+  function nf90_inq_var_fill_OneByteInt(ncid, varid, no_fill, fill)
+    integer, intent(in)                     :: ncid
+    integer, intent(in)                     :: varid
+    integer, intent(inout)                  :: no_fill
+    integer(kind=OneByteInt), intent(inout) :: fill
+    integer :: nf90_inq_var_fill_OneByteInt
+  
+    nf90_inq_var_fill_OneByteInt = nf_inq_var_fill(ncid, varid, no_fill, fill)
+  end function nf90_inq_var_fill_OneByteInt
+  ! -----------
+  function nf90_inq_var_fill_TwoByteInt(ncid, varid, no_fill, fill)
+    integer, intent(in)                     :: ncid
+    integer, intent(in)                     :: varid
+    integer, intent(inout)                  :: no_fill
+    integer(kind=TwoByteInt), intent(inout) :: fill
+    integer :: nf90_inq_var_fill_TwoByteInt
+  
+    nf90_inq_var_fill_TwoByteInt = nf_inq_var_fill(ncid, varid, no_fill, fill)
+  end function nf90_inq_var_fill_TwoByteInt
+  ! -----------
+  function nf90_inq_var_fill_FourByteInt(ncid, varid, no_fill, fill)
+    integer, intent(in)                      :: ncid
+    integer, intent(in)                      :: varid
+    integer, intent(inout)                   :: no_fill
+    integer(kind=FourByteInt), intent(inout) :: fill
+    integer :: nf90_inq_var_fill_FourByteInt
+  
+    nf90_inq_var_fill_FourByteInt = nf_inq_var_fill(ncid, varid, no_fill, fill)
+  end function nf90_inq_var_fill_FourByteInt
+  ! -----------
+  function nf90_inq_var_fill_EightByteInt(ncid, varid, no_fill, fill)
+    integer, intent(in)                       :: ncid
+    integer, intent(in)                       :: varid
+    integer, intent(inout)                    :: no_fill
+    integer(kind=EightByteInt), intent(inout) :: fill
+    integer :: nf90_inq_var_fill_EightByteInt
+  
+    nf90_inq_var_fill_EightByteInt = nf_inq_var_fill(ncid, varid, no_fill, fill)
+  end function nf90_inq_var_fill_EightByteInt
+  ! -----------
+  function nf90_inq_var_fill_FourByteReal(ncid, varid, no_fill, fill)
+    integer, intent(in)                    :: ncid
+    integer, intent(in)                    :: varid
+    integer, intent(inout)                 :: no_fill
+    real(kind=FourByteReal), intent(inout) :: fill
+    integer :: nf90_inq_var_fill_FourByteReal
+  
+    nf90_inq_var_fill_FourByteReal = nf_inq_var_fill(ncid, varid, no_fill, fill)
+  end function nf90_inq_var_fill_FourByteReal
+  ! -----------
+  function nf90_inq_var_fill_EightByteReal(ncid, varid, no_fill, fill)
+    integer, intent(in)                        :: ncid
+    integer, intent(in)                        :: varid
+    integer, intent(inout)                     :: no_fill
+    real(kind=EightByteReal), intent(inout)    :: fill
+    integer :: nf90_inq_var_fill_EightByteReal
+  
+    nf90_inq_var_fill_EightByteReal = nf_inq_var_fill(ncid, varid, no_fill, fill)
+  end function nf90_inq_var_fill_EightByteReal
+  ! -----------
+  function nf90_put_att_any(ncid, varid, name, typeid, length, values)
+    integer,                          intent( in) :: ncid, varid
+    character(len = *),               intent( in) :: name
+    integer,                          intent( in) :: typeid, length
+    character(len = *),               intent( in) :: values
+    integer                                       :: nf90_put_att_any
+
+    nf90_put_att_any = nf_put_att(ncid, varid, name, typeid, length, values)
+  end function nf90_put_att_any
+  ! -----------
+  function nf90_get_att_any(ncid, varid, name, length, values)
+    integer,                          intent( in) :: ncid, varid
+    character(len = *),               intent( in) :: name
+    integer,                          intent( in) :: length
+    character(len = *),               intent( in) :: values
+    integer                                       :: nf90_get_att_any
+
+    nf90_get_att_any = nf_get_att(ncid, varid, name, values)
+  end function nf90_get_att_any
+  ! -----------
+   function nf90_put_var_any(ncid, varid, values, start, count, stride, map)
+     integer,                         intent( in) :: ncid, varid
+     character (len = *),             intent( in) :: values
+     integer, dimension(:), optional, intent( in) :: start, count, stride, map
+     integer                                      :: nf90_put_var_any
+
+     integer, dimension(nf90_max_var_dims) :: localStart, localCount, localStride
+ 
+     ! Set local arguments to default values
+     localStart (:)  = 1
+     localCount (1)  = len_trim(values); localCount (2:) = 1
+     localStride(:)  = 1
+          
+     if(present(start))  localStart (:size(start) ) = start(:)
+     if(present(count))  localCount (:size(count) ) = count(:)
+     if(present(stride)) localStride(:size(stride)) = stride(:)
+
+     nf90_put_var_any = nf_put_vars(ncid, varid, localStart, localCount, localStride, values)
+   end function nf90_put_var_any
+  ! -----------
+   function nf90_get_var_any(ncid, varid, values, start, count, stride, map)
+     integer,                         intent( in) :: ncid, varid
+     character (len = *),             intent(out) :: values
+     integer, dimension(:), optional, intent( in) :: start, count, stride, map
+     integer                                      :: nf90_get_var_any
+ 
+     integer, dimension(nf90_max_var_dims) :: textDimIDs
+     integer, dimension(nf90_max_var_dims) :: localStart, localCount, localStride 
+     integer                               :: stringLength
+ 
+     ! Set local arguments to default values
+     localStart (:)  = 1
+     localCount (1)  = len(values); localCount (2:) = 1
+     localStride(:)  = 1
+     
+     if(present(start))  localStart (:size(start) ) = start(:)
+     if(present(count))  localCount (:size(count) ) = count(:)
+     if(present(stride)) localStride(:size(stride)) = stride(:)
+
+     nf90_get_var_any = nf_get_vars(ncid, varid, localStart, localCount, localStride, values)
+   end function nf90_get_var_any
diff --git a/fortran/netcdf4_overloads.f90 b/fortran/netcdf4_overloads.f90
new file mode 100644
index 0000000..f2d41cf
--- /dev/null
+++ b/fortran/netcdf4_overloads.f90
@@ -0,0 +1,20 @@
+  ! Overload fill value functions
+
+  interface nf90_def_var_fill
+    module procedure nf90_def_var_fill_OneByteInt,   &
+                     nf90_def_var_fill_TwoByteInt,   &
+                     nf90_def_var_fill_FourByteInt,  &
+                     nf90_def_var_fill_EightByteInt, &
+                     nf90_def_var_fill_FourByteReal, &
+                     nf90_def_var_fill_EightByteReal
+   end interface
+
+  interface nf90_inq_var_fill
+    module procedure nf90_inq_var_fill_OneByteInt,   &
+                     nf90_inq_var_fill_TwoByteInt,   &
+                     nf90_inq_var_fill_FourByteInt,  &
+                     nf90_inq_var_fill_EightByteInt, &
+                     nf90_inq_var_fill_FourByteReal, &
+                     nf90_inq_var_fill_EightByteReal
+   end interface
+  
diff --git a/fortran/netcdf4_variables.f90 b/fortran/netcdf4_variables.f90
new file mode 100644
index 0000000..5e2de47
--- /dev/null
+++ b/fortran/netcdf4_variables.f90
@@ -0,0 +1,358 @@
+  ! ----- 
+  ! Variable definitions and inquiry
+  ! ----- 
+  function nf90_def_var_Scalar(ncid, name, xtype, varid)
+    integer, intent( in) :: ncid
+    character (len = *), intent( in) :: name
+    integer, intent(in) :: xtype
+    integer, intent(out) :: varid
+    integer :: nf90_def_var_Scalar
+    
+    ! Dummy - shouldn't get used
+    integer, dimension(1) :: dimids
+
+    ! These may not be used with scalars, but it causes an interface
+    ! violation if they are not optional arguments.
+    
+    nf90_def_var_Scalar = nf_def_var(ncid, name, xtype, 0, dimids, varid)
+  end function nf90_def_var_Scalar
+  ! ----- 
+  function nf90_def_var_oneDim(ncid, name, xtype, dimids, varid, contiguous, &
+       chunksizes, deflate_level, shuffle, fletcher32, endianness, &
+       cache_size, cache_nelems, cache_preemption)
+    integer, intent( in) :: ncid
+    character (len = *), intent( in) :: name
+    integer, intent(in) :: xtype
+    integer, intent(in) :: dimids
+    integer, intent(out) :: varid
+    logical, optional, intent(in) :: contiguous
+    integer, optional, intent(in) :: chunksizes
+    integer, optional, intent(in) :: deflate_level
+    logical, optional, intent(in) :: shuffle, fletcher32
+    integer, optional, intent(in) :: endianness
+    integer, optional, intent(in) :: cache_size, cache_nelems, cache_preemption
+    integer :: nf90_def_var_oneDim
+    
+    integer, dimension(1) :: dimidsA, chunksizes1
+    integer :: size1 = -1, nelems1 = -1, preemption1 = -1
+    integer :: contiguous1
+
+    ! Put this int into an array, where all decent folk keep ids.
+    dimidsA(1) = dimids
+
+    ! This is forbidden! Don't even think about it.
+    if (present(contiguous)) then
+       if (contiguous .and. present(chunksizes)) then
+          nf90_def_var_oneDim = nf90_einval
+          return
+       end if
+    end if
+    if (present(contiguous)) then
+       if (.not. contiguous .and. .not. present(chunksizes)) then
+          nf90_def_var_oneDim = nf90_einval
+          return
+       end if
+    end if
+    
+
+    ! Define the variable. 
+    nf90_def_var_oneDim = nf_def_var(ncid, name, xtype, 1, dimidsA, varid)
+    if (nf90_def_var_oneDim .ne. nf90_noerr) return
+
+    ! Handle chunksizes and contiguous.
+    if (present(chunksizes) .or. present(contiguous)) then
+       if (present(contiguous)) then
+          if (contiguous) then
+             contiguous1 = nf90_contiguous
+          else
+             contiguous1 = nf90_notcontiguous
+          endif
+       endif
+       if (present(chunksizes)) then
+          contiguous1 = 0
+          chunksizes1(1) = chunksizes
+       endif
+       nf90_def_var_oneDim = nf_def_var_chunking(ncid, varid, contiguous1, chunksizes1)       
+    endif
+    if (present(contiguous)) then
+       if (contiguous) then
+          nf90_def_var_oneDim = nf_def_var_chunking(ncid, varid, 1, 0)       
+       endif
+    endif
+    if (nf90_def_var_oneDim .ne. nf90_noerr) return
+    
+    ! Handle deflate and shuffle.
+    if (present(deflate_level)) then
+       if (deflate_level .gt. 0) then
+          if (present(shuffle)) then
+             if (shuffle) then
+                nf90_def_var_oneDim = nf_def_var_deflate(ncid, varid, 1, 1, deflate_level)       
+             else
+                nf90_def_var_oneDim = nf_def_var_deflate(ncid, varid, 0, 1, deflate_level)       
+             end if
+             if (nf90_def_var_oneDim .ne. nf90_noerr) return
+          end if
+       end if
+    endif
+
+    ! Handle fletcher32.
+    if (present(fletcher32)) then
+       if (fletcher32) then
+          nf90_def_var_oneDim = nf_def_var_fletcher32(ncid, varid, 1)       
+          if (nf90_def_var_oneDim .ne. nf90_noerr) return
+       endif
+    endif
+
+    ! Handle endianness.
+    if (present(endianness)) then
+       nf90_def_var_oneDim = nf_def_var_endian(ncid, varid, endianness)       
+       if (nf90_def_var_oneDim .ne. nf90_noerr) return
+    endif
+
+    ! Set the cache if the user wants to.
+    if (present(cache_size) .or. present(cache_nelems) .or. &
+         present(cache_preemption)) then
+       ! Negative values mean leave it alone.
+       if (present(cache_size)) size1 = cache_size
+       if (present(cache_nelems)) nelems1 = cache_nelems
+       if (present(cache_preemption)) preemption1 = cache_preemption
+       
+       nf90_def_var_oneDim = nf_set_var_chunk_cache(ncid, varid, &
+            size1, nelems1, preemption1)
+       if (nf90_def_var_oneDim .ne. nf90_noerr) return
+    endif
+
+  end function nf90_def_var_oneDim
+  ! ----- 
+  function nf90_def_var_ManyDims(ncid, name, xtype, dimids, varid, contiguous, &
+       chunksizes, deflate_level, shuffle, fletcher32, endianness, cache_size, &
+       cache_nelems, cache_preemption)
+    integer, intent(in) :: ncid
+    character (len = *), intent(in) :: name
+    integer, intent( in) :: xtype
+    integer, dimension(:), intent(in) :: dimids
+    integer, intent(out) :: varid
+    logical, optional, intent(in) :: contiguous
+    integer, optional, dimension(:), intent(in) :: chunksizes
+    integer, optional, intent(in) :: deflate_level
+    logical, optional, intent(in) :: shuffle, fletcher32
+    integer, optional, intent(in) :: endianness
+    integer, optional, intent(in) :: cache_size, cache_nelems, cache_preemption
+    integer :: nf90_def_var_ManyDims
+
+    ! Local variables.
+    integer :: contiguous1, d
+    integer :: size1 = -1, nelems1 = -1, preemption1 = -1
+    integer, dimension(nf90_max_dims) :: chunksizes1
+
+    ! This is forbidden!
+    if (present(contiguous)) then
+       if (contiguous .and. present(chunksizes)) then
+          nf90_def_var_ManyDims = nf90_einval
+          return
+       end if
+    end if
+    if (present(contiguous)) then
+       if (.not. contiguous .and. .not. present(chunksizes)) then
+          nf90_def_var_ManyDims = nf90_einval
+          return
+       endif
+    end if
+
+    ! Be nice and check array size.
+    if (present(chunksizes)) then
+       if (size(chunksizes) .ne. size(dimids)) then
+          nf90_def_var_ManyDims = nf90_einval
+          return
+       end if
+    end if
+    
+    ! Define the variable. 
+    nf90_def_var_ManyDims = nf_def_var(ncid, name, xtype, size(dimids), dimids, varid)
+    if (nf90_def_var_ManyDims .ne. nf90_noerr) return
+
+    ! Handle chunksizes and contiguous.
+    if (present(chunksizes) .or. present(contiguous)) then
+       if (present(contiguous)) then
+          if (contiguous) then
+             contiguous1 = nf90_contiguous
+          else
+             contiguous1 = nf90_notcontiguous
+          endif
+       endif
+       if (present(chunksizes)) then
+          contiguous1 = 0
+          do d = 1, size(dimids)
+             chunksizes1(d) = chunksizes(d)
+          end do
+       endif
+       nf90_def_var_ManyDims = nf_def_var_chunking(ncid, varid, contiguous1, chunksizes1)       
+    endif
+    if (present(contiguous)) then
+       if (contiguous) then
+          nf90_def_var_ManyDims = nf_def_var_chunking(ncid, varid, 1, 0)       
+       endif
+    endif
+    if (nf90_def_var_ManyDims .ne. nf90_noerr) return
+    
+    ! Handle deflate and shuffle.
+    if (present(deflate_level)) then
+       if (deflate_level .gt. 0) then
+          if (present(shuffle)) then
+             if (shuffle) then
+                nf90_def_var_ManyDims = nf_def_var_deflate(ncid, varid, 1, 1, deflate_level)       
+             else
+                nf90_def_var_ManyDims = nf_def_var_deflate(ncid, varid, 0, 1, deflate_level)       
+             end if
+          else
+             nf90_def_var_ManyDims = nf_def_var_deflate(ncid, varid, 0, 1, deflate_level)       
+          end if
+       end if
+    endif
+    if (nf90_def_var_ManyDims .ne. nf90_noerr) return
+
+    ! Handle fletcher32.
+    if (present(fletcher32)) then
+       if (fletcher32) then
+          nf90_def_var_ManyDims = nf_def_var_fletcher32(ncid, varid, 1)       
+       endif
+    endif
+    if (nf90_def_var_ManyDims .ne. nf90_noerr) return
+
+    ! Handle endianness.
+    if (present(endianness)) then
+       nf90_def_var_ManyDims = nf_def_var_endian(ncid, varid, endianness)       
+    endif
+
+    ! Set the cache if the user wants to.
+    if (present(cache_size) .or. present(cache_nelems) .or. &
+         present(cache_preemption)) then
+       ! Negative values mean leave it alone.
+       if (present(cache_size)) size1 = cache_size
+       if (present(cache_nelems)) nelems1 = cache_nelems
+       if (present(cache_preemption)) preemption1 = cache_preemption
+       
+       nf90_def_var_ManyDims = nf_set_var_chunk_cache(ncid, varid, &
+            size1, nelems1, preemption1)
+       if (nf90_def_var_ManyDims .ne. nf90_noerr) return
+    endif
+
+  end function nf90_def_var_ManyDims
+  ! ----- 
+  function nf90_inq_varid(ncid, name, varid)
+    integer, intent(in) :: ncid
+    character (len = *), intent( in) :: name
+    integer, intent(out) :: varid
+    integer :: nf90_inq_varid
+    
+    nf90_inq_varid = nf_inq_varid(ncid, name, varid)
+    if (nf90_inq_varid .ne. nf90_noerr) return
+
+  end function nf90_inq_varid
+  ! ----- 
+  function nf90_set_var_chunk_cache(ncid, varid, size, nelems, preemption)
+    integer, intent(in) :: ncid, varid, size, nelems, preemption
+    integer :: nf90_set_var_chunk_cache
+    
+    nf90_set_var_chunk_cache = nf_set_var_chunk_cache(ncid, varid, &
+         size, nelems, preemption)
+    if (nf90_set_var_chunk_cache .ne. nf90_noerr) return
+
+  end function nf90_set_var_chunk_cache
+  ! ----- 
+  function nf90_inquire_variable(ncid, varid, name, xtype, ndims, dimids, nAtts, &
+       contiguous, chunksizes, deflate_level, shuffle, fletcher32, endianness, &
+       cache_size, cache_nelems, cache_preemption)
+    integer, intent(in) :: ncid, varid
+    character (len = *), optional, intent(out) :: name
+    integer, optional, intent(out) :: xtype, ndims 
+    integer, dimension(:), optional, intent(out) :: dimids
+    integer, optional, intent(out) :: nAtts
+    logical, optional, intent(out) :: contiguous
+    integer, optional, dimension(:), intent(out) :: chunksizes
+    integer, optional, intent(out) :: deflate_level
+    logical, optional, intent(out) :: shuffle, fletcher32
+    integer, optional, intent(out) :: endianness
+    integer, optional, intent(out) :: cache_size, cache_nelems, cache_preemption
+    integer :: nf90_inquire_variable
+    
+    ! Local variables
+    character (len = nf90_max_name) :: varName = ''
+    integer :: externalType, numDimensions
+    integer, dimension(nf90_max_var_dims) :: dimensionIDs
+    integer :: numAttributes
+    integer :: deflate1, deflate_level1, contiguous1, shuffle1, fletcher321
+    integer, dimension(nf90_max_dims) :: chunksizes1
+    integer :: size1, nelems1, preemption1
+    integer :: d
+
+    ! Learn the basic facts.
+    nf90_inquire_variable = nf_inq_var(ncid, varid, varName, externalType, &
+                                       numDimensions, dimensionIDs, numAttributes)
+    if (nf90_inquire_variable .ne. nf90_noerr) return
+    
+    ! Tell the user what he wants to know.
+    if (present(name)) name = trim(varName)
+    if (present(xtype)) xtype = externalType
+    if (present(ndims)) ndims = numDimensions
+    if (present(dimids)) then
+       if (size(dimids) .ge. numDimensions) then
+          dimids(:numDimensions) = dimensionIDs(:numDimensions)
+       else
+          nf90_inquire_variable = nf90_einval
+       endif
+    endif
+    if (present(nAtts)) nAtts = numAttributes
+
+    ! Get the chunksizes and contiguous settings, if desired.
+    if (present(chunksizes) .or. present(contiguous)) then
+       nf90_inquire_variable = nf_inq_var_chunking(ncid, varid, contiguous1, chunksizes1)
+       if (nf90_inquire_variable .ne. nf90_noerr) return
+       if (present(contiguous)) contiguous = contiguous1 .ne. nf90_notcontiguous
+       if (present(chunksizes)) then
+          do d = 1, numDimensions
+             chunksizes(d) = chunksizes1(d)
+          end do
+       endif
+    endif
+
+    ! Get the fletcher32 settings, if desired.
+    if (present(fletcher32)) then
+       nf90_inquire_variable = nf_inq_var_fletcher32(ncid, varid, fletcher321)
+       if (nf90_inquire_variable .ne. nf90_noerr) return
+       fletcher32 = fletcher321 .gt. 0
+    endif
+    
+    ! Get the deflate and shuffle settings, if desired.
+    if (present(deflate_level) .or. present(shuffle)) then
+       nf90_inquire_variable = nf_inq_var_deflate(ncid, varid, shuffle1, deflate1, deflate_level1)
+       if (nf90_inquire_variable .ne. nf90_noerr) return
+       if (present(deflate_level)) deflate_level = deflate_level1
+       if (present(shuffle)) shuffle = shuffle1 .ne. 0
+    endif
+
+    ! And the endianness...
+    if (present(endianness)) then
+       nf90_inquire_variable = nf_inq_var_endian(ncid, varid, endianness)
+       if (nf90_inquire_variable .ne. nf90_noerr) return
+    endif
+
+    ! Does the user want cache settings?
+    if (present(cache_size) .or. present(cache_nelems) .or. present(cache_preemption)) then
+       nf90_inquire_variable = nf_get_var_chunk_cache(ncid, varid, &
+            size1, nelems1, preemption1)
+       if (nf90_inquire_variable .ne. nf90_noerr) return
+       if (present(cache_size)) cache_size = size1
+       if (present(cache_nelems)) cache_nelems = nelems1
+       if (present(cache_preemption)) cache_preemption = preemption1
+    endif
+  end function nf90_inquire_variable
+  ! ----- 
+  function nf90_rename_var(ncid, varid, newname)
+    integer,             intent( in) :: ncid, varid
+    character (len = *), intent( in) :: newname
+    integer                          :: nf90_rename_var
+    
+    nf90_rename_var = nf_rename_var(ncid, varid, newname)
+  end function nf90_rename_var
+  ! ----- 
diff --git a/fortran/netcdf4_visibility.f90 b/fortran/netcdf4_visibility.f90
new file mode 100644
index 0000000..ee92d49
--- /dev/null
+++ b/fortran/netcdf4_visibility.f90
@@ -0,0 +1,24 @@
+! This is part of the netCDF-4 fortran 90 API.
+! Copyright 2006, UCAR
+! $Id: netcdf4_visibility.f90,v 1.15 2009/09/28 17:53:00 ed Exp $
+  
+public :: nf90_create_par, nf90_open_par, nf90_var_par_access, &
+     nf90_inq_ncid, nf90_inq_grps, nf90_inq_grp_ncid, nf90_inq_grp_full_ncid, nf90_inq_grpname, &
+     nf90_inq_grpname_full, nf90_inq_grpname_len, nf90_inq_varids, nf90_inq_grp_parent, &
+     nf90_inq_dimids, nf90_inq_typeids, nf90_def_grp, nf90_def_compound, &
+     nf90_insert_compound, nf90_insert_array_compound, nf90_inq_type, &
+     nf90_inq_compound, nf90_inq_compound_name, nf90_inq_compound_size, &
+     nf90_inq_compound_nfields, nf90_inq_compound_field, &
+     nf90_inq_compound_fieldname, nf90_inq_compound_fieldindex, &
+     nf90_inq_compound_fieldoffset, nf90_inq_compound_fieldtype, &
+     nf90_inq_compound_fieldndims, nf90_inq_cmp_fielddim_sizes, nf90_def_vlen, nf90_inq_vlen, &
+     nf90_def_enum, nf90_insert_enum, nf90_inq_enum, nf90_inq_enum_member, nf90_inq_enum_ident, &
+     nf90_def_opaque, nf90_inq_opaque, nf90_def_var_deflate, nf90_inq_var_deflate, &
+     nf90_def_var_fletcher32, nf90_inq_var_fletcher32, nf90_def_var_chunking, &
+     nf90_inq_var_chunking, &
+     nf90_def_var_fill, nf90_inq_var_fill, &
+     nf90_def_var_endian, nf90_inq_var_endian, nf90_inq_user_type, &
+     nf90_put_att_any, nf90_get_att_any, nf90_get_var_any, nf90_put_var_any, &
+     nf90_rename_grp
+     
+  
diff --git a/fortran/netcdf_attributes.f90 b/fortran/netcdf_attributes.f90
new file mode 100644
index 0000000..22ef02a
--- /dev/null
+++ b/fortran/netcdf_attributes.f90
@@ -0,0 +1,330 @@
+  !
+  ! Attribute routines:
+  !
+  ! -------
+  function nf90_copy_att(ncid_in, varid_in, name, ncid_out, varid_out)
+    integer,             intent( in) :: ncid_in,  varid_in
+    character (len = *), intent( in) :: name
+    integer,             intent( in) :: ncid_out, varid_out
+    integer                          :: nf90_copy_att
+
+    nf90_copy_att = nf_copy_att(ncid_in, varid_in, name, ncid_out, varid_out)
+  end function nf90_copy_att
+  ! -------
+  function nf90_rename_att(ncid, varid, curname, newname)
+    integer,             intent( in) :: ncid,  varid
+    character (len = *), intent( in) :: curname, newname
+    integer                          :: nf90_rename_att
+
+    nf90_rename_att = nf_rename_att(ncid, varid, curname, newname)
+  end function nf90_rename_att
+  ! -------
+  function nf90_del_att(ncid, varid, name)
+    integer,             intent( in) :: ncid, varid
+    character (len = *), intent( in) :: name
+    integer                          :: nf90_del_att
+
+    nf90_del_att = nf_del_att(ncid, varid, name)
+  end function nf90_del_att
+  ! -------
+  ! Attribute inquiry functions
+  ! -------
+  function nf90_inq_attname(ncid, varid, attnum, name)
+    integer,             intent( in) :: ncid, varid, attnum
+    character (len = *), intent(out) :: name
+    integer                          :: nf90_inq_attname
+
+    nf90_inq_attname = nf_inq_attname(ncid, varid, attnum, name)
+  end function nf90_inq_attname
+  ! -------
+  function nf90_inquire_attribute(ncid, varid, name, xtype, len, attnum)
+    integer,             intent( in)           :: ncid, varid
+    character (len = *), intent( in)           :: name
+    integer,             intent(out), optional :: xtype, len, attnum
+    integer                                    :: nf90_inquire_attribute
+
+    integer                          :: local_xtype, local_len
+
+    ! Do we need to worry about not saving the state from this call?
+    if(present(attnum)) &
+      nf90_inquire_attribute = nf_inq_attid(ncid, varid, name, attnum)
+    nf90_inquire_attribute   = nf_inq_att  (ncid, varid, name, local_xtype, local_len)
+    if(present(xtype)) xtype = local_xtype
+    if(present(len  )) len   = local_len
+  end function nf90_inquire_attribute
+  ! -------
+  ! Put and get functions; these will get overloaded
+  ! -------
+  ! Text
+  ! -------
+  function nf90_put_att_text(ncid, varid, name, values)
+    integer,                          intent( in) :: ncid, varid
+    character(len = *),               intent( in) :: name
+    character(len = *),               intent( in) :: values
+    integer                                       :: nf90_put_att_text
+
+    nf90_put_att_text = nf_put_att_text(ncid, varid, name, len_trim(values), trim(values))
+  end function nf90_put_att_text
+  ! -------
+  function nf90_get_att_text(ncid, varid, name, values)
+    integer,                          intent( in) :: ncid, varid
+    character(len = *),               intent( in) :: name
+    character(len = *),               intent(out) :: values
+    integer                                       :: nf90_get_att_text
+
+    values = ' '  !! make sure result will be blank padded
+    nf90_get_att_text = nf_get_att_text(ncid, varid, name, values)
+  end function nf90_get_att_text
+  ! -------
+  ! Integer attributes
+  ! -------
+  function nf90_put_att_OneByteInt(ncid, varid, name, values)
+    integer,                                    intent( in) :: ncid, varid
+    character(len = *),                         intent( in) :: name
+    integer (kind =  OneByteInt), dimension(:), intent( in) :: values
+    integer                                                 :: nf90_put_att_OneByteInt
+
+    nf90_put_att_OneByteInt = nf_put_att_int1(ncid, varid, name, nf90_int1, size(values), values)
+  end function nf90_put_att_OneByteInt
+  ! -------
+  function nf90_put_att_one_OneByteInt(ncid, varid, name, values)
+    integer,                                    intent( in) :: ncid, varid
+    character(len = *),                         intent( in) :: name
+    integer (kind =  OneByteInt),               intent( in) :: values
+    integer                                                 :: nf90_put_att_one_OneByteInt
+
+    integer (kind =  OneByteInt), dimension(1)              :: valuesA
+    valuesA(1) = values
+    nf90_put_att_one_OneByteInt = nf_put_att_int1(ncid, varid, name, nf90_int1, 1, valuesA)
+  end function nf90_put_att_one_OneByteInt
+  ! -------
+  function nf90_get_att_OneByteInt(ncid, varid, name, values)
+    integer,                                    intent( in) :: ncid, varid
+    character(len = *),                         intent( in) :: name
+    integer (kind =  OneByteInt), dimension(:), intent(out) :: values
+    integer                                                 :: nf90_get_att_OneByteInt
+
+    nf90_get_att_OneByteInt = nf_get_att_int1(ncid, varid, name, values)
+  end function nf90_get_att_OneByteInt
+  ! -------
+  function nf90_get_att_one_OneByteInt(ncid, varid, name, values)
+    integer,                                    intent( in) :: ncid, varid
+    character(len = *),                         intent( in) :: name
+    integer (kind =  OneByteInt),               intent(out) :: values
+    integer                                                 :: nf90_get_att_one_OneByteInt
+
+    integer (kind =  OneByteInt), dimension(1)              :: valuesA
+    nf90_get_att_one_OneByteInt = nf_get_att_int1(ncid, varid, name, valuesA)
+    values = valuesA(1)
+  end function nf90_get_att_one_OneByteInt
+  ! -------
+  function nf90_put_att_TwoByteInt(ncid, varid, name, values)
+    integer,                                    intent( in) :: ncid, varid
+    character(len = *),                         intent( in) :: name
+    integer (kind =  TwoByteInt), dimension(:), intent( in) :: values
+    integer                                                 :: nf90_put_att_TwoByteInt
+
+    nf90_put_att_TwoByteInt = nf_put_att_int2(ncid, varid, name, nf90_int2, size(values), values)
+  end function nf90_put_att_TwoByteInt
+  ! -------
+  function nf90_put_att_one_TwoByteInt(ncid, varid, name, values)
+    integer,                                    intent( in) :: ncid, varid
+    character(len = *),                         intent( in) :: name
+    integer (kind =  TwoByteInt),               intent( in) :: values
+    integer                                                 :: nf90_put_att_one_TwoByteInt
+
+    integer (kind =  TwoByteInt), dimension(1)              :: valuesA
+    valuesA(1) = values
+    nf90_put_att_one_TwoByteInt = nf_put_att_int2(ncid, varid, name, nf90_int2, 1, valuesA)
+  end function nf90_put_att_one_TwoByteInt
+  ! -------
+  function nf90_get_att_TwoByteInt(ncid, varid, name, values)
+    integer,                                    intent( in) :: ncid, varid
+    character(len = *),                         intent( in) :: name
+    integer (kind =  TwoByteInt), dimension(:), intent(out) :: values
+    integer                                                 :: nf90_get_att_TwoByteInt
+
+    nf90_get_att_TwoByteInt = nf_get_att_int2(ncid, varid, name, values)
+  end function nf90_get_att_TwoByteInt
+  ! -------
+  function nf90_get_att_one_TwoByteInt(ncid, varid, name, values)
+    integer,                                    intent( in) :: ncid, varid
+    character(len = *),                         intent( in) :: name
+    integer (kind =  TwoByteInt),               intent(out) :: values
+    integer                                                 :: nf90_get_att_one_TwoByteInt
+
+    integer (kind =  TwoByteInt), dimension(1)              :: valuesA
+    nf90_get_att_one_TwoByteInt = nf_get_att_int2(ncid, varid, name, valuesA)
+    values = valuesA(1)
+  end function nf90_get_att_one_TwoByteInt
+  ! -------
+  function nf90_put_att_FourByteInt(ncid, varid, name, values)
+    integer,                                    intent( in) :: ncid, varid
+    character(len = *),                         intent( in) :: name
+    integer (kind = FourByteInt), dimension(:), intent( in) :: values
+    integer                                                 :: nf90_put_att_FourByteInt
+
+    nf90_put_att_FourByteInt = nf_put_att_int(ncid, varid, name, nf90_int, size(values), int(values))
+  end function nf90_put_att_FourByteInt
+  ! -------
+  function nf90_put_att_one_FourByteInt(ncid, varid, name, values)
+    integer,                                    intent( in) :: ncid, varid
+    character(len = *),                         intent( in) :: name
+    integer (kind = FourByteInt),               intent( in) :: values
+    integer                                                 :: nf90_put_att_one_FourByteInt
+
+    integer (kind = FourByteInt), dimension(1)              :: valuesA
+    valuesA(1) = int(values)
+    nf90_put_att_one_FourByteInt = nf_put_att_int(ncid, varid, name, nf90_int, 1, int(valuesA))
+  end function nf90_put_att_one_FourByteInt
+  ! -------
+  function nf90_get_att_FourByteInt(ncid, varid, name, values)
+    integer,                                    intent( in) :: ncid, varid
+    character(len = *),                         intent( in) :: name
+    integer (kind = FourByteInt), dimension(:), intent(out) :: values
+    integer                                                 :: nf90_get_att_FourByteInt
+    
+    integer, dimension(size(values)) :: defaultInteger
+
+    nf90_get_att_FourByteInt = nf_get_att_int(ncid, varid, name, defaultInteger)
+    values(:) = defaultInteger(:)
+  end function nf90_get_att_FourByteInt
+  ! -------
+  function nf90_get_att_one_FourByteInt(ncid, varid, name, values)
+    integer,                                    intent( in) :: ncid, varid
+    character(len = *),                         intent( in) :: name
+    integer (kind = FourByteInt),               intent(out) :: values
+    integer                                                 :: nf90_get_att_one_FourByteInt
+
+    integer, dimension(1) :: defaultInteger
+
+    nf90_get_att_one_FourByteInt = nf_get_att_int(ncid, varid, name, defaultInteger)
+    values = defaultInteger(1)
+  end function nf90_get_att_one_FourByteInt
+  ! -------
+  function nf90_put_att_EightByteInt(ncid, varid, name, values)
+    integer,                                     intent( in) :: ncid, varid
+    character(len = *),                          intent( in) :: name
+    integer (kind = EightByteInt), dimension(:), intent( in) :: values
+    integer                                                  :: nf90_put_att_EightByteInt
+
+    nf90_put_att_EightByteInt = nf_put_att_int(ncid, varid, name, nf90_int, size(values), int(values))
+  end function nf90_put_att_EightByteInt
+  ! -------
+  function nf90_put_att_one_EightByteInt(ncid, varid, name, values)
+    integer,                                     intent( in) :: ncid, varid
+    character(len = *),                          intent( in) :: name
+    integer (kind = EightByteInt),               intent( in) :: values
+    integer                                                  :: nf90_put_att_one_EightByteInt
+
+    integer, dimension(1) :: valuesA
+    valuesA(1) = values
+    nf90_put_att_one_EightByteInt = nf_put_att_int(ncid, varid, name, nf90_int, 1, valuesA)
+  end function nf90_put_att_one_EightByteInt
+  ! -------
+  function nf90_get_att_EightByteInt(ncid, varid, name, values)
+    integer,                                     intent( in) :: ncid, varid
+    character(len = *),                          intent( in) :: name
+    integer (kind = EightByteInt), dimension(:), intent(out) :: values
+    integer                                                 :: nf90_get_att_EightByteInt
+    
+    integer, dimension(size(values)) :: defaultInteger
+
+    nf90_get_att_EightByteInt = nf_get_att_int(ncid, varid, name, defaultInteger)
+    values(:) = defaultInteger(:)
+  end function nf90_get_att_EightByteInt
+  ! -------
+  function nf90_get_att_one_EightByteInt(ncid, varid, name, values)
+    integer,                                     intent( in) :: ncid, varid
+    character(len = *),                          intent( in) :: name
+    integer (kind = EightByteInt),               intent(out) :: values
+    integer                                                 :: nf90_get_att_one_EightByteInt
+
+    integer, dimension(1) :: defaultInteger
+
+    nf90_get_att_one_EightByteInt = nf_get_att_int(ncid, varid, name, defaultInteger)
+    values = defaultInteger(1)
+  end function nf90_get_att_one_EightByteInt
+  ! -------
+  ! Real attributes
+  ! -------
+  function nf90_put_att_FourByteReal(ncid, varid, name, values)
+    integer,                                   intent( in) :: ncid, varid
+    character(len = *),                        intent( in) :: name
+    real (kind =  FourByteReal), dimension(:), intent( in) :: values
+    integer                                                :: nf90_put_att_FourByteReal
+
+    nf90_put_att_FourByteReal = nf_put_att_real(ncid, varid, name, nf90_real4, size(values), values)
+  end function nf90_put_att_FourByteReal
+  ! -------
+  function nf90_put_att_one_FourByteReal(ncid, varid, name, values)
+    integer,                                   intent( in) :: ncid, varid
+    character(len = *),                        intent( in) :: name
+    real (kind =  FourByteReal),               intent( in) :: values
+    integer                                                :: nf90_put_att_one_FourByteReal
+
+    real (kind =  FourByteReal), dimension(1) :: valuesA
+    valuesA(1) = values
+    nf90_put_att_one_FourByteReal = nf_put_att_real(ncid, varid, name, nf90_real4, 1, valuesA)
+  end function nf90_put_att_one_FourByteReal
+  ! -------
+  function nf90_get_att_FourByteReal(ncid, varid, name, values)
+    integer,                                   intent( in) :: ncid, varid
+    character(len = *),                        intent( in) :: name
+    real (kind =  FourByteReal), dimension(:), intent(out) :: values
+    integer                                                :: nf90_get_att_FourByteReal
+
+    nf90_get_att_FourByteReal = nf_get_att_real(ncid, varid, name, values)
+  end function nf90_get_att_FourByteReal
+  ! -------
+  function nf90_get_att_one_FourByteReal(ncid, varid, name, values)
+    integer,                                   intent( in) :: ncid, varid
+    character(len = *),                        intent( in) :: name
+    real (kind =  FourByteReal),               intent(out) :: values
+    integer                                                :: nf90_get_att_one_FourByteReal
+
+    real (kind =  FourByteReal), dimension(1) :: valuesA
+    nf90_get_att_one_FourByteReal = nf_get_att_real(ncid, varid, name, valuesA)
+    values = valuesA(1)
+  end function nf90_get_att_one_FourByteReal
+  ! -------
+  function nf90_put_att_EightByteReal(ncid, varid, name, values)
+    integer,                                   intent( in) :: ncid, varid
+    character(len = *),                        intent( in) :: name
+    real (kind = EightByteReal), dimension(:), intent( in) :: values
+    integer                                                :: nf90_put_att_EightByteReal
+
+    nf90_put_att_EightByteReal = nf_put_att_double(ncid, varid, name, nf90_real8, size(values), values)
+  end function nf90_put_att_EightByteReal
+  ! -------
+  function nf90_put_att_one_EightByteReal(ncid, varid, name, values)
+    integer,                                   intent( in) :: ncid, varid
+    character(len = *),                        intent( in) :: name
+    real (kind = EightByteReal),               intent( in) :: values
+    integer                                                :: nf90_put_att_one_EightByteReal
+
+    real (kind = EightByteReal), dimension(1) :: valuesA
+    valuesA(1) = values
+    nf90_put_att_one_EightByteReal = nf_put_att_double(ncid, varid, name, nf90_real8, 1, valuesA)
+  end function nf90_put_att_one_EightByteReal
+  ! -------
+  function nf90_get_att_EightByteReal(ncid, varid, name, values)
+    integer,                                   intent( in) :: ncid, varid
+    character(len = *),                        intent( in) :: name
+    real (kind = EightByteReal), dimension(:), intent(out) :: values
+    integer                                                :: nf90_get_att_EightByteReal
+
+    nf90_get_att_EightByteReal = nf_get_att_double(ncid, varid, name, values)
+  end function nf90_get_att_EightByteReal
+  ! -------
+  function nf90_get_att_one_EightByteReal(ncid, varid, name, values)
+    integer,                                   intent( in) :: ncid, varid
+    character(len = *),                        intent( in) :: name
+    real (kind = EightByteReal),               intent(out) :: values
+    integer                                                :: nf90_get_att_one_EightByteReal
+
+    real (kind = EightByteReal), dimension(1) :: valuesA
+    nf90_get_att_one_EightByteReal = nf_get_att_double(ncid, varid, name, valuesA)
+    values = valuesA(1)
+  end function nf90_get_att_one_EightByteReal
+  ! -------
diff --git a/fortran/netcdf_constants.f90 b/fortran/netcdf_constants.f90
new file mode 100644
index 0000000..dbb6468
--- /dev/null
+++ b/fortran/netcdf_constants.f90
@@ -0,0 +1,243 @@
+  !
+  ! external netcdf data types:
+  !
+  integer, parameter, public :: &
+    nf90_byte   = 1,            &
+    nf90_int1   = nf90_byte,    &
+    nf90_char   = 2,            &
+    nf90_short  = 3,            &
+    nf90_int2   = nf90_short,   &
+    nf90_int    = 4,            &
+    nf90_int4   = nf90_int,     &
+    nf90_float  = 5,            &
+    nf90_real   = nf90_float,   &
+    nf90_real4  = nf90_float,   &
+    nf90_double = 6,            &
+    nf90_real8  = nf90_double
+                        
+  !
+  ! default fill values:
+  !
+  character (len = 1),           parameter, public :: &
+    nf90_fill_char  = achar(0)
+  integer (kind =  OneByteInt),  parameter, public :: &
+    nf90_fill_byte  = -127,                           &
+    nf90_fill_int1  = nf90_fill_byte
+  integer (kind =  TwoByteInt),  parameter, public :: &
+    nf90_fill_short = -32767,                         &
+    nf90_fill_int2  = nf90_fill_short
+  integer (kind = FourByteInt),  parameter, public :: &
+    nf90_fill_int   = -2147483647
+  real   (kind =  FourByteReal), parameter, public :: &
+    nf90_fill_float = 9.9692099683868690e+36,         &
+    nf90_fill_real  = nf90_fill_float,                &
+    nf90_fill_real4 = nf90_fill_float
+  real   (kind = EightByteReal), parameter, public :: &
+    nf90_fill_double = 9.9692099683868690e+36,        &
+    nf90_fill_real8  = nf90_fill_double
+
+  !
+  ! mode flags for opening and creating a netcdf dataset:
+  !
+  integer, parameter, public :: &
+    nf90_nowrite   = 0,         &
+    nf90_write     = 1,         &
+    nf90_clobber   = 0,         &
+    nf90_noclobber = 4,         &
+    nf90_fill      = 0,         &
+    nf90_nofill    = 256,       &
+    nf90_64bit_offset    = 512, &
+    nf90_lock      = 1024,      &
+    nf90_share     = 2048,      & 
+    nf90_diskless  = 8,         &
+    nf90_mmap      = 16
+  
+  integer, parameter, public ::  &
+    nf90_sizehint_default = 0,   & 
+    nf90_align_chunk      = -1 
+
+  !
+  ! size argument for defining an unlimited dimension:
+  !
+  integer, parameter, public :: nf90_unlimited = 0
+
+  !
+  ! global attribute id:
+  !
+  integer, parameter, public :: nf90_global = 0
+
+  !
+  ! implementation limits:
+  !
+  integer, parameter, public :: &
+    nf90_max_dims     = 1024,    &
+    nf90_max_attrs    = 8192,   &
+    nf90_max_vars     = 8192,   &
+    nf90_max_name     = 256,    &
+    nf90_max_var_dims = 1024
+  
+  !
+  ! error codes:
+  !
+  integer, parameter, public :: &
+    nf90_noerr        = 0,      & ! No Error
+    nf90_ebadid       = -33,    & ! Not a valid ID
+    nf90_eexist       = -35,    & ! netcdf file exists && NF90_NOCLOBBER
+    nf90_einval       = -36,    & ! Invalid Argument
+    nf90_eperm        = -37,    & ! Write to read only
+    nf90_enotindefine = -38,    & ! Operation not allowed in data mode
+    nf90_eindefine    = -39,    & ! Operation not allowed in define mode
+    nf90_einvalcoords = -40,    & ! Index exceeds dimension bound
+    nf90_emaxdims     = -41,    & ! nf90_max_dims exceeded
+    nf90_enameinuse   = -42,    & ! String match to name in use
+    nf90_enotatt      = -43,    & ! Attribute not found
+    nf90_emaxatts     = -44,    & ! nf90_max_attrs exceeded
+    nf90_ebadtype     = -45,    & ! Not a netcdf data type
+    nf90_ebaddim      = -46,    & ! Invalid dimension id or name
+    nf90_eunlimpos    = -47,    & ! nf90_unlimited in the wrong index
+    nf90_emaxvars     = -48,    & ! nf90_max_vars exceeded
+    nf90_enotvar      = -49,    & ! The variable ID is invalid for the specified netCDF dataset.
+    nf90_eglobal      = -50,    & ! Action prohibited on nf90_global varid
+    nf90_enotnc       = -51,    & ! Not a netcdf file
+    nf90_ests         = -52,    & ! In Fortran, string too short
+    nf90_emaxname     = -53,    & ! nf90_max_name exceeded
+    nf90_eunlimit     = -54,    & ! nf90_unlimited size already in use
+    nf90_enorecvars   = -55,    & ! nc_rec op when there are no record vars
+    nf90_echar        = -56,    & ! Attempt to convert between text & numbers
+    nf90_eedge        = -57,    & ! Start+count exceeds dimension bound
+    nf90_estride      = -58,    & ! Illegal stride
+    nf90_ebadname     = -59,    & ! Attribute or variable name contains illegal characters
+    nf90_erange       = -60,    & ! Math result not representable
+    nf90_enomem       = -61,    & ! Memory allocation (malloc) failure
+    nf90_evarsize     = -62,    & ! One or more variable sizes violate format constraints 
+    nf90_edimsize     = -63,    & ! Invalid dimension size
+    nf90_etrunc       = -64,    & ! File likely truncated or possibly corrupted
+    nf90_eaxistype    = -65       ! Unknown axis type.
+  !
+  ! more error codes for DAP
+  !
+  integer, parameter, public :: &
+    nf90_edap         = -66,    & ! Generic DAP error
+    nf90_ecurl        = -67,    & ! Generic libcurl error
+    nf90_eio          = -68,    & ! Generic IO error
+    nf90_enodata      = -69,    & ! Attempt to access variable with no data
+    nf90_edapsvc      = -70,    & ! DAP server error
+    nf90_edas         = -71,    & ! Malformed or inaccessible DAS
+    nf90_edds         = -72,    & ! Malformed or inaccessible DDS
+    nf90_edatadds     = -73,    & ! Malformed or inaccessible DATADDS
+    nf90_edapurl      = -74,    & ! Malformed DAP URL
+    nf90_edapconstraint = -75,  & ! Malformed DAP Constrain
+    nf90_etranslation = -76,    & ! Untranslatable construct
+    nf904_first_error = -100
+  !
+  ! error codes for netCDF-4
+  !
+integer, parameter, public :: &
+    nf90_ehdferr      = -101,    & ! Error at HDF5 layer. 
+    nf90_ecantread    = -102,    & ! Can't read. 
+    nf90_ecantwrite   = -103,    & ! Can't write. 
+    nf90_ecantcreate  = -104,    & ! Can't create. 
+    nf90_efilemeta    = -105,    & ! Problem with file metadata. 
+    nf90_edimmeta     = -106,    & ! Problem with dimension metadata. 
+    nf90_eattmeta     = -107,    & ! Problem with attribute metadata. 
+    nf90_evarmeta     = -108,    & ! Problem with variable metadata. 
+    nf90_enocompound  = -109,    & ! Not a compound type. 
+    nf90_eattexists   = -110,    & ! Attribute already exists. 
+    nf90_enotnc4      = -111,    & ! Attempting netcdf-4 operation on netcdf-3 file.   
+    nf90_estrictnc3   = -112,    & ! Attempting netcdf-4 operation on strict nc3 netcdf-4 file.   
+    nf90_enotnc3      = -113,    & ! Attempting netcdf-3 operation on netcdf-4 file.   
+    nf90_enopar       = -114,    & ! Parallel operation on file opened for non-parallel access.   
+    nf90_eparinit     = -115,    & ! Error initializing for parallel access.   
+    nf90_ebadgrpid    = -116,    & ! Bad group ID.   
+    nf90_ebadtypid    = -117,    & ! Bad type ID.   
+    nf90_etypdefined  = -118,    & ! Type has already been defined and may not be edited. 
+    nf90_ebadfield    = -119,    & ! Bad field ID.   
+    nf90_ebadclass    = -120,    & ! Bad class.   
+    nf90_emaptype     = -121,    & ! Mapped access for atomic types only.   
+    nf90_elatefill    = -122,    & ! Attempt to define fill value when data already exists. 
+    nf90_elatedef     = -123,    & ! Attempt to define var properties, like deflate, after enddef. 
+    nf90_edimscale    = -124,    & ! Probem with HDF5 dimscales.
+    nf90_enogrp       = -125,    & ! No group found.
+    nf90_estorage     = -126,    & ! Can't specify both contiguous and chunking.
+    nf90_ebadchunk    = -127,    & ! Bad chunksize.
+    nf90_enotbuilt    = -128,    & ! Attempt to use feature that was not turned on when netCDF was built.
+    nf90_ediskless    = -129,    & ! Error in using diskless  access. 
+    nf90_ecantextend  = -130,    & ! Attempt to extend dataset during ind. I/O operation. 
+    nf90_empi         = -131,    & ! MPI operation failed. 
+    nf904_last_error  = -131
+
+  !
+  ! error handling modes:
+  !
+  integer, parameter, public :: &
+    nf90_fatal   = 1,           &
+    nf90_verbose = 2
+
+  !
+  ! format version numbers:
+  !
+  integer, parameter, public :: &
+    nf90_format_classic = 1,    &
+    nf90_format_64bit = 2,      &
+    nf90_format_netcdf4 = 3,    &
+    nf90_format_netcdf4_classic = 4
+
+! extra data types:
+integer, parameter, public :: &
+     nf90_ubyte = 7, &
+     nf90_ushort = 8, &
+     nf90_uint = 9, &
+     nf90_int64 = 10, &
+     nf90_uint64 = 11, &
+     nf90_string = 12, &
+     nf90_vlen = 13, &
+     nf90_opaque = 14, &
+     nf90_enum = 15, &
+     nf90_compound = 16
+
+                        
+! extra default fill values:
+integer (kind =  TwoByteInt),  parameter, public :: &
+     nf90_fill_ubyte  = 255,                        &
+     nf90_fill_uint1  = nf90_fill_ubyte
+integer (kind =  FourByteInt),  parameter, public :: &
+     nf90_fill_ushort = 65535,                      &
+     nf90_fill_uint2  = nf90_fill_ushort
+integer (kind = EightByteInt),  parameter, public :: &
+     nf90_fill_uint   = 4294967295_EightByteInt
+
+! Extra file create mode flags.
+integer, parameter, public :: &
+     nf90_netcdf4 = 4096, &
+     nf90_hdf5 = 4096, & ! deprecated
+     nf90_classic_model = 256
+
+! Flags for parallel access.
+integer, parameter, public :: nf90_independent = 0, nf90_collective = 1
+
+! Flags for parallel I/O.
+integer, parameter, public :: nf90_mpiio = 8192, nf90_mpiposix = 16384, &
+     nf90_pnetcdf = 32768
+  
+! Extra variable flags.
+integer, parameter, public :: &
+     nf90_chunk_seq = 0, &
+     nf90_chunk_sub = 1, &
+     nf90_chunk_sizes = 2, &
+     nf90_endian_native = 0, &
+     nf90_endian_little = 1, &
+     nf90_endian_big = 2, &
+     nf90_chunked = 0, &
+     nf90_notcontiguous = 0, &
+     nf90_contiguous = 1, &
+     nf90_nochecksum = 0, &
+     nf90_fletcher32 = 1, &
+     nf90_noshuffle = 0, &
+     nf90_shuffle = 1, &
+     nf90_szip_ec_option_mask = 4, &
+     nf90_szip_nn_option_mask = 32
+
+! This is the position of NC_NETCDF4 in cmode, counting from the
+! right, starting (uncharacteristically for fortran) at 0. It's needed
+! for the BTEST function calls.
+integer, parameter, private :: NETCDF4_BIT = 12
diff --git a/fortran/netcdf_dims.f90 b/fortran/netcdf_dims.f90
new file mode 100644
index 0000000..41d4da8
--- /dev/null
+++ b/fortran/netcdf_dims.f90
@@ -0,0 +1,46 @@
+  !
+  ! Dimension routines:
+  !
+  ! -----------
+  function nf90_def_dim(ncid, name, len, dimid)
+    integer,             intent( in) :: ncid
+    character (len = *), intent( in) :: name
+    integer,             intent( in) :: len
+    integer,             intent(out) :: dimid
+    integer                          :: nf90_def_dim
+  
+    nf90_def_dim = nf_def_dim(ncid, name, len, dimid)
+  end function nf90_def_dim
+  ! -----------
+  function nf90_inq_dimid(ncid, name, dimid)
+    integer,             intent( in) :: ncid
+    character (len = *), intent( in) :: name
+    integer,             intent(out) :: dimid
+    integer                          :: nf90_inq_dimid
+    
+    nf90_inq_dimid = nf_inq_dimid(ncid, name, dimid)
+  end function nf90_inq_dimid
+  ! -----------
+  function nf90_rename_dim(ncid, dimid, name)
+    integer,             intent( in) :: ncid
+    character (len = *), intent( in) :: name
+    integer,             intent( in) :: dimid
+    integer                          :: nf90_rename_dim
+
+    nf90_rename_dim = nf_rename_dim(ncid, dimid, name)
+  end function nf90_rename_dim
+  ! -----------
+  function nf90_inquire_dimension(ncid, dimid, name, len)
+    integer,                       intent( in) :: ncid, dimid
+    character (len = *), optional, intent(out) :: name
+    integer,             optional, intent(out) :: len
+    integer                                    :: nf90_inquire_dimension
+    
+    character (len = nf90_max_name) :: dimName
+    integer                         :: length
+    
+    nf90_inquire_dimension = nf_inq_dim(ncid, dimid, dimName, length)
+    if(present(name)) name = trim(dimName)
+    if(present(len )) len  = length
+  end function nf90_inquire_dimension
+  ! -----------
diff --git a/fortran/netcdf_eightbyte.f90 b/fortran/netcdf_eightbyte.f90
new file mode 100644
index 0000000..1d677b2
--- /dev/null
+++ b/fortran/netcdf_eightbyte.f90
@@ -0,0 +1,540 @@
+  function nf90_put_var_1D_EightByteInt(ncid, varid, values, start, count, stride, map)
+     integer,                         intent( in) :: ncid, varid
+     integer (kind = EightByteInt), dimension(:), &
+                                      intent( in) :: values
+     integer, dimension(:), optional, intent( in) :: start, count, stride, map
+     integer                                      :: nf90_put_var_1D_EightByteInt
+ 
+     integer, dimension(nf90_max_var_dims) :: localStart, localCount, localStride, localMap
+     integer                               :: numDims, counter
+ 
+     ! Set local arguments to default values
+     numDims                 = size(shape(values))
+     localStart (:         ) = 1
+     localCount (:numDims  ) = shape(values)
+     localCount (numDims+1:) = 1
+     localStride(:         ) = 1
+     localMap   (:numDims  ) = (/ 1, (product(localCount(:counter)), counter = 1, numDims - 1) /)
+ 
+     if(present(start))  localStart (:size(start) )  = start(:)
+     if(present(count))  localCount (:size(count) )  = count(:)
+     if(present(stride)) localStride(:size(stride)) = stride(:)
+     if(present(map))  then
+       localMap   (:size(map))    = map(:)
+       nf90_put_var_1D_EightByteInt = &
+          nf_put_varm_int(ncid, varid, localStart, localCount, localStride, localMap, int(values))
+     else if(present(stride)) then
+       nf90_put_var_1D_EightByteInt = &
+          nf_put_vars_int(ncid, varid, localStart, localCount, localStride, int(values))
+     else
+       nf90_put_var_1D_EightByteInt = &
+          nf_put_vara_int(ncid, varid, localStart, localCount, int(values))
+     end if
+   end function nf90_put_var_1D_EightByteInt
+
+
+   function nf90_put_var_2D_EightByteInt(ncid, varid, values, start, count, stride, map)
+     integer,                         intent( in) :: ncid, varid
+     integer (kind = EightByteInt), dimension(:, :), &
+                                      intent( in) :: values
+     integer, dimension(:), optional, intent( in) :: start, count, stride, map
+     integer                                      :: nf90_put_var_2D_EightByteInt
+ 
+     integer, dimension(nf90_max_var_dims) :: localStart, localCount, localStride, localMap
+     integer                               :: numDims, counter
+ 
+     ! Set local arguments to default values
+     numDims                 = size(shape(values))
+     localStart (:         ) = 1
+     localCount (:numDims  ) = shape(values)
+     localCount (numDims+1:) = 1
+     localStride(:         ) = 1
+     localMap   (:numDims  ) = (/ 1, (product(localCount(:counter)), counter = 1, numDims - 1) /)
+ 
+     if(present(start))  localStart (:size(start) )  = start(:)
+     if(present(count))  localCount (:size(count) )  = count(:)
+     if(present(stride)) localStride(:size(stride)) = stride(:)
+     if(present(map))  then
+       localMap   (:size(map))    = map(:)
+       nf90_put_var_2D_EightByteInt = &
+          nf_put_varm_int(ncid, varid, localStart, localCount, localStride, localMap, int(values))
+     else if(present(stride)) then
+       nf90_put_var_2D_EightByteInt = &
+          nf_put_vars_int(ncid, varid, localStart, localCount, localStride, int(values))
+     else
+       nf90_put_var_2D_EightByteInt = &
+          nf_put_vara_int(ncid, varid, localStart, localCount, int(values))
+     end if
+   end function nf90_put_var_2D_EightByteInt
+
+
+   function nf90_put_var_3D_EightByteInt(ncid, varid, values, start, count, stride, map)
+     integer,                         intent( in) :: ncid, varid
+     integer (kind = EightByteInt), dimension(:, :, :), &
+                                      intent( in) :: values
+     integer, dimension(:), optional, intent( in) :: start, count, stride, map
+     integer                                      :: nf90_put_var_3D_EightByteInt
+ 
+     integer, dimension(nf90_max_var_dims) :: localStart, localCount, localStride, localMap
+     integer                               :: numDims, counter
+ 
+     ! Set local arguments to default values
+     numDims                 = size(shape(values))
+     localStart (:         ) = 1
+     localCount (:numDims  ) = shape(values)
+     localCount (numDims+1:) = 1
+     localStride(:         ) = 1
+     localMap   (:numDims  ) = (/ 1, (product(localCount(:counter)), counter = 1, numDims - 1) /)
+ 
+     if(present(start))  localStart (:size(start) )  = start(:)
+     if(present(count))  localCount (:size(count) )  = count(:)
+     if(present(stride)) localStride(:size(stride)) = stride(:)
+     if(present(map))  then
+       localMap   (:size(map))    = map(:)
+       nf90_put_var_3D_EightByteInt = &
+          nf_put_varm_int(ncid, varid, localStart, localCount, localStride, localMap, int(values))
+     else if(present(stride)) then
+       nf90_put_var_3D_EightByteInt = &
+          nf_put_vars_int(ncid, varid, localStart, localCount, localStride, int(values))
+     else
+       nf90_put_var_3D_EightByteInt = &
+          nf_put_vara_int(ncid, varid, localStart, localCount, int(values))
+     end if
+   end function nf90_put_var_3D_EightByteInt
+
+
+   function nf90_put_var_4D_EightByteInt(ncid, varid, values, start, count, stride, map)
+     integer,                         intent( in) :: ncid, varid
+     integer (kind = EightByteInt), dimension(:, :, :, :), &
+                                      intent( in) :: values
+     integer, dimension(:), optional, intent( in) :: start, count, stride, map
+     integer                                      :: nf90_put_var_4D_EightByteInt
+ 
+     integer, dimension(nf90_max_var_dims) :: localStart, localCount, localStride, localMap
+     integer                               :: numDims, counter
+ 
+     ! Set local arguments to default values
+     numDims                 = size(shape(values))
+     localStart (:         ) = 1
+     localCount (:numDims  ) = shape(values)
+     localCount (numDims+1:) = 1
+     localStride(:         ) = 1
+     localMap   (:numDims  ) = (/ 1, (product(localCount(:counter)), counter = 1, numDims - 1) /)
+ 
+     if(present(start))  localStart (:size(start) )  = start(:)
+     if(present(count))  localCount (:size(count) )  = count(:)
+     if(present(stride)) localStride(:size(stride)) = stride(:)
+     if(present(map))  then
+       localMap   (:size(map))    = map(:)
+       nf90_put_var_4D_EightByteInt = &
+          nf_put_varm_int(ncid, varid, localStart, localCount, localStride, localMap, int(values))
+     else if(present(stride)) then
+       nf90_put_var_4D_EightByteInt = &
+          nf_put_vars_int(ncid, varid, localStart, localCount, localStride, int(values))
+     else
+       nf90_put_var_4D_EightByteInt = &
+          nf_put_vara_int(ncid, varid, localStart, localCount, int(values))
+     end if
+   end function nf90_put_var_4D_EightByteInt
+
+
+   function nf90_put_var_5D_EightByteInt(ncid, varid, values, start, count, stride, map)
+     integer,                         intent( in) :: ncid, varid
+     integer (kind = EightByteInt), dimension(:, :, :, :, :), &
+                                      intent( in) :: values
+     integer, dimension(:), optional, intent( in) :: start, count, stride, map
+     integer                                      :: nf90_put_var_5D_EightByteInt
+ 
+     integer, dimension(nf90_max_var_dims) :: localStart, localCount, localStride, localMap
+     integer                               :: numDims, counter
+ 
+     ! Set local arguments to default values
+     numDims                 = size(shape(values))
+     localStart (:         ) = 1
+     localCount (:numDims  ) = shape(values)
+     localCount (numDims+1:) = 1
+     localStride(:         ) = 1
+     localMap   (:numDims  ) = (/ 1, (product(localCount(:counter)), counter = 1, numDims - 1) /)
+ 
+     if(present(start))  localStart (:size(start) )  = start(:)
+     if(present(count))  localCount (:size(count) )  = count(:)
+     if(present(stride)) localStride(:size(stride)) = stride(:)
+     if(present(map))  then
+       localMap   (:size(map))    = map(:)
+       nf90_put_var_5D_EightByteInt = &
+          nf_put_varm_int(ncid, varid, localStart, localCount, localStride, localMap, int(values))
+     else if(present(stride)) then
+       nf90_put_var_5D_EightByteInt = &
+          nf_put_vars_int(ncid, varid, localStart, localCount, localStride, int(values))
+     else
+       nf90_put_var_5D_EightByteInt = &
+          nf_put_vara_int(ncid, varid, localStart, localCount, int(values))
+     end if
+   end function nf90_put_var_5D_EightByteInt
+
+
+   function nf90_put_var_6D_EightByteInt(ncid, varid, values, start, count, stride, map)
+     integer,                         intent( in) :: ncid, varid
+     integer (kind = EightByteInt), dimension(:, :, :, :, :, :), &
+                                      intent( in) :: values
+     integer, dimension(:), optional, intent( in) :: start, count, stride, map
+     integer                                      :: nf90_put_var_6D_EightByteInt
+ 
+     integer, dimension(nf90_max_var_dims) :: localStart, localCount, localStride, localMap
+     integer                               :: numDims, counter
+ 
+     ! Set local arguments to default values
+     numDims                 = size(shape(values))
+     localStart (:         ) = 1
+     localCount (:numDims  ) = shape(values)
+     localCount (numDims+1:) = 1
+     localStride(:         ) = 1
+     localMap   (:numDims  ) = (/ 1, (product(localCount(:counter)), counter = 1, numDims - 1) /)
+ 
+     if(present(start))  localStart (:size(start) )  = start(:)
+     if(present(count))  localCount (:size(count) )  = count(:)
+     if(present(stride)) localStride(:size(stride)) = stride(:)
+     if(present(map))  then
+       localMap   (:size(map))    = map(:)
+       nf90_put_var_6D_EightByteInt = &
+          nf_put_varm_int(ncid, varid, localStart, localCount, localStride, localMap, int(values))
+     else if(present(stride)) then
+       nf90_put_var_6D_EightByteInt = &
+          nf_put_vars_int(ncid, varid, localStart, localCount, localStride, int(values))
+     else
+       nf90_put_var_6D_EightByteInt = &
+          nf_put_vara_int(ncid, varid, localStart, localCount, int(values))
+     end if
+   end function nf90_put_var_6D_EightByteInt
+
+
+   function nf90_put_var_7D_EightByteInt(ncid, varid, values, start, count, stride, map)
+     integer,                         intent( in) :: ncid, varid
+     integer (kind = EightByteInt), dimension(:, :, :, :, :, :, :), &
+                                      intent( in) :: values
+     integer, dimension(:), optional, intent( in) :: start, count, stride, map
+     integer                                      :: nf90_put_var_7D_EightByteInt
+ 
+     integer, dimension(nf90_max_var_dims) :: localStart, localCount, localStride, localMap
+     integer                               :: numDims, counter
+ 
+     ! Set local arguments to default values
+     numDims                 = size(shape(values))
+     localStart (:         ) = 1
+     localCount (:numDims  ) = shape(values)
+     localCount (numDims+1:) = 1
+     localStride(:         ) = 1
+     localMap   (:numDims  ) = (/ 1, (product(localCount(:counter)), counter = 1, numDims - 1) /)
+ 
+     if(present(start))  localStart (:size(start) )  = start(:)
+     if(present(count))  localCount (:size(count) )  = count(:)
+     if(present(stride)) localStride(:size(stride)) = stride(:)
+     if(present(map))  then
+       localMap   (:size(map))    = map(:)
+       nf90_put_var_7D_EightByteInt = &
+          nf_put_varm_int(ncid, varid, localStart, localCount, localStride, localMap, int(values))
+     else if(present(stride)) then
+       nf90_put_var_7D_EightByteInt = &
+          nf_put_vars_int(ncid, varid, localStart, localCount, localStride, int(values))
+     else
+       nf90_put_var_7D_EightByteInt = &
+          nf_put_vara_int(ncid, varid, localStart, localCount, int(values))
+     end if
+   end function nf90_put_var_7D_EightByteInt
+
+
+   function nf90_get_var_1D_EightByteInt(ncid, varid, values, start, count, stride, map)
+     integer,                         intent( in) :: ncid, varid
+     integer (kind = EightByteInt), dimension(:), &
+                                      intent(out) :: values
+     integer, dimension(:), optional, intent( in) :: start, count, stride, map
+     integer                                      :: nf90_get_var_1D_EightByteInt
+ 
+     integer, dimension(nf90_max_var_dims) :: localStart, localCount, localStride, localMap
+     integer                               :: numDims, counter
+     integer, dimension(size(values))      :: defaultIntArray
+ 
+     ! Set local arguments to default values
+     numDims                 = size(shape(values))
+     localStart (:         ) = 1
+     localCount (:numDims  ) = shape(values)
+     localCount (numDims+1:) = 1
+     localStride(:         ) = 1
+     localMap   (:numDims  ) = (/ 1, (product(localCount(:counter)), counter = 1, numDims - 1) /)
+ 
+     if(present(start))  localStart (:size(start) )  = start(:)
+     if(present(count))  localCount (:size(count) )  = count(:)
+     if(present(stride)) localStride(:size(stride)) = stride(:)
+     if(present(map))  then
+       localMap   (:size(map))    = map(:)
+       nf90_get_var_1D_EightByteInt = &
+          nf_get_varm_int(ncid, varid, localStart, localCount, localStride, localMap, defaultIntArray)
+     else if(present(stride)) then
+       nf90_get_var_1D_EightByteInt = &
+          nf_get_vars_int(ncid, varid, localStart, localCount, localStride, defaultIntArray)
+     else
+       nf90_get_var_1D_EightByteInt = &
+          nf_get_vara_int(ncid, varid, localStart, localCount, defaultIntArray)
+     end if
+     values(:) = reshape(defaultIntArray(:), shape(values))
+   end function nf90_get_var_1D_EightByteInt
+
+
+   function nf90_get_var_2D_EightByteInt(ncid, varid, values, start, count, stride, map)
+     integer,                         intent( in) :: ncid, varid
+     integer (kind = EightByteInt), dimension(:, :), &
+                                      intent(out) :: values
+     integer, dimension(:), optional, intent( in) :: start, count, stride, map
+     integer                                      :: nf90_get_var_2D_EightByteInt
+ 
+     integer, dimension(nf90_max_var_dims) :: localStart, localCount, localStride, localMap
+     integer                               :: numDims, counter
+     integer, dimension(size(values))      :: defaultIntArray
+ 
+     ! Set local arguments to default values
+     numDims                 = size(shape(values))
+     localStart (:         ) = 1
+     localCount (:numDims  ) = shape(values)
+     localCount (numDims+1:) = 1
+     localStride(:         ) = 1
+     localMap   (:numDims  ) = (/ 1, (product(localCount(:counter)), counter = 1, numDims - 1) /)
+ 
+     if(present(start))  localStart (:size(start) )  = start(:)
+     if(present(count))  localCount (:size(count) )  = count(:)
+     if(present(stride)) localStride(:size(stride)) = stride(:)
+     if(present(map))  then
+       localMap   (:size(map))    = map(:)
+       nf90_get_var_2D_EightByteInt = &
+          nf_get_varm_int(ncid, varid, localStart, localCount, localStride, localMap, defaultIntArray)
+     else if(present(stride)) then
+       nf90_get_var_2D_EightByteInt = &
+          nf_get_vars_int(ncid, varid, localStart, localCount, localStride, defaultIntArray)
+     else
+       nf90_get_var_2D_EightByteInt = &
+          nf_get_vara_int(ncid, varid, localStart, localCount, defaultIntArray)
+     end if
+     values(:, :) = reshape(defaultIntArray(:), shape(values))
+   end function nf90_get_var_2D_EightByteInt
+
+
+   function nf90_get_var_3D_EightByteInt(ncid, varid, values, start, count, stride, map)
+     integer,                         intent( in) :: ncid, varid
+     integer (kind = EightByteInt), dimension(:, :, :), &
+                                      intent(out) :: values
+     integer, dimension(:), optional, intent( in) :: start, count, stride, map
+     integer                                      :: nf90_get_var_3D_EightByteInt
+ 
+     integer, dimension(nf90_max_var_dims) :: localStart, localCount, localStride, localMap
+     integer                               :: numDims, counter
+     integer, dimension(size(values))      :: defaultIntArray
+ 
+     ! Set local arguments to default values
+     numDims                 = size(shape(values))
+     localStart (:         ) = 1
+     localCount (:numDims  ) = shape(values)
+     localCount (numDims+1:) = 1
+     localStride(:         ) = 1
+     localMap   (:numDims  ) = (/ 1, (product(localCount(:counter)), counter = 1, numDims - 1) /)
+ 
+     if(present(start))  localStart (:size(start) )  = start(:)
+     if(present(count))  localCount (:size(count) )  = count(:)
+     if(present(stride)) localStride(:size(stride)) = stride(:)
+     if(present(map))  then
+       localMap   (:size(map))    = map(:)
+       nf90_get_var_3D_EightByteInt = &
+          nf_get_varm_int(ncid, varid, localStart, localCount, localStride, localMap, defaultIntArray)
+     else if(present(stride)) then
+       nf90_get_var_3D_EightByteInt = &
+          nf_get_vars_int(ncid, varid, localStart, localCount, localStride, defaultIntArray)
+     else
+       nf90_get_var_3D_EightByteInt = &
+          nf_get_vara_int(ncid, varid, localStart, localCount, defaultIntArray)
+     end if
+     values(:, :, :) = reshape(defaultIntArray(:), shape(values))
+   end function nf90_get_var_3D_EightByteInt
+
+
+   function nf90_get_var_4D_EightByteInt(ncid, varid, values, start, count, stride, map)
+     integer,                         intent( in) :: ncid, varid
+     integer (kind = EightByteInt), dimension(:, :, :, :), &
+                                      intent(out) :: values
+     integer, dimension(:), optional, intent( in) :: start, count, stride, map
+     integer                                      :: nf90_get_var_4D_EightByteInt
+ 
+     integer, dimension(nf90_max_var_dims) :: localStart, localCount, localStride, localMap
+     integer                               :: numDims, counter
+     integer, dimension(size(values))      :: defaultIntArray
+ 
+     ! Set local arguments to default values
+     numDims                 = size(shape(values))
+     localStart (:         ) = 1
+     localCount (:numDims  ) = shape(values)
+     localCount (numDims+1:) = 1
+     localStride(:         ) = 1
+     localMap   (:numDims  ) = (/ 1, (product(localCount(:counter)), counter = 1, numDims - 1) /)
+ 
+     if(present(start))  localStart (:size(start) )  = start(:)
+     if(present(count))  localCount (:size(count) )  = count(:)
+     if(present(stride)) localStride(:size(stride)) = stride(:)
+     if(present(map))  then
+       localMap   (:size(map))    = map(:)
+       nf90_get_var_4D_EightByteInt = &
+          nf_get_varm_int(ncid, varid, localStart, localCount, localStride, localMap, defaultIntArray)
+     else if(present(stride)) then
+       nf90_get_var_4D_EightByteInt = &
+          nf_get_vars_int(ncid, varid, localStart, localCount, localStride, defaultIntArray)
+     else
+       nf90_get_var_4D_EightByteInt = &
+          nf_get_vara_int(ncid, varid, localStart, localCount, defaultIntArray)
+     end if
+     values(:, :, :, :) = reshape(defaultIntArray(:), shape(values))
+   end function nf90_get_var_4D_EightByteInt
+
+
+   function nf90_get_var_5D_EightByteInt(ncid, varid, values, start, count, stride, map)
+     integer,                         intent( in) :: ncid, varid
+     integer (kind = EightByteInt), dimension(:, :, :, :, :), &
+                                      intent(out) :: values
+     integer, dimension(:), optional, intent( in) :: start, count, stride, map
+     integer                                      :: nf90_get_var_5D_EightByteInt
+ 
+     integer, dimension(nf90_max_var_dims) :: localStart, localCount, localStride, localMap
+     integer                               :: numDims, counter
+     integer, dimension(size(values))      :: defaultIntArray
+ 
+     ! Set local arguments to default values
+     numDims                 = size(shape(values))
+     localStart (:         ) = 1
+     localCount (:numDims  ) = shape(values)
+     localCount (numDims+1:) = 1
+     localStride(:         ) = 1
+     localMap   (:numDims  ) = (/ 1, (product(localCount(:counter)), counter = 1, numDims - 1) /)
+ 
+     if(present(start))  localStart (:size(start) )  = start(:)
+     if(present(count))  localCount (:size(count) )  = count(:)
+     if(present(stride)) localStride(:size(stride)) = stride(:)
+     if(present(map))  then
+       localMap   (:size(map))    = map(:)
+       nf90_get_var_5D_EightByteInt = &
+          nf_get_varm_int(ncid, varid, localStart, localCount, localStride, localMap, defaultIntArray)
+     else if(present(stride)) then
+       nf90_get_var_5D_EightByteInt = &
+          nf_get_vars_int(ncid, varid, localStart, localCount, localStride, defaultIntArray)
+     else
+       nf90_get_var_5D_EightByteInt = &
+          nf_get_vara_int(ncid, varid, localStart, localCount, defaultIntArray)
+     end if
+     values(:, :, :, :, :) = reshape(defaultIntArray(:), shape(values))
+   end function nf90_get_var_5D_EightByteInt
+
+
+   function nf90_get_var_6D_EightByteInt(ncid, varid, values, start, count, stride, map)
+     integer,                         intent( in) :: ncid, varid
+     integer (kind = EightByteInt), dimension(:, :, :, :, :, :), &
+                                      intent(out) :: values
+     integer, dimension(:), optional, intent( in) :: start, count, stride, map
+     integer                                      :: nf90_get_var_6D_EightByteInt
+ 
+     integer, dimension(nf90_max_var_dims) :: localStart, localCount, localStride, localMap
+     integer                               :: numDims, counter
+     integer, dimension(size(values))      :: defaultIntArray
+ 
+     ! Set local arguments to default values
+     numDims                 = size(shape(values))
+     localStart (:         ) = 1
+     localCount (:numDims  ) = shape(values)
+     localCount (numDims+1:) = 1
+     localStride(:         ) = 1
+     localMap   (:numDims  ) = (/ 1, (product(localCount(:counter)), counter = 1, numDims - 1) /)
+ 
+     if(present(start))  localStart (:size(start) )  = start(:)
+     if(present(count))  localCount (:size(count) )  = count(:)
+     if(present(stride)) localStride(:size(stride)) = stride(:)
+     if(present(map))  then
+       localMap   (:size(map))    = map(:)
+       nf90_get_var_6D_EightByteInt = &
+          nf_get_varm_int(ncid, varid, localStart, localCount, localStride, localMap, defaultIntArray)
+     else if(present(stride)) then
+       nf90_get_var_6D_EightByteInt = &
+          nf_get_vars_int(ncid, varid, localStart, localCount, localStride, defaultIntArray)
+     else
+       nf90_get_var_6D_EightByteInt = &
+          nf_get_vara_int(ncid, varid, localStart, localCount, defaultIntArray)
+     end if
+     values(:, :, :, :, :, :) = reshape(defaultIntArray(:), shape(values))
+   end function nf90_get_var_6D_EightByteInt
+
+
+   function nf90_get_var_7D_EightByteInt(ncid, varid, values, start, count, stride, map)
+     integer,                         intent( in) :: ncid, varid
+     integer (kind = EightByteInt), dimension(:, :, :, :, :, :, :), &
+                                      intent(out) :: values
+     integer, dimension(:), optional, intent( in) :: start, count, stride, map
+     integer                                      :: nf90_get_var_7D_EightByteInt
+ 
+     integer, dimension(nf90_max_var_dims) :: localStart, localCount, localStride, localMap
+     integer                               :: numDims, counter
+     integer, dimension(size(values))      :: defaultIntArray
+ 
+     ! Set local arguments to default values
+     numDims                 = size(shape(values))
+     localStart (:         ) = 1
+     localCount (:numDims  ) = shape(values)
+     localCount (numDims+1:) = 1
+     localStride(:         ) = 1
+     localMap   (:numDims  ) = (/ 1, (product(localCount(:counter)), counter = 1, numDims - 1) /)
+ 
+     if(present(start))  localStart (:size(start) )  = start(:)
+     if(present(count))  localCount (:size(count) )  = count(:)
+     if(present(stride)) localStride(:size(stride)) = stride(:)
+     if(present(map))  then
+       localMap   (:size(map))    = map(:)
+       nf90_get_var_7D_EightByteInt = &
+          nf_get_varm_int(ncid, varid, localStart, localCount, localStride, localMap, defaultIntArray)
+     else if(present(stride)) then
+       nf90_get_var_7D_EightByteInt = &
+          nf_get_vars_int(ncid, varid, localStart, localCount, localStride, defaultIntArray)
+     else
+       nf90_get_var_7D_EightByteInt = &
+          nf_get_vara_int(ncid, varid, localStart, localCount, defaultIntArray)
+     end if
+     values(:, :, :, :, :, :, :) = reshape(defaultIntArray(:), shape(values))
+   end function nf90_get_var_7D_EightByteInt
+
+
+   function nf90_put_var_EightByteInt(ncid, varid, values, start)
+     integer,                         intent( in) :: ncid, varid
+     integer (kind = EightByteInt), intent( in) :: values
+     integer, dimension(:), optional, intent( in) :: start
+     integer                                      :: nf90_put_var_EightByteInt
+ 
+     integer, dimension(nf90_max_var_dims) :: localIndex
+     integer                               :: counter
+ 
+     ! Set local arguments to default values
+     localIndex(:) = 1
+     if(present(start)) localIndex(:size(start)) = start(:)
+ 
+     nf90_put_var_EightByteInt = nf_put_var1_int(ncid, varid, localIndex, int(values))
+   end function nf90_put_var_EightByteInt
+
+
+   function nf90_get_var_EightByteInt(ncid, varid, values, start)
+     integer,                         intent( in) :: ncid, varid
+     integer (kind = EightByteInt), intent(out) :: values
+     integer, dimension(:), optional, intent( in) :: start
+     integer                                      :: nf90_get_var_EightByteInt
+ 
+     integer, dimension(nf90_max_var_dims) :: localIndex
+     integer                               :: counter
+     integer                               :: defaultInteger
+     
+     ! Set local arguments to default values
+     localIndex(:) = 1
+     if(present(start)) localIndex(:size(start)) = start(:)
+ 
+     nf90_get_var_EightByteInt = nf_get_var1_int(ncid, varid, localIndex, defaultInteger)
+     values = defaultInteger
+   end function nf90_get_var_EightByteInt
+
+
diff --git a/fortran/netcdf_expanded.f90 b/fortran/netcdf_expanded.f90
new file mode 100644
index 0000000..9083f64
--- /dev/null
+++ b/fortran/netcdf_expanded.f90
@@ -0,0 +1,2638 @@
+
+   function nf90_put_var_OneByteInt(ncid, varid, values, start)
+     integer,                         intent( in) :: ncid, varid
+     integer (kind = OneByteInt), intent( in) :: values
+     integer, dimension(:), optional, intent( in) :: start
+     integer                                      :: nf90_put_var_OneByteInt
+ 
+     integer, dimension(nf90_max_var_dims) :: localIndex
+     integer                               :: counter
+ 
+     ! Set local arguments to default values
+     localIndex(:) = 1
+     if(present(start)) localIndex(:size(start)) = start(:)
+ 
+     nf90_put_var_OneByteInt = nf_put_var1_int1(ncid, varid, localIndex, values)
+   end function nf90_put_var_OneByteInt
+
+
+   function nf90_put_var_TwoByteInt(ncid, varid, values, start)
+     integer,                         intent( in) :: ncid, varid
+     integer (kind = TwoByteInt), intent( in) :: values
+     integer, dimension(:), optional, intent( in) :: start
+     integer                                      :: nf90_put_var_TwoByteInt
+ 
+     integer, dimension(nf90_max_var_dims) :: localIndex
+     integer                               :: counter
+ 
+     ! Set local arguments to default values
+     localIndex(:) = 1
+     if(present(start)) localIndex(:size(start)) = start(:)
+ 
+     nf90_put_var_TwoByteInt = nf_put_var1_int2(ncid, varid, localIndex, values)
+   end function nf90_put_var_TwoByteInt
+
+
+   function nf90_put_var_FourByteInt(ncid, varid, values, start)
+     integer,                         intent( in) :: ncid, varid
+     integer (kind = FourByteInt), intent( in) :: values
+     integer, dimension(:), optional, intent( in) :: start
+     integer                                      :: nf90_put_var_FourByteInt
+ 
+     integer, dimension(nf90_max_var_dims) :: localIndex
+     integer                               :: counter
+ 
+     ! Set local arguments to default values
+     localIndex(:) = 1
+     if(present(start)) localIndex(:size(start)) = start(:)
+ 
+     nf90_put_var_FourByteInt = nf_put_var1_int(ncid, varid, localIndex, int(values))
+   end function nf90_put_var_FourByteInt
+
+
+   function nf90_put_var_FourByteReal(ncid, varid, values, start)
+     integer,                         intent( in) :: ncid, varid
+     real (kind = FourByteReal), intent( in) :: values
+     integer, dimension(:), optional, intent( in) :: start
+     integer                                      :: nf90_put_var_FourByteReal
+ 
+     integer, dimension(nf90_max_var_dims) :: localIndex
+     integer                               :: counter
+ 
+     ! Set local arguments to default values
+     localIndex(:) = 1
+     if(present(start)) localIndex(:size(start)) = start(:)
+ 
+     nf90_put_var_FourByteReal = nf_put_var1_real(ncid, varid, localIndex, values)
+   end function nf90_put_var_FourByteReal
+
+
+   function nf90_put_var_EightByteReal(ncid, varid, values, start)
+     integer,                         intent( in) :: ncid, varid
+     real (kind = EightByteReal), intent( in) :: values
+     integer, dimension(:), optional, intent( in) :: start
+     integer                                      :: nf90_put_var_EightByteReal
+ 
+     integer, dimension(nf90_max_var_dims) :: localIndex
+     integer                               :: counter
+ 
+     ! Set local arguments to default values
+     localIndex(:) = 1
+     if(present(start)) localIndex(:size(start)) = start(:)
+ 
+     nf90_put_var_EightByteReal = nf_put_var1_double(ncid, varid, localIndex, values)
+   end function nf90_put_var_EightByteReal
+
+
+   function nf90_get_var_OneByteInt(ncid, varid, values, start)
+     integer,                         intent( in) :: ncid, varid
+     integer (kind = OneByteInt), intent(out) :: values
+     integer, dimension(:), optional, intent( in) :: start
+     integer                                      :: nf90_get_var_OneByteInt
+ 
+     integer, dimension(nf90_max_var_dims) :: localIndex
+     integer                               :: counter
+ 
+     ! Set local arguments to default values
+     localIndex(:) = 1
+     if(present(start)) localIndex(:size(start)) = start(:)
+ 
+     nf90_get_var_OneByteInt = nf_get_var1_int1(ncid, varid, localIndex, values)
+   end function nf90_get_var_OneByteInt
+
+
+   function nf90_get_var_TwoByteInt(ncid, varid, values, start)
+     integer,                         intent( in) :: ncid, varid
+     integer (kind = TwoByteInt), intent(out) :: values
+     integer, dimension(:), optional, intent( in) :: start
+     integer                                      :: nf90_get_var_TwoByteInt
+ 
+     integer, dimension(nf90_max_var_dims) :: localIndex
+     integer                               :: counter
+ 
+     ! Set local arguments to default values
+     localIndex(:) = 1
+     if(present(start)) localIndex(:size(start)) = start(:)
+ 
+     nf90_get_var_TwoByteInt = nf_get_var1_int2(ncid, varid, localIndex, values)
+   end function nf90_get_var_TwoByteInt
+
+
+   function nf90_get_var_FourByteInt(ncid, varid, values, start)
+     integer,                         intent( in) :: ncid, varid
+     integer (kind = FourByteInt), intent(out) :: values
+     integer, dimension(:), optional, intent( in) :: start
+     integer                                      :: nf90_get_var_FourByteInt
+ 
+     integer, dimension(nf90_max_var_dims) :: localIndex
+     integer                               :: counter
+     integer                               :: defaultInteger
+     
+     ! Set local arguments to default values
+     localIndex(:) = 1
+     if(present(start)) localIndex(:size(start)) = start(:)
+ 
+     nf90_get_var_FourByteInt = nf_get_var1_int(ncid, varid, localIndex, defaultInteger)
+     values = defaultInteger
+   end function nf90_get_var_FourByteInt
+
+
+   function nf90_get_var_FourByteReal(ncid, varid, values, start)
+     integer,                         intent( in) :: ncid, varid
+     real (kind = FourByteReal), intent(out) :: values
+     integer, dimension(:), optional, intent( in) :: start
+     integer                                      :: nf90_get_var_FourByteReal
+ 
+     integer, dimension(nf90_max_var_dims) :: localIndex
+     integer                               :: counter
+ 
+     ! Set local arguments to default values
+     localIndex(:) = 1
+     if(present(start)) localIndex(:size(start)) = start(:)
+ 
+     nf90_get_var_FourByteReal = nf_get_var1_real(ncid, varid, localIndex, values)
+   end function nf90_get_var_FourByteReal
+
+
+   function nf90_get_var_EightByteReal(ncid, varid, values, start)
+     integer,                         intent( in) :: ncid, varid
+     real (kind = EightByteReal), intent(out) :: values
+     integer, dimension(:), optional, intent( in) :: start
+     integer                                      :: nf90_get_var_EightByteReal
+ 
+     integer, dimension(nf90_max_var_dims) :: localIndex
+     integer                               :: counter
+ 
+     ! Set local arguments to default values
+     localIndex(:) = 1
+     if(present(start)) localIndex(:size(start)) = start(:)
+ 
+     nf90_get_var_EightByteReal = nf_get_var1_double(ncid, varid, localIndex, values)
+   end function nf90_get_var_EightByteReal
+
+
+
+   function nf90_put_var_1D_OneByteInt(ncid, varid, values, start, count, stride, map)
+     integer,                         intent( in) :: ncid, varid
+     integer (kind = OneByteInt), dimension(:), &
+                                      intent( in) :: values
+     integer, dimension(:), optional, intent( in) :: start, count, stride, map
+     integer                                      :: nf90_put_var_1D_OneByteInt
+ 
+     integer, dimension(nf90_max_var_dims) :: localStart, localCount, localStride, localMap
+     integer                               :: numDims, counter
+ 
+     ! Set local arguments to default values
+     numDims                 = size(shape(values))
+     localStart (:         ) = 1
+     localCount (:numDims  ) = shape(values)
+     localCount (numDims+1:) = 1
+     localStride(:         ) = 1
+     localMap   (:numDims  ) = (/ 1, (product(localCount(:counter)), counter = 1, numDims - 1) /)
+ 
+     if(present(start))  localStart (:size(start) )  = start(:)
+     if(present(count))  localCount (:size(count) )  = count(:)
+     if(present(stride)) localStride(:size(stride)) = stride(:)
+     if(present(map))  then
+       localMap   (:size(map))    = map(:)
+       nf90_put_var_1D_OneByteInt = &
+          nf_put_varm_int1(ncid, varid, localStart, localCount, localStride, localMap, values)
+     else if(present(stride)) then
+       nf90_put_var_1D_OneByteInt = &
+          nf_put_vars_int1(ncid, varid, localStart, localCount, localStride, values)
+     else
+       nf90_put_var_1D_OneByteInt = &
+          nf_put_vara_int1(ncid, varid, localStart, localCount, values)
+     end if
+   end function nf90_put_var_1D_OneByteInt
+
+
+   function nf90_put_var_2D_OneByteInt(ncid, varid, values, start, count, stride, map)
+     integer,                         intent( in) :: ncid, varid
+     integer (kind = OneByteInt), dimension(:, :), &
+                                      intent( in) :: values
+     integer, dimension(:), optional, intent( in) :: start, count, stride, map
+     integer                                      :: nf90_put_var_2D_OneByteInt
+ 
+     integer, dimension(nf90_max_var_dims) :: localStart, localCount, localStride, localMap
+     integer                               :: numDims, counter
+ 
+     ! Set local arguments to default values
+     numDims                 = size(shape(values))
+     localStart (:         ) = 1
+     localCount (:numDims  ) = shape(values)
+     localCount (numDims+1:) = 1
+     localStride(:         ) = 1
+     localMap   (:numDims  ) = (/ 1, (product(localCount(:counter)), counter = 1, numDims - 1) /)
+ 
+     if(present(start))  localStart (:size(start) )  = start(:)
+     if(present(count))  localCount (:size(count) )  = count(:)
+     if(present(stride)) localStride(:size(stride)) = stride(:)
+     if(present(map))  then
+       localMap   (:size(map))    = map(:)
+       nf90_put_var_2D_OneByteInt = &
+          nf_put_varm_int1(ncid, varid, localStart, localCount, localStride, localMap, values)
+     else if(present(stride)) then
+       nf90_put_var_2D_OneByteInt = &
+          nf_put_vars_int1(ncid, varid, localStart, localCount, localStride, values)
+     else
+       nf90_put_var_2D_OneByteInt = &
+          nf_put_vara_int1(ncid, varid, localStart, localCount, values)
+     end if
+   end function nf90_put_var_2D_OneByteInt
+
+
+   function nf90_put_var_3D_OneByteInt(ncid, varid, values, start, count, stride, map)
+     integer,                         intent( in) :: ncid, varid
+     integer (kind = OneByteInt), dimension(:, :, :), &
+                                      intent( in) :: values
+     integer, dimension(:), optional, intent( in) :: start, count, stride, map
+     integer                                      :: nf90_put_var_3D_OneByteInt
+ 
+     integer, dimension(nf90_max_var_dims) :: localStart, localCount, localStride, localMap
+     integer                               :: numDims, counter
+ 
+     ! Set local arguments to default values
+     numDims                 = size(shape(values))
+     localStart (:         ) = 1
+     localCount (:numDims  ) = shape(values)
+     localCount (numDims+1:) = 1
+     localStride(:         ) = 1
+     localMap   (:numDims  ) = (/ 1, (product(localCount(:counter)), counter = 1, numDims - 1) /)
+ 
+     if(present(start))  localStart (:size(start) )  = start(:)
+     if(present(count))  localCount (:size(count) )  = count(:)
+     if(present(stride)) localStride(:size(stride)) = stride(:)
+     if(present(map))  then
+       localMap   (:size(map))    = map(:)
+       nf90_put_var_3D_OneByteInt = &
+          nf_put_varm_int1(ncid, varid, localStart, localCount, localStride, localMap, values)
+     else if(present(stride)) then
+       nf90_put_var_3D_OneByteInt = &
+          nf_put_vars_int1(ncid, varid, localStart, localCount, localStride, values)
+     else
+       nf90_put_var_3D_OneByteInt = &
+          nf_put_vara_int1(ncid, varid, localStart, localCount, values)
+     end if
+   end function nf90_put_var_3D_OneByteInt
+
+
+   function nf90_put_var_4D_OneByteInt(ncid, varid, values, start, count, stride, map)
+     integer,                         intent( in) :: ncid, varid
+     integer (kind = OneByteInt), dimension(:, :, :, :), &
+                                      intent( in) :: values
+     integer, dimension(:), optional, intent( in) :: start, count, stride, map
+     integer                                      :: nf90_put_var_4D_OneByteInt
+ 
+     integer, dimension(nf90_max_var_dims) :: localStart, localCount, localStride, localMap
+     integer                               :: numDims, counter
+ 
+     ! Set local arguments to default values
+     numDims                 = size(shape(values))
+     localStart (:         ) = 1
+     localCount (:numDims  ) = shape(values)
+     localCount (numDims+1:) = 1
+     localStride(:         ) = 1
+     localMap   (:numDims  ) = (/ 1, (product(localCount(:counter)), counter = 1, numDims - 1) /)
+ 
+     if(present(start))  localStart (:size(start) )  = start(:)
+     if(present(count))  localCount (:size(count) )  = count(:)
+     if(present(stride)) localStride(:size(stride)) = stride(:)
+     if(present(map))  then
+       localMap   (:size(map))    = map(:)
+       nf90_put_var_4D_OneByteInt = &
+          nf_put_varm_int1(ncid, varid, localStart, localCount, localStride, localMap, values)
+     else if(present(stride)) then
+       nf90_put_var_4D_OneByteInt = &
+          nf_put_vars_int1(ncid, varid, localStart, localCount, localStride, values)
+     else
+       nf90_put_var_4D_OneByteInt = &
+          nf_put_vara_int1(ncid, varid, localStart, localCount, values)
+     end if
+   end function nf90_put_var_4D_OneByteInt
+
+
+   function nf90_put_var_5D_OneByteInt(ncid, varid, values, start, count, stride, map)
+     integer,                         intent( in) :: ncid, varid
+     integer (kind = OneByteInt), dimension(:, :, :, :, :), &
+                                      intent( in) :: values
+     integer, dimension(:), optional, intent( in) :: start, count, stride, map
+     integer                                      :: nf90_put_var_5D_OneByteInt
+ 
+     integer, dimension(nf90_max_var_dims) :: localStart, localCount, localStride, localMap
+     integer                               :: numDims, counter
+ 
+     ! Set local arguments to default values
+     numDims                 = size(shape(values))
+     localStart (:         ) = 1
+     localCount (:numDims  ) = shape(values)
+     localCount (numDims+1:) = 1
+     localStride(:         ) = 1
+     localMap   (:numDims  ) = (/ 1, (product(localCount(:counter)), counter = 1, numDims - 1) /)
+ 
+     if(present(start))  localStart (:size(start) )  = start(:)
+     if(present(count))  localCount (:size(count) )  = count(:)
+     if(present(stride)) localStride(:size(stride)) = stride(:)
+     if(present(map))  then
+       localMap   (:size(map))    = map(:)
+       nf90_put_var_5D_OneByteInt = &
+          nf_put_varm_int1(ncid, varid, localStart, localCount, localStride, localMap, values)
+     else if(present(stride)) then
+       nf90_put_var_5D_OneByteInt = &
+          nf_put_vars_int1(ncid, varid, localStart, localCount, localStride, values)
+     else
+       nf90_put_var_5D_OneByteInt = &
+          nf_put_vara_int1(ncid, varid, localStart, localCount, values)
+     end if
+   end function nf90_put_var_5D_OneByteInt
+
+
+   function nf90_put_var_6D_OneByteInt(ncid, varid, values, start, count, stride, map)
+     integer,                         intent( in) :: ncid, varid
+     integer (kind = OneByteInt), dimension(:, :, :, :, :, :), &
+                                      intent( in) :: values
+     integer, dimension(:), optional, intent( in) :: start, count, stride, map
+     integer                                      :: nf90_put_var_6D_OneByteInt
+ 
+     integer, dimension(nf90_max_var_dims) :: localStart, localCount, localStride, localMap
+     integer                               :: numDims, counter
+ 
+     ! Set local arguments to default values
+     numDims                 = size(shape(values))
+     localStart (:         ) = 1
+     localCount (:numDims  ) = shape(values)
+     localCount (numDims+1:) = 1
+     localStride(:         ) = 1
+     localMap   (:numDims  ) = (/ 1, (product(localCount(:counter)), counter = 1, numDims - 1) /)
+ 
+     if(present(start))  localStart (:size(start) )  = start(:)
+     if(present(count))  localCount (:size(count) )  = count(:)
+     if(present(stride)) localStride(:size(stride)) = stride(:)
+     if(present(map))  then
+       localMap   (:size(map))    = map(:)
+       nf90_put_var_6D_OneByteInt = &
+          nf_put_varm_int1(ncid, varid, localStart, localCount, localStride, localMap, values)
+     else if(present(stride)) then
+       nf90_put_var_6D_OneByteInt = &
+          nf_put_vars_int1(ncid, varid, localStart, localCount, localStride, values)
+     else
+       nf90_put_var_6D_OneByteInt = &
+          nf_put_vara_int1(ncid, varid, localStart, localCount, values)
+     end if
+   end function nf90_put_var_6D_OneByteInt
+
+
+   function nf90_put_var_7D_OneByteInt(ncid, varid, values, start, count, stride, map)
+     integer,                         intent( in) :: ncid, varid
+     integer (kind = OneByteInt), dimension(:, :, :, :, :, :, :), &
+                                      intent( in) :: values
+     integer, dimension(:), optional, intent( in) :: start, count, stride, map
+     integer                                      :: nf90_put_var_7D_OneByteInt
+ 
+     integer, dimension(nf90_max_var_dims) :: localStart, localCount, localStride, localMap
+     integer                               :: numDims, counter
+ 
+     ! Set local arguments to default values
+     numDims                 = size(shape(values))
+     localStart (:         ) = 1
+     localCount (:numDims  ) = shape(values)
+     localCount (numDims+1:) = 1
+     localStride(:         ) = 1
+     localMap   (:numDims  ) = (/ 1, (product(localCount(:counter)), counter = 1, numDims - 1) /)
+ 
+     if(present(start))  localStart (:size(start) )  = start(:)
+     if(present(count))  localCount (:size(count) )  = count(:)
+     if(present(stride)) localStride(:size(stride)) = stride(:)
+     if(present(map))  then
+       localMap   (:size(map))    = map(:)
+       nf90_put_var_7D_OneByteInt = &
+          nf_put_varm_int1(ncid, varid, localStart, localCount, localStride, localMap, values)
+     else if(present(stride)) then
+       nf90_put_var_7D_OneByteInt = &
+          nf_put_vars_int1(ncid, varid, localStart, localCount, localStride, values)
+     else
+       nf90_put_var_7D_OneByteInt = &
+          nf_put_vara_int1(ncid, varid, localStart, localCount, values)
+     end if
+   end function nf90_put_var_7D_OneByteInt
+
+
+   function nf90_put_var_1D_TwoByteInt(ncid, varid, values, start, count, stride, map)
+     integer,                         intent( in) :: ncid, varid
+     integer (kind = TwoByteInt), dimension(:), &
+                                      intent( in) :: values
+     integer, dimension(:), optional, intent( in) :: start, count, stride, map
+     integer                                      :: nf90_put_var_1D_TwoByteInt
+ 
+     integer, dimension(nf90_max_var_dims) :: localStart, localCount, localStride, localMap
+     integer                               :: numDims, counter
+ 
+     ! Set local arguments to default values
+     numDims                 = size(shape(values))
+     localStart (:         ) = 1
+     localCount (:numDims  ) = shape(values)
+     localCount (numDims+1:) = 1
+     localStride(:         ) = 1
+     localMap   (:numDims  ) = (/ 1, (product(localCount(:counter)), counter = 1, numDims - 1) /)
+ 
+     if(present(start))  localStart (:size(start) )  = start(:)
+     if(present(count))  localCount (:size(count) )  = count(:)
+     if(present(stride)) localStride(:size(stride)) = stride(:)
+     if(present(map))  then
+       localMap   (:size(map))    = map(:)
+       nf90_put_var_1D_TwoByteInt = &
+          nf_put_varm_int2(ncid, varid, localStart, localCount, localStride, localMap, values)
+     else if(present(stride)) then
+       nf90_put_var_1D_TwoByteInt = &
+          nf_put_vars_int2(ncid, varid, localStart, localCount, localStride, values)
+     else
+       nf90_put_var_1D_TwoByteInt = &
+          nf_put_vara_int2(ncid, varid, localStart, localCount, values)
+     end if
+   end function nf90_put_var_1D_TwoByteInt
+
+
+   function nf90_put_var_2D_TwoByteInt(ncid, varid, values, start, count, stride, map)
+     integer,                         intent( in) :: ncid, varid
+     integer (kind = TwoByteInt), dimension(:, :), &
+                                      intent( in) :: values
+     integer, dimension(:), optional, intent( in) :: start, count, stride, map
+     integer                                      :: nf90_put_var_2D_TwoByteInt
+ 
+     integer, dimension(nf90_max_var_dims) :: localStart, localCount, localStride, localMap
+     integer                               :: numDims, counter
+ 
+     ! Set local arguments to default values
+     numDims                 = size(shape(values))
+     localStart (:         ) = 1
+     localCount (:numDims  ) = shape(values)
+     localCount (numDims+1:) = 1
+     localStride(:         ) = 1
+     localMap   (:numDims  ) = (/ 1, (product(localCount(:counter)), counter = 1, numDims - 1) /)
+ 
+     if(present(start))  localStart (:size(start) )  = start(:)
+     if(present(count))  localCount (:size(count) )  = count(:)
+     if(present(stride)) localStride(:size(stride)) = stride(:)
+     if(present(map))  then
+       localMap   (:size(map))    = map(:)
+       nf90_put_var_2D_TwoByteInt = &
+          nf_put_varm_int2(ncid, varid, localStart, localCount, localStride, localMap, values)
+     else if(present(stride)) then
+       nf90_put_var_2D_TwoByteInt = &
+          nf_put_vars_int2(ncid, varid, localStart, localCount, localStride, values)
+     else
+       nf90_put_var_2D_TwoByteInt = &
+          nf_put_vara_int2(ncid, varid, localStart, localCount, values)
+     end if
+   end function nf90_put_var_2D_TwoByteInt
+
+
+   function nf90_put_var_3D_TwoByteInt(ncid, varid, values, start, count, stride, map)
+     integer,                         intent( in) :: ncid, varid
+     integer (kind = TwoByteInt), dimension(:, :, :), &
+                                      intent( in) :: values
+     integer, dimension(:), optional, intent( in) :: start, count, stride, map
+     integer                                      :: nf90_put_var_3D_TwoByteInt
+ 
+     integer, dimension(nf90_max_var_dims) :: localStart, localCount, localStride, localMap
+     integer                               :: numDims, counter
+ 
+     ! Set local arguments to default values
+     numDims                 = size(shape(values))
+     localStart (:         ) = 1
+     localCount (:numDims  ) = shape(values)
+     localCount (numDims+1:) = 1
+     localStride(:         ) = 1
+     localMap   (:numDims  ) = (/ 1, (product(localCount(:counter)), counter = 1, numDims - 1) /)
+ 
+     if(present(start))  localStart (:size(start) )  = start(:)
+     if(present(count))  localCount (:size(count) )  = count(:)
+     if(present(stride)) localStride(:size(stride)) = stride(:)
+     if(present(map))  then
+       localMap   (:size(map))    = map(:)
+       nf90_put_var_3D_TwoByteInt = &
+          nf_put_varm_int2(ncid, varid, localStart, localCount, localStride, localMap, values)
+     else if(present(stride)) then
+       nf90_put_var_3D_TwoByteInt = &
+          nf_put_vars_int2(ncid, varid, localStart, localCount, localStride, values)
+     else
+       nf90_put_var_3D_TwoByteInt = &
+          nf_put_vara_int2(ncid, varid, localStart, localCount, values)
+     end if
+   end function nf90_put_var_3D_TwoByteInt
+
+
+   function nf90_put_var_4D_TwoByteInt(ncid, varid, values, start, count, stride, map)
+     integer,                         intent( in) :: ncid, varid
+     integer (kind = TwoByteInt), dimension(:, :, :, :), &
+                                      intent( in) :: values
+     integer, dimension(:), optional, intent( in) :: start, count, stride, map
+     integer                                      :: nf90_put_var_4D_TwoByteInt
+ 
+     integer, dimension(nf90_max_var_dims) :: localStart, localCount, localStride, localMap
+     integer                               :: numDims, counter
+ 
+     ! Set local arguments to default values
+     numDims                 = size(shape(values))
+     localStart (:         ) = 1
+     localCount (:numDims  ) = shape(values)
+     localCount (numDims+1:) = 1
+     localStride(:         ) = 1
+     localMap   (:numDims  ) = (/ 1, (product(localCount(:counter)), counter = 1, numDims - 1) /)
+ 
+     if(present(start))  localStart (:size(start) )  = start(:)
+     if(present(count))  localCount (:size(count) )  = count(:)
+     if(present(stride)) localStride(:size(stride)) = stride(:)
+     if(present(map))  then
+       localMap   (:size(map))    = map(:)
+       nf90_put_var_4D_TwoByteInt = &
+          nf_put_varm_int2(ncid, varid, localStart, localCount, localStride, localMap, values)
+     else if(present(stride)) then
+       nf90_put_var_4D_TwoByteInt = &
+          nf_put_vars_int2(ncid, varid, localStart, localCount, localStride, values)
+     else
+       nf90_put_var_4D_TwoByteInt = &
+          nf_put_vara_int2(ncid, varid, localStart, localCount, values)
+     end if
+   end function nf90_put_var_4D_TwoByteInt
+
+
+   function nf90_put_var_5D_TwoByteInt(ncid, varid, values, start, count, stride, map)
+     integer,                         intent( in) :: ncid, varid
+     integer (kind = TwoByteInt), dimension(:, :, :, :, :), &
+                                      intent( in) :: values
+     integer, dimension(:), optional, intent( in) :: start, count, stride, map
+     integer                                      :: nf90_put_var_5D_TwoByteInt
+ 
+     integer, dimension(nf90_max_var_dims) :: localStart, localCount, localStride, localMap
+     integer                               :: numDims, counter
+ 
+     ! Set local arguments to default values
+     numDims                 = size(shape(values))
+     localStart (:         ) = 1
+     localCount (:numDims  ) = shape(values)
+     localCount (numDims+1:) = 1
+     localStride(:         ) = 1
+     localMap   (:numDims  ) = (/ 1, (product(localCount(:counter)), counter = 1, numDims - 1) /)
+ 
+     if(present(start))  localStart (:size(start) )  = start(:)
+     if(present(count))  localCount (:size(count) )  = count(:)
+     if(present(stride)) localStride(:size(stride)) = stride(:)
+     if(present(map))  then
+       localMap   (:size(map))    = map(:)
+       nf90_put_var_5D_TwoByteInt = &
+          nf_put_varm_int2(ncid, varid, localStart, localCount, localStride, localMap, values)
+     else if(present(stride)) then
+       nf90_put_var_5D_TwoByteInt = &
+          nf_put_vars_int2(ncid, varid, localStart, localCount, localStride, values)
+     else
+       nf90_put_var_5D_TwoByteInt = &
+          nf_put_vara_int2(ncid, varid, localStart, localCount, values)
+     end if
+   end function nf90_put_var_5D_TwoByteInt
+
+
+   function nf90_put_var_6D_TwoByteInt(ncid, varid, values, start, count, stride, map)
+     integer,                         intent( in) :: ncid, varid
+     integer (kind = TwoByteInt), dimension(:, :, :, :, :, :), &
+                                      intent( in) :: values
+     integer, dimension(:), optional, intent( in) :: start, count, stride, map
+     integer                                      :: nf90_put_var_6D_TwoByteInt
+ 
+     integer, dimension(nf90_max_var_dims) :: localStart, localCount, localStride, localMap
+     integer                               :: numDims, counter
+ 
+     ! Set local arguments to default values
+     numDims                 = size(shape(values))
+     localStart (:         ) = 1
+     localCount (:numDims  ) = shape(values)
+     localCount (numDims+1:) = 1
+     localStride(:         ) = 1
+     localMap   (:numDims  ) = (/ 1, (product(localCount(:counter)), counter = 1, numDims - 1) /)
+ 
+     if(present(start))  localStart (:size(start) )  = start(:)
+     if(present(count))  localCount (:size(count) )  = count(:)
+     if(present(stride)) localStride(:size(stride)) = stride(:)
+     if(present(map))  then
+       localMap   (:size(map))    = map(:)
+       nf90_put_var_6D_TwoByteInt = &
+          nf_put_varm_int2(ncid, varid, localStart, localCount, localStride, localMap, values)
+     else if(present(stride)) then
+       nf90_put_var_6D_TwoByteInt = &
+          nf_put_vars_int2(ncid, varid, localStart, localCount, localStride, values)
+     else
+       nf90_put_var_6D_TwoByteInt = &
+          nf_put_vara_int2(ncid, varid, localStart, localCount, values)
+     end if
+   end function nf90_put_var_6D_TwoByteInt
+
+
+   function nf90_put_var_7D_TwoByteInt(ncid, varid, values, start, count, stride, map)
+     integer,                         intent( in) :: ncid, varid
+     integer (kind = TwoByteInt), dimension(:, :, :, :, :, :, :), &
+                                      intent( in) :: values
+     integer, dimension(:), optional, intent( in) :: start, count, stride, map
+     integer                                      :: nf90_put_var_7D_TwoByteInt
+ 
+     integer, dimension(nf90_max_var_dims) :: localStart, localCount, localStride, localMap
+     integer                               :: numDims, counter
+ 
+     ! Set local arguments to default values
+     numDims                 = size(shape(values))
+     localStart (:         ) = 1
+     localCount (:numDims  ) = shape(values)
+     localCount (numDims+1:) = 1
+     localStride(:         ) = 1
+     localMap   (:numDims  ) = (/ 1, (product(localCount(:counter)), counter = 1, numDims - 1) /)
+ 
+     if(present(start))  localStart (:size(start) )  = start(:)
+     if(present(count))  localCount (:size(count) )  = count(:)
+     if(present(stride)) localStride(:size(stride)) = stride(:)
+     if(present(map))  then
+       localMap   (:size(map))    = map(:)
+       nf90_put_var_7D_TwoByteInt = &
+          nf_put_varm_int2(ncid, varid, localStart, localCount, localStride, localMap, values)
+     else if(present(stride)) then
+       nf90_put_var_7D_TwoByteInt = &
+          nf_put_vars_int2(ncid, varid, localStart, localCount, localStride, values)
+     else
+       nf90_put_var_7D_TwoByteInt = &
+          nf_put_vara_int2(ncid, varid, localStart, localCount, values)
+     end if
+   end function nf90_put_var_7D_TwoByteInt
+
+
+   function nf90_put_var_1D_FourByteInt(ncid, varid, values, start, count, stride, map)
+     integer,                         intent( in) :: ncid, varid
+     integer (kind = FourByteInt), dimension(:), &
+                                      intent( in) :: values
+     integer, dimension(:), optional, intent( in) :: start, count, stride, map
+     integer                                      :: nf90_put_var_1D_FourByteInt
+ 
+     integer, dimension(nf90_max_var_dims) :: localStart, localCount, localStride, localMap
+     integer                               :: numDims, counter
+ 
+     ! Set local arguments to default values
+     numDims                 = size(shape(values))
+     localStart (:         ) = 1
+     localCount (:numDims  ) = shape(values)
+     localCount (numDims+1:) = 1
+     localStride(:         ) = 1
+     localMap   (:numDims  ) = (/ 1, (product(localCount(:counter)), counter = 1, numDims - 1) /)
+ 
+     if(present(start))  localStart (:size(start) )  = start(:)
+     if(present(count))  localCount (:size(count) )  = count(:)
+     if(present(stride)) localStride(:size(stride)) = stride(:)
+     if(present(map))  then
+       localMap   (:size(map))    = map(:)
+       nf90_put_var_1D_FourByteInt = &
+          nf_put_varm_int(ncid, varid, localStart, localCount, localStride, localMap, int(values))
+     else if(present(stride)) then
+       nf90_put_var_1D_FourByteInt = &
+          nf_put_vars_int(ncid, varid, localStart, localCount, localStride, int(values))
+     else
+       nf90_put_var_1D_FourByteInt = &
+          nf_put_vara_int(ncid, varid, localStart, localCount, int(values))
+     end if
+   end function nf90_put_var_1D_FourByteInt
+
+
+   function nf90_put_var_2D_FourByteInt(ncid, varid, values, start, count, stride, map)
+     integer,                         intent( in) :: ncid, varid
+     integer (kind = FourByteInt), dimension(:, :), &
+                                      intent( in) :: values
+     integer, dimension(:), optional, intent( in) :: start, count, stride, map
+     integer                                      :: nf90_put_var_2D_FourByteInt
+ 
+     integer, dimension(nf90_max_var_dims) :: localStart, localCount, localStride, localMap
+     integer                               :: numDims, counter
+ 
+     ! Set local arguments to default values
+     numDims                 = size(shape(values))
+     localStart (:         ) = 1
+     localCount (:numDims  ) = shape(values)
+     localCount (numDims+1:) = 1
+     localStride(:         ) = 1
+     localMap   (:numDims  ) = (/ 1, (product(localCount(:counter)), counter = 1, numDims - 1) /)
+ 
+     if(present(start))  localStart (:size(start) )  = start(:)
+     if(present(count))  localCount (:size(count) )  = count(:)
+     if(present(stride)) localStride(:size(stride)) = stride(:)
+     if(present(map))  then
+        localMap   (:size(map))    = map(:)
+        nf90_put_var_2D_FourByteInt = &
+             nf_put_varm_int(ncid, varid, localStart, localCount, localStride, localMap, int(values))
+     else if(present(stride)) then
+        nf90_put_var_2D_FourByteInt = &
+             nf_put_vars_int(ncid, varid, localStart, localCount, localStride, int(values))
+     else
+        nf90_put_var_2D_FourByteInt = &
+             nf_put_vara_int(ncid, varid, localStart, localCount, values)
+     end if
+   end function nf90_put_var_2D_FourByteInt
+
+
+   function nf90_put_var_3D_FourByteInt(ncid, varid, values, start, count, stride, map)
+     integer,                         intent( in) :: ncid, varid
+     integer (kind = FourByteInt), dimension(:, :, :), &
+                                      intent( in) :: values
+     integer, dimension(:), optional, intent( in) :: start, count, stride, map
+     integer                                      :: nf90_put_var_3D_FourByteInt
+ 
+     integer, dimension(nf90_max_var_dims) :: localStart, localCount, localStride, localMap
+     integer                               :: numDims, counter
+ 
+     ! Set local arguments to default values
+     numDims                 = size(shape(values))
+     localStart (:         ) = 1
+     localCount (:numDims  ) = shape(values)
+     localCount (numDims+1:) = 1
+     localStride(:         ) = 1
+     localMap   (:numDims  ) = (/ 1, (product(localCount(:counter)), counter = 1, numDims - 1) /)
+ 
+     if(present(start))  localStart (:size(start) )  = start(:)
+     if(present(count))  localCount (:size(count) )  = count(:)
+     if(present(stride)) localStride(:size(stride)) = stride(:)
+     if(present(map))  then
+       localMap   (:size(map))    = map(:)
+       nf90_put_var_3D_FourByteInt = &
+          nf_put_varm_int(ncid, varid, localStart, localCount, localStride, localMap, int(values))
+     else if(present(stride)) then
+       nf90_put_var_3D_FourByteInt = &
+          nf_put_vars_int(ncid, varid, localStart, localCount, localStride, int(values))
+     else
+       nf90_put_var_3D_FourByteInt = &
+          nf_put_vara_int(ncid, varid, localStart, localCount, int(values))
+     end if
+   end function nf90_put_var_3D_FourByteInt
+
+
+   function nf90_put_var_4D_FourByteInt(ncid, varid, values, start, count, stride, map)
+     integer,                         intent( in) :: ncid, varid
+     integer (kind = FourByteInt), dimension(:, :, :, :), &
+                                      intent( in) :: values
+     integer, dimension(:), optional, intent( in) :: start, count, stride, map
+     integer                                      :: nf90_put_var_4D_FourByteInt
+ 
+     integer, dimension(nf90_max_var_dims) :: localStart, localCount, localStride, localMap
+     integer                               :: numDims, counter
+ 
+     ! Set local arguments to default values
+     numDims                 = size(shape(values))
+     localStart (:         ) = 1
+     localCount (:numDims  ) = shape(values)
+     localCount (numDims+1:) = 1
+     localStride(:         ) = 1
+     localMap   (:numDims  ) = (/ 1, (product(localCount(:counter)), counter = 1, numDims - 1) /)
+ 
+     if(present(start))  localStart (:size(start) )  = start(:)
+     if(present(count))  localCount (:size(count) )  = count(:)
+     if(present(stride)) localStride(:size(stride)) = stride(:)
+     if(present(map))  then
+       localMap   (:size(map))    = map(:)
+       nf90_put_var_4D_FourByteInt = &
+          nf_put_varm_int(ncid, varid, localStart, localCount, localStride, localMap, int(values))
+     else if(present(stride)) then
+       nf90_put_var_4D_FourByteInt = &
+          nf_put_vars_int(ncid, varid, localStart, localCount, localStride, int(values))
+     else
+       nf90_put_var_4D_FourByteInt = &
+          nf_put_vara_int(ncid, varid, localStart, localCount, int(values))
+     end if
+   end function nf90_put_var_4D_FourByteInt
+
+
+   function nf90_put_var_5D_FourByteInt(ncid, varid, values, start, count, stride, map)
+     integer,                         intent( in) :: ncid, varid
+     integer (kind = FourByteInt), dimension(:, :, :, :, :), &
+                                      intent( in) :: values
+     integer, dimension(:), optional, intent( in) :: start, count, stride, map
+     integer                                      :: nf90_put_var_5D_FourByteInt
+ 
+     integer, dimension(nf90_max_var_dims) :: localStart, localCount, localStride, localMap
+     integer                               :: numDims, counter
+ 
+     ! Set local arguments to default values
+     numDims                 = size(shape(values))
+     localStart (:         ) = 1
+     localCount (:numDims  ) = shape(values)
+     localCount (numDims+1:) = 1
+     localStride(:         ) = 1
+     localMap   (:numDims  ) = (/ 1, (product(localCount(:counter)), counter = 1, numDims - 1) /)
+ 
+     if(present(start))  localStart (:size(start) )  = start(:)
+     if(present(count))  localCount (:size(count) )  = count(:)
+     if(present(stride)) localStride(:size(stride)) = stride(:)
+     if(present(map))  then
+       localMap   (:size(map))    = map(:)
+       nf90_put_var_5D_FourByteInt = &
+          nf_put_varm_int(ncid, varid, localStart, localCount, localStride, localMap, int(values))
+     else if(present(stride)) then
+       nf90_put_var_5D_FourByteInt = &
+          nf_put_vars_int(ncid, varid, localStart, localCount, localStride, int(values))
+     else
+       nf90_put_var_5D_FourByteInt = &
+          nf_put_vara_int(ncid, varid, localStart, localCount, int(values))
+     end if
+   end function nf90_put_var_5D_FourByteInt
+
+
+   function nf90_put_var_6D_FourByteInt(ncid, varid, values, start, count, stride, map)
+     integer,                         intent( in) :: ncid, varid
+     integer (kind = FourByteInt), dimension(:, :, :, :, :, :), &
+                                      intent( in) :: values
+     integer, dimension(:), optional, intent( in) :: start, count, stride, map
+     integer                                      :: nf90_put_var_6D_FourByteInt
+ 
+     integer, dimension(nf90_max_var_dims) :: localStart, localCount, localStride, localMap
+     integer                               :: numDims, counter
+ 
+     ! Set local arguments to default values
+     numDims                 = size(shape(values))
+     localStart (:         ) = 1
+     localCount (:numDims  ) = shape(values)
+     localCount (numDims+1:) = 1
+     localStride(:         ) = 1
+     localMap   (:numDims  ) = (/ 1, (product(localCount(:counter)), counter = 1, numDims - 1) /)
+ 
+     if(present(start))  localStart (:size(start) )  = start(:)
+     if(present(count))  localCount (:size(count) )  = count(:)
+     if(present(stride)) localStride(:size(stride)) = stride(:)
+     if(present(map))  then
+       localMap   (:size(map))    = map(:)
+       nf90_put_var_6D_FourByteInt = &
+          nf_put_varm_int(ncid, varid, localStart, localCount, localStride, localMap, int(values))
+     else if(present(stride)) then
+       nf90_put_var_6D_FourByteInt = &
+          nf_put_vars_int(ncid, varid, localStart, localCount, localStride, int(values))
+     else
+       nf90_put_var_6D_FourByteInt = &
+          nf_put_vara_int(ncid, varid, localStart, localCount, int(values))
+     end if
+   end function nf90_put_var_6D_FourByteInt
+
+
+   function nf90_put_var_7D_FourByteInt(ncid, varid, values, start, count, stride, map)
+     integer,                         intent( in) :: ncid, varid
+     integer (kind = FourByteInt), dimension(:, :, :, :, :, :, :), &
+                                      intent( in) :: values
+     integer, dimension(:), optional, intent( in) :: start, count, stride, map
+     integer                                      :: nf90_put_var_7D_FourByteInt
+ 
+     integer, dimension(nf90_max_var_dims) :: localStart, localCount, localStride, localMap
+     integer                               :: numDims, counter
+ 
+     ! Set local arguments to default values
+     numDims                 = size(shape(values))
+     localStart (:         ) = 1
+     localCount (:numDims  ) = shape(values)
+     localCount (numDims+1:) = 1
+     localStride(:         ) = 1
+     localMap   (:numDims  ) = (/ 1, (product(localCount(:counter)), counter = 1, numDims - 1) /)
+ 
+     if(present(start))  localStart (:size(start) )  = start(:)
+     if(present(count))  localCount (:size(count) )  = count(:)
+     if(present(stride)) localStride(:size(stride)) = stride(:)
+     if(present(map))  then
+       localMap   (:size(map))    = map(:)
+       nf90_put_var_7D_FourByteInt = &
+          nf_put_varm_int(ncid, varid, localStart, localCount, localStride, localMap, int(values))
+     else if(present(stride)) then
+       nf90_put_var_7D_FourByteInt = &
+          nf_put_vars_int(ncid, varid, localStart, localCount, localStride, int(values))
+     else
+       nf90_put_var_7D_FourByteInt = &
+          nf_put_vara_int(ncid, varid, localStart, localCount, int(values))
+     end if
+   end function nf90_put_var_7D_FourByteInt
+
+
+    function nf90_put_var_1D_FourByteReal(ncid, varid, values, start, count, stride, map)
+     integer,                         intent( in) :: ncid, varid
+     real (kind = FourByteReal), dimension(:), &
+                                      intent( in) :: values
+     integer, dimension(:), optional, intent( in) :: start, count, stride, map
+     integer                                      :: nf90_put_var_1D_FourByteReal
+ 
+     integer, dimension(nf90_max_var_dims) :: localStart, localCount, localStride, localMap
+     integer                               :: numDims, counter
+ 
+     ! Set local arguments to default values
+     numDims                 = size(shape(values))
+     localStart (:         ) = 1
+     localCount (:numDims  ) = shape(values)
+     localCount (numDims+1:) = 1
+     localStride(:         ) = 1
+     localMap   (:numDims  ) = (/ 1, (product(localCount(:counter)), counter = 1, numDims - 1) /)
+ 
+     if(present(start))  localStart (:size(start) )  = start(:)
+     if(present(count))  localCount (:size(count) )  = count(:)
+     if(present(stride)) localStride(:size(stride)) = stride(:)
+     if(present(map))  then
+       localMap   (:size(map))    = map(:)
+       nf90_put_var_1D_FourByteReal = &
+          nf_put_varm_real(ncid, varid, localStart, localCount, localStride, localMap, values)
+     else if(present(stride)) then
+       nf90_put_var_1D_FourByteReal = &
+          nf_put_vars_real(ncid, varid, localStart, localCount, localStride, values)
+     else
+       nf90_put_var_1D_FourByteReal = &
+          nf_put_vara_real(ncid, varid, localStart, localCount, values)
+     end if
+   end function nf90_put_var_1D_FourByteReal
+
+
+   function nf90_put_var_2D_FourByteReal(ncid, varid, values, start, count, stride, map)
+     integer,                         intent( in) :: ncid, varid
+     real (kind = FourByteReal), dimension(:, :), &
+                                      intent( in) :: values
+     integer, dimension(:), optional, intent( in) :: start, count, stride, map
+     integer                                      :: nf90_put_var_2D_FourByteReal
+ 
+     integer, dimension(nf90_max_var_dims) :: localStart, localCount, localStride, localMap
+     integer                               :: numDims, counter
+ 
+     ! Set local arguments to default values
+     numDims                 = size(shape(values))
+     localStart (:         ) = 1
+     localCount (:numDims  ) = shape(values)
+     localCount (numDims+1:) = 1
+     localStride(:         ) = 1
+     localMap   (:numDims  ) = (/ 1, (product(localCount(:counter)), counter = 1, numDims - 1) /)
+ 
+     if(present(start))  localStart (:size(start) )  = start(:)
+     if(present(count))  localCount (:size(count) )  = count(:)
+     if(present(stride)) localStride(:size(stride)) = stride(:)
+     if(present(map))  then
+       localMap   (:size(map))    = map(:)
+       nf90_put_var_2D_FourByteReal = &
+          nf_put_varm_real(ncid, varid, localStart, localCount, localStride, localMap, values)
+     else if(present(stride)) then
+       nf90_put_var_2D_FourByteReal = &
+          nf_put_vars_real(ncid, varid, localStart, localCount, localStride, values)
+     else
+       nf90_put_var_2D_FourByteReal = &
+          nf_put_vara_real(ncid, varid, localStart, localCount, values)
+     end if
+   end function nf90_put_var_2D_FourByteReal
+
+
+   function nf90_put_var_3D_FourByteReal(ncid, varid, values, start, count, stride, map)
+     integer,                         intent( in) :: ncid, varid
+     real (kind = FourByteReal), dimension(:, :, :), &
+                                      intent( in) :: values
+     integer, dimension(:), optional, intent( in) :: start, count, stride, map
+     integer                                      :: nf90_put_var_3D_FourByteReal
+ 
+     integer, dimension(nf90_max_var_dims) :: localStart, localCount, localStride, localMap
+     integer                               :: numDims, counter
+ 
+     ! Set local arguments to default values
+     numDims                 = size(shape(values))
+     localStart (:         ) = 1
+     localCount (:numDims  ) = shape(values)
+     localCount (numDims+1:) = 1
+     localStride(:         ) = 1
+     localMap   (:numDims  ) = (/ 1, (product(localCount(:counter)), counter = 1, numDims - 1) /)
+ 
+     if(present(start))  localStart (:size(start) )  = start(:)
+     if(present(count))  localCount (:size(count) )  = count(:)
+     if(present(stride)) localStride(:size(stride)) = stride(:)
+     if(present(map))  then
+       localMap   (:size(map))    = map(:)
+       nf90_put_var_3D_FourByteReal = &
+          nf_put_varm_real(ncid, varid, localStart, localCount, localStride, localMap, values)
+     else if(present(stride)) then
+       nf90_put_var_3D_FourByteReal = &
+          nf_put_vars_real(ncid, varid, localStart, localCount, localStride, values)
+     else
+       nf90_put_var_3D_FourByteReal = &
+          nf_put_vara_real(ncid, varid, localStart, localCount, values)
+     end if
+   end function nf90_put_var_3D_FourByteReal
+
+
+   function nf90_put_var_4D_FourByteReal(ncid, varid, values, start, count, stride, map)
+     integer,                         intent( in) :: ncid, varid
+     real (kind = FourByteReal), dimension(:, :, :, :), &
+                                      intent( in) :: values
+     integer, dimension(:), optional, intent( in) :: start, count, stride, map
+     integer                                      :: nf90_put_var_4D_FourByteReal
+ 
+     integer, dimension(nf90_max_var_dims) :: localStart, localCount, localStride, localMap
+     integer                               :: numDims, counter
+ 
+     ! Set local arguments to default values
+     numDims                 = size(shape(values))
+     localStart (:         ) = 1
+     localCount (:numDims  ) = shape(values)
+     localCount (numDims+1:) = 1
+     localStride(:         ) = 1
+     localMap   (:numDims  ) = (/ 1, (product(localCount(:counter)), counter = 1, numDims - 1) /)
+ 
+     if(present(start))  localStart (:size(start) )  = start(:)
+     if(present(count))  localCount (:size(count) )  = count(:)
+     if(present(stride)) localStride(:size(stride)) = stride(:)
+     if(present(map))  then
+       localMap   (:size(map))    = map(:)
+       nf90_put_var_4D_FourByteReal = &
+          nf_put_varm_real(ncid, varid, localStart, localCount, localStride, localMap, values)
+     else if(present(stride)) then
+       nf90_put_var_4D_FourByteReal = &
+          nf_put_vars_real(ncid, varid, localStart, localCount, localStride, values)
+     else
+       nf90_put_var_4D_FourByteReal = &
+          nf_put_vara_real(ncid, varid, localStart, localCount, values)
+     end if
+   end function nf90_put_var_4D_FourByteReal
+
+
+   function nf90_put_var_5D_FourByteReal(ncid, varid, values, start, count, stride, map)
+     integer,                         intent( in) :: ncid, varid
+     real (kind = FourByteReal), dimension(:, :, :, :, :), &
+                                      intent( in) :: values
+     integer, dimension(:), optional, intent( in) :: start, count, stride, map
+     integer                                      :: nf90_put_var_5D_FourByteReal
+ 
+     integer, dimension(nf90_max_var_dims) :: localStart, localCount, localStride, localMap
+     integer                               :: numDims, counter
+ 
+     ! Set local arguments to default values
+     numDims                 = size(shape(values))
+     localStart (:         ) = 1
+     localCount (:numDims  ) = shape(values)
+     localCount (numDims+1:) = 1
+     localStride(:         ) = 1
+     localMap   (:numDims  ) = (/ 1, (product(localCount(:counter)), counter = 1, numDims - 1) /)
+ 
+     if(present(start))  localStart (:size(start) )  = start(:)
+     if(present(count))  localCount (:size(count) )  = count(:)
+     if(present(stride)) localStride(:size(stride)) = stride(:)
+     if(present(map))  then
+       localMap   (:size(map))    = map(:)
+       nf90_put_var_5D_FourByteReal = &
+          nf_put_varm_real(ncid, varid, localStart, localCount, localStride, localMap, values)
+     else if(present(stride)) then
+       nf90_put_var_5D_FourByteReal = &
+          nf_put_vars_real(ncid, varid, localStart, localCount, localStride, values)
+     else
+       nf90_put_var_5D_FourByteReal = &
+          nf_put_vara_real(ncid, varid, localStart, localCount, values)
+     end if
+   end function nf90_put_var_5D_FourByteReal
+
+
+   function nf90_put_var_6D_FourByteReal(ncid, varid, values, start, count, stride, map)
+     integer,                         intent( in) :: ncid, varid
+     real (kind = FourByteReal), dimension(:, :, :, :, :, :), &
+                                      intent( in) :: values
+     integer, dimension(:), optional, intent( in) :: start, count, stride, map
+     integer                                      :: nf90_put_var_6D_FourByteReal
+ 
+     integer, dimension(nf90_max_var_dims) :: localStart, localCount, localStride, localMap
+     integer                               :: numDims, counter
+ 
+     ! Set local arguments to default values
+     numDims                 = size(shape(values))
+     localStart (:         ) = 1
+     localCount (:numDims  ) = shape(values)
+     localCount (numDims+1:) = 1
+     localStride(:         ) = 1
+     localMap   (:numDims  ) = (/ 1, (product(localCount(:counter)), counter = 1, numDims - 1) /)
+ 
+     if(present(start))  localStart (:size(start) )  = start(:)
+     if(present(count))  localCount (:size(count) )  = count(:)
+     if(present(stride)) localStride(:size(stride)) = stride(:)
+     if(present(map))  then
+       localMap   (:size(map))    = map(:)
+       nf90_put_var_6D_FourByteReal = &
+          nf_put_varm_real(ncid, varid, localStart, localCount, localStride, localMap, values)
+     else if(present(stride)) then
+       nf90_put_var_6D_FourByteReal = &
+          nf_put_vars_real(ncid, varid, localStart, localCount, localStride, values)
+     else
+       nf90_put_var_6D_FourByteReal = &
+          nf_put_vara_real(ncid, varid, localStart, localCount, values)
+     end if
+   end function nf90_put_var_6D_FourByteReal
+
+
+   function nf90_put_var_7D_FourByteReal(ncid, varid, values, start, count, stride, map)
+     integer,                         intent( in) :: ncid, varid
+     real (kind = FourByteReal), dimension(:, :, :, :, :, :, :), &
+                                      intent( in) :: values
+     integer, dimension(:), optional, intent( in) :: start, count, stride, map
+     integer                                      :: nf90_put_var_7D_FourByteReal
+ 
+     integer, dimension(nf90_max_var_dims) :: localStart, localCount, localStride, localMap
+     integer                               :: numDims, counter
+ 
+     ! Set local arguments to default values
+     numDims                 = size(shape(values))
+     localStart (:         ) = 1
+     localCount (:numDims  ) = shape(values)
+     localCount (numDims+1:) = 1
+     localStride(:         ) = 1
+     localMap   (:numDims  ) = (/ 1, (product(localCount(:counter)), counter = 1, numDims - 1) /)
+ 
+     if(present(start))  localStart (:size(start) )  = start(:)
+     if(present(count))  localCount (:size(count) )  = count(:)
+     if(present(stride)) localStride(:size(stride)) = stride(:)
+     if(present(map))  then
+       localMap   (:size(map))    = map(:)
+       nf90_put_var_7D_FourByteReal = &
+          nf_put_varm_real(ncid, varid, localStart, localCount, localStride, localMap, values)
+     else if(present(stride)) then
+       nf90_put_var_7D_FourByteReal = &
+          nf_put_vars_real(ncid, varid, localStart, localCount, localStride, values)
+     else
+       nf90_put_var_7D_FourByteReal = &
+          nf_put_vara_real(ncid, varid, localStart, localCount, values)
+     end if
+   end function nf90_put_var_7D_FourByteReal
+
+
+   function nf90_put_var_1D_EightByteReal(ncid, varid, values, start, count, stride, map)
+     integer,                         intent( in) :: ncid, varid
+     real (kind = EightByteReal), dimension(:), &
+                                      intent( in) :: values
+     integer, dimension(:), optional, intent( in) :: start, count, stride, map
+     integer                                      :: nf90_put_var_1D_EightByteReal
+ 
+     integer, dimension(nf90_max_var_dims) :: localStart, localCount, localStride, localMap
+     integer                               :: numDims, counter
+ 
+     ! Set local arguments to default values
+     numDims                 = size(shape(values))
+     localStart (:         ) = 1
+     localCount (:numDims  ) = shape(values)
+     localCount (numDims+1:) = 1
+     localStride(:         ) = 1
+     localMap   (:numDims  ) = (/ 1, (product(localCount(:counter)), counter = 1, numDims - 1) /)
+ 
+     if(present(start))  localStart (:size(start) )  = start(:)
+     if(present(count))  localCount (:size(count) )  = count(:)
+     if(present(stride)) localStride(:size(stride)) = stride(:)
+     if(present(map))  then
+       localMap   (:size(map))    = map(:)
+       nf90_put_var_1D_EightByteReal = &
+          nf_put_varm_double(ncid, varid, localStart, localCount, localStride, localMap, values)
+     else if(present(stride)) then
+       nf90_put_var_1D_EightByteReal = &
+          nf_put_vars_double(ncid, varid, localStart, localCount, localStride, values)
+     else
+       nf90_put_var_1D_EightByteReal = &
+          nf_put_vara_double(ncid, varid, localStart, localCount, values)
+     end if
+   end function nf90_put_var_1D_EightByteReal
+
+
+   function nf90_put_var_2D_EightByteReal(ncid, varid, values, start, count, stride, map)
+     integer,                         intent( in) :: ncid, varid
+     real (kind = EightByteReal), dimension(:, :), &
+                                      intent( in) :: values
+     integer, dimension(:), optional, intent( in) :: start, count, stride, map
+     integer                                      :: nf90_put_var_2D_EightByteReal
+ 
+     integer, dimension(nf90_max_var_dims) :: localStart, localCount, localStride, localMap
+     integer                               :: numDims, counter
+ 
+     ! Set local arguments to default values
+     numDims                 = size(shape(values))
+     localStart (:         ) = 1
+     localCount (:numDims  ) = shape(values)
+     localCount (numDims+1:) = 1
+     localStride(:         ) = 1
+     localMap   (:numDims  ) = (/ 1, (product(localCount(:counter)), counter = 1, numDims - 1) /)
+ 
+     if(present(start))  localStart (:size(start) )  = start(:)
+     if(present(count))  localCount (:size(count) )  = count(:)
+     if(present(stride)) localStride(:size(stride)) = stride(:)
+     if(present(map))  then
+       localMap   (:size(map))    = map(:)
+       nf90_put_var_2D_EightByteReal = &
+          nf_put_varm_double(ncid, varid, localStart, localCount, localStride, localMap, values)
+     else if(present(stride)) then
+       nf90_put_var_2D_EightByteReal = &
+          nf_put_vars_double(ncid, varid, localStart, localCount, localStride, values)
+     else
+       nf90_put_var_2D_EightByteReal = &
+          nf_put_vara_double(ncid, varid, localStart, localCount, values)
+     end if
+   end function nf90_put_var_2D_EightByteReal
+
+
+   function nf90_put_var_3D_EightByteReal(ncid, varid, values, start, count, stride, map)
+     integer,                         intent( in) :: ncid, varid
+     real (kind = EightByteReal), dimension(:, :, :), &
+                                      intent( in) :: values
+     integer, dimension(:), optional, intent( in) :: start, count, stride, map
+     integer                                      :: nf90_put_var_3D_EightByteReal
+ 
+     integer, dimension(nf90_max_var_dims) :: localStart, localCount, localStride, localMap
+     integer                               :: numDims, counter
+ 
+     ! Set local arguments to default values
+     numDims                 = size(shape(values))
+     localStart (:         ) = 1
+     localCount (:numDims  ) = shape(values)
+     localCount (numDims+1:) = 1
+     localStride(:         ) = 1
+     localMap   (:numDims  ) = (/ 1, (product(localCount(:counter)), counter = 1, numDims - 1) /)
+ 
+     if(present(start))  localStart (:size(start) )  = start(:)
+     if(present(count))  localCount (:size(count) )  = count(:)
+     if(present(stride)) localStride(:size(stride)) = stride(:)
+     if(present(map))  then
+       localMap   (:size(map))    = map(:)
+       nf90_put_var_3D_EightByteReal = &
+          nf_put_varm_double(ncid, varid, localStart, localCount, localStride, localMap, values)
+     else if(present(stride)) then
+       nf90_put_var_3D_EightByteReal = &
+          nf_put_vars_double(ncid, varid, localStart, localCount, localStride, values)
+     else
+       nf90_put_var_3D_EightByteReal = &
+          nf_put_vara_double(ncid, varid, localStart, localCount, values)
+     end if
+   end function nf90_put_var_3D_EightByteReal
+
+
+   function nf90_put_var_4D_EightByteReal(ncid, varid, values, start, count, stride, map)
+     integer,                         intent( in) :: ncid, varid
+     real (kind = EightByteReal), dimension(:, :, :, :), &
+                                      intent( in) :: values
+     integer, dimension(:), optional, intent( in) :: start, count, stride, map
+     integer                                      :: nf90_put_var_4D_EightByteReal
+ 
+     integer, dimension(nf90_max_var_dims) :: localStart, localCount, localStride, localMap
+     integer                               :: numDims, counter
+ 
+     ! Set local arguments to default values
+     numDims                 = size(shape(values))
+     localStart (:         ) = 1
+     localCount (:numDims  ) = shape(values)
+     localCount (numDims+1:) = 1
+     localStride(:         ) = 1
+     localMap   (:numDims  ) = (/ 1, (product(localCount(:counter)), counter = 1, numDims - 1) /)
+ 
+     if(present(start))  localStart (:size(start) )  = start(:)
+     if(present(count))  localCount (:size(count) )  = count(:)
+     if(present(stride)) localStride(:size(stride)) = stride(:)
+     if(present(map))  then
+       localMap   (:size(map))    = map(:)
+       nf90_put_var_4D_EightByteReal = &
+          nf_put_varm_double(ncid, varid, localStart, localCount, localStride, localMap, values)
+     else if(present(stride)) then
+       nf90_put_var_4D_EightByteReal = &
+          nf_put_vars_double(ncid, varid, localStart, localCount, localStride, values)
+     else
+       nf90_put_var_4D_EightByteReal = &
+          nf_put_vara_double(ncid, varid, localStart, localCount, values)
+     end if
+   end function nf90_put_var_4D_EightByteReal
+
+
+   function nf90_put_var_5D_EightByteReal(ncid, varid, values, start, count, stride, map)
+     integer,                         intent( in) :: ncid, varid
+     real (kind = EightByteReal), dimension(:, :, :, :, :), &
+                                      intent( in) :: values
+     integer, dimension(:), optional, intent( in) :: start, count, stride, map
+     integer                                      :: nf90_put_var_5D_EightByteReal
+ 
+     integer, dimension(nf90_max_var_dims) :: localStart, localCount, localStride, localMap
+     integer                               :: numDims, counter
+ 
+     ! Set local arguments to default values
+     numDims                 = size(shape(values))
+     localStart (:         ) = 1
+     localCount (:numDims  ) = shape(values)
+     localCount (numDims+1:) = 1
+     localStride(:         ) = 1
+     localMap   (:numDims  ) = (/ 1, (product(localCount(:counter)), counter = 1, numDims - 1) /)
+ 
+     if(present(start))  localStart (:size(start) )  = start(:)
+     if(present(count))  localCount (:size(count) )  = count(:)
+     if(present(stride)) localStride(:size(stride)) = stride(:)
+     if(present(map))  then
+       localMap   (:size(map))    = map(:)
+       nf90_put_var_5D_EightByteReal = &
+          nf_put_varm_double(ncid, varid, localStart, localCount, localStride, localMap, values)
+     else if(present(stride)) then
+       nf90_put_var_5D_EightByteReal = &
+          nf_put_vars_double(ncid, varid, localStart, localCount, localStride, values)
+     else
+       nf90_put_var_5D_EightByteReal = &
+          nf_put_vara_double(ncid, varid, localStart, localCount, values)
+     end if
+   end function nf90_put_var_5D_EightByteReal
+
+
+   function nf90_put_var_6D_EightByteReal(ncid, varid, values, start, count, stride, map)
+     integer,                         intent( in) :: ncid, varid
+     real (kind = EightByteReal), dimension(:, :, :, :, :, :), &
+                                      intent( in) :: values
+     integer, dimension(:), optional, intent( in) :: start, count, stride, map
+     integer                                      :: nf90_put_var_6D_EightByteReal
+ 
+     integer, dimension(nf90_max_var_dims) :: localStart, localCount, localStride, localMap
+     integer                               :: numDims, counter
+ 
+     ! Set local arguments to default values
+     numDims                 = size(shape(values))
+     localStart (:         ) = 1
+     localCount (:numDims  ) = shape(values)
+     localCount (numDims+1:) = 1
+     localStride(:         ) = 1
+     localMap   (:numDims  ) = (/ 1, (product(localCount(:counter)), counter = 1, numDims - 1) /)
+ 
+     if(present(start))  localStart (:size(start) )  = start(:)
+     if(present(count))  localCount (:size(count) )  = count(:)
+     if(present(stride)) localStride(:size(stride)) = stride(:)
+     if(present(map))  then
+       localMap   (:size(map))    = map(:)
+       nf90_put_var_6D_EightByteReal = &
+          nf_put_varm_double(ncid, varid, localStart, localCount, localStride, localMap, values)
+     else if(present(stride)) then
+       nf90_put_var_6D_EightByteReal = &
+          nf_put_vars_double(ncid, varid, localStart, localCount, localStride, values)
+     else
+       nf90_put_var_6D_EightByteReal = &
+          nf_put_vara_double(ncid, varid, localStart, localCount, values)
+     end if
+   end function nf90_put_var_6D_EightByteReal
+
+
+   function nf90_put_var_7D_EightByteReal(ncid, varid, values, start, count, stride, map)
+     integer,                         intent( in) :: ncid, varid
+     real (kind = EightByteReal), dimension(:, :, :, :, :, :, :), &
+                                      intent( in) :: values
+     integer, dimension(:), optional, intent( in) :: start, count, stride, map
+     integer                                      :: nf90_put_var_7D_EightByteReal
+ 
+     integer, dimension(nf90_max_var_dims) :: localStart, localCount, localStride, localMap
+     integer                               :: numDims, counter
+ 
+     ! Set local arguments to default values
+     numDims                 = size(shape(values))
+     localStart (:         ) = 1
+     localCount (:numDims  ) = shape(values)
+     localCount (numDims+1:) = 1
+     localStride(:         ) = 1
+     localMap   (:numDims  ) = (/ 1, (product(localCount(:counter)), counter = 1, numDims - 1) /)
+ 
+     if(present(start))  localStart (:size(start) )  = start(:)
+     if(present(count))  localCount (:size(count) )  = count(:)
+     if(present(stride)) localStride(:size(stride)) = stride(:)
+     if(present(map))  then
+       localMap   (:size(map))    = map(:)
+       nf90_put_var_7D_EightByteReal = &
+          nf_put_varm_double(ncid, varid, localStart, localCount, localStride, localMap, values)
+     else if(present(stride)) then
+       nf90_put_var_7D_EightByteReal = &
+          nf_put_vars_double(ncid, varid, localStart, localCount, localStride, values)
+     else
+       nf90_put_var_7D_EightByteReal = &
+          nf_put_vara_double(ncid, varid, localStart, localCount, values)
+     end if
+   end function nf90_put_var_7D_EightByteReal
+
+
+   function nf90_get_var_1D_OneByteInt(ncid, varid, values, start, count, stride, map)
+     integer,                         intent( in) :: ncid, varid
+     integer (kind = OneByteInt), dimension(:), &
+                                      intent(out) :: values
+     integer, dimension(:), optional, intent( in) :: start, count, stride, map
+     integer                                      :: nf90_get_var_1D_OneByteInt
+ 
+     integer, dimension(nf90_max_var_dims) :: localStart, localCount, localStride, localMap
+     integer                               :: numDims, counter
+ 
+     ! Set local arguments to default values
+     numDims                 = size(shape(values))
+     localStart (:         ) = 1
+     localCount (:numDims  ) = shape(values)
+     localCount (numDims+1:) = 1
+     localStride(:         ) = 1
+     localMap   (:numDims  ) = (/ 1, (product(localCount(:counter)), counter = 1, numDims - 1) /)
+ 
+     if(present(start))  localStart (:size(start) )  = start(:)
+     if(present(count))  localCount (:size(count) )  = count(:)
+     if(present(stride)) localStride(:size(stride)) = stride(:)
+     if(present(map))  then
+       localMap   (:size(map))    = map(:)
+       nf90_get_var_1D_OneByteInt = &
+          nf_get_varm_int1(ncid, varid, localStart, localCount, localStride, localMap, values)
+     else if(present(stride)) then
+       nf90_get_var_1D_OneByteInt = &
+          nf_get_vars_int1(ncid, varid, localStart, localCount, localStride, values)
+     else
+       nf90_get_var_1D_OneByteInt = &
+          nf_get_vara_int1(ncid, varid, localStart, localCount, values)
+     end if
+   end function nf90_get_var_1D_OneByteInt
+
+
+   function nf90_get_var_2D_OneByteInt(ncid, varid, values, start, count, stride, map)
+     integer,                         intent( in) :: ncid, varid
+     integer (kind = OneByteInt), dimension(:, :), &
+                                      intent(out) :: values
+     integer, dimension(:), optional, intent( in) :: start, count, stride, map
+     integer                                      :: nf90_get_var_2D_OneByteInt
+ 
+     integer, dimension(nf90_max_var_dims) :: localStart, localCount, localStride, localMap
+     integer                               :: numDims, counter
+ 
+     ! Set local arguments to default values
+     numDims                 = size(shape(values))
+     localStart (:         ) = 1
+     localCount (:numDims  ) = shape(values)
+     localCount (numDims+1:) = 1
+     localStride(:         ) = 1
+     localMap   (:numDims  ) = (/ 1, (product(localCount(:counter)), counter = 1, numDims - 1) /)
+ 
+     if(present(start))  localStart (:size(start) )  = start(:)
+     if(present(count))  localCount (:size(count) )  = count(:)
+     if(present(stride)) localStride(:size(stride)) = stride(:)
+     if(present(map))  then
+       localMap   (:size(map))    = map(:)
+       nf90_get_var_2D_OneByteInt = &
+          nf_get_varm_int1(ncid, varid, localStart, localCount, localStride, localMap, values)
+     else if(present(stride)) then
+       nf90_get_var_2D_OneByteInt = &
+          nf_get_vars_int1(ncid, varid, localStart, localCount, localStride, values)
+     else
+       nf90_get_var_2D_OneByteInt = &
+          nf_get_vara_int1(ncid, varid, localStart, localCount, values)
+     end if
+   end function nf90_get_var_2D_OneByteInt
+
+
+   function nf90_get_var_3D_OneByteInt(ncid, varid, values, start, count, stride, map)
+     integer,                         intent( in) :: ncid, varid
+     integer (kind = OneByteInt), dimension(:, :, :), &
+                                      intent(out) :: values
+     integer, dimension(:), optional, intent( in) :: start, count, stride, map
+     integer                                      :: nf90_get_var_3D_OneByteInt
+ 
+     integer, dimension(nf90_max_var_dims) :: localStart, localCount, localStride, localMap
+     integer                               :: numDims, counter
+ 
+     ! Set local arguments to default values
+     numDims                 = size(shape(values))
+     localStart (:         ) = 1
+     localCount (:numDims  ) = shape(values)
+     localCount (numDims+1:) = 1
+     localStride(:         ) = 1
+     localMap   (:numDims  ) = (/ 1, (product(localCount(:counter)), counter = 1, numDims - 1) /)
+ 
+     if(present(start))  localStart (:size(start) )  = start(:)
+     if(present(count))  localCount (:size(count) )  = count(:)
+     if(present(stride)) localStride(:size(stride)) = stride(:)
+     if(present(map))  then
+       localMap   (:size(map))    = map(:)
+       nf90_get_var_3D_OneByteInt = &
+          nf_get_varm_int1(ncid, varid, localStart, localCount, localStride, localMap, values)
+     else if(present(stride)) then
+       nf90_get_var_3D_OneByteInt = &
+          nf_get_vars_int1(ncid, varid, localStart, localCount, localStride, values)
+     else
+       nf90_get_var_3D_OneByteInt = &
+          nf_get_vara_int1(ncid, varid, localStart, localCount, values)
+     end if
+   end function nf90_get_var_3D_OneByteInt
+
+
+   function nf90_get_var_4D_OneByteInt(ncid, varid, values, start, count, stride, map)
+     integer,                         intent( in) :: ncid, varid
+     integer (kind = OneByteInt), dimension(:, :, :, :), &
+                                      intent(out) :: values
+     integer, dimension(:), optional, intent( in) :: start, count, stride, map
+     integer                                      :: nf90_get_var_4D_OneByteInt
+ 
+     integer, dimension(nf90_max_var_dims) :: localStart, localCount, localStride, localMap
+     integer                               :: numDims, counter
+ 
+     ! Set local arguments to default values
+     numDims                 = size(shape(values))
+     localStart (:         ) = 1
+     localCount (:numDims  ) = shape(values)
+     localCount (numDims+1:) = 1
+     localStride(:         ) = 1
+     localMap   (:numDims  ) = (/ 1, (product(localCount(:counter)), counter = 1, numDims - 1) /)
+ 
+     if(present(start))  localStart (:size(start) )  = start(:)
+     if(present(count))  localCount (:size(count) )  = count(:)
+     if(present(stride)) localStride(:size(stride)) = stride(:)
+     if(present(map))  then
+       localMap   (:size(map))    = map(:)
+       nf90_get_var_4D_OneByteInt = &
+          nf_get_varm_int1(ncid, varid, localStart, localCount, localStride, localMap, values)
+     else if(present(stride)) then
+       nf90_get_var_4D_OneByteInt = &
+          nf_get_vars_int1(ncid, varid, localStart, localCount, localStride, values)
+     else
+       nf90_get_var_4D_OneByteInt = &
+          nf_get_vara_int1(ncid, varid, localStart, localCount, values)
+     end if
+   end function nf90_get_var_4D_OneByteInt
+
+
+   function nf90_get_var_5D_OneByteInt(ncid, varid, values, start, count, stride, map)
+     integer,                         intent( in) :: ncid, varid
+     integer (kind = OneByteInt), dimension(:, :, :, :, :), &
+                                      intent(out) :: values
+     integer, dimension(:), optional, intent( in) :: start, count, stride, map
+     integer                                      :: nf90_get_var_5D_OneByteInt
+ 
+     integer, dimension(nf90_max_var_dims) :: localStart, localCount, localStride, localMap
+     integer                               :: numDims, counter
+ 
+     ! Set local arguments to default values
+     numDims                 = size(shape(values))
+     localStart (:         ) = 1
+     localCount (:numDims  ) = shape(values)
+     localCount (numDims+1:) = 1
+     localStride(:         ) = 1
+     localMap   (:numDims  ) = (/ 1, (product(localCount(:counter)), counter = 1, numDims - 1) /)
+ 
+     if(present(start))  localStart (:size(start) )  = start(:)
+     if(present(count))  localCount (:size(count) )  = count(:)
+     if(present(stride)) localStride(:size(stride)) = stride(:)
+     if(present(map))  then
+       localMap   (:size(map))    = map(:)
+       nf90_get_var_5D_OneByteInt = &
+          nf_get_varm_int1(ncid, varid, localStart, localCount, localStride, localMap, values)
+     else if(present(stride)) then
+       nf90_get_var_5D_OneByteInt = &
+          nf_get_vars_int1(ncid, varid, localStart, localCount, localStride, values)
+     else
+       nf90_get_var_5D_OneByteInt = &
+          nf_get_vara_int1(ncid, varid, localStart, localCount, values)
+     end if
+   end function nf90_get_var_5D_OneByteInt
+
+
+   function nf90_get_var_6D_OneByteInt(ncid, varid, values, start, count, stride, map)
+     integer,                         intent( in) :: ncid, varid
+     integer (kind = OneByteInt), dimension(:, :, :, :, :, :), &
+                                      intent(out) :: values
+     integer, dimension(:), optional, intent( in) :: start, count, stride, map
+     integer                                      :: nf90_get_var_6D_OneByteInt
+ 
+     integer, dimension(nf90_max_var_dims) :: localStart, localCount, localStride, localMap
+     integer                               :: numDims, counter
+ 
+     ! Set local arguments to default values
+     numDims                 = size(shape(values))
+     localStart (:         ) = 1
+     localCount (:numDims  ) = shape(values)
+     localCount (numDims+1:) = 1
+     localStride(:         ) = 1
+     localMap   (:numDims  ) = (/ 1, (product(localCount(:counter)), counter = 1, numDims - 1) /)
+ 
+     if(present(start))  localStart (:size(start) )  = start(:)
+     if(present(count))  localCount (:size(count) )  = count(:)
+     if(present(stride)) localStride(:size(stride)) = stride(:)
+     if(present(map))  then
+       localMap   (:size(map))    = map(:)
+       nf90_get_var_6D_OneByteInt = &
+          nf_get_varm_int1(ncid, varid, localStart, localCount, localStride, localMap, values)
+     else if(present(stride)) then
+       nf90_get_var_6D_OneByteInt = &
+          nf_get_vars_int1(ncid, varid, localStart, localCount, localStride, values)
+     else
+       nf90_get_var_6D_OneByteInt = &
+          nf_get_vara_int1(ncid, varid, localStart, localCount, values)
+     end if
+   end function nf90_get_var_6D_OneByteInt
+
+
+   function nf90_get_var_7D_OneByteInt(ncid, varid, values, start, count, stride, map)
+     integer,                         intent( in) :: ncid, varid
+     integer (kind = OneByteInt), dimension(:, :, :, :, :, :, :), &
+                                      intent(out) :: values
+     integer, dimension(:), optional, intent( in) :: start, count, stride, map
+     integer                                      :: nf90_get_var_7D_OneByteInt
+ 
+     integer, dimension(nf90_max_var_dims) :: localStart, localCount, localStride, localMap
+     integer                               :: numDims, counter
+ 
+     ! Set local arguments to default values
+     numDims                 = size(shape(values))
+     localStart (:         ) = 1
+     localCount (:numDims  ) = shape(values)
+     localCount (numDims+1:) = 1
+     localStride(:         ) = 1
+     localMap   (:numDims  ) = (/ 1, (product(localCount(:counter)), counter = 1, numDims - 1) /)
+ 
+     if(present(start))  localStart (:size(start) )  = start(:)
+     if(present(count))  localCount (:size(count) )  = count(:)
+     if(present(stride)) localStride(:size(stride)) = stride(:)
+     if(present(map))  then
+       localMap   (:size(map))    = map(:)
+       nf90_get_var_7D_OneByteInt = &
+          nf_get_varm_int1(ncid, varid, localStart, localCount, localStride, localMap, values)
+     else if(present(stride)) then
+       nf90_get_var_7D_OneByteInt = &
+          nf_get_vars_int1(ncid, varid, localStart, localCount, localStride, values)
+     else
+       nf90_get_var_7D_OneByteInt = &
+          nf_get_vara_int1(ncid, varid, localStart, localCount, values)
+     end if
+   end function nf90_get_var_7D_OneByteInt
+
+
+   function nf90_get_var_1D_TwoByteInt(ncid, varid, values, start, count, stride, map)
+     integer,                         intent( in) :: ncid, varid
+     integer (kind = TwoByteInt), dimension(:), &
+                                      intent(out) :: values
+     integer, dimension(:), optional, intent( in) :: start, count, stride, map
+     integer                                      :: nf90_get_var_1D_TwoByteInt
+ 
+     integer, dimension(nf90_max_var_dims) :: localStart, localCount, localStride, localMap
+     integer                               :: numDims, counter
+ 
+     ! Set local arguments to default values
+     numDims                 = size(shape(values))
+     localStart (:         ) = 1
+     localCount (:numDims  ) = shape(values)
+     localCount (numDims+1:) = 1
+     localStride(:         ) = 1
+     localMap   (:numDims  ) = (/ 1, (product(localCount(:counter)), counter = 1, numDims - 1) /)
+ 
+     if(present(start))  localStart (:size(start) )  = start(:)
+     if(present(count))  localCount (:size(count) )  = count(:)
+     if(present(stride)) localStride(:size(stride)) = stride(:)
+     if(present(map))  then
+       localMap   (:size(map))    = map(:)
+       nf90_get_var_1D_TwoByteInt = &
+          nf_get_varm_int2(ncid, varid, localStart, localCount, localStride, localMap, values)
+     else if(present(stride)) then
+       nf90_get_var_1D_TwoByteInt = &
+          nf_get_vars_int2(ncid, varid, localStart, localCount, localStride, values)
+     else
+       nf90_get_var_1D_TwoByteInt = &
+          nf_get_vara_int2(ncid, varid, localStart, localCount, values)
+     end if
+   end function nf90_get_var_1D_TwoByteInt
+
+
+   function nf90_get_var_2D_TwoByteInt(ncid, varid, values, start, count, stride, map)
+     integer,                         intent( in) :: ncid, varid
+     integer (kind = TwoByteInt), dimension(:, :), &
+                                      intent(out) :: values
+     integer, dimension(:), optional, intent( in) :: start, count, stride, map
+     integer                                      :: nf90_get_var_2D_TwoByteInt
+ 
+     integer, dimension(nf90_max_var_dims) :: localStart, localCount, localStride, localMap
+     integer                               :: numDims, counter
+ 
+     ! Set local arguments to default values
+     numDims                 = size(shape(values))
+     localStart (:         ) = 1
+     localCount (:numDims  ) = shape(values)
+     localCount (numDims+1:) = 1
+     localStride(:         ) = 1
+     localMap   (:numDims  ) = (/ 1, (product(localCount(:counter)), counter = 1, numDims - 1) /)
+ 
+     if(present(start))  localStart (:size(start) )  = start(:)
+     if(present(count))  localCount (:size(count) )  = count(:)
+     if(present(stride)) localStride(:size(stride)) = stride(:)
+     if(present(map))  then
+       localMap   (:size(map))    = map(:)
+       nf90_get_var_2D_TwoByteInt = &
+          nf_get_varm_int2(ncid, varid, localStart, localCount, localStride, localMap, values)
+     else if(present(stride)) then
+       nf90_get_var_2D_TwoByteInt = &
+          nf_get_vars_int2(ncid, varid, localStart, localCount, localStride, values)
+     else
+       nf90_get_var_2D_TwoByteInt = &
+          nf_get_vara_int2(ncid, varid, localStart, localCount, values)
+     end if
+   end function nf90_get_var_2D_TwoByteInt
+
+
+   function nf90_get_var_3D_TwoByteInt(ncid, varid, values, start, count, stride, map)
+     integer,                         intent( in) :: ncid, varid
+     integer (kind = TwoByteInt), dimension(:, :, :), &
+                                      intent(out) :: values
+     integer, dimension(:), optional, intent( in) :: start, count, stride, map
+     integer                                      :: nf90_get_var_3D_TwoByteInt
+ 
+     integer, dimension(nf90_max_var_dims) :: localStart, localCount, localStride, localMap
+     integer                               :: numDims, counter
+ 
+     ! Set local arguments to default values
+     numDims                 = size(shape(values))
+     localStart (:         ) = 1
+     localCount (:numDims  ) = shape(values)
+     localCount (numDims+1:) = 1
+     localStride(:         ) = 1
+     localMap   (:numDims  ) = (/ 1, (product(localCount(:counter)), counter = 1, numDims - 1) /)
+ 
+     if(present(start))  localStart (:size(start) )  = start(:)
+     if(present(count))  localCount (:size(count) )  = count(:)
+     if(present(stride)) localStride(:size(stride)) = stride(:)
+     if(present(map))  then
+       localMap   (:size(map))    = map(:)
+       nf90_get_var_3D_TwoByteInt = &
+          nf_get_varm_int2(ncid, varid, localStart, localCount, localStride, localMap, values)
+     else if(present(stride)) then
+       nf90_get_var_3D_TwoByteInt = &
+          nf_get_vars_int2(ncid, varid, localStart, localCount, localStride, values)
+     else
+       nf90_get_var_3D_TwoByteInt = &
+          nf_get_vara_int2(ncid, varid, localStart, localCount, values)
+     end if
+   end function nf90_get_var_3D_TwoByteInt
+
+
+   function nf90_get_var_4D_TwoByteInt(ncid, varid, values, start, count, stride, map)
+     integer,                         intent( in) :: ncid, varid
+     integer (kind = TwoByteInt), dimension(:, :, :, :), &
+                                      intent(out) :: values
+     integer, dimension(:), optional, intent( in) :: start, count, stride, map
+     integer                                      :: nf90_get_var_4D_TwoByteInt
+ 
+     integer, dimension(nf90_max_var_dims) :: localStart, localCount, localStride, localMap
+     integer                               :: numDims, counter
+ 
+     ! Set local arguments to default values
+     numDims                 = size(shape(values))
+     localStart (:         ) = 1
+     localCount (:numDims  ) = shape(values)
+     localCount (numDims+1:) = 1
+     localStride(:         ) = 1
+     localMap   (:numDims  ) = (/ 1, (product(localCount(:counter)), counter = 1, numDims - 1) /)
+ 
+     if(present(start))  localStart (:size(start) )  = start(:)
+     if(present(count))  localCount (:size(count) )  = count(:)
+     if(present(stride)) localStride(:size(stride)) = stride(:)
+     if(present(map))  then
+       localMap   (:size(map))    = map(:)
+       nf90_get_var_4D_TwoByteInt = &
+          nf_get_varm_int2(ncid, varid, localStart, localCount, localStride, localMap, values)
+     else if(present(stride)) then
+       nf90_get_var_4D_TwoByteInt = &
+          nf_get_vars_int2(ncid, varid, localStart, localCount, localStride, values)
+     else
+       nf90_get_var_4D_TwoByteInt = &
+          nf_get_vara_int2(ncid, varid, localStart, localCount, values)
+     end if
+   end function nf90_get_var_4D_TwoByteInt
+
+
+   function nf90_get_var_5D_TwoByteInt(ncid, varid, values, start, count, stride, map)
+     integer,                         intent( in) :: ncid, varid
+     integer (kind = TwoByteInt), dimension(:, :, :, :, :), &
+                                      intent(out) :: values
+     integer, dimension(:), optional, intent( in) :: start, count, stride, map
+     integer                                      :: nf90_get_var_5D_TwoByteInt
+ 
+     integer, dimension(nf90_max_var_dims) :: localStart, localCount, localStride, localMap
+     integer                               :: numDims, counter
+ 
+     ! Set local arguments to default values
+     numDims                 = size(shape(values))
+     localStart (:         ) = 1
+     localCount (:numDims  ) = shape(values)
+     localCount (numDims+1:) = 1
+     localStride(:         ) = 1
+     localMap   (:numDims  ) = (/ 1, (product(localCount(:counter)), counter = 1, numDims - 1) /)
+ 
+     if(present(start))  localStart (:size(start) )  = start(:)
+     if(present(count))  localCount (:size(count) )  = count(:)
+     if(present(stride)) localStride(:size(stride)) = stride(:)
+     if(present(map))  then
+       localMap   (:size(map))    = map(:)
+       nf90_get_var_5D_TwoByteInt = &
+          nf_get_varm_int2(ncid, varid, localStart, localCount, localStride, localMap, values)
+     else if(present(stride)) then
+       nf90_get_var_5D_TwoByteInt = &
+          nf_get_vars_int2(ncid, varid, localStart, localCount, localStride, values)
+     else
+       nf90_get_var_5D_TwoByteInt = &
+          nf_get_vara_int2(ncid, varid, localStart, localCount, values)
+     end if
+   end function nf90_get_var_5D_TwoByteInt
+
+
+   function nf90_get_var_6D_TwoByteInt(ncid, varid, values, start, count, stride, map)
+     integer,                         intent( in) :: ncid, varid
+     integer (kind = TwoByteInt), dimension(:, :, :, :, :, :), &
+                                      intent(out) :: values
+     integer, dimension(:), optional, intent( in) :: start, count, stride, map
+     integer                                      :: nf90_get_var_6D_TwoByteInt
+ 
+     integer, dimension(nf90_max_var_dims) :: localStart, localCount, localStride, localMap
+     integer                               :: numDims, counter
+ 
+     ! Set local arguments to default values
+     numDims                 = size(shape(values))
+     localStart (:         ) = 1
+     localCount (:numDims  ) = shape(values)
+     localCount (numDims+1:) = 1
+     localStride(:         ) = 1
+     localMap   (:numDims  ) = (/ 1, (product(localCount(:counter)), counter = 1, numDims - 1) /)
+ 
+     if(present(start))  localStart (:size(start) )  = start(:)
+     if(present(count))  localCount (:size(count) )  = count(:)
+     if(present(stride)) localStride(:size(stride)) = stride(:)
+     if(present(map))  then
+       localMap   (:size(map))    = map(:)
+       nf90_get_var_6D_TwoByteInt = &
+          nf_get_varm_int2(ncid, varid, localStart, localCount, localStride, localMap, values)
+     else if(present(stride)) then
+       nf90_get_var_6D_TwoByteInt = &
+          nf_get_vars_int2(ncid, varid, localStart, localCount, localStride, values)
+     else
+       nf90_get_var_6D_TwoByteInt = &
+          nf_get_vara_int2(ncid, varid, localStart, localCount, values)
+     end if
+   end function nf90_get_var_6D_TwoByteInt
+
+
+   function nf90_get_var_7D_TwoByteInt(ncid, varid, values, start, count, stride, map)
+     integer,                         intent( in) :: ncid, varid
+     integer (kind = TwoByteInt), dimension(:, :, :, :, :, :, :), &
+                                      intent(out) :: values
+     integer, dimension(:), optional, intent( in) :: start, count, stride, map
+     integer                                      :: nf90_get_var_7D_TwoByteInt
+ 
+     integer, dimension(nf90_max_var_dims) :: localStart, localCount, localStride, localMap
+     integer                               :: numDims, counter
+ 
+     ! Set local arguments to default values
+     numDims                 = size(shape(values))
+     localStart (:         ) = 1
+     localCount (:numDims  ) = shape(values)
+     localCount (numDims+1:) = 1
+     localStride(:         ) = 1
+     localMap   (:numDims  ) = (/ 1, (product(localCount(:counter)), counter = 1, numDims - 1) /)
+ 
+     if(present(start))  localStart (:size(start) )  = start(:)
+     if(present(count))  localCount (:size(count) )  = count(:)
+     if(present(stride)) localStride(:size(stride)) = stride(:)
+     if(present(map))  then
+       localMap   (:size(map))    = map(:)
+       nf90_get_var_7D_TwoByteInt = &
+          nf_get_varm_int2(ncid, varid, localStart, localCount, localStride, localMap, values)
+     else if(present(stride)) then
+       nf90_get_var_7D_TwoByteInt = &
+          nf_get_vars_int2(ncid, varid, localStart, localCount, localStride, values)
+     else
+       nf90_get_var_7D_TwoByteInt = &
+          nf_get_vara_int2(ncid, varid, localStart, localCount, values)
+     end if
+   end function nf90_get_var_7D_TwoByteInt
+
+
+   function nf90_get_var_1D_FourByteInt(ncid, varid, values, start, count, stride, map)
+     integer,                         intent( in) :: ncid, varid
+     integer (kind = FourByteInt), dimension(:), &
+                                      intent(out) :: values
+     integer, dimension(:), optional, intent( in) :: start, count, stride, map
+     integer                                      :: nf90_get_var_1D_FourByteInt
+ 
+     integer, dimension(nf90_max_var_dims) :: localStart, localCount, localStride, localMap
+     integer                               :: numDims, counter
+     integer, dimension(size(values))      :: defaultIntArray
+ 
+     ! Set local arguments to default values
+     numDims                 = size(shape(values))
+     localStart (:         ) = 1
+     localCount (:numDims  ) = shape(values)
+     localCount (numDims+1:) = 1
+     localStride(:         ) = 1
+     localMap   (:numDims  ) = (/ 1, (product(localCount(:counter)), counter = 1, numDims - 1) /)
+ 
+     if(present(start))  localStart (:size(start) )  = start(:)
+     if(present(count))  localCount (:size(count) )  = count(:)
+     if(present(stride)) localStride(:size(stride)) = stride(:)
+     if(present(map))  then
+       localMap   (:size(map))    = map(:)
+       nf90_get_var_1D_FourByteInt = &
+          nf_get_varm_int(ncid, varid, localStart, localCount, localStride, localMap, defaultIntArray)
+     else if(present(stride)) then
+       nf90_get_var_1D_FourByteInt = &
+          nf_get_vars_int(ncid, varid, localStart, localCount, localStride, defaultIntArray)
+     else
+       nf90_get_var_1D_FourByteInt = &
+          nf_get_vara_int(ncid, varid, localStart, localCount, defaultIntArray)
+     end if
+     values(:) = reshape(defaultIntArray(:), shape(values))
+   end function nf90_get_var_1D_FourByteInt
+
+
+   function nf90_get_var_2D_FourByteInt(ncid, varid, values, start, count, stride, map)
+     integer,                         intent( in) :: ncid, varid
+     integer (kind = FourByteInt), dimension(:, :), &
+                                      intent(out) :: values
+     integer, dimension(:), optional, intent( in) :: start, count, stride, map
+     integer                                      :: nf90_get_var_2D_FourByteInt
+ 
+     integer, dimension(nf90_max_var_dims) :: localStart, localCount, localStride, localMap
+     integer                               :: numDims, counter
+     integer, dimension(size(values))      :: defaultIntArray
+ 
+     ! Set local arguments to default values
+     numDims                 = size(shape(values))
+     localStart (:         ) = 1
+     localCount (:numDims  ) = shape(values)
+     localCount (numDims+1:) = 1
+     localStride(:         ) = 1
+     localMap   (:numDims  ) = (/ 1, (product(localCount(:counter)), counter = 1, numDims - 1) /)
+ 
+     if(present(start))  localStart (:size(start) )  = start(:)
+     if(present(count))  localCount (:size(count) )  = count(:)
+     if(present(stride)) localStride(:size(stride)) = stride(:)
+     if(present(map))  then
+       localMap   (:size(map))    = map(:)
+       nf90_get_var_2D_FourByteInt = &
+          nf_get_varm_int(ncid, varid, localStart, localCount, localStride, localMap, defaultIntArray)
+     else if(present(stride)) then
+       nf90_get_var_2D_FourByteInt = &
+          nf_get_vars_int(ncid, varid, localStart, localCount, localStride, defaultIntArray)
+     else
+       nf90_get_var_2D_FourByteInt = &
+          nf_get_vara_int(ncid, varid, localStart, localCount, defaultIntArray)
+     end if
+     values(:, :) = reshape(defaultIntArray(:), shape(values))
+   end function nf90_get_var_2D_FourByteInt
+
+
+   function nf90_get_var_3D_FourByteInt(ncid, varid, values, start, count, stride, map)
+     integer,                         intent( in) :: ncid, varid
+     integer (kind = FourByteInt), dimension(:, :, :), &
+                                      intent(out) :: values
+     integer, dimension(:), optional, intent( in) :: start, count, stride, map
+     integer                                      :: nf90_get_var_3D_FourByteInt
+ 
+     integer, dimension(nf90_max_var_dims) :: localStart, localCount, localStride, localMap
+     integer                               :: numDims, counter
+     integer, dimension(size(values))      :: defaultIntArray
+ 
+     ! Set local arguments to default values
+     numDims                 = size(shape(values))
+     localStart (:         ) = 1
+     localCount (:numDims  ) = shape(values)
+     localCount (numDims+1:) = 1
+     localStride(:         ) = 1
+     localMap   (:numDims  ) = (/ 1, (product(localCount(:counter)), counter = 1, numDims - 1) /)
+ 
+     if(present(start))  localStart (:size(start) )  = start(:)
+     if(present(count))  localCount (:size(count) )  = count(:)
+     if(present(stride)) localStride(:size(stride)) = stride(:)
+     if(present(map))  then
+       localMap   (:size(map))    = map(:)
+       nf90_get_var_3D_FourByteInt = &
+          nf_get_varm_int(ncid, varid, localStart, localCount, localStride, localMap, defaultIntArray)
+     else if(present(stride)) then
+       nf90_get_var_3D_FourByteInt = &
+          nf_get_vars_int(ncid, varid, localStart, localCount, localStride, defaultIntArray)
+     else
+       nf90_get_var_3D_FourByteInt = &
+          nf_get_vara_int(ncid, varid, localStart, localCount, defaultIntArray)
+     end if
+     values(:, :, :) = reshape(defaultIntArray(:), shape(values))
+   end function nf90_get_var_3D_FourByteInt
+
+
+   function nf90_get_var_4D_FourByteInt(ncid, varid, values, start, count, stride, map)
+     integer,                         intent( in) :: ncid, varid
+     integer (kind = FourByteInt), dimension(:, :, :, :), &
+                                      intent(out) :: values
+     integer, dimension(:), optional, intent( in) :: start, count, stride, map
+     integer                                      :: nf90_get_var_4D_FourByteInt
+ 
+     integer, dimension(nf90_max_var_dims) :: localStart, localCount, localStride, localMap
+     integer                               :: numDims, counter
+     integer, dimension(size(values))      :: defaultIntArray
+ 
+     ! Set local arguments to default values
+     numDims                 = size(shape(values))
+     localStart (:         ) = 1
+     localCount (:numDims  ) = shape(values)
+     localCount (numDims+1:) = 1
+     localStride(:         ) = 1
+     localMap   (:numDims  ) = (/ 1, (product(localCount(:counter)), counter = 1, numDims - 1) /)
+ 
+     if(present(start))  localStart (:size(start) )  = start(:)
+     if(present(count))  localCount (:size(count) )  = count(:)
+     if(present(stride)) localStride(:size(stride)) = stride(:)
+     if(present(map))  then
+       localMap   (:size(map))    = map(:)
+       nf90_get_var_4D_FourByteInt = &
+          nf_get_varm_int(ncid, varid, localStart, localCount, localStride, localMap, defaultIntArray)
+     else if(present(stride)) then
+       nf90_get_var_4D_FourByteInt = &
+          nf_get_vars_int(ncid, varid, localStart, localCount, localStride, defaultIntArray)
+     else
+       nf90_get_var_4D_FourByteInt = &
+          nf_get_vara_int(ncid, varid, localStart, localCount, defaultIntArray)
+     end if
+     values(:, :, :, :) = reshape(defaultIntArray(:), shape(values))
+   end function nf90_get_var_4D_FourByteInt
+
+
+   function nf90_get_var_5D_FourByteInt(ncid, varid, values, start, count, stride, map)
+     integer,                         intent( in) :: ncid, varid
+     integer (kind = FourByteInt), dimension(:, :, :, :, :), &
+                                      intent(out) :: values
+     integer, dimension(:), optional, intent( in) :: start, count, stride, map
+     integer                                      :: nf90_get_var_5D_FourByteInt
+ 
+     integer, dimension(nf90_max_var_dims) :: localStart, localCount, localStride, localMap
+     integer                               :: numDims, counter
+     integer, dimension(size(values))      :: defaultIntArray
+ 
+     ! Set local arguments to default values
+     numDims                 = size(shape(values))
+     localStart (:         ) = 1
+     localCount (:numDims  ) = shape(values)
+     localCount (numDims+1:) = 1
+     localStride(:         ) = 1
+     localMap   (:numDims  ) = (/ 1, (product(localCount(:counter)), counter = 1, numDims - 1) /)
+ 
+     if(present(start))  localStart (:size(start) )  = start(:)
+     if(present(count))  localCount (:size(count) )  = count(:)
+     if(present(stride)) localStride(:size(stride)) = stride(:)
+     if(present(map))  then
+       localMap   (:size(map))    = map(:)
+       nf90_get_var_5D_FourByteInt = &
+          nf_get_varm_int(ncid, varid, localStart, localCount, localStride, localMap, defaultIntArray)
+     else if(present(stride)) then
+       nf90_get_var_5D_FourByteInt = &
+          nf_get_vars_int(ncid, varid, localStart, localCount, localStride, defaultIntArray)
+     else
+       nf90_get_var_5D_FourByteInt = &
+          nf_get_vara_int(ncid, varid, localStart, localCount, defaultIntArray)
+     end if
+     values(:, :, :, :, :) = reshape(defaultIntArray(:), shape(values))
+   end function nf90_get_var_5D_FourByteInt
+
+
+   function nf90_get_var_6D_FourByteInt(ncid, varid, values, start, count, stride, map)
+     integer,                         intent( in) :: ncid, varid
+     integer (kind = FourByteInt), dimension(:, :, :, :, :, :), &
+                                      intent(out) :: values
+     integer, dimension(:), optional, intent( in) :: start, count, stride, map
+     integer                                      :: nf90_get_var_6D_FourByteInt
+ 
+     integer, dimension(nf90_max_var_dims) :: localStart, localCount, localStride, localMap
+     integer                               :: numDims, counter
+     integer, dimension(size(values))      :: defaultIntArray
+ 
+     ! Set local arguments to default values
+     numDims                 = size(shape(values))
+     localStart (:         ) = 1
+     localCount (:numDims  ) = shape(values)
+     localCount (numDims+1:) = 1
+     localStride(:         ) = 1
+     localMap   (:numDims  ) = (/ 1, (product(localCount(:counter)), counter = 1, numDims - 1) /)
+ 
+     if(present(start))  localStart (:size(start) )  = start(:)
+     if(present(count))  localCount (:size(count) )  = count(:)
+     if(present(stride)) localStride(:size(stride)) = stride(:)
+     if(present(map))  then
+       localMap   (:size(map))    = map(:)
+       nf90_get_var_6D_FourByteInt = &
+          nf_get_varm_int(ncid, varid, localStart, localCount, localStride, localMap, defaultIntArray)
+     else if(present(stride)) then
+       nf90_get_var_6D_FourByteInt = &
+          nf_get_vars_int(ncid, varid, localStart, localCount, localStride, defaultIntArray)
+     else
+       nf90_get_var_6D_FourByteInt = &
+          nf_get_vara_int(ncid, varid, localStart, localCount, defaultIntArray)
+     end if
+     values(:, :, :, :, :, :) = reshape(defaultIntArray(:), shape(values))
+   end function nf90_get_var_6D_FourByteInt
+
+
+   function nf90_get_var_7D_FourByteInt(ncid, varid, values, start, count, stride, map)
+     integer,                         intent( in) :: ncid, varid
+     integer (kind = FourByteInt), dimension(:, :, :, :, :, :, :), &
+                                      intent(out) :: values
+     integer, dimension(:), optional, intent( in) :: start, count, stride, map
+     integer                                      :: nf90_get_var_7D_FourByteInt
+ 
+     integer, dimension(nf90_max_var_dims) :: localStart, localCount, localStride, localMap
+     integer                               :: numDims, counter
+     integer, dimension(size(values))      :: defaultIntArray
+ 
+     ! Set local arguments to default values
+     numDims                 = size(shape(values))
+     localStart (:         ) = 1
+     localCount (:numDims  ) = shape(values)
+     localCount (numDims+1:) = 1
+     localStride(:         ) = 1
+     localMap   (:numDims  ) = (/ 1, (product(localCount(:counter)), counter = 1, numDims - 1) /)
+ 
+     if(present(start))  localStart (:size(start) )  = start(:)
+     if(present(count))  localCount (:size(count) )  = count(:)
+     if(present(stride)) localStride(:size(stride)) = stride(:)
+     if(present(map))  then
+       localMap   (:size(map))    = map(:)
+       nf90_get_var_7D_FourByteInt = &
+          nf_get_varm_int(ncid, varid, localStart, localCount, localStride, localMap, defaultIntArray)
+     else if(present(stride)) then
+       nf90_get_var_7D_FourByteInt = &
+          nf_get_vars_int(ncid, varid, localStart, localCount, localStride, defaultIntArray)
+     else
+       nf90_get_var_7D_FourByteInt = &
+          nf_get_vara_int(ncid, varid, localStart, localCount, defaultIntArray)
+     end if
+     values(:, :, :, :, :, :, :) = reshape(defaultIntArray(:), shape(values))
+   end function nf90_get_var_7D_FourByteInt
+
+
+   function nf90_get_var_1D_FourByteReal(ncid, varid, values, start, count, stride, map)
+     integer,                         intent( in) :: ncid, varid
+     real (kind = FourByteReal), dimension(:), &
+                                      intent(out) :: values
+     integer, dimension(:), optional, intent( in) :: start, count, stride, map
+     integer                                      :: nf90_get_var_1D_FourByteReal
+ 
+     integer, dimension(nf90_max_var_dims) :: localStart, localCount, localStride, localMap
+     integer                               :: numDims, counter
+ 
+     ! Set local arguments to default values
+     numDims                 = size(shape(values))
+     localStart (:         ) = 1
+     localCount (:numDims  ) = shape(values)
+     localCount (numDims+1:) = 1
+     localStride(:         ) = 1
+     localMap   (:numDims  ) = (/ 1, (product(localCount(:counter)), counter = 1, numDims - 1) /)
+ 
+     if(present(start))  localStart (:size(start) )  = start(:)
+     if(present(count))  localCount (:size(count) )  = count(:)
+     if(present(stride)) localStride(:size(stride)) = stride(:)
+     if(present(map))  then
+       localMap   (:size(map))    = map(:)
+       nf90_get_var_1D_FourByteReal = &
+          nf_get_varm_real(ncid, varid, localStart, localCount, localStride, localMap, values)
+     else if(present(stride)) then
+       nf90_get_var_1D_FourByteReal = &
+          nf_get_vars_real(ncid, varid, localStart, localCount, localStride, values)
+     else
+       nf90_get_var_1D_FourByteReal = &
+          nf_get_vara_real(ncid, varid, localStart, localCount, values)
+     end if
+   end function nf90_get_var_1D_FourByteReal
+
+
+   function nf90_get_var_2D_FourByteReal(ncid, varid, values, start, count, stride, map)
+     integer,                         intent( in) :: ncid, varid
+     real (kind = FourByteReal), dimension(:, :), &
+                                      intent(out) :: values
+     integer, dimension(:), optional, intent( in) :: start, count, stride, map
+     integer                                      :: nf90_get_var_2D_FourByteReal
+ 
+     integer, dimension(nf90_max_var_dims) :: localStart, localCount, localStride, localMap
+     integer                               :: numDims, counter
+ 
+     ! Set local arguments to default values
+     numDims                 = size(shape(values))
+     localStart (:         ) = 1
+     localCount (:numDims  ) = shape(values)
+     localCount (numDims+1:) = 1
+     localStride(:         ) = 1
+     localMap   (:numDims  ) = (/ 1, (product(localCount(:counter)), counter = 1, numDims - 1) /)
+ 
+     if(present(start))  localStart (:size(start) )  = start(:)
+     if(present(count))  localCount (:size(count) )  = count(:)
+     if(present(stride)) localStride(:size(stride)) = stride(:)
+     if(present(map))  then
+       localMap   (:size(map))    = map(:)
+       nf90_get_var_2D_FourByteReal = &
+          nf_get_varm_real(ncid, varid, localStart, localCount, localStride, localMap, values)
+     else if(present(stride)) then
+       nf90_get_var_2D_FourByteReal = &
+          nf_get_vars_real(ncid, varid, localStart, localCount, localStride, values)
+     else
+       nf90_get_var_2D_FourByteReal = &
+          nf_get_vara_real(ncid, varid, localStart, localCount, values)
+     end if
+   end function nf90_get_var_2D_FourByteReal
+
+
+   function nf90_get_var_3D_FourByteReal(ncid, varid, values, start, count, stride, map)
+     integer,                         intent( in) :: ncid, varid
+     real (kind = FourByteReal), dimension(:, :, :), &
+                                      intent(out) :: values
+     integer, dimension(:), optional, intent( in) :: start, count, stride, map
+     integer                                      :: nf90_get_var_3D_FourByteReal
+ 
+     integer, dimension(nf90_max_var_dims) :: localStart, localCount, localStride, localMap
+     integer                               :: numDims, counter
+ 
+     ! Set local arguments to default values
+     numDims                 = size(shape(values))
+     localStart (:         ) = 1
+     localCount (:numDims  ) = shape(values)
+     localCount (numDims+1:) = 1
+     localStride(:         ) = 1
+     localMap   (:numDims  ) = (/ 1, (product(localCount(:counter)), counter = 1, numDims - 1) /)
+ 
+     if(present(start))  localStart (:size(start) )  = start(:)
+     if(present(count))  localCount (:size(count) )  = count(:)
+     if(present(stride)) localStride(:size(stride)) = stride(:)
+     if(present(map))  then
+       localMap   (:size(map))    = map(:)
+       nf90_get_var_3D_FourByteReal = &
+          nf_get_varm_real(ncid, varid, localStart, localCount, localStride, localMap, values)
+     else if(present(stride)) then
+       nf90_get_var_3D_FourByteReal = &
+          nf_get_vars_real(ncid, varid, localStart, localCount, localStride, values)
+     else
+       nf90_get_var_3D_FourByteReal = &
+          nf_get_vara_real(ncid, varid, localStart, localCount, values)
+     end if
+   end function nf90_get_var_3D_FourByteReal
+
+
+   function nf90_get_var_4D_FourByteReal(ncid, varid, values, start, count, stride, map)
+     integer,                         intent( in) :: ncid, varid
+     real (kind = FourByteReal), dimension(:, :, :, :), &
+                                      intent(out) :: values
+     integer, dimension(:), optional, intent( in) :: start, count, stride, map
+     integer                                      :: nf90_get_var_4D_FourByteReal
+ 
+     integer, dimension(nf90_max_var_dims) :: localStart, localCount, localStride, localMap
+     integer                               :: numDims, counter
+ 
+     ! Set local arguments to default values
+     numDims                 = size(shape(values))
+     localStart (:         ) = 1
+     localCount (:numDims  ) = shape(values)
+     localCount (numDims+1:) = 1
+     localStride(:         ) = 1
+     localMap   (:numDims  ) = (/ 1, (product(localCount(:counter)), counter = 1, numDims - 1) /)
+ 
+     if(present(start))  localStart (:size(start) )  = start(:)
+     if(present(count))  localCount (:size(count) )  = count(:)
+     if(present(stride)) localStride(:size(stride)) = stride(:)
+     if(present(map))  then
+       localMap   (:size(map))    = map(:)
+       nf90_get_var_4D_FourByteReal = &
+          nf_get_varm_real(ncid, varid, localStart, localCount, localStride, localMap, values)
+     else if(present(stride)) then
+       nf90_get_var_4D_FourByteReal = &
+          nf_get_vars_real(ncid, varid, localStart, localCount, localStride, values)
+     else
+       nf90_get_var_4D_FourByteReal = &
+          nf_get_vara_real(ncid, varid, localStart, localCount, values)
+     end if
+   end function nf90_get_var_4D_FourByteReal
+
+
+   function nf90_get_var_5D_FourByteReal(ncid, varid, values, start, count, stride, map)
+     integer,                         intent( in) :: ncid, varid
+     real (kind = FourByteReal), dimension(:, :, :, :, :), &
+                                      intent(out) :: values
+     integer, dimension(:), optional, intent( in) :: start, count, stride, map
+     integer                                      :: nf90_get_var_5D_FourByteReal
+ 
+     integer, dimension(nf90_max_var_dims) :: localStart, localCount, localStride, localMap
+     integer                               :: numDims, counter
+ 
+     ! Set local arguments to default values
+     numDims                 = size(shape(values))
+     localStart (:         ) = 1
+     localCount (:numDims  ) = shape(values)
+     localCount (numDims+1:) = 1
+     localStride(:         ) = 1
+     localMap   (:numDims  ) = (/ 1, (product(localCount(:counter)), counter = 1, numDims - 1) /)
+ 
+     if(present(start))  localStart (:size(start) )  = start(:)
+     if(present(count))  localCount (:size(count) )  = count(:)
+     if(present(stride)) localStride(:size(stride)) = stride(:)
+     if(present(map))  then
+       localMap   (:size(map))    = map(:)
+       nf90_get_var_5D_FourByteReal = &
+          nf_get_varm_real(ncid, varid, localStart, localCount, localStride, localMap, values)
+     else if(present(stride)) then
+       nf90_get_var_5D_FourByteReal = &
+          nf_get_vars_real(ncid, varid, localStart, localCount, localStride, values)
+     else
+       nf90_get_var_5D_FourByteReal = &
+          nf_get_vara_real(ncid, varid, localStart, localCount, values)
+     end if
+   end function nf90_get_var_5D_FourByteReal
+
+
+   function nf90_get_var_6D_FourByteReal(ncid, varid, values, start, count, stride, map)
+     integer,                         intent( in) :: ncid, varid
+     real (kind = FourByteReal), dimension(:, :, :, :, :, :), &
+                                      intent(out) :: values
+     integer, dimension(:), optional, intent( in) :: start, count, stride, map
+     integer                                      :: nf90_get_var_6D_FourByteReal
+ 
+     integer, dimension(nf90_max_var_dims) :: localStart, localCount, localStride, localMap
+     integer                               :: numDims, counter
+ 
+     ! Set local arguments to default values
+     numDims                 = size(shape(values))
+     localStart (:         ) = 1
+     localCount (:numDims  ) = shape(values)
+     localCount (numDims+1:) = 1
+     localStride(:         ) = 1
+     localMap   (:numDims  ) = (/ 1, (product(localCount(:counter)), counter = 1, numDims - 1) /)
+ 
+     if(present(start))  localStart (:size(start) )  = start(:)
+     if(present(count))  localCount (:size(count) )  = count(:)
+     if(present(stride)) localStride(:size(stride)) = stride(:)
+     if(present(map))  then
+       localMap   (:size(map))    = map(:)
+       nf90_get_var_6D_FourByteReal = &
+          nf_get_varm_real(ncid, varid, localStart, localCount, localStride, localMap, values)
+     else if(present(stride)) then
+       nf90_get_var_6D_FourByteReal = &
+          nf_get_vars_real(ncid, varid, localStart, localCount, localStride, values)
+     else
+       nf90_get_var_6D_FourByteReal = &
+          nf_get_vara_real(ncid, varid, localStart, localCount, values)
+     end if
+   end function nf90_get_var_6D_FourByteReal
+
+
+   function nf90_get_var_7D_FourByteReal(ncid, varid, values, start, count, stride, map)
+     integer,                         intent( in) :: ncid, varid
+     real (kind = FourByteReal), dimension(:, :, :, :, :, :, :), &
+                                      intent(out) :: values
+     integer, dimension(:), optional, intent( in) :: start, count, stride, map
+     integer                                      :: nf90_get_var_7D_FourByteReal
+ 
+     integer, dimension(nf90_max_var_dims) :: localStart, localCount, localStride, localMap
+     integer                               :: numDims, counter
+ 
+     ! Set local arguments to default values
+     numDims                 = size(shape(values))
+     localStart (:         ) = 1
+     localCount (:numDims  ) = shape(values)
+     localCount (numDims+1:) = 1
+     localStride(:         ) = 1
+     localMap   (:numDims  ) = (/ 1, (product(localCount(:counter)), counter = 1, numDims - 1) /)
+ 
+     if(present(start))  localStart (:size(start) )  = start(:)
+     if(present(count))  localCount (:size(count) )  = count(:)
+     if(present(stride)) localStride(:size(stride)) = stride(:)
+     if(present(map))  then
+       localMap   (:size(map))    = map(:)
+       nf90_get_var_7D_FourByteReal = &
+          nf_get_varm_real(ncid, varid, localStart, localCount, localStride, localMap, values)
+     else if(present(stride)) then
+       nf90_get_var_7D_FourByteReal = &
+          nf_get_vars_real(ncid, varid, localStart, localCount, localStride, values)
+     else
+       nf90_get_var_7D_FourByteReal = &
+          nf_get_vara_real(ncid, varid, localStart, localCount, values)
+     end if
+   end function nf90_get_var_7D_FourByteReal
+
+
+   function nf90_get_var_1D_EightByteReal(ncid, varid, values, start, count, stride, map)
+     integer,                         intent( in) :: ncid, varid
+     real (kind = EightByteReal), dimension(:), &
+                                      intent(out) :: values
+     integer, dimension(:), optional, intent( in) :: start, count, stride, map
+     integer                                      :: nf90_get_var_1D_EightByteReal
+ 
+     integer, dimension(nf90_max_var_dims) :: localStart, localCount, localStride, localMap
+     integer                               :: numDims, counter
+ 
+     ! Set local arguments to default values
+     numDims                 = size(shape(values))
+     localStart (:         ) = 1
+     localCount (:numDims  ) = shape(values)
+     localCount (numDims+1:) = 1
+     localStride(:         ) = 1
+     localMap   (:numDims  ) = (/ 1, (product(localCount(:counter)), counter = 1, numDims - 1) /)
+ 
+     if(present(start))  localStart (:size(start) )  = start(:)
+     if(present(count))  localCount (:size(count) )  = count(:)
+     if(present(stride)) localStride(:size(stride)) = stride(:)
+     if(present(map))  then
+       localMap   (:size(map))    = map(:)
+       nf90_get_var_1D_EightByteReal = &
+          nf_get_varm_double(ncid, varid, localStart, localCount, localStride, localMap, values)
+     else if(present(stride)) then
+       nf90_get_var_1D_EightByteReal = &
+          nf_get_vars_double(ncid, varid, localStart, localCount, localStride, values)
+     else
+       nf90_get_var_1D_EightByteReal = &
+          nf_get_vara_double(ncid, varid, localStart, localCount, values)
+     end if
+   end function nf90_get_var_1D_EightByteReal
+
+
+   function nf90_get_var_2D_EightByteReal(ncid, varid, values, start, count, stride, map)
+     integer,                         intent( in) :: ncid, varid
+     real (kind = EightByteReal), dimension(:, :), &
+                                      intent(out) :: values
+     integer, dimension(:), optional, intent( in) :: start, count, stride, map
+     integer                                      :: nf90_get_var_2D_EightByteReal
+ 
+     integer, dimension(nf90_max_var_dims) :: localStart, localCount, localStride, localMap
+     integer                               :: numDims, counter
+ 
+     ! Set local arguments to default values
+     numDims                 = size(shape(values))
+     localStart (:         ) = 1
+     localCount (:numDims  ) = shape(values)
+     localCount (numDims+1:) = 1
+     localStride(:         ) = 1
+     localMap   (:numDims  ) = (/ 1, (product(localCount(:counter)), counter = 1, numDims - 1) /)
+ 
+     if(present(start))  localStart (:size(start) )  = start(:)
+     if(present(count))  localCount (:size(count) )  = count(:)
+     if(present(stride)) localStride(:size(stride)) = stride(:)
+     if(present(map))  then
+       localMap   (:size(map))    = map(:)
+       nf90_get_var_2D_EightByteReal = &
+          nf_get_varm_double(ncid, varid, localStart, localCount, localStride, localMap, values)
+     else if(present(stride)) then
+       nf90_get_var_2D_EightByteReal = &
+          nf_get_vars_double(ncid, varid, localStart, localCount, localStride, values)
+     else
+       nf90_get_var_2D_EightByteReal = &
+          nf_get_vara_double(ncid, varid, localStart, localCount, values)
+     end if
+   end function nf90_get_var_2D_EightByteReal
+
+
+   function nf90_get_var_3D_EightByteReal(ncid, varid, values, start, count, stride, map)
+     integer,                         intent( in) :: ncid, varid
+     real (kind = EightByteReal), dimension(:, :, :), &
+                                      intent(out) :: values
+     integer, dimension(:), optional, intent( in) :: start, count, stride, map
+     integer                                      :: nf90_get_var_3D_EightByteReal
+ 
+     integer, dimension(nf90_max_var_dims) :: localStart, localCount, localStride, localMap
+     integer                               :: numDims, counter
+ 
+     ! Set local arguments to default values
+     numDims                 = size(shape(values))
+     localStart (:         ) = 1
+     localCount (:numDims  ) = shape(values)
+     localCount (numDims+1:) = 1
+     localStride(:         ) = 1
+     localMap   (:numDims  ) = (/ 1, (product(localCount(:counter)), counter = 1, numDims - 1) /)
+ 
+     if(present(start))  localStart (:size(start) )  = start(:)
+     if(present(count))  localCount (:size(count) )  = count(:)
+     if(present(stride)) localStride(:size(stride)) = stride(:)
+     if(present(map))  then
+       localMap   (:size(map))    = map(:)
+       nf90_get_var_3D_EightByteReal = &
+          nf_get_varm_double(ncid, varid, localStart, localCount, localStride, localMap, values)
+     else if(present(stride)) then
+       nf90_get_var_3D_EightByteReal = &
+          nf_get_vars_double(ncid, varid, localStart, localCount, localStride, values)
+     else
+       nf90_get_var_3D_EightByteReal = &
+          nf_get_vara_double(ncid, varid, localStart, localCount, values)
+     end if
+   end function nf90_get_var_3D_EightByteReal
+
+
+   function nf90_get_var_4D_EightByteReal(ncid, varid, values, start, count, stride, map)
+     integer,                         intent( in) :: ncid, varid
+     real (kind = EightByteReal), dimension(:, :, :, :), &
+                                      intent(out) :: values
+     integer, dimension(:), optional, intent( in) :: start, count, stride, map
+     integer                                      :: nf90_get_var_4D_EightByteReal
+ 
+     integer, dimension(nf90_max_var_dims) :: localStart, localCount, localStride, localMap
+     integer                               :: numDims, counter
+ 
+     ! Set local arguments to default values
+     numDims                 = size(shape(values))
+     localStart (:         ) = 1
+     localCount (:numDims  ) = shape(values)
+     localCount (numDims+1:) = 1
+     localStride(:         ) = 1
+     localMap   (:numDims  ) = (/ 1, (product(localCount(:counter)), counter = 1, numDims - 1) /)
+ 
+     if(present(start))  localStart (:size(start) )  = start(:)
+     if(present(count))  localCount (:size(count) )  = count(:)
+     if(present(stride)) localStride(:size(stride)) = stride(:)
+     if(present(map))  then
+       localMap   (:size(map))    = map(:)
+       nf90_get_var_4D_EightByteReal = &
+          nf_get_varm_double(ncid, varid, localStart, localCount, localStride, localMap, values)
+     else if(present(stride)) then
+       nf90_get_var_4D_EightByteReal = &
+          nf_get_vars_double(ncid, varid, localStart, localCount, localStride, values)
+     else
+       nf90_get_var_4D_EightByteReal = &
+          nf_get_vara_double(ncid, varid, localStart, localCount, values)
+     end if
+   end function nf90_get_var_4D_EightByteReal
+
+
+   function nf90_get_var_5D_EightByteReal(ncid, varid, values, start, count, stride, map)
+     integer,                         intent( in) :: ncid, varid
+     real (kind = EightByteReal), dimension(:, :, :, :, :), &
+                                      intent(out) :: values
+     integer, dimension(:), optional, intent( in) :: start, count, stride, map
+     integer                                      :: nf90_get_var_5D_EightByteReal
+ 
+     integer, dimension(nf90_max_var_dims) :: localStart, localCount, localStride, localMap
+     integer                               :: numDims, counter
+ 
+     ! Set local arguments to default values
+     numDims                 = size(shape(values))
+     localStart (:         ) = 1
+     localCount (:numDims  ) = shape(values)
+     localCount (numDims+1:) = 1
+     localStride(:         ) = 1
+     localMap   (:numDims  ) = (/ 1, (product(localCount(:counter)), counter = 1, numDims - 1) /)
+ 
+     if(present(start))  localStart (:size(start) )  = start(:)
+     if(present(count))  localCount (:size(count) )  = count(:)
+     if(present(stride)) localStride(:size(stride)) = stride(:)
+     if(present(map))  then
+       localMap   (:size(map))    = map(:)
+       nf90_get_var_5D_EightByteReal = &
+          nf_get_varm_double(ncid, varid, localStart, localCount, localStride, localMap, values)
+     else if(present(stride)) then
+       nf90_get_var_5D_EightByteReal = &
+          nf_get_vars_double(ncid, varid, localStart, localCount, localStride, values)
+     else
+       nf90_get_var_5D_EightByteReal = &
+          nf_get_vara_double(ncid, varid, localStart, localCount, values)
+     end if
+   end function nf90_get_var_5D_EightByteReal
+
+
+   function nf90_get_var_6D_EightByteReal(ncid, varid, values, start, count, stride, map)
+     integer,                         intent( in) :: ncid, varid
+     real (kind = EightByteReal), dimension(:, :, :, :, :, :), &
+                                      intent(out) :: values
+     integer, dimension(:), optional, intent( in) :: start, count, stride, map
+     integer                                      :: nf90_get_var_6D_EightByteReal
+ 
+     integer, dimension(nf90_max_var_dims) :: localStart, localCount, localStride, localMap
+     integer                               :: numDims, counter
+ 
+     ! Set local arguments to default values
+     numDims                 = size(shape(values))
+     localStart (:         ) = 1
+     localCount (:numDims  ) = shape(values)
+     localCount (numDims+1:) = 1
+     localStride(:         ) = 1
+     localMap   (:numDims  ) = (/ 1, (product(localCount(:counter)), counter = 1, numDims - 1) /)
+ 
+     if(present(start))  localStart (:size(start) )  = start(:)
+     if(present(count))  localCount (:size(count) )  = count(:)
+     if(present(stride)) localStride(:size(stride)) = stride(:)
+     if(present(map))  then
+       localMap   (:size(map))    = map(:)
+       nf90_get_var_6D_EightByteReal = &
+          nf_get_varm_double(ncid, varid, localStart, localCount, localStride, localMap, values)
+     else if(present(stride)) then
+       nf90_get_var_6D_EightByteReal = &
+          nf_get_vars_double(ncid, varid, localStart, localCount, localStride, values)
+     else
+       nf90_get_var_6D_EightByteReal = &
+          nf_get_vara_double(ncid, varid, localStart, localCount, values)
+     end if
+   end function nf90_get_var_6D_EightByteReal
+
+
+   function nf90_get_var_7D_EightByteReal(ncid, varid, values, start, count, stride, map)
+     integer,                         intent( in) :: ncid, varid
+     real (kind = EightByteReal), dimension(:, :, :, :, :, :, :), &
+                                      intent(out) :: values
+     integer, dimension(:), optional, intent( in) :: start, count, stride, map
+     integer                                      :: nf90_get_var_7D_EightByteReal
+ 
+     integer, dimension(nf90_max_var_dims) :: localStart, localCount, localStride, localMap
+     integer                               :: numDims, counter
+ 
+     ! Set local arguments to default values
+     numDims                 = size(shape(values))
+     localStart (:         ) = 1
+     localCount (:numDims  ) = shape(values)
+     localCount (numDims+1:) = 1
+     localStride(:         ) = 1
+     localMap   (:numDims  ) = (/ 1, (product(localCount(:counter)), counter = 1, numDims - 1) /)
+ 
+     if(present(start))  localStart (:size(start) )  = start(:)
+     if(present(count))  localCount (:size(count) )  = count(:)
+     if(present(stride)) localStride(:size(stride)) = stride(:)
+     if(present(map))  then
+       localMap   (:size(map))    = map(:)
+       nf90_get_var_7D_EightByteReal = &
+          nf_get_varm_double(ncid, varid, localStart, localCount, localStride, localMap, values)
+     else if(present(stride)) then
+       nf90_get_var_7D_EightByteReal = &
+          nf_get_vars_double(ncid, varid, localStart, localCount, localStride, values)
+     else
+       nf90_get_var_7D_EightByteReal = &
+          nf_get_vara_double(ncid, varid, localStart, localCount, values)
+     end if
+   end function nf90_get_var_7D_EightByteReal
+
+
diff --git a/fortran/netcdf_externals.f90 b/fortran/netcdf_externals.f90
new file mode 100644
index 0000000..787f8f2
--- /dev/null
+++ b/fortran/netcdf_externals.f90
@@ -0,0 +1,50 @@
+  character (len = 80), external :: nf_inq_libvers, nf_strerror
+  ! Control routines 
+  integer,              external :: nf_open, nf__open, nf_create, nf__create,     &
+                                    nf_enddef, nf__enddef, nf_set_fill, nf_redef, &
+                                    nf_sync, nf_abort, nf_close,                  &
+                                    ! These are used only in undocumented functions
+                                    nf_set_base_pe, nf_inq_base_pe,               &
+                                    nf__create_mp, nf__open_mp, nf_delete,        &
+                                    nf_inq_format
+  ! File level inquiry 
+  integer,              external :: nf_inq
+ 
+  ! File path inquiry
+
+  integer,              external :: nf_inq_path
+  
+  ! Dimension routines   nf_inq_dim
+  integer,              external :: nf_def_dim, nf_inq_dimid, nf_rename_dim, nf_inq_dim
+
+  ! Attribute routines
+  integer,              external :: nf_copy_att, nf_rename_att, nf_del_att, & 
+                                    nf_inq_att, nf_inq_attid, nf_inq_attname
+  integer,              external :: nf_put_att_text, nf_get_att_text,                 &
+                                    nf_put_att_int1, nf_put_att_int2, nf_put_att_int, &
+                                    nf_get_att_int1, nf_get_att_int2, nf_get_att_int, &
+                                    nf_put_att_real,   nf_get_att_real,               &
+                                    nf_put_att_double, nf_get_att_double
+                                    
+  ! Variable routines
+  integer,              external :: nf_def_var, nf_inq_varid, nf_inq_var, nf_rename_var
+  integer,              external :: nf_put_var1_text, nf_get_var1_text,                   &
+                                    nf_put_var1_int1, nf_put_var1_int2, nf_put_var1_int, &
+                                    nf_get_var1_int1, nf_get_var1_int2, nf_get_var1_int, &
+                                    nf_put_var1_real,   nf_get_var1_real,                 &
+                                    nf_put_var1_double, nf_get_var1_double
+  integer,              external :: nf_put_vars_text, nf_get_vars_text,                   &
+                                    nf_put_vars_int1, nf_put_vars_int2, nf_put_vars_int, &
+                                    nf_get_vars_int1, nf_get_vars_int2, nf_get_vars_int, &
+                                    nf_put_vars_real,   nf_get_vars_real,                 &
+                                    nf_put_vars_double, nf_get_vars_double 
+  integer,              external :: nf_put_vara_text, nf_get_vara_text,                   &
+                                    nf_put_vara_int1, nf_put_vara_int2, nf_put_vara_int, &
+                                    nf_get_vara_int1, nf_get_vara_int2, nf_get_vara_int, &
+                                    nf_put_vara_real,   nf_get_vara_real,                 &
+                                    nf_put_vara_double, nf_get_vara_double 
+  integer,              external :: nf_put_varm_text, nf_get_varm_text,                   &
+                                    nf_put_varm_int1, nf_put_varm_int2, nf_put_varm_int, &
+                                    nf_get_varm_int1, nf_get_varm_int2, nf_get_varm_int, &
+                                    nf_put_varm_real,   nf_get_varm_real,                 &
+                                    nf_put_varm_double, nf_get_varm_double
diff --git a/fortran/netcdf_file.f90 b/fortran/netcdf_file.f90
new file mode 100644
index 0000000..1ca3d3b
--- /dev/null
+++ b/fortran/netcdf_file.f90
@@ -0,0 +1,155 @@
+! This is part of the netCDF F90 API, or. Copyright 2006 UCAR. See COPYRIGHT file
+! for details.
+
+! This file contains the netcdf file functions that are shared by
+! netcdf-3 and netcdf-4.
+
+! $Id: netcdf4_constants.f90,v 1.14 2010/05/25 13:53:00 ed Exp $
+! -------
+function nf90_inq_libvers()
+  character(len = 80) :: nf90_inq_libvers
+
+  nf90_inq_libvers = nf_inq_libvers()
+end function nf90_inq_libvers
+! -------
+function nf90_strerror(ncerr)
+  integer, intent( in) :: ncerr
+  character(len = 80)  :: nf90_strerror
+
+  nf90_strerror = nf_strerror(ncerr)
+end function nf90_strerror
+! -------
+!
+! File level control routines:
+!
+function nf90_inq_base_pe(ncid, pe)
+  integer, intent( in) :: ncid
+  integer, intent(out) :: pe
+  integer              :: nf90_inq_base_pe
+
+  nf90_inq_base_pe = nf_inq_base_pe(ncid, pe)
+end function nf90_inq_base_pe
+! -------
+function nf90_set_base_pe(ncid, pe)
+  integer, intent( in) :: ncid, pe
+  integer              :: nf90_set_base_pe
+
+  nf90_set_base_pe = nf_set_base_pe(ncid, pe)
+end function nf90_set_base_pe
+! -------
+function nf90_create_mp(path, cmode, initalsz, basepe, chunksizehint, ncid)
+  character (len = *), intent( in) :: path
+  integer,             intent( in) :: cmode, initalsz, basepe, chunksizehint
+  integer,             intent(out) :: ncid
+  integer                          :: nf90_create_mp
+
+  nf90_create_mp = nf__create_mp(path, cmode, initalsz, basepe, chunksizehint, ncid)
+end function nf90_create_mp
+! -------
+function nf90_open_mp(path, mode, basepe, chunksizeint, ncid)
+  character (len = *), intent( in) :: path
+  integer,             intent( in) :: mode, basepe, chunksizeint
+  integer,             intent(out) :: ncid
+  integer                          :: nf90_open_mp
+
+  nf90_open_mp = nf__open_mp(path, mode, basepe, chunksizeint, ncid)
+end function nf90_open_mp
+! -------
+function nf90_set_fill(ncid, fillmode, old_mode)
+  integer, intent( in) :: ncid, fillmode 
+  integer, intent(out) :: old_mode
+  integer              :: nf90_set_fill
+
+  nf90_set_fill = nf_set_fill(ncid, fillmode, old_mode)
+end function nf90_set_fill
+! -------
+function nf90_redef(ncid)
+  integer, intent( in) :: ncid
+  integer              :: nf90_redef
+
+  nf90_redef = nf_redef(ncid)
+end function nf90_redef
+! -------
+function nf90_enddef(ncid, h_minfree, v_align, v_minfree, r_align)
+  integer,           intent( in) :: ncid
+  integer, optional, intent( in) :: h_minfree, v_align, v_minfree, r_align
+  integer                        :: nf90_enddef
+
+  integer :: hMinFree, VAlign, VMinFree, RAlign
+
+  if(.not. any( (/ present(h_minfree), present(v_align), &
+       present(v_minfree), present(r_align) /) ) )then
+     nf90_enddef = nf_enddef(ncid)
+  else 
+     ! Default values per the man page
+     hMinFree = 0; VMinFree = 0
+     VAlign   = 4; RAlign   = 4
+     if(present(h_minfree)) HMinFree = h_minfree
+     if(present(v_align  )) VAlign   = v_align
+     if(present(v_minfree)) VMinFree = v_minfree
+     if(present(r_align  )) RAlign   = r_align
+     nf90_enddef = nf__enddef(ncid, hMinFree, VAlign, VMinFree, RAlign)
+  end if
+end function nf90_enddef
+! -------
+function nf90_sync(ncid)
+  integer, intent( in) :: ncid
+  integer              :: nf90_sync
+
+  nf90_sync = nf_sync(ncid)
+end function nf90_sync
+! -------
+function nf90_abort(ncid)
+  integer, intent( in) :: ncid
+  integer              :: nf90_abort
+
+  nf90_abort = nf_abort(ncid)
+end function nf90_abort
+! -------
+function nf90_close(ncid)
+  integer, intent( in) :: ncid
+  integer              :: nf90_close
+
+  nf90_close = nf_close(ncid)
+end function nf90_close
+! -------
+function nf90_delete(name)
+  character(len = *), intent( in) :: name
+  integer                         :: nf90_delete
+
+  nf90_delete = nf_delete(name)
+end function nf90_delete
+
+!
+! A single file level inquiry routine 
+! 
+function nf90_inquire(ncid, nDimensions, nVariables, nAttributes, unlimitedDimId, formatNum)
+  integer,           intent( in) :: ncid
+  integer, optional, intent(out) :: nDimensions, nVariables, nAttributes, unlimitedDimId, formatNum
+  integer                        :: nf90_inquire
+
+  integer :: nDims, nVars, nGAtts, unlimDimId, frmt
+
+  nf90_inquire = nf_inq(ncid, nDims, nVars, nGAtts, unlimDimId)
+  if(present(nDimensions))    nDimensions    = nDims 
+  if(present(nVariables))     nVariables     = nVars
+  if(present(nAttributes))    nAttributes    = nGAtts
+  if(present(unlimitedDimId)) unlimitedDimId = unlimDimId
+  if(present(formatNum)) then
+     nf90_inquire = nf_inq_format(ncid, frmt)
+     formatNum = frmt
+  endif
+end function nf90_inquire
+
+function nf90_inq_path(ncid, pathlen, path)
+
+  integer,            intent(in)    :: ncid
+  integer,            intent(inout) :: pathlen
+  character(len = *), intent(inout) :: path
+
+  integer                           :: nf90_inq_path
+
+  nf90_inq_path = nf_inq_path(ncid, pathlen, path)
+
+end function nf90_inq_path
+
diff --git a/fortran/netcdf_overloads.f90 b/fortran/netcdf_overloads.f90
new file mode 100644
index 0000000..b4c8525
--- /dev/null
+++ b/fortran/netcdf_overloads.f90
@@ -0,0 +1,95 @@
+  ! Overloaded variable functions
+  interface nf90_def_var
+    module procedure nf90_def_var_Scalar, nf90_def_var_oneDim, nf90_def_var_ManyDims
+  end interface ! nf90_def_var
+
+  ! Overloaded attribute functions
+  interface nf90_put_att
+    module procedure nf90_put_att_text,                                      &
+                     nf90_put_att_OneByteInt,     nf90_put_att_TwoByteInt,   &
+                     nf90_put_att_FourByteInt,    nf90_put_att_EightByteInt, &
+                     nf90_put_att_FourByteReal,   nf90_put_att_EightByteReal
+    module procedure nf90_put_att_one_OneByteInt,   nf90_put_att_one_TwoByteInt,   &
+                     nf90_put_att_one_FourByteInt,  nf90_put_att_one_EightByteInt, &
+                     nf90_put_att_one_FourByteReal, nf90_put_att_one_EightByteReal
+  end interface !nf90_put_att
+  interface nf90_get_att
+    module procedure nf90_get_att_text,                                      &
+                     nf90_get_att_OneByteInt,     nf90_get_att_TwoByteInt,   &
+                     nf90_get_att_FourByteInt,    nf90_get_att_EightByteInt, &
+                     nf90_get_att_FourByteReal,   nf90_get_att_EightByteReal
+    module procedure nf90_get_att_one_OneByteInt,   nf90_get_att_one_TwoByteInt,   &
+                     nf90_get_att_one_FourByteInt,  nf90_get_att_one_EightByteInt, &
+                     nf90_get_att_one_FourByteReal, nf90_get_att_one_EightByteReal
+  end interface ! nf90_get_att
+
+  ! Overloaded variable functions
+  interface nf90_put_var
+    module procedure nf90_put_var_text,                                   &
+                     nf90_put_var_OneByteInt, nf90_put_var_TwoByteInt,    &
+                     nf90_put_var_FourByteInt, nf90_put_var_EightByteInt, &
+                     nf90_put_var_FourByteReal, nf90_put_var_EightByteReal
+    module procedure nf90_put_var_1D_text,                                      &
+                     nf90_put_var_1D_OneByteInt, nf90_put_var_1D_TwoByteInt,    &
+                     nf90_put_var_1D_FourByteInt, nf90_put_var_1D_EightByteInt, &
+                     nf90_put_var_1D_FourByteReal, nf90_put_var_1D_EightByteReal
+    module procedure nf90_put_var_2D_text,                                       &
+                     nf90_put_var_2D_OneByteInt, nf90_put_var_2D_TwoByteInt,     &
+                     nf90_put_var_2D_FourByteInt, nf90_put_var_2D_EightByteInt,  &
+                     nf90_put_var_2D_FourByteReal, nf90_put_var_2D_EightByteReal
+    module procedure nf90_put_var_3D_text,                                       &
+                     nf90_put_var_3D_OneByteInt, nf90_put_var_3D_TwoByteInt,     &
+                     nf90_put_var_3D_FourByteInt, nf90_put_var_3D_EightByteInt,  &
+                     nf90_put_var_3D_FourByteReal, nf90_put_var_3D_EightByteReal
+    module procedure nf90_put_var_4D_text,                                       &
+                     nf90_put_var_4D_OneByteInt, nf90_put_var_4D_TwoByteInt,     &
+                     nf90_put_var_4D_FourByteInt, nf90_put_var_4D_EightByteInt,  &
+                     nf90_put_var_4D_FourByteReal, nf90_put_var_4D_EightByteReal
+    module procedure nf90_put_var_5D_text,                                       &
+                     nf90_put_var_5D_OneByteInt, nf90_put_var_5D_TwoByteInt,     &
+                     nf90_put_var_5D_FourByteInt, nf90_put_var_5D_EightByteInt,  &
+                     nf90_put_var_5D_FourByteReal, nf90_put_var_5D_EightByteReal
+    module procedure nf90_put_var_6D_text,                                       &
+                     nf90_put_var_6D_OneByteInt, nf90_put_var_6D_TwoByteInt,     &
+                     nf90_put_var_6D_FourByteInt, nf90_put_var_6D_EightByteInt,  &
+                     nf90_put_var_6D_FourByteReal, nf90_put_var_6D_EightByteReal
+    module procedure nf90_put_var_7D_text,                                       &
+                     nf90_put_var_7D_OneByteInt, nf90_put_var_7D_TwoByteInt,     &
+                     nf90_put_var_7D_FourByteInt, nf90_put_var_7D_EightByteInt,  &
+                     nf90_put_var_7D_FourByteReal, nf90_put_var_7D_EightByteReal
+  end interface ! nf90_put_var
+
+  interface nf90_get_var
+    module procedure nf90_get_var_text,                                   &
+                     nf90_get_var_OneByteInt, nf90_get_var_TwoByteInt,    &
+                     nf90_get_var_FourByteInt, nf90_get_var_EightByteInt, &
+                     nf90_get_var_FourByteReal, nf90_get_var_EightByteReal
+    module procedure nf90_get_var_1D_text,                                      &
+                     nf90_get_var_1D_OneByteInt, nf90_get_var_1D_TwoByteInt,    &
+                     nf90_get_var_1D_FourByteInt, nf90_get_var_1D_EightByteInt, &
+                     nf90_get_var_1D_FourByteReal, nf90_get_var_1D_EightByteReal
+    module procedure nf90_get_var_2D_text,                                      &
+                     nf90_get_var_2D_OneByteInt, nf90_get_var_2D_TwoByteInt,    &
+                     nf90_get_var_2D_FourByteInt, nf90_get_var_2D_EightByteInt, &
+                     nf90_get_var_2D_FourByteReal, nf90_get_var_2D_EightByteReal
+    module procedure nf90_get_var_3D_text,                                      &
+                     nf90_get_var_3D_OneByteInt, nf90_get_var_3D_TwoByteInt,    &
+                     nf90_get_var_3D_FourByteInt, nf90_get_var_3D_EightByteInt, &
+                     nf90_get_var_3D_FourByteReal, nf90_get_var_3D_EightByteReal
+    module procedure nf90_get_var_4D_text,                                      &
+                     nf90_get_var_4D_OneByteInt, nf90_get_var_4D_TwoByteInt,    &
+                     nf90_get_var_4D_FourByteInt, nf90_get_var_4D_EightByteInt, &
+                     nf90_get_var_4D_FourByteReal, nf90_get_var_4D_EightByteReal
+    module procedure nf90_get_var_5D_text,                                      &
+                     nf90_get_var_5D_OneByteInt, nf90_get_var_5D_TwoByteInt,    &
+                     nf90_get_var_5D_FourByteInt, nf90_get_var_5D_EightByteInt, &
+                     nf90_get_var_5D_FourByteReal, nf90_get_var_5D_EightByteReal
+    module procedure nf90_get_var_6D_text,                                      &
+                     nf90_get_var_6D_OneByteInt, nf90_get_var_6D_TwoByteInt,    &
+                     nf90_get_var_6D_FourByteInt, nf90_get_var_6D_EightByteInt, &
+                     nf90_get_var_6D_FourByteReal, nf90_get_var_6D_EightByteReal
+    module procedure nf90_get_var_7D_text,                                      &
+                     nf90_get_var_7D_OneByteInt, nf90_get_var_7D_TwoByteInt,    &
+                     nf90_get_var_7D_FourByteInt, nf90_get_var_7D_EightByteInt, &
+                     nf90_get_var_7D_FourByteReal, nf90_get_var_7D_EightByteReal
+  end interface ! nf90_get_var
diff --git a/fortran/netcdf_text_variables.f90 b/fortran/netcdf_text_variables.f90
new file mode 100644
index 0000000..474c095
--- /dev/null
+++ b/fortran/netcdf_text_variables.f90
@@ -0,0 +1,489 @@
+   function nf90_put_var_text(ncid, varid, values, start, count, stride, map)
+     integer,                         intent( in) :: ncid, varid
+     character (len = *),             intent( in) :: values
+     integer, dimension(:), optional, intent( in) :: start, count, stride, map
+     integer                                      :: nf90_put_var_text
+
+     integer, dimension(nf90_max_var_dims) :: localStart, localCount, localStride
+ 
+     ! Set local arguments to default values
+     localStart (:)  = 1
+     localCount (1)  = len(values); localCount (2:) = 1
+     localStride(:)  = 1
+          
+     if(present(start))  localStart (:size(start) ) = start(:)
+     if(present(count))  localCount (:size(count) ) = count(:)
+     if(present(stride)) localStride(:size(stride)) = stride(:)
+
+     nf90_put_var_text = nf_put_vars_text(ncid, varid, localStart, localCount, localStride, values)
+   end function nf90_put_var_text
+
+   function nf90_get_var_text(ncid, varid, values, start, count, stride, map)
+     integer,                         intent( in) :: ncid, varid
+     character (len = *),             intent(out) :: values
+     integer, dimension(:), optional, intent( in) :: start, count, stride, map
+     integer                                      :: nf90_get_var_text
+ 
+     integer, dimension(nf90_max_var_dims) :: localIndex, textDimIDs
+     integer, dimension(nf90_max_var_dims) :: localStart, localCount, localStride 
+     integer                               :: counter, stringLength
+ 
+     ! Set local arguments to default values
+     localStart (:)  = 1
+     localCount (1)  = len(values); localCount (2:) = 1
+     localStride(:)  = 1
+     
+     if(present(start))  localStart (:size(start) ) = start(:)
+     if(present(count))  localCount (:size(count) ) = count(:)
+     if(present(stride)) localStride(:size(stride)) = stride(:)
+
+     nf90_get_var_text = nf_get_vars_text(ncid, varid, localStart, localCount, localStride, values)
+   end function nf90_get_var_text
+
+
+   function nf90_put_var_1D_text(ncid, varid, values, start, count, stride, map)
+     integer,                         intent( in) :: ncid, varid
+     character (len = *), dimension(:), &
+                                      intent( in) :: values
+     integer, dimension(:), optional, intent( in) :: start, count, stride, map
+     integer                                      :: nf90_put_var_1D_text
+ 
+     integer, parameter                    :: numDims = 1
+     integer, dimension(nf90_max_var_dims) :: localStart, localCount, localStride, localMap
+     integer                               :: counter
+ 
+     ! Set local arguments to default values
+     localStart (:         ) = 1
+     localCount ( :numDims+1) = (/ len(values(1)), shape(values) /)
+     localCount (numDims+2:) = 0
+     localStride(:         ) = 1
+     localMap   (:numDims  ) = (/ 1, (product(localCount(:counter)), counter = 1, numDims - 1) /)
+ 
+     if(present(start))  localStart (:size(start))  = start(:)
+     if(present(count))  localCount (:size(count))  = count(:)
+     if(present(stride)) localStride(:size(stride)) = stride(:)
+     if(present(map))  then
+       localMap   (:size(map))    = map(:)
+       nf90_put_var_1D_text = &
+          nf_put_varm_text(ncid, varid, localStart, localCount, localStride, localMap, values(1))
+     else
+       nf90_put_var_1D_text = &
+          nf_put_vars_text(ncid, varid, localStart, localCount, localStride, values(1))
+     end if
+   end function nf90_put_var_1D_text
+
+
+   function nf90_put_var_2D_text(ncid, varid, values, start, count, stride, map)
+     integer,                         intent( in) :: ncid, varid
+     character (len = *), dimension(:, :), &
+                                      intent( in) :: values
+     integer, dimension(:), optional, intent( in) :: start, count, stride, map
+     integer                                      :: nf90_put_var_2D_text
+ 
+     integer, parameter                    :: numDims = 2
+     integer, dimension(nf90_max_var_dims) :: localStart, localCount, localStride, localMap
+     integer                               :: counter
+ 
+     ! Set local arguments to default values
+     localStart (:         ) = 1
+     localCount ( :numDims+1) = (/ len(values(1, 1)), shape(values) /)
+     localCount (numDims+2:) = 0
+     localStride(:         ) = 1
+     localMap   (:numDims  ) = (/ 1, (product(localCount(:counter)), counter = 1, numDims - 1) /)
+ 
+     if(present(start))  localStart (:size(start))  = start(:)
+     if(present(count))  localCount (:size(count))  = count(:)
+     if(present(stride)) localStride(:size(stride)) = stride(:)
+     if(present(map))  then
+       localMap   (:size(map))    = map(:)
+       nf90_put_var_2D_text = &
+          nf_put_varm_text(ncid, varid, localStart, localCount, localStride, localMap, values(1,1))
+     else
+       nf90_put_var_2D_text = &
+          nf_put_vars_text(ncid, varid, localStart, localCount, localStride, values(1,1))
+     end if
+   end function nf90_put_var_2D_text
+
+
+   function nf90_put_var_3D_text(ncid, varid, values, start, count, stride, map)
+     integer,                         intent( in) :: ncid, varid
+     character (len = *), dimension(:, :, :), &
+                                      intent( in) :: values
+     integer, dimension(:), optional, intent( in) :: start, count, stride, map
+     integer                                      :: nf90_put_var_3D_text
+ 
+     integer, parameter                    :: numDims = 3
+     integer, dimension(nf90_max_var_dims) :: localStart, localCount, localStride, localMap
+     integer                               :: counter
+ 
+     ! Set local arguments to default values
+     localStart (:         ) = 1
+     localCount ( :numDims+1) = (/ len(values(1, 1, 1)), shape(values) /)
+     localCount (numDims+2:) = 0
+     localStride(:         ) = 1
+     localMap   (:numDims  ) = (/ 1, (product(localCount(:counter)), counter = 1, numDims - 1) /)
+ 
+     if(present(start))  localStart (:size(start))  = start(:)
+     if(present(count))  localCount (:size(count))  = count(:)
+     if(present(stride)) localStride(:size(stride)) = stride(:)
+     if(present(map))  then
+       localMap   (:size(map))    = map(:)
+       nf90_put_var_3D_text = &
+          nf_put_varm_text(ncid, varid, localStart, localCount, localStride, localMap, values(1,1,1))
+     else
+       nf90_put_var_3D_text = &
+          nf_put_vars_text(ncid, varid, localStart, localCount, localStride, values(1,1,1))
+     end if
+   end function nf90_put_var_3D_text
+
+
+   function nf90_put_var_4D_text(ncid, varid, values, start, count, stride, map)
+     integer,                         intent( in) :: ncid, varid
+     character (len = *), dimension(:, :, :, :), &
+                                      intent( in) :: values
+     integer, dimension(:), optional, intent( in) :: start, count, stride, map
+     integer                                      :: nf90_put_var_4D_text
+ 
+     integer, parameter                    :: numDims = 4
+     integer, dimension(nf90_max_var_dims) :: localStart, localCount, localStride, localMap
+     integer                               :: counter
+ 
+     ! Set local arguments to default values
+     localStart (:         ) = 1
+     localCount ( :numDims+1) = (/ len(values(1, 1, 1, 1)), shape(values) /)
+     localCount (numDims+2:) = 0
+     localStride(:         ) = 1
+     localMap   (:numDims  ) = (/ 1, (product(localCount(:counter)), counter = 1, numDims - 1) /)
+ 
+     if(present(start))  localStart (:size(start))  = start(:)
+     if(present(count))  localCount (:size(count))  = count(:)
+     if(present(stride)) localStride(:size(stride)) = stride(:)
+     if(present(map))  then
+       localMap   (:size(map))    = map(:)
+       nf90_put_var_4D_text = &
+          nf_put_varm_text(ncid, varid, localStart, localCount, localStride, localMap, values(1,1,1,1))
+     else
+       nf90_put_var_4D_text = &
+          nf_put_vars_text(ncid, varid, localStart, localCount, localStride, values(1,1,1,1))
+     end if
+   end function nf90_put_var_4D_text
+
+
+   function nf90_put_var_5D_text(ncid, varid, values, start, count, stride, map)
+     integer,                         intent( in) :: ncid, varid
+     character (len = *), dimension(:, :, :, :, :), &
+                                      intent( in) :: values
+     integer, dimension(:), optional, intent( in) :: start, count, stride, map
+     integer                                      :: nf90_put_var_5D_text
+ 
+     integer, parameter                    :: numDims = 5
+     integer, dimension(nf90_max_var_dims) :: localStart, localCount, localStride, localMap
+     integer                               :: counter
+ 
+     ! Set local arguments to default values
+     localStart (:         ) = 1
+     localCount ( :numDims+1) = (/ len(values(1, 1, 1, 1, 1)), shape(values) /)
+     localCount (numDims+2:) = 0
+     localStride(:         ) = 1
+     localMap   (:numDims  ) = (/ 1, (product(localCount(:counter)), counter = 1, numDims - 1) /)
+ 
+     if(present(start))  localStart (:size(start))  = start(:)
+     if(present(count))  localCount (:size(count))  = count(:)
+     if(present(stride)) localStride(:size(stride)) = stride(:)
+     if(present(map))  then
+       localMap   (:size(map))    = map(:)
+       nf90_put_var_5D_text = &
+          nf_put_varm_text(ncid, varid, localStart, localCount, localStride, localMap, values(1,1,1,1,1))
+     else
+       nf90_put_var_5D_text = &
+          nf_put_vars_text(ncid, varid, localStart, localCount, localStride, values(1,1,1,1,1))
+     end if
+   end function nf90_put_var_5D_text
+
+
+   function nf90_put_var_6D_text(ncid, varid, values, start, count, stride, map)
+     integer,                         intent( in) :: ncid, varid
+     character (len = *), dimension(:, :, :, :, :, :), &
+                                      intent( in) :: values
+     integer, dimension(:), optional, intent( in) :: start, count, stride, map
+     integer                                      :: nf90_put_var_6D_text
+ 
+     integer, parameter                    :: numDims = 6
+     integer, dimension(nf90_max_var_dims) :: localStart, localCount, localStride, localMap
+     integer                               :: counter
+
+     ! Set local arguments to default values
+     localStart (:         ) = 1
+     localCount ( :numDims+1) = (/ len(values(1, 1, 1, 1, 1, 1)), shape(values) /)
+     localCount (numDims+2:) = 0
+     localStride(:         ) = 1
+     localMap   (:numDims  ) = (/ 1, (product(localCount(:counter)), counter = 1, numDims - 1) /)
+ 
+     if(present(start))  localStart (:size(start))  = start(:)
+     if(present(count))  localCount (:size(count))  = count(:)
+     if(present(stride)) localStride(:size(stride)) = stride(:)
+     if(present(map))  then
+       localMap   (:size(map))    = map(:)
+       nf90_put_var_6D_text = &
+          nf_put_varm_text(ncid, varid, localStart, localCount, localStride, localMap, values(1,1,1,1,1,1))
+     else
+       nf90_put_var_6D_text = &
+          nf_put_vars_text(ncid, varid, localStart, localCount, localStride, values(1,1,1,1,1,1))
+     end if
+   end function nf90_put_var_6D_text
+
+
+   function nf90_put_var_7D_text(ncid, varid, values, start, count, stride, map)
+     integer,                         intent( in) :: ncid, varid
+     character (len = *), dimension(:, :, :, :, :, :, :), &
+                                      intent( in) :: values
+     integer, dimension(:), optional, intent( in) :: start, count, stride, map
+     integer                                      :: nf90_put_var_7D_text
+ 
+     integer, parameter                  :: numDims = 7
+     integer, dimension(nf90_max_var_dims) :: localStart, localCount, localStride, localMap
+     integer                             :: counter
+ 
+     ! Set local arguments to default values
+     localStart (:         ) = 1
+     localCount ( :numDims+1) = (/ len(values(1, 1, 1, 1, 1, 1, 1)), shape(values) /)
+     localCount (numDims+2:) = 0
+     localStride(:         ) = 1
+     localMap   (:numDims  ) = (/ 1, (product(localCount(:counter)), counter = 1, numDims - 1) /)
+ 
+     if(present(start))  localStart (:size(start))  = start(:)
+     if(present(count))  localCount (:size(count))  = count(:)
+     if(present(stride)) localStride(:size(stride)) = stride(:)
+     if(present(map))  then
+       localMap   (:size(map))    = map(:)
+       nf90_put_var_7D_text = &
+          nf_put_varm_text(ncid, varid, localStart, localCount, localStride, localMap, values(1,1,1,1,1,1,1))
+     else
+       nf90_put_var_7D_text = &
+          nf_put_vars_text(ncid, varid, localStart, localCount, localStride, values(1,1,1,1,1,1,1))
+     end if
+   end function nf90_put_var_7D_text
+
+
+   function nf90_get_var_1D_text(ncid, varid, values, start, count, stride, map)
+     integer,                         intent( in) :: ncid, varid
+     character (len = *), dimension(:), &
+                                      intent(out) :: values
+     integer, dimension(:), optional, intent( in) :: start, count, stride, map
+     integer                                      :: nf90_get_var_1D_text
+ 
+     integer, parameter                  :: numDims = 1
+     integer, dimension(nf90_max_var_dims) :: localStart, localCount, localStride, localMap
+     integer                             :: counter
+ 
+     ! Set local arguments to default values
+     localStart (:         ) = 1
+     localCount (:numDims+1) = (/ len(values(1)), shape(values) /)
+     localCount (numDims+2:) = 0
+     localStride(:         ) = 1
+     localMap   (:numDims  ) = (/ 1/)
+ 
+     if(present(start))  localStart (:size(start))  = start(:)
+     if(present(count))  localCount (:size(count))  = count(:)
+     if(present(stride)) localStride(:size(stride)) = stride(:)
+     if(present(map))  then
+       localMap   (:size(map))    = map(:)
+       nf90_get_var_1D_text = &
+          nf_get_varm_text(ncid, varid, localStart, localCount, localStride, localMap, values(1))
+     else
+       nf90_get_var_1D_text = &
+          nf_get_vars_text(ncid, varid, localStart, localCount, localStride, values(1))
+     end if
+   end function nf90_get_var_1D_text
+
+
+   function nf90_get_var_2D_text(ncid, varid, values, start, count, stride, map)
+     integer,                         intent( in) :: ncid, varid
+     character (len = *), dimension(:, :), &
+                                      intent(out) :: values
+     integer, dimension(:), optional, intent( in) :: start, count, stride, map
+     integer                                      :: nf90_get_var_2D_text
+ 
+     integer, parameter                  :: numDims = 2
+     integer, dimension(nf90_max_var_dims) :: localStart, localCount, localStride, localMap
+     integer                             :: counter
+ 
+     ! Set local arguments to default values
+     localStart (:         ) = 1
+     localCount (:numDims+1) = (/ len(values(1, 1)), shape(values) /)
+     localCount (numDims+2:) = 0
+     localStride(:         ) = 1
+     localMap   (:numDims  ) = (/ 1, (product(localCount(:counter)), counter = 1, numDims - 1) /)
+ 
+     if(present(start))  localStart (:size(start))  = start(:)
+     if(present(count))  localCount (:size(count))  = count(:)
+     if(present(stride)) localStride(:size(stride)) = stride(:)
+     if(present(map))  then
+       localMap   (:size(map))    = map(:)
+       nf90_get_var_2D_text = &
+          nf_get_varm_text(ncid, varid, localStart, localCount, localStride, localMap, values(1,1))
+     else
+       nf90_get_var_2D_text = &
+          nf_get_vars_text(ncid, varid, localStart, localCount, localStride, values(1,1))
+     end if
+   end function nf90_get_var_2D_text
+
+
+   function nf90_get_var_3D_text(ncid, varid, values, start, count, stride, map)
+     integer,                         intent( in) :: ncid, varid
+     character (len = *), dimension(:, :, :), &
+                                      intent(out) :: values
+     integer, dimension(:), optional, intent( in) :: start, count, stride, map
+     integer                                      :: nf90_get_var_3D_text
+ 
+     integer, parameter                  :: numDims = 3
+     integer, dimension(nf90_max_var_dims) :: localStart, localCount, localStride, localMap
+     integer                             :: counter
+ 
+     ! Set local arguments to default values
+     localStart (:         ) = 1
+     localCount (:numDims+1) = (/ len(values(1, 1, 1)), shape(values) /)
+     localCount (numDims+2:) = 0
+     localStride(:         ) = 1
+     localMap   (:numDims  ) = (/ 1, (product(localCount(:counter)), counter = 1, numDims - 1) /)
+ 
+     if(present(start))  localStart (:size(start))  = start(:)
+     if(present(count))  localCount (:size(count))  = count(:)
+     if(present(stride)) localStride(:size(stride)) = stride(:)
+     if(present(map))  then
+       localMap   (:size(map))    = map(:)
+       nf90_get_var_3D_text = &
+          nf_get_varm_text(ncid, varid, localStart, localCount, localStride, localMap, values(1,1,1))
+     else
+       nf90_get_var_3D_text = &
+          nf_get_vars_text(ncid, varid, localStart, localCount, localStride, values(1,1,1))
+     end if
+   end function nf90_get_var_3D_text
+
+
+   function nf90_get_var_4D_text(ncid, varid, values, start, count, stride, map)
+     integer,                         intent( in) :: ncid, varid
+     character (len = *), dimension(:, :, :, :), &
+                                      intent(out) :: values
+     integer, dimension(:), optional, intent( in) :: start, count, stride, map
+     integer                                      :: nf90_get_var_4D_text
+ 
+     integer, parameter                  :: numDims = 4
+     integer, dimension(nf90_max_var_dims) :: localStart, localCount, localStride, localMap
+     integer                             :: counter
+ 
+     ! Set local arguments to default values
+     localStart (:         ) = 1
+     localCount (:numDims+1) = (/ len(values(1, 1, 1, 1)), shape(values) /)
+     localCount (numDims+2:) = 0
+     localStride(:         ) = 1
+     localMap   (:numDims  ) = (/ 1, (product(localCount(:counter)), counter = 1, numDims - 1) /)
+ 
+     if(present(start))  localStart (:size(start))  = start(:)
+     if(present(count))  localCount (:size(count))  = count(:)
+     if(present(stride)) localStride(:size(stride)) = stride(:)
+     if(present(map))  then
+       localMap   (:size(map))    = map(:)
+       nf90_get_var_4D_text = &
+          nf_get_varm_text(ncid, varid, localStart, localCount, localStride, localMap, values(1,1,1,1))
+     else
+       nf90_get_var_4D_text = &
+          nf_get_vars_text(ncid, varid, localStart, localCount, localStride, values(1,1,1,1))
+     end if
+   end function nf90_get_var_4D_text
+
+
+   function nf90_get_var_5D_text(ncid, varid, values, start, count, stride, map)
+     integer,                         intent( in) :: ncid, varid
+     character (len = *), dimension(:, :, :, :, :), &
+                                      intent(out) :: values
+     integer, dimension(:), optional, intent( in) :: start, count, stride, map
+     integer                                      :: nf90_get_var_5D_text
+ 
+     integer, parameter                  :: numDims = 5
+     integer, dimension(nf90_max_var_dims) :: localStart, localCount, localStride, localMap
+     integer                             :: counter
+ 
+     ! Set local arguments to default values
+     localStart (:         ) = 1
+     localCount (:numDims+1) = (/ len(values(1, 1, 1, 1, 1)), shape(values) /)
+     localCount (numDims+2:) = 0
+     localStride(:         ) = 1
+     localMap   (:numDims  ) = (/ 1, (product(localCount(:counter)), counter = 1, numDims - 1) /)
+ 
+     if(present(start))  localStart (:size(start))  = start(:)
+     if(present(count))  localCount (:size(count))  = count(:)
+     if(present(stride)) localStride(:size(stride)) = stride(:)
+     if(present(map))  then
+       localMap   (:size(map))    = map(:)
+       nf90_get_var_5D_text = &
+          nf_get_varm_text(ncid, varid, localStart, localCount, localStride, localMap, values(1,1,1,1,1))
+     else
+       nf90_get_var_5D_text = &
+          nf_get_vars_text(ncid, varid, localStart, localCount, localStride, values(1,1,1,1,1))
+     end if
+   end function nf90_get_var_5D_text
+
+
+   function nf90_get_var_6D_text(ncid, varid, values, start, count, stride, map)
+     integer,                         intent( in) :: ncid, varid
+     character (len = *), dimension(:, :, :, :, :, :), &
+                                      intent(out) :: values
+     integer, dimension(:), optional, intent( in) :: start, count, stride, map
+     integer                                      :: nf90_get_var_6D_text
+ 
+     integer, parameter                  :: numDims = 6
+     integer, dimension(nf90_max_var_dims) :: localStart, localCount, localStride, localMap
+     integer                             :: counter
+ 
+     ! Set local arguments to default values
+     localStart (:         ) = 1
+     localCount (:numDims+1) = (/ len(values(1, 1, 1, 1, 1, 1)), shape(values) /)
+     localCount (numDims+2:) = 0
+     localStride(:         ) = 1
+     localMap   (:numDims  ) = (/ 1, (product(localCount(:counter)), counter = 1, numDims - 1) /)
+ 
+     if(present(start))  localStart (:size(start))  = start(:)
+     if(present(count))  localCount (:size(count))  = count(:)
+     if(present(stride)) localStride(:size(stride)) = stride(:)
+     if(present(map))  then
+       localMap   (:size(map))    = map(:)
+       nf90_get_var_6D_text = &
+          nf_get_varm_text(ncid, varid, localStart, localCount, localStride, localMap, values(1,1,1,1,1,1))
+     else
+       nf90_get_var_6D_text = &
+          nf_get_vars_text(ncid, varid, localStart, localCount, localStride, values(1,1,1,1,1,1))
+     end if
+   end function nf90_get_var_6D_text
+
+
+   function nf90_get_var_7D_text(ncid, varid, values, start, count, stride, map)
+     integer,                         intent( in) :: ncid, varid
+     character (len = *), dimension(:, :, :, :, :, :, :), &
+                                      intent(out) :: values
+     integer, dimension(:), optional, intent( in) :: start, count, stride, map
+     integer                                      :: nf90_get_var_7D_text
+ 
+     integer, parameter                  :: numDims = 7
+     integer, dimension(nf90_max_var_dims) :: localStart, localCount, localStride, localMap
+     integer                             :: counter
+ 
+     ! Set local arguments to default values
+     localStart (:         ) = 1
+     localCount (:numDims+1) = (/ len(values(1, 1, 1, 1, 1, 1, 1)), shape(values) /)
+     localCount (numDims+2:) = 0
+     localStride(:         ) = 1
+     localMap   (:numDims  ) = (/ 1, (product(localCount(:counter)), counter = 1, numDims - 1) /)
+ 
+     if(present(start))  localStart (:size(start))  = start(:)
+     if(present(count))  localCount (:size(count))  = count(:)
+     if(present(stride)) localStride(:size(stride)) = stride(:)
+     if(present(map))  then
+       localMap   (:size(map))    = map(:)
+       nf90_get_var_7D_text = &
+          nf_get_varm_text(ncid, varid, localStart, localCount, localStride, localMap, values(1,1,1,1,1,1,1))
+     else
+       nf90_get_var_7D_text = &
+          nf_get_vars_text(ncid, varid, localStart, localCount, localStride, values(1,1,1,1,1,1,1))
+     end if
+   end function nf90_get_var_7D_text
diff --git a/fortran/netcdf_variables.f90 b/fortran/netcdf_variables.f90
new file mode 100644
index 0000000..0011992
--- /dev/null
+++ b/fortran/netcdf_variables.f90
@@ -0,0 +1,88 @@
+  ! ----- 
+  ! Variable definitions and inquiry
+  ! ----- 
+  function nf90_def_var_Scalar(ncid, name, xtype, varid)
+    integer,               intent( in) :: ncid
+    character (len = *),   intent( in) :: name
+    integer,               intent( in) :: xtype
+    integer,               intent(out) :: varid
+    integer                            :: nf90_def_var_Scalar
+    
+    ! Dummy - shouldn't get used
+    integer, dimension(1) :: dimids
+    
+    nf90_def_var_Scalar = nf_def_var(ncid, name, xtype, 0, dimids, varid)
+  end function nf90_def_var_Scalar
+  ! ----- 
+  function nf90_def_var_oneDim(ncid, name, xtype, dimids, varid)
+    integer,               intent( in) :: ncid
+    character (len = *),   intent( in) :: name
+    integer,               intent( in) :: xtype
+    integer,               intent( in) :: dimids
+    integer,               intent(out) :: varid
+    integer                            :: nf90_def_var_oneDim
+    
+    integer, dimension(1) :: dimidsA
+    dimidsA(1) = dimids
+    nf90_def_var_oneDim = nf_def_var(ncid, name, xtype, 1, dimidsA, varid)
+  end function nf90_def_var_oneDim
+  ! ----- 
+  function nf90_def_var_ManyDims(ncid, name, xtype, dimids, varid)
+    integer,               intent( in) :: ncid
+    character (len = *),   intent( in) :: name
+    integer,               intent( in) :: xtype
+    integer, dimension(:), intent( in) :: dimids
+    integer,               intent(out) :: varid
+    integer                            :: nf90_def_var_ManyDims
+    
+    nf90_def_var_ManyDims = nf_def_var(ncid, name, xtype, size(dimids), dimids, varid)
+  end function nf90_def_var_ManyDims
+  ! ----- 
+  function nf90_inq_varid(ncid, name, varid)
+    integer,             intent( in) :: ncid
+    character (len = *), intent( in) :: name
+    integer,             intent(out) :: varid
+    integer                          :: nf90_inq_varid
+    
+    nf90_inq_varid = nf_inq_varid(ncid, name, varid)
+  end function nf90_inq_varid
+  ! ----- 
+  function nf90_inquire_variable(ncid, varid, name, xtype, ndims, dimids, nAtts)
+    integer,                         intent( in) :: ncid, varid
+    character (len = *),   optional, intent(out) :: name
+    integer,               optional, intent(out) :: xtype, ndims 
+    integer, dimension(:), optional, intent(out) :: dimids
+    integer,               optional, intent(out) :: nAtts
+    integer                                      :: nf90_inquire_variable
+    
+    ! Local variables
+    character (len = nf90_max_name)       :: varName
+    integer                               :: externalType, numDimensions
+    integer, dimension(nf90_max_var_dims) :: dimensionIDs
+    integer                               :: numAttributes
+    
+    nf90_inquire_variable = nf_inq_var(ncid, varid, varName, externalType, &
+                                       numDimensions, dimensionIDs, numAttributes)
+    if (nf90_inquire_variable == nf90_noerr) then
+        if(present(name))   name                   = trim(varName)
+        if(present(xtype))  xtype                  = externalType
+        if(present(ndims))  ndims                  = numDimensions
+        if(present(dimids)) then
+            if (size(dimids) .ge. numDimensions) then
+                dimids(:numDimensions) = dimensionIDs(:numDimensions)
+            else
+                nf90_inquire_variable = nf90_einval
+            endif
+        endif
+        if(present(nAtts))  nAtts                  = numAttributes
+    endif
+  end function nf90_inquire_variable
+  ! ----- 
+  function nf90_rename_var(ncid, varid, newname)
+    integer,             intent( in) :: ncid, varid
+    character (len = *), intent( in) :: newname
+    integer                          :: nf90_rename_var
+    
+    nf90_rename_var = nf_rename_var(ncid, varid, newname)
+  end function nf90_rename_var
+  ! ----- 
diff --git a/fortran/netcdf_visibility.f90 b/fortran/netcdf_visibility.f90
new file mode 100644
index 0000000..4f2947d
--- /dev/null
+++ b/fortran/netcdf_visibility.f90
@@ -0,0 +1,25 @@
+  ! Library version, error string
+  public :: nf90_inq_libvers, nf90_strerror
+  
+  ! Control routines 
+  public :: nf90_create, nf90_open, nf90_set_base_pe, nf90_inq_base_pe, &
+            nf90_set_fill, nf90_redef, nf90_enddef,                     &
+            nf90_create_mp, nf90_open_mp,                               &
+            nf90_sync, nf90_abort, nf90_close, nf90_delete
+            
+  ! File level inquiry
+  public :: nf90_inquire, nf90_inq_path
+  
+  ! Dimension routines
+  public :: nf90_def_dim, nf90_inq_dimid, nf90_rename_dim, nf90_inquire_dimension
+  
+  ! attribute routines
+  public :: nf90_copy_att, nf90_rename_att, nf90_del_att, nf90_inq_attname, &
+            nf90_inquire_attribute
+  ! overloaded functions
+  public :: nf90_put_att, nf90_get_att
+  
+  ! Variable routines
+  public :: nf90_def_var, nf90_inq_varid, nf90_rename_var, nf90_inquire_variable 
+  ! overloaded functions
+  public :: nf90_put_var, nf90_get_var
diff --git a/fortran/nf_attio.F90 b/fortran/nf_attio.F90
new file mode 100755
index 0000000..da1de7f
--- /dev/null
+++ b/fortran/nf_attio.F90
@@ -0,0 +1,559 @@
+#include "nfconfig.inc"
+!---------- Routines to put/get attribute data of various data types ----------
+
+! Replacement for fort-attio.c
+
+! Written by: Richard Weed, Ph.D.
+!             Center for Advanced Vehicular Systems 
+!             Mississippi State University
+!             rweed at cavs.msstate.edu
+
+
+! License (and other Lawyer Language)
+ 
+! This software is released under the Apache 2.0 Open Source License. The
+! full text of the License can be viewed at :
+!
+!   http:www.apache.org/licenses/LICENSE-2.0.html
+!
+! The author grants to the University Center for Atmospheric Research
+! (UCAR), Boulder, CO, USA the right to revise and extend the software
+! without restriction. However, the author retains all copyrights and
+! intellectual property rights explicitly stated in or implied by the
+! Apache license
+
+! Version 1.: Sept. 2005 - Initial Cray X1 version
+! Version 2.: May 2006   - Updated to support g95
+! Version 3.: April 2009 - Updated to Netcdf 4.0.1 
+! Version 4.: April 2010 - Updated to Netcdf 4.1.1 
+! Version 5.: Feb.  2013 - bug fixes for fortran 4.4
+          
+!--------------------------------- nf_put_att_text ---------------------------
+ Function nf_put_att_text(ncid, varid, name, nlen, text) RESULT(status)
+
+! Write variable or global attribute text string to dataset ncid
+
+ USE netcdf_nc_interfaces
+
+ Implicit NONE
+
+ Integer,          Intent(IN) :: ncid, varid, nlen
+ Character(LEN=*), Intent(IN) :: name, text
+
+ Integer                      :: status
+
+ Integer(KIND=C_INT)          :: cncid, cvarid, cstatus
+ Integer(KIND=C_SIZE_T)       :: cnlen
+ Character(LEN=(LEN(name)+1)) :: cname
+ Integer                      :: ie
+
+ cncid  = ncid
+ cvarid = varid -1 ! Subtract 1 to get C varid
+ cnlen  = nlen
+
+ cname = addCNullChar(name, ie)
+ 
+ cstatus = nc_put_att_text(cncid, cvarid, cname(1:ie+1), cnlen, &
+           text)
+
+ status = cstatus
+
+ End Function nf_put_att_text
+!--------------------------------- nf_put_att_text_a ------------------------
+ Function nf_put_att_text_a(ncid, varid, name, nlen, text) RESULT(status)
+
+! New routine to support passing an array of single characters
+! Write variable or global attribute array of characters to dataset ncid
+
+ USE netcdf_nc_interfaces
+
+ Implicit NONE
+
+ Integer,          Intent(IN) :: ncid, varid, nlen
+ Character(LEN=*), Intent(IN) :: name
+ Character(LEN=1), Intent(IN) :: text(*)
+
+ Integer                      :: status
+
+ Integer(KIND=C_INT)          :: cncid, cvarid, cstatus
+ Integer(KIND=C_SIZE_T)       :: cnlen
+ Character(LEN=(LEN(name)+1)) :: cname
+ Integer                      :: ie
+
+ cncid  = ncid
+ cvarid = varid -1 ! Subtract 1 to get C varid
+ cnlen  = nlen
+
+ cname = addCNullChar(name, ie)
+ 
+ cstatus = nc_put_att_text(cncid, cvarid, cname(1:ie+1), cnlen, &
+                           text)
+
+ status = cstatus
+
+ End Function nf_put_att_text_a
+!--------------------------------- nf_put_att_int1 -------------------------
+ Function nf_put_att_int1(ncid, varid, name, xtype, nlen, i1vals) &
+                          RESULT(status)
+
+! Write variable or global attribute byte data to dataset ncid
+
+ USE netcdf_nc_interfaces
+
+ Implicit NONE
+
+ Integer,              Intent(IN) :: ncid, varid, nlen, xtype
+
+ Character(LEN=*),     Intent(IN) :: name
+ Integer(KIND=NFINT1), Intent(IN) :: i1vals(*)
+
+ Integer                          :: status
+
+ Integer(KIND=C_INT)             :: cncid, cvarid, cstatus, cxtype
+ Integer(KIND=C_SIZE_T)          :: cnlen
+ Character(LEN=(LEN(name)+1))    :: cname
+ Integer                         :: ie
+
+ If (C_SIGNED_CHAR < 0) Then ! schar not supported by processor
+   status = NC_EBADTYPE
+   RETURN
+ EndIf
+ 
+ cncid  = ncid
+ cvarid = varid -1 ! Subtract 1 to get C varid
+ cnlen  = nlen
+ cxtype = xtype
+
+! Check for C null char on name and add one
+ 
+ cname = addCNullChar(name, ie)
+
+#if NF_INT1_IS_C_SIGNED_CHAR 
+ cstatus = nc_put_att_schar(cncid, cvarid, cname(1:ie+1), &
+                           cxtype, cnlen, i1vals) 
+#elif NF_INT1_IS_C_SHORT
+ cstatus = nc_put_att_short(cncid, cvarid, cname(1:ie+1), &
+                            cxtype, cnlen, i1vals)
+#elif NF_INT1_IS_C_INT
+ cstatus = nc_put_att_int(cncid, cvarid, cname(1:ie+1), &
+                            cxtype, cnlen, i1vals)
+#elif NF_INT1_IS_C_LONG
+ cstatus = nc_put_att_long(cncid, cvarid, cname(1:ie+1), &
+                           cxtype, cnlen, i1vals)
+#endif
+ status = cstatus
+
+ End Function nf_put_att_int1
+!--------------------------------- nf_put_att_int2 -------------------------
+ Function nf_put_att_int2(ncid, varid, name, xtype, nlen, i2vals) &
+                          RESULT(status)
+
+! Write variable or global attribute 16 bit integer data to dataset ncid
+
+ USE netcdf_nc_interfaces
+
+ Implicit NONE
+
+ Integer,              Intent(IN) :: ncid, varid, nlen, xtype
+
+ Character(LEN=*),     Intent(IN) :: name
+ Integer(KIND=NFINT2), Intent(IN) :: i2vals(*)
+
+ Integer                          :: status
+
+ Integer(KIND=C_INT)             :: cncid, cvarid, cstatus, cxtype
+ Integer(KIND=C_SIZE_T)          :: cnlen
+ Character(LEN=(LEN(name)+1))    :: cname
+ Integer                         :: ie
+
+ If (C_SHORT < 0) Then ! short not supported by processor
+   status = NC_EBADTYPE
+   Return
+ EndIf
+ 
+ cncid  = ncid
+ cvarid = varid -1 ! Subtract 1 to get C varid
+ cnlen  = nlen
+ cxtype = xtype
+
+ cname = addCNullChar(name, ie)
+
+#if NF_INT2_IS_C_SHORT 
+ cstatus = nc_put_att_short(cncid, cvarid, cname(1:ie+1), &
+                            cxtype, cnlen, i2vals) 
+#elif NF_INT2_IS_C_INT 
+ cstatus = nc_put_att_int(cncid, cvarid, cname(1:ie+1), &
+                           cxtype, cnlen, i2vals)
+#elif NF_INT2_IS_C_LONG 
+ cstatus = nc_put_att_long(cncid, cvarid, cname(1:ie+1), &
+                           cxtype, cnlen, i2vals)
+#endif 
+ status = cstatus
+
+ End Function nf_put_att_int2
+!--------------------------------- nf_put_att_int --------------------------
+ Function nf_put_att_int(ncid, varid, name, xtype, nlen, ivals) &
+                         RESULT(status)
+
+! Write variable or global attribute default integer data to dataset ncid
+
+ USE netcdf_nc_interfaces
+
+ Implicit NONE
+
+ Integer,          Intent(IN) :: ncid, varid, nlen, xtype
+
+ Character(LEN=*), Intent(IN) :: name
+ Integer(NFINT),   Intent(IN) :: ivals(*)
+
+ Integer                      :: status
+
+ Integer(KIND=C_INT)          :: cncid, cvarid, cstatus, cxtype
+ Integer(KIND=C_SIZE_T)       :: cnlen
+ Character(LEN=(LEN(name)+1)) :: cname
+ Integer :: ie
+
+ cncid  = ncid
+ cvarid = varid -1 ! Subtract 1 to get C varid
+ cnlen  = nlen
+ cxtype = xtype
+
+! Check for C null char and add one if missing
+
+ cname = addCNullChar(name, ie)
+
+#if NF_INT_IS_C_INT 
+ cstatus = nc_put_att_int(cncid, cvarid, cname(1:ie+1), &
+                          cxtype, cnlen, ivals) 
+#elif NF_INT_IS_C_LONG 
+ cstatus = nc_put_att_long(cncid, cvarid, cname(1:ie+1), &
+                          cxtype, cnlen, ivals) 
+#endif
+ status = cstatus
+
+ End Function nf_put_att_int
+!--------------------------------- nf_put_att_real -------------------------
+ Function nf_put_att_real(ncid, varid, name, xtype, nlen, rvals) &
+                          RESULT(status)
+
+! Write variable or global attribute Real(RK4) data to dataset ncid
+
+ USE netcdf_nc_interfaces
+
+ Implicit NONE
+
+ Integer,          Intent(IN) :: ncid, varid, nlen, xtype
+
+ Character(LEN=*), Intent(IN) :: name
+ Real(NFREAL),     Intent(IN) :: rvals(*)
+
+ Integer                      :: status
+
+ Integer(KIND=C_INT)          :: cncid, cvarid, cstatus, cxtype
+ Integer(KIND=C_SIZE_T)       :: cnlen
+ Character(LEN=(LEN(name)+1)) :: cname
+ Integer                      :: ie
+
+ cncid  = ncid
+ cvarid = varid -1 ! Subtract 1 to get C varid
+ cnlen  = nlen
+ cxtype = xtype
+
+! Check for C null char and add one if missing
+ 
+ cname = addCNullChar(name, ie)
+
+#if NF_REAL_IS_C_DOUBLE 
+ cstatus = nc_put_att_double(cncid, cvarid, cname(1:ie+1), &
+                             cxtype, cnlen, rvals) 
+#else
+ cstatus = nc_put_att_float(cncid, cvarid, cname(1:ie+1), &
+                            cxtype, cnlen, rvals) 
+#endif
+ status = cstatus
+
+ End Function nf_put_att_real
+!--------------------------------- nf_put_att_double -----------------------
+ Function nf_put_att_double(ncid, varid, name, xtype, nlen, dvals) &
+                               RESULT(status)
+
+! Write variable or global attribute Real(RK8) to dataset ncid
+
+ USE netcdf_nc_interfaces
+
+ Implicit NONE
+
+ Integer,          Intent(IN) :: ncid, varid, nlen, xtype
+
+ Character(LEN=*), Intent(IN) :: name
+ Real(RK8),        Intent(IN) :: dvals(*)
+
+ Integer                      :: status
+
+ Integer(KIND=C_INT)          :: cncid, cvarid, cstatus, cxtype
+ Integer(KIND=C_SIZE_T)       :: cnlen
+ Character(LEN=(LEN(name)+1)) :: cname
+ Integer                      :: ie
+
+ cncid  = ncid
+ cvarid = varid -1 ! Subtract 1 to get C varid
+ cnlen  = nlen
+ cxtype = xtype
+
+! Check for C null char and add one if missing
+
+ cname = addCNullChar(name, ie)
+ 
+ cstatus = nc_put_att_double(cncid, cvarid, cname(1:ie+1), &
+                             cxtype, cnlen, dvals) 
+
+ status = cstatus
+
+ End Function nf_put_att_double
+!--------------------------------- nf_get_att_text -----------------------
+ Function nf_get_att_text(ncid, varid, name, text) RESULT(status)
+
+! Read variable or global attribute character string from dataset ncid
+
+ USE netcdf_nc_interfaces
+
+ Implicit NONE
+
+ Integer,          Intent(IN)  :: ncid, varid
+ Character(LEN=*), Intent(IN)  :: name
+ Character(LEN=*), Intent(OUT) :: text
+
+ Integer                       :: status
+
+ Integer(KIND=C_INT)          :: cncid, cvarid, cstatus
+ Character(LEN=(LEN(name)+1)) :: cname
+ Integer                      :: ie
+
+ cncid  = ncid
+ cvarid = varid -1 ! Subtract 1 to get C varid
+ text   = REPEAT(" ", LEN(text))
+
+! Check for C null char and add one if missing
+
+ cname = addCNullChar(name, ie)
+ 
+ cstatus = nc_get_att_text(cncid, cvarid, cname(1:ie+1), text)
+
+ status = cstatus
+
+ End Function nf_get_att_text
+!--------------------------------- nf_get_att_text_a -----------------------
+ Function nf_get_att_text_a(ncid, varid, name, text) RESULT(status)
+
+! New routine to support passing an array of single characters
+! Read variable or global attribute array of characters from dataset ncid
+
+ USE netcdf_nc_interfaces
+
+ Implicit NONE
+
+ Integer,          Intent(IN)  :: ncid, varid
+ Character(LEN=*), Intent(IN)  :: name
+ Character(LEN=1), Intent(OUT) :: text(*)
+
+ Integer                       :: status
+
+ Integer(KIND=C_INT)          :: cncid, cvarid, cstatus
+ Character(LEN=(LEN(name)+1)) :: cname
+ Integer                      :: ie
+
+ cncid  = ncid
+ cvarid = varid -1 ! Subtract 1 to get C varid
+
+! Check for C null char and add one if missing
+
+ cname = addCNullChar(name, ie)
+ 
+ cstatus = nc_get_att_text(cncid, cvarid, cname(1:ie+1), text)
+
+ status = cstatus
+
+ End Function nf_get_att_text_a
+!--------------------------------- nf_get_att_int1 -------------------------
+ Function nf_get_att_int1(ncid, varid, name, i1vals) RESULT(status)
+
+! Read variable or global attribute BYTE integer data from dataset ncid
+
+ USE netcdf_nc_interfaces
+
+ Implicit NONE
+
+ Integer,              Intent(IN)  :: ncid, varid
+ Character(LEN=*),     Intent(IN)  :: name
+ Integer(KIND=NFINT1), Intent(OUT) :: i1vals(*)
+
+ Integer                          :: status
+
+ Integer(KIND=C_INT)          :: cncid, cvarid, cstatus
+ Character(LEN=(LEN(name)+1)) :: cname
+ Integer                      :: ie
+
+ If (C_SIGNED_CHAR < 0) Then ! schar not supported by processor
+   status = NC_EBADTYPE
+   RETURN
+ EndIf
+ 
+ cncid  = ncid
+ cvarid = varid -1 ! Subtract 1 to get C varid
+
+! Check for C null char and add one if missing
+
+ cname = addCNullChar(name, ie)
+
+#if NF_INT1_IS_C_SIGNED_CHAR 
+ cstatus = nc_get_att_schar(cncid, cvarid, cname(1:ie+1), i1vals)
+#elif NF_INT1_IS_C_SHORT
+ cstatus = nc_get_att_short(cncid, cvarid, cname(1:ie+1), i1vals)
+#elif NF_INT1_IS_C_INT
+ cstatus = nc_get_att_int(cncid, cvarid, cname(1:ie+1), i1vals)
+#elif NF_INT1_IS_C_LONG
+ cstatus = nc_get_att_long(cncid, cvarid, cname(1:ie+1), i1vals)
+#endif
+ status = cstatus
+
+ End Function nf_get_att_int1
+!--------------------------------- nf_get_att_int2 --------------------------
+ Function nf_get_att_int2(ncid, varid, name, i2vals) RESULT(status)
+
+! Read variable or global attribute 16 bit integer data from dataset ncid
+
+ USE netcdf_nc_interfaces
+
+ Implicit NONE
+
+ Integer,              Intent(IN)  :: ncid, varid
+ Character(LEN=*),     Intent(IN)  :: name
+ Integer(KIND=NFINT2), Intent(OUT) :: i2vals(*)
+
+ Integer                           :: status
+
+ Integer(KIND=C_INT)          :: cncid, cvarid, cstatus
+ Character(LEN=(LEN(name)+1)) :: cname
+ Integer                      :: ie
+
+ If (C_SHORT < 0) Then ! short not supported by processor
+   status = NC_EBADTYPE
+   RETURN
+ EndIf
+ 
+ cncid  = ncid
+ cvarid = varid -1 ! Subtract 1 to get C varid
+
+! Check for C null char and add one if missing
+
+ cname = addCNullChar(name, ie)
+ 
+#if NF_INT2_IS_C_SHORT
+ cstatus = nc_get_att_short(cncid, cvarid, cname(1:ie+1), i2vals) 
+#elif NF_INT2_IS_C_INT
+ cstatus = nc_get_att_int(cncid, cvarid, cname(1:ie+1), i2vals) 
+#elif NF_INT2_IS_C_LONG
+ cstatus = nc_get_att_long(cncid, cvarid, cname(1:ie+1), i2vals) 
+#endif
+ status = cstatus
+
+ End Function nf_get_att_int2
+!--------------------------------- nf_get_att_int ---------------------------
+ Function nf_get_att_int(ncid, varid, name, ivals) RESULT(status)
+
+! Read variable or global attribute default Integer data from dataset ncid
+
+ USE netcdf_nc_interfaces
+
+ Implicit NONE
+
+ Integer,          Intent(IN)  :: ncid, varid
+ Character(LEN=*), Intent(IN)  :: name
+ Integer(NFINT),   Intent(OUT) :: ivals(*)
+
+ Integer                       :: status
+
+ Integer(KIND=C_INT)          :: cncid, cvarid, cstatus
+ Character(LEN=(LEN(name)+1)) :: cname
+ Integer                      :: ie
+
+ cncid  = ncid
+ cvarid = varid -1 ! Subtract 1 to get C varid
+
+! Check for C null char and add one if missing
+
+ cname = addCNullChar(name, ie)
+
+#if NF_INT_IS_C_INT 
+ cstatus = nc_get_att_int(cncid, cvarid, cname(1:ie+1), ivals)
+#elif NF_INT_IS_C_LONG
+ cstatus = nc_get_att_long(cncid, cvarid, cname(1:ie+1), ivals)
+#endif
+ status = cstatus
+
+ End Function nf_get_att_int
+!--------------------------------- nf_get_att_real -------------------------
+ Function nf_get_att_real(ncid, varid, name, rvals) RESULT(status)
+
+! Read variable or global attribute Real(RK4) data from dataset ncid
+
+ USE netcdf_nc_interfaces
+
+ Implicit NONE
+
+ Integer,          Intent(IN)  :: ncid, varid
+ Character(LEN=*), Intent(IN)  :: name
+ Real(NFREAL),     Intent(OUT) :: rvals(*)
+
+ Integer                       :: status
+
+ Integer(KIND=C_INT)          :: cncid, cvarid, cstatus
+ Character(LEN=(LEN(name)+1)) :: cname
+ Integer                      :: ie
+
+ cncid  = ncid
+ cvarid = varid -1 ! Subtract 1 to get C varid
+
+! Check for C null char and add one if missing
+
+ cname = addCNullChar(name, ie)
+
+#if NF_REAL_IS_C_DOUBLE 
+ cstatus = nc_get_att_double(cncid, cvarid, cname(1:ie+1), rvals) 
+#else
+ cstatus = nc_get_att_float(cncid, cvarid, cname(1:ie+1), rvals) 
+#endif
+ status = cstatus
+
+ End Function nf_get_att_real
+!--------------------------------- nf_get_att_double -----------------------
+ Function nf_get_att_double(ncid, varid, name, dvals) RESULT(status)
+
+! Read variable or global attribute Real(RK8) data from dataset ncid
+
+ USE netcdf_nc_interfaces
+
+ Implicit NONE
+
+ Integer,          Intent(IN)  :: ncid, varid
+ Character(LEN=*), Intent(IN)  :: name
+ Real(RK8),        Intent(OUT) :: dvals(*)
+
+ Integer                       :: status
+
+ Integer(KIND=C_INT)          :: cncid, cvarid, cstatus
+ Character(LEN=(LEN(name)+1)) :: cname
+ Integer                      :: ie
+
+ cncid  = ncid
+ cvarid = varid -1 ! Subtract 1 to get C varid
+
+! Check for C null char and add one if missing
+
+ cname = addCNullChar(name, ie)
+ 
+ cstatus = nc_get_att_double(cncid, cvarid, cname(1:ie+1), dvals)
+
+ status = cstatus
+
+ End Function nf_get_att_double
diff --git a/fortran/nf_control.F90 b/fortran/nf_control.F90
new file mode 100755
index 0000000..4f65f64
--- /dev/null
+++ b/fortran/nf_control.F90
@@ -0,0 +1,610 @@
+! ------------ Routines to create/open/close/redefine netcdf files ------------ 
+
+! Replacement for fort-control.c
+
+! Written by: Richard Weed, Ph.D.
+!             Center for Advanced Vehicular Systems 
+!             Mississippi State University
+!             rweed at cavs.msstate.edu
+
+
+! License (and other Lawyer Language)
+ 
+! This software is released under the Apache 2.0 Open Source License. The
+! full text of the License can be viewed at :
+!
+!   http:www.apache.org/licenses/LICENSE-2.0.html
+!
+! The author grants to the University Corporation for Atmospheric Research
+! (UCAR), Boulder, CO, USA the right to revise and extend the software
+! without restriction. However, the author retains all copyrights and
+! intellectual property rights explicitly stated in or implied by the
+! Apache license
+
+! Version 1.: Sept.  2005 - Initial Cray X1 version
+! Version 2.: May,   2006 - Updated to support g95
+! Version 3.: April, 2009 - Updated for netcdf 4.0.1
+! Version 4.: April, 2010 - Updated for netcdf 4.1.1
+! Version 5.: Feb.   2013 - Added nf_inq_path support for fortran 4.4
+! Vertion 6.: Nov.   2013 - Added nf_set_log_level support
+! Version 7.: May,   2014 - Ensure return error status checked from C API calls
+!
+!-------------------------------- nf_create --------------------------------
+ Function nf_create(path, cmode, ncid) RESULT (status)
+
+! Creates a new NetCDF file given a file name and a creation mode and returns
+! the file id and a status flag
+
+ USE netcdf_nc_interfaces
+
+ Implicit NONE
+
+ Character(LEN=*), Intent(IN)  :: path
+ Integer,          Intent(IN)  :: cmode
+ Integer,          Intent(OUT) :: ncid
+ 
+ Integer                       :: status
+
+ Integer(KIND=C_INT)          :: ccmode, cncid, cstatus
+ Character(LEN=(LEN(path)+1)) :: cpath
+ Integer                      :: ie
+
+ ccmode = cmode
+ cncid  = 0
+ 
+! Check for C null character on path. We will always add a null
+! char so we don't need a second one
+
+ cpath = addCNullChar(path, ie)
+ 
+! Call nc_create to create file
+
+ cstatus = nc_create(cpath(1:ie+1), ccmode, cncid)
+ 
+ If (cstatus == NC_NOERR) Then
+    ncid   = cncid 
+ EndIf
+ status = cstatus
+
+ End Function nf_create
+!-------------------------------- nf__create -------------------------------
+ Function nf__create(path, cmode, initialsz, chunksizehintp, ncid) &
+                        RESULT(status)
+
+! Creates a new NetCDF file and returns the file id and a status flag
+! This is an alternate form of nf_create that allows user to input
+! two additional tuning parameters
+
+ USE netcdf_nc_interfaces
+
+ Implicit NONE
+
+ Character(LEN=*), Intent(IN)  :: path
+ Integer,          Intent(IN)  :: cmode, initialsz, chunksizehintp
+ Integer,          Intent(OUT) :: ncid
+ 
+ Integer                       :: status
+
+ Integer(KIND=C_INT)          :: ccmode, cncid, cstatus
+ Integer(KIND=C_SIZE_T)       :: cinit, cchunk
+ Character(LEN=(LEN(path)+1)) :: cpath
+ Integer                      :: ie
+
+ ccmode = cmode
+ cchunk = chunksizehintp
+ cinit  = initialsz
+ cncid  = 0
+ 
+! Check for C null character on path. We will always add a null
+! char so we don't need a second one
+
+ cpath = addCNullChar(path, ie)
+ 
+! Call nc_create to create file
+
+ cstatus = nc__create(cpath(1:ie+1), ccmode, cinit, cchunk, cncid)
+ 
+ If (cstatus == NC_NOERR) Then
+    ncid   = cncid 
+ EndIf
+ status = cstatus
+
+ End Function nf__create
+!-------------------------------- nf__create_mp ------------------------------
+ Function nf__create_mp(path, cmode, initialsz, basepe, chunksizehintp, ncid) &
+                        RESULT(status)
+
+! Creates a new NetCDF file and returns the file id and a status flag
+! This is an alternate form of nf__create for shared memory MPP systems 
+! two additional tuning parameters
+
+ USE netcdf_nc_interfaces
+
+ Implicit NONE
+
+ Character(LEN=*), Intent(IN)  :: path
+ Integer,          Intent(IN)  :: cmode, initialsz, chunksizehintp, basepe
+ Integer,          Intent(OUT) :: ncid
+ 
+ Integer                       :: status
+
+ Integer(KIND=C_INT)          :: ccmode, cncid, cstatus
+ Integer(KIND=C_INT), TARGET  :: cbasepe
+ Integer(KIND=C_SIZE_T)       :: cinit, cchunk
+ Type(C_PTR)                  :: cbasepeptr
+ Character(LEN=(LEN(path)+1)) :: cpath
+ Integer                      :: ie
+
+ ccmode     = cmode
+ cchunk     = chunksizehintp
+ cinit      = initialsz
+ cncid      = 0
+ cbasepe    = basepe
+ cbasepeptr = C_LOC(cbasepe)
+
+! Check for C null character on path. We will always add a null
+! char so we don't need a second one
+
+ cpath = addCNullChar(path, ie)
+ 
+! Call nc_create_mp to create file for base pe
+
+ cstatus = nc__create_mp(cpath(1:ie+1), ccmode, cinit, cbasepeptr, &
+                         cchunk, cncid)
+ 
+ If (cstatus == NC_NOERR) Then
+    ncid   = cncid 
+ EndIf
+ status = cstatus
+
+ End Function nf__create_mp
+!-------------------------------- nf_open ----------------------------------
+ Function nf_open(path, mode, ncid) RESULT (status)
+
+! Open an existing NetCDF file and return file id and a status flag
+
+ USE netcdf_nc_interfaces
+
+ Implicit NONE
+
+ Character(LEN=*), Intent(IN)    :: path
+ Integer,          Intent(IN)    :: mode
+ Integer,          Intent(INOUT) :: ncid
+ 
+ Integer                         :: status
+
+ Integer(KIND=C_INT)          :: cmode, cncid, cstatus
+ Character(LEN=(LEN(path)+1)) :: cpath
+ Integer                      :: ie
+
+ cmode = mode
+ cncid = 0
+ 
+! Check for C null character on path. We will always add a null
+! char so we don't need a second one
+
+ cpath = addCNullChar(path, ie) 
+ 
+! Call nc_create to create file
+
+ cstatus = nc_open(cpath(1:ie+1), cmode, cncid)
+ 
+ If (cstatus == NC_NOERR) Then
+    ncid   = cncid
+ EndIf
+ status = cstatus
+
+ End Function nf_open
+!-------------------------------- nf__open ---------------------------------
+ Function nf__open(path, mode, chunksizehintp, ncid) RESULT (status)
+
+! Open an existing NetCDF file and return file id and a status flag
+! Alternate form of nf_open with extra tuning parameter
+
+ USE netcdf_nc_interfaces
+
+ Implicit NONE
+
+ Character(LEN=*), Intent(IN)    :: path
+ Integer,          Intent(IN)    :: mode, chunksizehintp
+ Integer,          Intent(INOUT) :: ncid
+ 
+ Integer                         :: status
+
+ Integer(KIND=C_INT)          :: cmode, cncid, cstatus
+ Integer(KIND=C_SIZE_T)       :: cchunk
+ Character(LEN=(LEN(path)+1)) :: cpath
+ Integer                      :: inull, ie
+
+ cmode  = mode
+ cchunk = chunksizehintp
+ cncid  = 0
+ 
+! Check for C null character in path. A null character is always added
+! before we pass path to C we don't need a second one
+
+ cpath = addCNullChar(path,ie)
+ 
+! Call nc_create to create file
+
+ cstatus = nc__open(cpath(1:ie+1), cmode, cchunk, cncid)
+ 
+ If (cstatus == NC_NOERR) Then
+    ncid   = cncid
+ EndIf
+ status = cstatus
+
+ End Function nf__open
+!-------------------------------- nf__open_mp --------------------------------
+ Function nf__open_mp(path, mode, basepe, chunksizehintp, ncid) RESULT (status)
+
+! Open an existing NetCDF file and return file id and a status flag
+! Alternate form of nf__open with parameter to designate basepe on
+! shared memory MPP systems. 
+
+ USE netcdf_nc_interfaces
+
+ Implicit NONE
+
+ Character(LEN=*), Intent(IN)    :: path
+ Integer,          Intent(IN)    :: mode, chunksizehintp, basepe
+ Integer,          Intent(INOUT) :: ncid
+ 
+ Integer                         :: status
+
+ Integer(KIND=C_INT)          :: cmode, cncid, cstatus
+ Integer(KIND=C_INT), TARGET  :: cbasepe
+ Integer(KIND=C_SIZE_T)       :: cchunk
+ Type(C_PTR)                  :: cbasepeptr
+ Character(LEN=(LEN(path)+1)) :: cpath
+ Integer                      :: ie
+
+ cmode      = mode
+ cchunk     = chunksizehintp
+ cncid      = 0
+ cbasepe    = basepe
+ cbasepeptr = C_LOC(cbasepe)
+ 
+! Check for C null character in path. A null character is always added
+! before we pass path to C we don't need a second one
+
+ cpath = addCNullChar(path, ie) 
+ 
+! Call nc_create to create file
+
+ cstatus = nc__open_mp(cpath(1:ie+1), cmode, cbasepeptr, cchunk, &
+                       cncid)
+ 
+ If (cstatus == NC_NOERR) Then
+    ncid   = cncid
+ EndIf
+ status = cstatus
+
+ End Function nf__open_mp
+!-------------------------------- nf_inq_path ------------------------------
+ Function nf_inq_path(ncid, pathlen, path) RESULT(status)
+
+! Inquire about file pathname and name length
+
+ USE netcdf_nc_interfaces
+
+ Implicit NONE
+
+ Integer,          Intent(IN)    :: ncid
+ Integer,          Intent(INOUT) :: pathlen
+ Character(LEN=*), Intent(INOUT) :: path
+
+ Integer                         :: status
+
+ Integer(C_INT)             :: cncid, cstatus
+ Integer(C_SIZE_T)          :: cpathlen
+ Character(LEN=LEN(path)+1) :: tmppath
+
+ cncid   = ncid
+ path    = REPEAT(" ", LEN(path))
+ tmppath = REPEAT(" ", LEN(tmppath))
+
+ cstatus = nc_inq_path(cncid, cpathlen, tmppath)
+
+ If (cstatus == NC_NOERR) Then
+    pathlen = cpathlen
+    If (pathlen > LEN(path)) pathlen = LEN(path)
+    path = stripCNullchar(tmppath, pathlen)
+ EndIf
+ status = cstatus
+
+ End Function nf_inq_path
+!-------------------------------- nf_set_fill ------------------------------
+ Function nf_set_fill(ncid, fillmode, old_mode) RESULT(status)
+ 
+! Sets fill mode for given netcdf file returns old mode if present
+
+ USE netcdf_nc_interfaces
+
+ Implicit NONE
+
+ Integer, Intent(IN)  :: ncid, fillmode
+ Integer, Intent(OUT) :: old_mode
+
+ Integer              :: status
+
+ Integer(KIND=C_INT) :: cncid, cfill, coldmode, cstatus
+
+ cncid    = ncid
+ cfill    = fillmode
+ coldmode = 0
+
+ cstatus = nc_set_fill(cncid, cfill, coldmode)
+
+ If (cstatus == NC_NOERR) Then
+    old_mode = coldmode
+ EndIf
+ status   = cstatus
+
+ End Function nf_set_fill
+!-------------------------------- nf_set_default_format --------------------
+ Function nf_set_default_format(newform, old_format) RESULT(status)
+ 
+! Sets new default data format. Used to toggle between 64 bit offset and
+! classic mode 
+
+ USE netcdf_nc_interfaces
+
+ Implicit NONE
+
+ Integer, Intent(IN)  :: newform 
+ Integer, Intent(OUT) :: old_format
+
+ Integer              :: status
+
+ Integer(KIND=C_INT) :: cnew, cold, cstatus
+
+ cnew = newform
+
+ cstatus = nc_set_default_format(cnew,cold)
+
+ If (cstatus == NC_NOERR) Then
+    old_format = cold
+ EndIf
+ status     = cstatus
+
+ End Function nf_set_default_format
+!-------------------------------- nf_redef ---------------------------------
+ Function nf_redef(ncid) RESULT(status)
+ 
+! Re-Enter definition mode for NetCDF file id ncid 
+
+ USE netcdf_nc_interfaces
+
+ Implicit NONE
+
+ Integer, Intent(IN) :: ncid
+
+ Integer             :: status
+
+ Integer(KIND=C_INT) :: cncid, cstatus
+
+ cncid = ncid
+
+ cstatus = nc_redef(cncid)
+
+ status = cstatus
+
+ End Function nf_redef
+!-------------------------------- nf_enddef --------------------------------
+ Function nf_enddef(ncid) RESULT(status)
+ 
+! Exit definition mode for NetCDF file id ncid
+
+ USE netcdf_nc_interfaces
+
+ Implicit NONE
+
+ Integer, Intent(IN) :: ncid
+
+ Integer             :: status
+
+ Integer(KIND=C_INT) :: cncid, cstatus
+
+ cncid = ncid
+
+ cstatus = nc_enddef(cncid)
+
+ status = cstatus
+
+ End Function nf_enddef
+!-------------------------------- nf__enddef -------------------------------
+ Function nf__enddef(ncid, h_minfree, v_align, v_minfree, r_align) &
+                     RESULT(status)
+ 
+! Exit definition mode for NetCDF file id ncid. Alternate version
+! with additional tuning parameters
+
+ USE netcdf_nc_interfaces
+
+ Implicit NONE
+
+ Integer, Intent(IN) :: ncid, h_minfree, v_align, v_minfree, r_align
+
+ Integer             :: status
+
+ Integer(KIND=C_INT)    :: cncid, cstatus
+ Integer(KIND=C_SIZE_T) :: chminfree, cvalign, cvminfree, cralign
+
+ cncid     = ncid
+ chminfree = h_minfree
+ cvalign   = v_align
+ cvminfree = v_minfree
+ cralign   = r_align
+
+ cstatus = nc__enddef(cncid, chminfree, cvalign, cvminfree, cralign)
+
+ status = cstatus
+
+ End Function nf__enddef
+!-------------------------------- nf_sync ----------------------------------
+ Function nf_sync(ncid) RESULT(status)
+ 
+! synch up all open NetCDF files 
+
+ USE netcdf_nc_interfaces
+
+ Implicit NONE
+
+ Integer, Intent(IN) :: ncid
+
+ Integer             :: status
+
+ Integer(KIND=C_INT) :: cncid, cstatus
+
+ cncid = ncid
+
+ cstatus = nc_sync(cncid)
+
+ status = cstatus
+
+ End Function nf_sync
+!-------------------------------- nf_abort ---------------------------------
+ Function nf_abort(ncid) RESULT(status)
+ 
+! Abort netCDF file creation and exit 
+
+ USE netcdf_nc_interfaces
+
+ Implicit NONE
+
+ Integer, Intent(IN) :: ncid
+
+ Integer             :: status
+
+ Integer(KIND=C_INT) :: cncid, cstatus
+
+ cncid = ncid
+
+ cstatus = nc_abort(cncid)
+
+ status = cstatus
+
+ End Function nf_abort
+!-------------------------------- nf_close ---------------------------------
+ Function nf_close(ncid) RESULT(status)
+ 
+! Close netCDF file id ncid 
+
+ USE netcdf_nc_interfaces
+
+ Implicit NONE
+
+ Integer, Intent(IN) :: ncid
+
+ Integer             :: status
+
+ Integer(KIND=C_INT) :: cncid, cstatus
+
+ cncid   = ncid
+
+ cstatus = nc_close(cncid)
+
+ status  = cstatus
+
+ End Function nf_close
+!-------------------------------- nf_delete --------------------------------
+ Function nf_delete(path) RESULT(status)
+ 
+! Delete netCDF file id ncid 
+
+ USE netcdf_nc_interfaces
+
+ Implicit NONE
+
+ Character(LEN=*), Intent(IN) :: path
+
+ Integer                      :: status
+
+ Integer(KIND=C_INT)          :: cstatus
+ Character(LEN=(LEN(path)+1)) :: cpath
+ Integer                      :: ie
+
+ cpath = addCNullChar(path,ie)
+ 
+ cstatus = nc_delete(cpath(1:ie+1))
+
+ status = cstatus
+
+ End Function nf_delete
+!-------------------------------- nf_delete_mp -------------------------------
+ Function nf_delete_mp(path, pe) RESULT(status)
+ 
+! Delete netCDF file id ncid. Alternate form of nf_delete for shared memory
+! MPP systems.
+
+ USE netcdf_nc_interfaces
+
+ Implicit NONE
+
+ Character(LEN=*), Intent(IN) :: path
+ Integer,          Intent(IN) :: pe
+
+ Integer                      :: status
+
+ Integer(KIND=C_INT)          :: cstatus, cpe
+ Character(LEN=(LEN(path)+1)) :: cpath
+ Integer                      :: ie
+
+ cpe = pe
+
+ cpath = addCNullChar(path,ie)
+ 
+ cstatus = nc_delete_mp(cpath(1:ie+1), cpe)
+
+ status = cstatus
+
+ End Function nf_delete_mp
+!-------------------------------- nf_set_base_pe ------------------------------
+ Function nf_set_base_pe(ncid, pe) RESULT(status)
+
+! Sets base pe number on shared memory MPP systems
+
+ Use netcdf_nc_interfaces
+
+ Implicit NONE
+
+ Integer, Intent(IN) :: ncid, pe
+
+ Integer             :: status
+
+ Integer(KIND=C_INT) :: cncid, cpe, cstatus
+
+ cncid = ncid
+ cpe   = pe
+
+ cstatus = nc_set_base_pe(cncid, cpe)
+
+ status = cstatus
+
+ End Function nf_set_base_pe
+!-------------------------------- nf_inq_base_pe ------------------------------
+ Function nf_inq_base_pe(ncid, pe) RESULT(status)
+
+! Gets previously set base pe number on shared memory MPP systems
+
+ Use netcdf_nc_interfaces
+
+ Implicit NONE
+
+ Integer, Intent(IN)  :: ncid
+ Integer, Intent(OUT) :: pe
+
+ Integer              :: status
+
+ Integer(KIND=C_INT) :: cncid, cpe, cstatus
+
+ cncid = ncid
+
+ cstatus = nc_inq_base_pe(cncid, cpe)
+
+ If (cstatus == NC_NOERR) Then
+    pe     = cpe
+ EndIf
+ status = cstatus
+End Function nf_inq_base_pe
diff --git a/fortran/nf_dim.f90 b/fortran/nf_dim.f90
new file mode 100755
index 0000000..d6a6eaa
--- /dev/null
+++ b/fortran/nf_dim.f90
@@ -0,0 +1,243 @@
+!------- Routines for defining, obtaining, etc. global dimension info ------ 
+
+! Replacement for fort-dim.c
+
+! Written by: Richard Weed, Ph.D.
+!             Center for Advanced Vehicular Systems 
+!             Mississippi State University
+!             rweed at cavs.msstate.edu
+ 
+
+! License (and other Lawyer Language)
+ 
+! This software is released under the Apache 2.0 Open Source License. The
+! full text of the License can be viewed at :
+!
+!   http:www.apache.org/licenses/LICENSE-2.0.html
+!
+! The author grants to the University Corporation for Atmospheric Research
+! (UCAR), Boulder, CO, USA the right to revise and extend the software
+! without restriction. However, the author retains all copyrights and
+! intellectual property rights explicitly stated in or implied by the
+! Apache license
+
+! Version 1.: Sept. 2005 - Initial Cray X1 version
+! Version 2.: May   2006 - Updated to support g95
+! Version 3.: April 2009 - Updated for netCDF 4.0.1
+! Version 4.: April 2010 - Updated for netCDF 4.1.1
+! Version 5.: May   2014 - Ensure return error status checked from C API calls          
+          
+!-------------------------------- nf_def_dim -------------------------------
+ Function nf_def_dim(ncid, name, dlen, dimid) RESULT (status)
+
+! Adds new dimensions to the NetCDF dataset given dimension name,
+! and length. Returns dimension id
+
+ USE netcdf_nc_interfaces
+
+ Implicit NONE
+
+ Integer,          Intent(IN)  :: ncid, dlen
+ Integer,          Intent(OUT) :: dimid
+ Character(LEN=*), Intent(IN)  :: name
+
+ Integer                       :: status
+
+ Integer(KIND=C_INT)          :: cncid, cdimid, cstatus
+ Integer(KIND=C_SIZE_T)       :: cdlen
+ Character(LEN=(LEN(name)+1)) :: cname
+ Integer                      :: ie
+
+ cncid = ncid
+ cdlen = dlen
+
+ dimid  = -1
+ cdimid = -1
+
+! Check to see if a C null character was appended in FORTRAN
+
+ cname = addCNullChar(name, ie)
+ 
+ cstatus = nc_def_dim(cncid, cname(1:ie+1), cdlen, cdimid)
+
+ If (cstatus == NC_EBADDIM) Then  ! Return dimid=-1
+   dimid = -1
+ Else                    ! Add 1 to get FORTRAN dimid
+   dimid = cdimid+1
+ EndIf
+ status = cstatus
+
+ End Function nf_def_dim
+!-------------------------------- nf_inq_dim -------------------------------
+ Function nf_inq_dim(ncid, dimid, name, dlen) RESULT (status)
+
+! Get dimension name and length for a given dimid from NetCDF dataset ncid
+
+ USE netcdf_nc_interfaces
+
+ Implicit NONE
+
+ Integer,          Intent(IN)  :: ncid, dimid
+ Integer,          Intent(OUT) :: dlen
+ Character(LEN=*), Intent(OUT) :: name
+ 
+ Integer                       :: status
+
+ Integer(KIND=C_INT)        :: cncid, cdimid, cstatus
+ Integer(KIND=C_SIZE_T)     :: cdlen
+ Integer                    :: nlen
+ Character(LEN=NC_MAX_NAME) :: tmpname 
+
+ cncid   = ncid
+ cdimid  = dimid - 1   ! Subtract 1 to get C dimid
+ tmpname = REPEAT(" ", LEN(tmpname))
+ name    = REPEAT(" ", LEN(name))
+ nlen    = LEN(name)
+
+! Get tmpname and cdlen from C interface
+
+ cstatus = nc_inq_dim(cncid, cdimid, tmpname, cdlen)
+
+ If (cstatus == NC_NOERR) Then
+    ! Strip C null char from tmpname if present and set end of string
+    name = stripCNullChar(tmpname, nlen)
+    dlen   = cdlen
+ Endif
+
+ status = cstatus
+
+ End Function nf_inq_dim
+!-------------------------------- nf_inq_dimid -----------------------------
+ Function nf_inq_dimid(ncid, name, dimid) RESULT (status)
+
+! Get dimension id for a given dimension name from dataset ncid
+
+ USE netcdf_nc_interfaces
+
+ Implicit NONE
+
+ Integer,          Intent(IN)  :: ncid
+ Integer,          Intent(OUT) :: dimid
+ Character(LEN=*), Intent(IN)  :: name
+
+ Integer                       :: status
+
+ Integer(KIND=C_INT)          :: cncid, cdimid, cstatus
+ Character(LEN=(LEN(name)+1)) :: cname
+ Integer                      :: ie
+
+ cncid = ncid
+ dimid  =  0 
+ cdimid = -1
+
+! Check to see if a C null character was appended in FORTRAN
+
+ cname = addCNullChar(name, ie)
+ 
+ cstatus = nc_inq_dimid(cncid, cname(1:ie+1), cdimid)
+
+! add one to get FORTRAN dimid if not = -1
+
+ If (cstatus == NC_EBADDIM) Then
+   dimid = -1
+ Else
+   dimid = cdimid + 1
+ EndIf
+ status = cstatus
+
+ End Function nf_inq_dimid
+!-------------------------------- nf_inq_dimlen ----------------------------
+ Function nf_inq_dimlen(ncid, dimid, dlen) RESULT (status)
+
+! Get dimension length for a given dimid from NetCDF dataset ncid
+
+ USE netcdf_nc_interfaces
+
+ Implicit NONE
+
+ Integer, Intent(IN)  :: ncid, dimid
+ Integer, Intent(OUT) :: dlen
+
+ Integer              :: status
+
+ Integer(KIND=C_INT)    :: cncid, cdimid, cstatus
+ Integer(KIND=C_SIZE_T) :: cdlen
+
+ cncid   = ncid
+ cdimid  = dimid - 1 ! Subtract 1 to get C dimid
+ dlen    = 0
+
+ cstatus = nc_inq_dimlen(cncid, cdimid, cdlen)
+
+ If (cstatus == NC_NOERR) Then
+    dlen   = cdlen
+ Endif
+ status = cstatus
+
+ End Function nf_inq_dimlen
+!-------------------------------- nf_inq_dimname ---------------------------
+ Function nf_inq_dimname (ncid, dimid, name) RESULT (status)
+
+! Get dimension name for a given dimid from NetCDF dataset ncid
+
+ USE netcdf_nc_interfaces
+
+ Implicit NONE
+
+ Integer,          Intent(IN)  :: ncid, dimid
+ Character(LEN=*), Intent(OUT) :: name
+
+ Integer                       :: status
+
+ Integer(KIND=C_INT)        :: cncid, cdimid, cstatus
+ Integer                    :: nlen
+ Character(LEN=NC_MAX_NAME) :: tmpname 
+
+ cncid   = ncid
+ cdimid  = dimid - 1 ! Subtract 1 to get C dimid
+ tmpname = REPEAT(" ", LEN(tmpname))
+ name    = REPEAT(" ", LEN(name))
+ nlen    = LEN(name)
+
+! Get tmpname and cdlen from C interface
+
+ cstatus = nc_inq_dimname(cncid, cdimid, tmpname)
+
+ If (cstatus == NC_NOERR) Then
+    ! Strip C null character in tmpname if present and set end of string
+    name = stripCNullChar(tmpname, nlen)
+ Endif
+
+ status = cstatus
+
+ End Function nf_inq_dimname
+!-------------------------------- nf_rename_dim ----------------------------
+ Function nf_rename_dim(ncid, dimid, name) RESULT (status)
+
+! Rename dimension name for a given dimension id
+
+ USE netcdf_nc_interfaces
+
+ Implicit NONE
+
+ Integer,          Intent(IN) :: ncid, dimid
+ Character(LEN=*), Intent(IN) :: name
+
+ Integer                      :: status
+
+ Integer(KIND=C_INT)          :: cncid, cdimid, cstatus
+ Character(LEN=(LEN(name)+1)) :: cname
+ Integer                      :: ie
+
+ cncid  = ncid
+ cdimid = dimid - 1 ! Subtract 1 to get C dimid
+
+! Check to see if a C null character was appended in FORTRAN
+
+ cname = addCNullChar(name, ie)
+
+ cstatus = nc_rename_dim(cncid, cdimid, cname(1:ie+1))
+
+ status = cstatus
+
+ End Function nf_rename_dim
diff --git a/fortran/nf_fortv2.f90 b/fortran/nf_fortv2.f90
new file mode 100755
index 0000000..269c1ed
--- /dev/null
+++ b/fortran/nf_fortv2.f90
@@ -0,0 +1,1520 @@
+!                  Netcdf Version 2 Fortran API 
+
+! These routines replace the cfortran.h defined functions from fort-v2compat.c
+! C_CHAR strings and C_PTR types are used as pass-through variables for
+! functions that support multiple data types as void pointers in the C routines
+!
+
+! Written by: Richard Weed, Ph.D.
+!             Center for Advanced Vehicular Systems
+!             Mississippi State University
+!             rweed at cavs.msstate.edu
+
+
+! License (and other Lawyer Language)
+ 
+! This software is released under the Apache 2.0 Open Source License. The
+! full text of the License can be viewed at :
+!
+!   http:www.apache.org/licenses/LICENSE-2.0.html
+!
+! The author grants to the University Corporation for Atmospheric Research
+! (UCAR), Boulder, CO, USA the right to revise and extend the software
+! without restriction. However, the author retains all copyrights and
+! intellectual property rights explicitly stated in or implied by the
+! Apache license
+
+! Version 1: May   2006 - Initial version 2 interfaces
+! Version 2: April 2009 - Refactored to pass value data using C_CHAR and C_PTR
+!                         strings and pointers and updated for NetCDF 4.0.1
+! Version 3: April 2010 - updated for NetCDF 4.1.1
+
+! ------------------------------- ncpopt -------------------------------------- 
+ Subroutine ncpopt(ncopts)
+
+ USE netcdf_fortv2_c_interfaces
+
+ Implicit NONE
+
+ Integer, Intent(IN) :: ncopts
+ 
+ Integer(KIND=C_INT) :: cncopts
+
+ cncopts = ncopts
+
+ Call c_ncpopt(cncopts)
+
+ End Subroutine ncpopt 
+! ------------------------------- ncgopt -------------------------------------- 
+ Subroutine ncgopt(ncopts)
+
+ USE netcdf_fortv2_c_interfaces
+
+ Implicit NONE
+
+ Integer, Intent(INOUT) :: ncopts
+
+ Integer(KIND=C_INT)    :: cncopts
+
+ cncopts = 0 
+
+ Call c_ncgopt(cncopts)
+
+ ncopts = cncopts
+
+ End Subroutine ncgopt 
+! ------------------------------- nccre --------------------------------------- 
+ Function nccre(filename, cmode, rcode) RESULT(ncid)
+
+ USE netcdf_fortv2_c_interfaces
+
+ Implicit NONE
+
+ Character(LEN=*), Intent(IN)  :: filename
+ Integer,          Intent(IN)  :: cmode
+ Integer,          Intent(OUT) :: rcode
+
+ Integer                       :: ncid
+
+ Character(LEN=(LEN(filename)+1)) :: cfilename
+ Integer                          :: ilen
+ Integer(KIND=C_INT)              :: ccmode, crcode, cncid 
+
+ ccmode = cmode
+ cncid  = 0
+ rcode  = 0
+ crcode = 0
+
+! check for a null character on end of filename
+
+ cfilename = addCNullChar(filename, ilen)
+ 
+ cncid = c_nccre(cfilename(1:ilen+1), ccmode, crcode )
+
+ rcode = crcode 
+ ncid  = cncid
+
+ End Function nccre
+! ------------------------------- ncopn --------------------------------------- 
+ Function ncopn(filename, rwmode, rcode) RESULT(ncid)
+
+ USE netcdf_fortv2_c_interfaces
+
+ Implicit NONE
+
+ Character(LEN=*), Intent(IN)  :: filename
+ Integer,          Intent(IN)  :: rwmode
+ Integer,          Intent(OUT) :: rcode
+
+ Integer                       :: ncid
+
+ Character(LEN=(LEN(filename)+1)) :: cfilename
+ Integer                          :: ilen
+ Integer(KIND=C_INT)              :: crwmode, crcode, cncid 
+
+ crwmode = rwmode
+ rcode   = 0
+ crcode  = 0
+ cncid   = 0
+
+! check for a null character on end of filename
+
+ cfilename = addCNullChar(filename, ilen)
+ 
+ cncid = c_ncopn(cfilename(1:ilen+1), crwmode, crcode )
+
+ rcode = crcode 
+ ncid  = cncid
+
+ End Function ncopn
+! ------------------------------- ncddef -------------------------------------- 
+ Function ncddef(ncid, dimname, dimlen, rcode) RESULT(ndimid)
+
+ USE netcdf_fortv2_c_interfaces
+
+ Implicit NONE
+
+ Character(LEN=*), Intent(IN)  :: dimname 
+ Integer,          Intent(IN)  :: ncid, dimlen
+ Integer,          Intent(OUT) :: rcode
+
+ Integer                       :: ndimid
+
+ Character(LEN=(LEN(dimname)+1)) :: cdimname
+ Integer                         :: ilen
+ Integer(KIND=C_INT)             :: cncid, cdimlen, cndimid, crcode
+
+ cncid   = ncid
+ cdimlen = dimlen
+ cndimid = 0
+ rcode   = 0
+ ndimid  = 0
+
+! check for a null character on end of dimname
+
+ cdimname = addCNullChar(dimname, ilen)
+ 
+ cndimid = c_ncddef(cncid, cdimname(1:ilen+1), cdimlen, crcode )
+ 
+ rcode  = crcode 
+ ndimid = cndimid
+
+ End Function ncddef
+! ------------------------------- ncdid --------------------------------------- 
+ Function ncdid(ncid, dimname, rcode) RESULT(ndimid)
+
+ USE netcdf_fortv2_c_interfaces
+
+ Implicit NONE
+
+ Character(LEN=*), Intent(IN)  :: dimname 
+ Integer,          Intent(IN)  :: ncid
+ Integer,          Intent(OUT) :: rcode
+
+ Integer                       :: ndimid
+
+ Character(LEN=(LEN(dimname)+1)) :: cdimname
+ Integer                         :: ilen
+ Integer(KIND=C_INT)             :: cncid, crcode, cndimid
+
+ cncid   = ncid
+ cndimid = 0
+ rcode   = 0
+ ndimid  = 0
+
+! check for a null character on end of dimname
+
+ cdimname = addCNullChar(dimname, ilen)
+ 
+ cndimid = c_ncdid(cncid, cdimname(1:ilen+1), crcode )
+
+ rcode  = crcode 
+ ndimid = cndimid
+
+ End Function ncdid
+! ------------------------------- ncvdef -------------------------------------- 
+ Function ncvdef(ncid, varname, vartype, nvdims, vdims, rcode) RESULT(nvarid)
+
+ USE netcdf_nc_interfaces, ONLY : NC_MAX_DIMS
+ USE netcdf_fortv2_c_interfaces
+
+ Implicit NONE
+
+ Character(LEN=*), Intent(IN)  :: varname 
+ Integer,          Intent(IN)  :: ncid, vartype, nvdims
+ Integer,          Intent(IN)  :: vdims(*)
+ Integer,          Intent(OUT) :: rcode
+
+ Integer                       :: nvarid
+
+ Character(LEN=(LEN(varname)+1)) :: cvarname
+ Integer                         :: ilen
+ Integer(KIND=C_INT)             :: cncid, crcode, cnvdims, cvartype, cnvarid
+ Integer(KIND=C_INT)             :: cvdims(NC_MAX_DIMS)
+
+ cncid    = ncid
+ cnvdims  = nvdims 
+ cvartype = vartype
+ crcode   = 0
+ rcode    = 0
+ nvarid   = 0
+ cnvarid  = 0
+ 
+! check for a null character on end of varname
+
+ cvarname = addCNullChar(varname, ilen)
+ 
+ ! mimic f2c_dimids
+
+ cvdims = 0
+ If (nvdims > 0) Then
+   cvdims(1:nvdims) = vdims(nvdims:1:-1) - 1
+ EndIf
+
+ cnvarid = c_ncvdef(cncid, cvarname(1:ilen+1), cvartype, &
+                    cnvdims, cvdims, crcode )
+
+ rcode  = crcode 
+ nvarid = cnvarid
+
+ End Function ncvdef
+! ------------------------------- ncvid --------------------------------------- 
+ Function ncvid(ncid, varname, rcode) RESULT(nvarid)
+
+ USE netcdf_fortv2_c_interfaces
+
+ Implicit NONE
+
+ Character(LEN=*), Intent(IN)  :: varname 
+ Integer,          Intent(IN)  :: ncid
+ Integer,          Intent(OUT) :: rcode
+
+ Integer                       :: nvarid
+
+ Character(LEN=(LEN(varname)+1)) :: cvarname
+ Integer                         :: ilen
+ Integer(KIND=C_INT)             :: cncid, crcode, cnvarid
+
+ cncid   = ncid
+ crcode  = 0
+ rcode   = 0
+ nvarid  = 0
+ cnvarid = 0
+ 
+! check for a null character on end of varname
+
+ cvarname = addCNullChar(varname, ilen)
+ 
+ cnvarid = c_ncvid(cncid, cvarname(1:ilen+1), crcode)
+
+ rcode  = crcode 
+ nvarid = cnvarid
+
+ End Function ncvid
+! ------------------------------- nctlen -------------------------------------- 
+ Function nctlen(datatype, rcode) RESULT(nvarlen)
+
+ USE netcdf_fortv2_c_interfaces
+
+ Implicit NONE
+
+ Integer, Intent(IN)  :: datatype 
+ Integer, Intent(OUT) :: rcode
+
+ Integer              :: nvarlen
+
+ Integer(KIND=C_INT) :: crcode, cnvarlen, cdtype
+
+ cdtype   = datatype
+ crcode   = 0
+ rcode    = 0
+ nvarlen  = 0
+ cnvarlen = 0
+ 
+ cnvarlen = c_nctlen(cdtype, crcode)
+
+ rcode   = crcode 
+ nvarlen = cnvarlen
+
+ End Function nctlen
+! ------------------------------- ncclos ------------------------------------- 
+ Subroutine ncclos(ncid, rcode)
+
+ USE netcdf_fortv2_c_interfaces
+
+ Implicit NONE
+
+ Integer, Intent(IN)  :: ncid 
+ Integer, Intent(OUT) :: rcode
+
+ Integer(KIND=C_INT) :: crcode, cncid
+
+ cncid   = ncid
+ crcode  = 0
+ rcode   = 0
+ 
+ Call c_ncclos(cncid, crcode)
+
+ rcode = crcode 
+
+ End Subroutine ncclos 
+! ------------------------------- ncredf ------------------------------------- 
+ Subroutine ncredf(ncid, rcode)
+
+ USE netcdf_fortv2_c_interfaces
+
+ Implicit NONE
+
+ Integer, Intent(IN)  :: ncid 
+ Integer, Intent(OUT) :: rcode
+
+ Integer(KIND=C_INT) :: crcode, cncid
+
+ cncid   = ncid
+ crcode  = 0
+ rcode   = 0
+ 
+ Call c_ncredf(cncid, crcode)
+
+ rcode = crcode 
+
+ End Subroutine ncredf
+! ------------------------------- ncendf -------------------------------------- 
+ Subroutine ncendf(ncid, rcode)
+
+ USE netcdf_fortv2_c_interfaces
+
+ Implicit NONE
+
+ Integer, Intent(IN)  :: ncid 
+ Integer, Intent(OUT) :: rcode
+
+ Integer(KIND=C_INT) :: crcode, cncid
+
+ cncid   = ncid
+ crcode  = 0
+ rcode   = 0
+ 
+ Call c_ncendf(cncid, crcode)
+
+ rcode = crcode 
+
+ End Subroutine ncendf
+! ------------------------------- ncinq --------------------------------------- 
+ Subroutine ncinq(ncid, ndims, nvars, natts, recdim, rcode)
+
+ USE netcdf_fortv2_c_interfaces
+
+ Implicit NONE
+
+ Integer, Intent(IN)  :: ncid 
+ Integer, Intent(OUT) :: ndims, nvars, natts, recdim, rcode
+
+ Integer(KIND=C_INT) :: crcode, cncid, cndims, cnvars, cnatts, crecdim
+
+ cncid   = ncid
+ crcode  = 0
+ rcode   = 0
+ cndims  = 0
+ cnvars  = 0
+ cnatts  = 0
+ ndims   = 0
+ nvars   = 0
+ natts   = 0
+  
+ Call c_ncinq(cncid, cndims, cnvars, cnatts, crecdim, crcode)
+
+ ndims = cndims
+ nvars = cnvars
+ natts = cnatts
+ If (crecdim == -1) Then ! no unlimited dimension
+   recdim = -1
+ Else
+   recdim = crecdim + 1  ! shift by plus one for FORTRAN
+ EndIf 
+
+ rcode = crcode 
+
+ End Subroutine ncinq
+! ------------------------------- ncsnc --------------------------------------- 
+ Subroutine ncsnc(ncid, rcode)
+
+ USE netcdf_fortv2_c_interfaces
+
+ Implicit NONE
+
+ Integer, Intent(IN)  :: ncid 
+ Integer, Intent(OUT) :: rcode
+
+ Integer(KIND=C_INT) :: crcode, cncid
+
+ cncid   = ncid
+ crcode  = 0
+ rcode   = 0
+ 
+ Call c_ncsnc(cncid, crcode)
+
+ rcode = crcode 
+
+ End Subroutine ncsnc
+! ------------------------------- ncabor -------------------------------------- 
+ Subroutine ncabor(ncid, rcode)
+
+ USE netcdf_fortv2_c_interfaces
+
+ Implicit NONE
+
+ Integer, Intent(IN)  :: ncid 
+ Integer, Intent(OUT) :: rcode
+
+ Integer(KIND=C_INT) :: crcode, cncid
+
+ cncid   = ncid
+ crcode  = 0
+ rcode   = 0
+ 
+ Call c_ncabor(cncid, crcode)
+
+ rcode = crcode 
+
+ End Subroutine ncabor
+! ------------------------------- ncdinq -------------------------------------- 
+ Subroutine ncdinq(ncid, dimid, dimname, dimlen, rcode)
+
+ USE netcdf_nc_interfaces, ONLY: NC_MAX_NAME
+ USE netcdf_fortv2_c_interfaces
+
+ Implicit NONE
+
+ Integer,          Intent(IN)  :: ncid, dimid
+ Character(LEN=*), Intent(OUT) :: dimname
+ Integer,          Intent(OUT) :: dimlen, rcode
+
+ Integer(KIND=C_INT)            :: cncid, crcode, cdimlen, cdimid
+ Character(LEN=(NC_MAX_NAME+1)) :: cdimname
+ Integer                        :: ilen
+
+ cncid    = ncid
+ cdimid   = dimid - 1
+ crcode   = 0
+ rcode    = 0
+ cdimlen  = 0
+ cdimname = REPEAT(" ", LEN(cdimname))
+ ilen = LEN(dimname)
+ 
+ Call c_ncdinq(cncid, cdimid, cdimname, cdimlen, crcode)
+
+! check for a null character on end of cdimname
+
+ dimname = stripCNullChar(cdimname, ilen)
+ 
+ dimlen          = cdimlen
+ rcode           = crcode
+
+ End Subroutine ncdinq
+! ------------------------------- ncdren -------------------------------------- 
+ Subroutine ncdren(ncid, dimid, dimname, rcode)
+
+ USE netcdf_fortv2_c_interfaces
+
+ Implicit NONE
+
+ Character(LEN=*), Intent(IN)  :: dimname
+ Integer,          Intent(IN)  :: ncid, dimid
+ Integer,          Intent(OUT) :: rcode
+
+ Character(LEN=(LEN(dimname)+1)) :: cdimname
+ Integer(KIND=C_INT)             :: cncid, crcode, cdimid
+ Integer                         :: ilen
+
+ cncid  = ncid
+ cdimid = dimid - 1
+ crcode = 0
+ rcode  = 0
+
+! check for a null character on end of dimname
+
+ cdimname = addCNullChar(dimname, ilen)
+ 
+ Call c_ncdren(cncid, cdimid, cdimname(1:ilen+1), crcode)
+
+ rcode = crcode 
+
+ End Subroutine ncdren
+! ------------------------------- ncvinq -------------------------------------- 
+ Subroutine ncvinq(ncid, varid, varname, vartype, nvdims, vdims, &
+                   nvatts, rcode)
+
+ USE netcdf_nc_interfaces, ONLY: NC_MAX_DIMS, NC_MAX_NAME
+ USE netcdf_fortv2_c_interfaces
+
+ Implicit NONE
+
+ Integer,          Intent(IN)    :: ncid, varid
+ Character(LEN=*), Intent(INOUT) :: varname
+ Integer,          Intent(OUT)   :: vartype, nvdims, nvatts, rcode
+ Integer,          Intent(INOUT) :: vdims(*)
+
+ Integer(KIND=C_INT)          :: cncid, crcode, cvarid, cvartype, cnvdims, &
+                                 cnvatts
+ Integer(KIND=C_INT)          :: cvdims(NC_MAX_DIMS)
+ Character(LEN=NC_MAX_NAME+1) :: cvarname
+ Integer                      :: ilen
+
+ cncid    = ncid
+ cvarid   = varid - 1
+ crcode   = 0
+ rcode    = 0
+ cvdims   = 0
+ cvdims   = 0
+ vartype  = 0
+ nvdims   = 0
+ nvatts   = 0
+ cnvdims  = 0
+ cvdims   = 0
+ cnvatts  = 0
+ cvartype = 0
+ cvarname = REPEAT(" ", LEN(cvarname))
+ ilen = LEN(varname)
+
+ Call c_ncvinq(cncid, cvarid, cvarname, cvartype, cnvdims, cvdims, cnvatts, &
+               crcode)      
+
+ nvdims  = cnvdims
+ vartype = cvartype
+ nvatts  = cnvatts 
+ rcode   = crcode 
+
+! strip C null character from cvarname
+   
+ varname = stripCNullChar(cvarname, ilen)
+ 
+! convert C dimids to FORTRAN order and rank
+! Replaces call to c2f_dimids in C code
+
+ If (nvdims > 0) Then
+   vdims(1:nvdims) = cvdims(nvdims:1:-1) + 1
+ End If
+
+ End Subroutine ncvinq
+! ------------------------------- ncvpt1 -------------------------------------- 
+ Subroutine ncvpt1(ncid, varid, mindex, values, rcode) 
+
+ USE netcdf_nc_interfaces, ONLY: NC_MAX_DIMS, NC_NOERR, nc_inq_varndims
+ USE netcdf_fortv2_c_interfaces
+
+ Implicit NONE
+
+ Integer,                Intent(IN)          :: ncid, varid
+ Integer,                Intent(IN)          :: mindex(*)
+ Character(KIND=C_CHAR), Intent(IN), TARGET  :: values(*)
+ Integer,                Intent(OUT)         :: rcode
+
+ Integer(KIND=C_INT)            :: cncid, crcode, cvarid, cstatus, cndims
+ Integer(KIND=C_SIZE_T), TARGET :: cmindex(NC_MAX_DIMS)
+ Type(C_PTR)                    :: cmindexptr
+ Type(C_PTR)                    :: cvaluesptr
+ Integer                        :: ndims
+
+ cncid   = ncid
+ cvarid  = varid - 1
+ crcode  = 0
+ rcode   = 0
+ cmindex = 0
+ cndims  = 0
+ ndims   = 0
+
+ cstatus = nc_inq_varndims(cncid, cvarid, cndims)
+
+ cmindexptr = C_NULL_PTR
+ ndims      = cndims
+ 
+ If (cstatus == NC_NOERR) Then ! mimic f2c_coords in C code
+   If (ndims > 0) Then
+     cmindex(1:ndims) = mindex(ndims:1:-1) - 1
+   Endif
+   cmindexptr = C_LOC(cmindex)
+ Endif
+ 
+ cvaluesptr = C_LOC(values)
+
+ Call c_ncvpt1(cncid, cvarid, cmindexptr, cvaluesptr, crcode)
+
+ rcode = crcode
+
+ End Subroutine ncvpt1
+! ------------------------------- ncvp1c -------------------------------------- 
+ Subroutine ncvp1c(ncid, varid, mindex, strings, rcode) 
+
+ USE netcdf_nc_interfaces, ONLY: NC_MAX_DIMS, NC_NOERR, nc_inq_varndims
+ USE netcdf_fortv2_c_interfaces
+
+ Implicit NONE
+
+ Integer,          Intent(IN)  :: ncid, varid
+ Integer,          Intent(IN)  :: mindex(*)
+ Character(LEN=*), Intent(IN)  :: strings
+ Integer,          Intent(OUT) :: rcode
+
+ Integer(KIND=C_INT)            :: cncid, crcode, cvarid, cstatus, cndims
+ Integer(KIND=C_SIZE_T), TARGET :: cmindex(NC_MAX_DIMS)
+ Type(C_PTR)                    :: cmindexptr
+ Integer                        :: ndims
+
+ cncid   = ncid
+ cvarid  = varid - 1
+ crcode  = 0
+ rcode   = 0
+ cmindex = 0
+ cndims  = 0
+ ndims   = 0
+
+ cstatus = nc_inq_varndims(cncid, cvarid, cndims)
+
+ cmindexptr = C_NULL_PTR
+ ndims     = cndims 
+
+ If (cstatus == NC_NOERR) Then ! mimic f2c_coords in C code
+   If (ndims > 0) Then
+     cmindex(1:ndims) = mindex(ndims:1:-1) - 1
+   Endif
+   cmindexptr = C_LOC(cmindex)
+ Endif
+
+ Call c_ncvp1c(cncid, cvarid, cmindexptr, strings, crcode)
+
+ rcode = crcode
+
+ End Subroutine ncvp1c
+! ------------------------------- ncvpt --------------------------------------- 
+ Subroutine ncvpt(ncid, varid, start, counts, values, rcode) 
+
+ USE netcdf_nc_interfaces, ONLY: NC_MAX_DIMS, NC_NOERR, nc_inq_varndims
+ USE netcdf_fortv2_c_interfaces
+
+ Implicit NONE
+
+ Integer,                Intent(IN)          :: ncid, varid
+ Integer,                Intent(IN)          :: start(*), counts(*)
+ Character(KIND=C_CHAR), Intent(IN), TARGET  :: values(*)
+ Integer,                Intent(OUT)         :: rcode
+
+ Integer(KIND=C_INT)            :: cncid, crcode, cvarid, cstatus, cndims
+ Integer(KIND=C_SIZE_T), TARGET :: cstart(NC_MAX_DIMS), ccounts(NC_MAX_DIMS)
+ Type(C_PTR)                    :: cstartptr, ccountsptr
+ Type(C_PTR)                    :: cvaluesptr
+ Integer                        :: ndims
+
+ cncid   = ncid
+ cvarid  = varid - 1
+ crcode  = 0
+ rcode   = 0
+ cstart  = 0
+ ccounts = 0
+ cndims  = 0
+ ndims   = 0
+
+ cstatus = nc_inq_varndims(cncid, cvarid, cndims)
+
+ cstartptr  = C_NULL_PTR
+ ccountsptr = C_NULL_PTR
+ ndims      = cndims 
+
+ If (cstatus == NC_NOERR) Then ! mimic f2c_coords, etc. in C code
+   If (ndims > 0) Then
+     cstart(1:ndims)  = start(ndims:1:-1) - 1
+     ccounts(1:ndims) = counts(ndims:1:-1)
+   Endif
+   cstartptr  = C_LOC(cstart)
+   ccountsptr = C_LOC(ccounts) 
+ Endif
+
+ cvaluesptr = C_LOC(values)
+
+ Call c_ncvpt(cncid, cvarid, cstartptr, ccountsptr, cvaluesptr, crcode)
+
+ rcode = crcode
+
+ End Subroutine ncvpt
+! ------------------------------- ncvptc--------------------------------------- 
+ Subroutine ncvptc(ncid, varid, start, counts, strings, lenstr, rcode) 
+
+ USE netcdf_nc_interfaces, ONLY: NC_MAX_DIMS, NC_NOERR, nc_inq_varndims
+ USE netcdf_fortv2_c_interfaces
+
+ Implicit NONE
+
+ Integer,          Intent(IN)    :: ncid, varid, lenstr
+ Integer,          Intent(IN)    :: start(*), counts(*)
+ Character(LEN=*), Intent(INOUT) :: strings
+ Integer,          Intent(OUT)   :: rcode
+
+ Integer(KIND=C_INT)            :: cncid, crcode, cvarid, cstatus, cndims, &
+                                   clenstr
+ Integer(KIND=C_SIZE_T), TARGET :: cstart(NC_MAX_DIMS), ccounts(NC_MAX_DIMS)
+ Type(C_PTR)                    :: cstartptr, ccountsptr
+ Integer                        :: ndims
+
+ cncid   = ncid
+ cvarid  = varid - 1
+ clenstr = lenstr
+ crcode  = 0
+ rcode   = 0
+ cstart  = 0
+ ccounts = 0
+ cndims  = 0
+ ndims   = 0
+
+ cstatus = nc_inq_varndims(cncid, cvarid, cndims)
+
+ cstartptr  = C_NULL_PTR
+ ccountsptr = C_NULL_PTR
+ ndims      = cndims
+ 
+ If (cstatus == NC_NOERR) Then ! mimic f2c_coords, etc. in C code
+   If (ndims > 0) Then
+     cstart(1:ndims)  = start(ndims:1:-1) - 1
+     ccounts(1:ndims) = counts(ndims:1:-1)
+   Endif
+   cstartptr  = C_LOC(cstart)
+   ccountsptr = C_LOC(ccounts)
+ Endif
+
+ Call c_ncvptc(cncid, cvarid, cstartptr, ccountsptr, strings(1:lenstr),&
+               clenstr, crcode)
+
+ rcode = crcode
+
+ End Subroutine ncvptc
+! ------------------------------- ncvptg -------------------------------------- 
+ Subroutine ncvptg(ncid, varid, start, counts, strides, imap, values, &
+                   rcode) 
+
+ USE netcdf_nc_interfaces, ONLY: NC_MAX_DIMS, NC_NOERR, nc_inq_varndims
+ USE netcdf_fortv2_c_interfaces
+
+ Implicit NONE
+
+ Integer,                Intent(IN)          :: ncid, varid
+ Integer,                Intent(IN)          :: start(*), counts(*), &
+                                                strides(*), imap(*)
+ Character(KIND=C_CHAR), Intent(IN), TARGET  :: values(*)
+ Integer,                Intent(OUT)         :: rcode
+
+ Integer(KIND=C_INT)               :: cncid, crcode, cvarid, cstatus, cndims
+ Integer(KIND=C_SIZE_T),    TARGET :: cstart(NC_MAX_DIMS), ccounts(NC_MAX_DIMS)
+ Integer(KIND=C_PTRDIFF_T), TARGET :: cstrides(NC_MAX_DIMS), cimap(NC_MAX_DIMS)
+ Type(C_PTR)                       :: cstartptr, ccountsptr, cimapptr, &
+                                      cstridesptr
+ Type(C_PTR)                       :: cvaluesptr
+ Integer                           :: ndims, inullp
+
+ cncid   = ncid
+ cvarid  = varid - 1
+ crcode  = 0
+ rcode   = 0
+ cstart  = 0
+ ccounts = 0
+ cndims  = 0
+ ndims   = 0
+ inullp  = 0
+
+ Call convert_v2_imap(cncid, cvarid, imap, cimap, inullp)
+ 
+ cstatus = nc_inq_varndims(cncid, cvarid, cndims)
+
+ ndims       = cndims 
+ cstartptr   = C_NULL_PTR
+ ccountsptr  = C_NULL_PTR
+ cstridesptr = C_NULL_PTR
+ cimapptr    = C_LOC(cimap)
+ If (inullp /= 0) cimapptr = C_NULL_PTR
+ 
+ If (cstatus == NC_NOERR) Then ! mimic f2c_coords, etc. in C code
+   If (ndims > 0) Then
+     cstart(1:ndims)   = start(ndims:1:-1) - 1
+     ccounts(1:ndims)  = counts(ndims:1:-1)
+     cstrides(1:ndims) = strides(ndims:1:-1) - 1
+   Endif
+   cstartptr   = C_LOC(cstart)
+   ccountsptr  = C_LOC(ccounts)
+   cstridesptr = C_LOC(cstrides)
+ Endif
+
+ cvaluesptr = C_LOC(values)
+
+ Call c_ncvptg(cncid, cvarid, cstartptr, ccountsptr, cstridesptr, &
+               cimapptr, cvaluesptr, crcode)
+
+ rcode = crcode
+
+ End Subroutine ncvptg
+! ------------------------------- ncvpgc -------------------------------------- 
+ Subroutine ncvpgc(ncid, varid, start, counts, strides, imap, string, rcode) 
+
+ USE netcdf_nc_interfaces, ONLY: NC_MAX_DIMS, NC_NOERR, nc_inq_varndims
+ USE netcdf_fortv2_c_interfaces
+
+ Implicit NONE
+
+ Integer,          Intent(IN)  :: ncid, varid
+ Integer,          Intent(IN)  :: start(*), counts(*), strides(*), imap(*)
+ Character(LEN=*), Intent(IN)  :: string
+ Integer,          Intent(OUT) :: rcode
+
+ Integer(KIND=C_INT)               :: cncid, crcode, cvarid, cstatus, cndims
+ Integer(KIND=C_SIZE_T),    TARGET :: cstart(NC_MAX_DIMS), ccounts(NC_MAX_DIMS)
+ Integer(KIND=C_PTRDIFF_T), TARGET :: cstrides(NC_MAX_DIMS), cimap(NC_MAX_DIMS)
+ Type(C_PTR)                       :: cstartptr, ccountsptr, cstridesptr, &
+                                      cimapptr
+ Integer                           :: ndims, inullp
+
+ cncid   = ncid
+ cvarid  = varid - 1
+ crcode  = 0
+ rcode   = 0
+ cstart  = 0
+ ccounts = 0
+ cndims  = 0
+ ndims   = 0
+ inullp  = 0
+
+ Call convert_v2_imap(cncid, cvarid, imap, cimap, inullp)
+
+ cstatus = nc_inq_varndims(cncid, cvarid, cndims)
+
+ ndims       = cndims 
+ cstartptr   = C_NULL_PTR
+ ccountsptr  = C_NULL_PTR
+ cstridesptr = C_NULL_PTR
+ cimapptr    = C_LOC(cimap)
+ If (inullp /= 0) cimapptr = C_NULL_PTR
+
+ If (cstatus == NC_NOERR) Then ! mimic f2c_coords, etc. in C code
+   If (ndims > 0) Then
+     cstart(1:ndims)   = start(ndims:1:-1) - 1
+     ccounts(1:ndims)  = counts(ndims:1:-1)
+     cstrides(1:ndims) = strides(ndims:1:-1) - 1
+   Endif
+   cstartptr   = C_LOC(cstart)
+   ccountsptr  = C_LOC(ccounts)
+   cstridesptr = C_LOC(cstrides)
+ Endif
+
+ Call c_ncvpgc(cncid, cvarid, cstartptr, ccountsptr, cstridesptr, &
+               cimapptr, string, crcode)
+
+ rcode = crcode
+
+ End Subroutine ncvpgc
+! ------------------------------- ncvgt1 -------------------------------------- 
+ Subroutine ncvgt1(ncid, varid, mindex, values, rcode) 
+
+ USE netcdf_nc_interfaces, ONLY: NC_MAX_DIMS, NC_NOERR, nc_inq_varndims
+ USE netcdf_fortv2_c_interfaces
+
+ Implicit NONE
+
+ Integer,                Intent(IN)  :: ncid, varid
+ Integer,                Intent(IN)  :: mindex(*)
+ Character(KIND=C_CHAR), Intent(OUT) :: values(*)
+ Integer,                Intent(OUT) :: rcode
+
+ Integer(KIND=C_INT)            :: cncid, crcode, cvarid, cstatus, cndims
+ Integer(KIND=C_SIZE_T), TARGET :: cmindex(NC_MAX_DIMS)
+ Type(C_PTR)                    :: cmindexptr
+ Integer                        :: ndims
+
+ cncid   = ncid
+ cvarid  = varid - 1
+ crcode  = 0
+ rcode   = 0
+ cmindex = 0
+ cndims  = 0
+ ndims   = 0
+
+ cstatus = nc_inq_varndims(cncid, cvarid, cndims)
+
+ cmindexptr = C_NULL_PTR
+ ndims      = cndims
+ 
+ If (cstatus == NC_NOERR) Then ! mimic f2c_coords in C code
+   If (ndims > 0) Then
+     cmindex(1:ndims) = mindex(ndims:1:-1) - 1
+   Endif
+   cmindexptr = C_LOC(cmindex)
+ Endif
+
+ Call c_ncvgt1(cncid, cvarid, cmindexptr, values, crcode)
+
+ rcode = crcode
+
+ End Subroutine ncvgt1
+! ------------------------------- ncvg1c -------------------------------------- 
+ Subroutine ncvg1c(ncid, varid, mindex, string, rcode) 
+
+ USE netcdf_nc_interfaces, ONLY: NC_MAX_DIMS, NC_NOERR, nc_inq_varndims
+ USE netcdf_fortv2_c_interfaces
+
+ Implicit NONE
+
+ Integer,          Intent(IN)    :: ncid, varid
+ Integer,          Intent(IN)    :: mindex(*)
+ Character(LEN=*), Intent(INOUT) :: string
+ Integer,          Intent(OUT)   :: rcode
+
+ Integer(KIND=C_INT)            :: cncid, crcode, cvarid, cstatus, cndims
+ Integer(KIND=C_SIZE_T), TARGET :: cmindex(NC_MAX_DIMS)
+ Type(C_PTR)                    :: cmindexptr
+ Integer                        :: ndims
+
+ cncid   = ncid
+ cvarid  = varid - 1
+ crcode  = 0
+ rcode   = 0
+ cmindex = 0
+ cndims  = 0
+ ndims   = 0
+
+ cstatus = nc_inq_varndims(cncid, cvarid, cndims)
+
+ cmindexptr = C_NULL_PTR
+ ndims      = cndims
+ 
+ If (cstatus == NC_NOERR) Then ! mimic f2c_coords in C code
+   If (ndims > 0) Then
+     cmindex(1:ndims) = mindex(ndims:1:-1) - 1
+   Endif
+   cmindexptr = C_LOC(cmindex)
+ Endif
+
+ Call c_ncvg1c(cncid, cvarid, cmindexptr, string, crcode)
+
+ rcode = crcode
+
+ End Subroutine ncvg1c
+! ------------------------------- ncvgt --------------------------------------- 
+ Subroutine ncvgt(ncid, varid, start, counts, values, rcode) 
+
+ USE netcdf_nc_interfaces, ONLY: NC_MAX_DIMS, NC_NOERR, nc_inq_varndims
+ USE netcdf_fortv2_c_interfaces
+
+ Implicit NONE
+
+ Integer,                Intent(IN)  :: ncid, varid
+ Integer,                Intent(IN)  :: start(*), counts(*)
+ Character(KIND=C_CHAR), Intent(OUT) :: values(*)
+ Integer,                Intent(OUT) :: rcode
+
+ Integer(KIND=C_INT)            :: cncid, crcode, cvarid, cstatus, cndims
+ Integer(KIND=C_SIZE_T), TARGET :: cstart(NC_MAX_DIMS), ccounts(NC_MAX_DIMS)
+ Type(C_PTR)                    :: cstartptr, ccountsptr
+ Integer                        :: ndims
+
+ cncid   = ncid
+ cvarid  = varid - 1
+ crcode  = 0
+ rcode   = 0
+ cstart  = 0
+ ccounts = 0
+ cndims  = 0
+ ndims   = 0
+
+ cstatus = nc_inq_varndims(cncid, cvarid, cndims)
+
+ cstartptr  = C_NULL_PTR
+ ccountsptr = C_NULL_PTR
+ ndims      = cndims
+ 
+ If (cstatus == NC_NOERR) Then ! mimic f2c_coords, etc. in C code
+   If (ndims > 0) Then
+     cstart(1:ndims)  = start(ndims:1:-1) - 1
+     ccounts(1:ndims) = counts(ndims:1:-1)
+   Endif
+   cstartptr  = C_LOC(cstart)
+   ccountsptr = C_LOC(ccounts)
+ Endif
+
+ Call c_ncvgt(cncid, cvarid, cstartptr, ccountsptr, values, crcode)
+
+ rcode = crcode
+
+ End Subroutine ncvgt
+! ------------------------------- ncvgtc -------------------------------------- 
+ Subroutine ncvgtc(ncid, varid, start, counts, string, lenstr, rcode) 
+
+ USE netcdf_nc_interfaces, ONLY: NC_MAX_DIMS, NC_NOERR, nc_inq_varndims
+ USE netcdf_fortv2_c_interfaces
+
+ Implicit NONE
+
+ Integer,          Intent(IN)    :: ncid, varid, lenstr
+ Integer,          Intent(IN)    :: start(*), counts(*)
+ Character(LEN=*), Intent(INOUT) :: string
+ Integer,          Intent(OUT)   :: rcode
+
+ Integer(KIND=C_INT)            :: cncid, crcode, cvarid, cstatus, cndims, &
+                                   clenstr
+ Integer(KIND=C_SIZE_T), TARGET :: cstart(NC_MAX_DIMS), ccounts(NC_MAX_DIMS)
+ Type(C_PTR)                    :: cstartptr, ccountsptr
+ Character(LEN=lenstr+1)        :: cstring
+ Integer                        :: ndims, slen
+
+ cncid   = ncid
+ cvarid  = varid - 1
+ clenstr = lenstr
+ crcode  = 0
+ rcode   = 0
+ cstart  = 0
+ ccounts = 0
+ cndims  = 0
+ ndims   = 0
+ string  = REPEAT(" ", LEN(string))
+ cstring = REPEAT(" ", LEN(cstring))
+
+ cstatus = nc_inq_varndims(cncid, cvarid, cndims)
+
+ cstartptr  = C_NULL_PTR
+ ccountsptr = C_NULL_PTR
+ ndims      = cndims
+ 
+ If (cstatus == NC_NOERR) Then ! mimic f2c_coords, etc. in C code
+   If (ndims > 0) Then
+     cstart(1:ndims)  = start(ndims:1:-1) - 1
+     ccounts(1:ndims) = counts(ndims:1:-1)
+   Endif
+   cstartptr  = C_LOC(cstart)
+   ccountsptr = C_LOC(ccounts)
+ Endif
+
+ Call c_ncvgtc(cncid, cvarid, cstartptr, ccountsptr, cstring, clenstr, crcode)
+
+ If (LEN(string) >= lenstr) Then
+   string(1:lenstr) = cstring(1:lenstr)
+ Else
+   slen           = LEN(string)
+   string(1:slen) = cstring(1:slen)
+ EndIf
+
+ rcode = crcode
+
+ End Subroutine ncvgtc
+! ------------------------------- ncvgtg -------------------------------------- 
+ Subroutine ncvgtg(ncid, varid, start, counts, strides, imap, values, &
+                   rcode) 
+
+ USE netcdf_nc_interfaces, ONLY: NC_MAX_DIMS, NC_NOERR, nc_inq_varndims
+ USE netcdf_fortv2_c_interfaces
+
+ Implicit NONE
+
+ Integer,                Intent(IN)  :: ncid, varid
+ Integer,                Intent(IN)  :: start(*), counts(*), strides(*), imap(*)
+ Character(KIND=C_CHAR), Intent(OUT) :: values(*)
+ Integer,                Intent(OUT) :: rcode
+
+ Integer(KIND=C_INT)               :: cncid, crcode, cvarid, cstatus, cndims
+ Integer(KIND=C_SIZE_T),    TARGET :: cstart(NC_MAX_DIMS), ccounts(NC_MAX_DIMS)
+ Integer(KIND=C_PTRDIFF_T), TARGET :: cstrides(NC_MAX_DIMS), cimap(NC_MAX_DIMS)
+ Type(C_PTR)                       :: cstartptr, ccountsptr, cimapptr, &
+                                      cstridesptr
+ Integer                           :: ndims, inullp
+
+ cncid   = ncid
+ cvarid  = varid - 1
+ crcode  = 0
+ rcode   = 0
+ cstart  = 0
+ ccounts = 0
+ cndims  = 0
+ inullp  = 0
+
+ Call convert_v2_imap(cncid, cvarid, imap, cimap, inullp)
+ cstatus = nc_inq_varndims(cncid, cvarid, cndims)
+
+ cstartptr   = C_NULL_PTR
+ ccountsptr  = C_NULL_PTR
+ cstridesptr = C_NULL_PTR
+ cimapptr    = C_LOC(cimap)
+ ndims       = cndims 
+ If (inullp /= 0) cimapptr = C_NULL_PTR
+
+ If (cstatus == NC_NOERR) Then ! mimic f2c_coords, etc. in C code
+   If (ndims > 0) Then
+     cstart(1:ndims)   = start(ndims:1:-1) - 1
+     ccounts(1:ndims)  = counts(ndims:1:-1)
+     cstrides(1:ndims) = strides(ndims:1:-1) - 1
+   Endif
+   cstartptr   = C_LOC(cstart)
+   ccountsptr  = C_LOC(ccounts)
+   cstridesptr = C_LOC(cstrides)
+ Endif
+
+ Call c_ncvgtg(cncid, cvarid, cstartptr, ccountsptr, cstridesptr, &
+               cimapptr, values, crcode)
+
+ rcode = crcode
+
+ End Subroutine ncvgtg
+! ------------------------------- ncvggc -------------------------------------- 
+ Subroutine ncvggc(ncid, varid, start, counts, strides, imap, string, rcode) 
+
+ USE netcdf_nc_interfaces, ONLY: NC_MAX_DIMS, NC_NOERR, nc_inq_varndims
+ USE netcdf_fortv2_c_interfaces
+
+ Implicit NONE
+
+ Integer,          Intent(IN)    :: ncid, varid
+ Integer,          Intent(IN)    :: start(*), counts(*), strides(*), imap(*)
+ Character(LEN=*), Intent(INOUT) :: string
+ Integer,          Intent(OUT)   :: rcode
+
+ Integer(KIND=C_INT)               :: cncid, crcode, cvarid, cstatus, cndims
+ Integer(KIND=C_SIZE_T),    TARGET :: cstart(NC_MAX_DIMS), ccounts(NC_MAX_DIMS)
+ Integer(KIND=C_PTRDIFF_T), TARGET :: cstrides(NC_MAX_DIMS), cimap(NC_MAX_DIMS)
+ Character(LEN=(LEN(string)+1))    :: cstring
+ Type(C_PTR)                       :: cstartptr, ccountsptr, cstridesptr, &
+                                      cimapptr
+ Integer                           :: ndims, inullp,slen
+
+ cncid   = ncid
+ cvarid  = varid - 1
+ crcode  = 0
+ rcode   = 0
+ cstart  = 0
+ ccounts = 0
+ cndims  = 0
+ ndims   = 0
+ inullp  = 0
+ string  = REPEAT(" ", LEN(string))
+ cstring = REPEAT(" ", LEN(cstring)) 
+
+ Call convert_v2_imap(cncid, cvarid, imap, cimap, inullp)
+
+ cstatus = nc_inq_varndims(cncid, cvarid, cndims)
+
+ cstartptr   = C_NULL_PTR
+ ccountsptr  = C_NULL_PTR
+ cstridesptr = C_NULL_PTR
+ cimapptr    = C_LOC(cimap)
+ ndims       = cndims 
+ If (inullp /= 0) cimapptr = C_NULL_PTR
+
+ If (cstatus == NC_NOERR) Then ! mimic f2c_coords, etc. in C code
+   If (ndims > 0) Then
+     cstart(1:ndims)   = start(ndims:1:-1) - 1
+     ccounts(1:ndims)  = counts(ndims:1:-1)
+     cstrides(1:ndims) = strides(ndims:1:-1) - 1
+   Endif
+   cstartptr   = C_LOC(cstart)
+   ccountsptr  = C_LOC(ccounts)
+   cstridesptr = C_LOC(cstrides)
+ Endif
+
+ Call c_ncvggc(cncid, cvarid, cstartptr, ccountsptr, cstridesptr, &
+               cimapptr, cstring, crcode)
+
+ slen           = LEN(string)
+ string(1:slen) = cstring(1:slen)
+
+ rcode = crcode
+
+ End Subroutine ncvggc
+!-------------------------------- ncvren --------------------------------------
+ Subroutine ncvren(ncid, varid, newnam, rcode)
+
+ USE netcdf_fortv2_c_interfaces
+
+ Implicit NONE
+
+ Character(LEN=*), Intent(IN)  :: newnam
+ Integer,          Intent(IN)  :: ncid, varid
+ Integer,          Intent(OUT) :: rcode
+
+ Character(LEN=(LEN(newnam)+1)) :: cnewnam
+ Integer(KIND=C_INT)            :: cncid, cvarid, crcode
+ Integer                        :: ilen
+
+ cncid  = ncid
+ cvarid = varid - 1
+ rcode  = 0
+
+! check for a null character on end of newnam
+
+ cnewnam = addCNullChar(newnam, ilen)
+ 
+ Call c_ncvren(cncid, cvarid, cnewnam(1:ilen+1), crcode )
+
+ rcode = crcode 
+
+ End Subroutine ncvren
+!-------------------------------- ncapt ---------------------------------------
+ Subroutine ncapt(ncid, varid, attnam, attype, attlen, value, rcode)
+
+ USE netcdf_fortv2_c_interfaces
+
+ Implicit NONE
+
+ Character(LEN=*),       Intent(IN)          :: attnam
+ Integer,                Intent(IN)          :: ncid, varid, attype, attlen
+ Character(KIND=C_CHAR), Intent(IN), TARGET  :: value(*)
+ Integer,                Intent(OUT)         :: rcode
+
+ Integer(KIND=C_INT)            :: cncid, cvarid, cattype, crcode
+ Integer(KIND=C_SIZE_T)         :: cattlen
+ Type(C_PTR)                    :: cvalueptr
+ Character(LEN=(LEN(attnam)+1)) :: cattnam
+ Integer                        :: ilen
+
+ cncid   = ncid
+ cvarid  = varid - 1
+ cattype = attype
+ cattlen = attlen
+ rcode   = 0
+
+! check for a null character on end of attname
+
+ cattnam = addCNullChar(attnam, ilen)
+ 
+ cvalueptr = C_LOC(value)
+ 
+ Call c_ncapt(cncid, cvarid, cattnam(1:ilen+1), cattype, &
+              cattlen, cvalueptr, crcode )
+
+ rcode = crcode 
+
+ End Subroutine ncapt
+!-------------------------------- ncaptc ------------------------------------
+ Subroutine ncaptc(ncid, varid, attnam, attype, lenstr, string, rcode)
+
+ USE netcdf_fortv2_c_interfaces
+
+ Implicit NONE
+
+ Character(LEN=*), Intent(IN)  :: attnam
+ Integer,          Intent(IN)  :: ncid, varid, attype, lenstr
+ Character(LEN=*), Intent(IN)  :: string 
+ Integer,          Intent(OUT) :: rcode
+
+ Integer(KIND=C_INT)            :: cncid, cvarid, cattype, crcode
+ Integer(KIND=C_SIZE_T)         :: clenstr
+ Character(LEN=(LEN(attnam)+1)) :: cattnam
+ Integer                        :: ilen
+
+ cncid   = ncid
+ cvarid  = varid - 1
+ cattype = attype
+ clenstr = lenstr
+ rcode   = 0
+
+! check for a null character on end of attname
+
+ cattnam = addCNullChar(attnam, ilen)
+ 
+ Call c_ncaptc(cncid, cvarid, cattnam(1:ilen+1), cattype, &
+               clenstr, string, crcode )
+
+ rcode = crcode 
+
+ End Subroutine ncaptc
+!-------------------------------- ncainq --------------------------------------
+ Subroutine ncainq(ncid, varid, attnam, attype, attlen, rcode)
+
+ USE netcdf_fortv2_c_interfaces
+
+ Implicit NONE
+
+ Character(LEN=*), Intent(IN)  :: attnam
+ Integer,          Intent(IN)  :: ncid, varid
+ Integer,          Intent(OUT) :: attype, attlen, rcode
+
+ Integer(KIND=C_INT)            :: cncid, cvarid, cattype, crcode, cattlen
+ Character(LEN=(LEN(attnam)+1)) :: cattnam
+ Integer                        :: ilen
+
+ cncid   = ncid
+ cvarid  = varid - 1
+ cattype = 0
+ cattlen = 0
+ rcode   = 0
+
+! check for a null character on end of attnam
+
+ cattnam = addCNullChar(attnam, ilen)
+
+ Call c_ncainq(cncid, cvarid, cattnam(1:ilen+1), cattype, &
+             cattlen, crcode )
+
+ attype = cattype
+ attlen = cattlen
+ rcode  = crcode
+
+ End Subroutine ncainq
+!-------------------------------- ncagt ---------------------------------------
+ Subroutine ncagt(ncid, varid, attnam, values, rcode)
+
+ USE netcdf_fortv2_c_interfaces
+
+ Implicit NONE
+
+ Character(LEN=*),       Intent(IN)  :: attnam
+ Integer,                Intent(IN)  :: ncid, varid
+ Character(KIND=C_CHAR), Intent(OUT) :: values(*)
+ Integer,                Intent(OUT) :: rcode
+
+ Integer(KIND=C_INT)            :: cncid, cvarid, crcode
+ Character(LEN=(LEN(attnam)+1)) :: cattnam
+ Integer                        :: ilen
+
+ cncid  = ncid
+ cvarid = varid - 1
+ rcode  = 0
+
+! check for a null character on end of attnam
+
+ cattnam = addCNullChar(attnam, ilen)
+ 
+ Call c_ncagt(cncid, cvarid, cattnam(1:ilen+1), values, crcode)
+
+ rcode = crcode
+
+ End Subroutine ncagt
+!-------------------------------- ncagtc --------------------------------------
+ Subroutine ncagtc(ncid, varid, attnam, string, lenstr, rcode)
+
+ USE netcdf_fortv2_c_interfaces
+
+ Implicit NONE
+
+ Character(LEN=*), Intent(IN)    :: attnam
+ Integer,          Intent(IN)    :: ncid, varid, lenstr
+ Character(LEN=*), Intent(INOUT) :: string 
+ Integer,          Intent(OUT)   :: rcode
+
+ Integer(KIND=C_INT)            :: cncid, cvarid, crcode
+ Character(LEN=(LEN(attnam)+1)) :: cattnam
+ Character(LEN=(lenstr+1))      :: cstring
+ Integer                        :: ilen
+
+ cncid   = ncid
+ cvarid  = varid - 1
+ rcode   = 0
+ string  = REPEAT(" ", LEN(string))
+ cstring = REPEAT(" ", LEN(cstring))
+
+! check for a null character on end of attnam
+
+ cattnam = addCNullChar(attnam, ilen)
+ 
+ Call c_ncagtc(cncid, cvarid, cattnam(1:ilen+1), cstring, lenstr, &
+               crcode)
+
+ string(1:lenstr) = cstring(1:lenstr)
+
+ rcode = crcode
+
+ End Subroutine ncagtc
+!-------------------------------- ncacpy --------------------------------------
+ Subroutine ncacpy(ncid, varid, attnam, outcdf, outvar, rcode)
+
+ USE netcdf_fortv2_c_interfaces
+
+ Implicit NONE
+
+ Character(LEN=*), Intent(IN)  :: attnam
+ Integer,          Intent(IN)  :: ncid, varid, outcdf, outvar
+ Integer,          Intent(OUT) :: rcode
+
+ Integer(KIND=C_INT)            :: cncid, cvarid, coutcdf, coutvar, crcode
+ Character(LEN=(LEN(attnam)+1)) :: cattnam
+ Integer                        :: ilen
+
+ cncid   = ncid
+ cvarid  = varid - 1
+ coutcdf = outcdf
+ coutvar = outvar-1
+ rcode   = 0
+
+! check for a null character on end of attnam
+
+ cattnam = addCNullChar(attnam, ilen)
+ 
+ Call c_ncacpy(cncid, cvarid, cattnam(1:ilen+1), coutcdf, &
+               coutvar, crcode)
+
+ rcode = crcode
+
+ End Subroutine ncacpy
+!-------------------------------- ncanam --------------------------------------
+ Subroutine ncanam(ncid, varid, attnum, attnam, rcode)
+
+ USE netcdf_nc_interfaces, ONLY: NC_MAX_NAME
+ USE netcdf_fortv2_c_interfaces
+
+ Implicit NONE
+
+ Character(LEN=*), Intent(INOUT) :: attnam
+ Integer,          Intent(IN)    :: ncid, varid, attnum
+ Integer,          Intent(OUT)   :: rcode
+
+ Integer                      :: ilen
+ Integer(KIND=C_INT)          :: cncid, cvarid, cattnum, crcode
+ Character(LEN=NC_MAX_NAME+1) :: cattnam
+
+ cncid = ncid
+ cvarid = varid - 1
+ cattnum = attnum - 1
+ rcode = 0
+ cattnam = REPEAT(" ", LEN(cattnam))
+ ilen = LEN(attnam)
+
+ Call c_ncanam(cncid, cvarid, cattnum, cattnam, crcode)
+
+! check for a null character on end of cattnam
+
+ attnam = stripCNullChar(cattnam, ilen)
+ 
+ rcode = crcode
+
+ End Subroutine ncanam
+!-------------------------------- ncaren --------------------------------------
+ Subroutine ncaren(ncid, varid, attnam, newnam, rcode)
+
+ USE netcdf_fortv2_c_interfaces
+
+ Implicit NONE
+
+ Character(LEN=*), Intent(IN)  :: attnam, newnam
+ Integer,          Intent(IN)  :: ncid, varid
+ Integer,          Intent(OUT) :: rcode
+
+ Integer(KIND=C_INT)            :: cncid, cvarid, crcode
+ Character(LEN=(LEN(attnam)+1)) :: cattnam
+ Character(LEN=(LEN(newnam)+1)) :: cnewnam
+ Integer                        :: ilen, ilen2
+
+ cncid  = ncid
+ cvarid = varid - 1
+ rcode  = 0
+
+! check for a null character on end of attnam and newnam
+
+ cattnam = addCNullChar(attnam, ilen)
+ 
+ cnewnam = addCNullChar(newnam, ilen2)
+ 
+ Call c_ncaren(cncid, cvarid, cattnam(1:ilen+1), cnewnam(1:ilen2+1), crcode) 
+
+ rcode = crcode
+
+ End Subroutine ncaren
+!-------------------------------- ncadel --------------------------------------
+ Subroutine ncadel(ncid, varid, attnam, rcode)
+
+ USE netcdf_fortv2_c_interfaces
+
+ Implicit NONE
+
+ Character(LEN=*), Intent(IN)  :: attnam
+ Integer,          Intent(IN)  :: ncid, varid
+ Integer,          Intent(OUT) :: rcode
+
+ Integer(KIND=C_INT)            :: cncid, cvarid, crcode
+ Character(LEN=(LEN(attnam)+1)) :: cattnam
+ Integer                        :: ilen
+
+ cncid  = ncid
+ cvarid = varid - 1
+ rcode  = 0
+
+! check for a null character on end of attnam
+
+ cattnam = addCNullChar(attnam, ilen)
+ 
+ Call c_ncadel(cncid, cvarid, cattnam(1:ilen+1),crcode)
+
+ rcode = crcode
+
+ End Subroutine ncadel
+!-------------------------------- ncsfil --------------------------------------
+ Function ncsfil(ncid, fillmode, rcode) RESULT(currentmode)
+
+ USE netcdf_fortv2_c_interfaces
+
+ Implicit NONE
+
+ Integer, Intent(IN)  :: ncid, fillmode
+ Integer, Intent(OUT) :: rcode
+
+ Integer              :: currentmode
+
+ Integer(KIND=C_INT) :: cncid, cfillmode, crcode, cstatus  
+
+ cncid     = ncid
+ cfillmode = fillmode
+
+ cstatus     = c_ncsfil(cncid, cfillmode, crcode)
+ rcode       = crcode
+ currentmode = cstatus
+
+ End Function ncsfil
diff --git a/fortran/nf_genatt.f90 b/fortran/nf_genatt.f90
new file mode 100755
index 0000000..41363d5
--- /dev/null
+++ b/fortran/nf_genatt.f90
@@ -0,0 +1,304 @@
+!---------- Routines for defining and obtaining info about attributes --------
+
+! Replacement for fort-genatt.c
+
+! Written by: Richard Weed, Ph.D.
+!             Center for Advanced Vehicular Systems 
+!             Mississippi State University
+!             rweed at cavs.msstate.edu
+
+! License (and other Lawyer Language)
+ 
+! This software is released under the Apache 2.0 Open Source License. The
+! full text of the License can be viewed at :
+!
+!   http:www.apache.org/licenses/LICENSE-2.0.html
+!
+! The author grants to the University Corporation for Atmospheric Research
+! (UCAR), Boulder, CO, USA the right to revise and extend the software
+! without restriction. However, the author retains all copyrights and
+! intellectual property rights explicitly stated in or implied by the
+! Apache license
+
+! Version 1.: Sept. 2005 - Initial Cray X1 version
+! Version 2.: May   2006 - Updated to support g95
+! Version 3.: April 2009 - Updated for netCDF 4.0.1
+! Version 4.: April 2010 - Updated for netCDF 4.1.1
+! Version 5.: May   2014 - Ensure return error status checked from C API calls          
+         
+!-------------------------------- nf_inq_att ---------------------------------
+ Function nf_inq_att(ncid, varid, name, xtype, nlen) RESULT(status)
+
+! Get attribute data type and length for a given varid and name
+
+ USE netcdf_nc_interfaces
+
+ Implicit NONE
+
+ Integer,          Intent(IN)  :: ncid, varid
+ Character(LEN=*), Intent(IN)  :: name
+ Integer,          Intent(OUT) :: nlen, xtype
+
+ Integer                       :: status
+
+ Integer(KIND=C_INT)          :: cncid, cstatus, cvarid
+ Integer(KIND=C_SIZE_T)       :: cnlen
+ Integer(KIND=C_INT)          :: cxtype
+ Character(LEN=(LEN(name)+1)) :: cname
+ Integer                      :: ie
+
+ cncid  = ncid
+ cvarid = varid - 1 ! Subtract 1 to get C varid
+
+! Check to see if a C null character was added to name in calling program
+
+ cname = addCNullChar(name, ie)
+
+ cstatus = nc_inq_att(cncid, cvarid, cname(1:ie+1), cxtype, cnlen)
+
+ If (cstatus == NC_NOERR) Then
+    xtype = cxtype
+    nlen  = cnlen
+ EndIf
+ status = cstatus
+
+ End Function nf_inq_att
+!-------------------------------- nf_inq_atttype ---------------------------
+ Function nf_inq_atttype(ncid, varid, name, xtype) RESULT(status)
+
+! Get attribute type for a given varid and name
+
+ USE netcdf_nc_interfaces
+
+ Implicit NONE
+
+ Integer,          Intent(IN)  :: ncid, varid
+ Character(LEN=*), Intent(IN)  :: name
+ Integer,          Intent(OUT) :: xtype
+
+ Integer                       :: status
+
+ Integer(KIND=C_INT)          :: cncid, cstatus, cvarid
+ Integer(KIND=C_INT)          :: cxtype
+ Character(LEN=(LEN(name)+1)) :: cname
+ Integer                      :: ie
+
+ cncid  = ncid
+ cvarid = varid - 1 ! Subtract 1 to get C varid
+
+! Check to see if a C null character was added to name in calling program
+
+ cname = addCNullChar(name, ie)
+
+ cstatus = nc_inq_atttype(cncid, cvarid, cname(1:ie+1), cxtype)
+
+ If (cstatus == NC_NOERR) Then
+    xtype = cxtype
+ EndIf
+ status = cstatus
+
+ End Function nf_inq_atttype
+!-------------------------------- nf_inq_attlen ----------------------------
+ Function nf_inq_attlen(ncid, varid, name, nlen) RESULT(status)
+
+! Get attribute length for a given varid and name
+
+ USE netcdf_nc_interfaces
+
+ Implicit NONE
+
+ Integer,          Intent(IN)  :: ncid, varid
+ Character(LEN=*), Intent(IN)  :: name
+ Integer,          Intent(OUT) :: nlen
+
+ Integer                       :: status
+
+ Integer(KIND=C_INT)          :: cncid, cstatus, cvarid
+ Integer(KIND=C_SIZE_T)       :: cnlen
+ Character(LEN=(LEN(name)+1)) :: cname
+ Integer                      :: ie
+
+ cncid  = ncid
+ cvarid = varid - 1 ! Subtract 1 to get C varid
+
+! Check to see if a C null character was added to name in calling program
+
+ cname = addCNullChar(name, ie)
+
+ cstatus = nc_inq_attlen(cncid, cvarid, cname(1:ie+1), cnlen)
+
+ If (cstatus == NC_NOERR) Then
+    nlen = cnlen
+ EndIf
+ status = cstatus
+
+ End Function nf_inq_attlen
+!-------------------------------- nf_inq_attid -----------------------------
+ Function nf_inq_attid(ncid, varid, name, attnum) RESULT(status)
+
+! Get attribute id for a given varid and name
+
+ USE netcdf_nc_interfaces
+
+ Implicit NONE
+
+ Integer,          Intent(IN)  :: ncid, varid
+ Character(LEN=*), Intent(IN)  :: name
+ Integer,          Intent(OUT) :: attnum
+
+ Integer                       :: status
+
+ Integer(KIND=C_INT)          :: cncid, cstatus, cattnum, cvarid
+ Character(LEN=(LEN(name)+1)) :: cname
+ Integer                      :: ie
+
+ cncid  = ncid
+ cvarid = varid - 1 ! Subtract 1 to get C varid
+
+! Check to see if a C null character was added to name in calling program
+
+ cname = addCNullChar(name, ie)
+
+ cstatus = nc_inq_attid(cncid, cvarid, cname(1:ie+1), cattnum)
+ 
+ If (cstatus == NC_NOERR) Then
+    attnum = cattnum + 1 ! add 1 to get FORTRAN att id
+ EndIf
+ status = cstatus
+
+ End Function nf_inq_attid
+!-------------------------------- nf_inq_attname ---------------------------
+ Function nf_inq_attname(ncid, varid, attnum, name) RESULT(status)
+
+! Get attribute name for a given varid and attribute number
+
+ USE netcdf_nc_interfaces
+
+ Implicit NONE
+
+ Integer,          Intent(IN)  :: ncid, varid, attnum
+ Character(LEN=*), Intent(OUT) :: name
+
+ Integer                       :: status
+
+ Integer(KIND=C_INT)          :: cncid, cstatus, cattnum, cvarid
+ Character(LEN=(LEN(name)+1)) :: tmpname
+ Integer                      :: nlen
+
+ cncid   = ncid
+ cvarid  = varid - 1 ! Subtract 1 to get C varid and att num
+ cattnum = attnum - 1
+ nlen    = LEN(name)
+ name    = REPEAT(" ",nlen)
+ tmpname = REPEAT(" ",LEN(tmpname)) ! init to blanks
+
+ cstatus = nc_inq_attname(cncid, cvarid, cattnum, tmpname)
+
+ If (cstatus == NC_NOERR) Then
+    ! Strip of any C null characters and load only the part
+    ! of tmpname that will fit in name
+
+    name = stripCNullChar(tmpname, nlen)
+ EndIf
+ status = cstatus
+
+ End Function nf_inq_attname
+!-------------------------------- nf_copy_att ------------------------------
+ Function nf_copy_att(ncid_in, varid_in, name, ncid_out, varid_out) &
+                      RESULT(status)
+
+! Copy attribute name with varid_in from one netcdf file to another
+! with new varid_out 
+
+ USE netcdf_nc_interfaces
+
+ Implicit NONE
+
+ Integer,          Intent(IN) :: ncid_in, varid_in, ncid_out, varid_out 
+ Character(LEN=*), Intent(IN) :: name
+
+ Integer                      :: status
+
+ Integer(KIND=C_INT)          :: cncidin, cncidout,cvaridin, cvaridout, cstatus
+ Character(LEN=(LEN(name)+1)) :: cname
+ Integer                      :: ie
+
+ cncidin   = ncid_in
+ cvaridin  = varid_in - 1
+ cncidout  = ncid_out
+ cvaridout = varid_out - 1
+
+! Check to see if a C null character was added to name in calling program
+
+ cname = addCNullChar(name, ie)
+
+ cstatus = nc_copy_att(cncidin, cvaridin, cname(1:ie+1), &
+                       cncidout, cvaridout)
+
+ status = cstatus
+
+ End Function nf_copy_att
+!-------------------------------- nf_rename_att ----------------------------
+ Function nf_rename_att(ncid, varid, name, newname) RESULT(status)
+
+! Rename an attribute to newname givin varid 
+
+ USE netcdf_nc_interfaces
+
+ Implicit NONE
+
+ Integer,          Intent(IN) :: ncid, varid
+ Character(LEN=*), Intent(IN) :: name, newname
+
+ Integer                      :: status
+
+ Integer(KIND=C_INT)             :: cncid, cvarid, cstatus
+ Character(LEN=(LEN(name)+1))    :: cname 
+ Character(LEN=(LEN(newname)+1)) :: cnewname 
+ Integer                         :: ie1, ie2, inull
+
+ cncid  = ncid
+ cvarid = varid - 1 ! Subtract 1 to get C varid
+
+! Check to see if a C null character was added to name and newname 
+! in calling program
+
+ cname = addCNullChar(name, ie1)
+
+ cnewname = addCNullChar(newname, ie2)
+
+ cstatus = nc_rename_att(cncid, cvarid, cname(1:ie1+1), cnewname(1:ie2+1))
+
+ status = cstatus
+
+ End Function nf_rename_att
+!-------------------------------- nf_del_att -------------------------------
+ Function nf_del_att(ncid, varid, name) RESULT(status)
+
+! Delete an attribute givne varid and name 
+
+ USE netcdf_nc_interfaces
+
+ Implicit NONE
+
+ Integer,          Intent(IN) :: ncid, varid
+ Character(LEN=*), Intent(IN) :: name
+
+ Integer                      :: status
+
+ Integer(KIND=C_INT)          :: cncid, cvarid, cstatus
+ Character(LEN=(LEN(name)+1)) :: cname
+ Integer                      :: ie
+
+ cncid  = ncid
+ cvarid = varid - 1 ! Subtract 1 to get C varid
+
+! Check to see if a C null character was added to name in calling program
+
+ cname = addCNullChar(name, ie)
+
+ cstatus = nc_del_att(cncid, cvarid, cname(1:ie+1))
+
+ status = cstatus
+
+ End Function nf_del_att
diff --git a/fortran/nf_geninq.f90 b/fortran/nf_geninq.f90
new file mode 100755
index 0000000..d68ddf4
--- /dev/null
+++ b/fortran/nf_geninq.f90
@@ -0,0 +1,207 @@
+!------- Routines for obtaining info on dimensions, varible sizes, etc -------
+
+! Replacement for fort-geninq.c
+
+! Written by: Richard Weed, Ph.D.
+!             Center for Advanced Vehicular Systems 
+!             Mississippi State University
+!             rweed at cavs.msstate.edu
+
+
+! License (and other Lawyer Language)
+ 
+! This software is released under the Apache 2.0 Open Source License. The
+! full text of the License can be viewed at :
+!
+!   http:www.apache.org/licenses/LICENSE-2.0.html
+!
+! The author grants to the University Corporation for Atmospheric Research
+! (UCAR), Boulder, CO, USA the right to revise and extend the software
+! without restriction. However, the author retains all copyrights and
+! intellectual property rights explicitly stated in or implied by the
+! Apache license
+
+! Version 1.: Sept. 2005  - Initial Cray X1 version
+!             April 2006  - Updated to include 3.6.1 function nf_inq_format
+! Version 2.: May   2006  - Updated to support g95
+! Version 3.: April 2009  - Updated to Netcdf 4.0.1 
+! Version 4.: April 2010  - Updated to Netcdf 4.1.1 
+! Version 5.: May   2014  - Ensure return error status checked from C API calls          
+
+!          
+!-------------------------------- nf_inq ----------------------------------
+ Function nf_inq(ncid, ndims, nvars, ngatts, unlimdimid) RESULT(status)
+
+! Inquire about number of dimensions, number of varibles, number of
+! global attributes, and the id of the ulimited dimension for NetCDF file
+! id ncid
+
+ USE netcdf_nc_interfaces
+
+ Implicit NONE
+
+ Integer, Intent(IN)  :: ncid
+ Integer, Intent(OUT) :: ndims, nvars, ngatts, unlimdimid
+
+ Integer              :: status
+
+ Integer(KIND=C_INT) :: cncid, cndims, cnvars, cngatts, cunlimdimid, cstatus
+
+ cncid = ncid
+
+ cstatus = nc_inq(cncid, cndims, cnvars, cngatts, cunlimdimid)
+
+ If (cstatus == NC_NOERR) Then
+    ndims  = cndims
+    nvars  = cnvars
+    ngatts = cngatts
+    
+! Shift C id by plus one to Fortran id if unlimdimid is not -1
+
+    If (cunlimdimid == - 1) Then
+       unlimdimid  = -1
+    Else
+       unlimdimid = cunlimdimid + 1
+    EndIf
+ EndIf
+ status = cstatus
+
+ End Function nf_inq
+!-------------------------------- nf_inq_ndims -----------------------------
+ Function nf_inq_ndims(ncid, ndims) RESULT(status)
+
+! Inquire about number of dimensions for NetCDF file id ncid
+
+ USE netcdf_nc_interfaces
+
+ Implicit NONE
+
+ Integer, Intent(IN)  :: ncid
+ Integer, Intent(OUT) :: ndims
+
+ Integer              :: status
+
+ Integer(KIND=C_INT) :: cncid, cndims, cstatus
+
+ cncid = ncid
+
+ cstatus = nc_inq_ndims(cncid, cndims)
+
+ If (cstatus == NC_NOERR) Then
+    ndims  = cndims
+ EndIf    
+ status = cstatus
+
+ End Function nf_inq_ndims
+!-------------------------------- nf_inq_nvars -----------------------------
+ Function nf_inq_nvars(ncid, nvars) RESULT(status)
+
+! Inquire about number of variables for NetCDF file id ncid
+
+ USE netcdf_nc_interfaces
+
+ Implicit NONE
+
+ Integer, Intent(IN)  :: ncid
+ Integer, Intent(OUT) :: nvars
+
+ Integer              :: status
+
+ Integer(KIND=C_INT) :: cncid, cnvars, cstatus
+
+ cncid = ncid
+
+ cstatus = nc_inq_nvars(cncid, cnvars)
+
+ If (cstatus == NC_NOERR) Then
+    nvars  = cnvars
+ EndIf    
+ status = cstatus
+
+ End Function nf_inq_nvars
+!-------------------------------- nf_inq_natts -----------------------------
+ Function nf_inq_natts(ncid, ngatts) RESULT(status)
+
+! Inquire about number of global attributes for NetCDF file id ncid
+
+ USE netcdf_nc_interfaces
+
+ Implicit NONE
+
+ Integer, Intent(IN)  :: ncid
+ Integer, Intent(OUT) :: ngatts
+
+ Integer              :: status
+
+ Integer(KIND=C_INT) :: cncid, cngatts, cstatus
+
+ cncid = ncid
+
+ cstatus = nc_inq_natts(cncid, cngatts)
+
+ If (cstatus == NC_NOERR) Then
+    ngatts = cngatts
+ EndIf
+ status = cstatus
+
+ End Function nf_inq_natts
+!-------------------------------- nf_inq_unlimdim --------------------------
+ Function nf_inq_unlimdim(ncid, unlimdimid) RESULT(status)
+
+! Inquire about id of unlimited dimension for NetCDF file id ncid
+
+ USE netcdf_nc_interfaces
+
+ Implicit NONE
+
+ Integer, Intent(IN)  :: ncid
+ Integer, Intent(OUT) :: unlimdimid
+
+ Integer              :: status
+
+ Integer(KIND=C_INT) :: cncid, cunlimdimid, cstatus
+
+ cncid = ncid
+
+ cstatus = nc_inq_unlimdim(cncid, cunlimdimid)
+
+! Shift C id by plus one to Fortran id if unlimdimid is not -1
+
+ If (cstatus == NC_NOERR) Then
+    If (cunlimdimid == -1) Then
+       unlimdimid = -1
+    Else
+       unlimdimid = cunlimdimid + 1
+    EndIf
+ EndIf
+ status = cstatus
+
+ End Function nf_inq_unlimdim
+!-------------------------------- nf_inq_format -------------------------------
+ Function nf_inq_format(ncid, format_type) RESULT(status)
+
+! Inquire about internal file format for NetCDF file id ncid
+
+ USE netcdf_nc_interfaces
+
+ Implicit NONE
+
+ Integer, Intent(IN)  :: ncid
+ Integer, Intent(OUT) :: format_type 
+
+ Integer              :: status
+
+ Integer(KIND=C_INT) :: cncid, cformatp, cstatus
+
+ cncid = ncid
+
+ cstatus = nc_inq_format(cncid, cformatp)
+
+ If (cstatus == NC_NOERR) Then
+! Return format_type 
+    
+    format_type = cformatp
+ EndIf
+ status  = cstatus
+
+ End Function nf_inq_format
diff --git a/fortran/nf_genvar.f90 b/fortran/nf_genvar.f90
new file mode 100755
index 0000000..809e737
--- /dev/null
+++ b/fortran/nf_genvar.f90
@@ -0,0 +1,384 @@
+!------ Routines for defining and obtaining info about dataset variables ------
+
+! Replacement for fort-genvar.c
+
+! Written by: Richard Weed, Ph.D.
+!             Center for Advanced Vehicular Systems 
+!             Mississippi State University
+!             rweed at cavs.msstate.edu
+
+
+! License (and other Lawyer Language)
+ 
+! This software is released under the Apache 2.0 Open Source License. The
+! full text of the License can be viewed at :
+!
+!   http:www.apache.org/licenses/LICENSE-2.0.html
+!
+! The author grants to the University Corporation for Atmospheric Research
+! (UCAR), Boulder, CO, USA the right to revise and extend the software
+! without restriction. However, the author retains all copyrights and
+! intellectual property rights explicitly stated in or implied by the
+! Apache license
+
+! Version 1.: Sept. 2005 - Initial Cray X1 version
+! Version 2.: May   2006 - Updated to support g95
+! Version 3.: April 2009 - Updated for netCDF 4.0.1
+! Version 4.: April 2010 - Updated for netCDF 4.1.1
+! Version 5.: May   2014 - Ensure return error status checked from C API calls          
+          
+!-------------------------------- nf_def_var -------------------------------
+ Function nf_def_var(ncid, name, xtype, nvdims, vdims, varid) RESULT (status)
+
+! Define name, datatype, number of dimensions, and dimension ids for a
+! dataset variable. Returns variable id
+
+ USE netcdf_nc_interfaces
+
+ Implicit NONE
+
+ Integer,          Intent(IN)  :: ncid, xtype, nvdims
+ Integer,          Intent(IN)  :: vdims(*)
+ Integer,          Intent(OUT) :: varid
+ Character(LEN=*), Intent(IN)  :: name
+
+ Integer                       :: status
+
+ Integer(KIND=C_INT)          :: cncid, cnvdims, cvarid, cstatus, cxtype
+ Integer(KIND=C_INT)          :: cvdims(NC_MAX_DIMS)
+ Character(LEN=(LEN(name)+1)) :: cname
+ Integer                      :: ie
+
+ cncid   = ncid
+ cnvdims = nvdims
+ cxtype  = xtype
+ 
+! Check if a C NULL character was appended to name in calling routine
+
+ cname = addCNullChar(name, ie)
+
+! Flip dimids to C order and subtract -1 to yield C ids prior
+! to calling nc_def_var. Replaces C utility f2c_dimids
+
+ cvdims = 0
+ If (nvdims /= 0) Then 
+   cvdims(1:nvdims) = vdims(nvdims:1:-1)-1
+ EndIf
+
+ cstatus = nc_def_var(cncid, cname(1:ie+1), cxtype, &
+                     cnvdims, cvdims, cvarid)
+
+ If (cstatus == NC_NOERR) Then
+    ! Add one to returned C varid to yield FORTRAN id
+    varid = cvarid + 1
+ EndIf
+ status = cstatus
+
+ End Function nf_def_var
+!-------------------------------- nf_inq_varndims --------------------------
+ Function nf_inq_varndims(ncid, varid, vndims) RESULT (status)
+
+! Get variable dimension for a given varid from NetCDF dataset ncid
+
+ USE netcdf_nc_interfaces
+
+ Implicit NONE
+
+ Integer, Intent(IN)  :: ncid, varid
+ Integer, Intent(OUT) :: vndims
+
+ Integer              :: status
+
+ Integer(KIND=C_INT) :: cncid, cvarid, cvndims, cstatus
+
+ cncid   = ncid
+ cvarid  = varid - 1
+
+ cstatus = nc_inq_varndims(cncid, cvarid, cvndims)
+
+ If (cstatus == NC_NOERR) Then
+    vndims = cvndims
+ EndIf
+ status = cstatus
+
+ End Function nf_inq_varndims
+!-------------------------------- nf_inq_var ----------------------------
+ Function nf_inq_var(ncid, varid, name, xtype, ndims, dimids, natts) &
+                     RESULT (status)
+
+! Get variable name, data type, dimension length, dimension ids, and
+! number of attributes for a given varid 
+
+ USE netcdf_nc_interfaces
+
+ Implicit NONE
+
+ Integer,          Intent(IN)  :: ncid, varid
+ Character(LEN=*), Intent(OUT) :: name
+ Integer,          Intent(OUT) :: dimids(*)
+ Integer,          Intent(OUT) :: ndims, xtype, natts
+
+ Integer                       :: status
+
+ Integer(KIND=C_INT)          :: cncid, cstatus, cndims, cvarid, cnatts
+ Integer(KIND=C_INT)          :: cdimids(NC_MAX_DIMS)
+ Integer(KIND=C_INT)          :: cxtype
+ Character(LEN=NC_MAX_NAME+1) :: tmpname
+ Integer                      :: nlen
+
+ cncid  = ncid
+ cvarid = varid - 1 ! subtract -1 to yield cvarid
+
+ nlen    = LEN(name)
+ tmpname = REPEAT(" ", LEN(tmpname))
+ name    = REPEAT(" ", nlen)
+
+ cndims    = 0
+ dimids(1) = 0
+ xtype     = 0
+ natts     = 0
+ ndims     = 0
+
+ cstatus = nc_inq_var(cncid, cvarid, tmpname, cxtype, cndims, cdimids, cnatts)
+
+ If (cstatus == NC_NOERR) Then
+    xtype = cxtype
+    natts = cnatts
+    ndims = cndims
+
+    ! Check tmpname for a C null character and strip it and trailing blanks
+
+    name = stripCNullChar(tmpname, nlen)
+
+    ! Reverse order of cdimids and add one to yield FORTRAN id numbers
+    ! Replaces c2f_dimids C utility
+ 
+    If (ndims > 0) Then
+       dimids(1:ndims) = cdimids(ndims:1:-1)+1
+    EndIf
+ EndIf
+
+ status = cstatus
+
+ End Function nf_inq_var
+!-------------------------------- nf_inq_vardimid -----------------------
+ Function nf_inq_vardimid(ncid, varid, dimids) RESULT (status)
+
+! Get variable dimension id for a dimension name
+
+ USE netcdf_nc_interfaces
+
+ Implicit NONE
+
+ Integer, Intent(IN)  :: ncid, varid
+ Integer, Intent(OUT) :: dimids(*)
+
+ Integer              :: status
+
+ Integer(KIND=C_INT) :: cncid, cstatus, cstat2, cndims, cvarid
+ Integer(KIND=C_INT) :: cvdimids(NC_MAX_DIMS)
+ Integer             :: ndims
+
+ cncid     = ncid
+ cvarid    = varid - 1 ! subtract -1 to get C id number
+ dimids(1) = 0
+ cvdimids  = 0
+ cndims    = 0
+ ndims     = 0
+ 
+ cstat2  = nc_inq_varndims(cncid, cvarid, cndims)
+ cstatus = nc_inq_vardimid(cncid, cvarid, cvdimids)
+
+! Reverse order of cdimids and add 1 to yield FORTRAN id numbers
+! Replaces c2f_dimids C utility
+ 
+ If (cstat2 == NC_NOERR .AND. cstatus == NC_NOERR) Then
+   ndims = cndims
+   If (ndims > 0) Then    
+     dimids(1:ndims) = cvdimids(ndims:1:-1)+1
+   EndIf
+ Else
+   ndims = 0
+ EndIf
+ 
+ status = cstatus
+
+ End Function nf_inq_vardimid
+!-------------------------------- nf_inq_varid --------------------------
+ Function nf_inq_varid(ncid, name, varid) RESULT (status)
+
+! Get variable id for a variable name from NetCDF dataset ncid
+
+ USE netcdf_nc_interfaces
+
+ Implicit NONE
+
+ Integer,          Intent(IN)  :: ncid
+ Character(LEN=*), Intent(IN)  :: name
+ Integer,          Intent(OUT) :: varid
+
+ Integer                       :: status
+
+ Integer(KIND=C_INT)          :: cncid, cvarid, cstatus
+ Character(LEN=(LEN(name)+1)) :: cname
+ Integer                      :: ie
+
+ cncid = ncid
+
+! Check name for a C NULL character added in calling routine
+
+ cname = addCNullChar(name, ie)
+
+ cstatus = nc_inq_varid(cncid, cname(1:ie+1), cvarid)
+
+ If (cstatus == NC_NOERR) Then
+    varid  = cvarid + 1  ! add one to get Fortran id number
+ EndIf
+ status = cstatus
+
+ End Function nf_inq_varid
+!-------------------------------- nf_inq_varname ------------------------
+ Function nf_inq_varname (ncid, varid, name) RESULT (status)
+
+! Get variable name for a given varid from NetCDF dataset ncid
+
+ USE netcdf_nc_interfaces
+
+ Implicit NONE
+
+ Integer,          Intent(IN)   :: ncid, varid
+ Character(LEN=*), Intent(OUT)  :: name
+
+ Integer                        :: status
+
+ Integer(KIND=C_INT)          :: cncid, cvarid, cstatus
+ Character(LEN=NC_MAX_NAME+1) :: tmpname 
+ Integer                      :: nlen
+
+ cncid   = ncid
+ cvarid  = varid - 1 ! subtract one to get C id number
+
+ nlen    = LEN(name)
+ tmpname = REPEAT(" ", LEN(tmpname))
+ name    = REPEAT(" ", nlen)
+
+! Get tmpname from C interface
+
+ cstatus = nc_inq_varname(cncid, cvarid, tmpname)
+
+ If (cstatus == NC_NOERR) Then
+    ! Find first C null character in tmpname if present and set end of string
+    name = stripCNullChar(tmpname, nlen)
+ EndIf
+ status = cstatus
+
+ End Function nf_inq_varname
+!-------------------------------- nf_inq_vartype -------------------------
+ Function nf_inq_vartype(ncid, varid, xtype) RESULT(status)
+
+! Inquire about numeric type of variable attributes for NetCDF file id ncid
+
+ USE netcdf_nc_interfaces
+
+ Implicit NONE
+
+ Integer, Intent(IN)  :: ncid, varid
+ Integer, Intent(OUT) :: xtype
+
+ Integer              :: status
+
+ Integer(KIND=C_INT) :: cncid, cvarid, cstatus
+ Integer(KIND=C_INT) :: cxtype
+
+ cncid  = ncid
+ cvarid = varid - 1 ! Subtract one to get C id number
+
+ cstatus = nc_inq_vartype(cncid, cvarid, cxtype)
+
+ If (cstatus == NC_NOERR) Then
+    xtype  = cxtype
+ EndIf
+ status = cstatus
+
+ End Function nf_inq_vartype
+!-------------------------------- nf_inq_varnatts -----------------------
+ Function nf_inq_varnatts(ncid, varid, nvatts) RESULT(status)
+
+! Inquire about number of variable attributes for NetCDF file id ncid
+
+ USE netcdf_nc_interfaces
+
+ Implicit NONE
+
+ Integer, Intent(IN)  :: ncid, varid
+ Integer, Intent(OUT) :: nvatts
+
+ Integer              :: status
+
+ Integer(KIND=C_INT) :: cncid, cvarid, cnvatts, cstatus
+
+ cncid  = ncid
+ cvarid = varid - 1 ! subtract one to get C id number
+
+ cstatus = nc_inq_varnatts(cncid, cvarid, cnvatts)
+
+ If (cstatus == NC_NOERR) Then
+    nvatts = cnvatts
+ EndIf
+
+ status = cstatus
+
+ End Function nf_inq_varnatts
+!-------------------------------- nf_rename_var -------------------------
+ Function nf_rename_var(ncid, varid, name) RESULT (status)
+
+! Rename dimension name for a given dimension id
+
+ USE netcdf_nc_interfaces
+
+ Implicit NONE
+
+ Integer,          Intent(IN) :: ncid, varid 
+ Character(LEN=*), Intent(IN) :: name
+
+ Integer                      :: status
+
+ Integer(KIND=C_INT)          :: cncid, cvarid, cstatus
+ Character(LEN=(LEN(name)+1)) :: cname
+ Integer                      :: ie
+
+ cncid  = ncid
+ cvarid = varid - 1 ! Subtract one to get C id number
+
+! Check name for a C NULL character added in calling routine
+
+ cname = addCNullChar(name, ie)
+
+ cstatus = nc_rename_var(cncid, cvarid, cname(1:ie+1))
+
+ status = cstatus
+
+ End Function nf_rename_var
+!-------------------------------- nf_copy_var ---------------------------
+ Function nf_copy_var(ncid_in, varid, ncid_out) RESULT(status)
+
+! Copies a given variable from dataset ncid_in to dataset ncid_out
+
+ USE netcdf_nc_interfaces
+
+ Implicit NONE
+
+ Integer, Intent(IN) :: ncid_in, varid, ncid_out
+ Integer             :: status
+
+ Integer(KIND=C_INT) :: cncidin, cvarid, cncidout, cstatus
+
+ cncidin  = ncid_in
+ cncidout = ncid_out
+ cvarid   = varid - 1 ! Subtract one to get C id number
+
+ cstatus = nc_copy_var(cncidin, cvarid, cncidout)
+
+ status = cstatus
+
+ End Function nf_copy_var
diff --git a/fortran/nf_lib.c b/fortran/nf_lib.c
new file mode 100755
index 0000000..142972e
--- /dev/null
+++ b/fortran/nf_lib.c
@@ -0,0 +1,171 @@
+/*
+
+Copyright 2006, University Corporation for Atmospheric Research. See
+the COPYRIGHT file for copying and redistribution conditions.
+
+$Id: fort-lib.c,v 1.15 2009/02/13 15:58:00 ed Exp $
+*/
+
+/*
+ Extracted from of fort-lib.c. Used to supply four required netcdf4
+ functions used in Fortran2003 interfaces. These need to be external
+ and I don't want to mangle fort-lib.c just to define these four functions
+
+ Version 1.0, April, 2009 - based on netcdf-4.0.1 source
+ Version 2.0, April, 2010 - based on netcdf-4.1.1 source
+
+ modified by: Richard Weed Ph.D.
+              Center for Advanced Vehicular Systems
+              Mississippi State University
+              rweed at cavs.msstate.edu
+*/
+    
+#include <config.h>
+#include <stddef.h>	/* for NULL */
+#include <errno.h>
+#include <string.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include "netcdf.h"
+
+#ifdef USE_NETCDF4
+/* These appear to only be defined in netcdf-4*/
+
+/* Get the varids for a fortran function (i.e. add 1 to each
+ * varid.) */
+extern int
+nc_inq_varids_f(int ncid, int *nvars, int *fvarids)
+{
+   int *varids, nvars1;
+   int i, ret = NC_NOERR;
+
+   /* Get the information from the C library. */
+   if ((ret = nc_inq_varids(ncid, &nvars1, NULL)))
+      return ret;
+   if (!(varids = malloc(nvars1 * sizeof(int))))
+      return NC_ENOMEM;
+   if ((ret = nc_inq_varids(ncid, NULL, varids)))
+      goto exit;
+
+   /* Add one to each, for fortran. */
+   for (i = 0; i < nvars1; i++)
+      fvarids[i] = varids[i] + 1;
+
+   /* Tell the user how many there are. */
+   if (nvars)
+      *nvars = nvars1;
+
+  exit:
+   free(varids);
+   return ret;
+}
+/* Get the dimids for a fortran function (i.e. add 1 to each
+ * dimid.) */
+extern int
+nc_inq_dimids_f(int ncid, int *ndims, int *fdimids, int parent)
+{
+   int *dimids, ndims1;
+   int i, ret = NC_NOERR;
+
+   /* Get the information from the C library. */
+   if ((ret = nc_inq_dimids(ncid, &ndims1, NULL, parent)))
+      return ret;
+   if (!(dimids = malloc(ndims1 * sizeof(int))))
+      return NC_ENOMEM;
+   if ((ret = nc_inq_dimids(ncid, NULL, dimids, parent)))
+      goto exit;
+
+   /* Add one to each, for fortran. */
+   for (i = 0; i < ndims1; i++)
+      fdimids[i] = dimids[i] + 1;
+
+   /* Tell the user how many there are. */
+   if (ndims)
+      *ndims = ndims1;
+
+  exit:
+   free(dimids);
+   return ret;
+}
+
+/* Swap the dim sizes for fortran. */
+extern int
+nc_insert_array_compound_f(int ncid, int typeid, char *name, 
+			 size_t offset, nc_type field_typeid,
+			 int ndims, int *dim_sizesp)
+{
+   int *dim_sizes_f;
+   int i, ret;
+
+   if (ndims <= 0)
+      return NC_EINVAL;
+
+   /* Allocate some storage to hold ids. */
+   if (!(dim_sizes_f = malloc(ndims * sizeof(int))))
+      return NC_ENOMEM;
+
+   /* Create a backwards list of dimension sizes. */
+   for (i = 0; i < ndims; i++)
+      dim_sizes_f[i] = dim_sizesp[ndims - i - 1];
+
+   /* Call with backwards list. */
+   ret = nc_insert_array_compound(ncid, typeid, name, offset, field_typeid, 
+				  ndims, dim_sizes_f);
+
+   /* Clean up. */
+   free(dim_sizes_f);
+   return ret;
+}
+
+extern int
+nc_inq_compound_field_f(int ncid, nc_type xtype, int fieldid, char *name, 
+			size_t *offsetp, nc_type *field_typeidp, int *ndimsp, 
+			int *dim_sizesp)
+{
+   int ndims;
+   int ret;
+
+   /* Find out how many dims. */
+   if ((ret = nc_inq_compound_field(ncid, xtype, fieldid, NULL, NULL, 
+				    NULL, &ndims, NULL)))
+      return ret;
+
+   /* Call the function. */
+   if ((ret = nc_inq_compound_field(ncid, xtype, fieldid, name, offsetp, 
+				    field_typeidp, ndimsp, dim_sizesp)))
+      return ret;
+
+   /* Swap the order of the dimsizes. */
+   if (ndims)
+   {
+      int *f, *b, temp;
+      for (f = dim_sizesp, b = &dim_sizesp[ndims - 1]; f < b; f++, b--)
+      {
+	 temp = *f;
+	 *f = *b;
+	 *b = temp;
+      }
+   }  
+
+   return NC_NOERR;
+}
+
+#endif /*USE_NETCDF4*/
+
+/*
+ add a dummy nc_rename_grp function if it is not supported. This is include
+ here so we can build/test with netCDF < version 4.3.1 without 
+*/
+
+#ifndef NC_HAVE_RENAME_GRP
+extern int
+nc_rename_grp(int ncid, const char *name)
+{
+ printf("\n*** Warning - nc_rename_grp not supported in this netCDF version\n");
+ printf("*** Update your netCDF C libraries to version 4.3.1 or higher\n");
+
+ return NC_ENOGRP;
+
+}
+#endif
+
diff --git a/fortran/nf_logging.F90 b/fortran/nf_logging.F90
new file mode 100755
index 0000000..95d2a70
--- /dev/null
+++ b/fortran/nf_logging.F90
@@ -0,0 +1,32 @@
+#ifdef LOGGING
+! Function to turn on logging
+!-------------------------------- nf_set_log_level ----------------------------
+ Function nf_set_log_level(new_level) Result(status)
+
+ USE ISO_C_BINDING, ONLY: C_INT
+
+ Implicit NONE
+
+ Integer, Intent(IN) :: new_level
+
+ Integer,            :: status
+
+ Integer(C_INT) :: cnew_level, cstatus
+
+ Interface  ! define binding here instead of nc_interfaces since its conditional
+  Function nc_set_log_level(new_level) BIND(C)
+   USE ISO_C_BINDING, ONLY: C_INT
+
+   Integer(C_INT), VALUE :: new_level
+   Integer(C_INT)        :: nc_set_log_level
+ End Function nc_set_log_level
+End Interface
+
+ cnew_level = new_level
+ cstatus = nc_set_log_level(cnew_level)
+
+ status = cstatus
+
+End Function nf_set_log_level
+
+#endif
diff --git a/fortran/nf_misc.f90 b/fortran/nf_misc.f90
new file mode 100755
index 0000000..f353b1e
--- /dev/null
+++ b/fortran/nf_misc.f90
@@ -0,0 +1,133 @@
+!-- Routines for processing error messages, obtaining version numbers, etc. --
+
+! Replacement for fort-misc.c
+
+! Written by: Richard Weed, Ph.D.
+!             Center for Advanced Vehicular Systems
+!             Mississippi State University
+!             rweed at cavs.msstate.edu
+ 
+
+! License (and other Lawyer Language)
+ 
+! This software is released under the Apache 2.0 Open Source License. The
+! full text of the License can be viewed at :
+!
+!   http:www.apache.org/licenses/LICENSE-2.0.html
+!
+! The author grants to the University Corporation for Atmospheric Research
+! (UCAR), Boulder, CO, USA the right to revise and extend the software
+! without restriction. However, the author retains all copyrights and
+! intellectual property rights explicitly stated in or implied by the
+! Apache license
+
+! Version 1.: Sept. 2005 - Initial Cray X1 version
+! Version 2.: May   2006 - Updated to support g95
+! Version 3.: April 2009 - Updated for netCDF 4.0.1
+! Version 4.: April 2010 - Updated for netCDF 4.1.1
+ 
+!-------------------------------- nf_inq_libvers ---------------------------
+ Function nf_inq_libvers() RESULT(vermsg)
+
+! Return string with current version of NetCDF library
+
+ USE netcdf_nc_interfaces
+
+ Implicit NONE
+
+ Character(LEN=80) :: vermsg
+
+ Character(LEN=81), Pointer :: fstrptr
+ TYPE(C_PTR)                :: cstrptr
+ Integer                    :: inull, ilen
+
+ vermsg = REPEAT(" ", LEN(vermsg)) !initialize vermsg to blanks
+
+! Get C character pointer returned by nc_inq_vers and associate it
+! Fortran character pointer (fstrptr). Have to do this when the C
+! routine allocates space for the pointer and/or knows where it lives
+! not Fortran. This is also how you can pass character data back to
+! FORTRAN from C using a C function that returns a character pointer
+! instead using a void jacket function and passing the string as a hidden 
+! argument. At least this is how cfortran.h appears to do it. 
+
+ 
+ NULLIFY(fstrptr) ! Nullify fstrptr
+
+ cstrptr = nc_inq_libvers()         ! Get C pointer to version string and
+
+ Call C_F_POINTER(cstrptr, fstrptr) ! associate it with FORTRAN pointer
+
+! Locate first C null character and then set it and remaining characters
+! in string to blanks
+
+ ilen  = LEN_TRIM(fstrptr)
+ inull = SCAN(fstrptr,C_NULL_CHAR)
+ If (inull /= 0) ilen = inull-1
+ ilen = MAX(1, MIN(ilen,80)) ! Limit ilen to >=1 and <=80
+
+! Load return value with trimmed fstrptr string
+
+ vermsg(1:ilen) = fstrptr(1:ilen)
+
+ End Function nf_inq_libvers
+!-------------------------------- nf_stderror ------------------------------
+ Function nf_strerror(ncerr) RESULT(errmsg)
+
+! Returns an error message string given static error code ncerr
+
+ USE netcdf_nc_interfaces
+
+ Implicit NONE
+
+ Integer(KIND=C_INT), Intent(IN) :: ncerr
+
+ Character(LEN=80)               :: errmsg
+
+ Character(LEN=81), Pointer :: fstrptr
+ TYPE(C_PTR)                :: cstrptr
+ Integer                    :: inull, ilen
+ Integer(KIND=C_INT)        :: cncerr
+
+ errmsg = REPEAT(" ", LEN(errmsg)) !initialize errmsg to blanks
+
+! Get C character pointer returned by nc_stderror and associate it
+! Fortran character pointer (fstrptr). Have to do this when the C
+! routine allocates space for the pointer and/or knows where it lives
+! not Fortran. This is also how you can pass character data back to
+! FORTRAN from C using a C function that returns a character pointer
+! instead using a void jacket function and passing the string as a hidden 
+! argument. At least this is how cfortran.h appears to do it. 
+ 
+ NULLIFY(fstrptr) ! Nullify fstrptr
+
+ cncerr  = ncerr
+
+ cstrptr = nc_strerror(cncerr)      ! Return C character pointer and
+ Call C_F_POINTER(cstrptr, fstrptr) ! associate C ptr with FORTRAN pointer
+
+! Locate first C null character and then set it and remaining characters
+! in string to blanks 
+
+ ilen  = LEN_TRIM(fstrptr)
+ inull = SCAN(fstrptr,C_NULL_CHAR)
+ If (inull /= 0) ilen = inull-1 
+ ilen  = MAX(1, MIN(ilen,80)) ! Limit ilen to >=1 and <=80
+
+! Load return value with trimmed fstrptr string
+
+ errmsg(1:ilen) = fstrptr(1:ilen)
+
+ End Function nf_strerror
+!-------------------------------- nf_issyserr ------------------------------
+ Function nf_issyserr(nerr) RESULT(status)
+
+! Check to see if nerr is > 0
+
+ Integer, Intent(IN) :: nerr
+
+ Logical             :: status
+
+ status = (nerr > 0) 
+
+ End Function nf_issyserr
diff --git a/fortran/nf_nc4.f90 b/fortran/nf_nc4.f90
new file mode 100755
index 0000000..b63f75c
--- /dev/null
+++ b/fortran/nf_nc4.f90
@@ -0,0 +1,2554 @@
+!                netCDF 4 specific FORTRAN functions
+
+! Replacement for fort-nc4.c
+
+! Written by: Richard Weed, Ph.D.
+!             Center for Advanced Vehicular Systems  
+!             Mississippi State University 
+!             rweed at cavs.msstate.edu
+
+
+! License (and other Lawyer Language)
+ 
+! This software is released under the Apache 2.0 Open Source License. The
+! full text of the License can be viewed at :
+!
+!   http:www.apache.org/licenses/LICENSE-2.0.html
+!
+! The author grants to the University Corporation for Atmospheric Research
+! (UCAR), Boulder, CO, USA the right to revise and extend the software
+! without restriction. However, the author retains all copyrights and
+! intellectual property rights explicitly stated in or implied by the
+! Apache license
+
+! Version 1.- June  2006 - Based on netCDF 3.6.2 beta code and 4.0 alpha code
+! Version 2.- July  2007 - Based on netCDF 3.6.2 snapshot and 4.0 beta code
+! Version 3.- April 2009 - Based on NetCDF 4.0.1 release
+! Version 4.- April 2010 - Based on NetCDF 4.1.1 release
+! Version 5.- Aug.  2013 - Added nf_rename_grp to align with netCDF-C 4.3.1
+! Version 6.- Sep.  2013 - Changed fill routines to support different types
+! Version 7.- May   2014 - Ensure return error status checked from C API calls          
+ 
+!-------------------------------- nf_create_par -------------------------------
+ Function nf_create_par (path, cmode, comm, info, ncid) RESULT(status)
+
+! create parallel file
+
+ USE netcdf4_nc_interfaces
+
+ Implicit NONE
+
+ Integer,          Intent(IN)  :: cmode, comm, info
+ Character(LEN=*), Intent(IN)  :: path
+ Integer,          Intent(OUT) :: ncid
+
+ Integer                       :: status
+
+ Integer(KIND=C_INT)          :: ccmode, ccomm, cinfo, cncid, cstatus
+ Character(LEN=(LEN(path)+1)) :: cpath
+ Integer                      :: ie
+
+ ccmode = cmode
+ ccomm  = comm
+ cinfo  = info
+ cncid  = 0
+ cpath  = addCNullChar(path, ie) ! add a C Null char and strip trailing blanks
+
+ cstatus = nc_create_par_fortran(cpath(1:ie+1), ccmode, ccomm, cinfo, cncid)
+
+ If (cstatus == NC_NOERR) Then
+    ncid = cncid
+ EndIf
+ status = cstatus
+
+ End Function nf_create_par
+!-------------------------------- nf_open_par --------------------------------
+ Function nf_open_par (path, mode, comm, info, ncid) RESULT(status)
+
+! open a parallel file
+
+ USE netcdf4_nc_interfaces
+
+ Implicit NONE
+
+ Integer,          Intent(IN)  :: mode, comm, info
+ Character(LEN=*), Intent(IN)  :: path
+ Integer,          Intent(OUT) :: ncid
+
+ Integer                       :: status
+
+ Integer(KIND=C_INT)          :: cmode, ccomm, cinfo, cncid, cstatus
+ Character(LEN=(LEN(path)+1)) :: cpath
+ Integer                      :: ie
+
+ cmode = mode
+ ccomm = comm
+ cinfo = info
+ cncid = 0
+ cpath = addCNullChar(path, ie)
+
+ cstatus = nc_open_par_fortran(cpath(1:ie+1), cmode, ccomm, cinfo, cncid)
+
+ If (cstatus == NC_NOERR) Then
+   ncid = cncid
+ EndIf
+ status = cstatus
+
+ End Function nf_open_par
+!-------------------------------- nf_var_par_access -------------------------
+ Function nf_var_par_access( ncid, varid, iaccess) RESULT (status)
+
+! set variable access
+
+ USE netcdf4_nc_interfaces
+
+ Implicit NONE
+
+ Integer, Intent(IN) :: ncid, varid, iaccess
+
+ Integer             :: status
+
+ Integer(KIND=C_INT) :: cncid, cvarid, caccess, cstatus
+
+ cncid   = ncid
+ cvarid  = varid - 1
+ caccess = iaccess
+
+ cstatus = nc_var_par_access(cncid, cvarid, caccess)
+
+ status = cstatus
+
+ End Function nf_var_par_access
+!-------------------------------- nf_inq_ncid ---------------------------------
+ Function nf_inq_ncid(ncid, name, groupid) RESULT (status)
+
+! inquire ncid  
+
+ USE netcdf4_nc_interfaces
+
+ Implicit NONE
+
+ Integer,          Intent(IN)  :: ncid
+ Character(LEN=*), Intent(IN)  :: name
+ Integer,          Intent(OUT) :: groupid
+
+ Integer                       :: status
+
+ Integer(KIND=C_INT)        :: cncid, cgroupid, cstatus
+ Character(LEN=LEN(name)+1) :: cname
+ Integer                    :: ie
+
+ cncid    = ncid
+ cgroupid = 0
+ cname    = REPEAT(" ",LEN(cname))
+ cname    = addCNullChar(name, ie)
+
+ cstatus = nc_inq_ncid(cncid, cname(1:ie+1), cgroupid)
+
+ If (cstatus == NC_NOERR) Then
+    groupid = cgroupid
+ EndIf
+ status  = cstatus
+
+ End Function nf_inq_ncid
+!-------------------------------- nf_inq_grps ---------------------------------
+ Function nf_inq_grps( ncid, numgrps, ncids) RESULT (status)
+
+! inquire number of grps and ncids
+
+ USE netcdf4_nc_interfaces
+
+ Implicit NONE
+
+ Integer, Intent(IN)    :: ncid
+ Integer, Intent(INOUT) :: ncids(*)
+ Integer, Intent(OUT)   :: numgrps
+ Integer                :: status
+
+ Integer(KIND=C_INT)    :: cncid, cnumgrps, cstatus
+ Integer(KIND=C_INT)    :: cncids(NC_MAX_DIMS)
+
+ cncid    = ncid
+ cnumgrps = 0
+ ncids(1) = 0
+ 
+ cstatus = nc_inq_grps(cncid, cnumgrps, cncids)
+
+ If (cstatus == NC_NOERR) Then
+    numgrps = cnumgrps
+    ncids(1:numgrps) = cncids(1:numgrps)
+ EndIf
+ status  = cstatus
+
+ End Function nf_inq_grps
+!-------------------------------- nf_inq_grpname ------------------------------
+ Function nf_inq_grpname( ncid, name) RESULT (status)
+
+! inquire group name 
+
+ USE netcdf4_nc_interfaces
+
+ Implicit NONE
+
+ Integer,          Intent(IN)  :: ncid
+ Character(LEN=*), Intent(OUT) :: name
+
+ Integer                       :: status
+
+ Integer(KIND=C_INT)        :: cncid, cstatus
+ Character(LEN=NC_MAX_NAME) :: cname
+ Integer                    :: nlen
+
+ cncid = ncid
+ nlen  = LEN(name)
+ name  = REPEAT(" ",LEN(name))
+ cname = REPEAT(" ",LEN(cname))
+ 
+ cstatus = nc_inq_grpname(cncid, cname)
+
+ If (cstatus == NC_NOERR) Then
+    name = stripCNullChar(cname,nlen) ! Strip null char and trailing blanks 
+ EndIf
+ status = cstatus
+
+ End Function nf_inq_grpname
+!-------------------------------- nf_inq_grpname_full -------------------------
+ Function nf_inq_grpname_full( ncid, nlen, name) RESULT (status)
+
+! inquire full group name and length 
+
+ USE netcdf4_nc_interfaces
+
+ Implicit NONE
+
+ Integer,          Intent(IN)  :: ncid
+ Character(LEN=*), Intent(OUT) :: name
+ Integer,          Intent(OUT) :: nlen
+
+ Integer                       :: status
+
+ Integer(KIND=C_INT)        :: cncid, cstatus
+ Integer(KIND=C_SIZE_T)     :: clen
+ Character(LEN=LEN(name)+1) :: cname
+ Integer                    :: nl
+
+ cncid  = ncid
+ nl     = LEN(name)
+ name   = REPEAT(" ",LEN(name))
+ cname  = REPEAT(" ",LEN(cname))
+ 
+ cstatus = nc_inq_grpname_full(cncid, clen, cname)
+
+ If (cstatus == NC_NOERR) Then
+    nlen = clen  
+    name = stripCNullChar(cname, nl)
+ EndIf
+ status = cstatus
+
+ End Function nf_inq_grpname_full
+!-------------------------------- nf_inq_grpname_len --------------------------
+ Function nf_inq_grpname_len( ncid, nlen) RESULT (status)
+
+! inquire length of full group name
+
+ USE netcdf4_nc_interfaces
+
+ Implicit NONE
+
+ Integer, Intent(IN)  :: ncid
+ Integer, Intent(OUT) :: nlen
+
+ Integer              :: status
+
+ Integer(KIND=C_INT)    :: cncid, cstatus
+ Integer(KIND=C_SIZE_T) :: clen
+
+ cncid  = ncid
+ 
+ cstatus = nc_inq_grpname_len(cncid, clen)
+
+ If (cstatus == NC_NOERR) Then
+    ! Return name length 
+     nlen = clen
+ EndIf
+ status = cstatus
+
+ End Function nf_inq_grpname_len
+!-------------------------------- nf_inq_grp_parent ---------------------------
+ Function nf_inq_grp_parent( ncid,parent_ncid) RESULT (status)
+
+! inquire group parent number
+
+ USE netcdf4_nc_interfaces
+
+ Implicit NONE
+
+ Integer, Intent(IN)    :: ncid
+ Integer, Intent(INOUT) :: parent_ncid
+
+ Integer                :: status
+
+ Integer(KIND=C_INT) :: cncid, cparent_ncid, cstatus
+
+ cncid  = ncid
+
+ cstatus = nc_inq_grp_parent(cncid, cparent_ncid)
+
+ If (cstatus == NC_NOERR) Then
+    parent_ncid = cparent_ncid
+ EndIf
+ status  = cstatus
+
+ End Function nf_inq_grp_parent
+!-------------------------------- nf_inq_grp_ncid -----------------------------
+ Function nf_inq_grp_ncid( ncid, grp_name, parent_ncid) RESULT (status)
+
+! inquire parent_ncid given group name 
+
+ USE netcdf4_nc_interfaces
+
+ Implicit NONE
+
+ Integer,          Intent(IN)    :: ncid
+ Character(LEN=*), Intent(IN)    :: grp_name
+ Integer,          Intent(INOUT) :: parent_ncid
+
+ Integer                         :: status
+
+ Integer(KIND=C_INT)              :: cncid, cstatus, cparent_ncid
+ Character(LEN=(LEN(grp_name)+1)) :: cgrp_name
+ Integer                          :: ie
+
+ cgrp_name = REPEAT(" ",LEN(cgrp_name))
+ cgrp_name = addCNullChar(grp_name, ie)
+ cncid     = ncid
+
+ cstatus = nc_inq_grp_ncid(cncid, cgrp_name(1:ie+1), cparent_ncid)
+
+ If (cstatus == NC_NOERR) Then
+    parent_ncid = cparent_ncid
+ EndIf
+ status  = cstatus
+
+ End Function nf_inq_grp_ncid
+!-------------------------------- nf_inq_grp_full_ncid ------------------------
+ Function nf_inq_grp_full_ncid( ncid, name, grp_ncid) RESULT (status)
+
+! inquire grp ncid given full group name 
+
+ USE netcdf4_nc_interfaces
+
+ Implicit NONE
+
+ Integer,          Intent(IN)    :: ncid
+ Character(LEN=*), Intent(INOUT) :: name
+ Integer,          Intent(INOUT) :: grp_ncid
+
+ Integer                         :: status
+
+ Integer(KIND=C_INT)          :: cncid, cstatus, cgrp_ncid
+ Character(LEN=(LEN(name)+1)) :: cgrp_name
+ Integer                      :: ie
+
+! Test for C Null character in path and strip trailing blanks
+
+ cncid     = ncid
+ cgrp_name = REPEAT(" ",LEN(cgrp_name))
+ cgrp_name = addCNullChar(name, ie)
+
+ cstatus = nc_inq_grp_full_ncid(cncid, cgrp_name(1:ie+1), cgrp_ncid)
+
+ If (cstatus == NC_NOERR) Then
+    grp_ncid = cgrp_ncid
+ EndIf
+ status  = cstatus
+
+ End Function nf_inq_grp_full_ncid
+!-------------------------------- nf_inq_varids -------------------------------
+ Function nf_inq_varids( ncid, nvars, varids) RESULT (status)
+
+! inquire number of vars and varids 
+
+ USE netcdf4_nc_interfaces
+
+ Implicit NONE
+
+ Integer, Intent(IN)    :: ncid
+ Integer, Intent(OUT)   :: nvars 
+ Integer, Intent(INOUT) :: varids(*)
+
+ Integer                :: status
+
+ Integer(KIND=C_INT) :: cncid, cnvars, cstatus
+ 
+ cncid     = ncid
+ varids(1) = 0
+ 
+ cstatus = nc_inq_varids_f(cncid, cnvars, varids)
+
+ If (cstatus == NC_NOERR) Then
+    nvars  = cnvars 
+ EndIf
+ status = cstatus
+
+ End Function nf_inq_varids
+!-------------------------------- nf_inq_dimids -------------------------------
+ Function nf_inq_dimids( ncid, ndims, dimids, parent) RESULT (status)
+
+! inquire number of dimids 
+
+ USE netcdf4_nc_interfaces
+
+ Implicit NONE
+
+ Integer, Intent(IN)    :: ncid, parent
+ Integer, Intent(OUT)   :: ndims
+ Integer, Intent(INOUT) :: dimids(*)
+
+ Integer                :: status
+
+ Integer(KIND=C_INT) :: cncid, cndims, cparent, cstatus
+
+ cncid     = ncid
+ dimids(1) = 0
+ 
+ cstatus = nc_inq_dimids_f(cncid, cndims, dimids, cparent)
+
+ If (cstatus == NC_NOERR) Then
+    ndims  = cndims
+ EndIf
+ status = cstatus
+
+ End Function nf_inq_dimids
+!-------------------------------- nf_inq_typeids ------------------------------
+ Function nf_inq_typeids( ncid, ntypes, typeids) RESULT (status)
+
+! inquire number of types and typeids 
+
+ USE netcdf4_nc_interfaces
+
+ Implicit NONE
+
+ Integer, Intent(IN)    :: ncid
+ Integer, Intent(OUT)   :: ntypes
+ Integer, Intent(INOUT) :: typeids(*)
+
+ Integer                :: status
+
+ Integer(KIND=C_INT) :: cncid, cntypes, cstatus
+ Integer(KIND=C_INT) :: ctypeids(NC_MAX_DIMS)
+
+ cncid      = ncid
+ ctypeids   = 0
+ typeids(1) = 0
+ 
+ cstatus = nc_inq_typeids(cncid, cntypes, ctypeids)
+
+ If (cstatus == NC_NOERR) Then
+    ntypes            = cntypes
+    typeids(1:ntypes) = ctypeids(1:ntypes)
+ EndIf
+ status  = cstatus
+
+ End Function nf_inq_typeids
+!-------------------------------- nf_inq_typeid -------------------------------
+ Function nf_inq_typeid(ncid, name, typeid) RESULT (status)
+
+! inquire typeid for name 
+
+ USE netcdf4_nc_interfaces
+
+ Implicit NONE
+
+ Integer,          Intent(IN)  :: ncid
+ Character(LEN=*), Intent(IN)  :: name
+ Integer,          Intent(OUT) :: typeid
+
+ Integer                       :: status
+
+ Integer(KIND=C_INT)        :: cncid, ctypeid, cstatus
+ Character(LEN=LEN(name)+1) :: cname
+ Integer                    :: ie
+
+ cncid    = ncid
+ ctypeid  = 0
+ cname    = REPEAT(" ",LEN(cname))
+ cname    = addCNullChar(name, ie)
+
+ cstatus = nc_inq_typeid(cncid, cname(1:ie+1), ctypeid)
+
+ If (cstatus == NC_NOERR) Then
+    typeid = ctypeid
+ EndIf
+ status = cstatus
+
+ End Function nf_inq_typeid
+!-------------------------------- nf_def_grp ---------------------------------
+ Function nf_def_grp( parent_ncid, name, new_ncid) RESULT (status)
+
+! define new group given name 
+
+ USE netcdf4_nc_interfaces
+
+ Implicit NONE
+
+ Integer,          Intent(IN)  :: parent_ncid
+ Character(LEN=*), Intent(IN)  :: name
+ Integer,          Intent(OUT) :: new_ncid
+
+ Integer                       :: status
+
+ Integer(KIND=C_INT)          :: cncid, cnew_ncid, cstatus
+ Character(LEN=(LEN(name)+1)) :: cname
+ Integer                      :: ie
+
+ cncid = parent_ncid
+ cname = REPEAT(" ",LEN(cname))
+ cname = addCNullChar(name, ie)
+
+ cstatus = nc_def_grp(cncid, cname(1:ie+1), cnew_ncid)
+
+ If (cstatus == NC_NOERR) Then
+    new_ncid = cnew_ncid 
+ EndIf
+ status   = cstatus
+
+ End Function nf_def_grp
+!-------------------------------- nf_rename_grp -------------------------------
+ Function nf_rename_grp( grpid, name) RESULT (status)
+
+! rename previously defined group
+
+ USE netcdf4_nc_interfaces
+
+ Implicit NONE
+
+ Integer,          Intent(IN)  :: grpid
+ Character(LEN=*), Intent(IN)  :: name
+
+ Integer                       :: status
+
+ Integer(KIND=C_INT)          :: cgrpid, cstatus
+ Character(LEN=(LEN(name)+1)) :: cname
+ Integer                      :: ie
+
+ cgrpid = grpid
+ cname  = REPEAT(" ",LEN(cname))
+ cname  = addCNullChar(name, ie)
+
+ cstatus = nc_rename_grp(cgrpid, cname(1:ie+1))
+
+ status   = cstatus
+
+ End Function nf_rename_grp
+!-------------------------------- nf_def_compound -----------------------------
+ Function nf_def_compound( ncid, isize, name, typeid) RESULT (status)
+
+! define new group given name 
+
+ USE netcdf4_nc_interfaces
+
+ Implicit NONE
+
+ Integer,          Intent(IN)  :: ncid, isize
+ Integer,          Intent(OUT) :: typeid 
+ Character(LEN=*), Intent(IN)  :: name
+
+ Integer                       :: status
+
+ Integer(KIND=C_INT)          :: cncid, ctypeid, cstatus
+ Integer(KIND=C_SIZE_T)       :: csize
+ Character(LEN=(LEN(name)+1)) :: cname
+ Integer                      :: ie
+
+ cncid = ncid
+ csize = isize
+ cname = REPEAT(" ",LEN(cname))
+ cname = addCNullChar(name, ie)
+
+ cstatus = nc_def_compound(cncid, csize, cname(1:ie+1), ctypeid)
+
+ If (cstatus == NC_NOERR) Then
+    typeid = ctypeid
+ EndIf
+ status = cstatus
+
+ End Function nf_def_compound
+!-------------------------------- nf_insert_compound --------------------------
+ Function nf_insert_compound( ncid, xtype, name, offset, field_typeid) &
+                              RESULT (status)
+
+! define new group given name 
+
+ USE netcdf4_nc_interfaces
+
+ Implicit NONE
+
+ Integer,          Intent(IN) :: ncid, xtype, field_typeid, offset 
+ Character(LEN=*), Intent(IN) :: name
+
+ Integer                      :: status
+
+ Integer(KIND=C_INT)          :: cncid, cxtype, ctypeid, cstatus
+ Integer(KIND=C_SIZE_T)       :: coffset
+ Character(LEN=(LEN(name)+1)) :: cname
+ Integer                      :: ie
+
+ cncid   = ncid
+ cxtype  = xtype
+ ctypeid = field_typeid
+ coffset = offset
+ cname   = REPEAT(" ",LEN(cname))
+ cname   = addCNullChar(name, ie)
+
+ cstatus = nc_insert_compound(cncid, cxtype, cname(1:ie+1), &
+                              coffset, ctypeid)
+
+ status = cstatus
+
+ End Function nf_insert_compound
+!-------------------------------- nf_insert_array_compound --------------------
+ Function nf_insert_array_compound( ncid, xtype, name, offset, field_typeid, &
+                                    ndims, dim_sizes) RESULT (status)
+
+! define new group given name 
+
+ USE netcdf4_nc_interfaces
+
+ Implicit NONE
+
+ Integer,          Intent(IN)    :: ncid, xtype, field_typeid, offset, ndims
+ Character(LEN=*), Intent(IN)    :: name
+ Integer,          Intent(INOUT) :: dim_sizes(*)
+
+ Integer                         :: status
+
+ Integer(KIND=C_INT)          :: cncid, cxtype, ctypeid, cndims, cstatus
+ Integer(KIND=C_SIZE_T)       :: coffset
+ Character(LEN=(LEN(name)+1)) :: cname
+ Integer                      :: ie
+
+ cncid   = ncid
+ cxtype  = xtype
+ ctypeid = field_typeid
+ coffset = offset
+ cndims  = ndims
+ cname   = REPEAT(" ",LEN(cname))
+ cname   = addCNullChar(name, ie)
+
+ cstatus = nc_insert_array_compound_f(cncid, cxtype, cname(1:ie+1), &
+                                      coffset, ctypeid, cndims, dim_sizes)
+
+ status = cstatus
+
+ End Function nf_insert_array_compound
+!-------------------------------- nf_inq_type ---------------------------------
+ Function nf_inq_type( ncid, xtype, name, isize) RESULT (status)
+
+! define new group given name 
+
+ USE netcdf4_nc_interfaces
+
+ Implicit NONE
+
+ Integer,          Intent(IN)  :: ncid, xtype
+ Character(LEN=*), Intent(IN)  :: name
+ Integer,          Intent(OUT) :: isize
+
+ Integer                       :: status
+
+ Integer(KIND=C_INT)          :: cncid, cxtype, cstatus
+ Integer(KIND=C_SIZE_T)       :: csize
+ Character(LEN=(LEN(name)+1)) :: cname
+ Integer                      :: ie
+
+ cncid  = ncid
+ cxtype = xtype
+ cname  = REPEAT(" ",LEN(cname))
+ cname  = addCNullChar(name, ie)
+
+ cstatus = nc_inq_type(cncid, cxtype, cname(1:ie+1), csize)
+
+ If (cstatus == NC_NOERR) Then
+    isize  = csize
+ EndIf
+ status = cstatus
+
+ End Function nf_inq_type
+!-------------------------------- nf_inq_compound -----------------------------
+ Function nf_inq_compound( ncid, xtype, name, isize, nfields) RESULT (status)
+
+! return size and nfield for compound given ncid, xtype, and name
+
+ USE netcdf4_nc_interfaces
+
+ Implicit NONE
+
+ Integer,          Intent(IN)    :: ncid, xtype
+ Character(LEN=*), Intent(INOUT) :: name
+ Integer,          Intent(INOUT) :: isize, nfields
+
+ Integer                         :: status
+
+ Integer(KIND=C_INT)          :: cncid, cxtype, cstatus
+ Integer(KIND=C_SIZE_T)       :: csize, cnfieldsp
+ Character(LEN=NC_MAX_NAME+1) :: cname
+ Integer                      :: nlen
+
+ cncid  = ncid
+ cxtype = xtype
+ nlen   = LEN(name)
+ name   = REPEAT(" ", nlen)
+ cname  = REPEAT(" ", LEN(cname))
+
+ cstatus = nc_inq_compound(cncid, cxtype, cname, csize, cnfieldsp)
+
+ If (cstatus == NC_NOERR) Then
+    ! Test for C Null character in path and strip trailing blanks
+    name       = stripCNullChar(cname, nlen)
+    isize      = csize
+    nfields    = cnfieldsp
+ EndIf
+ status  = cstatus
+
+ End Function nf_inq_compound
+!-------------------------------- nf_inq_compound_name ------------------------
+ Function nf_inq_compound_name( ncid, xtype, name) RESULT (status)
+
+! inquire compound name 
+
+ USE netcdf4_nc_interfaces
+
+ Implicit NONE
+
+ Integer,          Intent(IN)  :: ncid, xtype
+ Character(LEN=*), Intent(OUT) :: name
+
+ Integer                       :: status
+
+ Integer(KIND=C_INT)          :: cncid, cxtype, cstatus
+ Character(LEN=NC_MAX_NAME+1) :: cname
+ Integer                      :: nlen
+
+ cncid  = ncid
+ cxtype = xtype
+ nlen   = LEN(name)
+ name   = REPEAT(" ",LEN(name))
+ cname  = REPEAT(" ",LEN(cname))
+ 
+ cstatus = nc_inq_compound_name(cncid, cxtype, cname)
+
+ If (cstatus == NC_NOERR) Then
+     name = stripCNullChar(cname, nlen)
+ EndIf
+ status = cstatus
+
+ End Function nf_inq_compound_name
+!-------------------------------- nf_inq_compound_size -------------------------
+ Function nf_inq_compound_size( ncid, xtype, isize) RESULT (status)
+
+! return size compound given ncid, xtype
+
+ USE netcdf4_nc_interfaces
+
+ Implicit NONE
+
+ Integer, Intent(IN)    :: ncid, xtype
+ Integer, Intent(INOUT) :: isize
+
+ Integer                :: status
+
+ Integer(KIND=C_INT)    :: cncid, cxtype, cstatus
+ Integer(KIND=C_SIZE_T) :: csize
+
+ cncid  = ncid
+ cxtype = xtype
+
+ cstatus = nc_inq_compound_size(cncid, cxtype, csize)
+
+ If (cstatus == NC_NOERR) Then
+    isize  = csize
+ EndIf
+ status = cstatus
+
+ End Function nf_inq_compound_size
+!-------------------------------- nf_inq_compound_nfields ----------------------
+ Function nf_inq_compound_nfields( ncid, xtype, nfields) RESULT (status)
+
+! return size compound given ncid, xtype
+
+ USE netcdf4_nc_interfaces
+
+ Implicit NONE
+
+ Integer, Intent(IN)    :: ncid, xtype
+ Integer, Intent(INOUT) :: nfields 
+
+ Integer                :: status
+
+ Integer(KIND=C_INT)    :: cncid, cxtype, cstatus
+ Integer(KIND=C_SIZE_T) :: cnfields
+
+ cncid  = ncid
+ cxtype = xtype
+
+ cstatus = nc_inq_compound_nfields(cncid, cxtype, cnfields)
+
+ If (cstatus == NC_NOERR) Then
+    nfields = cnfields
+ EndIf
+ status  = cstatus
+
+ End Function nf_inq_compound_nfields
+!-------------------------------- nf_inq_compound_field -----------------------
+ Function nf_inq_compound_field( ncid, xtype, fieldid, name, offset, &
+                                field_typeid, ndims, dim_sizes) RESULT (status)
+
+! inquire compound name 
+
+ USE netcdf4_nc_interfaces
+
+ Implicit NONE
+
+ Integer,          Intent(IN)  :: ncid, xtype, fieldid
+ Character(LEN=*), Intent(OUT) :: name
+ Integer,          Intent(OUT) :: offset, field_typeid, ndims
+ Integer,          Intent(OUT) :: dim_sizes(*)
+
+ Integer                       :: status
+
+ Integer(KIND=C_INT)          :: cncid, cxtype, cfieldid, cfield_typeid, &
+                                 cndims, cstatus
+ Integer(KIND=C_INT)          :: cdim_sizes(NC_MAX_DIMS)
+ Integer(KIND=C_SIZE_T)       :: coffset
+ Character(LEN=NC_MAX_NAME+1) :: cname
+ Integer                      :: nlen
+
+ cncid    = ncid
+ cxtype   = xtype
+ cfieldid = fieldid-1
+ nlen     = LEN(name)
+ name     = REPEAT(" ",LEN(name))
+ cname    = REPEAT(" ",LEN(cname))
+ 
+ cstatus = nc_inq_compound_field_f(cncid, cxtype, cfieldid, cname, coffset, &
+                                   cfield_typeid, cndims, cdim_sizes)
+
+ If (cstatus == NC_NOERR) Then
+    name               = stripCNullChar(cname, nlen)
+    offset             = coffset
+    field_typeid       = cfield_typeid
+    ndims              = cndims
+    dim_sizes(1:ndims) = cdim_sizes(1:ndims)
+ EndIf
+ status = cstatus
+
+ End Function nf_inq_compound_field
+!-------------------------------- nf_inq_compound_fieldname -------------------
+ Function nf_inq_compound_fieldname(ncid, xtype, fieldid, name) RESULT(status)
+
+! inquire compound field name 
+
+ USE netcdf4_nc_interfaces
+
+ Implicit NONE
+
+ Integer,          Intent(IN)  :: ncid, xtype, fieldid
+ Character(LEN=*), Intent(OUT) :: name
+
+ Integer                       :: status
+
+ Integer(KIND=C_INT)          :: cncid, cxtype, cfieldid, cstatus
+ Character(LEN=NC_MAX_NAME+1) :: cname
+ Integer                      :: nlen
+
+ cncid    = ncid
+ cxtype   = xtype
+ cfieldid = fieldid - 1
+ nlen     = LEN(name)
+ name     = REPEAT(" ",LEN(name))
+ cname    = REPEAT(" ",LEN(cname))
+ 
+ cstatus = nc_inq_compound_fieldname(cncid, cxtype, cfieldid, cname)
+
+ If (cstatus == NC_NOERR) Then
+    name = stripCNullChar(cname, nlen)
+ EndIf
+ status = cstatus
+
+ End Function nf_inq_compound_fieldname
+!-------------------------------- nf_inq_compound_fieldindex ------------------
+ Function nf_inq_compound_fieldindex( ncid, xtype, name, fieldid) RESULT (status)
+
+! define new group given name 
+
+ USE netcdf4_nc_interfaces
+
+ Implicit NONE
+
+ Integer,          Intent(IN)  :: ncid, xtype
+ Character(LEN=*), Intent(IN)  :: name
+ Integer,          Intent(OUT) :: fieldid
+
+ Integer                       :: status
+
+ Integer(KIND=C_INT)          :: cncid, cxtype, cfieldid, cstatus
+ Character(LEN=(LEN(name)+1)) :: cname
+ Integer                      :: ie
+
+ cncid  = ncid
+ cxtype = xtype
+ cname  = REPEAT(" ",LEN(cname))
+ cname  = addCNullChar(name, ie)
+
+ cstatus = nc_inq_compound_fieldindex(cncid, cxtype, cname(1:ie+1), cfieldid)
+
+ If (cstatus == NC_NOERR) Then
+    fieldid = cfieldid + 1
+ EndIf
+ status  = cstatus
+
+ End Function nf_inq_compound_fieldindex
+!-------------------------------- nf_inq_compound_fieldoffset ----------------
+ Function nf_inq_compound_fieldoffset( ncid, xtype, fieldid, offset)&
+                                       RESULT (status)
+
+! inquire compound field offset 
+
+ USE netcdf4_nc_interfaces
+
+ Implicit NONE
+
+ Integer, Intent(IN)  :: ncid, xtype, fieldid
+ Integer, Intent(OUT) :: offset
+
+ Integer              :: status
+
+ Integer(KIND=C_INT)    :: cncid, cxtype, cfieldid, cstatus
+ Integer(KIND=C_SIZE_T) :: coffset
+
+ cncid    = ncid
+ cxtype   = xtype
+ cfieldid = fieldid - 1
+
+ cstatus = nc_inq_compound_fieldoffset(cncid, cxtype, cfieldid, coffset)
+
+ If (cstatus == NC_NOERR) Then
+    offset = coffset
+ EndIf
+ status = cstatus
+
+ End Function nf_inq_compound_fieldoffset
+!-------------------------------- nf_inq_compound_fieldtype -------------------
+ Function nf_inq_compound_fieldtype( ncid, xtype, fieldid, field_typeid) &
+                                    RESULT (status)
+
+! define new group given name 
+
+ USE netcdf4_nc_interfaces
+
+ Implicit NONE
+
+ Integer, Intent(IN)  :: ncid, xtype, fieldid
+ Integer, Intent(OUT) :: field_typeid
+
+ Integer              :: status
+
+ Integer(KIND=C_INT) :: cncid, cxtype, cfieldid, cfield_typeid, cstatus
+
+ cncid    = ncid
+ cxtype   = xtype
+ cfieldid = fieldid -1 
+
+ cstatus = nc_inq_compound_fieldtype(cncid, cxtype, cfieldid, cfield_typeid)
+
+ If (cstatus == NC_NOERR) Then
+    field_typeid = cfield_typeid
+ EndIf
+ status  = cstatus
+
+ End Function nf_inq_compound_fieldtype
+!-------------------------------- nf_inq_compound_fieldndims ------------------
+ Function nf_inq_compound_fieldndims( ncid, xtype, fieldid, ndims) RESULT (status)
+
+! define new group given name 
+
+ USE netcdf4_nc_interfaces
+
+ Implicit NONE
+
+ Integer, Intent(IN)  :: ncid, xtype, fieldid
+ Integer, Intent(OUT) :: ndims
+
+ Integer              :: status
+
+ Integer(KIND=C_INT) :: cncid, cxtype, cfieldid, cndims, cstatus
+
+ cncid    = ncid
+ cxtype   = xtype
+ cfieldid = fieldid -1
+
+ cstatus = nc_inq_compound_fieldndims(cncid, cxtype, cfieldid, cndims)
+
+ If (cstatus == NC_NOERR) Then
+    ndims = cndims 
+ EndIf
+ status = cstatus
+
+ End Function nf_inq_compound_fieldndims
+!-------------------------------- nf_inq_compound_fielddim_sizes --------------
+ Function nf_inq_compound_fielddim_sizes( ncid, xtype, fieldid, dim_sizes) &
+                                          RESULT (status)
+
+! inq compound field dimension sizes 
+
+ USE netcdf4_nc_interfaces
+
+ Implicit NONE
+
+ Integer, Intent(IN)    :: ncid, xtype, fieldid
+ Integer, Intent(INOUT) :: dim_sizes(*)
+
+ Integer                :: status
+
+ Integer(KIND=C_INT) :: cncid, cxtype, cfieldid, cstatus 
+
+ cncid    = ncid
+ cxtype   = xtype
+ cfieldid = fieldid - 1 
+
+ cstatus = nc_inq_compound_fielddim_sizes(cncid, cxtype, cfieldid, dim_sizes)
+
+ status = cstatus
+
+ End Function nf_inq_compound_fielddim_sizes
+!-------------------------------- nf_def_vlen ---------------------------------
+ Function nf_def_vlen( ncid, name, base_typeid, xtype) RESULT (status)
+
+! define variable length data 
+
+ USE netcdf4_nc_interfaces
+
+ Implicit NONE
+
+ Integer,          Intent(IN)  :: ncid, base_typeid 
+ Character(LEN=*), Intent(IN)  :: name
+ Integer,          Intent(OUT) :: xtype
+
+ Integer                       :: status
+
+ Integer(KIND=C_INT)          :: cncid, cxtype, cbase_typeid, cstatus
+ Character(LEN=(LEN(name)+1)) :: cname
+ Integer                      :: ie
+
+ cncid        = ncid
+ cxtype       = xtype
+ cbase_typeid = base_typeid
+ cname        = REPEAT(" ",LEN(cname))
+ cname        = addCNullChar(name, ie)
+
+ cstatus = nc_def_vlen(cncid, cname(1:ie+1), cbase_typeid, cxtype)
+
+ If (cstatus == NC_NOERR) Then
+    xtype  = cxtype
+ EndIf
+ status = cstatus
+
+ End Function nf_def_vlen
+!-------------------------------- nf_inq_vlen ---------------------------------
+ Function nf_inq_vlen( ncid, xtype, name, datum_size, base_type) RESULT(status) 
+
+! inquire variable length array info 
+
+ USE netcdf4_nc_interfaces
+
+ Implicit NONE
+
+ Integer,          Intent(IN)  :: ncid, xtype
+ Character(LEN=*), Intent(OUT) :: name
+ Integer,          Intent(OUT) :: datum_size, base_type
+
+ Integer                       :: status
+
+ Integer(KIND=C_INT)          :: cncid, cxtype, cbase_type, cstatus
+ Integer(KIND=C_SIZE_T)       :: cdatum_size
+ Character(LEN=NC_MAX_NAME+1) :: cname
+ Integer                      :: nlen
+
+ cncid  = ncid
+ cxtype = xtype
+ nlen   = LEN(name)
+ name   = REPEAT(" ",LEN(name))
+ cname  = REPEAT(" ",LEN(cname))
+ 
+ cstatus = nc_inq_vlen(cncid, cxtype, cname, cdatum_size, cbase_type)
+
+ If (cstatus == NC_NOERR) Then
+    name       = stripCNullChar(cname, nlen)
+    datum_size = cdatum_size 
+    base_type  = cbase_type 
+ EndIf
+ status = cstatus
+
+ End Function nf_inq_vlen
+!-------------------------------- nf_inq_user_type ----------------------------
+ Function nf_inq_user_type( ncid, xtype, name, isize, base_type, nfields, &
+                            iclass) RESULT (status)
+
+! return size and nfield, class, and base type for user type given 
+! ncid, xtype, and name
+
+ USE netcdf4_nc_interfaces
+
+ Implicit NONE
+
+ Integer,          Intent(IN)    :: ncid, xtype
+ Character(LEN=*), Intent(INOUT) :: name
+ Integer,          Intent(OUT)   :: isize, nfields, base_type, iclass
+
+ Integer                         :: status
+
+ Integer(KIND=C_INT)          :: cncid, cxtype, cbase_type, cclass, cstatus
+ Integer(KIND=C_SIZE_T)       :: csize, cnfields
+ Character(LEN=NC_MAX_NAME+1) :: cname
+ Integer                      :: nlen
+
+ cncid  = ncid
+ cxtype = xtype
+ nlen   = LEN(name)
+ name   = REPEAT(" ",LEN(name))
+ cname  = REPEAT(" ",LEN(cname))
+ 
+
+ cstatus = nc_inq_user_type(cncid, cxtype, cname, csize, cbase_type, cnfields, &
+                           cclass)
+
+ If (cstatus == NC_NOERR) Then
+    ! Test for C Null character in path and strip trailing blanks
+    name       = stripCNullChar(cname, nlen)
+    isize      = csize
+    nfields    = cnfields
+    iclass     = cclass
+    base_type  = cbase_type
+ EndIf
+ status = cstatus
+
+ End Function nf_inq_user_type
+!-------------------------------- nf_def_enum ---------------------------------
+ Function nf_def_enum( ncid, base_typeid, name, typeid) RESULT (status)
+
+! define new group given name 
+
+ USE netcdf4_nc_interfaces
+
+ Implicit NONE
+
+ Integer,          Intent(IN)  :: ncid, base_typeid 
+ Character(LEN=*), Intent(IN)  :: name
+ Integer,          Intent(OUT) :: typeid
+
+ Integer                       :: status
+
+ Integer(KIND=C_INT)          :: cncid, cbase_typeid, ctypeid, cstatus
+ Character(LEN=(LEN(name)+1)) :: cname
+ Integer                      :: ie
+
+ cncid        = ncid
+ cbase_typeid = base_typeid
+ cname        = REPEAT(" ",LEN(cname))
+ cname        = addCNullChar(name, ie)
+
+ cstatus = nc_def_enum(cncid, cbase_typeid, cname(1:ie+1), ctypeid)
+
+ If (cstatus == NC_NOERR) Then
+    typeid = ctypeid
+ EndIf
+ status = cstatus
+
+ End Function nf_def_enum
+!-------------------------------- nf_insert_enum -------------------------------
+ Function nf_insert_enum( ncid, xtype, name, value) RESULT (status)
+
+! define a value for an enum. We used a C_CHAR string to pass the data
+! into nf_insert_enum and a C_PTR type to pass the address of value
+! into nc_insert_enum which is expecting a void pointer. Don't use
+! an explicit interface to nf_insert_enum in the calling program
+! for any data type other than character. Just declare it external
+
+ USE netcdf4_nc_interfaces
+
+ Implicit NONE
+
+ Integer,                Intent(IN)         :: ncid, xtype 
+ Character(LEN=*),       Intent(IN)         :: name
+ Character(KIND=C_CHAR), Intent(IN), TARGET :: value(*)
+
+ Integer                                    :: status
+
+ Integer(KIND=C_INT)          :: cncid, cxtype, cstatus
+ Type(C_PTR)                  :: cvalueptr
+ Character(LEN=(LEN(name)+1)) :: cname
+ Integer                      :: ie
+
+ cncid  = ncid
+ cxtype = xtype
+ cname  = REPEAT(" ",LEN(cname))
+ cname  = addCNullChar(name, ie)
+
+ cvalueptr = C_LOC(value)
+
+ cstatus = nc_insert_enum(cncid, cxtype, cname(1:ie+1), cvalueptr)
+
+ status = cstatus
+
+ End Function nf_insert_enum
+!-------------------------------- nf_inq_enum ------------------------------
+ Function nf_inq_enum( ncid, xtype, name, base_nf_type, base_size, &
+                       num_members) RESULT (status)
+
+! get information about an enum. 
+
+ USE netcdf4_nc_interfaces
+
+ Implicit NONE
+
+ Integer,          Intent(IN)    :: ncid, xtype
+ Character(LEN=*), Intent(INOUT) :: name
+ Integer,          Intent(INOUT) :: base_nf_type, base_size, num_members
+
+ Integer                         :: status
+
+ Integer(KIND=C_INT)          :: cncid, cxtype, c_base_nf_type, cstatus
+ Integer(KIND=C_SIZE_T)       :: c_base_size, c_num_members
+ Character(LEN=NC_MAX_NAME+1) :: cname
+ Integer                      :: nlen
+
+ cncid  = ncid
+ cxtype = xtype
+ nlen   = LEN(name)
+ name   = REPEAT(" ",LEN(name))
+ cname  = REPEAT(" ",LEN(cname))
+
+ cstatus = nc_inq_enum (cncid, cxtype, cname, c_base_nf_type, c_base_size, &
+                        c_num_members)
+
+ If (cstatus == NC_NOERR) Then
+    ! Test for C Null character in path and strip trailing blanks
+    name         = stripCNullChar(cname, nlen)
+    base_nf_type = c_base_nf_type
+    base_size    = c_base_size
+    num_members  = c_num_members
+ EndIf
+ status = cstatus
+
+ End Function nf_inq_enum
+!-------------------------------- nf_inq_enum_member ---------------------------
+ Function nf_inq_enum_member( ncid, xtype, idx, name, value) RESULT (status)
+
+! Get name and value for an enum. We use a C_CHAR string to pass data
+! from nc_inq_enum_member to the calling routine. Value is a void
+! pointer in nc_inq_enum_member. Don't use an explicit interface in
+! the calling program. Declare nf_inq_enum_member external
+
+ USE netcdf4_nc_interfaces
+
+ Implicit NONE
+
+ Integer,                Intent(IN)  :: ncid, xtype, idx 
+ Character(LEN=*),       Intent(OUT) :: name
+ Character(KIND=C_CHAR), Intent(OUT) :: value(*)
+
+ Integer                             :: status
+
+ Integer(KIND=C_INT)          :: cncid, cxtype, cidx, cstatus
+ Character(LEN=NC_MAX_NAME+1) :: cname
+ Integer                      :: nlen
+
+ cncid  = ncid
+ cxtype = xtype
+ cidx   = idx - 1
+ nlen   = LEN(name)
+ name  = REPEAT(" ",LEN(name))
+ cname = REPEAT(" ",LEN(cname))
+
+ cstatus = nc_inq_enum_member(cncid, cxtype, cidx, cname, value)
+
+ If (cstatus == NC_NOERR) Then
+    ! Test for C Null character in path and strip trailing blanks
+    name = stripCNullChar(cname, nlen)
+ EndIf
+ status = cstatus
+
+ End Function nf_inq_enum_member
+!-------------------------------- nf_inq_enum_ident ---------------------------
+ Function nf_inq_enum_ident( ncid, xtype, value, name) RESULT (status)
+
+! get name of enum identifier given value, type.
+
+ USE netcdf4_nc_interfaces
+
+ Implicit NONE
+
+ Integer,          Intent(IN)    :: ncid, xtype, value
+ Character(LEN=*), Intent(INOUT) :: name
+
+ Integer                         :: status
+
+ Integer(KIND=C_INT)          :: cncid, cxtype, cstatus
+ Integer(KIND=C_LONG_LONG)    :: cvalue  
+ Character(LEN=NC_MAX_NAME+1) :: cname
+ Integer                      :: nlen
+
+ cncid  = ncid
+ cxtype = xtype
+ cvalue = value
+ nlen   = LEN(name)
+ name   = REPEAT(" ",LEN(name))
+ cname  = REPEAT(" ",LEN(cname))
+
+ cstatus = nc_inq_enum_ident(cncid, cxtype, cvalue, cname)
+
+ If (cstatus == NC_NOERR) Then
+    ! Test for C Null character in path and strip trailing blanks
+    name = stripCNullChar(cname, nlen)
+ EndIf
+ status = cstatus
+
+ End Function nf_inq_enum_ident
+!-------------------------------- nf_def_opaque -------------------------------
+ Function nf_def_opaque( ncid, isize, name, xtype) RESULT (status)
+
+! define new group given name 
+
+ USE netcdf4_nc_interfaces
+
+ Implicit NONE
+
+ Integer,          Intent(IN)  :: ncid, isize
+ Character(LEN=*), Intent(IN)  :: name
+ Integer,          Intent(OUT) :: xtype
+
+ Integer                       :: status
+
+ Integer(KIND=C_INT)          :: cncid, cxtype, cstatus
+ Integer(KIND=C_SIZE_T)       :: csize
+ Character(LEN=(LEN(name)+1)) :: cname
+ Integer                      :: ie
+
+ cncid  = ncid
+ csize  = isize
+ cxtype = xtype
+ cname  = REPEAT(" ",LEN(cname))
+ cname  = addCNullChar(name, ie)
+
+ cstatus = nc_def_opaque(cncid, csize, cname(1:ie+1), cxtype)
+
+ If (cstatus == NC_NOERR) Then
+    xtype  = cxtype 
+ EndIf
+ status = cstatus
+
+ End Function nf_def_opaque
+!-------------------------------- nf_inq_opaque -------------------------------
+ Function nf_inq_opaque( ncid, xtype, name, isize) RESULT (status)
+
+
+ USE netcdf4_nc_interfaces
+
+ Implicit NONE
+
+ Integer,          Intent(IN)    :: ncid, xtype
+ Character(LEN=*), Intent(INOUT) :: name
+ Integer,          Intent(OUT)   :: isize
+
+ Integer                         :: status
+
+ Integer(KIND=C_INT)          :: cncid, cxtype, cstatus
+ Integer(KIND=C_SIZE_T)       :: csize
+ Character(LEN=NC_MAX_NAME+1) :: cname
+ Integer                      :: nlen
+
+ cncid  = ncid
+ cxtype = xtype
+ nlen   = LEN(name)
+ name   = REPEAT(" ",LEN(name))
+ cname  = REPEAT(" ",LEN(cname))
+
+ cstatus = nc_inq_opaque(cncid, cxtype, cname, csize)
+
+ If (cstatus == NC_NOERR) Then
+    ! Test for C Null character in path and strip trailing blanks
+    name   = stripCNullChar(cname, nlen)
+    isize  = csize
+ EndIf
+ status = cstatus
+
+ End Function nf_inq_opaque
+!-------------------------------- nf_def_var_chunking -------------------------
+ Function nf_def_var_chunking( ncid, varid, contiguous, chunksizes) &
+                               RESULT(status)
+
+! define variable chunking
+
+ USE netcdf4_nc_interfaces
+
+ Implicit NONE
+
+ Integer, Intent(IN)    :: ncid, varid, contiguous
+ Integer, Intent(INOUT) :: chunksizes(*)
+
+ Integer                :: status
+
+ Integer(KIND=C_INT)         :: cncid, cvarid, ccontiguous, cstat1, cstatus, &
+                                cndims
+ Integer(KIND=C_INT), TARGET :: cchunksizes(NC_MAX_DIMS)
+ Type(C_PTR)                 :: cchunksizeptr
+ Integer                     :: i, ndims
+
+ cncid       = ncid
+ cvarid      = varid-1
+ ccontiguous = contiguous
+
+ cstat1 = nc_inq_varndims(cncid, cvarid, cndims)
+
+ ndims         = cndims
+ cchunksizeptr = C_NULL_PTR
+
+ If (cstat1 == NC_NOERR) Then
+   If (ndims > 0) Then 
+     cchunksizes(1:ndims) = chunksizes(ndims:1:-1)
+   EndIf
+   cchunksizeptr = C_LOC(cchunksizes)
+ EndIf
+
+ cstatus = nc_def_var_chunking_ints(cncid, cvarid, ccontiguous, cchunksizeptr)
+
+ status = cstatus
+
+ End Function nf_def_var_chunking
+!-------------------------------- nf_inq_var_chunking -------------------------
+ Function nf_inq_var_chunking( ncid, varid, contiguous, chunksizes) RESULT(status)
+
+! inquire variable chunking 
+
+ USE netcdf4_nc_interfaces
+
+ Implicit NONE
+
+ Integer, Intent(IN)    :: ncid, varid
+ Integer, Intent(INOUT) :: contiguous
+ Integer, Intent(INOUT) :: chunksizes(*)
+
+ Integer                :: status
+
+ Integer(KIND=C_INT) :: cncid, cvarid, ccontiguous, cstatus, cstat1, cndims
+ Integer(KIND=C_INT) :: cchunksizes(NC_MAX_DIMS)
+ Integer             :: ndims
+
+ cncid         = ncid
+ cvarid        = varid-1
+ chunksizes(1) = 0
+
+ cstatus = nc_inq_var_chunking_ints(cncid, cvarid, ccontiguous, cchunksizes) 
+
+ cstat1  = nc_inq_varndims(cncid, cvarid, cndims)
+
+ ndims = cndims
+
+ If (cstat1 == NC_NOERR) Then
+   If (ndims > 0) Then
+     chunksizes(ndims:1:-1) = cchunksizes(1:ndims)
+   EndIf
+ EndIf 
+   
+ contiguous = ccontiguous
+ status     = cstatus
+
+ End Function nf_inq_var_chunking
+!-------------------------------- nf_def_var_deflate --------------------------
+ Function nf_def_var_deflate( ncid, varid, shuffle, deflate, deflate_level) &
+                               RESULT (status)
+
+! define variable deflation 
+
+ USE netcdf4_nc_interfaces
+
+ Implicit NONE
+
+ Integer, Intent(IN) :: ncid, varid, shuffle, deflate, deflate_level
+
+ Integer             :: status
+
+ Integer(KIND=C_INT) :: cncid, cvarid, cshuffle, cdeflate, cdeflate_level, &
+                        cstatus
+
+ cncid          = ncid
+ cvarid         = varid-1
+ cshuffle       = shuffle
+ cdeflate       = deflate
+ cdeflate_level = deflate_level
+
+ cstatus = nc_def_var_deflate(cncid, cvarid, cshuffle, cdeflate, cdeflate_level) 
+
+ status = cstatus
+
+ End Function nf_def_var_deflate
+!-------------------------------- nf_inq_var_deflate -------------------------
+ Function nf_inq_var_deflate( ncid, varid, shuffle, deflate, deflate_level) &
+                               RESULT (status)
+
+! inquire variable deflation 
+
+ USE netcdf4_nc_interfaces
+
+ Implicit NONE
+
+ Integer, Intent(IN)  :: ncid, varid
+ Integer, Intent(OUT) :: shuffle, deflate, deflate_level
+
+ Integer              :: status
+
+ Integer(KIND=C_INT) :: cncid, cvarid, cshuffle, cdeflate, cdeflate_level, &
+                        cstatus
+
+ cncid  = ncid
+ cvarid = varid-1
+
+ cstatus = nc_inq_var_deflate(cncid, cvarid, cshuffle, cdeflate, cdeflate_level) 
+
+ If (cstatus == NC_NOERR) Then
+    shuffle       = cshuffle
+    deflate       = cdeflate
+    deflate_level = cdeflate_level
+ EndIf
+ status = cstatus
+ 
+ End Function nf_inq_var_deflate
+
+!-------------------------------- nf_inq_var_szip -----------------------------
+ Function nf_inq_var_szip(ncid, varid, options_mask, pixels_per_block) RESULT(status)
+
+! get szip variables
+ 
+ USE netcdf4_nc_interfaces
+
+ Implicit NONE
+
+ Integer, Intent(IN)    :: ncid, varid
+ Integer, Intent(INOUT) :: options_mask, pixels_per_block
+
+ Integer                :: status
+
+ Integer(C_INT) :: cncid, cvarid, coptions_mask, cpixels_per_block, cstatus
+
+ cncid  = ncid
+ cvarid = varid-1
+
+ cstatus = nc_inq_var_szip(cncid, cvarid, coptions_mask, cpixels_per_block)
+
+ If (cstatus == NC_NOERR) Then
+    options_mask     = coptions_mask
+    pixels_per_block = cpixels_per_block
+ EndIf
+ status = cstatus
+
+ End Function nf_inq_var_szip
+
+!-------------------------------- nf_def_var_fletcher32 -----------------------
+ Function nf_def_var_fletcher32( ncid, varid, fletcher32) RESULT(status)
+
+! define var for fletcher32 
+
+ USE netcdf4_nc_interfaces
+
+ Implicit NONE
+
+ Integer, Intent(IN) :: ncid, varid, fletcher32
+
+ Integer             :: status
+
+ Integer(KIND=C_INT) :: cncid, cvarid, cfletcher32, cstatus
+
+ cncid       = ncid
+ cvarid      = varid-1
+ cfletcher32 = fletcher32 
+
+ cstatus = nc_def_var_fletcher32(cncid, cvarid, cfletcher32)
+ 
+ status = cstatus
+
+ End Function nf_def_var_fletcher32
+!-------------------------------- nf_inq_var_fletcher32 ------------------------
+ Function nf_inq_var_fletcher32( ncid, varid, fletcher32) RESULT(status)
+
+! get var for fletcher 32 
+
+ USE netcdf4_nc_interfaces
+
+ Implicit NONE
+
+ Integer, Intent(IN)  :: ncid, varid
+ Integer, Intent(OUT) :: fletcher32
+
+ Integer              :: status
+
+ Integer(KIND=C_INT) :: cncid, cvarid, cfletcher32, cstatus
+
+ cncid  = ncid
+ cvarid = varid-1
+
+ cstatus = nc_inq_var_fletcher32(cncid, cvarid, cfletcher32)
+
+ If (cstatus == NC_NOERR) Then
+    fletcher32 = cfletcher32 
+ EndIf
+ 
+ status = cstatus
+
+ End Function nf_inq_var_fletcher32
+!-------------------------------- nf_def_var_fill -----------------------------
+ Function nf_def_var_fill( ncid, varid, no_fill, fill_value) RESULT(status)
+
+! define fill variable 
+
+ USE netcdf4_nc_interfaces
+
+ Implicit NONE
+
+ Integer, Intent(IN)                        :: ncid, varid, no_fill
+ Character(KIND=C_CHAR), Intent(IN), TARGET :: fill_value(*)
+
+ Integer                                    :: status
+
+ Integer(KIND=C_INT) :: cncid, cvarid, cno_fill, cstatus
+ Type(C_PTR)         :: cfill_value_p
+
+ cncid    = ncid
+ cvarid   = varid-1
+ cno_fill = no_fill
+
+ cfill_value_p = C_LOC(fill_value)
+
+ cstatus       = nc_def_var_fill(cncid, cvarid, cno_fill, cfill_value_p)
+
+ status        = cstatus
+
+ End Function nf_def_var_fill
+!-------------------------------- nf_inq_var_fill -----------------------------
+ Function nf_inq_var_fill( ncid, varid, no_fill, fill_value) RESULT(status)
+
+! get fill variable 
+
+ USE netcdf4_nc_interfaces
+
+ Implicit NONE
+
+ Integer, Intent(IN)                   :: ncid, varid
+ Integer, Intent(OUT)                  :: no_fill
+ Character(KIND=C_CHAR), Intent(INOUT) :: fill_value(*)
+
+ Integer                               :: status
+
+ Integer(KIND=C_INT) :: cncid, cvarid, cno_fill, cstatus
+
+ cncid  = ncid
+ cvarid = varid-1
+
+ cstatus = nc_inq_var_fill(cncid, cvarid, cno_fill, fill_value)
+
+ If (cstatus == NC_NOERR) Then
+    no_fill = cno_fill 
+ EndIf
+ status  = cstatus
+
+ End Function nf_inq_var_fill
+!-------------------------------- nf_def_var_endian ---------------------------
+ Function nf_def_var_endian( ncid, varid, endiann) RESULT(status)
+
+! define variable endian 
+
+ USE netcdf4_nc_interfaces
+
+ Implicit NONE
+
+ Integer, Intent(IN) :: ncid, varid, endiann
+
+ Integer             :: status
+
+ Integer(KIND=C_INT) :: cncid, cvarid, cendiann, cstatus
+
+ cncid    = ncid
+ cvarid   = varid-1
+ cendiann = endiann
+
+ cstatus = nc_def_var_endian(cncid, cvarid, cendiann)
+
+ status = cstatus
+
+ End Function nf_def_var_endian
+!-------------------------------- nf_inq_var_endian ---------------------------
+ Function nf_inq_var_endian( ncid, varid, endiann) RESULT(status)
+
+! get variable endian 
+
+ USE netcdf4_nc_interfaces
+
+ Implicit NONE
+
+ Integer, Intent(IN)  :: ncid, varid
+ Integer, Intent(OUT) ::  endiann
+
+ Integer              :: status
+
+ Integer(KIND=C_INT) :: cncid, cvarid, cendiann, cstatus
+
+ cncid  = ncid
+ cvarid = varid-1
+
+ cstatus = nc_inq_var_endian(cncid, cvarid, cendiann)
+
+ If (cstatus == NC_NOERR) Then
+    endiann = cendiann
+ EndIf
+ status  = cstatus
+
+ End Function nf_inq_var_endian
+!--------------------------------- nf_put_att --------------------------------
+ Function nf_put_att(ncid, varid, name, xtype, nlen, value) RESULT(status)
+
+! Write global attribute of any type. We use a C character
+! string as the dummy arguments for the values 
+
+ USE netcdf4_nc_interfaces
+
+ Implicit NONE
+
+ Integer,                Intent(IN)         :: ncid, varid, nlen, xtype
+ Character(LEN=*),       Intent(IN)         :: name
+ Character(KIND=C_CHAR), Intent(IN), TARGET :: value(*)
+
+ Integer                                    :: status
+
+ Integer(KIND=C_INT) :: cncid, cvarid, cstatus, cxtype
+
+ Integer(KIND=C_SIZE_T)       :: cnlen
+ Type(C_PTR)                  :: cvalueptr
+ Character(LEN=(LEN(name)+1)) :: cname
+ Integer                      :: ie
+
+ cncid     = ncid
+ cvarid    = varid -1 ! Subtract 1 to get C varid
+ cxtype    = xtype
+ cnlen     = nlen
+ cvalueptr = C_LOC(value)
+ cname     = REPEAT(" ",LEN(cname))
+ cname     = addCNullChar(name, ie)
+
+ cstatus = nc_put_att(cncid, cvarid, cname(1:ie+1), cxtype, cnlen, cvalueptr)
+
+ status = cstatus
+
+ End Function nf_put_att
+!--------------------------------- nf_get_att --------------------------------
+ Function nf_get_att(ncid, varid, name, value) RESULT(status)
+
+! Get global attribute of any type. We use a C character
+! string as the dummy arguments for the values. Don't supply calling
+! program with an explicit interface. Just use external
+
+ USE netcdf4_nc_interfaces
+
+ Implicit NONE
+
+ Integer,                Intent(IN)    :: ncid, varid
+ Character(LEN=*),       Intent(IN)    :: name
+ Character(KIND=C_CHAR), Intent(INOUT) :: value(*)
+
+ Integer                               :: status
+
+ Integer(KIND=C_INT)          :: cncid, cvarid, cstatus
+ Character(LEN=(LEN(name)+1)) :: cname
+ Integer                      :: ie
+
+ cncid  = ncid
+ cvarid = varid -1 ! Subtract 1 to get C varid
+ cname  = REPEAT(" ",LEN(cname))
+ cname = addCNullChar(name, ie)
+
+ cstatus = nc_get_att(cncid, cvarid, cname(1:ie+1), value)
+
+ status = cstatus
+
+ End Function nf_get_att
+!--------------------------------- nf_put_vlen_element ------------------------
+ Function nf_put_vlen_element(ncid, xtype, vlen_element, nlen, value) &
+                              RESULT(status)
+
+! Put in a variable length array element element for Netcdf . We use a C
+! character string as the dummy arguments for the values. Don't supply calling
+! program with an explicit interface. Just use external
+
+! Note Users manual defines vlen_element to be a character string. We
+! use the same here but pass it as a C_PTR type.
+
+ USE netcdf4_nc_interfaces
+
+ Implicit NONE
+
+ Integer,                Intent(IN)            :: ncid, xtype, nlen
+ Character(KIND=C_CHAR), Intent(INOUT)         :: vlen_element(*)
+ Character(KIND=C_CHAR), Intent(IN),   TARGET  :: value(*)
+
+ Integer                                       :: status
+
+ Integer(KIND=C_INT)    :: cncid, cxtype, cstatus
+ Integer(KIND=C_SIZE_T) :: cnlen
+ Type(C_PTR)            :: cvalueptr
+
+ cncid     = ncid
+ cxtype    = xtype
+ cnlen     = nlen 
+ cvalueptr = C_LOC(value)
+
+ cstatus = nc_put_vlen_element(cncid, cxtype, vlen_element, cnlen,&
+                               cvalueptr)
+
+ status = cstatus
+
+ End Function nf_put_vlen_element
+!--------------------------------- nf_get_vlen_element ------------------------
+ Function nf_get_vlen_element(ncid, xtype, vlen_element, nlen, value) RESULT(status)
+
+! Get a variable length array element element for Netcdf . We use a C
+! character string as the dummy arguments for the values. Don't supply calling
+! program with an explicit interface. Just use external
+
+! Note Users manual defines vlen_element to be a character string. We
+! use the same here but pass it as a C_PTR type.
+
+ USE netcdf4_nc_interfaces
+
+ Implicit NONE
+
+ Integer,                Intent(IN)            :: ncid, xtype
+ Integer,                Intent(INOUT)         :: nlen
+ Character(LEN=*),       Intent(INOUT), TARGET :: vlen_element
+ Character(KIND=C_CHAR), Intent(INOUT)         :: value(*)
+
+ Integer                                       :: status
+
+ Integer(KIND=C_INT)    :: cncid, cxtype, cstatus
+ Integer(KIND=C_SIZE_T) :: cnlen
+
+ cncid  = ncid
+ cxtype = xtype
+
+ cstatus = nc_get_vlen_element(cncid, cxtype, vlen_element, cnlen,&
+                               value)
+
+ If (cstatus == NC_NOERR) Then
+    nlen = cnlen 
+ EndIf
+ status = cstatus
+
+ End Function nf_get_vlen_element
+!--------------------------------- nf_free_vlen --------------------------------
+ Function nf_free_vlen(vl) RESULT(status)
+
+! Free memory for vlen array
+! C_CHAR string is used as the dummy arguments for vl. Don't supply calling
+! program with an explicit interface. Just use external
+
+ USE netcdf4_nc_interfaces
+
+ Implicit NONE
+
+ Character(KIND=C_CHAR), Intent(IN), TARGET :: vl(*)
+
+ Integer                                    :: status
+
+ Integer(C_INT) :: cstatus
+ Type(C_PTR)    :: cvl
+
+ cvl = C_LOC(vl) !void pointer in C interface
+
+ cstatus = nc_free_vlen(cvl)
+
+ status = cstatus
+
+End Function nf_free_vlen
+!--------------------------------- nf_free_vlens ------------------------------
+ Function nf_free_vlens(ilen, vl) RESULT(status)
+
+! Free memory for vlens array
+! C_CHAR string is used as the dummy arguments for vl. Don't supply calling
+! program with an explicit interface. Just use external
+
+ USE netcdf4_nc_interfaces
+
+ Implicit NONE
+
+ Integer,                Intent(IN)         :: ilen
+ Character(KIND=C_CHAR), Intent(IN), TARGET :: vl(*)
+
+ Integer                                    :: status
+
+ Integer(C_SIZE_T) :: clen
+ Integer(C_INT)    :: cstatus
+ Type(C_PTR)       :: cvl
+
+ clen = ilen
+ cvl  = C_LOC(vl) !void pointer in C interface
+
+ cstatus = nc_free_vlens(clen, cvl)
+
+ status = cstatus
+
+End Function nf_free_vlens
+!--------------------------------- nf_free_string -----------------------------
+ Function nf_free_string(ilen, vl) RESULT(status)
+
+! Free memory for string array 
+! C_CHAR string is used as the dummy arguments for vl. Don't supply calling
+! program with an explicit interface. Just use external
+
+ USE netcdf4_nc_interfaces
+
+ Implicit NONE
+
+ Integer,                Intent(IN)         :: ilen
+ Character(KIND=C_CHAR), Intent(IN), TARGET :: vl(*)
+
+ Integer                                    :: status
+
+ Integer(C_SIZE_T) :: clen
+ Integer(C_INT)    :: cstatus
+ Type(C_PTR)       :: cvl
+
+ clen = ilen
+ cvl  = C_LOC(vl) !void pointer in C interface
+
+ cstatus = nc_free_string(clen, cvl)
+
+ status = cstatus
+
+End Function nf_free_string
+
+!--------------------------------- nf_put_var -------------------------------
+ Function nf_put_var(ncid, varid, values) RESULT(status)
+
+! Write out a variable of any type. We use a C_CHAR character string
+! to hold values. Therefore, an explicit interface to nf_put_var should NOT 
+! be used in the calling routine. Use an external instead. 
+! Defined in  fort-vario.c but only used in 4.0.1 for NETCDF4 builds
+
+ USE netcdf4_nc_interfaces
+
+ Implicit NONE
+
+ Integer,                Intent(IN)         :: ncid, varid
+ Character(KIND=C_CHAR), Intent(IN), TARGET :: values(*)
+
+ Integer                                    :: status
+
+ Integer(KIND=C_INT) :: cncid, cvarid,  cstatus
+ Type(C_PTR)         :: cvaluesptr
+
+ cncid  = ncid
+ cvarid = varid - 1 ! Subtract 1 to get C varid
+
+ cvaluesptr = C_LOC(values)
+
+ cstatus = nc_put_var(cncid, cvarid, cvaluesptr)
+
+ status = cstatus
+
+ End Function nf_put_var
+!--------------------------------- nf_get_var ----------------------------
+ Function nf_get_var(ncid, varid, values) RESULT(status)
+
+! Read in a variable of any type. We use a C_CHAR character string
+! to hold values. Therefore, an explicit interface to nf_get_var should NOT
+! be used in the calling routine. Just use external 
+! Defined in  fort-vario.c but only used in 4.0.1 for NETCDF4 builds
+  
+ USE netcdf4_nc_interfaces
+
+ Implicit NONE
+
+ Integer,                Intent(IN)    :: ncid, varid
+ Character(KIND=C_CHAR), Intent(INOUT) :: values(*)
+
+ Integer                               :: status
+
+ Integer(KIND=C_INT) :: cncid, cvarid,  cstatus
+
+ cncid  = ncid
+ cvarid = varid - 1 ! Subtract 1 to get C varid
+
+ cstatus = nc_get_var(cncid, cvarid, values)
+
+ status = cstatus
+
+ End Function nf_get_var
+!--------------------------------- nf_put_var1_int64 --------------------------
+ Function nf_put_var1_int64(ncid, varid, ndex, ival) RESULT(status)
+
+! Write out a 64 bit integer variable to location vector ndex to dataset
+! Note that the default fort interfaces pass ival as an integer to
+! nc_put_var1_longlong which is expecting a longlong. We chose to
+! pass ival as an integer of type SELECTED_INT_KIND(18) which is
+! consistent with the f90 interfaces that call these routines
+
+ USE netcdf4_nc_interfaces
+
+ Implicit NONE
+
+ Integer,           Intent(IN) :: ncid, varid
+ Integer,           Intent(IN) :: ndex(*)
+ Integer(KIND=IK8), Intent(IN) :: ival
+
+ Integer                       :: status
+
+ Integer(KIND=C_INT)            :: cncid, cvarid, cndims, cstat1, cstatus
+ Integer(KIND=C_SIZE_T), TARGET :: cndex(NC_MAX_DIMS)
+ Integer(KIND=C_LONG_LONG)      :: cival
+ Type(C_PTR)                    :: cndexptr
+ Integer                        :: ndims
+
+ cncid  = ncid
+ cvarid = varid - 1 ! Subtract one to get C varid
+ cndex  = 0
+ cival  = ival
+
+ cstat1 = nc_inq_varndims(cncid, cvarid, cndims)
+
+ cndexptr = C_NULL_PTR
+ ndims    = cndims
+
+ If (cstat1 == NC_NOERR) Then
+   If (ndims > 0) Then ! reverse array order and subtract 1 to get C index 
+     cndex(1:ndims) = ndex(ndims:1:-1)-1
+   EndIf
+   cndexptr = C_LOC(cndex)
+ EndIf
+
+ cstatus = nc_put_var1_longlong(cncid, cvarid, cndexptr, cival)
+
+ status = cstatus
+
+ End Function nf_put_var1_int64
+!--------------------------------- nf_put_vara_int64 --------------------------
+ Function nf_put_vara_int64(ncid, varid, start, counts, ivals) RESULT(status)
+
+! Write out 64 bit integer array to dataset for given start and count vectors
+
+ USE netcdf4_nc_interfaces
+
+ Implicit NONE
+
+ Integer,           Intent(IN) :: ncid, varid
+ Integer,           Intent(IN) :: start(*), counts(*)
+ Integer(KIND=IK8), Intent(IN) :: ivals(*)
+
+ Integer                       :: status
+
+ Integer(KIND=C_INT)            :: cncid, cvarid, cndims, cstat1, cstatus
+ Integer(KIND=C_SIZE_T), TARGET :: cstart(NC_MAX_DIMS), ccounts(NC_MAX_DIMS)
+ Type(C_PTR)                    :: cstartptr, ccountsptr
+ Integer                        :: ndims
+
+ cncid   = ncid
+ cvarid  = varid - 1 ! Subtract 1 to get C varid
+ cstart  = 0
+ ccounts = 0
+
+ cstat1 = nc_inq_varndims(cncid, cvarid, cndims)
+
+ cstartptr  = C_NULL_PTR
+ ccountsptr = C_NULL_PTR
+ ndims      = cndims
+
+ If (cstat1 == NC_NOERR) Then
+   If (ndims > 0) Then ! flip array order for C and subtract 1 from start
+     cstart(1:ndims)  = start(ndims:1:-1)-1
+     ccounts(1:ndims) = counts(ndims:1:-1)
+   EndIf
+   cstartptr  = C_LOC(cstart)
+   ccountsptr = C_LOC(ccounts)
+ EndIf
+
+ cstatus = nc_put_vara_longlong(cncid, cvarid, cstartptr, ccountsptr, ivals)
+
+ status = cstatus
+
+ End Function nf_put_vara_int64
+!--------------------------------- nf_put_vars_int64 --------------------------
+ Function nf_put_vars_int64(ncid, varid, start, counts, strides, ivals) &
+                             RESULT(status)
+
+! Write out 64 bit integer array given start, count, and stride
+
+ USE netcdf4_nc_interfaces
+
+ Implicit NONE
+
+ Integer,           Intent(IN) :: ncid, varid
+ Integer,           Intent(IN) :: start(*), counts(*), strides(*)
+ Integer(KIND=IK8), Intent(IN) :: ivals(*)
+
+ Integer                       :: status
+
+ Integer(KIND=C_INT)               :: cncid, cvarid, cndims, cstat1, cstatus
+ Integer(KIND=C_SIZE_T),    TARGET :: cstart(NC_MAX_DIMS), ccounts(NC_MAX_DIMS)
+ Integer(KIND=C_PTRDIFF_T), TARGET :: cstrides(NC_MAX_DIMS)
+ Type(C_PTR)                       :: cstartptr, ccountsptr, cstridesptr
+ Integer                           :: ndims
+
+ cncid    = ncid
+ cvarid   = varid - 1 ! Subtract 1 to get C varid
+ cstart   = 0
+ ccounts  = 0
+ cstrides = 1
+
+ cstat1 = nc_inq_varndims(cncid, cvarid, cndims)
+
+ cstartptr   = C_NULL_PTR
+ ccountsptr  = C_NULL_PTR
+ cstridesptr = C_NULL_PTR
+ ndims       = cndims
+
+ If (cstat1 == NC_NOERR) Then
+   If (ndims > 0) Then ! Flip arrays to C order and subtract 1 from start
+     cstart(1:ndims)   = start(ndims:1:-1)-1
+     ccounts(1:ndims)  = counts(ndims:1:-1)
+     cstrides(1:ndims) = strides(ndims:1:-1)
+   EndIf
+   cstartptr   = C_LOC(cstart)
+   ccountsptr  = C_LOC(ccounts)
+   cstridesptr = C_LOC(cstrides)
+ EndIf
+
+ cstatus = nc_put_vars_longlong(cncid, cvarid, cstartptr, ccountsptr, &
+                                cstridesptr, ivals)
+
+ status = cstatus
+
+ End Function nf_put_vars_int64
+
+!--------------------------------- nf_put_varm_int64 -------------------------
+ Function nf_put_varm_int64(ncid, varid, start, counts, strides, maps, &
+                            ivals) RESULT(status)
+
+! Write out 64 bit integer array given start, count, stride and map
+
+ USE netcdf4_nc_interfaces
+
+ Implicit NONE
+
+ Integer,           Intent(IN) :: ncid, varid
+ Integer,           Intent(IN) :: start(*), counts(*), strides(*), maps(*)
+ Integer(KIND=IK8), Intent(IN) :: ivals(*)
+
+ Integer                       :: status
+
+ Integer(KIND=C_INT)               :: cncid, cvarid, cndims, cstat1, cstatus
+ Integer(KIND=C_SIZE_T),    TARGET :: cstart(NC_MAX_DIMS), ccounts(NC_MAX_DIMS)
+ Integer(KIND=C_PTRDIFF_T), TARGET :: cstrides(NC_MAX_DIMS), cmaps(NC_MAX_DIMS)
+ Type(C_PTR)                       :: cstartptr, ccountsptr, cstridesptr, &
+                                      cmapsptr
+ Integer                           :: ndims
+
+ cncid    = ncid
+ cvarid   = varid -1 ! Subtract 1 to get C varid
+ cstart   = 0
+ ccounts  = 0
+ cstrides = 1
+ cmaps    = 0
+
+ cstat1 = nc_inq_varndims(cncid, cvarid, cndims)
+
+ cstartptr   = C_NULL_PTR
+ ccountsptr  = C_NULL_PTR
+ cstridesptr = C_NULL_PTR
+ cmapsptr    = C_NULL_PTR
+ ndims       = cndims
+
+ If (cstat1 == NC_NOERR) Then
+   If (ndims > 0) Then ! Flip arrays to C order and subtract 1 from start
+     cstart(1:ndims)   = start(ndims:1:-1)-1
+     ccounts(1:ndims)  = counts(ndims:1:-1)
+     cstrides(1:ndims) = strides(ndims:1:-1)
+     cmaps(1:ndims)    = maps(ndims:1:-1)
+   EndIf
+   cstartptr   = C_LOC(cstart)
+   ccountsptr  = C_LOC(ccounts)
+   cstridesptr = C_LOC(cstrides)
+   cmapsptr    = C_LOC(cmaps)
+ EndIf
+
+ cstatus = nc_put_varm_longlong(cncid, cvarid, cstartptr, ccountsptr, &
+                                cstridesptr, cmapsptr, ivals)
+
+ status = cstatus
+
+ End Function nf_put_varm_int64
+!--------------------------------- nf_put_var_int64 --------------------------
+ Function nf_put_var_int64(ncid, varid, ivals) RESULT(status)
+
+! Write out 64 bit integer array to dataset
+
+ USE netcdf4_nc_interfaces
+
+ Implicit NONE
+
+ Integer,           Intent(IN) :: ncid, varid
+ Integer(KIND=IK8), Intent(IN) :: ivals(*)
+
+ Integer                       :: status
+
+ Integer(KIND=C_INT) :: cncid, cvarid,  cstatus
+
+ cncid  = ncid
+ cvarid = varid - 1 ! Subtract 1 to get C varid
+
+ cstatus = nc_put_var_longlong(cncid, cvarid, ivals)
+
+ status = cstatus
+
+ End Function nf_put_var_int64
+!--------------------------------- nf_get_var1_int64 -------------------------
+ Function nf_get_var1_int64(ncid, varid, ndex, ival) RESULT(status)
+
+! Read in 64 bit integer variable from location vector ndex in dataset
+
+ USE netcdf4_nc_interfaces
+
+ Implicit NONE
+
+ Integer,           Intent(IN)  :: ncid, varid
+ Integer,           Intent(IN)  :: ndex(*)
+ Integer(KIND=IK8), Intent(OUT) :: ival
+
+ Integer                        :: status
+
+ Integer(KIND=C_INT)            :: cncid, cvarid, cndims, cstat1, cstatus
+ Integer(KIND=C_SIZE_T), TARGET :: cndex(NC_MAX_DIMS)
+ Integer(KIND=C_LONG_LONG)      :: cival
+ Type(C_PTR)                    :: cndexptr
+ Integer                        :: ndims
+
+ cncid  = ncid
+ cvarid = varid - 1 ! Subtract one to get C varid
+ cndex  = 0
+
+ cstat1 = nc_inq_varndims(cncid, cvarid, cndims)
+
+ cndexptr = C_NULL_PTR
+ ndims    = cndims
+
+ If (cstat1 == NC_NOERR) Then
+   If (ndims > 0) Then ! reverse array order and subtract 1 to get C index 
+     cndex(1:ndims) = ndex(ndims:1:-1)-1
+   EndIf
+   cndexptr = C_LOC(cndex)
+ EndIf
+
+ cstatus = nc_get_var1_longlong(cncid, cvarid, cndexptr, cival)
+
+ ival   = cival
+ status = cstatus
+
+ End Function nf_get_var1_int64
+!--------------------------------- nf_get_vara_int -------------------------
+ Function nf_get_vara_int64(ncid, varid, start, counts, ivals) RESULT(status)
+
+! Read in 64 bit integer array from dataset for given start and count vectors 
+
+ USE netcdf4_nc_interfaces
+
+ Implicit NONE
+
+ Integer,           Intent(IN)  :: ncid, varid
+ Integer,           Intent(IN)  :: start(*), counts(*)
+ Integer(KIND=IK8), Intent(OUT) :: ivals(*)
+
+ Integer                        :: status
+
+ Integer(KIND=C_INT)            :: cncid, cvarid, cndims, cstat1, cstatus
+ Integer(KIND=C_SIZE_T), TARGET :: cstart(NC_MAX_DIMS), ccounts(NC_MAX_DIMS)
+ Type(C_PTR)                    :: cstartptr, ccountsptr
+ Integer                        :: ndims
+
+ cncid   = ncid
+ cvarid  = varid - 1 ! Subtract 1 to get C varid
+ cstart  = 0
+ ccounts = 0
+
+ cstat1 = nc_inq_varndims(cncid, cvarid, cndims)
+
+ cstartptr  = C_NULL_PTR
+ ccountsptr = C_NULL_PTR
+ ndims      = cndims
+
+ If (cstat1 == NC_NOERR) Then
+   If (ndims > 0) Then ! flip array order for C and subtract 1 from start
+     cstart(1:ndims)  = start(ndims:1:-1)-1
+     ccounts(1:ndims) = counts(ndims:1:-1)
+   EndIf
+   cstartptr  = C_LOC(cstart)
+   ccountsptr = C_LOC(ccounts)
+ EndIf
+
+ cstatus = nc_get_vara_longlong(cncid, cvarid, cstartptr, ccountsptr, ivals)
+
+ status = cstatus
+
+ End Function nf_get_vara_int64
+
+!--------------------------------- nf_get_vars_int64 --------------------------
+ Function nf_get_vars_int64(ncid, varid, start, counts, strides, ivals) &
+                             RESULT(status)
+
+! Read in 64 bit integer array given start, count, and stride
+
+ USE netcdf4_nc_interfaces
+
+ Implicit NONE
+
+ Integer,           Intent(IN)  :: ncid, varid
+ Integer,           Intent(IN)  :: start(*), counts(*), strides(*)
+ Integer(KIND=IK8), Intent(OUT) :: ivals(*)
+
+ Integer                        :: status
+
+ Integer(KIND=C_INT)               :: cncid, cvarid, cndims, cstat1, cstatus
+ Integer(KIND=C_SIZE_T),    TARGET :: cstart(NC_MAX_DIMS), ccounts(NC_MAX_DIMS)
+ Integer(KIND=C_PTRDIFF_T), TARGET :: cstrides(NC_MAX_DIMS)
+ Type(C_PTR)                       :: cstartptr, ccountsptr, cstridesptr
+ Integer                           :: ndims
+
+ cncid    = ncid
+ cvarid   = varid - 1 ! Subtract 1 to get C varid
+ cstart   = 0
+ ccounts  = 0
+ cstrides = 1
+
+ cstat1 = nc_inq_varndims(cncid, cvarid, cndims)
+
+ cstartptr   = C_NULL_PTR
+ ccountsptr  = C_NULL_PTR
+ cstridesptr = C_NULL_PTR
+ ndims       = cndims
+
+ If (cstat1 == NC_NOERR) Then
+   If (ndims > 0) Then ! Flip arrays to C order and subtract 1 from start
+     cstart(1:ndims)   = start(ndims:1:-1)-1
+     ccounts(1:ndims)  = counts(ndims:1:-1)
+     cstrides(1:ndims) = strides(ndims:1:-1)
+   EndIf
+   cstartptr   = C_LOC(cstart)
+   ccountsptr  = C_LOC(ccounts)
+   cstridesptr = C_LOC(cstrides)
+ EndIf
+
+ cstatus = nc_get_vars_longlong(cncid, cvarid, cstartptr, ccountsptr, &
+                                cstridesptr, ivals)
+ status = cstatus
+
+ End Function nf_get_vars_int64
+!--------------------------------- nf_get_varm_int64 -------------------------
+ Function nf_get_varm_int64(ncid, varid, start, counts, strides, maps, &
+                            ivals) RESULT(status)
+
+! Read in 64 bit integer array given start, count, stride and map
+
+ USE netcdf4_nc_interfaces
+
+ Implicit NONE
+
+ Integer,           Intent(IN)  :: ncid, varid
+ Integer,           Intent(IN)  :: start(*), counts(*), strides(*), maps(*)
+ Integer(KIND=IK8), Intent(OUT) :: ivals(*)
+
+ Integer                        :: status
+
+ Integer(KIND=C_INT)               :: cncid, cvarid, cndims, cstat1, cstatus
+ Integer(KIND=C_SIZE_T),    TARGET :: cstart(NC_MAX_DIMS), ccounts(NC_MAX_DIMS)
+ Integer(KIND=C_PTRDIFF_T), TARGET :: cstrides(NC_MAX_DIMS), cmaps(NC_MAX_DIMS)
+ Type(C_PTR)                       :: cstartptr, ccountsptr, cstridesptr, &
+                                      cmapsptr
+ Integer                           :: ndims
+
+ cncid    = ncid
+ cvarid   = varid -1 ! Subtract 1 to get C varid
+ cstart   = 0
+ ccounts  = 0
+ cstrides = 1
+ cmaps    = 0
+
+ cstat1 = nc_inq_varndims(cncid, cvarid, cndims)
+
+ cstartptr   = C_NULL_PTR
+ ccountsptr  = C_NULL_PTR
+ cstridesptr = C_NULL_PTR
+ cmapsptr    = C_NULL_PTR
+ ndims       = cndims
+
+ If (cstat1 == NC_NOERR) Then
+   If (ndims > 0) Then ! Flip arrays to C order and subtract 1 from start
+     cstart(1:ndims)   = start(ndims:1:-1)-1
+     ccounts(1:ndims)  = counts(ndims:1:-1)
+     cstrides(1:ndims) = strides(ndims:1:-1)
+     cmaps(1:ndims)    = maps(ndims:1:-1)
+   EndIf
+   cstartptr   = C_LOC(cstart)
+   ccountsptr  = C_LOC(ccounts)
+   cstridesptr = C_LOC(cstrides)
+   cmapsptr    = C_LOC(cmaps)
+ EndIf
+
+ cstatus = nc_get_varm_longlong(cncid, cvarid, cstartptr, ccountsptr, &
+                                cstridesptr, cmapsptr, ivals)
+
+ status = cstatus
+
+ End Function nf_get_varm_int64
+!--------------------------------- nf_get_var_int64 --------------------------
+ Function nf_get_var_int64(ncid, varid, ivals) RESULT(status)
+
+! Read in 64 bit integer array from dataset
+
+ USE netcdf4_nc_interfaces
+
+ Implicit NONE
+
+ Integer,           Intent(IN)  :: ncid, varid
+ Integer(KIND=IK8), Intent(OUT) :: ivals(*)
+
+ Integer                        :: status
+
+ Integer(KIND=C_INT) :: cncid, cvarid,  cstatus
+
+ cncid  = ncid
+ cvarid = varid - 1 ! Subtract 1 to get C varid
+
+ cstatus = nc_get_var_longlong(cncid, cvarid, ivals)
+
+ status = cstatus
+
+ End Function nf_get_var_int64
+!--------------------------------- nf_set_chunk_cache ------------------------
+ Function nf_set_chunk_cache(chunk_size, nelems, preemption) RESULT(status)
+
+! Set chunk cache size. Note this follows the fort-nc4 version which uses
+! uses nc_set_chunk_cache_ints to avoid size_t issues with fortran. F03
+! does not have these issues so we could call nc_set_chunk_cache
+
+ USE netcdf4_nc_interfaces
+
+ Implicit NONE
+
+ Integer, Intent(IN) :: chunk_size, nelems, preemption 
+
+ Integer             :: status
+
+ Integer(KIND=C_INT) :: cchunk_size, cnelems, cpreemption, cstatus
+
+ cchunk_size = chunk_size
+ cnelems     = nelems
+ cpreemption = preemption
+
+ cstatus = nc_set_chunk_cache_ints(cchunk_size, cnelems, cpreemption)
+
+ status = cstatus
+
+ End Function nf_set_chunk_cache
+!--------------------------------- nf_get_chunk_cache -------------------------
+ Function nf_get_chunk_cache(chunk_size, nelems, preemption) RESULT(status)
+
+! get chunk cache size. Note this follows the fort-nc4 version which uses
+! uses nc_get_chunk_cache_ints to avoid size_t issues with fortran. F03
+! does not have these issues so we could call nc_set_chunk_cache
+
+ USE netcdf4_nc_interfaces
+
+ Implicit NONE
+
+ Integer, Intent(INOUT) :: chunk_size, nelems, preemption 
+
+ Integer                :: status
+
+ Integer(KIND=C_INT) :: cchunk_size, cnelems, cpreemption, cstatus
+
+ cstatus = nc_get_chunk_cache_ints(cchunk_size, cnelems, cpreemption)
+
+ If (cstatus == NC_NOERR) Then
+    chunk_size = cchunk_size
+    nelems     = cnelems
+    preemption = cpreemption
+ EndIf
+ status = cstatus
+
+ End Function nf_get_chunk_cache
+!--------------------------------- nf_set_var_chunk_cache ---------------------
+ Function nf_set_var_chunk_cache(ncid, varid, chunk_size, nelems, preemption) RESULT(status)
+
+! Set chunk cache size. Note this follows the fort-nc4 version which uses
+! uses nc_set_var_chunk_cache_ints to avoid size_t issues with fortran.
+
+ USE netcdf4_nc_interfaces
+
+ Implicit NONE
+
+ Integer, Intent(IN) :: ncid, varid, chunk_size, nelems, preemption 
+
+ Integer             :: status
+
+ Integer(KIND=C_INT) :: cncid, cvarid, cchunk_size, cnelems, cpreemption, &
+                        cstatus
+
+ cncid       = ncid
+ cvarid      = varid-1
+ cchunk_size = chunk_size
+ cnelems     = nelems
+ cpreemption = preemption
+
+ cstatus = nc_set_var_chunk_cache_ints(cncid, cvarid, cchunk_size, cnelems, &
+                                       cpreemption)
+
+ status = cstatus
+
+ End Function nf_set_var_chunk_cache
+!--------------------------------- nf_get_var_chunk_cache ---------------------
+ Function nf_get_var_chunk_cache(ncid, varid, chunk_size, nelems, preemption) RESULT(status)
+
+! get chunk cache size. Note this follows the fort-nc4 version which uses
+! uses nc_get_var_chunk_cache_ints to avoid size_t issues with fortran. 
+
+ USE netcdf4_nc_interfaces
+
+ Implicit NONE
+
+ Integer, Intent(IN)    :: ncid, varid 
+ Integer, Intent(INOUT) :: chunk_size, nelems, preemption 
+
+ Integer                :: status
+
+ Integer(KIND=C_INT) :: cncid, cvarid, cchunk_size, cnelems, cpreemption, &
+                        cstatus
+
+ cncid  = ncid
+ cvarid = varid-1
+
+ cstatus = nc_get_var_chunk_cache_ints(cncid, cvarid, cchunk_size, cnelems, &
+                                       cpreemption)
+
+ If (cstatus == NC_NOERR) Then
+    chunk_size = cchunk_size
+    nelems     = cnelems
+    preemption = cpreemption
+ EndIf
+ status = cstatus
+
+ End Function nf_get_var_chunk_cache
diff --git a/fortran/nf_v2compat.c b/fortran/nf_v2compat.c
new file mode 100755
index 0000000..cd34bd0
--- /dev/null
+++ b/fortran/nf_v2compat.c
@@ -0,0 +1,1840 @@
+/*
+ *	Copyright 1996, University Corporation for Atmospheric Research
+ *      See netcdf/COPYRIGHT file for copying and redistribution conditions.
+ */
+
+/* $Id: fort-v2compat.c,v 1.33 2009/01/27 19:48:34 ed Exp $ */
+
+/*
+ *  Source for netCDF2 FORTRAN jacket library.
+ */
+
+/* Modified version of fort-v2compat.c used to provide required
+ * C functions used in v2 compatability interface. This clone
+ * was created to keep existing C code fort-v2compat.c pristine
+ * and to make compiling easier. Note all cfortran.h stuff has  
+ * been removed to make compiling easier and the functions
+ * have been made external instead of static so that FORTRAN can
+ * see them
+ */
+
+/* April, 2009
+ * Modified by:  Richard Weed, Ph.D
+ *               Center for Advanced Vehicular Systems
+ *               Mississippi State University
+ *               rweed at cavs.msstate.edu
+ *
+ *  C routines required for Fortran V2 compatability 
+ */
+
+/*
+ * OVERVIEW
+ *
+ * This file contains jacket routines written in C for interfacing
+ * Fortran netCDF-2 function calls to the actual C-binding netCDF
+ * function call -- using either the netCDF-2 or netCDF-3 C API.
+ * In general, these functions handle character-string parameter
+ * conventions, convert between column-major-order arrays and
+ * row-major-order arrays, and map between array indices beginning
+ * at one and array indices beginning at zero.  They also adapt the
+ * differing error handling mechanisms between version 2 and version 3.
+ */
+
+#include <config.h>
+
+#ifndef NO_NETCDF_2
+
+/* LINTLIBRARY */
+
+#include	<ctype.h>
+#include        <string.h>
+#include	<stdlib.h>
+#include	<stdio.h>
+#include	"netcdf.h"
+#include	"nfconfig.inc"
+
+#ifndef USE_NETCDF4
+#define NC_CLASSIC_MODEL 0
+#else
+/* There is a dependency error here;
+NC_CLASSIC_MODEL will not be defined
+if ../libsrc4/netcdf.h does not exist yet
+(which it won't after a maintainer-clean).
+So, define it here if not already defined.
+*/
+#ifndef NC_CLASSIC_MODEL
+#define NC_CLASSIC_MODEL 0x0100
+#endif
+#endif
+
+
+/*
+ New function added by RW to support FORTRAN 2003 interfaces.
+ Function to return C data type sizes to FORTRAN 2003 code for
+ v2 imap conversion. Duplicates some code in f2c_vimap below
+*/
+extern size_t
+v2data_size(nc_type datatype)
+{
+ size_t size;
+
+ size = 0;
+ switch (datatype)
+  {
+
+    case NC_CHAR:
+      size = sizeof(char);
+    break;
+    case NC_BYTE:
+#if NF_INT1_IS_C_SIGNED_CHAR
+      size = sizeof(signed char);
+#elif NF_INT1_IS_C_SHORT
+      size = sizeof(short);
+#elif NF_INT1_IS_C_INT
+      size = sizeof(int);
+#elif NF_INT1_IS_C_LONG
+      size = sizeof(long);
+#endif
+    break;
+    case NC_SHORT:
+#if NF_INT2_IS_C_SHORT
+      size = sizeof(short);
+#elif NF_INT2_IS_C_INT
+      size = sizeof(int);
+#elif NF_INT2_IS_C_LONG
+      size = sizeof(long);
+#endif
+    break;
+    case NC_INT:
+#if NF_INT_IS_C_INT
+      size = sizeof(int);
+#elif NF_INT_IS_C_LONG
+      size = sizeof(long);
+#endif
+    break;
+    case NC_FLOAT:
+#if NF_REAL_IS_C_FLOAT
+      size = sizeof(float);
+#elif NF_REAL_IS_C_DOUBLE
+      size = sizeof(double);
+#endif
+    break;
+    case NC_DOUBLE:
+#if NF_DOUBLEPRECISION_IS_C_FLOAT
+      size = sizeof(float);
+#elif NF_DOUBLEPRECISION_IS_C_DOUBLE
+      size = sizeof(double);
+#endif
+    break;
+    default:
+      size = -1;
+  }
+ return size;
+}
+
+/**
+ * Convert a Version 2 Fortran IMAP vector into a Version 3 C imap vector.
+ */
+extern ptrdiff_t*
+f2c_v2imap(int ncid, int varid, const int* fimap, ptrdiff_t* cimap)
+{
+    int		rank;
+    nc_type	datatype;
+
+    if (nc_inq_vartype(ncid, varid, &datatype) ||
+	nc_inq_varndims(ncid, varid, &rank) || rank <= 0)
+    {
+	return NULL;
+    }
+
+    /* else */
+    if (fimap[0] == 0)
+    {
+	/*
+	 * Special Fortran version 2 semantics: use external netCDF variable 
+	 * structure.
+	 */
+	int		dimids[NC_MAX_VAR_DIMS];
+	int		idim;
+	size_t	total;
+
+	if (nc_inq_vardimid(ncid, varid, dimids) != NC_NOERR)
+	    return NULL;
+
+	for (total = 1, idim = rank - 1; idim >= 0; --idim)
+	{
+	    size_t	length;
+
+	    cimap[idim] = total;
+
+	    if (nc_inq_dimlen(ncid, dimids[idim], &length) != NC_NOERR)
+		return NULL;
+
+	    total *= length;
+	}
+    }
+    else
+    {
+	/*
+	 * Regular Fortran version 2 semantics: convert byte counts to
+	 * element counts.
+	 */
+	int	idim;
+	size_t	size;
+
+	switch (datatype)
+	{
+
+	    case NC_CHAR:
+		size = sizeof(char);
+		break;
+	    case NC_BYTE:
+#		if NF_INT1_IS_C_SIGNED_CHAR
+		    size = sizeof(signed char);
+#		elif NF_INT1_IS_C_SHORT
+		    size = sizeof(short);
+#		elif NF_INT1_IS_C_INT
+		    size = sizeof(int);
+#		elif NF_INT1_IS_C_LONG
+		    size = sizeof(long);
+#		endif
+		break;
+	    case NC_SHORT:
+#		if NF_INT2_IS_C_SHORT
+		    size = sizeof(short);
+#		elif NF_INT2_IS_C_INT
+		    size = sizeof(int);
+#		elif NF_INT2_IS_C_LONG
+		    size = sizeof(long);
+#		endif
+		break;
+	    case NC_INT:
+#		if NF_INT_IS_C_INT
+		    size = sizeof(int);
+#		elif NF_INT_IS_C_LONG
+		    size = sizeof(long);
+#		endif
+		break;
+	    case NC_FLOAT:
+#		if NF_REAL_IS_C_FLOAT
+		    size = sizeof(float);
+#		elif NF_REAL_IS_C_DOUBLE
+		    size = sizeof(double);
+#		endif
+		break;
+	    case NC_DOUBLE:
+#		if NF_DOUBLEPRECISION_IS_C_FLOAT
+		    size = sizeof(float);
+#		elif NF_DOUBLEPRECISION_IS_C_DOUBLE
+		    size = sizeof(double);
+#		endif
+		break;
+	    default:
+		return NULL;
+	}
+
+	for (idim = 0; idim < rank; ++idim)
+	    cimap[idim] = fimap[rank - 1 - idim] / size;
+    }
+
+    return cimap;
+}
+
+
+/*
+ * Compute the product of dimensional counts.
+ */
+static size_t
+dimprod(const size_t* count, int rank)
+{
+    int		i;
+    size_t	prod = 1;
+
+    for (i = 0; i < rank; ++i)
+	prod *= count[i];
+
+    return prod;
+}
+
+
+/*
+ * Set the C global variable ncopts.
+ */
+extern void
+c_ncpopt(
+    int val     /* NC_FATAL, NC_VERBOSE, or NC_FATAL|NC_VERBOSE */
+)
+{
+    ncopts = val;
+}
+
+/*
+ * Get the C global variable ncopts from FORTRAN.
+ */
+extern void
+c_ncgopt(
+    int	*val	/* NC_FATAL, NC_VERBOSE, or NC_FATAL|NC_VERBOSE */
+)
+{
+    *val = ncopts;
+}
+
+
+
+/*
+ * Create a new netCDF file, returning a netCDF ID.  New netCDF
+ * file is placed in define mode.
+ */
+extern int
+c_nccre(
+    const char *pathname,	/* file name of new netCDF file */
+    int clobmode,	/* either NCCLOB or NCNOCLOB */
+    int *rcode		/* returned error code */
+)
+{
+    int ncid = -1;
+
+    if (pathname == NULL)
+       *rcode = NC_EINVAL;
+    else
+    {
+       *rcode = ((ncid = nccreate (pathname, clobmode)) == -1)
+	  ? ncerr
+	  : 0;
+    }
+    
+    if (*rcode != 0)
+    {
+       nc_advise("NCCRE", *rcode, "");
+       *rcode = ncerr;
+    }
+
+    return ncid;
+}
+
+
+
+/*
+ * Open an existing netCDF file for access.
+ */
+extern int
+c_ncopn(
+    const char *pathname,	/* file name for netCDF to be opened */
+    int rwmode,			/* either NCWRITE or NCNOWRIT */
+    int *rcode			/* returned error code */
+)
+{
+    int ncid = -1;
+
+    /* Include NC_LOCK in check, in case NC_LOCK is ever implemented */
+    if (rwmode < 0 ||
+	rwmode > NC_WRITE + NC_SHARE + NC_CLASSIC_MODEL + NC_LOCK)
+    {
+        *rcode = NC_EINVAL;
+        nc_advise("NCOPN", *rcode,
+		"bad flag, did you forget to include netcdf.inc?");
+    }
+    else
+    {
+	if (pathname == NULL) {
+	    *rcode = NC_EINVAL;
+	}
+	else
+	{
+	    *rcode = ((ncid = ncopen (pathname, rwmode)) == -1)
+			? ncerr
+			: 0;
+	}
+
+	if (*rcode != 0)
+	{
+	    nc_advise("NCOPN", *rcode, "");
+	    *rcode = ncerr;
+	}
+    }
+
+    return ncid;
+}
+
+
+/*
+ * Add a new dimension to an open netCDF file in define mode.
+ */
+extern int
+c_ncddef (
+    int ncid,		/* netCDF ID */
+    const char *dimname,/* dimension name */
+    int dimlen,		/* size of dimension */
+    int *rcode		/* returned error code */
+)
+{
+    int dimid;
+
+    if ((dimid = ncdimdef (ncid, dimname, (long)dimlen)) == -1)
+	*rcode = ncerr;
+    else
+    {
+	dimid++;
+	*rcode = 0;
+    }
+
+    return dimid;
+}
+
+
+/*
+ * Return the ID of a netCDF dimension, given the name of the dimension.
+ */
+extern int
+c_ncdid (
+    int ncid,		/* netCDF ID */
+    const char *dimname,/* dimension name */
+    int *rcode		/* returned error code */
+)
+{
+    int dimid;
+
+    if ((dimid = ncdimid (ncid, dimname)) == -1)
+	*rcode = ncerr;
+    else
+    {
+	dimid++;
+	*rcode = 0;
+    }
+
+    return dimid;
+}
+
+/*
+ * Add a new variable to an open netCDF file in define mode.
+ */
+extern int
+c_ncvdef (
+    int ncid,           /* netCDF ID */
+    const char *varname,/* name of variable */
+    nc_type datatype,   /* netCDF datatype of variable */
+    int ndims,          /* number of dimensions of variable */
+    int *dimids,        /* array of ndims dimensions IDs */
+    int *rcode          /* returned error code */
+)
+{
+    int varid, status;
+
+    if ((status = nc_def_var(ncid, varname, datatype, ndims, dimids, &varid)))
+    {
+        nc_advise("NCVDEF", status, "");
+        *rcode = ncerr;
+        varid = -1;
+    }
+    else
+    {
+        varid++;
+        *rcode = 0;
+    }
+
+    return varid;
+}
+
+
+
+/*
+ * Return the ID of a netCDF variable given its name.
+ */
+extern int
+c_ncvid (
+    int ncid,		/* netCDF ID */
+    const char *varname,/* variable name */
+    int *rcode		/* returned error code */
+)
+{
+    int varid;
+
+    if ((varid = ncvarid (ncid, varname)) == -1)
+	*rcode = ncerr;
+    else
+    {
+	varid++;
+	*rcode = 0;
+    }
+
+    return varid;
+}
+
+
+/*
+ * Return number of bytes per netCDF data type.
+ */
+extern int
+c_nctlen (
+    nc_type datatype,	/* netCDF datatype */
+    int* rcode		/* returned error code */
+)
+{
+    int itype;
+
+    *rcode = ((itype = (int) nctypelen (datatype)) == -1)
+		?  ncerr
+		: 0;
+
+    return itype;
+}
+
+/*
+ * Close an open netCDF file.
+ */
+extern void
+c_ncclos (
+    int ncid,		/* netCDF ID */
+    int* rcode		/* returned error code */
+)
+{
+    *rcode = ncclose(ncid) == -1
+		? ncerr
+		: 0;
+}
+
+/*
+ * Put an open netCDF into define mode.
+ */
+extern void
+c_ncredf (
+    int ncid,		/* netCDF ID */
+    int *rcode		/* returned error code */
+)
+{
+    *rcode = ncredef(ncid) == -1
+		? ncerr
+		: 0;
+}
+
+/*
+ * Take an open netCDF out of define mode.
+ */
+extern void
+c_ncendf (
+    int ncid,		/* netCDF ID */
+    int *rcode		/* returned error code */
+)
+{
+    *rcode = ncendef (ncid) == -1
+		? ncerr
+		: 0;
+}
+
+/*
+ * Return information about an open netCDF file given its netCDF ID.
+ */
+extern void
+c_ncinq (
+    int ncid,		/* netCDF ID */
+    int* indims,	/* returned number of dimensions */
+    int* invars,	/* returned number of variables */
+    int* inatts,	/* returned number of attributes */
+    int* irecdim,	/* returned ID of the unlimited dimension */
+    int* rcode		/* returned error code */
+)
+{
+    *rcode = ncinquire(ncid, indims, invars, inatts, irecdim) == -1
+		? ncerr
+		: 0;
+}
+
+/*
+ * Make sure that the disk copy of a netCDF file open for writing
+ * is current.
+ */
+extern void
+c_ncsnc(
+    int ncid,		/* netCDF ID */
+    int* rcode		/* returned error code */
+)
+{
+    *rcode = ncsync (ncid) == -1
+		? ncerr
+		: 0;
+}
+
+/*
+ * Restore the netCDF to a known consistent state in case anything
+ * goes wrong during the definition of new dimensions, variables
+ * or attributes.
+ */
+extern void
+c_ncabor (
+    int ncid,		/* netCDF ID */
+    int* rcode		/* returned error code */
+)
+{
+    *rcode = ncabort(ncid) == -1
+		? ncerr
+		: 0;
+}
+
+
+/*
+ * Return the name and size of a dimension, given its ID.
+ */
+extern void
+c_ncdinq (
+    int ncid,			/* netCDF ID */
+    int dimid,			/* dimension ID */
+    char* dimname,		/* returned dimension name */
+    int* size,			/* returned dimension size */
+    int* rcode			/* returned error code */
+)
+{
+    long siz;
+
+    if (ncdiminq (ncid, dimid, dimname, &siz) == -1)
+	*rcode = ncerr;
+    else
+    {
+	*size = siz;
+	*rcode = 0;
+    }
+}
+
+/*
+ * Rename an existing dimension in a netCDF open for writing.
+ */
+extern void
+c_ncdren (
+    int ncid,			/* netCDF ID */
+    int dimid,			/* dimension ID */
+    const char* dimname,	/* new name of dimension */
+    int* rcode			/* returned error code */
+)
+{
+    *rcode = ncdimrename(ncid, dimid, dimname) == -1
+		? ncerr
+		: 0;
+}
+
+
+/*
+ * Return information about a netCDF variable, given its ID.
+ */
+extern void
+c_ncvinq (
+    int ncid,		/* netCDF ID */
+    int varid,		/* variable ID */
+    char* varname,	/* returned variable name */
+    nc_type* datatype,	/* returned variable type */
+    int* indims,	/* returned number of dimensions */
+    int* dimarray,	/* returned array of ndims dimension IDs */
+    int* inatts,	/* returned number of attributes */
+    int* rcode		/* returned error code */
+)
+{
+    *rcode = ncvarinq(ncid, varid, varname, datatype, indims,
+		      dimarray, inatts) == -1
+		? ncerr
+		: 0;
+}
+
+/*
+ * Put a single numeric data value into a variable of an open netCDF.
+ */
+extern void
+c_ncvpt1 (
+    int			ncid,	/* netCDF ID */
+    int	 		varid,	/* variable ID */
+    const size_t*	indices,/* multidim index of data to be written */
+    const void*		value,	/* pointer to data value to be written */
+    int*		rcode	/* returned error code */
+)
+{
+    int		status;
+    nc_type	datatype;
+
+    if ((status = nc_inq_vartype(ncid, varid, &datatype)) == 0)
+    {
+	switch (datatype)
+	{
+	case NC_CHAR:
+	    status = NC_ECHAR;
+	    break;
+	case NC_BYTE:
+#	    if NF_INT1_IS_C_SIGNED_CHAR
+		status = nc_put_var1_schar(ncid, varid, indices,
+					   (const signed char*)value);
+#	    elif NF_INT1_IS_C_SHORT
+		status = nc_put_var1_short(ncid, varid, indices,
+					   (const short*)value);
+#	    elif NF_INT1_IS_C_INT
+		status = nc_put_var1_int(ncid, varid, indices,
+					   (const int*)value);
+#	    elif NF_INT1_IS_C_LONG
+		status = nc_put_var1_long(ncid, varid, indices,
+					   (const long*)value);
+#	    endif
+	    break;
+	case NC_SHORT:
+#	    if NF_INT2_IS_C_SHORT
+		status = nc_put_var1_short(ncid, varid, indices,
+					   (const short*)value);
+#	    elif NF_INT2_IS_C_INT
+		status = nc_put_var1_int(ncid, varid, indices,
+					   (const int*)value);
+#	    elif NF_INT2_IS_C_LONG
+		status = nc_put_var1_long(ncid, varid, indices,
+					   (const long*)value);
+#	    endif
+	    break;
+	case NC_INT:
+#	    if NF_INT_IS_C_INT
+		status = nc_put_var1_int(ncid, varid, indices,
+					   (const int*)value);
+#	    elif NF_INT_IS_C_LONG
+		status = nc_put_var1_long(ncid, varid, indices,
+					   (const long*)value);
+#	    endif
+	    break;
+	case NC_FLOAT:
+#	    if NF_REAL_IS_C_FLOAT
+		status = nc_put_var1_float(ncid, varid, indices,
+					   (const float*)value);
+#	    elif NF_REAL_IS_C_DOUBLE
+		status = nc_put_var1_double(ncid, varid, indices,
+					   (const double*)value);
+#	    endif
+	    break;
+	case NC_DOUBLE:
+#	    if NF_DOUBLEPRECISION_IS_C_FLOAT
+		status = nc_put_var1_float(ncid, varid, indices,
+					   (const float*)value);
+#	    elif NF_DOUBLEPRECISION_IS_C_DOUBLE
+		status = nc_put_var1_double(ncid, varid, indices,
+					   (const double*)value);
+#	    endif
+	    break;
+	}
+    }
+
+    if (status == 0)
+	*rcode = 0;
+    else
+    {
+	nc_advise("NCVPT1", status, "");
+	*rcode = ncerr;
+    }
+}
+
+/* 
+ * Put a single character into an open netCDF file.
+ */
+extern void
+c_ncvp1c(
+    int			ncid,	/* netCDF ID */
+    int	 		varid,	/* variable ID */
+    const size_t*	indices,/* multidim index of data to be written */
+    const char*		value,	/* pointer to data value to be written */
+    int*		rcode	/* returned error code */
+)
+{
+    int		status;
+    nc_type	datatype;
+
+    if ((status = nc_inq_vartype(ncid, varid, &datatype)) == 0)
+    {
+	status = datatype != NC_CHAR
+		    ? NC_ECHAR
+		    : nc_put_var1_text(ncid, varid, indices, value);
+    }
+
+    if (status == 0)
+	*rcode = 0;
+    else
+    {
+	nc_advise("NCVP1C", status, "");
+	*rcode = ncerr;
+    }
+}
+
+/*
+ * Write a hypercube of numeric values into a netCDF variable of an open
+ * netCDF file.
+ */
+extern void
+c_ncvpt (
+    int			ncid,	/* netCDF ID */
+    int			varid,	/* variable ID */
+    const size_t*	start,	/* multidimensional index of hypercube corner */
+    const size_t*	count,	/* multidimensional hypercube edge lengths */
+    const void*		value,	/* block of data values to be written */
+    int*		rcode	/* returned error code */
+)
+{
+    int		status;
+    nc_type	datatype;
+
+    if ((status = nc_inq_vartype(ncid, varid, &datatype)) == 0)
+    {
+	switch (datatype)
+	{
+	case NC_CHAR:
+	    status = NC_ECHAR;
+	    break;
+	case NC_BYTE:
+#	    if NF_INT1_IS_C_SIGNED_CHAR
+		status = nc_put_vara_schar(ncid, varid, start, count,
+					   (const signed char*)value);
+#	    elif NF_INT1_IS_C_SHORT
+		status = nc_put_vara_short(ncid, varid, start, count,
+					   (const short*)value);
+#	    elif NF_INT1_IS_C_INT
+		status = nc_put_vara_int(ncid, varid, start, count,
+					   (const int*)value);
+#	    elif NF_INT1_IS_C_LONG
+		status = nc_put_vara_long(ncid, varid, start, count,
+					   (const long*)value);
+#	    endif
+	    break;
+	case NC_SHORT:
+#	    if NF_INT2_IS_C_SHORT
+		status = nc_put_vara_short(ncid, varid, start, count,
+					   (const short*)value);
+#	    elif NF_INT2_IS_C_INT
+		status = nc_put_vara_int(ncid, varid, start, count,
+					   (const int*)value);
+#	    elif NF_INT2_IS_C_LONG
+		status = nc_put_vara_long(ncid, varid, start, count,
+					   (const long*)value);
+#	    endif
+	    break;
+	case NC_INT:
+#	    if NF_INT_IS_C_INT
+		status = nc_put_vara_int(ncid, varid, start, count,
+					   (const int*)value);
+#	    elif NF_INT_IS_C_LONG
+		status = nc_put_vara_long(ncid, varid, start, count,
+					   (const long*)value);
+#	    endif
+	    break;
+	case NC_FLOAT:
+#	    if NF_REAL_IS_C_FLOAT
+		status = nc_put_vara_float(ncid, varid, start, count,
+					   (const float*)value);
+#	    elif NF_REAL_IS_C_DOUBLE
+		status = nc_put_vara_double(ncid, varid, start, count,
+					   (const double*)value);
+#	    endif
+	    break;
+	case NC_DOUBLE:
+#	    if NF_DOUBLEPRECISION_IS_C_FLOAT
+		status = nc_put_vara_float(ncid, varid, start, count,
+					   (const float*)value);
+#	    elif NF_DOUBLEPRECISION_IS_C_DOUBLE
+		status = nc_put_vara_double(ncid, varid, start, count,
+					   (const double*)value);
+#	    endif
+	    break;
+	}
+    }
+
+    if (status == 0)
+	*rcode = 0;
+    else
+    {
+	nc_advise("NCVPT", status, "");
+	*rcode = ncerr;
+    }
+}
+
+
+/*
+ * Write a hypercube of character values into an open netCDF file.
+ */
+extern void
+c_ncvptc(
+    int			ncid,	/* netCDF ID */
+    int			varid,	/* variable ID */
+    const size_t*	start,	/* multidimensional index of hypercube corner */
+    const size_t*	count,	/* multidimensional hypercube edge lengths */
+    const char*		value,	/* block of data values to be written */
+    int			lenstr,	/* declared length of the data argument */
+    int*		rcode	/* returned error code */
+)
+{
+    int		status;
+    nc_type	datatype;
+
+    if ((status = nc_inq_vartype(ncid, varid, &datatype)) == 0)
+    {
+	if (datatype != NC_CHAR)
+	    status = NC_ECHAR;
+	else
+	{
+	    int	rank;
+
+	    status = nc_inq_varndims(ncid, varid, &rank);
+	    if (status == 0)
+	    {
+		if (dimprod(count, rank) > (size_t)lenstr)
+		    status = NC_ESTS;
+		else
+		    status = nc_put_vara_text(ncid, varid, start, count, value);
+	    }
+	}
+    }
+
+    if (status == 0)
+	*rcode = 0;
+    else
+    {
+	nc_advise("NCVPTC", status, "");
+	*rcode = ncerr;
+    }
+}
+
+
+/*
+ * Write a generalized hypercube of numeric values into a netCDF variable of 
+ * an open netCDF file.
+ */
+extern void
+c_ncvptg (
+    int			ncid,	/* netCDF ID */
+    int			varid,	/* variable ID */
+    const size_t*	start,	/* multidimensional index of hypercube corner */
+    const size_t*	count,	/* multidimensional hypercube edge lengths */
+    const ptrdiff_t*	strides,/* netCDF variable access strides */
+    const ptrdiff_t*	imap,	/* memory values access mapping vector */
+    const void*		value,	/* block of data values to be written */
+    int*		rcode	/* returned error code */
+)
+{
+    int		status;
+    int		rank;
+    nc_type	datatype;
+
+    if ((status = nc_inq_vartype(ncid, varid, &datatype)) == 0 &&
+	(status = nc_inq_varndims(ncid, varid, &rank)) == 0)
+    {
+	switch (datatype)
+	{
+	case NC_CHAR:
+	    status = NC_ECHAR;
+	    break;
+	case NC_BYTE:
+#	    if NF_INT1_IS_C_SIGNED_CHAR
+		status = nc_put_varm_schar(ncid, varid, start, count,
+					   strides, imap,
+					   (const signed char*)value);
+#	    elif NF_INT1_IS_C_SHORT
+		status = nc_put_varm_short(ncid, varid, start, count,
+					   strides, imap,
+					   (const short*)value);
+#	    elif NF_INT1_IS_C_INT
+		status = nc_put_varm_int(ncid, varid, start, count,
+					   strides, imap,
+					   (const int*)value);
+#	    elif NF_INT1_IS_C_LONG
+		status = nc_put_varm_long(ncid, varid, start, count,
+					   strides, imap,
+					   (const long*)value);
+#	    endif
+	    break;
+	case NC_SHORT:
+#	    if NF_INT2_IS_C_SHORT
+		status = nc_put_varm_short(ncid, varid, start, count,
+					   strides, imap,
+					   (const short*)value);
+#	    elif NF_INT2_IS_C_INT
+		status = nc_put_varm_int(ncid, varid, start, count,
+					   strides, imap,
+					   (const int*)value);
+#	    elif NF_INT2_IS_C_LONG
+		status = nc_put_varm_long(ncid, varid, start, count,
+					   strides, imap,
+					   (const long*)value);
+#	    endif
+	    break;
+	case NC_INT:
+#	    if NF_INT_IS_C_INT
+		status = nc_put_varm_int(ncid, varid, start, count,
+					   strides, imap,
+					   (const int*)value);
+#	    elif NF_INT_IS_C_LONG
+		status = nc_put_varm_long(ncid, varid, start, count,
+					   strides, imap,
+					   (const long*)value);
+#	    endif
+	    break;
+	case NC_FLOAT:
+#	    if NF_REAL_IS_C_FLOAT
+		status = nc_put_varm_float(ncid, varid, start, count,
+					   strides, imap,
+					   (const float*)value);
+#	    elif NF_REAL_IS_C_DOUBLE
+		status = nc_put_varm_double(ncid, varid, start, count,
+					   strides, imap,
+					   (const double*)value);
+#	    endif
+	    break;
+	case NC_DOUBLE:
+#	    if NF_DOUBLEPRECISION_IS_C_FLOAT
+		status = nc_put_varm_float(ncid, varid, start, count,
+					   strides, imap,
+					   (const float*)value);
+#	    elif NF_DOUBLEPRECISION_IS_C_DOUBLE
+		status = nc_put_varm_double(ncid, varid, start, count,
+					   strides, imap,
+					   (const double*)value);
+#	    endif
+	    break;
+	}
+    }
+
+    if (status == 0)
+	*rcode = 0;
+    else
+    {
+	nc_advise("NCVPTG", status, "");
+	*rcode = ncerr;
+    }
+}
+
+
+/*
+ * Write a generalized hypercube of character values into a netCDF variable of 
+ * an open netCDF file.
+ */
+extern void
+c_ncvpgc(
+    int			ncid,	/* netCDF ID */
+    int			varid,	/* variable ID */
+    const size_t*	start,	/* multidimensional index of hypercube corner */
+    const size_t*	count,	/* multidimensional hypercube edge lengths */
+    const ptrdiff_t*	strides,/* netCDF variable access strides */
+    const ptrdiff_t*	imap,	/* memory values access mapping vector */
+    const char*		value,	/* block of data values to be written */
+    int*		rcode	/* returned error code */
+)
+{
+    int		status;
+    int		rank;
+    nc_type	datatype;
+
+    if ((status = nc_inq_vartype(ncid, varid, &datatype)) == 0 &&
+	(status = nc_inq_varndims(ncid, varid, &rank)) == 0)
+    {
+	switch (datatype)
+	{
+	case NC_CHAR:
+	    status = nc_put_varm_text(ncid, varid, start, count,
+				       strides, imap,
+				       value);
+	    break;
+	default:
+	    status = NC_ECHAR;
+	    break;
+	}
+    }
+
+    if (status == 0)
+	*rcode = 0;
+    else
+    {
+	nc_advise("NCVPGC", status, "");
+	*rcode = ncerr;
+    }
+}
+
+
+/*
+ * Get a single numeric value from a variable of an open netCDF file.
+ */
+extern void
+c_ncvgt1 (
+    int			ncid,	/* netCDF ID */
+    int	 		varid,	/* variable ID */
+    const size_t*	indices,/* multidim index of data to be read */
+    void*		value,	/* pointer to data value to be read */
+    int*		rcode	/* returned error code */
+)
+{
+    int		status;
+    nc_type	datatype;
+
+    if ((status = nc_inq_vartype(ncid, varid, &datatype)) == 0)
+    {
+	switch (datatype)
+	{
+	case NC_CHAR:
+	    status = NC_ECHAR;
+	    break;
+	case NC_BYTE:
+#	    if NF_INT1_IS_C_SIGNED_CHAR
+		status = nc_get_var1_schar(ncid, varid, indices,
+					   (signed char*)value);
+#	    elif NF_INT1_IS_C_SHORT
+		status = nc_get_var1_short(ncid, varid, indices,
+					   (short*)value);
+#	    elif NF_INT1_IS_C_INT
+		status = nc_get_var1_int(ncid, varid, indices,
+					   (int*)value);
+#	    elif NF_INT1_IS_C_LONG
+		status = nc_get_var1_long(ncid, varid, indices,
+					   (long*)value);
+#	    endif
+	    break;
+	case NC_SHORT:
+#	    if NF_INT2_IS_C_SHORT
+		status = nc_get_var1_short(ncid, varid, indices,
+					   (short*)value);
+#	    elif NF_INT2_IS_C_INT
+		status = nc_get_var1_int(ncid, varid, indices,
+					   (int*)value);
+#	    elif NF_INT2_IS_C_LONG
+		status = nc_get_var1_long(ncid, varid, indices,
+					   (long*)value);
+#	    endif
+	    break;
+	case NC_INT:
+#	    if NF_INT_IS_C_INT
+		status = nc_get_var1_int(ncid, varid, indices,
+					   (int*)value);
+#	    elif NF_INT_IS_C_LONG
+		status = nc_get_var1_long(ncid, varid, indices,
+					   (long*)value);
+#	    endif
+	    break;
+	case NC_FLOAT:
+#	    if NF_REAL_IS_C_FLOAT
+		status = nc_get_var1_float(ncid, varid, indices,
+					   (float*)value);
+#	    elif NF_REAL_IS_C_DOUBLE
+		status = nc_get_var1_double(ncid, varid, indices,
+					   (double*)value);
+#	    endif
+	    break;
+	case NC_DOUBLE:
+#	    if NF_DOUBLEPRECISION_IS_C_FLOAT
+		status = nc_get_var1_float(ncid, varid, indices,
+					   (float*)value);
+#	    elif NF_DOUBLEPRECISION_IS_C_DOUBLE
+		status = nc_get_var1_double(ncid, varid, indices,
+					   (double*)value);
+#	    endif
+	    break;
+	}
+    }
+
+    if (status == 0)
+	*rcode = 0;
+    else
+    {
+	nc_advise("NCVGT1", status, "");
+	*rcode = ncerr;
+    }
+}
+
+
+/*
+ * Get a single character data value from a variable of an open
+ * netCDF file.
+ */
+extern void
+c_ncvg1c(
+    int			ncid,	/* netCDF ID */
+    int	 		varid,	/* variable ID */
+    const size_t*	indices,/* multidim index of data to be read */
+    char*		value,	/* pointer to data value to be read */
+    int*		rcode	/* returned error code */
+)
+{
+    int		status;
+    nc_type	datatype;
+
+    if ((status = nc_inq_vartype(ncid, varid, &datatype)) == 0)
+    {
+	switch (datatype)
+	{
+	case NC_CHAR:
+	    status = nc_get_var1_text(ncid, varid, indices, value);
+	    break;
+	default:
+	    status = NC_ECHAR;
+	    break;
+	}
+    }
+
+    if (status == 0)
+	*rcode = 0;
+    else
+    {
+	nc_advise("NCVG1C", status, "");
+	*rcode = ncerr;
+    }
+}
+
+
+/*
+ * Read a hypercube of numeric values from a netCDF variable of an open
+ * netCDF file.
+ */
+extern void
+c_ncvgt(
+    int			ncid,	/* netCDF ID */
+    int			varid,	/* variable ID */
+    const size_t*	start,	/* multidimensional index of hypercube corner */
+    const size_t*	count,	/* multidimensional hypercube edge lengths */
+    void*		value,	/* block of data values to be read */
+    int*		rcode	/* returned error code */
+)
+{
+    int		status;
+    nc_type	datatype;
+
+    if ((status = nc_inq_vartype(ncid, varid, &datatype)) == 0)
+    {
+	switch (datatype)
+	{
+	case NC_CHAR:
+	    status = NC_ECHAR;
+	    break;
+	case NC_BYTE:
+#	    if NF_INT1_IS_C_SIGNED_CHAR
+		status = nc_get_vara_schar(ncid, varid, start, count,
+					   (signed char*)value);
+#	    elif NF_INT1_IS_C_SHORT
+		status = nc_get_vara_short(ncid, varid, start, count,
+					   (short*)value);
+#	    elif NF_INT1_IS_C_INT
+		status = nc_get_vara_int(ncid, varid, start, count,
+					   (int*)value);
+#	    elif NF_INT1_IS_C_LONG
+		status = nc_get_vara_long(ncid, varid, start, count,
+					   (long*)value);
+#	    endif
+	    break;
+	case NC_SHORT:
+#	    if NF_INT2_IS_C_SHORT
+		status = nc_get_vara_short(ncid, varid, start, count,
+					   (short*)value);
+#	    elif NF_INT2_IS_C_INT
+		status = nc_get_vara_int(ncid, varid, start, count,
+					   (int*)value);
+#	    elif NF_INT2_IS_C_LONG
+		status = nc_get_vara_long(ncid, varid, start, count,
+					   (long*)value);
+#	    endif
+	    break;
+	case NC_INT:
+#	    if NF_INT_IS_C_INT
+		status = nc_get_vara_int(ncid, varid, start, count,
+					   (int*)value);
+#	    elif NF_INT_IS_C_LONG
+		status = nc_get_vara_long(ncid, varid, start, count,
+					   (long*)value);
+#	    endif
+	    break;
+	case NC_FLOAT:
+#	    if NF_REAL_IS_C_FLOAT
+		status = nc_get_vara_float(ncid, varid, start, count,
+					   (float*)value);
+#	    elif NF_REAL_IS_C_DOUBLE
+		status = nc_get_vara_double(ncid, varid, start, count,
+					   (double*)value);
+#	    endif
+	    break;
+	case NC_DOUBLE:
+#	    if NF_DOUBLEPRECISION_IS_C_FLOAT
+		status = nc_get_vara_float(ncid, varid, start, count,
+					   (float*)value);
+#	    elif NF_DOUBLEPRECISION_IS_C_DOUBLE
+		status = nc_get_vara_double(ncid, varid, start, count,
+					   (double*)value);
+#	    endif
+	    break;
+	}
+    }
+
+    if (status == 0)
+	*rcode = 0;
+    else
+    {
+	nc_advise("NCVGT", status, "");
+	*rcode = ncerr;
+    }
+}
+
+
+/*
+ * Read a hypercube of character values from a netCDF variable.
+ */
+extern void
+c_ncvgtc(
+    int			ncid,	/* netCDF ID */
+    int			varid,	/* variable ID */
+    const size_t*	start,	/* multidimensional index of hypercube corner */
+    const size_t*	count,	/* multidimensional hypercube edge lengths */
+    char*		value,	/* block of data values to be read */
+    int			lenstr,	/* declared length of the data argument */
+    int*		rcode	/* returned error code */
+)
+{
+    int		status;
+    nc_type	datatype;
+
+    if ((status = nc_inq_vartype(ncid, varid, &datatype)) == 0)
+    {
+	if (datatype != NC_CHAR)
+	    status = NC_ECHAR;
+	else if ((status = nc_get_vara_text(ncid, varid, start, count, value))
+		 == 0)
+	{
+	    int	rank;
+
+	    if ((status = nc_inq_varndims(ncid, varid, &rank)) == 0)
+	    {
+		size_t	total = dimprod(count, rank);
+
+		(void) memset(value+total, ' ', lenstr - total);
+	    }
+	}
+    }
+
+    if (status == 0)
+	*rcode = 0;
+    else
+    {
+	nc_advise("NCVGTC", status, "");
+	*rcode = ncerr;
+    }
+}
+
+/*
+ * Read a generalized hypercube of numeric values from a netCDF variable of an 
+ * open netCDF file.
+ */
+extern void
+c_ncvgtg (
+    int			ncid,	/* netCDF ID */
+    int			varid,	/* variable ID */
+    const size_t*	start,	/* multidimensional index of hypercube corner */
+    const size_t*	count,	/* multidimensional hypercube edge lengths */
+    const ptrdiff_t*	strides,/* netCDF variable access strides */
+    const ptrdiff_t*	imap,	/* memory values access basis vector */
+    void*		value,	/* block of data values to be read */
+    int*		rcode	/* returned error code */
+)
+{
+    int		status;
+    int		rank;
+    nc_type	datatype;
+
+    if ((status = nc_inq_vartype(ncid, varid, &datatype)) == 0 &&
+	(status = nc_inq_varndims(ncid, varid, &rank)) == 0)
+    {
+	switch (datatype)
+	{
+	case NC_CHAR:
+	    status = NC_ECHAR;
+	    break;
+	case NC_BYTE:
+#	    if NF_INT1_IS_C_SIGNED_CHAR
+		status = nc_get_varm_schar(ncid, varid, start, count,
+					   strides, imap,
+					   (signed char*)value);
+#	    elif NF_INT1_IS_C_SHORT
+		status = nc_get_varm_short(ncid, varid, start, count,
+					   strides, imap,
+					   (short*)value);
+#	    elif NF_INT1_IS_C_INT
+		status = nc_get_varm_int(ncid, varid, start, count,
+					   strides, imap,
+					   (int*)value);
+#	    elif NF_INT1_IS_C_LONG
+		status = nc_get_varm_long(ncid, varid, start, count,
+					   strides, imap,
+					   (long*)value);
+#	    endif
+	    break;
+	case NC_SHORT:
+#	    if NF_INT2_IS_C_SHORT
+		status = nc_get_varm_short(ncid, varid, start, count,
+					   strides, imap,
+					   (short*)value);
+#	    elif NF_INT2_IS_C_INT
+		status = nc_get_varm_int(ncid, varid, start, count,
+					   strides, imap,
+					   (int*)value);
+#	    elif NF_INT2_IS_C_LONG
+		status = nc_get_varm_long(ncid, varid, start, count,
+					   strides, imap,
+					   (long*)value);
+#	    endif
+	    break;
+	case NC_INT:
+#	    if NF_INT_IS_C_INT
+		status = nc_get_varm_int(ncid, varid, start, count,
+					   strides, imap,
+					   (int*)value);
+#	    elif NF_INT_IS_C_LONG
+		status = nc_get_varm_long(ncid, varid, start, count,
+					   strides, imap,
+					   (long*)value);
+#	    endif
+	    break;
+	case NC_FLOAT:
+#	    if NF_REAL_IS_C_FLOAT
+		status = nc_get_varm_float(ncid, varid, start, count,
+					   strides, imap,
+					   (float*)value);
+#	    elif NF_REAL_IS_C_DOUBLE
+		status = nc_get_varm_double(ncid, varid, start, count,
+					   strides, imap,
+					   (double*)value);
+#	    endif
+	    break;
+	case NC_DOUBLE:
+#	    if NF_DOUBLEPRECISION_IS_C_FLOAT
+		status = nc_get_varm_float(ncid, varid, start, count,
+					   strides, imap,
+					   (float*)value);
+#	    elif NF_DOUBLEPRECISION_IS_C_DOUBLE
+		status = nc_get_varm_double(ncid, varid, start, count,
+					   strides, imap,
+					   (double*)value);
+#	    endif
+	    break;
+	}
+    }
+
+    if (status == 0)
+	*rcode = 0;
+    else
+    {
+	nc_advise("NCVGTG", status, "");
+	*rcode = ncerr;
+    }
+}
+
+/*
+ * Read a generalized hypercube of character values from a netCDF variable 
+ * of an open netCDF file.
+ */
+extern void
+c_ncvggc(
+    int			ncid,	/* netCDF ID */
+    int			varid,	/* variable ID */
+    const size_t*	start,	/* multidimensional index of hypercube corner */
+    const size_t*	count,	/* multidimensional hypercube edge lengths */
+    const ptrdiff_t*	strides,/* netCDF variable access strides */
+    const ptrdiff_t*	imap,	/* memory values access basis vector */
+    char*		value,	/* block of data values to be written */
+    int*		rcode	/* returned error code */
+)
+{
+    int		status;
+    int		rank;
+    nc_type	datatype;
+
+    if ((status = nc_inq_vartype(ncid, varid, &datatype)) == 0 &&
+	(status = nc_inq_varndims(ncid, varid, &rank)) == 0)
+    {
+	switch (datatype)
+	{
+	case NC_CHAR:
+	    status = nc_get_varm_text(ncid, varid, start, count,
+				       strides, imap,
+				       value);
+	    break;
+	default:
+	    status = NC_ECHAR;
+	    break;
+	}
+    }
+
+    if (status == 0)
+	*rcode = 0;
+    else
+    {
+	nc_advise("NCVGGC", status, "");
+	*rcode = ncerr;
+    }
+}
+
+/*
+ * Change the name of a netCDF variable in an open netCDF file.
+ */
+extern void
+c_ncvren (
+    int ncid,		/* netCDF ID */
+    int varid,		/* variable ID */
+    const char* varname,/* new name for variable */
+    int* rcode		/* returned error code */
+)
+{
+    *rcode = ncvarrename (ncid, varid, varname) == -1
+		? ncerr
+		: 0;
+}
+
+/*
+ * Add or changes a numeric variable or global attribute of an open
+ * netCDF file.
+ */
+extern void
+c_ncapt (
+    int		ncid,		/* netCDF ID */
+    int		varid,		/* variable ID */
+    const char*	attname,	/* attribute name */
+    nc_type	datatype,	/* attribute datatype */
+    size_t	attlen,		/* attribute length */
+    const void*	value,		/* pointer to data values */
+    int*	rcode		/* returned error code */
+)
+{
+    int		status;
+
+    switch (datatype)
+    {
+    case NC_CHAR:
+	status = NC_ECHAR;
+	break;
+    case NC_BYTE:
+#	if NF_INT1_IS_C_SIGNED_CHAR
+	    status = nc_put_att_schar(ncid, varid, attname, datatype,
+				       attlen, (const signed char*)value);
+#	elif NF_INT1_IS_C_SHORT
+	    status = nc_put_att_short(ncid, varid, attname, datatype,
+				       attlen, (const short*)value);
+#	elif NF_INT1_IS_C_INT
+	    status = nc_put_att_int(ncid, varid, attname, datatype,
+				       attlen, (const int*)value);
+#	elif NF_INT1_IS_C_LONG
+	    status = nc_put_att_long(ncid, varid, attname, datatype,
+				       attlen, (const long*)value);
+#	endif
+	break;
+    case NC_SHORT:
+#	if NF_INT2_IS_C_SHORT
+	    status = nc_put_att_short(ncid, varid, attname, datatype,
+				       attlen, (const short*)value);
+#	elif NF_INT2_IS_C_INT
+	    status = nc_put_att_int(ncid, varid, attname, datatype,
+				       attlen, (const int*)value);
+#	elif NF_INT2_IS_C_LONG
+	    status = nc_put_att_long(ncid, varid, attname, datatype,
+				       attlen, (const long*)value);
+#	endif
+	break;
+    case NC_INT:
+#	if NF_INT_IS_C_INT
+	    status = nc_put_att_int(ncid, varid, attname, datatype,
+				       attlen, (const int*)value);
+#	elif NF_INT_IS_C_LONG
+	    status = nc_put_att_long(ncid, varid, attname, datatype,
+				       attlen, (const long*)value);
+#	endif
+	break;
+    case NC_FLOAT:
+#	if NF_REAL_IS_C_FLOAT
+	    status = nc_put_att_float(ncid, varid, attname, datatype,
+				       attlen, (const float*)value);
+#	elif NF_REAL_IS_C_DOUBLE
+	    status = nc_put_att_double(ncid, varid, attname, datatype,
+				       attlen, (const double*)value);
+#	endif
+	break;
+    case NC_DOUBLE:
+#	if NF_DOUBLEPRECISION_IS_C_FLOAT
+	    status = nc_put_att_float(ncid, varid, attname, datatype,
+				       attlen, (const float*)value);
+#	elif NF_DOUBLEPRECISION_IS_C_DOUBLE
+	    status = nc_put_att_double(ncid, varid, attname, datatype,
+				       attlen, (const double*)value);
+#	endif
+	break;
+    }
+
+    if (status == 0)
+	*rcode = 0;
+    else
+    {
+	nc_advise("NCAPT", status, "");
+	*rcode = ncerr;
+    }
+}
+
+/*
+ * Add or change a character attribute of an open netCDF file.
+ */
+extern void
+c_ncaptc(
+    int		ncid,		/* netCDF ID */
+    int		varid,		/* variable ID */
+    const char*	attname,	/* attribute name */
+    nc_type	datatype,	/* attribute datatype */
+    size_t	attlen,		/* attribute length */
+    const char*	value,		/* pointer to data values */
+    int*	rcode		/* returned error code */
+)
+{
+    int		status;
+
+    if (datatype != NC_CHAR)
+	status = NC_ECHAR;
+    else
+	status = nc_put_att_text(ncid, varid, attname, attlen, value);
+
+    if (status == 0)
+	*rcode = 0;
+    else
+    {
+	nc_advise("NCAPTC", status, "");
+	*rcode = ncerr;
+    }
+}
+
+/*
+ * Return information about a netCDF attribute given its variable
+ * ID and name.
+ */
+extern void
+c_ncainq (
+    int ncid,			/* netCDF ID */
+    int varid,			/* variable ID */
+    const char* attname,	/* attribute name */
+    nc_type* datatype,		/* returned attribute datatype */
+    int* attlen,		/* returned attribute length */
+    int* rcode			/* returned error code */
+)
+{
+    *rcode = ncattinq(ncid, varid, attname, datatype, attlen)
+	     == -1
+		? ncerr
+		: 0;
+}
+
+/*
+ * Get the value of a netCDF attribute given its variable ID and name.
+ */
+extern void
+c_ncagt(
+    int		ncid,		/* netCDF ID */
+    int		varid,		/* variable ID */
+    const char*	attname,	/* attribute name */
+    void*	value,		/* pointer to data values */
+    int*	rcode		/* returned error code */
+)
+{
+    int		status;
+    nc_type	datatype;
+
+    if ((status = nc_inq_atttype(ncid, varid, attname, &datatype)) == 0)
+    {
+	switch (datatype)
+	{
+	case NC_CHAR:
+	    status = NC_ECHAR;
+	    break;
+	case NC_BYTE:
+#    	if NF_INT1_IS_C_SIGNED_CHAR
+		status = nc_get_att_schar(ncid, varid, attname, 
+					   (signed char*)value);
+#    	elif NF_INT1_IS_C_SHORT
+		status = nc_get_att_short(ncid, varid, attname, 
+					   (short*)value);
+#    	elif NF_INT1_IS_C_INT
+		status = nc_get_att_int(ncid, varid, attname, 
+					   (int*)value);
+#    	elif NF_INT1_IS_C_LONG
+		status = nc_get_att_long(ncid, varid, attname, 
+					   (long*)value);
+#    	endif
+	    break;
+	case NC_SHORT:
+#    	if NF_INT2_IS_C_SHORT
+		status = nc_get_att_short(ncid, varid, attname, 
+					   (short*)value);
+#    	elif NF_INT2_IS_C_INT
+		status = nc_get_att_int(ncid, varid, attname, 
+					   (int*)value);
+#    	elif NF_INT2_IS_C_LONG
+		status = nc_get_att_long(ncid, varid, attname, 
+					   (long*)value);
+#    	endif
+	    break;
+	case NC_INT:
+#	    if NF_INT_IS_C_INT
+		status = nc_get_att_int(ncid, varid, attname, 
+					   (int*)value);
+#	    elif NF_INT_IS_C_LONG
+		status = nc_get_att_long(ncid, varid, attname, 
+					   (long*)value);
+#	    endif
+	    break;
+	case NC_FLOAT:
+#    	if NF_REAL_IS_C_FLOAT
+		status = nc_get_att_float(ncid, varid, attname, 
+					   (float*)value);
+#    	elif NF_REAL_IS_C_DOUBLE
+		status = nc_get_att_double(ncid, varid, attname, 
+					   (double*)value);
+#    	endif
+	    break;
+	case NC_DOUBLE:
+#    	if NF_DOUBLEPRECISION_IS_C_FLOAT
+		status = nc_get_att_float(ncid, varid, attname, 
+					   (float*)value);
+#    	elif NF_DOUBLEPRECISION_IS_C_DOUBLE
+		status = nc_get_att_double(ncid, varid, attname, 
+					   (double*)value);
+#    	endif
+	    break;
+	}
+    }
+
+    if (status == 0)
+	*rcode = 0;
+    else
+    {
+	nc_advise("NCAGT", status, "");
+	*rcode = ncerr;
+    }
+}
+
+/*
+ * Get the value of a netCDF character attribute given its variable
+ * ID and name.
+ */
+extern void
+c_ncagtc(
+    int		ncid,		/* netCDF ID */
+    int		varid,		/* variable ID */
+    const char*	attname,	/* attribute name */
+    char*	value,		/* pointer to data values */
+    int		attlen,		/* length of string argument */
+    int*	rcode		/* returned error code */
+)
+{
+    int		status;
+    nc_type	datatype;
+
+    if ((status = nc_inq_atttype(ncid, varid, attname, &datatype)) == 0)
+    {
+	if (datatype != NC_CHAR)
+	    status = NC_ECHAR;
+	else
+	{
+	    size_t	len;
+
+	    status = nc_inq_attlen(ncid, varid, attname, &len);
+	    if (status == 0)
+	    {
+		if (attlen < len)
+		    status = NC_ESTS;
+		else
+		{
+		    status = nc_get_att_text(ncid, varid, attname, 
+					       value);
+		    if (status == 0)
+			(void) memset(value+len, ' ', attlen - len);
+		}
+	    }
+	}
+    }
+
+    if (status == 0)
+	*rcode = 0;
+    else
+    {
+	nc_advise("NCAGTC", status, "");
+	*rcode = ncerr;
+    }
+}
+
+/*
+ * Copy an attribute from one open netCDF file to another.
+ */
+extern void
+c_ncacpy (
+    int inncid,		/* input netCDF ID */
+    int invarid,	/* variable ID of input netCDF or NC_GLOBAL */
+    const char* attname,/* name of attribute in input netCDF to be copied */
+    int outncid,	/* ID of output netCDF file for attribute */
+    int outvarid,	/* ID of associated netCDF variable or NC_GLOBAL */
+    int* rcode		/* returned error code */
+)
+{
+    *rcode = ncattcopy(inncid, invarid, attname, outncid, outvarid)
+	     == -1
+		? ncerr
+		: 0;
+}
+
+/*
+ * Get the name of an attribute given its variable ID and number
+ * as an attribute of that variable.
+ */
+extern void
+c_ncanam (
+    int ncid,		/* netCDF ID */
+    int varid,		/* variable ID */
+    int attnum,		/* attribute number */
+    char* attname,	/* returned attribute name */
+    int* rcode		/* returned error code */
+)
+{
+    *rcode = ncattname(ncid, varid, attnum, attname) == -1
+		? ncerr
+		: 0;
+}
+
+/*
+ * Rename an attribute in an open netCDF file.
+ */
+extern void
+c_ncaren (
+    int ncid,		/* netCDF ID */
+    int varid,		/* variable ID */
+    const char* attname,/* attribute name */
+    const char* newname,/* new name */
+    int* rcode		/* returned error code */
+)
+{
+    *rcode = ncattrename(ncid, varid, attname, newname) == -1
+		? ncerr
+		: 0;
+}
+
+/*
+ * Delete an attribute from an open netCDF file given the attribute name.
+ */
+extern void
+c_ncadel (
+    int ncid,		/* netCDF ID */
+    int varid,		/* variable ID */
+    const char* attname,/* attribute name */
+    int* rcode		/* returned error code */
+)
+{
+    *rcode = ncattdel(ncid, varid, attname) == -1
+		? ncerr
+		: 0;
+}
+
+/*
+ * Set the fill mode of a netCDF file open for writing.
+ */
+extern int
+c_ncsfil (
+    int ncid,		/* netCDF ID */
+    int fillmode,	/* fill mode, NCNOFILL or NCFILL */
+    int* rcode		/* returned error code */
+)
+{
+    int retval;
+
+    *rcode = ((retval = ncsetfill(ncid, fillmode)) == -1)
+		? ncerr
+		: 0;
+
+    return retval;
+}
+
+#endif /*!NO_NETCDF_2*/
diff --git a/fortran/nf_var1io.F90 b/fortran/nf_var1io.F90
new file mode 100755
index 0000000..d3d821a
--- /dev/null
+++ b/fortran/nf_var1io.F90
@@ -0,0 +1,694 @@
+#include "nfconfig.inc"
+!----- Routines to put/get single data items of a variety of data types ------
+
+! Replacement for fort-var1io.c
+
+! Written by: Richard Weed, Ph.D
+!             Center for Advanced Vehicular Systems 
+!             Mississippi State University
+!             rweed at cavs.msstate.edu
+
+
+! License (and other Lawyer Language)
+ 
+! This software is released under the Apache 2.0 Open Source License. The
+! full text of the License can be viewed at :
+!
+!   http:www.apache.org/licenses/LICENSE-2.0.html
+!
+! The author grants to the University Corporation for Atmospheric Research
+! (UCAR), Boulder, CO, USA the right to revise and extend the software
+! without restriction. However, the author retains all copyrights and
+! intellectual property rights explicitly stated in or implied by the
+! Apache license
+
+! Version 1.: Sept. 2005 - Initial Cray X1 version
+! Version 2.: May   2006 - Updated to support g95
+!                          Updated to pass ndex as C_PTR variable
+! Version 3.: April 2009 - Updated for netCDF 4.0.1
+! Version 4.: April 2010 - Updated for netCDF 4.1.1
+!                          Added preprocessor test for int and real types
+          
+!--------------------------------- nf_put_var1_text ------------------------
+ Function nf_put_var1_text(ncid, varid, ndex, chval) RESULT(status)
+
+! Write out a single character variable to location vector ndex in dataset
+
+ USE netcdf_nc_interfaces
+
+ Implicit NONE
+
+ Integer,          Intent(IN) :: ncid, varid
+ Integer,          Intent(IN) :: ndex(*)
+ Character(LEN=1), Intent(IN) :: chval
+
+ Integer                      :: status
+
+ Integer(KIND=C_INT)            :: cncid, cvarid, cndims, cstat1, cstatus
+ Integer(KIND=C_SIZE_T), TARGET :: cndex(NC_MAX_DIMS)
+ Type(C_PTR)                    :: cndexptr
+ Integer :: ndims
+
+ cncid  = ncid
+ cvarid = varid - 1 ! Subtract one to get C varid
+ cndex  = 0
+ 
+ cstat1 = nc_inq_varndims(cncid, cvarid, cndims)
+
+ cndexptr = C_NULL_PTR
+ ndims    = cndims
+
+ If (cstat1 == NC_NOERR) Then
+   If (ndims > 0) Then ! reverse array order and subtract 1 to get C index 
+     cndex(1:ndims) = ndex(ndims:1:-1)-1
+   EndIf
+   cndexptr = C_LOC(cndex)
+ EndIf
+
+ cstatus = nc_put_var1_text(cncid, cvarid, cndexptr, chval)
+
+ status = cstatus
+
+ End Function nf_put_var1_text
+!--------------------------------- nf_put_var1_int1 ------------------------
+ Function nf_put_var1_int1(ncid, varid, ndex, ival) RESULT(status)
+
+! Write out a 8 bit integer variable to location vector ndex in dataset
+
+ USE netcdf_nc_interfaces
+
+ Implicit NONE
+
+ Integer,              Intent(IN) :: ncid, varid
+ Integer,              Intent(IN) :: ndex(*)
+ Integer(KIND=NFINT1), Intent(IN) :: ival
+
+ Integer                          :: status
+
+ Integer(KIND=C_INT)            :: cncid, cvarid, cndims, cstat1, cstatus
+ Integer(KIND=C_SIZE_T), TARGET :: cndex(NC_MAX_DIMS)
+ Type(C_PTR)                    :: cndexptr
+ Integer(KIND=CINT1)            :: cival
+ Integer                        :: ndims
+
+ If (C_SIGNED_CHAR < 0) Then ! schar not supported by processor exit
+   status = NC_EBADTYPE
+   RETURN
+ EndIf
+
+ cncid  = ncid
+ cvarid = varid - 1 ! Subtract one to get C varid
+ cival  = ival
+ cndex  = 0
+
+ cstat1 = nc_inq_varndims(cncid, cvarid, cndims)
+
+ cndexptr = C_NULL_PTR
+ ndims    = cndims
+
+ If (cstat1 == NC_NOERR) Then
+   If (ndims > 0) Then ! reverse array order and subtract 1 to get C index 
+     cndex(1:ndims) = ndex(ndims:1:-1)-1
+   EndIf
+   cndexptr = C_LOC(cndex)
+ EndIf
+
+#if NF_INT1_IS_C_SIGNED_CHAR
+ cstatus = nc_put_var1_schar(cncid, cvarid, cndexptr, cival)
+#elif NF_INT1_IS_C_SHORT
+ cstatus = nc_put_var1_short(cncid, cvarid, cndexptr, cival)
+#elif NF_INT1_IS_C_INT
+ cstatus = nc_put_var1_int(cncid, cvarid, cndexptr, cival)
+#elif NF_INT1_IS_C_LONG
+ cstatus = nc_put_var1_long(cncid, cvarid, cndexptr, cival)
+#endif
+
+ status = cstatus
+
+ End Function nf_put_var1_int1
+!--------------------------------- nf_put_var1_int2 ------------------------
+ Function nf_put_var1_int2(ncid, varid, ndex, ival) RESULT(status)
+
+! Write out a 16 bit integer variable to location vector ndex in dataset
+
+ USE netcdf_nc_interfaces
+
+ Implicit NONE
+
+ Integer,              Intent(IN) :: ncid, varid
+ Integer,              Intent(IN) :: ndex(*)
+ Integer(KIND=NFINT2), Intent(IN) :: ival
+
+ Integer                          :: status
+
+ Integer(KIND=C_INT)            :: cncid, cvarid, cndims, cstat1, cstatus
+ Integer(KIND=C_SIZE_T), TARGET :: cndex(NC_MAX_DIMS)
+ Type(C_PTR)                    :: cndexptr
+ Integer(KIND=CINT2)            :: cival
+ Integer                        :: ndims
+
+ If (C_SHORT < 0) Then ! short not supported by processor
+   status = NC_EBADTYPE
+   RETURN
+ EndIf
+
+ cncid  = ncid
+ cvarid = varid - 1 ! Subtract one to get C varid
+ cival  = ival
+ cndex  = 0
+
+ cstat1 = nc_inq_varndims(cncid, cvarid, cndims)
+
+ cndexptr = C_NULL_PTR
+ ndims    = cndims
+
+ If (cstat1 == NC_NOERR) Then
+   If (ndims > 0) Then ! reverse array order and subtract 1 to get C index 
+     cndex(1:ndims) = ndex(ndims:1:-1)-1
+   EndIf
+   cndexptr = C_LOC(cndex)
+ EndIf
+
+#if NF_INT2_IS_C_SHORT
+ cstatus = nc_put_var1_short(cncid, cvarid, cndexptr, cival)
+#elif NF_INT2_IS_C_INT
+ cstatus = nc_put_var1_int(cncid, cvarid, cndexptr, cival)
+#elif NF_INT2_IS_C_LONG
+ cstatus = nc_put_var1_long(cncid, cvarid, cndexptr, cival)
+#endif
+
+ status = cstatus
+
+ End Function nf_put_var1_int2
+!--------------------------------- nf_put_var1_int -------------------------
+ Function nf_put_var1_int(ncid, varid, ndex, ival) RESULT(status)
+
+! Write out a default integer variable to location vector ndex to dataset
+
+ USE netcdf_nc_interfaces
+
+ Implicit NONE
+
+ Integer,        Intent(IN) :: ncid, varid
+ Integer,        Intent(IN) :: ndex(*)
+ Integer(NFINT), Intent(IN) :: ival
+
+ Integer                    :: status
+
+ Integer(KIND=C_INT)            :: cncid, cvarid, cndims, cstat1, cstatus
+ Integer(KIND=C_SIZE_T), TARGET :: cndex(NC_MAX_DIMS)
+ Type(C_PTR)                    :: cndexptr
+ Integer(KIND=CINT)             :: cival
+ Integer                        :: ndims
+
+ cncid  = ncid
+ cvarid = varid - 1 ! Subtract one to get C varid
+ cndex  = 0
+ cival  = ival
+
+ cstat1 = nc_inq_varndims(cncid, cvarid, cndims)
+
+ cndexptr = C_NULL_PTR
+ ndims    = cndims
+
+ If (cstat1 == NC_NOERR) Then
+   If (ndims > 0) Then ! reverse array order and subtract 1 to get C index 
+     cndex(1:ndims) = ndex(ndims:1:-1)-1
+   EndIf
+   cndexptr = C_LOC(cndex)
+ EndIf
+
+#if NF_INT_IS_C_INT
+ cstatus = nc_put_var1_int(cncid, cvarid, cndexptr, cival)
+#elif NF_INT_IS_C_LONG
+ cstatus = nc_put_var1_long(cncid, cvarid, cndexptr, cival)
+#endif
+
+ status = cstatus
+
+ End Function nf_put_var1_int
+!--------------------------------- nf_put_var1_real ------------------------
+ Function nf_put_var1_real(ncid, varid, ndex, rval) RESULT(status)
+
+! Write out a 32 bit real variable to location vector ndex in dataset
+
+ USE netcdf_nc_interfaces
+
+ Implicit NONE
+
+ Integer,      Intent(IN) :: ncid, varid
+ Integer,      Intent(IN) :: ndex(*)
+ Real(NFREAL), Intent(IN) :: rval
+
+ Integer                  :: status
+
+ Integer(KIND=C_INT)            :: cncid, cvarid, cndims, cstat1, cstatus
+ Integer(KIND=C_SIZE_T), TARGET :: cndex(NC_MAX_DIMS)
+ Type(C_PTR)                    :: cndexptr
+ Integer                        :: ndims
+
+ cncid  = ncid
+ cvarid = varid - 1 ! Subtract one to get C varid
+ cndex  = 0
+
+ cstat1 = nc_inq_varndims(cncid, cvarid, cndims)
+
+ cndexptr = C_NULL_PTR
+ ndims    = cndims
+
+ If (cstat1 == NC_NOERR) Then
+   If (ndims > 0) Then ! reverse array order and subtract 1 to get C index 
+     cndex(1:ndims) = ndex(ndims:1:-1)-1
+   EndIf
+   cndexptr = C_LOC(cndex)
+ EndIf
+
+#if NF_REAL_IS_C_DOUBLE
+ cstatus = nc_put_var1_double(cncid, cvarid, cndexptr, rval)
+#else
+ cstatus = nc_put_var1_float(cncid, cvarid, cndexptr, rval)
+#endif
+
+ status = cstatus
+
+ End Function nf_put_var1_real
+!--------------------------------- nf_put_var1_double ----------------------
+ Function nf_put_var1_double(ncid, varid, ndex, dval) RESULT(status)
+
+! Write out a 64 bit real variable to location vector ndex in dataset
+
+ USE netcdf_nc_interfaces
+
+ Implicit NONE
+
+ Integer,   Intent(IN) :: ncid, varid
+ Integer,   Intent(IN) :: ndex(*)
+ Real(RK8), Intent(IN) :: dval
+
+ Integer               :: status
+
+ Integer(KIND=C_INT)            :: cncid, cvarid, cndims, cstat1, cstatus
+ Integer(KIND=C_SIZE_T), TARGET :: cndex(NC_MAX_DIMS)
+ Type(C_PTR)                    :: cndexptr
+ Integer                        :: ndims
+
+ cncid  = ncid
+ cvarid = varid - 1 ! Subtract one to get C varid
+ cndex  = 0
+
+ cstat1 = nc_inq_varndims(cncid, cvarid, cndims) ! get varid dimension
+
+ cndexptr = C_NULL_PTR
+ ndims    = cndims
+
+ If (cstat1 == NC_NOERR) Then
+   If (ndims > 0) Then
+     cndex(1:ndims) = ndex(ndims:1:-1)-1
+   EndIf
+   cndexptr = C_LOC(cndex)
+ EndIf
+
+ cstatus = nc_put_var1_double(cncid, cvarid, cndexptr, dval)
+
+ status = cstatus
+
+ End Function nf_put_var1_double
+!--------------------------------- nf_put_var1 ------------------------
+ Function nf_put_var1(ncid, varid, ndex, values) RESULT(status)
+
+! Write out values of any type. We use a C interop character string to
+! hold values. Therefore, an explicit interface to nf_put_var1 should
+! not be defined in the calling program to avoid rigid TKR conflict
+! Just declare it external
+
+ USE netcdf_nc_interfaces
+
+ Implicit NONE
+
+ Integer,                Intent(IN)         :: ncid, varid
+ Integer,                Intent(IN)         :: ndex(*)
+ Character(KIND=C_CHAR), Intent(IN), TARGET :: values(*)
+! Type(C_PTR),            VALUE              :: values
+ Integer                                    :: status
+
+ Integer(KIND=C_INT)            :: cncid, cvarid, cndims, cstat1, cstatus
+ Integer(KIND=C_SIZE_T), TARGET :: cndex(NC_MAX_DIMS)
+ Type(C_PTR)                    :: cndexptr
+ Type(C_PTR)                    :: cvaluesptr ! comment for type(C_PTR) values
+ Integer                        :: ndims
+
+ cncid  = ncid
+ cvarid = varid - 1 ! Subtract one to get C varid
+ cndex  = 0
+ 
+ cstat1 = nc_inq_varndims(cncid, cvarid, cndims)
+
+ cndexptr = C_NULL_PTR
+ ndims    = cndims
+
+ If (cstat1 == NC_NOERR) Then
+   If (ndims > 0) Then ! reverse array order and subtract 1 to get C index 
+     cndex(1:ndims) = ndex(ndims:1:-1)-1
+   EndIf
+   cndexptr = C_LOC(cndex)
+ EndIf
+
+ cvaluesptr = C_LOC(values)
+
+ cstatus = nc_put_var1(cncid, cvarid, cndexptr, cvaluesptr)
+! cstatus = nc_put_var1(cncid, cvarid, cndexptr, values)
+
+ status = cstatus
+
+ End Function nf_put_var1
+!--------------------------------- nf_get_var1_text ------------------------
+ Function nf_get_var1_text(ncid, varid, ndex, chval) RESULT(status)
+
+! Read in a single character variable from location vector ndex in dataset
+
+ USE netcdf_nc_interfaces
+
+ Implicit NONE
+
+ Integer,          Intent(IN)  :: ncid, varid
+ Integer,          Intent(IN)  :: ndex(*)
+ Character(LEN=1), Intent(OUT) :: chval
+
+ Integer                       :: status
+
+ Integer(KIND=C_INT)            :: cncid, cvarid, cndims, cstat1, cstatus
+ Integer(KIND=C_SIZE_T), TARGET :: cndex(NC_MAX_DIMS)
+ Type(C_PTR)                    :: cndexptr
+ Integer                        :: ndims
+
+ cncid  = ncid
+ cvarid = varid - 1 ! Subtract one to get C varid
+ cndex  =  0
+ chval  = ' '
+
+ cstat1 = nc_inq_varndims(cncid, cvarid, cndims)
+
+ cndexptr = C_NULL_PTR
+ ndims    = cndims
+
+ If (cstat1 == NC_NOERR) Then
+   If (ndims > 0) Then ! reverse array order and subtract 1 to get C index 
+     cndex(1:ndims) = ndex(ndims:1:-1) -1
+   EndIf
+   cndexptr = C_LOC(cndex)
+  EndIf
+ 
+ cstatus = nc_get_var1_text(cncid, cvarid, cndexptr, chval)
+
+ status = cstatus
+
+ End Function nf_get_var1_text
+!--------------------------------- nf_get_var1_int1 ------------------------
+ Function nf_get_var1_int1(ncid, varid, ndex, ival) RESULT(status)
+
+! Read in a 8 bit integer variable from location vector ndex in dataset
+
+ USE netcdf_nc_interfaces
+
+ Implicit NONE
+
+ Integer,              Intent(IN)  :: ncid, varid
+ Integer,              Intent(IN)  :: ndex(*)
+ Integer(KIND=NFINT1), Intent(OUT) :: ival
+
+ Integer                           :: status
+
+ Integer(KIND=C_INT)            :: cncid, cvarid, cndims, cstat1, cstatus
+ Integer(KIND=C_SIZE_T), TARGET :: cndex(NC_MAX_DIMS)
+ Type(C_PTR)                    :: cndexptr
+ Integer(KIND=CINT1)            :: cival
+ Integer                        :: ndims
+
+ If (C_SIGNED_CHAR < 0) Then ! schar not supported by processor exit
+   status = NC_EBADTYPE
+   RETURN
+ EndIf
+
+ cncid  = ncid
+ cvarid = varid - 1 ! Subtract one to get C varid
+ cndex  = 0
+
+ cstat1 = nc_inq_varndims(cncid, cvarid, cndims)
+
+ cndexptr = C_NULL_PTR
+ ndims    = cndims
+
+ If (cstat1 == NC_NOERR) Then
+   If (ndims > 0) Then ! reverse array order and subtract 1 to get C index 
+     cndex(1:ndims) = ndex(ndims:1:-1)-1
+   EndIf
+   cndexptr = C_LOC(cndex)
+ EndIf
+
+#if NF_INT1_IS_C_SIGNED_CHAR
+ cstatus = nc_get_var1_schar(cncid, cvarid, cndexptr, cival)
+#elif NF_INT1_IS_C_SHORT
+ cstatus = nc_get_var1_short(cncid, cvarid, cndexptr, cival)
+#elif NF_INT1_IS_C_INT
+ cstatus = nc_get_var1_int(cncid, cvarid, cndexptr, cival)
+#elif NF_INT1_IS_C_LONG
+ cstatus = nc_get_var1_long(cncid, cvarid, cndexptr, cival)
+#endif
+ 
+ ival   = cival
+ status = cstatus
+
+ End Function nf_get_var1_int1
+!--------------------------------- nf_get_var1_int2 ------------------------
+ Function nf_get_var1_int2(ncid, varid, ndex, ival) RESULT(status)
+
+! Read in a 16 bit integer variable from location vector ndex in dataset
+
+ USE netcdf_nc_interfaces
+
+ Implicit NONE
+
+ Integer,              Intent(IN)  :: ncid, varid
+ Integer,              Intent(IN)  :: ndex(*)
+ Integer(KIND=NFINT2), Intent(OUT) :: ival
+
+ Integer                           :: status
+
+ Integer(KIND=C_INT)            :: cncid, cvarid, cndims, cstat1, cstatus
+ Integer(KIND=C_SIZE_T), TARGET :: cndex(NC_MAX_DIMS)
+ Type(C_PTR)                    :: cndexptr
+ Integer(KIND=CINT2)            :: cival
+ Integer                        :: ndims
+
+ If (C_SHORT < 0) Then ! short not supported by processor
+   status = NC_EBADTYPE
+   RETURN
+ EndIf
+
+ cncid  = ncid
+ cvarid = varid - 1 ! Subtract one to get C varid
+ cndex  = 0
+
+ cstat1 = nc_inq_varndims(cncid, cvarid, cndims)
+
+ cndexptr = C_NULL_PTR
+ ndims    = cndims
+
+ If (cstat1 == NC_NOERR) Then
+   If (ndims > 0) Then ! reverse array order and subtract 1 to get C index 
+     cndex(1:ndims) = ndex(ndims:1:-1)-1
+   EndIf
+   cndexptr = C_LOC(cndex)
+ EndIf
+
+#if NF_INT2_IS_C_SHORT
+ cstatus = nc_get_var1_short(cncid, cvarid, cndexptr, cival)
+#elif NF_INT2_IS_C_INT
+ cstatus = nc_get_var1_int(cncid, cvarid, cndexptr, cival)
+#elif NF_INT2_IS_C_LONG
+ cstatus = nc_get_var1_long(cncid, cvarid, cndexptr, cival)
+#endif
+ 
+ ival   = cival
+ status = cstatus
+
+ End Function nf_get_var1_int2
+!--------------------------------- nf_get_var1_int -------------------------
+ Function nf_get_var1_int(ncid, varid, ndex, ival) RESULT(status)
+
+! Read in 32 bit integer variable from location vector ndex in dataset
+
+ USE netcdf_nc_interfaces
+
+ Implicit NONE
+
+ Integer, Intent(IN)  :: ncid, varid
+ Integer, Intent(IN)  :: ndex(*)
+ Integer, Intent(OUT) :: ival
+
+ Integer              :: status
+
+ Integer(KIND=C_INT)            :: cncid, cvarid, cndims, cstat1, cstatus
+ Integer(KIND=C_SIZE_T), TARGET :: cndex(NC_MAX_DIMS)
+ Type(C_PTR)                    :: cndexptr
+ Integer(KIND=CINT)             :: cival
+ Integer                        :: ndims
+
+ cncid  = ncid
+ cvarid = varid - 1 ! Subtract one to get C varid
+ cndex  = 0
+
+ cstat1 = nc_inq_varndims(cncid, cvarid, cndims)
+
+ cndexptr = C_NULL_PTR
+ ndims    = cndims
+
+ If (cstat1 == NC_NOERR) Then
+   If (ndims > 0) Then ! reverse array order and subtract 1 to get C index 
+     cndex(1:ndims) = ndex(ndims:1:-1)-1
+   EndIf
+   cndexptr = C_LOC(cndex)
+ EndIf
+
+#if NF_INT_IS_C_INT
+ cstatus = nc_get_var1_int(cncid, cvarid, cndexptr, cival)
+#elif NF_INT_IS_C_LONG
+ cstatus = nc_get_var1_long(cncid, cvarid, cndexptr, cival)
+#endif
+
+ ival   = cival
+ status = cstatus
+
+ End Function nf_get_var1_int
+!--------------------------------- nf_get_var1_real ------------------------
+ Function nf_get_var1_real(ncid, varid, ndex, rval) RESULT(status)
+
+! Read in a 32 bit real variable to location vector ndex in dataset
+
+ USE netcdf_nc_interfaces
+
+ Implicit NONE
+
+ Integer,      Intent(IN)  :: ncid, varid
+ Integer,      Intent(IN)  :: ndex(*)
+ Real(NFREAL), Intent(OUT) :: rval
+
+ Integer                   :: status
+
+ Integer(KIND=C_INT)            :: cncid, cvarid, cndims, cstat1, cstatus
+ Integer(KIND=C_SIZE_T), TARGET :: cndex(NC_MAX_DIMS)
+ Type(C_PTR)                    :: cndexptr
+ Integer                        :: ndims
+
+ cncid  = ncid
+ cvarid = varid - 1 ! Subtract one to get C varid
+ cndex  = 0
+
+ cstat1 = nc_inq_varndims(cncid, cvarid, cndims)
+
+ cndexptr = C_NULL_PTR
+ ndims    = cndims
+
+ If (cstat1 == NC_NOERR) Then
+   If (ndims > 0) Then ! reverse array order and subtract 1 to get C index 
+     cndex(1:ndims) = ndex(ndims:1:-1)-1
+   EndIf
+   cndexptr = C_LOC(cndex)
+ EndIf
+
+#if NF_REAL_IS_C_DOUBLE
+ cstatus = nc_get_var1_double(cncid, cvarid, cndexptr, rval)
+#else
+ cstatus = nc_get_var1_float(cncid, cvarid, cndexptr, rval)
+#endif
+
+ status = cstatus
+
+ End Function nf_get_var1_real
+!--------------------------------- nf_get_var1_double ----------------------
+ Function nf_get_var1_double(ncid, varid, ndex, dval) RESULT(status)
+
+! Read in a 64 bit real variable to location vector ndex in dataset
+
+ USE netcdf_nc_interfaces
+
+ Implicit NONE
+
+ Integer,   Intent(IN)  :: ncid, varid
+ Integer,   Intent(IN)  :: ndex(*)
+ Real(RK8), Intent(OUT) :: dval
+
+ Integer                :: status
+
+ Integer(KIND=C_INT)            :: cncid, cvarid, cndims, cstat1, cstatus
+ Integer(KIND=C_SIZE_T), TARGET :: cndex(NC_MAX_DIMS)
+ Type(C_PTR)                    :: cndexptr
+ Integer                        :: ndims
+
+ cncid  = ncid
+ cvarid = varid - 1 ! Subtract one to get C varid
+ cndex  = 0
+
+ cstat1 = nc_inq_varndims(cncid, cvarid, cndims) ! get varid dimension
+
+ cndexptr = C_NULL_PTR
+ ndims    = cndims
+
+ If (cstat1 == NC_NOERR) Then
+   If (ndims > 0) Then ! reverse array order and subtract 1 to get C index 
+     cndex(1:ndims) = ndex(ndims:1:-1)-1
+   EndIf
+   cndexptr = C_LOC(cndex)
+ EndIf
+
+ cstatus = nc_get_var1_double(cncid, cvarid, cndexptr, dval)
+
+ status = cstatus
+
+ End Function nf_get_var1_double
+!--------------------------------- nf_get_var1 -------------------------------
+ Function nf_get_var1(ncid, varid, ndex, values) RESULT(status)
+
+! Read in values of any type. We use a C interop character string to
+! hold values. Therefore, an explicit interface to nf_get_var1 should
+! not be defined in the calling program to avoid rigid TKR conflict
+! Just declare it external
+
+ USE netcdf_nc_interfaces
+
+ Implicit NONE
+
+ Integer,                Intent(IN)          :: ncid, varid
+ Integer,                Intent(IN)          :: ndex(*)
+ Character(KIND=C_CHAR), Intent(OUT), TARGET :: values(*)
+! Type(C_PTR),            VALUE               :: values
+
+ Integer                                     :: status
+
+ Integer(KIND=C_INT)            :: cncid, cvarid, cndims, cstat1, cstatus
+ Integer(KIND=C_SIZE_T), TARGET :: cndex(NC_MAX_DIMS)
+ Type(C_PTR)                    :: cndexptr
+ Type(C_PTR)                    :: cvaluesptr
+ Integer                        :: ndims
+
+ cncid  = ncid
+ cvarid = varid - 1 ! Subtract one to get C varid
+ cndex  = 0
+
+ cstat1 = nc_inq_varndims(cncid, cvarid, cndims) ! get varid dimension
+
+ cndexptr = C_NULL_PTR
+ ndims    = cndims
+
+ If (cstat1 == NC_NOERR) Then
+   If (ndims > 0) Then ! reverse array order and subtract 1 to get C index 
+     cndex(1:ndims) = ndex(ndims:1:-1)-1
+   EndIf
+   cndexptr = C_LOC(cndex)
+ EndIf
+
+ cstatus = nc_get_var1(cncid, cvarid, cndexptr, values)
+
+ status = cstatus
+
+ End Function nf_get_var1
diff --git a/fortran/nf_varaio.F90 b/fortran/nf_varaio.F90
new file mode 100755
index 0000000..19ef6ed
--- /dev/null
+++ b/fortran/nf_varaio.F90
@@ -0,0 +1,827 @@
+#include "nfconfig.inc"
+!--- Array put/get routines for different types for given start and count ----
+
+! Replacement for fort-varaio.c
+
+! Written by: Richard Weed, Ph.D.
+!             Center for Advanced Vehicular Systems 
+!             Mississippi State University
+!             rweed at cavs.msstate.edu
+
+
+! License (and other Lawyer Language)
+ 
+! This software is released under the Apache 2.0 Open Source License. The
+! full text of the License can be viewed at :
+!
+!   http:www.apache.org/licenses/LICENSE-2.0.html
+!
+! The author grants to the University Corporation for Atmospheric Research
+! (UCAR), Boulder, CO, USA the right to revise and extend the software
+! without restriction. However, the author retains all copyrights and
+! intellectual property rights explicitly stated in or implied by the
+! Apache license
+
+! Version 1.: Sept. 2005 - Initial Cray X1 version
+! Version 2.: May   2006 - Updated to support g95
+!                          Updated to pass start and counts as C_PTR
+!                          variables
+! Version 3.: April 2009 - Updated for netCDF 4.0.1
+! Version 4.: April 2010 - Updated for netCDF 4.1.1
+!                          Added preprocessor test for int and real types
+         
+!--------------------------------- nf_put_vara_text ----------------------
+ Function nf_put_vara_text(ncid, varid, start, counts, text) RESULT(status)
+
+! Write out a character string to dataset for given start and count vectors
+
+ USE netcdf_nc_interfaces
+
+ Implicit NONE
+
+ Integer,          Intent(IN) :: ncid, varid
+ Integer,          Intent(IN) :: start(*), counts(*)
+ Character(LEN=*), Intent(IN) :: text
+
+ Integer                      :: status
+
+ Integer(KIND=C_INT)            :: cncid, cvarid, cndims, cstat1, cstatus
+ Integer(KIND=C_SIZE_T), TARGET :: cstart(NC_MAX_DIMS), ccounts(NC_MAX_DIMS)
+ Type(C_PTR)                    :: cstartptr, ccountsptr
+ Integer                        :: ndims
+
+ cncid   = ncid
+ cvarid  = varid - 1 ! Subtract 1 to get C varid
+ cstart  = 0
+ ccounts = 0
+
+ cstat1 = nc_inq_varndims(cncid, cvarid, cndims)
+
+ cstartptr  = C_NULL_PTR
+ ccountsptr = C_NULL_PTR
+ ndims      = cndims
+
+ If (cstat1 == NC_NOERR) Then
+   If (ndims > 0) Then ! flip array order for C and subtract 1 from start
+     cstart(1:ndims)  = start(ndims:1:-1)-1
+     ccounts(1:ndims) = counts(ndims:1:-1)
+   EndIf
+   cstartptr  = C_LOC(cstart)
+   ccountsptr = C_LOC(ccounts)
+ EndIf
+
+ cstatus = nc_put_vara_text(cncid, cvarid, cstartptr, ccountsptr, text)
+
+ status = cstatus
+
+ End Function nf_put_vara_text
+!--------------------------------- nf_put_vara_text_a ----------------------
+ Function nf_put_vara_text_a(ncid, varid, start, counts, text) RESULT(status)
+
+! Write out an array of characters to dataset for given start and count vectors
+
+ USE netcdf_nc_interfaces
+
+ Implicit NONE
+
+ Integer,          Intent(IN) :: ncid, varid
+ Integer,          Intent(IN) :: start(*), counts(*)
+ Character(LEN=1), Intent(IN) :: text(*)
+
+ Integer                      :: status
+
+ Integer(KIND=C_INT)            :: cncid, cvarid, cndims, cstat1, cstatus
+ Integer(KIND=C_SIZE_T), TARGET :: cstart(NC_MAX_DIMS), ccounts(NC_MAX_DIMS)
+ Type(C_PTR)                    :: cstartptr, ccountsptr
+ Integer                        :: ndims
+
+ cncid   = ncid
+ cvarid  = varid - 1 ! Subtract 1 to get C varid
+ cstart  = 0
+ ccounts = 0
+
+ cstat1 = nc_inq_varndims(cncid, cvarid, cndims)
+
+ cstartptr  = C_NULL_PTR
+ ccountsptr = C_NULL_PTR
+ ndims      = cndims
+
+ If (cstat1 == NC_NOERR) Then
+   If (ndims > 0) Then ! flip array order for C and subtract 1 from start
+     cstart(1:ndims)  = start(ndims:1:-1)-1
+     ccounts(1:ndims) = counts(ndims:1:-1)
+   EndIf
+   cstartptr  = C_LOC(cstart)
+   ccountsptr = C_LOC(ccounts)
+ EndIf
+
+ cstatus = nc_put_vara_text(cncid, cvarid, cstartptr, ccountsptr, text)
+
+ status = cstatus
+
+ End Function nf_put_vara_text_a
+!--------------------------------- nf_put_vara_int1 ------------------------
+ Function nf_put_vara_int1(ncid, varid, start, counts, i1vals) RESULT(status)
+
+! Write out 8 bit integer array to dataset for given start and count vectors
+
+ USE netcdf_nc_interfaces
+
+ Implicit NONE
+
+ Integer,              Intent(IN) :: ncid, varid
+ Integer,              Intent(IN) :: start(*), counts(*)
+ Integer(KIND=NFINT1), Intent(IN) :: i1vals(*)
+
+ Integer                          :: status
+
+ Integer(KIND=C_INT)            :: cncid, cvarid, cndims, cstat1, cstatus
+ Integer(KIND=C_SIZE_T), TARGET :: cstart(NC_MAX_DIMS), ccounts(NC_MAX_DIMS)
+ Type(C_PTR)                    :: cstartptr, ccountsptr
+ Integer                        :: ndims
+
+ If (C_SIGNED_CHAR < 0) Then ! schar not supported by processor
+   status = NC_EBADTYPE
+   RETURN
+ EndIf
+
+ cncid   = ncid
+ cvarid  = varid - 1 ! Subtract 1 to get C varid
+ cstart  = 0
+ ccounts = 0
+
+ cstat1 = nc_inq_varndims(cncid, cvarid, cndims)
+
+ cstartptr  = C_NULL_PTR
+ ccountsptr = C_NULL_PTR
+ ndims      = cndims
+
+ If (cstat1 == NC_NOERR) Then
+   If (ndims > 0) Then ! flip array order for C and subtract 1 from start
+     cstart(1:ndims)  = start(ndims:1:-1)-1
+     ccounts(1:ndims) = counts(ndims:1:-1)
+   EndIf
+   cstartptr  = C_LOC(cstart)
+   ccountsptr = C_LOC(ccounts)
+ EndIf
+
+#if NF_INT1_IS_C_SIGNED_CHAR
+ cstatus = nc_put_vara_schar(cncid, cvarid, cstartptr, ccountsptr, i1vals)
+#elif NF_INT1_IS_C_SHORT
+ cstatus = nc_put_vara_short(cncid, cvarid, cstartptr, ccountsptr, i1vals)
+#elif NF_INT1_IS_C_INT
+ cstatus = nc_put_vara_int(cncid, cvarid, cstartptr, ccountsptr, i1vals)
+#elif NF_INT1_IS_C_LONG
+ cstatus = nc_put_vara_long(cncid, cvarid, cstartptr, ccountsptr, i1vals)
+#endif
+ 
+ status = cstatus
+
+ End Function nf_put_vara_int1
+!--------------------------------- nf_put_vara_int2 ------------------------
+ Function nf_put_vara_int2(ncid, varid, start, counts, i2vals) RESULT(status)
+
+! Write out 16 bit integer array to dataset for given start and count vectors
+
+ USE netcdf_nc_interfaces
+
+ Implicit NONE
+
+ Integer,              Intent(IN) :: ncid, varid
+ Integer,              Intent(IN) :: start(*), counts(*)
+ Integer(KIND=NFINT2), Intent(IN) :: i2vals(*)
+
+ Integer                          :: status
+
+ Integer(KIND=C_INT)            :: cncid, cvarid, cndims, cstat1, cstatus
+ Integer(KIND=C_SIZE_T), TARGET :: cstart(NC_MAX_DIMS), ccounts(NC_MAX_DIMS)
+ Type(C_PTR)                    :: cstartptr, ccountsptr
+ Integer                        :: ndims
+
+ If (C_SHORT < 0) Then ! short not supported by processor
+   status = NC_EBADTYPE
+   RETURN
+ EndIf
+
+ cncid   = ncid
+ cvarid  = varid - 1 ! Subtract 1 to get C varid
+ cstart  = 0
+ ccounts = 0
+
+ cstat1 = nc_inq_varndims(cncid, cvarid, cndims)
+
+ cstartptr  = C_NULL_PTR
+ ccountsptr = C_NULL_PTR
+ ndims      = cndims
+
+ If (cstat1 == NC_NOERR) Then
+   If (ndims > 0) Then ! flip array order for C and subtract 1 from start
+     cstart(1:ndims)  = start(ndims:1:-1)-1
+     ccounts(1:ndims) = counts(ndims:1:-1)
+   EndIf
+   cstartptr  = C_LOC(cstart)
+   ccountsptr = C_LOC(ccounts)
+ EndIf
+
+#if NF_INT2_IS_C_SHORT
+ cstatus = nc_put_vara_short(cncid, cvarid, cstartptr, ccountsptr, i2vals)
+#elif NF_INT2_IS_C_INT
+ cstatus = nc_put_vara_int(cncid, cvarid, cstartptr, ccountsptr, i2vals)
+#elif NF_INT2_IS_C_LONG
+ cstatus = nc_put_vara_long(cncid, cvarid, cstartptr, ccountsptr, i2vals)
+#endif
+
+ status = cstatus
+
+ End Function nf_put_vara_int2
+!--------------------------------- nf_put_vara_int -------------------------
+ Function nf_put_vara_int(ncid, varid, start, counts, ivals) RESULT(status)
+
+! Write out default integer array to dataset for given start and count vectors
+
+ USE netcdf_nc_interfaces
+
+ Implicit NONE
+
+ Integer,        Intent(IN) :: ncid, varid
+ Integer,        Intent(IN) :: start(*), counts(*)
+ Integer(NFINT), Intent(IN) :: ivals(*)
+
+ Integer                    :: status
+
+ Integer(KIND=C_INT)            :: cncid, cvarid, cndims, cstat1, cstatus
+ Integer(KIND=C_SIZE_T), TARGET :: cstart(NC_MAX_DIMS), ccounts(NC_MAX_DIMS)
+ Type(C_PTR)                    :: cstartptr, ccountsptr
+ Integer                        :: ndims
+
+ cncid   = ncid
+ cvarid  = varid - 1 ! Subtract 1 to get C varid
+ cstart  = 0
+ ccounts = 0
+
+ cstat1 = nc_inq_varndims(cncid, cvarid, cndims)
+
+ cstartptr  = C_NULL_PTR
+ ccountsptr = C_NULL_PTR
+ ndims      = cndims
+
+ If (cstat1 == NC_NOERR) Then
+   If (ndims > 0) Then ! flip array order for C and subtract 1 from start
+     cstart(1:ndims)  = start(ndims:1:-1)-1
+     ccounts(1:ndims) = counts(ndims:1:-1)
+   EndIf
+   cstartptr  = C_LOC(cstart)
+   ccountsptr = C_LOC(ccounts)
+ EndIf
+
+#if NF_INT_IS_C_INT
+ cstatus = nc_put_vara_int(cncid, cvarid, cstartptr, ccountsptr, ivals)
+#elif NF_INT_IS_C_LONG
+ cstatus = nc_put_vara_long(cncid, cvarid, cstartptr, ccountsptr, ivals)
+#endif
+
+ status = cstatus
+
+ End Function nf_put_vara_int
+!--------------------------------- nf_put_vara_real ------------------------
+ Function nf_put_vara_real(ncid, varid, start, counts, rvals) RESULT(status)
+
+! Write out real(RK4) array to dataset for given start and count vectors
+
+ USE netcdf_nc_interfaces
+
+ Implicit NONE
+
+ Integer,      Intent(IN) :: ncid, varid
+ Integer,      Intent(IN) :: start(*), counts(*)
+ Real(NFREAL), Intent(IN) :: rvals(*)
+
+ Integer                  :: status
+
+ Integer(KIND=C_INT)            :: cncid, cvarid, cndims, cstat1, cstatus
+ Integer(KIND=C_SIZE_T), TARGET :: cstart(NC_MAX_DIMS), ccounts(NC_MAX_DIMS)
+ Type(C_PTR)                    :: cstartptr, ccountsptr
+ Integer                        :: ndims
+
+ cncid   = ncid
+ cvarid  = varid - 1 ! Subtract 1 to get C varid
+ cstart  = 0
+ ccounts = 0
+
+ cstat1 = nc_inq_varndims(cncid, cvarid, cndims)
+
+ cstartptr  = C_NULL_PTR
+ ccountsptr = C_NULL_PTR
+ ndims      = cndims
+
+ If (cstat1 == NC_NOERR) Then
+   If (ndims > 0) Then ! flip array order for C and subtract 1 from start
+     cstart(1:ndims)  = start(ndims:1:-1)-1
+     ccounts(1:ndims) = counts(ndims:1:-1)
+   EndIf
+   cstartptr  = C_LOC(cstart)
+   ccountsptr = C_LOC(ccounts)
+ EndIf
+
+#if NF_REAL_IS_C_DOUBLE
+ cstatus = nc_put_vara_double(cncid, cvarid, cstartptr, ccountsptr, rvals)
+#else
+ cstatus = nc_put_vara_float(cncid, cvarid, cstartptr, ccountsptr, rvals)
+#endif
+
+ status = cstatus
+
+ End Function nf_put_vara_real
+!--------------------------------- nf_put_vara_double ----------------------
+ Function nf_put_vara_double(ncid, varid, start, counts, dvals) &
+                                RESULT(status)
+
+! Write out real(RK8) variable to dataset for given start and count vectors
+
+ USE netcdf_nc_interfaces
+
+ Implicit NONE
+
+ Integer,   Intent(IN) :: ncid, varid
+ Integer,   Intent(IN) :: start(*), counts(*)
+ Real(RK8), Intent(IN) :: dvals(*)
+
+ Integer               :: status
+
+ Integer(KIND=C_INT)            :: cncid, cvarid, cndims, cstat1, cstatus
+ Integer(KIND=C_SIZE_T), TARGET :: cstart(NC_MAX_DIMS), ccounts(NC_MAX_DIMS)
+ Type(C_PTR)                    :: cstartptr, ccountsptr
+ Integer                        :: ndims
+
+ cncid   = ncid
+ cvarid  = varid - 1 ! Subtract 1 to get C varid
+ cstart  = 0
+ ccounts = 0
+
+ cstat1 = nc_inq_varndims(cncid, cvarid, cndims) ! get varid dimension
+
+ cstartptr  = C_NULL_PTR
+ ccountsptr = C_NULL_PTR
+ ndims      = cndims
+
+ If (cstat1 == NC_NOERR) Then
+   If (ndims > 0) Then ! flip array order for C and subtract 1 from start
+     cstart(1:ndims)  = start(ndims:1:-1)-1
+     ccounts(1:ndims) = counts(ndims:1:-1)
+   EndIf
+   cstartptr  = C_LOC(cstart)
+   ccountsptr = C_LOC(ccounts)
+ EndIf
+
+ cstatus = nc_put_vara_double(cncid, cvarid, cstartptr, ccountsptr, dvals)
+
+ status = cstatus
+
+ End Function nf_put_vara_double
+!--------------------------------- nf_put_vara ------------------------------
+ Function nf_put_vara(ncid, varid, start, counts, values) RESULT(status)
+
+! Write out an array of any type. We use a C interop character string to
+! pass values. Therefore, an explicit interface to nf_put_vara should not
+! be used in the calling routine. Just use external. 
+
+ USE netcdf_nc_interfaces
+
+ Implicit NONE
+
+ Integer,                Intent(IN)         :: ncid, varid
+ Integer,                Intent(IN)         :: start(*), counts(*)
+ Character(KIND=C_CHAR), Intent(IN), TARGET :: values(*)
+! Type(C_PTR),            VALUE              :: values
+ Integer                                    :: status
+
+ Integer(KIND=C_INT)            :: cncid, cvarid, cndims, cstat1, cstatus
+ Integer(KIND=C_SIZE_T), TARGET :: cstart(NC_MAX_DIMS), ccounts(NC_MAX_DIMS)
+ Type(C_PTR)                    :: cstartptr, ccountsptr, cvaluesptr
+! Type(C_PTR)                    :: cstartptr, ccountsptr
+ Integer                        :: ndims
+
+ cncid   = ncid
+ cvarid  = varid - 1 ! Subtract 1 to get C varid
+ cstart  = 0
+ ccounts = 0
+
+ cstat1 = nc_inq_varndims(cncid, cvarid, cndims)
+
+ cstartptr  = C_NULL_PTR
+ ccountsptr = C_NULL_PTR
+ ndims      = cndims
+
+ If (cstat1 == NC_NOERR) Then
+   If (ndims > 0) Then ! flip array order for C and subtract 1 from start
+     cstart(1:ndims)  = start(ndims:1:-1)-1
+     ccounts(1:ndims) = counts(ndims:1:-1)
+   EndIf
+   cstartptr  = C_LOC(cstart)
+   ccountsptr = C_LOC(ccounts)
+ EndIf
+
+ cvaluesptr = C_LOC(values)
+
+ cstatus = nc_put_vara(cncid, cvarid, cstartptr, ccountsptr, cvaluesptr)
+! cstatus = nc_put_vara(cncid, cvarid, cstartptr, ccountsptr, values)
+
+ status = cstatus
+
+ End Function nf_put_vara
+!--------------------------------- nf_get_vara_text ----------------------
+ Function nf_get_vara_text(ncid, varid, start, counts, text) RESULT(status)
+
+! Read in a character string from dataset for given start and count vectors 
+
+ USE netcdf_nc_interfaces
+
+ Implicit NONE
+
+ Integer,          Intent(IN)  :: ncid, varid
+ Integer,          Intent(IN)  :: start(*), counts(*)
+ Character(LEN=*), Intent(OUT) :: text
+
+ Integer                       :: status
+
+ Integer(KIND=C_INT)            :: cncid, cvarid, cndims, cstat1, cstatus
+ Integer(KIND=C_SIZE_T), TARGET :: cstart(NC_MAX_DIMS), ccounts(NC_MAX_DIMS)
+ Type(C_PTR)                    :: cstartptr, ccountsptr
+ Integer                        :: ndims
+
+ cncid   = ncid
+ cvarid  = varid - 1 ! Subtract 1 to get C varid
+ cstart  = 0
+ ccounts = 0
+ text    = REPEAT(" ", LEN(text))
+
+ cstat1 = nc_inq_varndims(cncid, cvarid, cndims)
+
+ cstartptr  = C_NULL_PTR
+ ccountsptr = C_NULL_PTR
+ ndims      = cndims
+
+ If (cstat1 == NC_NOERR) Then
+   If (ndims > 0) Then ! flip array order for C and subtract 1 from start
+     cstart(1:ndims)  = start(ndims:1:-1)-1
+     ccounts(1:ndims) = counts(ndims:1:-1)
+   EndIf
+   cstartptr  = C_LOC(cstart)
+   ccountsptr = C_LOC(ccounts)
+ EndIf
+
+ cstatus = nc_get_vara_text(cncid, cvarid, cstartptr, ccountsptr, text)
+
+ status = cstatus
+
+ End Function nf_get_vara_text
+!--------------------------------- nf_get_vara_text_a ----------------------
+ Function nf_get_vara_text_a(ncid, varid, start, counts, text) RESULT(status)
+
+! Read in an array of characters for given start and count vectors 
+
+ USE netcdf_nc_interfaces
+
+ Implicit NONE
+
+ Integer,          Intent(IN)  :: ncid, varid
+ Integer,          Intent(IN)  :: start(*), counts(*)
+ Character(LEN=1), Intent(OUT) :: text(*)
+
+ Integer                       :: status
+
+ Integer(KIND=C_INT)            :: cncid, cvarid, cndims, cstat1, cstatus
+ Integer(KIND=C_SIZE_T), TARGET :: cstart(NC_MAX_DIMS), ccounts(NC_MAX_DIMS)
+ Type(C_PTR)                    :: cstartptr, ccountsptr
+ Integer                        :: ndims
+
+ cncid   = ncid
+ cvarid  = varid - 1 ! Subtract 1 to get C varid
+ cstart  = 0
+ ccounts = 0
+
+ cstat1 = nc_inq_varndims(cncid, cvarid, cndims)
+
+ cstartptr  = C_NULL_PTR
+ ccountsptr = C_NULL_PTR
+ ndims      = cndims
+
+ If (cstat1 == NC_NOERR) Then
+   If (ndims > 0) Then ! flip array order for C and subtract 1 from start
+     cstart(1:ndims)  = start(ndims:1:-1)-1
+     ccounts(1:ndims) = counts(ndims:1:-1)
+   EndIf
+   cstartptr  = C_LOC(cstart)
+   ccountsptr = C_LOC(ccounts)
+ EndIf
+
+ cstatus = nc_get_vara_text(cncid, cvarid, cstartptr, ccountsptr, text)
+
+ status = cstatus
+
+ End Function nf_get_vara_text_a
+!--------------------------------- nf_get_vara_int1 ------------------------
+ Function nf_get_vara_int1(ncid, varid, start, counts, i1vals) RESULT(status)
+
+! Read in 8 bit integer array from dataset for given start and count vectors 
+
+ USE netcdf_nc_interfaces
+
+ Implicit NONE
+
+ Integer,              Intent(IN)  :: ncid, varid
+ Integer,              Intent(IN)  :: start(*), counts(*)
+ Integer(KIND=NFINT1), Intent(OUT) :: i1vals(*)
+
+ Integer                           :: status
+
+ Integer(KIND=C_INT)            :: cncid, cvarid, cndims, cstat1, cstatus
+ Integer(KIND=C_SIZE_T), TARGET :: cstart(NC_MAX_DIMS), ccounts(NC_MAX_DIMS)
+ Type(C_PTR)                    :: cstartptr, ccountsptr
+ Integer                        :: ndims
+
+ If (C_SIGNED_CHAR < 0) Then ! schar not supported by processor
+   status = NC_EBADTYPE
+   RETURN
+ EndIf
+
+ cncid   = ncid
+ cvarid  = varid - 1 ! Subtract 1 to get C varid
+ cstart  = 0
+ ccounts = 0
+
+ cstat1 = nc_inq_varndims(cncid, cvarid, cndims)
+
+ cstartptr  = C_NULL_PTR
+ ccountsptr = C_NULL_PTR
+ ndims      = cndims
+
+ If (cstat1 == NC_NOERR) Then
+   If (ndims > 0) Then ! flip array order for C and subtract 1 from start
+     cstart(1:ndims)  = start(ndims:1:-1)-1
+     ccounts(1:ndims) = counts(ndims:1:-1)
+   EndIf
+   cstartptr  = C_LOC(cstart)
+   ccountsptr = C_LOC(ccounts)
+ EndIf
+
+#if NF_INT1_IS_C_SIGNED_CHAR
+ cstatus = nc_get_vara_schar(cncid, cvarid, cstartptr, ccountsptr, i1vals)
+#elif NF_INT1_IS_C_SHORT
+ cstatus = nc_get_vara_short(cncid, cvarid, cstartptr, ccountsptr, i1vals)
+#elif NF_INT1_IS_C_INT
+ cstatus = nc_get_vara_int(cncid, cvarid, cstartptr, ccountsptr, i1vals)
+#elif NF_INT1_IS_C_LONG
+ cstatus = nc_get_vara_long(cncid, cvarid, cstartptr, ccountsptr, i1vals)
+#endif
+
+ status = cstatus
+
+ End Function nf_get_vara_int1
+!--------------------------------- nf_get_vara_int2 ------------------------
+ Function nf_get_vara_int2(ncid, varid, start, counts, i2vals) RESULT(status)
+
+! Read in 16 bit integer array from dataset for given start and count vectors
+
+ USE netcdf_nc_interfaces
+
+ Implicit NONE
+
+ Integer,              Intent(IN)  :: ncid, varid
+ Integer,              Intent(IN)  :: start(*), counts(*)
+ Integer(KIND=NFINT2), Intent(OUT) :: i2vals(*)
+
+ Integer                           :: status
+
+ Integer(KIND=C_INT)            :: cncid, cvarid, cndims, cstat1, cstatus
+ Integer(KIND=C_SIZE_T), TARGET :: cstart(NC_MAX_DIMS), ccounts(NC_MAX_DIMS)
+ Type(C_PTR)                    :: cstartptr, ccountsptr
+ Integer                        :: ndims
+
+ If (C_SHORT < 0) Then ! short not supported by processor
+   status = NC_EBADTYPE
+   RETURN
+ EndIf
+
+ cncid   = ncid
+ cvarid  = varid - 1 ! Subtract 1 to get C varid
+ cstart  = 0
+ ccounts = 0
+
+ cstat1 = nc_inq_varndims(cncid, cvarid, cndims)
+
+ cstartptr  = C_NULL_PTR
+ ccountsptr = C_NULL_PTR
+ ndims      = cndims
+
+ If (cstat1 == NC_NOERR) Then
+   If (ndims > 0) Then ! flip array order for C and subtract 1 from start
+     cstart(1:ndims)  = start(ndims:1:-1)-1
+     ccounts(1:ndims) = counts(ndims:1:-1)
+   EndIf
+   cstartptr  = C_LOC(cstart)
+   ccountsptr = C_LOC(ccounts)
+ EndIf
+
+#if NF_INT2_IS_C_SHORT
+ cstatus = nc_get_vara_short(cncid, cvarid, cstartptr, ccountsptr, i2vals)
+#elif NF_INT2_IS_C_INT
+ cstatus = nc_get_vara_int(cncid, cvarid, cstartptr, ccountsptr, i2vals)
+#elif NF_INT2_IS_C_LONG
+ cstatus = nc_get_vara_long(cncid, cvarid, cstartptr, ccountsptr, i2vals)
+#endif
+
+ status = cstatus
+
+ End Function nf_get_vara_int2
+!--------------------------------- nf_get_vara_int -------------------------
+ Function nf_get_vara_int(ncid, varid, start, counts, ivals) RESULT(status)
+
+! Read in default integer array from dataset for given start and count vectors 
+
+ USE netcdf_nc_interfaces
+
+ Implicit NONE
+
+ Integer,        Intent(IN)  :: ncid, varid
+ Integer,        Intent(IN)  :: start(*), counts(*)
+ Integer(NFINT), Intent(OUT) :: ivals(*)
+
+ Integer                     :: status
+
+ Integer(KIND=C_INT)            :: cncid, cvarid, cndims, cstat1, cstatus
+ Integer(KIND=C_SIZE_T), TARGET :: cstart(NC_MAX_DIMS), ccounts(NC_MAX_DIMS)
+ Type(C_PTR)                    :: cstartptr, ccountsptr
+ Integer                        :: ndims
+
+ cncid   = ncid
+ cvarid  = varid - 1 ! Subtract 1 to get C varid
+ cstart  = 0
+ ccounts = 0
+
+ cstat1 = nc_inq_varndims(cncid, cvarid, cndims)
+
+ cstartptr  = C_NULL_PTR
+ ccountsptr = C_NULL_PTR
+ ndims      = cndims
+
+ If (cstat1 == NC_NOERR) Then
+   If (ndims > 0) Then ! flip array order for C and subtract 1 from start
+     cstart(1:ndims)  = start(ndims:1:-1)-1
+     ccounts(1:ndims) = counts(ndims:1:-1)
+   EndIf
+   cstartptr  = C_LOC(cstart)
+   ccountsptr = C_LOC(ccounts)
+ EndIf
+
+#if NF_INT_IS_C_INT
+ cstatus = nc_get_vara_int(cncid, cvarid, cstartptr, ccountsptr, ivals)
+#elif NF_INT_IS_C_LONG 
+ cstatus = nc_get_vara_long(cncid, cvarid, cstartptr, ccountsptr, ivals)
+#endif
+
+ status = cstatus
+
+ End Function nf_get_vara_int
+!--------------------------------- nf_get_vara_real ------------------------
+ Function nf_get_vara_real(ncid, varid, start, counts, rvals) RESULT(status)
+
+! Read in real(RK4) array from dataset for given start and count vectors
+
+ USE netcdf_nc_interfaces
+
+ Implicit NONE
+
+ Integer,      Intent(IN)  :: ncid, varid
+ Integer,      Intent(IN)  :: start(*), counts(*)
+ Real(NFREAL), Intent(OUT) :: rvals(*)
+
+ Integer                   :: status
+
+ Integer(KIND=C_INT)            :: cncid, cvarid, cndims, cstat1, cstatus
+ Integer(KIND=C_SIZE_T), TARGET :: cstart(NC_MAX_DIMS), ccounts(NC_MAX_DIMS)
+ Type(C_PTR)                    :: cstartptr, ccountsptr
+ Integer                        :: ndims
+
+ cncid   = ncid
+ cvarid  = varid - 1 ! Subtract 1 to get C varid
+ cstart  = 0
+ ccounts = 0
+
+ cstat1 = nc_inq_varndims(cncid, cvarid, cndims)
+
+ cstartptr  = C_NULL_PTR
+ ccountsptr = C_NULL_PTR
+ ndims      = cndims
+
+ If (cstat1 == NC_NOERR) Then
+   If (ndims > 0) Then ! flip array order for C and subtract 1 from start
+     cstart(1:ndims)  = start(ndims:1:-1)-1
+     ccounts(1:ndims) = counts(ndims:1:-1)
+   EndIf
+   cstartptr  = C_LOC(cstart)
+   ccountsptr = C_LOC(ccounts)
+ EndIf
+
+#if NF_REAL_IS_C_DOUBLE
+ cstatus = nc_get_vara_double(cncid, cvarid, cstartptr, ccountsptr, rvals)
+#else
+ cstatus = nc_get_vara_float(cncid, cvarid, cstartptr, ccountsptr, rvals)
+#endif
+
+ status = cstatus
+
+ End Function nf_get_vara_real
+!--------------------------------- nf_get_vara_double ----------------------
+ Function nf_get_vara_double(ncid, varid, start, counts, dvals) &
+                             RESULT(status)
+
+! Read in Real(RK8) array from dataset for given start and count vectors
+
+ USE netcdf_nc_interfaces
+
+ Implicit NONE
+
+ Integer,   Intent(IN)  :: ncid, varid
+ Integer,   Intent(IN)  :: start(*), counts(*)
+ Real(RK8), Intent(OUT) :: dvals(*)
+
+ Integer                :: status
+
+ Integer(KIND=C_INT)            :: cncid, cvarid, cndims, cstat1, cstatus
+ Integer(KIND=C_SIZE_T), TARGET :: cstart(NC_MAX_DIMS), ccounts(NC_MAX_DIMS)
+ Type(C_PTR)                    :: cstartptr, ccountsptr
+ Integer                        :: ndims
+
+ cncid   = ncid
+ cvarid  = varid - 1 ! Subtract 1 to get C varid
+ cstart  = 0
+ ccounts = 0
+
+ cstat1 = nc_inq_varndims(cncid, cvarid, cndims) ! get varid dimension
+
+ cstartptr  = C_NULL_PTR
+ ccountsptr = C_NULL_PTR
+ ndims      = cndims
+
+ If (cstat1 == NC_NOERR) Then
+   If (ndims > 0) Then ! flip array order for C and subtract 1 from start
+     cstart(1:ndims)  = start(ndims:1:-1)-1
+     ccounts(1:ndims) = counts(ndims:1:-1)
+   EndIf
+   cstartptr  = C_LOC(cstart)
+   ccountsptr = C_LOC(ccounts)
+ EndIf
+
+ cstatus = nc_get_vara_double(cncid, cvarid, cstartptr, ccountsptr, dvals)
+
+ status = cstatus
+
+ End Function nf_get_vara_double
+!--------------------------------- nf_get_vara ------------------------------
+ Function nf_get_vara(ncid, varid, start, counts, values) RESULT(status)
+
+! Read in an array of any type. We use a C interop character string to
+! pass values. Therefore, an explicit interface to nf_put_vara should not
+! be used in the calling routine. Just use external. 
+
+ USE netcdf_nc_interfaces
+
+ Implicit NONE
+
+ Integer,                Intent(IN)            :: ncid, varid
+ Integer,                Intent(IN)            :: start(*), counts(*)
+ Character(KIND=C_CHAR), Intent(INOUT), TARGET :: values(*)
+! Type(C_PTR),            VALUE                 :: values
+ Integer                                       :: status
+
+ Integer(KIND=C_INT)            :: cncid, cvarid, cndims, cstat1, cstatus
+ Integer(KIND=C_SIZE_T), TARGET :: cstart(NC_MAX_DIMS), ccounts(NC_MAX_DIMS)
+ Type(C_PTR)                    :: cstartptr, ccountsptr
+ Integer                        :: ndims
+
+ cncid   = ncid
+ cvarid  = varid - 1 ! Subtract 1 to get C varid
+ cstart  = 0
+ ccounts = 0
+
+ cstat1 = nc_inq_varndims(cncid, cvarid, cndims)
+
+ cstartptr  = C_NULL_PTR
+ ccountsptr = C_NULL_PTR
+ ndims      = cndims
+
+ If (cstat1 == NC_NOERR) Then
+   If (ndims > 0) Then ! flip array order for C and subtract 1 from start
+     cstart(1:ndims)  = start(ndims:1:-1)-1
+     ccounts(1:ndims) = counts(ndims:1:-1)
+   EndIf
+   cstartptr  = C_LOC(cstart)
+   ccountsptr = C_LOC(ccounts)
+ EndIf
+
+ cstatus = nc_get_vara(cncid, cvarid, cstartptr, ccountsptr, values)
+
+ status = cstatus
+
+ End Function nf_get_vara
diff --git a/fortran/nf_vario.F90 b/fortran/nf_vario.F90
new file mode 100755
index 0000000..d86d525
--- /dev/null
+++ b/fortran/nf_vario.F90
@@ -0,0 +1,430 @@
+#include "nfconfig.inc"
+!------------ Array/string put/get routines for a given varid ----------------
+
+! Replacement for fort-vario.c
+
+! Written by: Richard Weed, Ph.D.
+!             Center For Advanced Vehicular Systems 
+!             Mississippi State University
+!             rweed at cavs.msstate.edu
+  
+
+! License (and other Lawyer Language)
+ 
+! This software is released under the Apache 2.0 Open Source License. The
+! full text of the License can be viewed at :
+!
+!   http:www.apache.org/licenses/LICENSE-2.0.html
+!
+! The author grants to the University Corporation for Atmospheric Research
+! (UCAR), Boulder, CO, USA the right to revise and extend the software
+! without restriction. However, the author retains all copyrights and
+! intellectual property rights explicitly stated in or implied by the
+! Apache license
+
+! Version 1.: Sept. 2005 - Initial Cray X1 version
+! Version 2.: May   2006 - Updated to support g95
+! Version 3.: April 2009 - Updated for netCDF 4.0.1
+! Version 4.: April 2010 - Updated for netCDF 4.1.1
+!                          Added preprocessor tests for int and real types
+
+!--------------------------------- nf_put_var_text -----------------------
+ Function nf_put_var_text(ncid, varid, text) RESULT(status)
+
+! Write out a character string to dataset
+
+ USE netcdf_nc_interfaces
+
+ Implicit NONE
+
+ Integer,          Intent(IN) :: ncid, varid
+ Character(LEN=*), Intent(IN) :: text
+
+ Integer                      :: status
+
+ Integer(KIND=C_INT) :: cncid, cvarid,  cstatus
+
+ cncid  = ncid
+ cvarid = varid - 1 ! Subtract 1 to get C varid
+
+ cstatus = nc_put_var_text(cncid, cvarid, text)
+
+ status = cstatus
+
+ End Function nf_put_var_text
+!--------------------------------- nf_put_var_text_a -----------------------
+ Function nf_put_var_text_a(ncid, varid, text) RESULT(status)
+
+! Write out array of characters to dataset
+
+ USE netcdf_nc_interfaces
+
+ Implicit NONE
+
+ Integer,          Intent(IN) :: ncid, varid
+ Character(LEN=1), Intent(IN) :: text(*)
+
+ Integer                      :: status
+
+ Integer(KIND=C_INT) :: cncid, cvarid,  cstatus
+
+ cncid  = ncid
+ cvarid = varid - 1 ! Subtract 1 to get C varid
+
+ cstatus = nc_put_var_text(cncid, cvarid, text)
+
+ status = cstatus
+
+ End Function nf_put_var_text_a
+!--------------------------------- nf_put_var_int1 -------------------------
+ Function nf_put_var_int1(ncid, varid, i1vals) RESULT(status)
+
+! Write out 8 bit integer array to dataset
+
+ USE netcdf_nc_interfaces
+
+ Implicit NONE
+
+ Integer,              Intent(IN) :: ncid, varid
+ Integer(KIND=NFINT1), Intent(IN) :: i1vals(*)
+
+ Integer                          :: status
+
+ Integer(KIND=C_INT) :: cncid, cvarid,  cstatus
+
+ If (C_SIGNED_CHAR < 0) Then ! schar not supported by processor
+   status = NC_EBADTYPE
+   RETURN
+ EndIf
+
+ cncid  = ncid
+ cvarid = varid - 1 ! Subtract 1 to get C varid
+
+#if NF_INT1_IS_C_SIGNED_CHAR
+ cstatus = nc_put_var_schar(cncid, cvarid, i1vals)
+#elif NF_INT1_IS_C_SHORT
+ cstatus = nc_put_var_short(cncid, cvarid, i1vals)
+#elif NF_INT1_IS_C_INT
+ cstatus = nc_put_var_int(cncid, cvarid, i1vals)
+#elif NF_INT1_IS_C_LONG
+ cstatus = nc_put_var_long(cncid, cvarid, i1vals)
+#endif
+
+ status = cstatus
+
+ End Function nf_put_var_int1
+!--------------------------------- nf_put_var_int2 -------------------------
+ Function nf_put_var_int2(ncid, varid, i2vals) RESULT(status)
+
+! Write out 16 bit integer array to dataset
+
+ USE netcdf_nc_interfaces
+
+ Implicit NONE
+
+ Integer,              Intent(IN) :: ncid, varid
+ Integer(KIND=NFINT2), Intent(IN) :: i2vals(*)
+
+ Integer                          :: status
+
+ Integer(KIND=C_INT) :: cncid, cvarid,  cstatus
+
+ If (C_SHORT < 0) Then ! short not supported by processor
+   status = NC_EBADTYPE
+   RETURN
+ EndIf
+
+ cncid  = ncid
+ cvarid = varid - 1 ! Subtract 1 to get C varid
+
+#if NF_INT2_IS_C_SHORT
+ cstatus = nc_put_var_short(cncid, cvarid, i2vals)
+#elif NF_INT2_IS_C_INT
+ cstatus = nc_put_var_int(cncid, cvarid, i2vals)
+#elif NF_INT2_IS_C_LONG
+ cstatus = nc_put_var_long(cncid, cvarid, i2vals)
+#endif
+
+ status = cstatus
+
+ End Function nf_put_var_int2
+!--------------------------------- nf_put_var_int --------------------------
+ Function nf_put_var_int(ncid, varid, ivals) RESULT(status)
+
+! Write out 32 bit integer array to dataset
+
+ USE netcdf_nc_interfaces
+
+ Implicit NONE
+
+ Integer,        Intent(IN) :: ncid, varid
+ Integer(NFINT), Intent(IN) :: ivals(*)
+
+ Integer                    :: status
+
+ Integer(KIND=C_INT) :: cncid, cvarid,  cstatus
+
+ cncid  = ncid
+ cvarid = varid - 1 ! Subtract 1 to get C varid
+
+#if NF_INT_IS_C_INT
+ cstatus = nc_put_var_int(cncid, cvarid, ivals)
+#elif NF_INT_IS_C_LONG
+ cstatus = nc_put_var_long(cncid, cvarid, ivals)
+#endif
+
+ status = cstatus
+
+ End Function nf_put_var_int
+!--------------------------------- nf_put_var_real -------------------------
+ Function nf_put_var_real(ncid, varid, rvals) RESULT(status)
+
+! Write out 32 bit real array to dataset
+
+ USE netcdf_nc_interfaces
+
+ Implicit NONE
+
+ Integer,         Intent(IN) :: ncid, varid
+ Real(NFREAL),    Intent(IN) :: rvals(*)
+ Integer                     :: status
+
+ Integer(KIND=C_INT) :: cncid, cvarid,  cstatus
+
+ cncid  = ncid
+ cvarid = varid - 1 ! Subtract 1 to get C varid
+
+#if NF_REAL_IS_C_DOUBLE
+ cstatus = nc_put_var_double(cncid, cvarid, rvals)
+#else
+ cstatus = nc_put_var_float(cncid, cvarid, rvals)
+#endif
+
+ status = cstatus
+
+ End Function nf_put_var_real
+!--------------------------------- nf_put_var_double -----------------------
+ Function nf_put_var_double(ncid, varid, dvals) RESULT(status)
+
+! Write out 64 bit real array to dataset
+
+ USE netcdf_nc_interfaces
+
+ Implicit NONE
+
+ Integer,   Intent(IN) :: ncid, varid
+ Real(RK8), Intent(IN) :: dvals(*)
+
+ Integer               :: status
+
+ Integer(KIND=C_INT) :: cncid, cvarid,  cstatus
+
+ cncid  = ncid
+ cvarid = varid - 1 ! Subtract 1 to get C varid
+
+ cstatus = nc_put_var_double(cncid, cvarid, dvals)
+
+ status = cstatus
+
+ End Function nf_put_var_double
+!--------------------------------- nf_get_var_text -----------------------
+ Function nf_get_var_text(ncid, varid, text) RESULT(status)
+
+! Read in a character string from dataset
+
+ USE netcdf_nc_interfaces
+
+ Implicit NONE
+
+ Integer,          Intent(IN)  :: ncid, varid
+ Character(LEN=*), Intent(OUT) :: text
+
+ Integer                       :: status
+
+ Integer(KIND=C_INT) :: cncid, cvarid,  cstatus
+
+ cncid  = ncid
+ cvarid = varid - 1 ! Subtract 1 to get C varid
+ text   = REPEAT(" ", LEN(text))
+
+ cstatus = nc_get_var_text(cncid, cvarid, text)
+
+ status = cstatus
+
+ End Function nf_get_var_text
+!--------------------------------- nf_get_var_text_a -----------------------
+ Function nf_get_var_text_a(ncid, varid, text) RESULT(status)
+
+! Read in array of characters from dataset
+
+ USE netcdf_nc_interfaces
+
+ Implicit NONE
+
+ Integer,          Intent(IN)  :: ncid, varid
+ Character(LEN=1), Intent(OUT) :: text(*)
+
+ Integer                       :: status
+
+ Integer(KIND=C_INT) :: cncid, cvarid,  cstatus
+
+ cncid  = ncid
+ cvarid = varid - 1 ! Subtract 1 to get C varid
+
+ cstatus = nc_get_var_text(cncid, cvarid, text)
+
+ status = cstatus
+
+ End Function nf_get_var_text_a
+!--------------------------------- nf_get_var_int1 -------------------------
+ Function nf_get_var_int1(ncid, varid, i1vals) RESULT(status)
+
+! Read in 8 bit integer array from dataset
+
+ USE netcdf_nc_interfaces
+
+ Implicit NONE
+
+ Integer,              Intent(IN)  :: ncid, varid
+ Integer(KIND=NFINT1), Intent(OUT) :: i1vals(*)
+
+ Integer                           :: status
+
+ Integer(KIND=C_INT) :: cncid, cvarid,  cstatus
+
+ If (C_SIGNED_CHAR < 0) Then ! schar not supported by processor
+   status = NC_EBADTYPE
+   RETURN
+ EndIf
+
+ cncid  = ncid
+ cvarid = varid - 1 ! Subtract 1 to get C varid
+
+#if NF_INT1_IS_C_SIGNED_CHAR
+ cstatus = nc_get_var_schar(cncid, cvarid, i1vals)
+#elif NF_INT1_IS_C_SHORT
+ cstatus = nc_get_var_short(cncid, cvarid, i1vals)
+#elif NF_INT1_IS_C_INT
+ cstatus = nc_get_var_int(cncid, cvarid, i1vals)
+#elif NF_INT1_IS_C_LONG
+ cstatus = nc_get_var_long(cncid, cvarid, i1vals)
+#endif
+
+ status = cstatus
+
+ End Function nf_get_var_int1
+!--------------------------------- nf_get_var_int2 -------------------------
+ Function nf_get_var_int2(ncid, varid, i2vals) RESULT(status)
+
+! Read in 16 bit integer array from dataset
+
+ USE netcdf_nc_interfaces
+
+ Implicit NONE
+
+ Integer,              Intent(IN)  :: ncid, varid
+ Integer(KIND=NFINT2), Intent(OUT) :: i2vals(*)
+
+ Integer                           :: status
+
+ Integer(KIND=C_INT) :: cncid, cvarid,  cstatus
+
+ If (C_SHORT < 0) Then ! short not supported by processor
+   status = NC_EBADTYPE
+   RETURN
+ EndIf
+
+ cncid  = ncid
+ cvarid = varid - 1 ! Subtract 1 to get C varid
+
+#if NF_INT2_IS_C_SHORT
+ cstatus = nc_get_var_short(cncid, cvarid, i2vals)
+#elif NF_INT2_IS_C_INT
+ cstatus = nc_get_var_int(cncid, cvarid, i2vals)
+#elif NF_INT2_IS_C_LONG
+ cstatus = nc_get_var_long(cncid, cvarid, i2vals)
+#endif
+
+ status = cstatus
+
+ End Function nf_get_var_int2
+!--------------------------------- nf_get_var_int --------------------------
+ Function nf_get_var_int(ncid, varid, ivals) RESULT(status)
+
+! Read in default integer array from dataset
+
+ USE netcdf_nc_interfaces
+
+ Implicit NONE
+
+ Integer,        Intent(IN)  :: ncid, varid
+ Integer(NFINT), Intent(OUT) :: ivals(*)
+
+ Integer                     :: status
+
+ Integer(KIND=C_INT) :: cncid, cvarid,  cstatus
+
+ cncid  = ncid
+ cvarid = varid - 1 ! Subtract 1 to get C varid
+
+#if NF_INT_IS_C_INT
+ cstatus = nc_get_var_int(cncid, cvarid, ivals)
+#elif NF_INT_IS_C_LONG
+ cstatus = nc_get_var_long(cncid, cvarid, ivals)
+#endif
+
+ status = cstatus
+
+ End Function nf_get_var_int
+!--------------------------------- nf_get_var_real -------------------------
+ Function nf_get_var_real(ncid, varid, rvals) RESULT(status)
+
+! Read in 32 bit real array from dataset
+
+ USE netcdf_nc_interfaces
+
+ Implicit NONE
+
+ Integer,      Intent(IN)  :: ncid, varid
+ Real(NFREAL), Intent(OUT) :: rvals(*)
+
+ Integer                   :: status
+
+ Integer(KIND=C_INT) :: cncid, cvarid,  cstatus
+
+ cncid  = ncid
+ cvarid = varid - 1 ! Subtract 1 to get C varid
+
+#if NF_REAL_IS_C_DOUBLE
+ cstatus = nc_get_var_double(cncid, cvarid, rvals)
+#else
+ cstatus = nc_get_var_float(cncid, cvarid, rvals)
+#endif
+
+ status = cstatus
+
+ End Function nf_get_var_real
+!--------------------------------- nf_get_var_double -----------------------
+ Function nf_get_var_double(ncid, varid, dvals) RESULT(status)
+
+! Read in 64 bit real array from dataset
+
+ USE netcdf_nc_interfaces
+
+ Implicit NONE
+
+ Integer,   Intent(IN)  :: ncid, varid
+ Real(RK8), Intent(OUT) :: dvals(*)
+
+ Integer                :: status
+
+ Integer(KIND=C_INT) :: cncid, cvarid, cstatus
+
+ cncid  = ncid
+ cvarid = varid - 1 ! Subtract 1 to get C varid
+
+ cstatus = nc_get_var_double(cncid, cvarid, dvals)
+
+ status = cstatus
+
+ End Function nf_get_var_double
diff --git a/fortran/nf_varmio.F90 b/fortran/nf_varmio.F90
new file mode 100755
index 0000000..d8aa7a7
--- /dev/null
+++ b/fortran/nf_varmio.F90
@@ -0,0 +1,908 @@
+#include "nfconfig.inc"
+!- Array/string put/get routines given start, count, stride, and map vectors - 
+
+! Replacement for fort-varmio.c
+
+! Written by: Richard Weed, Ph.D.
+!             Center for Advanced Vehicular Systems
+!             Mississippi State University
+!             rweed at cavs.msstate.edu
+
+
+! License (and other Lawyer Language)
+ 
+! This software is released under the Apache 2.0 Open Source License. The
+! full text of the License can be viewed at :
+!
+!   http:www.apache.org/licenses/LICENSE-2.0.html
+!
+! The author grants to the University Corporation for Atmospheric Research
+! (UCAR), Boulder, CO, USA the right to revise and extend the software
+! without restriction. However, the author retains all copyrights and
+! intellectual property rights explicitly stated in or implied by the
+! Apache license
+
+! Version 1.: Sept. 2005 - Initial Cray X1 version
+! Version 2.: May   2006 - Updated to support g95
+!                          Updated to pass start, counts, strides, and
+!                          maps as C_PTR variables
+! Version 3.: April 2009 - Updated for netCDF 4.0.1
+! Version 4.: April 2010 - Updated for netCDF 4.1.1
+!                          Added preprocessor tests for int and real types
+
+!--------------------------------- nf_put_varm_text ----------------------
+ Function nf_put_varm_text(ncid, varid, start, counts, strides, maps, &
+                           text) RESULT(status)
+
+! Write out a character string to dataset given start, count, stride and map
+
+ USE netcdf_nc_interfaces
+
+ Implicit NONE
+
+ Integer,          Intent(IN) :: ncid, varid
+ Integer,          Intent(IN) :: start(*), counts(*), strides(*), maps(*)
+ Character(LEN=*), Intent(IN) :: text 
+
+ Integer                      :: status
+
+ Integer(KIND=C_INT)               :: cncid, cvarid, cndims, cstat1, cstatus
+ Integer(KIND=C_SIZE_T),    TARGET :: cstart(NC_MAX_DIMS), ccounts(NC_MAX_DIMS)
+ Integer(KIND=C_PTRDIFF_T), TARGET :: cstrides(NC_MAX_DIMS), cmaps(NC_MAX_DIMS)
+ Type(C_PTR)                       :: cstartptr, ccountsptr, cstridesptr, &
+                                      cmapsptr
+ Integer                           :: ndims
+
+ cncid    = ncid
+ cvarid   = varid -1 ! Subtract 1 to get C varid
+ cstart   = 0
+ ccounts  = 0
+ cstrides = 1
+ cmaps    = 0 
+
+ cstat1 = nc_inq_varndims(cncid, cvarid, cndims)
+
+ cstartptr   = C_NULL_PTR
+ ccountsptr  = C_NULL_PTR
+ cstridesptr = C_NULL_PTR
+ cmapsptr    = C_NULL_PTR
+ ndims       = cndims
+
+ If (cstat1 == NC_NOERR) Then
+   If (ndims > 0) Then ! Flip arrays to C order and subtract 1 from start
+     cstart(1:ndims)   = start(ndims:1:-1)-1
+     ccounts(1:ndims)  = counts(ndims:1:-1)
+     cstrides(1:ndims) = strides(ndims:1:-1)
+     cmaps(1:ndims)    = maps(ndims:1:-1)
+   EndIf
+   cstartptr   = C_LOC(cstart)
+   ccountsptr  = C_LOC(ccounts)
+   cstridesptr = C_LOC(cstrides)
+   cmapsptr    = C_LOC(cmaps)
+ EndIf
+
+ cstatus = nc_put_varm_text(cncid, cvarid, cstartptr, ccountsptr, &
+                            cstridesptr, cmapsptr, text)
+
+ status = cstatus
+
+ End Function nf_put_varm_text
+!--------------------------------- nf_put_varm_text_a ----------------------
+ Function nf_put_varm_text_a(ncid, varid, start, counts, strides, maps, &
+                                text) RESULT(status)
+
+! Write out array of characters to dataset given start, count, stride and map
+
+ USE netcdf_nc_interfaces
+
+ Implicit NONE
+
+ Integer,          Intent(IN) :: ncid, varid
+ Integer,          Intent(IN) :: start(*), counts(*), strides(*), maps(*)
+ Character(LEN=1), Intent(IN) :: text(*)
+
+ Integer                      :: status
+
+ Integer(KIND=C_INT)               :: cncid, cvarid, cndims, cstat1, cstatus
+ Integer(KIND=C_SIZE_T),    TARGET :: cstart(NC_MAX_DIMS), ccounts(NC_MAX_DIMS)
+ Integer(KIND=C_PTRDIFF_T), TARGET :: cstrides(NC_MAX_DIMS), cmaps(NC_MAX_DIMS)
+ Type(C_PTR)                       :: cstartptr, ccountsptr, cstridesptr,&
+                                      cmapsptr
+ Integer                           :: ndims
+
+ cncid    = ncid
+ cvarid   = varid -1 ! Subtract 1 to get C varid
+ cstart   = 0
+ ccounts  = 0
+ cstrides = 1
+ cmaps    = 0
+
+ cstat1 = nc_inq_varndims(cncid, cvarid, cndims)
+
+ cstartptr   = C_NULL_PTR
+ ccountsptr  = C_NULL_PTR
+ cstridesptr = C_NULL_PTR
+ cmapsptr    = C_NULL_PTR
+ ndims       = cndims
+
+ If (cstat1 == NC_NOERR) Then
+   If (ndims > 0) Then ! Flip arrays to C order and subtract 1 from start
+     cstart(1:ndims)   = start(ndims:1:-1)-1
+     ccounts(1:ndims)  = counts(ndims:1:-1)
+     cstrides(1:ndims) = strides(ndims:1:-1)
+     cmaps(1:ndims)    = maps(ndims:1:-1)
+   EndIf
+   cstartptr   = C_LOC(cstart)
+   ccountsptr  = C_LOC(ccounts)
+   cstridesptr = C_LOC(cstrides)
+   cmapsptr    = C_LOC(cmaps)
+ EndIf
+
+ cstatus = nc_put_varm_text(cncid, cvarid, cstartptr, ccountsptr, &
+                            cstridesptr, cmapsptr, text) 
+
+ status = cstatus
+
+ End Function nf_put_varm_text_a
+!--------------------------------- nf_put_varm_int1 ------------------------
+ Function nf_put_varm_int1(ncid, varid, start, counts, strides, maps, &
+                           i1vals) RESULT(status)
+
+! Write out 8 bit integer array given start, count, stride and map
+
+ USE netcdf_nc_interfaces
+
+ Implicit NONE
+
+ Integer,              Intent(IN) :: ncid, varid
+ Integer,              Intent(IN) :: start(*), counts(*), strides(*), maps(*)
+ Integer(KIND=NFINT1), Intent(IN) :: i1vals(*)
+
+ Integer                          :: status
+
+ Integer(KIND=C_INT)               :: cncid, cvarid, cndims, cstat1, cstatus
+ Integer(KIND=C_SIZE_T),    TARGET :: cstart(NC_MAX_DIMS), ccounts(NC_MAX_DIMS)
+ Integer(KIND=C_PTRDIFF_T), TARGET :: cstrides(NC_MAX_DIMS), cmaps(NC_MAX_DIMS)
+ Type(C_PTR)                       :: cstartptr, ccountsptr, cstridesptr,&
+                                      cmapsptr
+ Integer                           :: ndims
+
+ If (C_SIGNED_CHAR < 0) Then ! schar not supported by processor
+   status = NC_EBADTYPE
+   RETURN
+ EndIf
+
+ cncid    = ncid
+ cvarid   = varid -1 ! Subtract 1 to get C varid
+ cstart   = 0
+ ccounts  = 0
+ cstrides = 1
+ cmaps    = 0
+
+ cstat1 = nc_inq_varndims(cncid, cvarid, cndims)
+
+ cstartptr   = C_NULL_PTR
+ ccountsptr  = C_NULL_PTR
+ cstridesptr = C_NULL_PTR
+ cmapsptr    = C_NULL_PTR
+ ndims       = cndims
+
+ If (cstat1 == NC_NOERR) Then
+   If (ndims > 0) Then ! Flip arrays to C order and subtract 1 from start
+     cstart(1:ndims)   = start(ndims:1:-1)-1
+     ccounts(1:ndims)  = counts(ndims:1:-1)
+     cstrides(1:ndims) = strides(ndims:1:-1)
+     cmaps(1:ndims)    = maps(ndims:1:-1)
+   EndIf
+   cstartptr   = C_LOC(cstart)
+   ccountsptr  = C_LOC(ccounts)
+   cstridesptr = C_LOC(cstrides)
+   cmapsptr    = C_LOC(cmaps)
+ EndIf
+
+#if NF_INT1_IS_C_SIGNED_CHAR
+ cstatus = nc_put_varm_schar(cncid, cvarid, cstartptr, ccountsptr, &
+                             cstridesptr, cmapsptr, i1vals) 
+#elif NF_INT1_IS_C_SHORT
+ cstatus = nc_put_varm_short(cncid, cvarid, cstartptr, ccountsptr, &
+                             cstridesptr, cmapsptr, i1vals) 
+#elif NF_INT1_IS_C_INT
+ cstatus = nc_put_varm_int(cncid, cvarid, cstartptr, ccountsptr, &
+                           cstridesptr, cmapsptr, i1vals) 
+#elif NF_INT1_IS_C_LONG
+ cstatus = nc_put_varm_long(cncid, cvarid, cstartptr, ccountsptr, &
+                            cstridesptr, cmapsptr, i1vals) 
+#endif
+
+ status = cstatus
+
+ End Function nf_put_varm_int1
+!--------------------------------- nf_put_varm_int2 ------------------------
+ Function nf_put_varm_int2(ncid, varid, start, counts, strides, maps, &
+                           i2vals) RESULT(status)
+
+! Write out 16 bit integer array given start, count, stride and map
+
+ USE netcdf_nc_interfaces
+
+ Implicit NONE
+
+ Integer,              Intent(IN) :: ncid, varid
+ Integer,              Intent(IN) :: start(*), counts(*), strides(*), maps(*)
+ Integer(KIND=NFINT2), Intent(IN) :: i2vals(*)
+
+ Integer                          :: status
+
+ Integer(KIND=C_INT)               :: cncid, cvarid, cndims, cstat1, cstatus
+ Integer(KIND=C_SIZE_T),    TARGET :: cstart(NC_MAX_DIMS), ccounts(NC_MAX_DIMS)
+ Integer(KIND=C_PTRDIFF_T), TARGET :: cstrides(NC_MAX_DIMS), cmaps(NC_MAX_DIMS)
+ Type(C_PTR)                       :: cstartptr, ccountsptr, cstridesptr, &
+                                      cmapsptr
+ Integer                           :: ndims
+
+ If (C_SHORT < 0) Then ! short not supported by processor
+   status = NC_EBADTYPE
+   RETURN
+ EndIf
+
+ cncid    = ncid
+ cvarid   = varid -1 ! Subtract 1 to get C varid
+ cstart   = 0
+ ccounts  = 0
+ cstrides = 1
+ cmaps    = 0
+
+ cstat1 = nc_inq_varndims(cncid, cvarid, cndims)
+
+ cstartptr   = C_NULL_PTR
+ ccountsptr  = C_NULL_PTR
+ cstridesptr = C_NULL_PTR
+ cmapsptr    = C_NULL_PTR
+ ndims       = cndims
+
+ If (cstat1 == NC_NOERR) Then
+   If (ndims > 0) Then ! Flip arrays to C order and subtract 1 from start
+     cstart(1:ndims)   = start(ndims:1:-1)-1
+     ccounts(1:ndims)  = counts(ndims:1:-1)
+     cstrides(1:ndims) = strides(ndims:1:-1)
+     cmaps(1:ndims)    = maps(ndims:1:-1)
+   EndIf
+   cstartptr   = C_LOC(cstart)
+   ccountsptr  = C_LOC(ccounts)
+   cstridesptr = C_LOC(cstrides)
+   cmapsptr    = C_LOC(cmaps)
+ EndIf
+
+#if NF_INT2_IS_C_SHORT
+ cstatus = nc_put_varm_short(cncid, cvarid, cstartptr, ccountsptr, &
+                             cstridesptr, cmapsptr, i2vals) 
+#elif NF_INT2_IS_C_INT
+ cstatus = nc_put_varm_int(cncid, cvarid, cstartptr, ccountsptr, &
+                           cstridesptr, cmapsptr, i2vals) 
+#elif NF_INT2_IS_C_LONG
+ cstatus = nc_put_varm_long(cncid, cvarid, cstartptr, ccountsptr, &
+                            cstridesptr, cmapsptr, i2vals)
+#endif 
+
+ status = cstatus
+
+ End Function nf_put_varm_int2
+!--------------------------------- nf_put_varm_int -------------------------
+ Function nf_put_varm_int(ncid, varid, start, counts, strides, maps, &
+                             ivals) RESULT(status)
+
+! Write out default integer array given start, count, stride and map
+
+ USE netcdf_nc_interfaces
+
+ Implicit NONE
+
+ Integer,        Intent(IN) :: ncid, varid
+ Integer,        Intent(IN) :: start(*), counts(*), strides(*), maps(*)
+ Integer(NFINT), Intent(IN) :: ivals(*)
+
+ Integer                    :: status
+
+ Integer(KIND=C_INT)               :: cncid, cvarid, cndims, cstat1, cstatus
+ Integer(KIND=C_SIZE_T),    TARGET :: cstart(NC_MAX_DIMS), ccounts(NC_MAX_DIMS)
+ Integer(KIND=C_PTRDIFF_T), TARGET :: cstrides(NC_MAX_DIMS), cmaps(NC_MAX_DIMS)
+ Type(C_PTR)                       :: cstartptr, ccountsptr, cstridesptr, &
+                                      cmapsptr
+ Integer                           :: ndims
+
+ cncid    = ncid
+ cvarid   = varid -1 ! Subtract 1 to get C varid
+ cstart   = 0
+ ccounts  = 0
+ cstrides = 1
+ cmaps    = 0
+
+ cstat1 = nc_inq_varndims(cncid, cvarid, cndims)
+
+ cstartptr   = C_NULL_PTR
+ ccountsptr  = C_NULL_PTR
+ cstridesptr = C_NULL_PTR
+ cmapsptr    = C_NULL_PTR
+ ndims       = cndims
+
+ If (cstat1 == NC_NOERR) Then
+   If (ndims > 0) Then ! Flip arrays to C order and subtract 1 from start
+     cstart(1:ndims)   = start(ndims:1:-1)-1
+     ccounts(1:ndims)  = counts(ndims:1:-1)
+     cstrides(1:ndims) = strides(ndims:1:-1)
+     cmaps(1:ndims)    = maps(ndims:1:-1)
+   EndIf
+   cstartptr   = C_LOC(cstart)
+   ccountsptr  = C_LOC(ccounts)
+   cstridesptr = C_LOC(cstrides)
+   cmapsptr    = C_LOC(cmaps)
+ EndIf
+
+#if NF_INT_IS_C_INT
+ cstatus = nc_put_varm_int(cncid, cvarid, cstartptr, ccountsptr, &
+                           cstridesptr, cmapsptr, ivals) 
+#elif NF_INT_IS_C_LONG
+ cstatus = nc_put_varm_long(cncid, cvarid, cstartptr, ccountsptr, &
+                            cstridesptr, cmapsptr, ivals) 
+#endif
+
+ status = cstatus
+
+ End Function nf_put_varm_int
+!--------------------------------- nf_put_varm_real ------------------------
+ Function nf_put_varm_real(ncid, varid, start, counts, strides, maps, &
+                              rvals) RESULT(status)
+
+! Write out 32 bit real array given start, count, stride and map
+
+ USE netcdf_nc_interfaces
+
+ Implicit NONE
+
+ Integer,      Intent(IN) :: ncid, varid
+ Integer,      Intent(IN) :: start(*), counts(*), strides(*), maps(*)
+ Real(NFREAL), Intent(IN) :: rvals(*)
+
+ Integer                  :: status
+
+ Integer(KIND=C_INT)               :: cncid, cvarid, cndims, cstat1, cstatus
+ Integer(KIND=C_SIZE_T),    TARGET :: cstart(NC_MAX_DIMS), ccounts(NC_MAX_DIMS)
+ Integer(KIND=C_PTRDIFF_T), TARGET :: cstrides(NC_MAX_DIMS), cmaps(NC_MAX_DIMS)
+ Type(C_PTR)                       :: cstartptr, ccountsptr, cstridesptr, &
+                                      cmapsptr
+ Integer                           :: ndims
+
+ cncid    = ncid
+ cvarid   = varid -1 ! Subtract 1 to get C varid
+ cstart   = 0
+ ccounts  = 0
+ cstrides = 1
+ cmaps    = 0
+
+ cstat1 = nc_inq_varndims(cncid, cvarid, cndims)
+
+ cstartptr   = C_NULL_PTR
+ ccountsptr  = C_NULL_PTR
+ cstridesptr = C_NULL_PTR
+ cmapsptr    = C_NULL_PTR
+ ndims       = cndims
+
+ If (cstat1 == NC_NOERR) Then
+   If (ndims > 0) Then ! Flip arrays to C order and subtract 1 from start
+     cstart(1:ndims)   = start(ndims:1:-1)-1
+     ccounts(1:ndims)  = counts(ndims:1:-1)
+     cstrides(1:ndims) = strides(ndims:1:-1)
+     cmaps(1:ndims)    = maps(ndims:1:-1)
+   EndIf
+   cstartptr   = C_LOC(cstart)
+   ccountsptr  = C_LOC(ccounts)
+   cstridesptr = C_LOC(cstrides)
+   cmapsptr    = C_LOC(cmaps)
+ EndIf
+
+#if NF_REAL_IS_C_DOUBLE
+ cstatus = nc_put_varm_double(cncid, cvarid, cstartptr, ccountsptr, &
+                              cstridesptr, cmapsptr, rvals) 
+#else
+ cstatus = nc_put_varm_float(cncid, cvarid, cstartptr, ccountsptr, &
+                             cstridesptr, cmapsptr, rvals) 
+#endif
+ status = cstatus
+
+ End Function nf_put_varm_real
+!--------------------------------- nf_put_varm_double ----------------------
+ Function nf_put_varm_double(ncid, varid, start, counts, strides, maps, &
+                                dvals) RESULT(status)
+
+! Write out 64 bit real array given start, count, stride, and map
+
+ USE netcdf_nc_interfaces
+
+ Implicit NONE
+
+ Integer,   Intent(IN) :: ncid, varid
+ Integer,   Intent(IN) :: start(*), counts(*), strides(*), maps(*)
+ Real(RK8), Intent(IN) :: dvals(*)
+
+ Integer               :: status
+
+ Integer(KIND=C_INT)               :: cncid, cvarid, cndims, cstat1, cstatus
+ Integer(KIND=C_SIZE_T),    TARGET :: cstart(NC_MAX_DIMS), ccounts(NC_MAX_DIMS)
+ Integer(KIND=C_PTRDIFF_T), TARGET :: cstrides(NC_MAX_DIMS), cmaps(NC_MAX_DIMS)
+ Type(C_PTR)                       :: cstartptr, ccountsptr, cstridesptr, &
+                                      cmapsptr
+ Integer                           :: ndims
+
+ cncid    = ncid
+ cvarid   = varid -1 ! Subtract 1 to get C varid
+ cstart   = 0
+ ccounts  = 0
+ cstrides = 1
+ cmaps    = 0
+
+ cstat1 = nc_inq_varndims(cncid, cvarid, cndims)
+
+ cstartptr   = C_NULL_PTR
+ ccountsptr  = C_NULL_PTR
+ cstridesptr = C_NULL_PTR
+ cmapsptr    = C_NULL_PTR
+ ndims       = cndims
+
+ If (cstat1 == NC_NOERR) Then
+   If (ndims > 0) Then ! Flip arrays to C order and subtract 1 from start
+     cstart(1:ndims)   = start(ndims:1:-1)-1
+     ccounts(1:ndims)  = counts(ndims:1:-1)
+     cstrides(1:ndims) = strides(ndims:1:-1)
+     cmaps(1:ndims)    = maps(ndims:1:-1)
+   EndIf
+   cstartptr   = C_LOC(cstart)
+   ccountsptr  = C_LOC(ccounts)
+   cstridesptr = C_LOC(cstrides)
+   cmapsptr    = C_LOC(cmaps)
+ EndIf
+  
+ cstatus = nc_put_varm_double(cncid, cvarid, cstartptr, ccountsptr, &
+                              cstridesptr, cmapsptr, dvals) 
+
+ status = cstatus
+
+ End Function nf_put_varm_double
+!--------------------------------- nf_get_varm_text ----------------------
+ Function nf_get_varm_text(ncid, varid, start, counts, strides, maps, &
+                           text) RESULT(status)
+
+! Read in a character string to dataset given start, count, stride, and map
+
+ USE netcdf_nc_interfaces
+
+ Implicit NONE
+
+ Integer,          Intent(IN)  :: ncid, varid
+ Integer,          Intent(IN)  :: start(*), counts(*), strides(*), maps(*)
+ Character(LEN=*), Intent(OUT) :: text 
+
+ Integer                       :: status
+
+ Integer(KIND=C_INT)               :: cncid, cvarid, cndims, cstat1, cstatus
+ Integer(KIND=C_SIZE_T),    TARGET :: cstart(NC_MAX_DIMS), ccounts(NC_MAX_DIMS)
+ Integer(KIND=C_PTRDIFF_T), TARGET :: cstrides(NC_MAX_DIMS), cmaps(NC_MAX_DIMS)
+ Type(C_PTR)                       :: cstartptr, ccountsptr, cstridesptr, &
+                                      cmapsptr
+ Integer                           :: ndims
+
+ cncid    = ncid
+ cvarid   = varid -1 ! Subtract 1 to get C varid
+ cstart   = 0
+ ccounts  = 0
+ cstrides = 1
+ cmaps    = 0
+ text     = REPEAT(" ",LEN(text))
+
+ cstat1 = nc_inq_varndims(cncid, cvarid, cndims)
+
+ cstartptr   = C_NULL_PTR
+ ccountsptr  = C_NULL_PTR
+ cstridesptr = C_NULL_PTR
+ cmapsptr    = C_NULL_PTR
+ ndims       = cndims
+
+ If (cstat1 == NC_NOERR) Then
+   If (ndims > 0) Then ! Flip arrays to C order and subtract 1 from start
+     cstart(1:ndims)   = start(ndims:1:-1)-1
+     ccounts(1:ndims)  = counts(ndims:1:-1)
+     cstrides(1:ndims) = strides(ndims:1:-1)
+     cmaps(1:ndims)    = maps(ndims:1:-1)
+   EndIf
+   cstartptr   = C_LOC(cstart)
+   ccountsptr  = C_LOC(ccounts)
+   cstridesptr = C_LOC(cstrides)
+   cmapsptr    = C_LOC(cmaps)
+ EndIf
+
+ cstatus = nc_get_varm_text(cncid, cvarid, cstartptr, ccountsptr, &
+                            cstridesptr, cmapsptr, text) 
+
+ status = cstatus
+
+ End Function nf_get_varm_text
+!--------------------------------- nf_get_varm_text_a ----------------------
+ Function nf_get_varm_text_a(ncid, varid, start, counts, strides, maps, &
+                             text) RESULT(status)
+
+! Read in array of characters from dataset given start, count, stride and map
+
+ USE netcdf_nc_interfaces
+
+ Implicit NONE
+
+ Integer,          Intent(IN)  :: ncid, varid
+ Integer,          Intent(IN)  :: start(*), counts(*), strides(*), maps(*)
+ Character(LEN=1), Intent(OUT) :: text(*) 
+
+ Integer                       :: status
+
+ Integer(KIND=C_INT)               :: cncid, cvarid, cndims, cstat1, cstatus
+ Integer(KIND=C_SIZE_T),    TARGET :: cstart(NC_MAX_DIMS), ccounts(NC_MAX_DIMS)
+ Integer(KIND=C_PTRDIFF_T), TARGET :: cstrides(NC_MAX_DIMS), cmaps(NC_MAX_DIMS)
+ Type(C_PTR)                       :: cstartptr, ccountsptr, cstridesptr, &
+                                      cmapsptr
+ Integer                           :: ndims
+
+ cncid    = ncid
+ cvarid   = varid -1 ! Subtract 1 to get C varid
+ cstart   = 0
+ ccounts  = 0
+ cstrides = 1
+ cmaps    = 0
+
+ cstat1 = nc_inq_varndims(cncid, cvarid, cndims)
+
+ cstartptr   = C_NULL_PTR
+ ccountsptr  = C_NULL_PTR
+ cstridesptr = C_NULL_PTR
+ cmapsptr    = C_NULL_PTR
+ ndims       = cndims
+
+ If (cstat1 == NC_NOERR) Then
+   If (ndims > 0) Then ! Flip arrays to C order and subtract 1 from start
+     cstart(1:ndims)   = start(ndims:1:-1)-1
+     ccounts(1:ndims)  = counts(ndims:1:-1)
+     cstrides(1:ndims) = strides(ndims:1:-1)
+     cmaps(1:ndims)    = maps(ndims:1:-1)
+   EndIf
+   cstartptr   = C_LOC(cstart)
+   ccountsptr  = C_LOC(ccounts)
+   cstridesptr = C_LOC(cstrides)
+   cmapsptr    = C_LOC(cmaps)
+ EndIf
+
+ cstatus = nc_get_varm_text(cncid, cvarid, cstartptr, ccountsptr, &
+                            cstridesptr, cmapsptr, text) 
+
+ status = cstatus
+
+ End Function nf_get_varm_text_a
+!--------------------------------- nf_get_varm_int1 ------------------------
+ Function nf_get_varm_int1(ncid, varid, start, counts, strides, maps, &
+                           i1vals) RESULT(status)
+
+! Read in 8 bit integer array given start, count, stride and map
+
+ USE netcdf_nc_interfaces
+
+ Implicit NONE
+
+ Integer,              Intent(IN)  :: ncid, varid
+ Integer,              Intent(IN)  :: start(*), counts(*), strides(*), maps(*)
+ Integer(KIND=NFINT1), Intent(OUT) :: i1vals(*)
+
+ Integer                           :: status
+
+ Integer(KIND=C_INT)               :: cncid, cvarid, cndims, cstat1, cstatus
+ Integer(KIND=C_SIZE_T),    TARGET :: cstart(NC_MAX_DIMS), ccounts(NC_MAX_DIMS)
+ Integer(KIND=C_PTRDIFF_T), TARGET :: cstrides(NC_MAX_DIMS), cmaps(NC_MAX_DIMS)
+ Type(C_PTR)                       :: cstartptr, ccountsptr, cstridesptr, &
+                                      cmapsptr
+ Integer                           :: ndims
+
+ If (C_SIGNED_CHAR < 0) Then ! schar not supported by processor
+   status = NC_EBADTYPE
+   RETURN
+ EndIf
+
+ cncid    = ncid
+ cvarid   = varid -1 ! Subtract 1 to get C varid
+ cstart   = 0
+ ccounts  = 0
+ cstrides = 1
+ cmaps    = 0
+
+ cstat1 = nc_inq_varndims(cncid, cvarid, cndims)
+
+ cstartptr   = C_NULL_PTR
+ ccountsptr  = C_NULL_PTR
+ cstridesptr = C_NULL_PTR
+ cmapsptr    = C_NULL_PTR
+ ndims       = cndims
+
+ If (cstat1 == NC_NOERR) Then
+   If (ndims > 0) Then ! Flip arrays to C order and subtract 1 from start
+     cstart(1:ndims)   = start(ndims:1:-1)-1
+     ccounts(1:ndims)  = counts(ndims:1:-1)
+     cstrides(1:ndims) = strides(ndims:1:-1)
+     cmaps(1:ndims)    = maps(ndims:1:-1)
+   EndIf
+   cstartptr   = C_LOC(cstart)
+   ccountsptr  = C_LOC(ccounts)
+   cstridesptr = C_LOC(cstrides)
+   cmapsptr    = C_LOC(cmaps)
+ EndIf
+
+#if NF_INT1_IS_C_SIGNED_CHAR
+ cstatus = nc_get_varm_schar(cncid, cvarid, cstartptr, ccountsptr, &
+                             cstridesptr, cmapsptr, i1vals) 
+#elif NF_INT1_IS_C_SHORT
+ cstatus = nc_get_varm_short(cncid, cvarid, cstartptr, ccountsptr, &
+                             cstridesptr, cmapsptr, i1vals) 
+#elif NF_INT1_IS_C_INT
+ cstatus = nc_get_varm_int(cncid, cvarid, cstartptr, ccountsptr, &
+                           cstridesptr, cmapsptr, i1vals) 
+#elif NF_INT1_IS_C_LONG
+ cstatus = nc_get_varm_long(cncid, cvarid, cstartptr, ccountsptr, &
+                            cstridesptr, cmapsptr, i1vals) 
+#endif
+
+ status = cstatus
+
+ End Function nf_get_varm_int1
+!--------------------------------- nf_get_varm_int2 ------------------------
+ Function nf_get_varm_int2(ncid, varid, start, counts, strides, maps, &
+                              i2vals) RESULT(status)
+
+! Read in 16 bit integer array given start, count, stride and map
+
+ USE netcdf_nc_interfaces
+
+ Implicit NONE
+
+ Integer,              Intent(IN)  :: ncid, varid
+ Integer,              Intent(IN)  :: start(*), counts(*), strides(*), maps(*)
+ Integer(KIND=NFINT2), Intent(OUT) :: i2vals(*)
+
+ Integer                           :: status
+
+ Integer(KIND=C_INT)               :: cncid, cvarid, cndims, cstat1, cstatus
+ Integer(KIND=C_SIZE_T),    TARGET :: cstart(NC_MAX_DIMS), ccounts(NC_MAX_DIMS)
+ Integer(KIND=C_PTRDIFF_T), TARGET :: cstrides(NC_MAX_DIMS), cmaps(NC_MAX_DIMS)
+ Type(C_PTR)                       :: cstartptr, ccountsptr, cstridesptr, &
+                                      cmapsptr
+ Integer                           :: ndims
+
+ If (C_SHORT < 0) Then ! short not supported by processor
+   status = NC_EBADTYPE
+   RETURN
+ EndIf
+
+ cncid    = ncid
+ cvarid   = varid -1 ! Subtract 1 to get C varid
+ cstart   = 0
+ ccounts  = 0
+ cstrides = 1
+ cmaps    = 0
+
+ cstat1 = nc_inq_varndims(cncid, cvarid, cndims)
+
+ cstartptr   = C_NULL_PTR
+ ccountsptr  = C_NULL_PTR
+ cstridesptr = C_NULL_PTR
+ cmapsptr    = C_NULL_PTR
+ ndims       = cndims
+
+ If (cstat1 == NC_NOERR) Then
+   If (ndims > 0) Then ! Flip arrays to C order and subtract 1 from start
+     cstart(1:ndims)   = start(ndims:1:-1)-1
+     ccounts(1:ndims)  = counts(ndims:1:-1)
+     cstrides(1:ndims) = strides(ndims:1:-1)
+     cmaps(1:ndims)    = maps(ndims:1:-1)
+   EndIf
+   cstartptr   = C_LOC(cstart)
+   ccountsptr  = C_LOC(ccounts)
+   cstridesptr = C_LOC(cstrides)
+   cmapsptr    = C_LOC(cmaps)
+ EndIf
+
+#if NF_INT2_IS_C_SHORT
+ cstatus = nc_get_varm_short(cncid, cvarid, cstartptr, ccountsptr, &
+                             cstridesptr, cmapsptr, i2vals) 
+#elif NF_INT2_IS_C_INT
+ cstatus = nc_get_varm_int(cncid, cvarid, cstartptr, ccountsptr, &
+                           cstridesptr, cmapsptr, i2vals) 
+#elif NF_INT2_IS_C_LONG
+ cstatus = nc_get_varm_long(cncid, cvarid, cstartptr, ccountsptr, &
+                            cstridesptr, cmapsptr, i2vals)
+#endif 
+
+ status = cstatus
+
+ End Function nf_get_varm_int2
+!--------------------------------- nf_get_varm_int -------------------------
+ Function nf_get_varm_int(ncid, varid, start, counts, strides, maps, &
+                             ivals) RESULT(status)
+
+! Read in default integer array given start, count, stride and map
+
+ USE netcdf_nc_interfaces
+
+ Implicit NONE
+
+ Integer,        Intent(IN)  :: ncid, varid
+ Integer,        Intent(IN)  :: start(*), counts(*), strides(*), maps(*)
+ Integer(NFINT), Intent(OUT) :: ivals(*)
+
+ Integer                     :: status
+
+ Integer(KIND=C_INT)               :: cncid, cvarid, cndims, cstat1, cstatus
+ Integer(KIND=C_SIZE_T),    TARGET :: cstart(NC_MAX_DIMS), ccounts(NC_MAX_DIMS)
+ Integer(KIND=C_PTRDIFF_T), TARGET :: cstrides(NC_MAX_DIMS), cmaps(NC_MAX_DIMS)
+ Type(C_PTR)                       :: cstartptr, ccountsptr, cstridesptr, &
+                                      cmapsptr
+ Integer                              :: ndims
+
+ cncid    = ncid
+ cvarid   = varid -1 ! Subtract 1 to get C varid
+ cstart   = 0
+ ccounts  = 0
+ cstrides = 1
+ cmaps    = 0
+
+ cstat1 = nc_inq_varndims(cncid, cvarid, cndims)
+
+ cstartptr   = C_NULL_PTR
+ ccountsptr  = C_NULL_PTR
+ cstridesptr = C_NULL_PTR
+ cmapsptr    = C_NULL_PTR
+ ndims       = cndims
+
+ If (cstat1 == NC_NOERR) Then
+   If (ndims > 0) Then ! Flip arrays to C order and subtract 1 from start
+     cstart(1:ndims)   = start(ndims:1:-1)-1
+     ccounts(1:ndims)  = counts(ndims:1:-1)
+     cstrides(1:ndims) = strides(ndims:1:-1)
+     cmaps(1:ndims)    = maps(ndims:1:-1)
+   EndIf
+   cstartptr   = C_LOC(cstart)
+   ccountsptr  = C_LOC(ccounts)
+   cstridesptr = C_LOC(cstrides)
+   cmapsptr    = C_LOC(cmaps)
+ EndIf
+
+#if NF_INT_IS_C_INT
+ cstatus = nc_get_varm_int(cncid, cvarid, cstartptr, ccountsptr, &
+                           cstridesptr, cmapsptr, ivals) 
+#elif NF_INT_IS_C_LONG
+ cstatus = nc_get_varm_long(cncid, cvarid, cstartptr, ccountsptr, &
+                            cstridesptr, cmapsptr, ivals)
+#endif 
+
+ status = cstatus
+
+ End Function nf_get_varm_int
+!--------------------------------- nf_get_varm_real ------------------------
+ Function nf_get_varm_real(ncid, varid, start, counts, strides, maps, &
+                              rvals) RESULT(status)
+
+! Read in 32 bit real array given start, count, stride and map
+
+ USE netcdf_nc_interfaces
+
+ Implicit NONE
+
+ Integer,      Intent(IN)  :: ncid, varid
+ Integer,      Intent(IN)  :: start(*), counts(*), strides(*), maps(*)
+ Real(NFREAL), Intent(OUT) :: rvals(*)
+
+ Integer                   :: status
+
+ Integer(KIND=C_INT)               :: cncid, cvarid, cndims, cstat1, cstatus
+ Integer(KIND=C_SIZE_T),    TARGET :: cstart(NC_MAX_DIMS), ccounts(NC_MAX_DIMS)
+ Integer(KIND=C_PTRDIFF_T), TARGET :: cstrides(NC_MAX_DIMS), cmaps(NC_MAX_DIMS)
+ Type(C_PTR)                       :: cstartptr, ccountsptr, cstridesptr, &
+                                      cmapsptr
+ Integer                           :: ndims
+
+ cncid    = ncid
+ cvarid   = varid -1 ! Subtract 1 to get C varid
+ cstart   = 0
+ ccounts  = 0
+ cstrides = 1
+ cmaps    = 0
+
+ cstat1 = nc_inq_varndims(cncid, cvarid, cndims)
+
+ cstartptr   = C_NULL_PTR
+ ccountsptr  = C_NULL_PTR
+ cstridesptr = C_NULL_PTR
+ cmapsptr    = C_NULL_PTR
+ ndims       = cndims
+
+ If (cstat1 == NC_NOERR) Then
+   If (ndims > 0) Then ! Flip arrays to C order and subtract 1 from start
+     cstart(1:ndims)   = start(ndims:1:-1)-1
+     ccounts(1:ndims)  = counts(ndims:1:-1)
+     cstrides(1:ndims) = strides(ndims:1:-1)
+     cmaps(1:ndims)    = maps(ndims:1:-1)
+   EndIf
+   cstartptr   = C_LOC(cstart)
+   ccountsptr  = C_LOC(ccounts)
+   cstridesptr = C_LOC(cstrides)
+   cmapsptr    = C_LOC(cmaps)
+ EndIf
+
+#if NF_REAL_IS_C_DOUBLE
+ cstatus = nc_get_varm_double(cncid, cvarid, cstartptr, ccountsptr, &
+                              cstridesptr, cmapsptr, rvals) 
+#else
+ cstatus = nc_get_varm_float(cncid, cvarid, cstartptr, ccountsptr, &
+                             cstridesptr, cmapsptr, rvals) 
+#endif
+
+ status = cstatus
+
+ End Function nf_get_varm_real
+!--------------------------------- nf_get_varm_double ----------------------
+ Function nf_get_varm_double(ncid, varid, start, counts, strides, maps, &
+                             dvals) RESULT(status)
+
+! Read in 64 bit real array given start, count, stride and map
+
+ USE netcdf_nc_interfaces
+
+ Implicit NONE
+
+ Integer,   Intent(IN)  :: ncid, varid
+ Integer,   Intent(IN)  :: start(*), counts(*), strides(*), maps(*)
+ Real(RK8), Intent(OUT) :: dvals(*)
+
+ Integer                :: status
+
+ Integer(KIND=C_INT)               :: cncid, cvarid, cndims, cstat1, cstatus
+ Integer(KIND=C_SIZE_T),    TARGET :: cstart(NC_MAX_DIMS), ccounts(NC_MAX_DIMS)
+ Integer(KIND=C_PTRDIFF_T), TARGET :: cstrides(NC_MAX_DIMS), cmaps(NC_MAX_DIMS)
+ Type(C_PTR)                       :: cstartptr, ccountsptr, cstridesptr, &
+                                      cmapsptr
+ Integer                           :: ndims
+
+ cncid    = ncid
+ cvarid   = varid -1 ! Subtract 1 to get C varid
+ cstart   = 0
+ ccounts  = 0
+ cstrides = 1
+ cmaps    = 0
+
+ cstat1 = nc_inq_varndims(cncid, cvarid, cndims)
+
+ cstartptr   = C_NULL_PTR
+ ccountsptr  = C_NULL_PTR
+ cstridesptr = C_NULL_PTR
+ cmapsptr    = C_NULL_PTR
+ ndims       = cndims
+
+ If (cstat1 == NC_NOERR) Then
+   If (ndims > 0) Then ! Flip arrays to C order and subtract 1 from start
+     cstart(1:ndims)   = start(ndims:1:-1)-1
+     ccounts(1:ndims)  = counts(ndims:1:-1)
+     cstrides(1:ndims) = strides(ndims:1:-1)
+     cmaps(1:ndims)    = maps(ndims:1:-1)
+   EndIf
+   cstartptr   = C_LOC(cstart)
+   ccountsptr  = C_LOC(ccounts)
+   cstridesptr = C_LOC(cstrides)
+   cmapsptr    = C_LOC(cmaps)
+ EndIf
+
+ cstatus = nc_get_varm_double(cncid, cvarid, cstartptr, ccountsptr, &
+                              cstridesptr, cmapsptr, dvals) 
+
+ status = cstatus
+
+ End Function nf_get_varm_double
diff --git a/fortran/nf_varsio.F90 b/fortran/nf_varsio.F90
new file mode 100755
index 0000000..0b6da66
--- /dev/null
+++ b/fortran/nf_varsio.F90
@@ -0,0 +1,955 @@
+#include "nfconfig.inc"
+!-------- Array/string put/get routines given start, count, and stride -------
+
+! Replacement for fort-varsio.c
+
+! Written by: Richard Weed, Ph.D.
+!             Center for Advanced Vehicular Systems
+!             Mississippi State University
+!             rweed at cavs.msstate.edu
+
+
+! License (and other Lawyer Language)
+ 
+! This software is released under the Apache 2.0 Open Source License. The
+! full text of the License can be viewed at :
+!
+!   http:www.apache.org/licenses/LICENSE-2.0.html
+!
+! The author grants to the University Corporation for Atmospheric Research
+! (UCAR), Boulder, CO, USA the right to revise and extend the software
+! without restriction. However, the author retains all copyrights and
+! intellectual property rights explicitly stated in or implied by the
+! Apache license
+
+! Version 1.: Sept  2005 - Initial Cray X1 version
+! Version 2.: May   2006 - Updated to support g95
+!                          Updated to pass start, counts, and strides as
+!                          C_PTR variables
+! Version 3.: April 2009 - Updated for netCDF 4.0.1
+! Version 4.: April 2010 - Updated for netCDF 4.1.1
+!                          Added preprocessor tests for int and real types
+
+!--------------------------------- nf_put_vars_text ----------------------
+ Function nf_put_vars_text(ncid, varid, start, counts, strides, text) &
+                           RESULT(status)
+
+! Write out a character string given start, count, and stride
+
+ USE netcdf_nc_interfaces
+
+ Implicit NONE
+
+ Integer,          Intent(IN) :: ncid, varid
+ Integer,          Intent(IN) :: start(*), counts(*), strides(*)
+ Character(LEN=*), Intent(IN) :: text 
+
+ Integer                      :: status
+
+ Integer(KIND=C_INT)               :: cncid, cvarid, cndims, cstat1, cstatus
+ Integer(KIND=C_SIZE_T),    TARGET :: cstart(NC_MAX_DIMS), ccounts(NC_MAX_DIMS)
+ Integer(KIND=C_PTRDIFF_T), TARGET :: cstrides(NC_MAX_DIMS)
+ Type(C_PTR)                       :: cstartptr, ccountsptr, cstridesptr
+ Integer                           :: ndims
+
+ cncid    = ncid
+ cvarid   = varid - 1 ! Subtract 1 to get C varid
+ cstart   = 0
+ ccounts  = 0
+ cstrides = 1
+
+ cstat1 = nc_inq_varndims(cncid, cvarid, cndims)
+
+ cstartptr   = C_NULL_PTR
+ ccountsptr  = C_NULL_PTR
+ cstridesptr = C_NULL_PTR
+ ndims       = cndims
+
+ If (cstat1 == NC_NOERR) Then
+   If (ndims > 0) Then ! Flip arrays to C order and subtract 1 from start
+     cstart(1:ndims)   = start(ndims:1:-1)-1
+     ccounts(1:ndims)  = counts(ndims:1:-1)
+     cstrides(1:ndims) = strides(ndims:1:-1)
+   EndIf
+   cstartptr   = C_LOC(cstart)
+   ccountsptr  = C_LOC(ccounts)
+   cstridesptr = C_LOC(cstrides)
+ EndIf
+
+ cstatus = nc_put_vars_text(cncid, cvarid, cstartptr, ccountsptr, &
+                            cstridesptr, text)
+
+ status = cstatus
+
+ End Function nf_put_vars_text
+!--------------------------------- nf_put_vars_text_a ----------------------
+ Function nf_put_vars_text_a(ncid, varid, start, counts, strides, text) &
+                                RESULT(status)
+
+! Write out array of characters given start, count, and stride
+! Special version for case where string is an array of characters
+
+ USE netcdf_nc_interfaces
+
+ Implicit NONE
+
+ Integer,          Intent(IN) :: ncid, varid
+ Integer,          Intent(IN) :: start(*), counts(*), strides(*)
+ Character(LEN=1), Intent(IN) :: text(*) 
+
+ Integer                      :: status
+
+ Integer(KIND=C_INT)               :: cncid, cvarid, cndims, cstat1, cstatus
+ Integer(KIND=C_SIZE_T),    TARGET :: cstart(NC_MAX_DIMS), ccounts(NC_MAX_DIMS)
+ Integer(KIND=C_PTRDIFF_T), TARGET :: cstrides(NC_MAX_DIMS)
+ Type(C_PTR)                       :: cstartptr, ccountsptr, cstridesptr
+ Integer                           :: ndims
+
+ cncid    = ncid
+ cvarid   = varid - 1 ! Subtract 1 to get C varid
+ cstart   = 0
+ ccounts  = 0
+ cstrides = 1
+
+ cstat1 = nc_inq_varndims(cncid, cvarid, cndims)
+
+ cstartptr   = C_NULL_PTR
+ ccountsptr  = C_NULL_PTR
+ cstridesptr = C_NULL_PTR
+ ndims       = cndims
+
+ If (cstat1 == NC_NOERR) Then
+   If (ndims > 0) Then ! Flip arrays to C order and subtract 1 from start
+     cstart(1:ndims)   = start(ndims:1:-1)-1
+     ccounts(1:ndims)  = counts(ndims:1:-1)
+     cstrides(1:ndims) = strides(ndims:1:-1)
+   EndIf
+   cstartptr   = C_LOC(cstart)
+   ccountsptr  = C_LOC(ccounts)
+   cstridesptr = C_LOC(cstrides)
+ EndIf
+
+ cstatus = nc_put_vars_text(cncid, cvarid, cstartptr, ccountsptr, &
+                            cstridesptr, text)
+ status = cstatus
+
+ End Function nf_put_vars_text_a
+!--------------------------------- nf_put_vars_int1 ------------------------
+ Function nf_put_vars_int1(ncid, varid, start, counts, strides, i1vals) &
+                           RESULT(status)
+
+! Write out 8 bit integer array given start, count, and stride
+
+ USE netcdf_nc_interfaces
+
+ Implicit NONE
+
+ Integer,              Intent(IN) :: ncid, varid
+ Integer,              Intent(IN) :: start(*), counts(*), strides(*)
+ Integer(KIND=NFINT1), Intent(IN) :: i1vals(*)
+
+ Integer                          :: status
+
+ Integer(KIND=C_INT)               :: cncid, cvarid, cndims, cstat1, cstatus
+ Integer(KIND=C_SIZE_T),    TARGET :: cstart(NC_MAX_DIMS), ccounts(NC_MAX_DIMS)
+ Integer(KIND=C_PTRDIFF_T), TARGET :: cstrides(NC_MAX_DIMS)
+ Type(C_PTR)                       :: cstartptr, ccountsptr, cstridesptr
+ Integer                           :: ndims
+
+ If (C_SIGNED_CHAR < 0) Then ! schar not supported by processor
+   status = NC_EBADTYPE
+   RETURN
+ EndIf
+
+ cncid    = ncid
+ cvarid   = varid - 1 ! Subtract 1 to get C varid
+ cstart   = 0
+ ccounts  = 0
+ cstrides = 1
+
+ cstat1 = nc_inq_varndims(cncid, cvarid, cndims)
+
+ cstartptr   = C_NULL_PTR
+ ccountsptr  = C_NULL_PTR
+ cstridesptr = C_NULL_PTR
+ ndims       = cndims
+
+ If (cstat1 == NC_NOERR) Then
+   If (ndims > 0) Then ! Flip arrays to C order and subtract 1 from start
+     cstart(1:ndims)   = start(ndims:1:-1)-1
+     ccounts(1:ndims)  = counts(ndims:1:-1)
+     cstrides(1:ndims) = strides(ndims:1:-1)
+   EndIf
+   cstartptr   = C_LOC(cstart)
+   ccountsptr  = C_LOC(ccounts)
+   cstridesptr = C_LOC(cstrides)
+ EndIf
+
+#if NF_INT1_IS_C_SIGNED_CHAR
+ cstatus = nc_put_vars_schar(cncid, cvarid, cstartptr, ccountsptr, &
+                             cstridesptr, i1vals)
+#elif NF_INT1_IS_C_SHORT
+ cstatus = nc_put_vars_short(cncid, cvarid, cstartptr, ccountsptr, &
+                             cstridesptr, i1vals)
+#elif NF_INT1_IS_C_INT
+ cstatus = nc_put_vars_int(cncid, cvarid, cstartptr, ccountsptr, &
+                           cstridesptr, i1vals)
+#elif NF_INT1_IS_C_LONG
+ cstatus = nc_put_vars_long(cncid, cvarid, cstartptr, ccountsptr, &
+                            cstridesptr, i1vals)
+#endif
+
+ status = cstatus
+
+ End Function nf_put_vars_int1
+!--------------------------------- nf_put_vars_int2 ------------------------
+ Function nf_put_vars_int2(ncid, varid, start, counts, strides, i2vals) &
+                              RESULT(status)
+
+! Write out 16 bit integer array given start, count, and stride
+
+ USE netcdf_nc_interfaces
+
+ Implicit NONE
+
+ Integer,              Intent(IN) :: ncid, varid
+ Integer,              Intent(IN) :: start(*), counts(*), strides(*)
+ Integer(KIND=NFINT2), Intent(IN) :: i2vals(*)
+
+ Integer                          :: status
+
+ Integer(KIND=C_INT)               :: cncid, cvarid, cndims, cstat1, cstatus
+ Integer(KIND=C_SIZE_T),    TARGET :: cstart(NC_MAX_DIMS), ccounts(NC_MAX_DIMS)
+ Integer(KIND=C_PTRDIFF_T), TARGET :: cstrides(NC_MAX_DIMS)
+ Type(C_PTR)                       :: cstartptr, ccountsptr, cstridesptr
+ Integer                           :: ndims
+
+ If (C_SHORT < 0) Then ! short not supported by processor
+   status = NC_EBADTYPE
+   RETURN
+ EndIf
+
+ cncid    = ncid
+ cvarid   = varid - 1 ! Subtract 1 to get C varid
+ cstart   = 0
+ ccounts  = 0
+ cstrides = 1
+
+ cstat1 = nc_inq_varndims(cncid, cvarid, cndims)
+
+ cstartptr   = C_NULL_PTR
+ ccountsptr  = C_NULL_PTR
+ cstridesptr = C_NULL_PTR
+ ndims       = cndims
+
+ If (cstat1 == NC_NOERR) Then
+   If (ndims > 0) Then ! Flip arrays to C order and subtract 1 from start
+     cstart(1:ndims)   = start(ndims:1:-1)-1
+     ccounts(1:ndims)  = counts(ndims:1:-1)
+     cstrides(1:ndims) = strides(ndims:1:-1)
+   EndIf
+   cstartptr   = C_LOC(cstart)
+   ccountsptr  = C_LOC(ccounts)
+   cstridesptr = C_LOC(cstrides)
+ EndIf
+
+#if NF_INT2_IS_C_SHORT
+ cstatus = nc_put_vars_short(cncid, cvarid, cstartptr, ccountsptr, &
+                             cstridesptr, i2vals)
+#elif NF_INT2_IS_C_INT
+ cstatus = nc_put_vars_int(cncid, cvarid, cstartptr, ccountsptr, &
+                           cstridesptr, i2vals)
+#elif NF_INT2_IS_C_LONG
+ cstatus = nc_put_vars_long(cncid, cvarid, cstartptr, ccountsptr, &
+                            cstridesptr, i2vals)
+#endif
+
+ status = cstatus
+
+ End Function nf_put_vars_int2
+!--------------------------------- nf_put_vars_int -------------------------
+ Function nf_put_vars_int(ncid, varid, start, counts, strides, ivals) &
+                             RESULT(status)
+
+! Write out default integer array given start, count, and stride
+
+ USE netcdf_nc_interfaces
+
+ Implicit NONE
+
+ Integer,        Intent(IN) :: ncid, varid
+ Integer,        Intent(IN) :: start(*), counts(*), strides(*)
+ Integer(NFINT), Intent(IN) :: ivals(*)
+
+ Integer                    :: status
+
+ Integer(KIND=C_INT)               :: cncid, cvarid, cndims, cstat1, cstatus
+ Integer(KIND=C_SIZE_T),    TARGET :: cstart(NC_MAX_DIMS), ccounts(NC_MAX_DIMS)
+ Integer(KIND=C_PTRDIFF_T), TARGET :: cstrides(NC_MAX_DIMS)
+ Type(C_PTR)                       :: cstartptr, ccountsptr, cstridesptr
+ Integer                           :: ndims
+
+ cncid    = ncid
+ cvarid   = varid - 1 ! Subtract 1 to get C varid
+ cstart   = 0
+ ccounts  = 0
+ cstrides = 1
+
+ cstat1 = nc_inq_varndims(cncid, cvarid, cndims)
+
+ cstartptr   = C_NULL_PTR
+ ccountsptr  = C_NULL_PTR
+ cstridesptr = C_NULL_PTR
+ ndims       = cndims
+
+ If (cstat1 == NC_NOERR) Then
+   If (ndims > 0) Then ! Flip arrays to C order and subtract 1 from start
+     cstart(1:ndims)   = start(ndims:1:-1)-1
+     ccounts(1:ndims)  = counts(ndims:1:-1)
+     cstrides(1:ndims) = strides(ndims:1:-1)
+   EndIf
+   cstartptr   = C_LOC(cstart)
+   ccountsptr  = C_LOC(ccounts)
+   cstridesptr = C_LOC(cstrides)
+ EndIf
+
+#if NF_INT_IS_C_INT
+ cstatus = nc_put_vars_int(cncid, cvarid, cstartptr, ccountsptr, &
+                           cstridesptr, ivals)
+#elif NF_INT_IS_C_LONG
+ cstatus = nc_put_vars_long(cncid, cvarid, cstartptr, ccountsptr, &
+                            cstridesptr, ivals)
+#endif
+
+ status = cstatus
+
+ End Function nf_put_vars_int
+!--------------------------------- nf_put_vars_real ------------------------
+ Function nf_put_vars_real(ncid, varid, start, counts, strides, rvals) &
+                              RESULT(status)
+
+! Write out 32 bit real array given start, count, and stride
+
+ USE netcdf_nc_interfaces
+
+ Implicit NONE
+
+ Integer,      Intent(IN) :: ncid, varid
+ Integer,      Intent(IN) :: start(*), counts(*), strides(*)
+ Real(NFREAL), Intent(IN) :: rvals(*)
+
+ Integer                  :: status
+
+ Integer(KIND=C_INT)               :: cncid, cvarid, cndims, cstat1, cstatus
+ Integer(KIND=C_SIZE_T),    TARGET :: cstart(NC_MAX_DIMS), ccounts(NC_MAX_DIMS)
+ Integer(KIND=C_PTRDIFF_T), TARGET :: cstrides(NC_MAX_DIMS)
+ Type(C_PTR)                       :: cstartptr, ccountsptr, cstridesptr
+ Integer                           :: ndims
+
+ cncid    = ncid
+ cvarid   = varid - 1 ! Subtract 1 to get C varid
+ cstart   = 0
+ ccounts  = 0
+ cstrides = 1
+
+ cstat1 = nc_inq_varndims(cncid, cvarid, cndims)
+
+ cstartptr   = C_NULL_PTR
+ ccountsptr  = C_NULL_PTR
+ cstridesptr = C_NULL_PTR
+ ndims       = cndims
+
+ If (cstat1 == NC_NOERR) Then
+   If (ndims > 0) Then ! Flip arrays to C order and subtract 1 from start
+     cstart(1:ndims)   = start(ndims:1:-1)-1
+     ccounts(1:ndims)  = counts(ndims:1:-1)
+     cstrides(1:ndims) = strides(ndims:1:-1)
+   EndIf
+   cstartptr   = C_LOC(cstart)
+   ccountsptr  = C_LOC(ccounts)
+   cstridesptr = C_LOC(cstrides)
+ EndIf
+
+#if NF_REAL_IS_C_DOUBLE
+ cstatus = nc_put_vars_double(cncid, cvarid, cstartptr, ccountsptr, &
+                              cstridesptr, rvals)
+#else
+ cstatus = nc_put_vars_float(cncid, cvarid, cstartptr, ccountsptr, &
+                             cstridesptr, rvals)
+#endif
+
+ status = cstatus
+
+ End Function nf_put_vars_real
+!--------------------------------- nf_put_vars_double ----------------------
+ Function nf_put_vars_double(ncid, varid, start, counts, strides, dvals) &
+                               RESULT(status)
+
+! Write out 64 bit real array given start, count, and stride
+
+ USE netcdf_nc_interfaces
+
+ Implicit NONE
+
+ Integer,   Intent(IN) :: ncid, varid
+ Integer,   Intent(IN) :: start(*), counts(*), strides(*)
+ Real(RK8), Intent(IN) :: dvals(*)
+
+ Integer               :: status
+
+ Integer(KIND=C_INT)               :: cncid, cvarid, cndims, cstat1, cstatus
+ Integer(KIND=C_SIZE_T),    TARGET :: cstart(NC_MAX_DIMS), ccounts(NC_MAX_DIMS)
+ Integer(KIND=C_PTRDIFF_T), TARGET :: cstrides(NC_MAX_DIMS)
+ Type(C_PTR)                       :: cstartptr, ccountsptr, cstridesptr
+ Integer                           :: ndims
+
+ cncid    = ncid
+ cvarid   = varid - 1 ! Subtract 1 to get C varid
+ cstart   = 0
+ ccounts  = 0
+ cstrides = 1
+
+ cstat1 = nc_inq_varndims(cncid, cvarid, cndims)
+
+ cstartptr   = C_NULL_PTR
+ ccountsptr  = C_NULL_PTR
+ cstridesptr = C_NULL_PTR
+ ndims       = cndims
+
+ If (cstat1 == NC_NOERR) Then
+   If (ndims > 0) Then ! Flip arrays to C order and subtract 1 from start
+     cstart(1:ndims)   = start(ndims:1:-1)-1
+     ccounts(1:ndims)  = counts(ndims:1:-1)
+     cstrides(1:ndims) = strides(ndims:1:-1)
+   EndIf
+   cstartptr   = C_LOC(cstart)
+   ccountsptr  = C_LOC(ccounts)
+   cstridesptr = C_LOC(cstrides)
+ EndIf
+
+ cstatus = nc_put_vars_double(cncid, cvarid, cstartptr, ccountsptr, &
+                              cstridesptr, dvals)
+
+ status = cstatus
+
+ End Function nf_put_vars_double
+!--------------------------------- nf_put_vars -----------------------------
+ Function nf_put_vars(ncid, varid, start, counts, strides, values) &
+                      RESULT(status)
+
+! Write out a variable of any type. We use a C interop character string to
+! hold the values. Therefore, an explicit interface to nf_put_vars should NOT
+! be used in the calling program. Just use external 
+
+ USE netcdf_nc_interfaces
+
+ Implicit NONE
+
+ Integer,                Intent(IN)         :: ncid, varid
+ Integer,                Intent(IN)         :: start(*), counts(*), strides(*)
+ Character(KIND=C_CHAR), Intent(IN), TARGET :: values(*) 
+! Type(C_PTR),            VALUE              :: values
+ Integer                                    :: status
+
+ Integer(KIND=C_INT)               :: cncid, cvarid, cndims, cstat1, cstatus
+ Integer(KIND=C_SIZE_T),    TARGET :: cstart(NC_MAX_DIMS), ccounts(NC_MAX_DIMS)
+ Integer(KIND=C_PTRDIFF_T), TARGET :: cstrides(NC_MAX_DIMS)
+ Type(C_PTR)                       :: cstartptr, ccountsptr, cstridesptr, &
+                                      cvaluesptr
+! Type(C_PTR)                       :: cstartptr, ccountsptr, cstridesptr
+ Integer                           :: ndims
+
+ cncid    = ncid
+ cvarid   = varid - 1 ! Subtract 1 to get C varid
+ cstart   = 0
+ ccounts  = 0
+ cstrides = 1
+
+ cstat1 = nc_inq_varndims(cncid, cvarid, cndims)
+
+ cstartptr   = C_NULL_PTR
+ ccountsptr  = C_NULL_PTR
+ cstridesptr = C_NULL_PTR
+ ndims       = cndims
+
+ If (cstat1 == NC_NOERR) Then
+   If (ndims > 0) Then ! Flip arrays to C order and subtract 1 from start
+     cstart(1:ndims)   = start(ndims:1:-1)-1
+     ccounts(1:ndims)  = counts(ndims:1:-1)
+     cstrides(1:ndims) = strides(ndims:1:-1)
+   EndIf
+   cstartptr   = C_LOC(cstart)
+   ccountsptr  = C_LOC(ccounts)
+   cstridesptr = C_LOC(cstrides)
+ EndIf
+
+ cvaluesptr = C_LOC(values)
+
+ cstatus = nc_put_vars(cncid, cvarid, cstartptr, ccountsptr, &
+                       cstridesptr, cvaluesptr)
+! cstatus = nc_put_vars(cncid, cvarid, cstartptr, ccountsptr, &
+!                       cstridesptr, values)
+
+ status = cstatus
+
+ End Function nf_put_vars
+!--------------------------------- nf_get_vars_text ----------------------
+ Function nf_get_vars_text(ncid, varid, start, counts, strides, text) &
+                                RESULT(status)
+
+! Read in a character string from  dataset
+
+ USE netcdf_nc_interfaces
+
+ Implicit NONE
+
+ Integer,          Intent(IN)  :: ncid, varid
+ Integer,          Intent(IN)  :: start(*), counts(*), strides(*)
+ Character(LEN=*), Intent(OUT) :: text 
+
+ Integer                       :: status
+
+ Integer(KIND=C_INT)               :: cncid, cvarid, cndims, cstat1, cstatus
+ Integer(KIND=C_SIZE_T),    TARGET :: cstart(NC_MAX_DIMS), ccounts(NC_MAX_DIMS)
+ Integer(KIND=C_PTRDIFF_T), TARGET :: cstrides(NC_MAX_DIMS)
+ Type(C_PTR)                       :: cstartptr, ccountsptr, cstridesptr
+ Integer                           :: ndims
+
+ cncid    = ncid
+ cvarid   = varid - 1 ! Subtract 1 to get C varid
+ cstart   = 0
+ ccounts  = 0
+ cstrides = 1
+ text     = REPEAT(" ", LEN(text))
+
+ cstat1 = nc_inq_varndims(cncid, cvarid, cndims)
+
+ cstartptr   = C_NULL_PTR
+ ccountsptr  = C_NULL_PTR
+ cstridesptr = C_NULL_PTR
+ ndims       = cndims
+
+ If (cstat1 == NC_NOERR) Then
+   If (ndims > 0) Then ! Flip arrays to C order and subtract 1 from start
+     cstart(1:ndims)   = start(ndims:1:-1)-1
+     ccounts(1:ndims)  = counts(ndims:1:-1)
+     cstrides(1:ndims) = strides(ndims:1:-1)
+   EndIf
+   cstartptr   = C_LOC(cstart)
+   ccountsptr  = C_LOC(ccounts)
+   cstridesptr = C_LOC(cstrides)
+ EndIf
+
+ cstatus = nc_get_vars_text(cncid, cvarid, cstartptr, ccountsptr, &
+                            cstridesptr, text)
+
+ status = cstatus
+
+ End Function nf_get_vars_text
+!--------------------------------- nf_get_vars_text_a ----------------------
+ Function nf_get_vars_text_a(ncid, varid, start, counts, strides, text) &
+                                RESULT(status)
+
+! Read in an array of characters given start, count, and stride
+
+ USE netcdf_nc_interfaces
+
+ Implicit NONE
+
+ Integer,          Intent(IN)  :: ncid, varid
+ Integer,          Intent(IN)  :: start(*), counts(*), strides(*)
+ Character(LEN=1), Intent(OUT) :: text(*)
+
+ Integer                       :: status
+
+ Integer(KIND=C_INT)               :: cncid, cvarid, cndims, cstat1, cstatus
+ Integer(KIND=C_SIZE_T),    TARGET :: cstart(NC_MAX_DIMS), ccounts(NC_MAX_DIMS)
+ Integer(KIND=C_PTRDIFF_T), TARGET :: cstrides(NC_MAX_DIMS)
+ Type(C_PTR)                       :: cstartptr, ccountsptr, cstridesptr
+ Integer                           :: ndims
+
+ cncid    = ncid
+ cvarid   = varid - 1 ! Subtract 1 to get C varid
+ cstart   = 0
+ ccounts  = 0
+ cstrides = 1
+
+ cstat1 = nc_inq_varndims(cncid, cvarid, cndims)
+
+ cstartptr   = C_NULL_PTR
+ ccountsptr  = C_NULL_PTR
+ cstridesptr = C_NULL_PTR
+ ndims       = cndims
+
+ If (cstat1 == NC_NOERR) Then
+   If (ndims > 0) Then ! Flip arrays to C order and subtract 1 from start
+     cstart(1:ndims)   = start(ndims:1:-1)-1
+     ccounts(1:ndims)  = counts(ndims:1:-1)
+     cstrides(1:ndims) = strides(ndims:1:-1)
+   EndIf
+
+   cstartptr   = C_LOC(cstart)
+   ccountsptr  = C_LOC(ccounts)
+   cstridesptr = C_LOC(cstrides)
+ EndIf
+
+ cstatus = nc_get_vars_text(cncid, cvarid, cstartptr, ccountsptr, &
+                            cstridesptr, text)
+
+ status = cstatus
+
+ End Function nf_get_vars_text_a
+!--------------------------------- nf_get_vars_int1 ------------------------
+ Function nf_get_vars_int1(ncid, varid, start, counts, strides, i1vals) &
+                              RESULT(status)
+
+! Read in 8 bit integer array given start, count, and stride
+
+ USE netcdf_nc_interfaces
+
+ Implicit NONE
+
+ Integer,              Intent(IN)  :: ncid, varid
+ Integer,              Intent(IN)  :: start(*), counts(*), strides(*)
+ Integer(KIND=NFINT1), Intent(OUT) :: i1vals(*)
+
+ Integer                           :: status
+
+ Integer(KIND=C_INT)               :: cncid, cvarid, cndims, cstat1, cstatus
+ Integer(KIND=C_SIZE_T),    TARGET :: cstart(NC_MAX_DIMS), ccounts(NC_MAX_DIMS)
+ Integer(KIND=C_PTRDIFF_T), TARGET :: cstrides(NC_MAX_DIMS)
+ Type(C_PTR)                       :: cstartptr, ccountsptr, cstridesptr
+ Integer                           :: ndims
+
+ If (C_SIGNED_CHAR < 0) Then ! schar not supported by processor
+   status = NC_EBADTYPE
+   RETURN
+ EndIf
+
+ cncid    = ncid
+ cvarid   = varid - 1 ! Subtract 1 to get C varid
+ cstart   = 0
+ ccounts  = 0
+ cstrides = 1
+
+ cstat1 = nc_inq_varndims(cncid, cvarid, cndims)
+
+ cstartptr   = C_NULL_PTR
+ ccountsptr  = C_NULL_PTR
+ cstridesptr = C_NULL_PTR
+ ndims       = cndims
+
+ If (cstat1 == NC_NOERR) Then
+   If (ndims > 0) Then ! Flip arrays to C order and subtract 1 from start
+     cstart(1:ndims)   = start(ndims:1:-1)-1
+     ccounts(1:ndims)  = counts(ndims:1:-1)
+     cstrides(1:ndims) = strides(ndims:1:-1)
+   EndIf
+   cstartptr   = C_LOC(cstart)
+   ccountsptr  = C_LOC(ccounts)
+   cstridesptr = C_LOC(cstrides)
+ EndIf
+
+#if NF_INT1_IS_C_SIGNED_CHAR
+ cstatus = nc_get_vars_schar(cncid, cvarid, cstartptr, ccountsptr, &
+                             cstridesptr, i1vals)
+#elif NF_INT1_IS_C_SHORT
+ cstatus = nc_get_vars_short(cncid, cvarid, cstartptr, ccountsptr, &
+                             cstridesptr, i1vals)
+#elif NF_INT1_IS_C_INT
+ cstatus = nc_get_vars_int(cncid, cvarid, cstartptr, ccountsptr, &
+                            cstridesptr, i1vals)
+#elif NF_INT1_IS_C_LONG
+ cstatus = nc_get_vars_long(cncid, cvarid, cstartptr, ccountsptr, &
+                             cstridesptr, i1vals)
+#endif
+
+ status = cstatus
+
+ End Function nf_get_vars_int1
+!--------------------------------- nf_get_vars_int2 ------------------------
+ Function nf_get_vars_int2(ncid, varid, start, counts, strides, i2vals) &
+                              RESULT(status)
+
+! Read in 16 bit integer array given start, count, and stride
+
+ USE netcdf_nc_interfaces
+
+ Implicit NONE
+
+ Integer,              Intent(IN)  :: ncid, varid
+ Integer,              Intent(IN)  :: start(*), counts(*), strides(*)
+ Integer(KIND=NFINT2), Intent(OUT) :: i2vals(*)
+
+ Integer                           :: status
+
+ Integer(KIND=C_INT)               :: cncid, cvarid, cndims, cstat1, cstatus
+ Integer(KIND=C_SIZE_T),    TARGET :: cstart(NC_MAX_DIMS), ccounts(NC_MAX_DIMS)
+ Integer(KIND=C_PTRDIFF_T), TARGET :: cstrides(NC_MAX_DIMS)
+ Type(C_PTR)                       :: cstartptr, ccountsptr, cstridesptr
+ Integer                           :: ndims
+
+ If (C_SHORT < 0) Then ! short not supported by processor
+   status = NC_EBADTYPE
+   RETURN
+ EndIf
+
+ cncid    = ncid
+ cvarid   = varid - 1 ! Subtract 1 to get C varid
+ cstart   = 0
+ ccounts  = 0
+ cstrides = 1
+
+ cstat1 = nc_inq_varndims(cncid, cvarid, cndims)
+
+ cstartptr   = C_NULL_PTR
+ ccountsptr  = C_NULL_PTR
+ cstridesptr = C_NULL_PTR
+ ndims       = cndims
+
+ If (cstat1 == NC_NOERR) Then
+   If (ndims > 0) Then ! Flip arrays to C order and subtract 1 from start
+     cstart(1:ndims)   = start(ndims:1:-1)-1
+     ccounts(1:ndims)  = counts(ndims:1:-1)
+     cstrides(1:ndims) = strides(ndims:1:-1)
+   EndIf
+   cstartptr   = C_LOC(cstart)
+   ccountsptr  = C_LOC(ccounts)
+   cstridesptr = C_LOC(cstrides)
+ EndIf
+
+#if NF_INT2_IS_C_SHORT
+ cstatus = nc_get_vars_short(cncid, cvarid, cstartptr, ccountsptr, &
+                             cstridesptr, i2vals)
+#elif NF_INT2_IS_C_INT
+ cstatus = nc_get_vars_int(cncid, cvarid, cstartptr, ccountsptr, &
+                           cstridesptr, i2vals)
+#elif NF_INT2_IS_C_LONG
+ cstatus = nc_get_vars_long(cncid, cvarid, cstartptr, ccountsptr, &
+                            cstridesptr, i2vals)
+#endif
+
+ status = cstatus
+
+ End Function nf_get_vars_int2
+!--------------------------------- nf_get_vars_int -------------------------
+ Function nf_get_vars_int(ncid, varid, start, counts, strides, ivals) &
+                             RESULT(status)
+
+! Read in default integer array given start, count, and stride
+
+ USE netcdf_nc_interfaces
+
+ Implicit NONE
+
+ Integer,        Intent(IN)  :: ncid, varid
+ Integer,        Intent(IN)  :: start(*), counts(*), strides(*)
+ Integer(NFINT), Intent(OUT) :: ivals(*)
+
+ Integer                     :: status
+
+ Integer(KIND=C_INT)               :: cncid, cvarid, cndims, cstat1, cstatus
+ Integer(KIND=C_SIZE_T),    TARGET :: cstart(NC_MAX_DIMS), ccounts(NC_MAX_DIMS)
+ Integer(KIND=C_PTRDIFF_T), TARGET :: cstrides(NC_MAX_DIMS)
+ Type(C_PTR)                       :: cstartptr, ccountsptr, cstridesptr
+ Integer :: ndims
+
+ cncid    = ncid
+ cvarid   = varid - 1 ! Subtract 1 to get C varid
+ cstart   = 0
+ ccounts  = 0
+ cstrides = 1
+
+ cstat1 = nc_inq_varndims(cncid, cvarid, cndims)
+
+ cstartptr   = C_NULL_PTR
+ ccountsptr  = C_NULL_PTR
+ cstridesptr = C_NULL_PTR
+ ndims       = cndims
+
+ If (cstat1 == NC_NOERR) Then
+   If (ndims > 0) Then ! Flip arrays to C order and subtract 1 from start
+     cstart(1:ndims)   = start(ndims:1:-1)-1
+     ccounts(1:ndims)  = counts(ndims:1:-1)
+     cstrides(1:ndims) = strides(ndims:1:-1)
+   EndIf
+   cstartptr   = C_LOC(cstart)
+   ccountsptr  = C_LOC(ccounts)
+   cstridesptr = C_LOC(cstrides)
+ EndIf
+
+#if NF_INT_IS_C_INT
+ cstatus = nc_get_vars_int(cncid, cvarid, cstartptr, ccountsptr, &
+                           cstridesptr, ivals)
+#elif NF_INT_IS_C_LONG
+ cstatus = nc_get_vars_long(cncid, cvarid, cstartptr, ccountsptr, &
+                            cstridesptr, ivals)
+#endif
+
+ status = cstatus
+
+ End Function nf_get_vars_int
+!--------------------------------- nf_get_vars_real ------------------------
+ Function nf_get_vars_real(ncid, varid, start, counts, strides, rvals) &
+                              RESULT(status)
+
+! Read in 32 bit real array given start, count, and stride
+
+ USE netcdf_nc_interfaces
+
+ Implicit NONE
+
+ Integer,      Intent(IN)  :: ncid, varid
+ Integer,      Intent(IN)  :: start(*), counts(*), strides(*)
+ Real(NFREAL), Intent(OUT) :: rvals(*)
+
+ Integer                   :: status
+
+ Integer(KIND=C_INT)               :: cncid, cvarid, cndims, cstat1, cstatus
+ Integer(KIND=C_SIZE_T),    TARGET :: cstart(NC_MAX_DIMS), ccounts(NC_MAX_DIMS)
+ Integer(KIND=C_PTRDIFF_T), TARGET :: cstrides(NC_MAX_DIMS)
+ Type(C_PTR)                       :: cstartptr, ccountsptr, cstridesptr
+ Integer                           :: ndims
+
+ cncid    = ncid
+ cvarid   = varid - 1 ! Subtract 1 to get C varid
+ cstart   = 0
+ ccounts  = 0
+ cstrides = 1
+
+ cstat1 = nc_inq_varndims(cncid, cvarid, cndims)
+
+ cstartptr   = C_NULL_PTR
+ ccountsptr  = C_NULL_PTR
+ cstridesptr = C_NULL_PTR
+ ndims       = cndims
+
+ If (cstat1 == NC_NOERR) Then
+   If (ndims > 0) Then ! Flip arrays to C order and subtract 1 from start
+     cstart(1:ndims)   = start(ndims:1:-1)-1
+     ccounts(1:ndims)  = counts(ndims:1:-1)
+     cstrides(1:ndims) = strides(ndims:1:-1)
+   EndIf
+   cstartptr   = C_LOC(cstart)
+   ccountsptr  = C_LOC(ccounts)
+   cstridesptr = C_LOC(cstrides)
+ EndIf
+
+#if NF_REAL_IS_C_DOUBLE
+ cstatus = nc_get_vars_double(cncid, cvarid, cstartptr, ccountsptr, &
+                              cstridesptr, rvals)
+#else
+ cstatus = nc_get_vars_float(cncid, cvarid, cstartptr, ccountsptr, &
+                             cstridesptr, rvals)
+#endif
+
+ status = cstatus
+
+ End Function nf_get_vars_real
+!--------------------------------- nf_get_vars_double ----------------------
+ Function nf_get_vars_double(ncid, varid, start, counts, strides, dvals) &
+                                RESULT(status)
+
+! Read in 64 bit real array given start, count, and stride
+
+ USE netcdf_nc_interfaces
+
+ Implicit NONE
+
+ Integer,   Intent(IN)  :: ncid, varid
+ Integer,   Intent(IN)  :: start(*), counts(*), strides(*)
+ Real(RK8), Intent(OUT) :: dvals(*)
+
+ Integer                :: status
+
+ Integer(KIND=C_INT)               :: cncid, cvarid, cndims, cstat1, cstatus
+ Integer(KIND=C_SIZE_T),    TARGET :: cstart(NC_MAX_DIMS), ccounts(NC_MAX_DIMS)
+ Integer(KIND=C_PTRDIFF_T), TARGET :: cstrides(NC_MAX_DIMS)
+ Type(C_PTR)                       :: cstartptr, ccountsptr, cstridesptr
+ Integer                           :: ndims
+
+ cncid    = ncid
+ cvarid   = varid - 1 ! Subtract 1 to get C varid
+ cstart   = 0
+ ccounts  = 0
+ cstrides = 1
+
+ cstat1 = nc_inq_varndims(cncid, cvarid, cndims)
+
+ cstartptr   = C_NULL_PTR
+ ccountsptr  = C_NULL_PTR
+ cstridesptr = C_NULL_PTR
+ ndims       = cndims
+
+ If (cstat1 == NC_NOERR) Then
+   If (ndims > 0) Then ! Flip arrays to C order and subtract 1 from start
+     cstart(1:ndims)   = start(ndims:1:-1)-1
+     ccounts(1:ndims)  = counts(ndims:1:-1)
+     cstrides(1:ndims) = strides(ndims:1:-1)
+   EndIf
+   cstartptr   = C_LOC(cstart)
+   ccountsptr  = C_LOC(ccounts)
+   cstridesptr = C_LOC(cstrides)
+ EndIf
+
+ cstatus = nc_get_vars_double(cncid, cvarid, cstartptr, ccountsptr, &
+                              cstridesptr, dvals)
+
+ status = cstatus
+
+ End Function nf_get_vars_double
+!--------------------------------- nf_get_vars ----------------------------
+ Function nf_get_vars(ncid, varid, start, counts, strides, values) &
+                      RESULT(status)
+
+! Read in a variable of any type. We use a C interop character string to
+! hold the values. Therefore, an explicit interface to nf_put_vars should NOT
+! be used in the calling program. Just use external 
+
+ USE netcdf_nc_interfaces
+
+ Implicit NONE
+
+ Integer,                Intent(IN)    :: ncid, varid
+ Integer,                Intent(IN)    :: start(*), counts(*), strides(*)
+ Character(KIND=C_CHAR), Intent(INOUT) :: values
+! Type(C_PTR)             VALUE         :: values
+
+ Integer                               :: status
+
+ Integer(KIND=C_INT)               :: cncid, cvarid, cndims, cstat1, cstatus
+ Integer(KIND=C_SIZE_T),    TARGET :: cstart(NC_MAX_DIMS), ccounts(NC_MAX_DIMS)
+ Integer(KIND=C_PTRDIFF_T), TARGET :: cstrides(NC_MAX_DIMS)
+ Type(C_PTR)                       :: cstartptr, ccountsptr, cstridesptr
+ Integer                           :: ndims
+
+ cncid    = ncid
+ cvarid   = varid - 1 ! Subtract 1 to get C varid
+ cstart   = 0
+ ccounts  = 0
+ cstrides = 1
+
+ cstat1 = nc_inq_varndims(cncid, cvarid, cndims)
+
+ cstartptr   = C_NULL_PTR
+ ccountsptr  = C_NULL_PTR
+ cstridesptr = C_NULL_PTR
+ ndims       = cndims
+
+ If (cstat1 == NC_NOERR) Then
+   If (ndims > 0) Then ! Flip arrays to C order and subtract 1 from start
+     cstart(1:ndims)   = start(ndims:1:-1)-1
+     ccounts(1:ndims)  = counts(ndims:1:-1)
+     cstrides(1:ndims) = strides(ndims:1:-1)
+   EndIf
+   cstartptr   = C_LOC(cstart)
+   ccountsptr  = C_LOC(ccounts)
+   cstridesptr = C_LOC(cstrides)
+ EndIf
+
+ cstatus = nc_get_vars(cncid, cvarid, cstartptr, ccountsptr, &
+                       cstridesptr, values)
+
+ status = cstatus
+
+ End Function nf_get_vars
diff --git a/fortran/typeSizes.f90 b/fortran/typeSizes.f90
new file mode 100644
index 0000000..3b2b958
--- /dev/null
+++ b/fortran/typeSizes.f90
@@ -0,0 +1,65 @@
+! Description:
+!   Provide named kind parameters for use in declarations of real and integer 
+!    variables with specific byte sizes (i.e. one, two, four, and eight byte
+!    integers; four and eight byte reals). The parameters can then be used
+!    in (KIND = XX) modifiers in declarations.
+!   A single function (byteSizesOK()) is provided to ensure that the selected 
+!    kind parameters are correct.
+!  
+! Input Parameters:
+!   None.
+!
+! Output Parameters:
+!   Public parameters, fixed at compile time:
+!     OneByteInt, TwoByteInt, FourByteInt, EightByteInt
+!                                     FourByteReal, EightByteRadl
+!
+! References and Credits:
+!   Written by
+!    Robert Pincus
+!    Cooperative Institue for Meteorological Satellite Studies
+!    University of Wisconsin - Madison
+!    1225 W. Dayton St. 
+!    Madison, Wisconsin 53706
+!    Robert.Pincus at ssec.wisc.edu
+!
+! Design Notes:
+!   Fortran 90 doesn't allow one to check the number of bytes in a real variable;
+!     we check only that four byte and eight byte reals have different kind parameters. 
+!
+module typeSizes
+  implicit none
+  public
+  integer, parameter ::   OneByteInt = selected_int_kind(2), &
+                          TwoByteInt = selected_int_kind(4), &
+                         FourByteInt = selected_int_kind(9), &
+                        EightByteInt = selected_int_kind(18)
+
+  integer, parameter ::                                          &
+                        FourByteReal = selected_real_kind(P =  6, R =  37), &
+                       EightByteReal = selected_real_kind(P = 13, R = 307)
+contains
+  logical function byteSizesOK()
+  ! Users may call this function once to ensure that the kind parameters 
+  !   the module defines are available with the current compiler. 
+  ! We can't ensure that the two REAL kinds are actually four and 
+  !   eight bytes long, but we can ensure that they are distinct. 
+  ! Early Fortran 90 compilers would sometimes report incorrect results for 
+  !   the bit_size intrinsic, but I haven't seen this in a long time. 
+
+    ! Local variables
+    integer (kind =  OneByteInt)  :: One
+    integer (kind =  TwoByteInt)  :: Two
+    integer (kind = FourByteInt)  :: Four
+    integer (kind = EightByteInt) :: Eight
+
+    if (bit_size( One) == 8  .and. bit_size( Two)   == 16 .and.  &
+        bit_size(Four) == 32 .and. bit_size( Eight) == 64 .and.  &
+        FourByteReal > 0 .and. EightByteReal > 0 .and. &
+        FourByteReal /= EightByteReal) then
+      byteSizesOK = .true.
+    else
+      byteSizesOK = .false.
+    end if
+  end function byteSizesOK
+end module typeSizes
diff --git a/install-sh b/install-sh
new file mode 100755
index 0000000..377bb86
--- /dev/null
+++ b/install-sh
@@ -0,0 +1,527 @@
+#!/bin/sh
+# install - install a program, script, or datafile
+
+scriptversion=2011-11-20.07; # UTC
+
+# This originates from X11R5 (mit/util/scripts/install.sh), which was
+# later released in X11R6 (xc/config/util/install.sh) with the
+# following copyright and license.
+#
+# Copyright (C) 1994 X Consortium
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to
+# deal in the Software without restriction, including without limitation the
+# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+# sell copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
+# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC-
+# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+# Except as contained in this notice, the name of the X Consortium shall not
+# be used in advertising or otherwise to promote the sale, use or other deal-
+# ings in this Software without prior written authorization from the X Consor-
+# tium.
+#
+#
+# FSF changes to this file are in the public domain.
+#
+# Calling this script install-sh is preferred over install.sh, to prevent
+# 'make' implicit rules from creating a file called install from it
+# when there is no Makefile.
+#
+# This script is compatible with the BSD install script, but was written
+# from scratch.
+
+nl='
+'
+IFS=" ""	$nl"
+
+# set DOITPROG to echo to test this script
+
+# Don't use :- since 4.3BSD and earlier shells don't like it.
+doit=${DOITPROG-}
+if test -z "$doit"; then
+  doit_exec=exec
+else
+  doit_exec=$doit
+fi
+
+# Put in absolute file names if you don't have them in your path;
+# or use environment vars.
+
+chgrpprog=${CHGRPPROG-chgrp}
+chmodprog=${CHMODPROG-chmod}
+chownprog=${CHOWNPROG-chown}
+cmpprog=${CMPPROG-cmp}
+cpprog=${CPPROG-cp}
+mkdirprog=${MKDIRPROG-mkdir}
+mvprog=${MVPROG-mv}
+rmprog=${RMPROG-rm}
+stripprog=${STRIPPROG-strip}
+
+posix_glob='?'
+initialize_posix_glob='
+  test "$posix_glob" != "?" || {
+    if (set -f) 2>/dev/null; then
+      posix_glob=
+    else
+      posix_glob=:
+    fi
+  }
+'
+
+posix_mkdir=
+
+# Desired mode of installed file.
+mode=0755
+
+chgrpcmd=
+chmodcmd=$chmodprog
+chowncmd=
+mvcmd=$mvprog
+rmcmd="$rmprog -f"
+stripcmd=
+
+src=
+dst=
+dir_arg=
+dst_arg=
+
+copy_on_change=false
+no_target_directory=
+
+usage="\
+Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE
+   or: $0 [OPTION]... SRCFILES... DIRECTORY
+   or: $0 [OPTION]... -t DIRECTORY SRCFILES...
+   or: $0 [OPTION]... -d DIRECTORIES...
+
+In the 1st form, copy SRCFILE to DSTFILE.
+In the 2nd and 3rd, copy all SRCFILES to DIRECTORY.
+In the 4th, create DIRECTORIES.
+
+Options:
+     --help     display this help and exit.
+     --version  display version info and exit.
+
+  -c            (ignored)
+  -C            install only if different (preserve the last data modification time)
+  -d            create directories instead of installing files.
+  -g GROUP      $chgrpprog installed files to GROUP.
+  -m MODE       $chmodprog installed files to MODE.
+  -o USER       $chownprog installed files to USER.
+  -s            $stripprog installed files.
+  -t DIRECTORY  install into DIRECTORY.
+  -T            report an error if DSTFILE is a directory.
+
+Environment variables override the default commands:
+  CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG
+  RMPROG STRIPPROG
+"
+
+while test $# -ne 0; do
+  case $1 in
+    -c) ;;
+
+    -C) copy_on_change=true;;
+
+    -d) dir_arg=true;;
+
+    -g) chgrpcmd="$chgrpprog $2"
+	shift;;
+
+    --help) echo "$usage"; exit $?;;
+
+    -m) mode=$2
+	case $mode in
+	  *' '* | *'	'* | *'
+'*	  | *'*'* | *'?'* | *'['*)
+	    echo "$0: invalid mode: $mode" >&2
+	    exit 1;;
+	esac
+	shift;;
+
+    -o) chowncmd="$chownprog $2"
+	shift;;
+
+    -s) stripcmd=$stripprog;;
+
+    -t) dst_arg=$2
+	# Protect names problematic for 'test' and other utilities.
+	case $dst_arg in
+	  -* | [=\(\)!]) dst_arg=./$dst_arg;;
+	esac
+	shift;;
+
+    -T) no_target_directory=true;;
+
+    --version) echo "$0 $scriptversion"; exit $?;;
+
+    --)	shift
+	break;;
+
+    -*)	echo "$0: invalid option: $1" >&2
+	exit 1;;
+
+    *)  break;;
+  esac
+  shift
+done
+
+if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then
+  # When -d is used, all remaining arguments are directories to create.
+  # When -t is used, the destination is already specified.
+  # Otherwise, the last argument is the destination.  Remove it from $@.
+  for arg
+  do
+    if test -n "$dst_arg"; then
+      # $@ is not empty: it contains at least $arg.
+      set fnord "$@" "$dst_arg"
+      shift # fnord
+    fi
+    shift # arg
+    dst_arg=$arg
+    # Protect names problematic for 'test' and other utilities.
+    case $dst_arg in
+      -* | [=\(\)!]) dst_arg=./$dst_arg;;
+    esac
+  done
+fi
+
+if test $# -eq 0; then
+  if test -z "$dir_arg"; then
+    echo "$0: no input file specified." >&2
+    exit 1
+  fi
+  # It's OK to call 'install-sh -d' without argument.
+  # This can happen when creating conditional directories.
+  exit 0
+fi
+
+if test -z "$dir_arg"; then
+  do_exit='(exit $ret); exit $ret'
+  trap "ret=129; $do_exit" 1
+  trap "ret=130; $do_exit" 2
+  trap "ret=141; $do_exit" 13
+  trap "ret=143; $do_exit" 15
+
+  # Set umask so as not to create temps with too-generous modes.
+  # However, 'strip' requires both read and write access to temps.
+  case $mode in
+    # Optimize common cases.
+    *644) cp_umask=133;;
+    *755) cp_umask=22;;
+
+    *[0-7])
+      if test -z "$stripcmd"; then
+	u_plus_rw=
+      else
+	u_plus_rw='% 200'
+      fi
+      cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;;
+    *)
+      if test -z "$stripcmd"; then
+	u_plus_rw=
+      else
+	u_plus_rw=,u+rw
+      fi
+      cp_umask=$mode$u_plus_rw;;
+  esac
+fi
+
+for src
+do
+  # Protect names problematic for 'test' and other utilities.
+  case $src in
+    -* | [=\(\)!]) src=./$src;;
+  esac
+
+  if test -n "$dir_arg"; then
+    dst=$src
+    dstdir=$dst
+    test -d "$dstdir"
+    dstdir_status=$?
+  else
+
+    # Waiting for this to be detected by the "$cpprog $src $dsttmp" command
+    # might cause directories to be created, which would be especially bad
+    # if $src (and thus $dsttmp) contains '*'.
+    if test ! -f "$src" && test ! -d "$src"; then
+      echo "$0: $src does not exist." >&2
+      exit 1
+    fi
+
+    if test -z "$dst_arg"; then
+      echo "$0: no destination specified." >&2
+      exit 1
+    fi
+    dst=$dst_arg
+
+    # If destination is a directory, append the input filename; won't work
+    # if double slashes aren't ignored.
+    if test -d "$dst"; then
+      if test -n "$no_target_directory"; then
+	echo "$0: $dst_arg: Is a directory" >&2
+	exit 1
+      fi
+      dstdir=$dst
+      dst=$dstdir/`basename "$src"`
+      dstdir_status=0
+    else
+      # Prefer dirname, but fall back on a substitute if dirname fails.
+      dstdir=`
+	(dirname "$dst") 2>/dev/null ||
+	expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	     X"$dst" : 'X\(//\)[^/]' \| \
+	     X"$dst" : 'X\(//\)$' \| \
+	     X"$dst" : 'X\(/\)' \| . 2>/dev/null ||
+	echo X"$dst" |
+	    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+		   s//\1/
+		   q
+		 }
+		 /^X\(\/\/\)[^/].*/{
+		   s//\1/
+		   q
+		 }
+		 /^X\(\/\/\)$/{
+		   s//\1/
+		   q
+		 }
+		 /^X\(\/\).*/{
+		   s//\1/
+		   q
+		 }
+		 s/.*/./; q'
+      `
+
+      test -d "$dstdir"
+      dstdir_status=$?
+    fi
+  fi
+
+  obsolete_mkdir_used=false
+
+  if test $dstdir_status != 0; then
+    case $posix_mkdir in
+      '')
+	# Create intermediate dirs using mode 755 as modified by the umask.
+	# This is like FreeBSD 'install' as of 1997-10-28.
+	umask=`umask`
+	case $stripcmd.$umask in
+	  # Optimize common cases.
+	  *[2367][2367]) mkdir_umask=$umask;;
+	  .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;;
+
+	  *[0-7])
+	    mkdir_umask=`expr $umask + 22 \
+	      - $umask % 100 % 40 + $umask % 20 \
+	      - $umask % 10 % 4 + $umask % 2
+	    `;;
+	  *) mkdir_umask=$umask,go-w;;
+	esac
+
+	# With -d, create the new directory with the user-specified mode.
+	# Otherwise, rely on $mkdir_umask.
+	if test -n "$dir_arg"; then
+	  mkdir_mode=-m$mode
+	else
+	  mkdir_mode=
+	fi
+
+	posix_mkdir=false
+	case $umask in
+	  *[123567][0-7][0-7])
+	    # POSIX mkdir -p sets u+wx bits regardless of umask, which
+	    # is incompatible with FreeBSD 'install' when (umask & 300) != 0.
+	    ;;
+	  *)
+	    tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$
+	    trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0
+
+	    if (umask $mkdir_umask &&
+		exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1
+	    then
+	      if test -z "$dir_arg" || {
+		   # Check for POSIX incompatibilities with -m.
+		   # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or
+		   # other-writable bit of parent directory when it shouldn't.
+		   # FreeBSD 6.1 mkdir -m -p sets mode of existing directory.
+		   ls_ld_tmpdir=`ls -ld "$tmpdir"`
+		   case $ls_ld_tmpdir in
+		     d????-?r-*) different_mode=700;;
+		     d????-?--*) different_mode=755;;
+		     *) false;;
+		   esac &&
+		   $mkdirprog -m$different_mode -p -- "$tmpdir" && {
+		     ls_ld_tmpdir_1=`ls -ld "$tmpdir"`
+		     test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1"
+		   }
+		 }
+	      then posix_mkdir=:
+	      fi
+	      rmdir "$tmpdir/d" "$tmpdir"
+	    else
+	      # Remove any dirs left behind by ancient mkdir implementations.
+	      rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null
+	    fi
+	    trap '' 0;;
+	esac;;
+    esac
+
+    if
+      $posix_mkdir && (
+	umask $mkdir_umask &&
+	$doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir"
+      )
+    then :
+    else
+
+      # The umask is ridiculous, or mkdir does not conform to POSIX,
+      # or it failed possibly due to a race condition.  Create the
+      # directory the slow way, step by step, checking for races as we go.
+
+      case $dstdir in
+	/*) prefix='/';;
+	[-=\(\)!]*) prefix='./';;
+	*)  prefix='';;
+      esac
+
+      eval "$initialize_posix_glob"
+
+      oIFS=$IFS
+      IFS=/
+      $posix_glob set -f
+      set fnord $dstdir
+      shift
+      $posix_glob set +f
+      IFS=$oIFS
+
+      prefixes=
+
+      for d
+      do
+	test X"$d" = X && continue
+
+	prefix=$prefix$d
+	if test -d "$prefix"; then
+	  prefixes=
+	else
+	  if $posix_mkdir; then
+	    (umask=$mkdir_umask &&
+	     $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break
+	    # Don't fail if two instances are running concurrently.
+	    test -d "$prefix" || exit 1
+	  else
+	    case $prefix in
+	      *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;;
+	      *) qprefix=$prefix;;
+	    esac
+	    prefixes="$prefixes '$qprefix'"
+	  fi
+	fi
+	prefix=$prefix/
+      done
+
+      if test -n "$prefixes"; then
+	# Don't fail if two instances are running concurrently.
+	(umask $mkdir_umask &&
+	 eval "\$doit_exec \$mkdirprog $prefixes") ||
+	  test -d "$dstdir" || exit 1
+	obsolete_mkdir_used=true
+      fi
+    fi
+  fi
+
+  if test -n "$dir_arg"; then
+    { test -z "$chowncmd" || $doit $chowncmd "$dst"; } &&
+    { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } &&
+    { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false ||
+      test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1
+  else
+
+    # Make a couple of temp file names in the proper directory.
+    dsttmp=$dstdir/_inst.$$_
+    rmtmp=$dstdir/_rm.$$_
+
+    # Trap to clean up those temp files at exit.
+    trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0
+
+    # Copy the file name to the temp name.
+    (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") &&
+
+    # and set any options; do chmod last to preserve setuid bits.
+    #
+    # If any of these fail, we abort the whole thing.  If we want to
+    # ignore errors from any of these, just make sure not to ignore
+    # errors from the above "$doit $cpprog $src $dsttmp" command.
+    #
+    { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } &&
+    { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } &&
+    { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } &&
+    { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } &&
+
+    # If -C, don't bother to copy if it wouldn't change the file.
+    if $copy_on_change &&
+       old=`LC_ALL=C ls -dlL "$dst"	2>/dev/null` &&
+       new=`LC_ALL=C ls -dlL "$dsttmp"	2>/dev/null` &&
+
+       eval "$initialize_posix_glob" &&
+       $posix_glob set -f &&
+       set X $old && old=:$2:$4:$5:$6 &&
+       set X $new && new=:$2:$4:$5:$6 &&
+       $posix_glob set +f &&
+
+       test "$old" = "$new" &&
+       $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1
+    then
+      rm -f "$dsttmp"
+    else
+      # Rename the file to the real destination.
+      $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null ||
+
+      # The rename failed, perhaps because mv can't rename something else
+      # to itself, or perhaps because mv is so ancient that it does not
+      # support -f.
+      {
+	# Now remove or move aside any old file at destination location.
+	# We try this two ways since rm can't unlink itself on some
+	# systems and the destination file might be busy for other
+	# reasons.  In this case, the final cleanup might fail but the new
+	# file should still install successfully.
+	{
+	  test ! -f "$dst" ||
+	  $doit $rmcmd -f "$dst" 2>/dev/null ||
+	  { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null &&
+	    { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; }
+	  } ||
+	  { echo "$0: cannot unlink or rename $dst" >&2
+	    (exit 1); exit 1
+	  }
+	} &&
+
+	# Now rename the file to the real destination.
+	$doit $mvcmd "$dsttmp" "$dst"
+      }
+    fi || exit 1
+
+    trap '' 0
+  fi
+done
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-time-zone: "UTC"
+# time-stamp-end: "; # UTC"
+# End:
diff --git a/libsrc/CMakeLists.txt b/libsrc/CMakeLists.txt
new file mode 100644
index 0000000..aea8ab8
--- /dev/null
+++ b/libsrc/CMakeLists.txt
@@ -0,0 +1,48 @@
+CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
+
+# Tell make to install these as a header file.
+SET(include_HEADERS nfconfig.inc)
+SET(CMAKE_INCLUDE_CURRENT_DIR ON)
+
+# The (temporary) library we are building.
+SET(ncfortran_LIBRARY_SOURCES
+  fort-attio.c fort-control.c fort-dim.c
+  fort-genatt.c fort-geninq.c fort-genvar.c fort-lib.c fort-misc.c
+  fort-v2compat.c fort-vario.c fort-var1io.c fort-varaio.c fort-varmio.c
+  fort-varsio.c cfortran.h fort-lib.h ncfortran.h)
+# Is the user building netCDF-4?
+#IF(USE_NETCDF4)
+#  SET(ncfortran_LIBRARY_SOURCES ${ncfortran_LIBRARY_SOURCES} fort-nc4.c)
+#ENDIF(USE_NETCDF4)
+
+# The F77 API man page.
+SET(man_MANS netcdf_f77.3)
+
+# This rule generates the F77 manpage.
+SET(ARGS_MANPAGE "-DAPI=FORTRAN")
+IF (USE_NETCDF4)
+  SET(ARGS_MANPAGE ${ARGS_MANPAGE} "-DNETCDF4=TRUE")
+ENDIF(USE_NETCDF4)
+IF(BUILD_DAP)
+  SET(ARGS_MANPAGE ${ARGS_MANPAGE} "-DDAP=TRUE")
+ENDIF(BUILD_DAP)
+IF(BUILD_PARALLEL)
+  SET(ARGS_MANPAGE ${ARGS_MANPAGE} "-DPARALLEL_IO=TRUE")
+ENDIF(BUILD_PARALLEL)
+
+# TODO: Figure out the cmake syntax for this
+# netcdf_f77.3: $(top_srcdir)/docs/netcdf.m4
+#	m4 $(M4FLAGS) $(ARGS_MANPAGE) $? >$@ || rm $@
+
+INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR} ${CMAKE_CPP_FLAGS})
+
+ADD_LIBRARY(ncfortran ${ncfortran_LIBRARY_SOURCES})
+TARGET_LINK_LIBRARIES(ncfortran ${NETCDF_C_LIBRARY} ${EXTRA_DEPS})
+# The nfconfig.in file is turned into nfconfig.inc by the configure
+# script. The man page is generated on the developers machine for the
+# dist.
+SET(EXTRA_DIST nfconfig.in nfconfig.inc ${man_MANS} netcdf_f.h)# These files need to be cleaned up my make.
+
+# These files need to be cleaned up my make.
+SET(CLEANFILES nfconfig1.inc netcdf.inc)
+SET(DISTCLEANFILES nfconfig.inc )
diff --git a/libsrc/Makefile.am b/libsrc/Makefile.am
new file mode 100644
index 0000000..a3b8a27
--- /dev/null
+++ b/libsrc/Makefile.am
@@ -0,0 +1,84 @@
+## This is an automake file, part of Unidata's netCDF package.
+# Copyright 2005-2011, see the COPYRIGHT file for more information.
+
+# This file controls the building of the c library
+# that interfaces between fortran and C.
+
+# The (temporary) library we are building.
+# The version number is specified using the following
+# guideline:
+# http://www.gnu.org/software/libtool/manual/html_node/Updating-version-info.html
+noinst_LTLIBRARIES = libnetcdfc.la
+libnetcdfc_la_LDFLAGS = $(AM_LDFLAGS) -version-number 6:0:1
+
+# Tell make to install these as a header file.
+include_HEADERS = nfconfig.inc
+
+# Turn on some special flags for building DLL.
+AM_CPPFLAGS = -DDLL_EXPORT
+if BUILD_DLL
+AM_CPPFLAGS += -DDLL_EXPORT
+libnetcdfc_la_LDFLAGS += -no-undefined -Wl,--output-def,netcdffdll.def
+endif # BUILD_DLL
+
+# These are the source files for the fortran library.
+libnetcdfc_la_SOURCES = fort-attio.c fort-control.c fort-dim.c		\
+fort-genatt.c fort-geninq.c fort-genvar.c fort-lib.c fort-misc.c	\
+fort-v2compat.c fort-vario.c fort-var1io.c fort-varaio.c fort-varmio.c	\
+fort-varsio.c cfortran.h fort-lib.h ncfortran.h
+
+# Is the user building netCDF-4?
+if USE_NETCDF4
+# All netCDF-4 F77 functions are in one code file.
+libnetcdfc_la_SOURCES += fort-nc4.c
+endif
+
+## The include file and man page are both built by make.
+#BUILT_SOURCES = netcdf.inc
+#
+#netcdf.inc: netcdf2.inc netcdf3.inc netcdf4.inc nfconfig.inc
+#	echo '!     NetCDF-3.' > netcdf.inc
+#	cat @top_srcdir@/fortran/netcdf3.inc >> netcdf.inc
+#if BUILD_V2
+#	echo >> netcdf.inc
+#	echo '!     NetCDF-2.' >> netcdf.inc
+#	cat @top_srcdir@/fortran/netcdf2.inc >> netcdf.inc
+#endif
+#if USE_NETCDF4
+#	echo >> netcdf.inc
+#	echo '!     NetCDF-4.' >> netcdf.inc
+#	cat @top_srcdir@/fortran/netcdf4.inc >> netcdf.inc
+#endif
+#if USE_LOGGING
+#	echo >> netcdf.inc
+#	echo '!     This is to turn on netCDF internal logging.' >> netcdf.inc
+#	echo '      integer nf_set_log_level' >> netcdf.inc
+#	echo '      external nf_set_log_level' >> netcdf.inc
+#endif
+
+# The F77 API man page.
+man_MANS = netcdf_f77.3
+
+# This rule generates the F77 manpage.
+ARGS_MANPAGE = -DAPI=FORTRAN
+if USE_NETCDF4
+ARGS_MANPAGE += -DNETCDF4=TRUE
+endif
+if BUILD_DAP
+ARGS_MANPAGE += -DDAP=TRUE
+endif
+if BUILD_PARALLEL
+ARGS_MANPAGE += -DPARALLEL_IO=TRUE
+endif
+netcdf_f77.3: $(top_srcdir)/docs/netcdf.m4
+	m4 $(M4FLAGS) $(ARGS_MANPAGE) $? >$@ || rm $@
+
+# The nfconfig.in file is turned into nfconfig.inc by the configure
+# script. The man page is generated on the developers machine for the
+# dist.
+EXTRA_DIST = nfconfig.in nfconfig.inc $(man_MANS) \
+	netcdf_f.h CMakeLists.txt nfconfig.in.cmake
+
+# These files need to be cleaned up my make.
+CLEANFILES = nfconfig1.inc netcdf.inc
+DISTCLEANFILES = nfconfig.inc
diff --git a/libsrc/Makefile.in b/libsrc/Makefile.in
new file mode 100644
index 0000000..31d01ad
--- /dev/null
+++ b/libsrc/Makefile.in
@@ -0,0 +1,820 @@
+# Makefile.in generated by automake 1.14.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2013 Free Software Foundation, Inc.
+
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+ at SET_MAKE@
+
+# Copyright 2005-2011, see the COPYRIGHT file for more information.
+
+# This file controls the building of the c library
+# that interfaces between fortran and C.
+
+
+VPATH = @srcdir@
+am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
+am__make_running_with_option = \
+  case $${target_option-} in \
+      ?) ;; \
+      *) echo "am__make_running_with_option: internal error: invalid" \
+              "target option '$${target_option-}' specified" >&2; \
+         exit 1;; \
+  esac; \
+  has_opt=no; \
+  sane_makeflags=$$MAKEFLAGS; \
+  if $(am__is_gnu_make); then \
+    sane_makeflags=$$MFLAGS; \
+  else \
+    case $$MAKEFLAGS in \
+      *\\[\ \	]*) \
+        bs=\\; \
+        sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+          | sed "s/$$bs$$bs[$$bs $$bs	]*//g"`;; \
+    esac; \
+  fi; \
+  skip_next=no; \
+  strip_trailopt () \
+  { \
+    flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+  }; \
+  for flg in $$sane_makeflags; do \
+    test $$skip_next = yes && { skip_next=no; continue; }; \
+    case $$flg in \
+      *=*|--*) continue;; \
+        -*I) strip_trailopt 'I'; skip_next=yes;; \
+      -*I?*) strip_trailopt 'I';; \
+        -*O) strip_trailopt 'O'; skip_next=yes;; \
+      -*O?*) strip_trailopt 'O';; \
+        -*l) strip_trailopt 'l'; skip_next=yes;; \
+      -*l?*) strip_trailopt 'l';; \
+      -[dEDm]) skip_next=yes;; \
+      -[JT]) skip_next=yes;; \
+    esac; \
+    case $$flg in \
+      *$$target_option*) has_opt=yes; break;; \
+    esac; \
+  done; \
+  test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+target_triplet = @target@
+ at BUILD_DLL_TRUE@am__append_1 = -DDLL_EXPORT
+ at BUILD_DLL_TRUE@am__append_2 = -no-undefined -Wl,--output-def,netcdffdll.def
+
+# Is the user building netCDF-4?
+# All netCDF-4 F77 functions are in one code file.
+ at USE_NETCDF4_TRUE@am__append_3 = fort-nc4.c
+ at USE_NETCDF4_TRUE@am__append_4 = -DNETCDF4=TRUE
+ at BUILD_DAP_TRUE@am__append_5 = -DDAP=TRUE
+ at BUILD_PARALLEL_TRUE@am__append_6 = -DPARALLEL_IO=TRUE
+subdir = libsrc
+DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \
+	$(srcdir)/nfconfig.in $(top_srcdir)/depcomp $(include_HEADERS)
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \
+	$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+	$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+	$(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/config.h nfconfig1.inc
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+LTLIBRARIES = $(noinst_LTLIBRARIES)
+libnetcdfc_la_LIBADD =
+am__libnetcdfc_la_SOURCES_DIST = fort-attio.c fort-control.c \
+	fort-dim.c fort-genatt.c fort-geninq.c fort-genvar.c \
+	fort-lib.c fort-misc.c fort-v2compat.c fort-vario.c \
+	fort-var1io.c fort-varaio.c fort-varmio.c fort-varsio.c \
+	cfortran.h fort-lib.h ncfortran.h fort-nc4.c
+ at USE_NETCDF4_TRUE@am__objects_1 = fort-nc4.lo
+am_libnetcdfc_la_OBJECTS = fort-attio.lo fort-control.lo fort-dim.lo \
+	fort-genatt.lo fort-geninq.lo fort-genvar.lo fort-lib.lo \
+	fort-misc.lo fort-v2compat.lo fort-vario.lo fort-var1io.lo \
+	fort-varaio.lo fort-varmio.lo fort-varsio.lo $(am__objects_1)
+libnetcdfc_la_OBJECTS = $(am_libnetcdfc_la_OBJECTS)
+AM_V_lt = $(am__v_lt_ at AM_V@)
+am__v_lt_ = $(am__v_lt_ at AM_DEFAULT_V@)
+am__v_lt_0 = --silent
+am__v_lt_1 = 
+libnetcdfc_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+	$(libnetcdfc_la_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_P = $(am__v_P_ at AM_V@)
+am__v_P_ = $(am__v_P_ at AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_ at AM_V@)
+am__v_GEN_ = $(am__v_GEN_ at AM_DEFAULT_V@)
+am__v_GEN_0 = @echo "  GEN     " $@;
+am__v_GEN_1 = 
+AM_V_at = $(am__v_at_ at AM_V@)
+am__v_at_ = $(am__v_at_ at AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 = 
+DEFAULT_INCLUDES = -I. at am__isrc@ -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__depfiles_maybe = depfiles
+am__mv = mv -f
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+	$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \
+	$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+	$(AM_CFLAGS) $(CFLAGS)
+AM_V_CC = $(am__v_CC_ at AM_V@)
+am__v_CC_ = $(am__v_CC_ at AM_DEFAULT_V@)
+am__v_CC_0 = @echo "  CC      " $@;
+am__v_CC_1 = 
+CCLD = $(CC)
+LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+	$(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CCLD = $(am__v_CCLD_ at AM_V@)
+am__v_CCLD_ = $(am__v_CCLD_ at AM_DEFAULT_V@)
+am__v_CCLD_0 = @echo "  CCLD    " $@;
+am__v_CCLD_1 = 
+SOURCES = $(libnetcdfc_la_SOURCES)
+DIST_SOURCES = $(am__libnetcdfc_la_SOURCES_DIST)
+am__can_run_installinfo = \
+  case $$AM_UPDATE_INFO_DIR in \
+    n|no|NO) false;; \
+    *) (install-info --version) >/dev/null 2>&1;; \
+  esac
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+  for p in $$list; do echo "$$p $$p"; done | \
+  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+    if (++n[$$2] == $(am__install_max)) \
+      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+    END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__uninstall_files_from_dir = { \
+  test -z "$$files" \
+    || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+    || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+         $(am__cd) "$$dir" && rm -f $$files; }; \
+  }
+man3dir = $(mandir)/man3
+am__installdirs = "$(DESTDIR)$(man3dir)" "$(DESTDIR)$(includedir)"
+NROFF = nroff
+MANS = $(man_MANS)
+HEADERS = $(include_HEADERS)
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) \
+	$(LISP)nfconfig.in
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates.  Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+  BEGIN { nonempty = 0; } \
+  { items[$$0] = 1; nonempty = 1; } \
+  END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique.  This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+  list='$(am__tagged_files)'; \
+  unique=`for i in $$list; do \
+    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+  done | $(am__uniquify_input)`
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+ALLOCA = @ALLOCA@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BUILD_INTERNAL_DOCS = @BUILD_INTERNAL_DOCS@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+DOT = @DOT@
+DOXYGEN = @DOXYGEN@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+F77 = @F77@
+FC = @FC@
+FCFLAGS = @FCFLAGS@
+FCFLAGS_f90 = @FCFLAGS_f90@
+FFLAGS = @FFLAGS@
+FGREP = @FGREP@
+GREP = @GREP@
+HAS_DAP = @HAS_DAP@
+HAS_F03 = @HAS_F03@
+HAS_F90 = @HAS_F90@
+HAS_NC2 = @HAS_NC2@
+HAS_NC4 = @HAS_NC4@
+HAVE_DOT = @HAVE_DOT@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MKDIR_P = @MKDIR_P@
+MOD_FLAG = @MOD_FLAG@
+NC_FLIBS = @NC_FLIBS@
+NC_LIBS = @NC_LIBS@
+NM = @NM@
+NMEDIT = @NMEDIT@
+NMFLAGS = @NMFLAGS@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+VERSION = @VERSION@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+ac_ct_F77 = @ac_ct_F77@
+ac_ct_FC = @ac_ct_FC@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target = @target@
+target_alias = @target_alias@
+target_cpu = @target_cpu@
+target_os = @target_os@
+target_vendor = @target_vendor@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+
+# The (temporary) library we are building.
+# The version number is specified using the following
+# guideline:
+# http://www.gnu.org/software/libtool/manual/html_node/Updating-version-info.html
+noinst_LTLIBRARIES = libnetcdfc.la
+libnetcdfc_la_LDFLAGS = $(AM_LDFLAGS) -version-number 6:0:1 \
+	$(am__append_2)
+
+# Tell make to install these as a header file.
+include_HEADERS = nfconfig.inc
+
+# Turn on some special flags for building DLL.
+AM_CPPFLAGS = -DDLL_EXPORT $(am__append_1)
+
+# These are the source files for the fortran library.
+libnetcdfc_la_SOURCES = fort-attio.c fort-control.c fort-dim.c \
+	fort-genatt.c fort-geninq.c fort-genvar.c fort-lib.c \
+	fort-misc.c fort-v2compat.c fort-vario.c fort-var1io.c \
+	fort-varaio.c fort-varmio.c fort-varsio.c cfortran.h \
+	fort-lib.h ncfortran.h $(am__append_3)
+
+#BUILT_SOURCES = netcdf.inc
+#
+#netcdf.inc: netcdf2.inc netcdf3.inc netcdf4.inc nfconfig.inc
+#	echo '!     NetCDF-3.' > netcdf.inc
+#	cat @top_srcdir@/fortran/netcdf3.inc >> netcdf.inc
+#if BUILD_V2
+#	echo >> netcdf.inc
+#	echo '!     NetCDF-2.' >> netcdf.inc
+#	cat @top_srcdir@/fortran/netcdf2.inc >> netcdf.inc
+#endif
+#if USE_NETCDF4
+#	echo >> netcdf.inc
+#	echo '!     NetCDF-4.' >> netcdf.inc
+#	cat @top_srcdir@/fortran/netcdf4.inc >> netcdf.inc
+#endif
+#if USE_LOGGING
+#	echo >> netcdf.inc
+#	echo '!     This is to turn on netCDF internal logging.' >> netcdf.inc
+#	echo '      integer nf_set_log_level' >> netcdf.inc
+#	echo '      external nf_set_log_level' >> netcdf.inc
+#endif
+
+# The F77 API man page.
+man_MANS = netcdf_f77.3
+
+# This rule generates the F77 manpage.
+ARGS_MANPAGE = -DAPI=FORTRAN $(am__append_4) $(am__append_5) \
+	$(am__append_6)
+
+# The nfconfig.in file is turned into nfconfig.inc by the configure
+# script. The man page is generated on the developers machine for the
+# dist.
+EXTRA_DIST = nfconfig.in nfconfig.inc $(man_MANS) \
+	netcdf_f.h CMakeLists.txt nfconfig.in.cmake
+
+
+# These files need to be cleaned up my make.
+CLEANFILES = nfconfig1.inc netcdf.inc
+DISTCLEANFILES = nfconfig.inc
+all: nfconfig1.inc
+	$(MAKE) $(AM_MAKEFLAGS) all-am
+
+.SUFFIXES:
+.SUFFIXES: .c .lo .o .obj
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign libsrc/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign libsrc/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+
+nfconfig1.inc: stamp-h2
+	@test -f $@ || rm -f stamp-h2
+	@test -f $@ || $(MAKE) $(AM_MAKEFLAGS) stamp-h2
+
+stamp-h2: $(srcdir)/nfconfig.in $(top_builddir)/config.status
+	@rm -f stamp-h2
+	cd $(top_builddir) && $(SHELL) ./config.status libsrc/nfconfig1.inc
+
+distclean-hdr:
+	-rm -f nfconfig1.inc stamp-h2
+
+clean-noinstLTLIBRARIES:
+	-test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES)
+	@list='$(noinst_LTLIBRARIES)'; \
+	locs=`for p in $$list; do echo $$p; done | \
+	      sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \
+	      sort -u`; \
+	test -z "$$locs" || { \
+	  echo rm -f $${locs}; \
+	  rm -f $${locs}; \
+	}
+
+libnetcdfc.la: $(libnetcdfc_la_OBJECTS) $(libnetcdfc_la_DEPENDENCIES) $(EXTRA_libnetcdfc_la_DEPENDENCIES) 
+	$(AM_V_CCLD)$(libnetcdfc_la_LINK)  $(libnetcdfc_la_OBJECTS) $(libnetcdfc_la_LIBADD) $(LIBS)
+
+mostlyclean-compile:
+	-rm -f *.$(OBJEXT)
+
+distclean-compile:
+	-rm -f *.tab.c
+
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/fort-attio.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/fort-control.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/fort-dim.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/fort-genatt.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/fort-geninq.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/fort-genvar.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/fort-lib.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/fort-misc.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/fort-nc4.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/fort-v2compat.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/fort-var1io.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/fort-varaio.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/fort-vario.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/fort-varmio.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/fort-varsio.Plo at am__quote@
+
+.c.o:
+ at am__fastdepCC_TRUE@	$(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\
+ at am__fastdepCC_TRUE@	$(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+ at am__fastdepCC_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.Po
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(COMPILE) -c -o $@ $<
+
+.c.obj:
+ at am__fastdepCC_TRUE@	$(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\
+ at am__fastdepCC_TRUE@	$(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\
+ at am__fastdepCC_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.Po
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.c.lo:
+ at am__fastdepCC_TRUE@	$(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\
+ at am__fastdepCC_TRUE@	$(LTCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+ at am__fastdepCC_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LTCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+	-rm -f *.lo
+
+clean-libtool:
+	-rm -rf .libs _libs
+install-man3: $(man_MANS)
+	@$(NORMAL_INSTALL)
+	@list1=''; \
+	list2='$(man_MANS)'; \
+	test -n "$(man3dir)" \
+	  && test -n "`echo $$list1$$list2`" \
+	  || exit 0; \
+	echo " $(MKDIR_P) '$(DESTDIR)$(man3dir)'"; \
+	$(MKDIR_P) "$(DESTDIR)$(man3dir)" || exit 1; \
+	{ for i in $$list1; do echo "$$i"; done;  \
+	if test -n "$$list2"; then \
+	  for i in $$list2; do echo "$$i"; done \
+	    | sed -n '/\.3[a-z]*$$/p'; \
+	fi; \
+	} | while read p; do \
+	  if test -f $$p; then d=; else d="$(srcdir)/"; fi; \
+	  echo "$$d$$p"; echo "$$p"; \
+	done | \
+	sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^3][0-9a-z]*$$,3,;x' \
+	      -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \
+	sed 'N;N;s,\n, ,g' | { \
+	list=; while read file base inst; do \
+	  if test "$$base" = "$$inst"; then list="$$list $$file"; else \
+	    echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man3dir)/$$inst'"; \
+	    $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man3dir)/$$inst" || exit $$?; \
+	  fi; \
+	done; \
+	for i in $$list; do echo "$$i"; done | $(am__base_list) | \
+	while read files; do \
+	  test -z "$$files" || { \
+	    echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man3dir)'"; \
+	    $(INSTALL_DATA) $$files "$(DESTDIR)$(man3dir)" || exit $$?; }; \
+	done; }
+
+uninstall-man3:
+	@$(NORMAL_UNINSTALL)
+	@list=''; test -n "$(man3dir)" || exit 0; \
+	files=`{ for i in $$list; do echo "$$i"; done; \
+	l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \
+	  sed -n '/\.3[a-z]*$$/p'; \
+	} | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^3][0-9a-z]*$$,3,;x' \
+	      -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \
+	dir='$(DESTDIR)$(man3dir)'; $(am__uninstall_files_from_dir)
+install-includeHEADERS: $(include_HEADERS)
+	@$(NORMAL_INSTALL)
+	@list='$(include_HEADERS)'; test -n "$(includedir)" || list=; \
+	if test -n "$$list"; then \
+	  echo " $(MKDIR_P) '$(DESTDIR)$(includedir)'"; \
+	  $(MKDIR_P) "$(DESTDIR)$(includedir)" || exit 1; \
+	fi; \
+	for p in $$list; do \
+	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+	  echo "$$d$$p"; \
+	done | $(am__base_list) | \
+	while read files; do \
+	  echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(includedir)'"; \
+	  $(INSTALL_HEADER) $$files "$(DESTDIR)$(includedir)" || exit $$?; \
+	done
+
+uninstall-includeHEADERS:
+	@$(NORMAL_UNINSTALL)
+	@list='$(include_HEADERS)'; test -n "$(includedir)" || list=; \
+	files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+	dir='$(DESTDIR)$(includedir)'; $(am__uninstall_files_from_dir)
+
+ID: $(am__tagged_files)
+	$(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-am
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+	set x; \
+	here=`pwd`; \
+	$(am__define_uniq_tagged_files); \
+	shift; \
+	if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+	  test -n "$$unique" || unique=$$empty_fix; \
+	  if test $$# -gt 0; then \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      "$$@" $$unique; \
+	  else \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      $$unique; \
+	  fi; \
+	fi
+ctags: ctags-am
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+	$(am__define_uniq_tagged_files); \
+	test -z "$(CTAGS_ARGS)$$unique" \
+	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+	     $$unique
+
+GTAGS:
+	here=`$(am__cd) $(top_builddir) && pwd` \
+	  && $(am__cd) $(top_srcdir) \
+	  && gtags -i $(GTAGS_ARGS) "$$here"
+cscopelist: cscopelist-am
+
+cscopelist-am: $(am__tagged_files)
+	list='$(am__tagged_files)'; \
+	case "$(srcdir)" in \
+	  [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+	  *) sdir=$(subdir)/$(srcdir) ;; \
+	esac; \
+	for i in $$list; do \
+	  if test -f "$$i"; then \
+	    echo "$(subdir)/$$i"; \
+	  else \
+	    echo "$$sdir/$$i"; \
+	  fi; \
+	done >> $(top_builddir)/cscope.files
+
+distclean-tags:
+	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+	  else \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
+	    || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+check: check-am
+all-am: Makefile $(LTLIBRARIES) $(MANS) $(HEADERS) nfconfig1.inc
+installdirs:
+	for dir in "$(DESTDIR)$(man3dir)" "$(DESTDIR)$(includedir)"; do \
+	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
+	done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	if test -z '$(STRIP)'; then \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	      install; \
+	else \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	    "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+	fi
+mostlyclean-generic:
+
+clean-generic:
+	-test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+	-test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \
+	mostlyclean-am
+
+distclean: distclean-am
+	-rm -rf ./$(DEPDIR)
+	-rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+	distclean-hdr distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am: install-includeHEADERS install-man
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man: install-man3
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+	-rm -rf ./$(DEPDIR)
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+	mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-includeHEADERS uninstall-man
+
+uninstall-man: uninstall-man3
+
+.MAKE: all install-am install-strip
+
+.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \
+	clean-libtool clean-noinstLTLIBRARIES cscopelist-am ctags \
+	ctags-am distclean distclean-compile distclean-generic \
+	distclean-hdr distclean-libtool distclean-tags distdir dvi \
+	dvi-am html html-am info info-am install install-am \
+	install-data install-data-am install-dvi install-dvi-am \
+	install-exec install-exec-am install-html install-html-am \
+	install-includeHEADERS install-info install-info-am \
+	install-man install-man3 install-pdf install-pdf-am install-ps \
+	install-ps-am install-strip installcheck installcheck-am \
+	installdirs maintainer-clean maintainer-clean-generic \
+	mostlyclean mostlyclean-compile mostlyclean-generic \
+	mostlyclean-libtool pdf pdf-am ps ps-am tags tags-am uninstall \
+	uninstall-am uninstall-includeHEADERS uninstall-man \
+	uninstall-man3
+
+netcdf_f77.3: $(top_srcdir)/docs/netcdf.m4
+	m4 $(M4FLAGS) $(ARGS_MANPAGE) $? >$@ || rm $@
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/libsrc/cfortran.h b/libsrc/cfortran.h
new file mode 100644
index 0000000..feb2fc1
--- /dev/null
+++ b/libsrc/cfortran.h
@@ -0,0 +1,2526 @@
+/* cfortran.h  4.4 */
+/* http://www-zeus.desy.de/~burow/cfortran/                   */
+/* Burkhard Burow  burow at desy.de                 1990 - 2002. */
+
+#ifndef __CFORTRAN_LOADED
+#define __CFORTRAN_LOADED
+
+/* 
+   THIS FILE IS PROPERTY OF BURKHARD BUROW. IF YOU ARE USING THIS FILE YOU
+   SHOULD ALSO HAVE ACCESS TO CFORTRAN.DOC WHICH PROVIDES TERMS FOR USING,
+   MODIFYING, COPYING AND DISTRIBUTING THE CFORTRAN.H PACKAGE.
+*/
+
+/* The following modifications were made by the authors of CFITSIO or by me. 
+ * They are flagged below with CFITSIO, the author's initials, or KMCCARTY.
+ * PDW = Peter Wilson
+ * DM  = Doug Mink
+ * LEB = Lee E Brotzman
+ * MR  = Martin Reinecke
+ * WDP = William D Pence
+ * -- Kevin McCarty, for Debian (19 Dec. 2005)
+ * RKR = Russ Rew (24 Feb 2012) */
+
+/*******
+   Modifications:
+      Oct 1997: Changed symbol name extname to appendus (PDW/HSTX)
+                (Conflicted with a common variable name in FTOOLS)
+      Nov 1997: If g77Fortran defined, also define f2cFortran (PDW/HSTX)
+      Feb 1998: Let VMS see the NUM_ELEMS code. Lets programs treat
+                single strings as vectors with single elements
+      Nov 1999: If macintoxh defined, also define f2cfortran (for Mac OS-X)
+      Apr 2000: If WIN32 defined, also define PowerStationFortran and
+                VISUAL_CPLUSPLUS (Visual C++)
+      Jun 2000: If __GNUC__ and linux defined, also define f2cFortran
+                (linux/gcc environment detection)
+      Apr 2002: If __CYGWIN__ is defined, also define f2cFortran
+      Nov 2002: If __APPLE__ defined, also define f2cfortran (for Mac OS-X)
+
+      Nov 2003: If __INTEL_COMPILER or INTEL_COMPILER defined, also define
+                f2cFortran (KMCCARTY)
+      Dec 2005: If f2cFortran is defined, enforce REAL functions in FORTRAN
+                returning "double" in C.  This was one of the items on
+		Burkhard's TODO list. (KMCCARTY)
+      Dec 2005: Modifications to support 8-byte integers. (MR)
+		USE AT YOUR OWN RISK!
+      Feb 2006  Added logic to typedef the symbol 'LONGLONG' to an appropriate
+                intrinsic 8-byte integer datatype  (WDP)
+      Apr 2006: Modifications to support gfortran (and g77 with -fno-f2c flag)
+                since by default it returns "float" for FORTRAN REAL function.
+                (KMCCARTY)
+      May 2008: Revert commenting out of "extern" in COMMON_BLOCK_DEF macro.
+		Add braces around do-nothing ";" in 3 empty while blocks to
+		get rid of compiler warnings.  Thanks to ROOT developers
+		Jacek Holeczek and Rene Brun for these suggestions. (KMCCARTY)
+      Aug 2008: If __GNUC__ is defined and no FORTRAN compiler is specified
+		via a #define or -D, default to gfortran behavior rather than
+		g77 behavior. (KMCCARTY)
+      Feb 2012: Integrate AbsoftProFortran11 changes for versions 10.2 and later (RKR)
+ *******/
+
+/* 
+  Avoid symbols already used by compilers and system *.h:
+  __ - OSF1 zukal06 V3.0 347 alpha, cc -c -std1 cfortest.c
+
+*/
+
+/* 
+   Determine what 8-byte integer data type is available.
+  'long long' is now supported by most compilers, but older
+  MS Visual C++ compilers before V7.0 use '__int64' instead. (WDP)
+*/
+
+#ifndef LONGLONG_TYPE   /* this may have been previously defined */
+#if defined(_MSC_VER)   /* Microsoft Visual C++ */
+#if (_MSC_VER < 1300)   /* versions earlier than V7.0 do not have 'long long' */
+    typedef __int64 LONGLONG;
+#else                   /* newer versions do support 'long long' */
+    typedef long long LONGLONG; 
+#endif /* (_MSC_VER...) */
+#else
+#ifdef LONGLONG_IS_LONG
+    typedef long LONGLONG;
+#else
+    typedef long long LONGLONG; 
+#endif /* ifdef LONGLONG_IS_LONG */
+#endif /* if defined(_MSC_VER)... */
+#define LONGLONG_TYPE
+#endif  /* ifndef LONGLONG_TYPE */
+
+/* First prepare for the C compiler. */
+
+#ifndef ANSI_C_preprocessor /* i.e. user can override. */
+#ifdef __CF__KnR
+#define ANSI_C_preprocessor 0
+#else
+#ifdef __STDC__
+#define ANSI_C_preprocessor 1
+#else
+#define _cfleft             1
+#define _cfright 
+#define _cfleft_cfright     0
+#define ANSI_C_preprocessor _cfleft/**/_cfright
+#endif
+#endif
+#endif
+
+#if ANSI_C_preprocessor
+#define _0(A,B)   A##B
+#define  _(A,B)   _0(A,B)  /* see cat,xcat of K&R ANSI C p. 231 */
+#define _2(A,B)   A##B     /* K&R ANSI C p.230: .. identifier is not replaced */
+#define _3(A,B,C) _(A,_(B,C))
+#else                      /* if it turns up again during rescanning.         */
+#define  _(A,B)   A/**/B
+#define _2(A,B)   A/**/B
+#define _3(A,B,C) A/**/B/**/C
+#endif
+
+#if (defined(vax)&&defined(unix)) || (defined(__vax__)&&defined(__unix__))
+#define VAXUltrix
+#endif
+
+#include <stdio.h>     /* NULL [in all machines stdio.h]                      */
+#include <string.h>    /* strlen, memset, memcpy, memchr.                     */
+#if !( defined(VAXUltrix) || defined(sun) || (defined(apollo)&&!defined(__STDCPP__)) )
+#include <stdlib.h>    /* malloc,free                                         */
+#else
+#include <malloc.h>    /* Had to be removed for DomainOS h105 10.4 sys5.3 425t*/
+#ifdef apollo
+#define __CF__APOLLO67 /* __STDCPP__ is in Apollo 6.8 (i.e. ANSI) and onwards */
+#endif
+#endif
+
+#if !defined(__GNUC__) && !defined(__sun) && (defined(sun)||defined(VAXUltrix)||defined(lynx))
+#define __CF__KnR     /* Sun, LynxOS and VAX Ultrix cc only supports K&R.     */
+                      /* Manually define __CF__KnR for HP if desired/required.*/
+#endif                /*       i.e. We will generate Kernighan and Ritchie C. */
+/* Note that you may define __CF__KnR before #include cfortran.h, in order to
+generate K&R C instead of the default ANSI C. The differences are mainly in the
+function prototypes and declarations. All machines, except the Apollo, work
+with either style. The Apollo's argument promotion rules require ANSI or use of
+the obsolete std_$call which we have not implemented here. Hence on the Apollo,
+only C calling FORTRAN subroutines will work using K&R style.*/
+
+
+/* Remainder of cfortran.h depends on the Fortran compiler. */
+
+/* 11/29/2003 (KMCCARTY): add *INTEL_COMPILER symbols here */
+/* 04/05/2006 (KMCCARTY): add gFortran symbol here */
+#if defined(CLIPPERFortran) || defined(pgiFortran) || defined(__INTEL_COMPILER) || defined(INTEL_COMPILER) || defined(gFortran)
+#define f2cFortran
+#endif
+
+/* RKR: add AbsoftProFortran11 */
+/* VAX/VMS does not let us \-split long #if lines. */ 
+/* Split #if into 2 because some HP-UX can't handle long #if */
+#if !(defined(NAGf90Fortran)||defined(f2cFortran)||defined(hpuxFortran)||defined(apolloFortran)||defined(sunFortran)||defined(IBMR2Fortran)||defined(CRAYFortran))
+#if !(defined(mipsFortran)||defined(DECFortran)||defined(vmsFortran)||defined(CONVEXFortran)||defined(PowerStationFortran)||defined(AbsoftUNIXFortran)||defined(AbsoftProFortran)||defined(AbsoftProFortran11)||defined(SXFortran))
+/* If no Fortran compiler is given, we choose one for the machines we know.   */
+#if defined(lynx) || defined(VAXUltrix)
+#define f2cFortran    /* Lynx:      Only support f2c at the moment.
+                         VAXUltrix: f77 behaves like f2c.
+                           Support f2c or f77 with gcc, vcc with f2c. 
+                           f77 with vcc works, missing link magic for f77 I/O.*/
+#endif
+/* 04/13/00 DM (CFITSIO): Add these lines for NT */
+/*   with PowerStationFortran and and Visual C++ */
+#if defined(WIN32) && !defined(__CYGWIN__)
+#define PowerStationFortran   
+#define VISUAL_CPLUSPLUS
+#endif
+#if defined(g77Fortran)                        /* 11/03/97 PDW (CFITSIO) */
+#define f2cFortran
+#endif
+#if        defined(__CYGWIN__)                 /* 04/11/02 LEB (CFITSIO) */
+#define       f2cFortran 
+#define	      gFortran /* 8/26/08 (KMCCARTY) */
+#endif
+#if        defined(__GNUC__) && defined(linux) /* 06/21/00 PDW (CFITSIO) */
+#define       f2cFortran 
+#define	      gFortran /* 8/26/08 (KMCCARTY) */
+#endif
+#if defined(macintosh)                         /* 11/1999 (CFITSIO) */
+#define f2cFortran
+#define	      gFortran /* 8/26/08 (KMCCARTY) */
+#endif
+#if defined(__APPLE__)                         /* 11/2002 (CFITSIO) */
+#define f2cFortran
+#define	      gFortran /* 8/26/08 (KMCCARTY) */
+#endif
+#if defined(__hpux)             /* 921107: Use __hpux instead of __hp9000s300 */
+#define       hpuxFortran       /*         Should also allow hp9000s7/800 use.*/
+#endif
+#if       defined(apollo)
+#define           apolloFortran /* __CF__APOLLO67 also defines some behavior. */
+#endif
+#if          defined(sun) || defined(__sun) 
+#define              sunFortran
+#endif
+#if       defined(_IBMR2)
+#define            IBMR2Fortran
+#endif
+#if        defined(_CRAY)
+#define             CRAYFortran /*       _CRAYT3E also defines some behavior. */
+#endif
+#if        defined(_SX)
+#define               SXFortran
+#endif
+#if         defined(mips) || defined(__mips)
+#define             mipsFortran
+#endif
+#if          defined(vms) || defined(__vms)
+#define              vmsFortran
+#endif
+#if      defined(__alpha) && defined(__unix__)
+#define              DECFortran
+#endif
+#if   defined(__convex__)
+#define           CONVEXFortran
+#endif
+#if   defined(VISUAL_CPLUSPLUS)
+#define     PowerStationFortran
+#endif
+#endif /* ...Fortran */
+#endif /* ...Fortran */
+
+/* RKR: add AbsoftProFortran11 */
+/* Split #if into 2 because some HP-UX can't handle long #if */
+#if !(defined(NAGf90Fortran)||defined(f2cFortran)||defined(hpuxFortran)||defined(apolloFortran)||defined(sunFortran)||defined(IBMR2Fortran)||defined(CRAYFortran))
+#if !(defined(mipsFortran)||defined(DECFortran)||defined(vmsFortran)||defined(CONVEXFortran)||defined(PowerStationFortran)||defined(AbsoftUNIXFortran)||defined(AbsoftProFortran)||defined(AbsoftProFortran11)||defined(SXFortran))
+/* If your compiler barfs on ' #error', replace # with the trigraph for #     */
+ #error "cfortran.h:  Can't find your environment among:\
+    - GNU gcc (gfortran) on Linux.                                       \
+    - MIPS cc and f77 2.0. (e.g. Silicon Graphics, DECstations, ...)     \
+    - IBM AIX XL C and FORTRAN Compiler/6000 Version 01.01.0000.0000     \
+    - VAX   VMS CC 3.1 and FORTRAN 5.4.                                  \
+    - Alpha VMS DEC C 1.3 and DEC FORTRAN 6.0.                           \
+    - Alpha OSF DEC C and DEC Fortran for OSF/1 AXP Version 1.2          \
+    - Apollo DomainOS 10.2 (sys5.3) with f77 10.7 and cc 6.7.            \
+    - CRAY                                                               \
+    - NEC SX-4 SUPER-UX                                                  \
+    - CONVEX                                                             \
+    - Sun                                                                \
+    - PowerStation Fortran with Visual C++                               \
+    - HP9000s300/s700/s800 Latest test with: HP-UX A.08.07 A 9000/730    \
+    - LynxOS: cc or gcc with f2c.                                        \
+    - VAXUltrix: vcc,cc or gcc with f2c. gcc or cc with f77.             \
+    -            f77 with vcc works; but missing link magic for f77 I/O. \
+    -            NO fort. None of gcc, cc or vcc generate required names.\
+    - f2c/g77:   Use #define    f2cFortran, or cc -Df2cFortran           \
+    - gfortran:  Use #define    gFortran,   or cc -DgFortran             \
+                 (also necessary for g77 with -fno-f2c option)           \
+    - NAG f90: Use #define NAGf90Fortran, or cc -DNAGf90Fortran          \
+    - Absoft UNIX F77: Use #define AbsoftUNIXFortran or cc -DAbsoftUNIXFortran \
+    - Absoft Pro Fortran: Use #define AbsoftProFortran \
+    - Absoft Fortran 10.2 or later:  Use #define  AbsoftProFortran11 or cc -DAbsoftProFortran11 \
+    - Portland Group Fortran: Use #define pgiFortran \
+    - Intel Fortran: Use #define INTEL_COMPILER"
+/* Compiler must throw us out at this point! */
+#endif
+#endif
+
+
+#if defined(VAXC) && !defined(__VAXC)
+#define OLD_VAXC
+#pragma nostandard                       /* Prevent %CC-I-PARAMNOTUSED.       */
+#endif
+
+/* Throughout cfortran.h we use: UN = Uppercase Name.  LN = Lowercase Name.   */
+
+/* RKR: add AbsoftProFortran11 */
+/* "extname" changed to "appendus" below (CFITSIO) */
+#if defined(f2cFortran) || defined(NAGf90Fortran) || defined(DECFortran) || defined(mipsFortran) || defined(apolloFortran) || defined(sunFortran) || defined(CONVEXFortran) || defined(SXFortran) || defined(appendus) || defined(AbsoftProFortran11)
+#define CFC_(UN,LN)            _(LN,_)      /* Lowercase FORTRAN symbols.     */
+#define orig_fcallsc(UN,LN)    CFC_(UN,LN)
+#else 
+#if defined(CRAYFortran) || defined(PowerStationFortran) || defined(AbsoftProFortran)
+#ifdef _CRAY          /* (UN), not UN, circumvents CRAY preprocessor bug.     */
+#define CFC_(UN,LN)            (UN)         /* Uppercase FORTRAN symbols.     */
+#else                 /* At least VISUAL_CPLUSPLUS barfs on (UN), so need UN. */
+#define CFC_(UN,LN)            UN           /* Uppercase FORTRAN symbols.     */
+#endif
+#define orig_fcallsc(UN,LN)    CFC_(UN,LN)  /* CRAY insists on arg.'s here.   */
+#else  /* For following machines one may wish to change the fcallsc default.  */
+#define CF_SAME_NAMESPACE
+#ifdef vmsFortran
+#define CFC_(UN,LN)            LN           /* Either case FORTRAN symbols.   */
+     /* BUT we usually use UN for C macro to FORTRAN routines, so use LN here,*/
+     /* because VAX/VMS doesn't do recursive macros.                          */
+#define orig_fcallsc(UN,LN)    UN
+#else      /* HP-UX without +ppu or IBMR2 without -qextname. NOT reccomended. */
+#define CFC_(UN,LN)            LN           /* Lowercase FORTRAN symbols.     */
+#define orig_fcallsc(UN,LN)    CFC_(UN,LN)
+#endif /*  vmsFortran */
+#endif /* CRAYFortran PowerStationFortran */
+#endif /* ....Fortran */
+
+#define fcallsc(UN,LN)               orig_fcallsc(UN,LN)
+#define preface_fcallsc(P,p,UN,LN)   CFC_(_(P,UN),_(p,LN))
+#define  append_fcallsc(P,p,UN,LN)   CFC_(_(UN,P),_(LN,p))
+
+#define C_FUNCTION(UN,LN)            fcallsc(UN,LN)      
+#define FORTRAN_FUNCTION(UN,LN)      CFC_(UN,LN)
+
+#ifndef COMMON_BLOCK
+#ifndef CONVEXFortran
+#ifndef CLIPPERFortran
+#if     !(defined(AbsoftUNIXFortran)||defined(AbsoftProFortran)||defined(AbsoftProFortran11))
+#define COMMON_BLOCK(UN,LN)          CFC_(UN,LN)
+#else
+#define COMMON_BLOCK(UN,LN)          _(_C,LN)
+#endif  /* AbsoftUNIXFortran or AbsoftProFortran or AbsoftProFortran11 */
+#else
+#define COMMON_BLOCK(UN,LN)          _(LN,__)
+#endif  /* CLIPPERFortran */
+#else
+#define COMMON_BLOCK(UN,LN)          _3(_,LN,_)
+#endif  /* CONVEXFortran */
+#endif  /* COMMON_BLOCK */
+
+#ifndef DOUBLE_PRECISION
+#if defined(CRAYFortran) && !defined(_CRAYT3E)
+#define DOUBLE_PRECISION long double
+#else
+#define DOUBLE_PRECISION double
+#endif
+#endif
+
+#ifndef FORTRAN_REAL
+#if defined(CRAYFortran) &&  defined(_CRAYT3E)
+#define FORTRAN_REAL double
+#else
+#define FORTRAN_REAL float
+#endif
+#endif
+
+#ifdef CRAYFortran
+#ifdef _CRAY
+#include <fortran.h>
+#else
+#include "fortran.h"  /* i.e. if crosscompiling assume user has file. */
+#endif
+#define FLOATVVVVVVV_cfPP (FORTRAN_REAL *)   /* Used for C calls FORTRAN.     */
+/* CRAY's double==float but CRAY says pointers to doubles and floats are diff.*/
+#define VOIDP  (void *)  /* When FORTRAN calls C, we don't know if C routine 
+                            arg.'s have been declared float *, or double *.   */
+#else
+#define FLOATVVVVVVV_cfPP
+#define VOIDP
+#endif
+
+#ifdef vmsFortran
+#if    defined(vms) || defined(__vms)
+#include <descrip.h>
+#else
+#include "descrip.h"  /* i.e. if crosscompiling assume user has file. */
+#endif
+#endif
+
+#ifdef sunFortran
+#if defined(sun) || defined(__sun)
+#include <math.h>     /* Sun's FLOATFUNCTIONTYPE, ASSIGNFLOAT, RETURNFLOAT.  */
+#else
+#include "math.h"     /* i.e. if crosscompiling assume user has file. */
+#endif
+/* At least starting with the default C compiler SC3.0.1 of SunOS 5.3,
+ * FLOATFUNCTIONTYPE, ASSIGNFLOAT, RETURNFLOAT are not required and not in
+ * <math.h>, since sun C no longer promotes C float return values to doubles.
+ * Therefore, only use them if defined.
+ * Even if gcc is being used, assume that it exhibits the Sun C compiler
+ * behavior in order to be able to use *.o from the Sun C compiler.
+ * i.e. If FLOATFUNCTIONTYPE, etc. are in math.h, they required by gcc.
+ */
+#endif
+
+#ifndef apolloFortran
+#define COMMON_BLOCK_DEF(DEFINITION, NAME) extern DEFINITION NAME
+#define CF_NULL_PROTO
+#else                                         /* HP doesn't understand #elif. */
+/* Without ANSI prototyping, Apollo promotes float functions to double.    */
+/* Note that VAX/VMS, IBM, Mips choke on 'type function(...);' prototypes. */
+#define CF_NULL_PROTO ...
+#ifndef __CF__APOLLO67
+#define COMMON_BLOCK_DEF(DEFINITION, NAME) \
+ DEFINITION NAME __attribute((__section(NAME)))
+#else
+#define COMMON_BLOCK_DEF(DEFINITION, NAME) \
+ DEFINITION NAME #attribute[section(NAME)]
+#endif
+#endif
+
+#ifdef __cplusplus
+#undef  CF_NULL_PROTO
+#define CF_NULL_PROTO  ...
+#endif
+
+
+#ifndef USE_NEW_DELETE
+#ifdef __cplusplus
+#define USE_NEW_DELETE 1
+#else
+#define USE_NEW_DELETE 0
+#endif
+#endif
+#if USE_NEW_DELETE
+#define _cf_malloc(N) new char[N]
+#define _cf_free(P)   delete[] P
+#else
+#define _cf_malloc(N) (char *)malloc(N)
+#define _cf_free(P)   free(P)
+#endif
+
+#ifdef mipsFortran
+#define CF_DECLARE_GETARG         int f77argc; char **f77argv
+#define CF_SET_GETARG(ARGC,ARGV)  f77argc = ARGC; f77argv = ARGV
+#else
+#define CF_DECLARE_GETARG
+#define CF_SET_GETARG(ARGC,ARGV)
+#endif
+
+#ifdef OLD_VAXC                          /* Allow %CC-I-PARAMNOTUSED.         */
+#pragma standard                         
+#endif
+
+#define AcfCOMMA ,
+#define AcfCOLON ;
+
+/*-------------------------------------------------------------------------*/
+
+/*               UTILITIES USED WITHIN CFORTRAN.H                          */
+
+#define _cfMIN(A,B) (A<B?A:B)
+
+/* 970211 - XIX.145:
+   firstindexlength  - better name is all_but_last_index_lengths
+   secondindexlength - better name is         last_index_length
+ */
+#define  firstindexlength(A) (sizeof(A[0])==1 ? 1 : (sizeof(A) / sizeof(A[0])) )
+#define secondindexlength(A) (sizeof(A[0])==1 ?      sizeof(A) : sizeof(A[0])  )
+
+/* Behavior of FORTRAN LOGICAL. All machines' LOGICAL is same size as C's int.
+Conversion is automatic except for arrays which require F2CLOGICALV/C2FLOGICALV.
+f2c, MIPS f77 [DECstation, SGI], VAX Ultrix f77,
+HP-UX f77                                        : as in C.
+VAX/VMS FORTRAN, VAX Ultrix fort,
+Absoft Unix Fortran, IBM RS/6000 xlf             : LS Bit = 0/1 = TRUE/FALSE.
+Apollo                                           : neg.   = TRUE, else FALSE. 
+[Apollo accepts -1 as TRUE for function values, but NOT all other neg. values.]
+[DECFortran for Ultrix RISC is also called f77 but is the same as VAX/VMS.]   
+[MIPS f77 treats .eqv./.neqv. as .eq./.ne. and hence requires LOGICAL_STRICT.]*/
+
+#if defined(NAGf90Fortran) || defined(f2cFortran) || defined(mipsFortran) || defined(PowerStationFortran) || defined(hpuxFortran800) || defined(AbsoftUNIXFortran) || defined(AbsoftProFortran) || defined(AbsoftProFortran11) || defined(SXFortran)
+/* SX/PowerStationFortran have 0 and 1 defined, others are neither T nor F.   */
+/* hpuxFortran800 has 0 and 0x01000000 defined. Others are unknown.           */
+#define LOGICAL_STRICT      /* Other Fortran have .eqv./.neqv. == .eq./.ne.   */
+#endif
+
+#define C2FLOGICALV(A,I) \
+ do {int __i; for(__i=0;__i<I;__i++) A[__i]=C2FLOGICAL(A[__i]); } while (0)
+#define F2CLOGICALV(A,I) \
+ do {int __i; for(__i=0;__i<I;__i++) A[__i]=F2CLOGICAL(A[__i]); } while (0)
+
+#if defined(apolloFortran)
+#define C2FLOGICAL(L) ((L)?-1:(L)&~((unsigned)1<<sizeof(int)*8-1))
+#define F2CLOGICAL(L) ((L)<0?(L):0) 
+#else
+#if defined(CRAYFortran)
+#define C2FLOGICAL(L) _btol(L)
+#define F2CLOGICAL(L) _ltob(&(L))     /* Strangely _ltob() expects a pointer. */
+#else
+#if defined(IBMR2Fortran) || defined(vmsFortran) || defined(DECFortran) || defined(AbsoftUNIXFortran)||defined(AbsoftProFortran11)
+/* How come no AbsoftProFortran ? */
+#define C2FLOGICAL(L) ((L)?(L)|1:(L)&~(int)1)
+#define F2CLOGICAL(L) ((L)&1?(L):0)
+#else
+#if defined(CONVEXFortran)
+#define C2FLOGICAL(L) ((L) ? ~0 : 0 )
+#define F2CLOGICAL(L) (L)
+#else   /* others evaluate LOGICALs as for C. */
+#define C2FLOGICAL(L) (L)
+#define F2CLOGICAL(L) (L)
+#ifndef LOGICAL_STRICT
+#undef  C2FLOGICALV
+#undef  F2CLOGICALV
+#define C2FLOGICALV(A,I)
+#define F2CLOGICALV(A,I)
+#endif  /* LOGICAL_STRICT                     */
+#endif  /* CONVEXFortran || All Others        */
+#endif  /* IBMR2Fortran vmsFortran DECFortran AbsoftUNIXFortran */
+#endif  /* CRAYFortran                        */
+#endif  /* apolloFortran                      */
+
+/* 970514 - In addition to CRAY, there may be other machines
+            for which LOGICAL_STRICT makes no sense. */
+#if defined(LOGICAL_STRICT) && !defined(CRAYFortran)
+/* Force C2FLOGICAL to generate only the values for either .TRUE. or .FALSE.
+   SX/PowerStationFortran only have 0 and 1 defined.
+   Elsewhere, only needed if you want to do:
+     logical lvariable
+     if (lvariable .eq.  .true.) then       ! (1)
+   instead of
+     if (lvariable .eqv. .true.) then       ! (2)
+   - (1) may not even be FORTRAN/77 and that Apollo's f77 and IBM's xlf
+     refuse to compile (1), so you are probably well advised to stay away from 
+     (1) and from LOGICAL_STRICT.
+   - You pay a (slight) performance penalty for using LOGICAL_STRICT. */
+#undef  C2FLOGICAL
+#ifdef hpuxFortran800
+#define C2FLOGICAL(L) ((L)?0x01000000:0)
+#else
+#if defined(apolloFortran) || defined(vmsFortran) || defined(DECFortran)
+#define C2FLOGICAL(L) ((L)?-1:0) /* These machines use -1/0 for .true./.false.*/
+#else
+#define C2FLOGICAL(L) ((L)? 1:0) /* All others     use +1/0 for .true./.false.*/
+#endif
+#endif
+#endif /* LOGICAL_STRICT */
+
+/* Convert a vector of C strings into FORTRAN strings. */
+#ifndef __CF__KnR
+static char *c2fstrv(char* cstr, char *fstr, int elem_len, int sizeofcstr)
+#else
+static char *c2fstrv(      cstr,       fstr,     elem_len,     sizeofcstr)
+                     char* cstr; char *fstr; int elem_len; int sizeofcstr;
+#endif
+{ int i,j;
+/* elem_len includes \0 for C strings. Fortran strings don't have term. \0.
+   Useful size of string must be the same in both languages. */
+for (i=0; i<sizeofcstr/elem_len; i++) {
+  for (j=1; j<elem_len && *cstr; j++) *fstr++ = *cstr++;
+  cstr += 1+elem_len-j;
+  for (; j<elem_len; j++) *fstr++ = ' ';
+} /* 95109 - Seems to be returning the original fstr. */
+return fstr-sizeofcstr+sizeofcstr/elem_len; }
+
+/* Convert a vector of FORTRAN strings into C strings. */
+#ifndef __CF__KnR
+static char *f2cstrv(char *fstr, char* cstr, int elem_len, int sizeofcstr)
+#else
+static char *f2cstrv(      fstr,       cstr,     elem_len,     sizeofcstr)
+                     char *fstr; char* cstr; int elem_len; int sizeofcstr; 
+#endif
+{ int i,j;
+/* elem_len includes \0 for C strings. Fortran strings don't have term. \0.
+   Useful size of string must be the same in both languages. */
+cstr += sizeofcstr;
+fstr += sizeofcstr - sizeofcstr/elem_len;
+for (i=0; i<sizeofcstr/elem_len; i++) {
+  *--cstr = '\0';
+  for (j=1; j<elem_len; j++) *--cstr = *--fstr;
+} return cstr; }
+
+/* kill the trailing char t's in string s. */
+#ifndef __CF__KnR
+static char *kill_trailing(char *s, char t)
+#else
+static char *kill_trailing(      s,      t) char *s; char t;
+#endif
+{char *e; 
+e = s + strlen(s);
+if (e>s) {                           /* Need this to handle NULL string.*/
+  while (e>s && *--e==t) {;}         /* Don't follow t's past beginning. */
+  e[*e==t?0:1] = '\0';               /* Handle s[0]=t correctly.       */
+} return s; }
+
+/* kill_trailingn(s,t,e) will kill the trailing t's in string s. e normally 
+points to the terminating '\0' of s, but may actually point to anywhere in s.
+s's new '\0' will be placed at e or earlier in order to remove any trailing t's.
+If e<s string s is left unchanged. */ 
+#ifndef __CF__KnR
+static char *kill_trailingn(char *s, char t, char *e)
+#else
+static char *kill_trailingn(      s,      t,       e) char *s; char t; char *e;
+#endif
+{ 
+if (e==s) *e = '\0';                 /* Kill the string makes sense here.*/
+else if (e>s) {                      /* Watch out for neg. length string.*/
+  while (e>s && *--e==t){;}          /* Don't follow t's past beginning. */
+  e[*e==t?0:1] = '\0';               /* Handle s[0]=t correctly.       */
+} return s; }
+
+/* Note the following assumes that any element which has t's to be chopped off,
+does indeed fill the entire element. */
+#ifndef __CF__KnR
+static char *vkill_trailing(char* cstr, int elem_len, int sizeofcstr, char t)
+#else
+static char *vkill_trailing(      cstr,     elem_len,     sizeofcstr,      t)
+                            char* cstr; int elem_len; int sizeofcstr; char t;
+#endif
+{ int i;
+for (i=0; i<sizeofcstr/elem_len; i++) /* elem_len includes \0 for C strings. */
+  kill_trailingn(cstr+elem_len*i,t,cstr+elem_len*(i+1)-1);
+return cstr; }
+
+#ifdef vmsFortran
+typedef struct dsc$descriptor_s fstring;
+#define DSC$DESCRIPTOR_A(DIMCT)  		                               \
+struct {                                                                       \
+  unsigned short dsc$w_length;	        unsigned char	 dsc$b_dtype;	       \
+  unsigned char	 dsc$b_class;	                 char	*dsc$a_pointer;	       \
+           char	 dsc$b_scale;	        unsigned char	 dsc$b_digits;         \
+  struct {                                                                     \
+    unsigned		       : 3;	  unsigned dsc$v_fl_binscale : 1;      \
+    unsigned dsc$v_fl_redim    : 1;       unsigned dsc$v_fl_column   : 1;      \
+    unsigned dsc$v_fl_coeff    : 1;       unsigned dsc$v_fl_bounds   : 1;      \
+  } dsc$b_aflags;	                                                       \
+  unsigned char	 dsc$b_dimct;	        unsigned long	 dsc$l_arsize;	       \
+           char	*dsc$a_a0;	                 long	 dsc$l_m [DIMCT];      \
+  struct {                                                                     \
+    long dsc$l_l;                         long dsc$l_u;                        \
+  } dsc$bounds [DIMCT];                                                        \
+}
+typedef DSC$DESCRIPTOR_A(1) fstringvector;
+/*typedef DSC$DESCRIPTOR_A(2) fstringarrarr;
+  typedef DSC$DESCRIPTOR_A(3) fstringarrarrarr;*/
+#define initfstr(F,C,ELEMNO,ELEMLEN)                                           \
+( (F).dsc$l_arsize=  ( (F).dsc$w_length                        =(ELEMLEN) )    \
+                    *( (F).dsc$l_m[0]=(F).dsc$bounds[0].dsc$l_u=(ELEMNO)  ),   \
+  (F).dsc$a_a0    =  ( (F).dsc$a_pointer=(C) ) - (F).dsc$w_length          ,(F))
+
+#endif      /* PDW: 2/10/98 (CFITSIO) -- Let VMS see NUM_ELEMS definitions */
+#define _NUM_ELEMS      -1
+#define _NUM_ELEM_ARG   -2
+#define NUM_ELEMS(A)    A,_NUM_ELEMS
+#define NUM_ELEM_ARG(B) *_2(A,B),_NUM_ELEM_ARG
+#define TERM_CHARS(A,B) A,B
+#ifndef __CF__KnR
+static int num_elem(char *strv, unsigned elem_len, int term_char, int num_term)
+#else
+static int num_elem(      strv,          elem_len,     term_char,     num_term)
+                    char *strv; unsigned elem_len; int term_char; int num_term;
+#endif
+/* elem_len is the number of characters in each element of strv, the FORTRAN
+vector of strings. The last element of the vector must begin with at least
+num_term term_char characters, so that this routine can determine how 
+many elements are in the vector. */
+{
+unsigned num,i;
+if (num_term == _NUM_ELEMS || num_term == _NUM_ELEM_ARG) 
+  return term_char;
+if (num_term <=0) num_term = (int)elem_len;
+for (num=0; ; num++) {
+  for (i=0; i<(unsigned)num_term && *strv==term_char; i++,strv++){;}
+  if (i==(unsigned)num_term) break;
+  else strv += elem_len-i;
+}
+if (0) {  /* to prevent not used warnings in gcc (added by ROOT) */
+   c2fstrv(0, 0, 0, 0); f2cstrv(0, 0, 0, 0); kill_trailing(0, 0);
+   vkill_trailing(0, 0, 0, 0); num_elem(0, 0, 0, 0);
+}
+return (int)num;
+}
+/* #endif removed 2/10/98 (CFITSIO) */
+
+/*-------------------------------------------------------------------------*/
+
+/*           UTILITIES FOR C TO USE STRINGS IN FORTRAN COMMON BLOCKS       */
+
+/* C string TO Fortran Common Block STRing. */
+/* DIM is the number of DIMensions of the array in terms of strings, not
+   characters. e.g. char a[12] has DIM = 0, char a[12][4] has DIM = 1, etc. */
+#define C2FCBSTR(CSTR,FSTR,DIM)                                                \
+ c2fstrv((char *)CSTR, (char *)FSTR, sizeof(FSTR)/cfelementsof(FSTR,DIM)+1,    \
+         sizeof(FSTR)+cfelementsof(FSTR,DIM))
+
+/* Fortran Common Block string TO C STRing. */
+#define FCB2CSTR(FSTR,CSTR,DIM)                                                \
+ vkill_trailing(f2cstrv((char *)FSTR, (char *)CSTR,                            \
+                        sizeof(FSTR)/cfelementsof(FSTR,DIM)+1,                 \
+                        sizeof(FSTR)+cfelementsof(FSTR,DIM)),                  \
+                sizeof(FSTR)/cfelementsof(FSTR,DIM)+1,                         \
+                sizeof(FSTR)+cfelementsof(FSTR,DIM), ' ')
+
+#define cfDEREFERENCE0
+#define cfDEREFERENCE1 *
+#define cfDEREFERENCE2 **
+#define cfDEREFERENCE3 ***
+#define cfDEREFERENCE4 ****
+#define cfDEREFERENCE5 *****
+#define cfelementsof(A,D) (sizeof(A)/sizeof(_(cfDEREFERENCE,D)(A)))
+
+/*-------------------------------------------------------------------------*/
+
+/*               UTILITIES FOR C TO CALL FORTRAN SUBROUTINES               */
+
+/* Define lookup tables for how to handle the various types of variables.  */
+
+#ifdef OLD_VAXC                                /* Prevent %CC-I-PARAMNOTUSED. */
+#pragma nostandard
+#endif
+
+#define ZTRINGV_NUM(I)       I
+#define ZTRINGV_ARGFP(I) (*(_2(A,I))) /* Undocumented. For PINT, etc. */
+#define ZTRINGV_ARGF(I) _2(A,I)
+#ifdef CFSUBASFUN
+#define ZTRINGV_ARGS(I) ZTRINGV_ARGF(I)
+#else
+#define ZTRINGV_ARGS(I) _2(B,I)
+#endif
+
+#define    PBYTE_cfVP(A,B) PINT_cfVP(A,B)
+#define  PDOUBLE_cfVP(A,B)
+#define   PFLOAT_cfVP(A,B)
+#ifdef ZTRINGV_ARGS_allows_Pvariables
+/* This allows Pvariables for ARGS. ARGF machinery is above ARGFP.
+ * B is not needed because the variable may be changed by the Fortran routine,
+ * but because B is the only way to access an arbitrary macro argument.       */
+#define     PINT_cfVP(A,B) int  B = (int)A;              /* For ZSTRINGV_ARGS */
+#else
+#define     PINT_cfVP(A,B)
+#endif
+#define PLOGICAL_cfVP(A,B) int *B;      /* Returning LOGICAL in FUNn and SUBn */
+#define    PLONG_cfVP(A,B) PINT_cfVP(A,B)
+#define   PSHORT_cfVP(A,B) PINT_cfVP(A,B)
+
+#define        VCF_INT_S(T,A,B) _(T,VVVVVVV_cfTYPE) B = A;
+#define        VCF_INT_F(T,A,B) _(T,_cfVCF)(A,B)
+/* _cfVCF table is directly mapped to _cfCCC table. */
+#define     BYTE_cfVCF(A,B)
+#define   DOUBLE_cfVCF(A,B)
+#if !defined(__CF__KnR)
+#define    FLOAT_cfVCF(A,B)
+#else
+#define    FLOAT_cfVCF(A,B) FORTRAN_REAL B = A;
+#endif
+#define      INT_cfVCF(A,B)
+#define  LOGICAL_cfVCF(A,B)
+#define     LONG_cfVCF(A,B)
+#define    SHORT_cfVCF(A,B)
+
+/* 980416
+   Cast (void (*)(CF_NULL_PROTO)) causes SunOS CC 4.2 occasionally to barf,
+   while the following equivalent typedef is fine.
+   For consistency use the typedef on all machines.
+ */
+typedef void (*cfCAST_FUNCTION)(CF_NULL_PROTO);
+
+#define VCF(TN,I)       _Icf4(4,V,TN,_(A,I),_(B,I),F)
+#define VVCF(TN,AI,BI)  _Icf4(4,V,TN,AI,BI,S)
+#define        INT_cfV(T,A,B,F) _(VCF_INT_,F)(T,A,B)
+#define       INTV_cfV(T,A,B,F)
+#define      INTVV_cfV(T,A,B,F)
+#define     INTVVV_cfV(T,A,B,F)
+#define    INTVVVV_cfV(T,A,B,F)
+#define   INTVVVVV_cfV(T,A,B,F)
+#define  INTVVVVVV_cfV(T,A,B,F)
+#define INTVVVVVVV_cfV(T,A,B,F)
+#define PINT_cfV(      T,A,B,F) _(T,_cfVP)(A,B)
+#define PVOID_cfV(     T,A,B,F)
+#if defined(apolloFortran) || defined(hpuxFortran800) || defined(AbsoftUNIXFortran) || defined(AbsoftProFortran)
+#define    ROUTINE_cfV(T,A,B,F) void (*B)(CF_NULL_PROTO) = (cfCAST_FUNCTION)A;
+#else
+#define    ROUTINE_cfV(T,A,B,F)
+#endif
+#define     SIMPLE_cfV(T,A,B,F)
+#ifdef vmsFortran
+#define     STRING_cfV(T,A,B,F) static struct {fstring f; unsigned clen;} B =  \
+                                       {{0,DSC$K_DTYPE_T,DSC$K_CLASS_S,NULL},0};
+#define    PSTRING_cfV(T,A,B,F) static fstring B={0,DSC$K_DTYPE_T,DSC$K_CLASS_S,NULL};
+#define    STRINGV_cfV(T,A,B,F) static fstringvector B =                       \
+  {sizeof(A),DSC$K_DTYPE_T,DSC$K_CLASS_A,NULL,0,0,{0,0,1,1,1},1,0,NULL,0,{1,0}};
+#define   PSTRINGV_cfV(T,A,B,F) static fstringvector B =                       \
+          {0,DSC$K_DTYPE_T,DSC$K_CLASS_A,NULL,0,0,{0,0,1,1,1},1,0,NULL,0,{1,0}};
+#else
+#define     STRING_cfV(T,A,B,F) struct {unsigned int clen, flen; char *nombre;} B;
+#define    STRINGV_cfV(T,A,B,F) struct {char *s, *fs; unsigned flen; char *nombre;} B;
+#define    PSTRING_cfV(T,A,B,F) int     B;
+#define   PSTRINGV_cfV(T,A,B,F) struct{char *fs; unsigned int sizeofA,flen;}B;
+#endif
+#define    ZTRINGV_cfV(T,A,B,F)  STRINGV_cfV(T,A,B,F)
+#define   PZTRINGV_cfV(T,A,B,F) PSTRINGV_cfV(T,A,B,F)
+
+/* Note that the actions of the A table were performed inside the AA table.
+   VAX Ultrix vcc, and HP-UX cc, didn't evaluate arguments to functions left to
+   right, so we had to split the original table into the current robust two. */
+#define ACF(NAME,TN,AI,I)      _(TN,_cfSTR)(4,A,NAME,I,AI,_(B,I),0)
+#define   DEFAULT_cfA(M,I,A,B)
+#define   LOGICAL_cfA(M,I,A,B) B=C2FLOGICAL(B);
+#define  PLOGICAL_cfA(M,I,A,B) A=C2FLOGICAL(A);
+#define    STRING_cfA(M,I,A,B)  STRING_cfC(M,I,A,B,sizeof(A))
+#define   PSTRING_cfA(M,I,A,B) PSTRING_cfC(M,I,A,B,sizeof(A))
+#ifdef vmsFortran
+#define  AATRINGV_cfA(    A,B, sA,filA,silA)                                   \
+ initfstr(B,_cf_malloc((sA)-(filA)),(filA),(silA)-1),                          \
+          c2fstrv(A,B.dsc$a_pointer,(silA),(sA));
+#define APATRINGV_cfA(    A,B, sA,filA,silA)                                   \
+ initfstr(B,A,(filA),(silA)-1),c2fstrv(A,A,(silA),(sA));
+#else
+#define  AATRINGV_cfA(    A,B, sA,filA,silA)                                   \
+     (B.s=_cf_malloc((sA)-(filA)),B.fs=c2fstrv(A,B.s,(B.flen=(silA)-1)+1,(sA)));
+#define APATRINGV_cfA(    A,B, sA,filA,silA)                                   \
+ B.fs=c2fstrv(A,A,(B.flen=(silA)-1)+1,B.sizeofA=(sA));
+#endif
+#define   STRINGV_cfA(M,I,A,B)                                                 \
+    AATRINGV_cfA((char *)A,B,sizeof(A),firstindexlength(A),secondindexlength(A))
+#define  PSTRINGV_cfA(M,I,A,B)                                                 \
+   APATRINGV_cfA((char *)A,B,sizeof(A),firstindexlength(A),secondindexlength(A))
+#define   ZTRINGV_cfA(M,I,A,B)  AATRINGV_cfA( (char *)A,B,                     \
+                    (_3(M,_ELEMS_,I))*(( _3(M,_ELEMLEN_,I))+1),                \
+                              (_3(M,_ELEMS_,I)),(_3(M,_ELEMLEN_,I))+1)
+#define  PZTRINGV_cfA(M,I,A,B) APATRINGV_cfA( (char *)A,B,                     \
+                    (_3(M,_ELEMS_,I))*(( _3(M,_ELEMLEN_,I))+1),                \
+                              (_3(M,_ELEMS_,I)),(_3(M,_ELEMLEN_,I))+1)
+
+#define    PBYTE_cfAAP(A,B) &A
+#define  PDOUBLE_cfAAP(A,B) &A
+#define   PFLOAT_cfAAP(A,B) FLOATVVVVVVV_cfPP &A
+#define     PINT_cfAAP(A,B) &A
+#define PLOGICAL_cfAAP(A,B) B= &A         /* B used to keep a common W table. */
+#define    PLONG_cfAAP(A,B) &A
+#define   PSHORT_cfAAP(A,B) &A
+
+#define AACF(TN,AI,I,C) _SEP_(TN,C,cfCOMMA) _Icf(3,AA,TN,AI,_(B,I))
+#define        INT_cfAA(T,A,B) &B
+#define       INTV_cfAA(T,A,B) _(T,VVVVVV_cfPP) A
+#define      INTVV_cfAA(T,A,B) _(T,VVVVV_cfPP)  A[0]
+#define     INTVVV_cfAA(T,A,B) _(T,VVVV_cfPP)   A[0][0]
+#define    INTVVVV_cfAA(T,A,B) _(T,VVV_cfPP)    A[0][0][0]
+#define   INTVVVVV_cfAA(T,A,B) _(T,VV_cfPP)     A[0][0][0][0]
+#define  INTVVVVVV_cfAA(T,A,B) _(T,V_cfPP)      A[0][0][0][0][0]
+#define INTVVVVVVV_cfAA(T,A,B) _(T,_cfPP)       A[0][0][0][0][0][0]
+#define       PINT_cfAA(T,A,B) _(T,_cfAAP)(A,B)
+#define      PVOID_cfAA(T,A,B) (void *) A
+#if defined(apolloFortran) || defined(hpuxFortran800) || defined(AbsoftUNIXFortran)
+#define    ROUTINE_cfAA(T,A,B) &B
+#else
+#define    ROUTINE_cfAA(T,A,B) (cfCAST_FUNCTION)A
+#endif
+#define     STRING_cfAA(T,A,B)  STRING_cfCC(T,A,B)
+#define    PSTRING_cfAA(T,A,B) PSTRING_cfCC(T,A,B)
+#ifdef vmsFortran
+#define    STRINGV_cfAA(T,A,B) &B
+#else
+#ifdef CRAYFortran
+#define    STRINGV_cfAA(T,A,B) _cptofcd(B.fs,B.flen)
+#else
+#define    STRINGV_cfAA(T,A,B) B.fs
+#endif
+#endif
+#define   PSTRINGV_cfAA(T,A,B) STRINGV_cfAA(T,A,B)
+#define    ZTRINGV_cfAA(T,A,B) STRINGV_cfAA(T,A,B)
+#define   PZTRINGV_cfAA(T,A,B) STRINGV_cfAA(T,A,B)
+
+#if defined(vmsFortran) || defined(CRAYFortran)
+#define JCF(TN,I)
+#define KCF(TN,I)
+#else
+#define JCF(TN,I)    _(TN,_cfSTR)(1,J,_(B,I), 0,0,0,0)
+#if defined(AbsoftUNIXFortran)
+#define  DEFAULT_cfJ(B) ,0
+#else
+#define  DEFAULT_cfJ(B)
+#endif
+#define  LOGICAL_cfJ(B) DEFAULT_cfJ(B)
+#define PLOGICAL_cfJ(B) DEFAULT_cfJ(B)
+#define   STRING_cfJ(B) ,B.flen
+#define  PSTRING_cfJ(B) ,B
+#define  STRINGV_cfJ(B) STRING_cfJ(B)
+#define PSTRINGV_cfJ(B) STRING_cfJ(B)
+#define  ZTRINGV_cfJ(B) STRING_cfJ(B)
+#define PZTRINGV_cfJ(B) STRING_cfJ(B)
+
+/* KCF is identical to DCF, except that KCF ZTRING is not empty. */
+#define KCF(TN,I)    _(TN,_cfSTR)(1,KK,_(B,I), 0,0,0,0)
+#if defined(AbsoftUNIXFortran)
+#define  DEFAULT_cfKK(B) , unsigned B
+#else
+#define  DEFAULT_cfKK(B)
+#endif
+#define  LOGICAL_cfKK(B) DEFAULT_cfKK(B)
+#define PLOGICAL_cfKK(B) DEFAULT_cfKK(B)
+#define   STRING_cfKK(B) , unsigned B
+#define  PSTRING_cfKK(B) STRING_cfKK(B)
+#define  STRINGV_cfKK(B) STRING_cfKK(B)
+#define PSTRINGV_cfKK(B) STRING_cfKK(B)
+#define  ZTRINGV_cfKK(B) STRING_cfKK(B)
+#define PZTRINGV_cfKK(B) STRING_cfKK(B)
+#endif
+
+#define WCF(TN,AN,I)      _(TN,_cfSTR)(2,W,AN,_(B,I), 0,0,0)
+#define  DEFAULT_cfW(A,B)
+#define  LOGICAL_cfW(A,B)
+#define PLOGICAL_cfW(A,B) *B=F2CLOGICAL(*B);
+#define   STRING_cfW(A,B) (B.nombre=A,B.nombre[B.clen]!='\0'?B.nombre[B.clen]='\0':0); /* A?="constnt"*/
+#define  PSTRING_cfW(A,B) kill_trailing(A,' ');
+#ifdef vmsFortran
+#define  STRINGV_cfW(A,B) _cf_free(B.dsc$a_pointer);
+#define PSTRINGV_cfW(A,B)                                                      \
+  vkill_trailing(f2cstrv((char*)A, (char*)A,                                   \
+                           B.dsc$w_length+1, B.dsc$l_arsize+B.dsc$l_m[0]),     \
+                   B.dsc$w_length+1, B.dsc$l_arsize+B.dsc$l_m[0], ' ');
+#else
+#define  STRINGV_cfW(A,B) _cf_free(B.s);
+#define PSTRINGV_cfW(A,B) vkill_trailing(                                      \
+         f2cstrv((char*)A,(char*)A,B.flen+1,B.sizeofA), B.flen+1,B.sizeofA,' ');
+#endif
+#define  ZTRINGV_cfW(A,B)      STRINGV_cfW(A,B)
+#define PZTRINGV_cfW(A,B)     PSTRINGV_cfW(A,B)
+
+#define   NCF(TN,I,C)       _SEP_(TN,C,cfCOMMA) _Icf(2,N,TN,_(A,I),0) 
+#define  NNCF(TN,I,C)        UUCF(TN,I,C)
+#define NNNCF(TN,I,C)       _SEP_(TN,C,cfCOLON) _Icf(2,N,TN,_(A,I),0) 
+#define        INT_cfN(T,A) _(T,VVVVVVV_cfTYPE) * A
+#define       INTV_cfN(T,A) _(T,VVVVVV_cfTYPE)  * A
+#define      INTVV_cfN(T,A) _(T,VVVVV_cfTYPE)   * A
+#define     INTVVV_cfN(T,A) _(T,VVVV_cfTYPE)    * A
+#define    INTVVVV_cfN(T,A) _(T,VVV_cfTYPE)     * A
+#define   INTVVVVV_cfN(T,A) _(T,VV_cfTYPE)      * A
+#define  INTVVVVVV_cfN(T,A) _(T,V_cfTYPE)       * A
+#define INTVVVVVVV_cfN(T,A) _(T,_cfTYPE)        * A
+#define       PINT_cfN(T,A) _(T,_cfTYPE)        * A
+#define      PVOID_cfN(T,A) void *                A
+#if defined(apolloFortran) || defined(hpuxFortran800) || defined(AbsoftUNIXFortran)
+#define    ROUTINE_cfN(T,A) void (**A)(CF_NULL_PROTO)
+#else
+#define    ROUTINE_cfN(T,A) void ( *A)(CF_NULL_PROTO)
+#endif
+#ifdef vmsFortran
+#define     STRING_cfN(T,A) fstring *             A
+#define    STRINGV_cfN(T,A) fstringvector *       A
+#else
+#ifdef CRAYFortran
+#define     STRING_cfN(T,A) _fcd                  A
+#define    STRINGV_cfN(T,A) _fcd                  A
+#else
+#define     STRING_cfN(T,A) char *                A
+#define    STRINGV_cfN(T,A) char *                A
+#endif
+#endif
+#define    PSTRING_cfN(T,A)   STRING_cfN(T,A) /* CRAY insists on arg.'s here. */
+#define   PNSTRING_cfN(T,A)   STRING_cfN(T,A) /* CRAY insists on arg.'s here. */
+#define   PPSTRING_cfN(T,A)   STRING_cfN(T,A) /* CRAY insists on arg.'s here. */
+#define   PSTRINGV_cfN(T,A)  STRINGV_cfN(T,A)
+#define    ZTRINGV_cfN(T,A)  STRINGV_cfN(T,A)
+#define   PZTRINGV_cfN(T,A) PSTRINGV_cfN(T,A)
+
+
+/* Apollo 6.7, CRAY, old Sun, VAX/Ultrix vcc/cc and new ultrix
+   can't hack more than 31 arg's.
+   e.g. ultrix >= 4.3 gives message:
+       zow35> cc -c -DDECFortran cfortest.c
+       cfe: Fatal: Out of memory: cfortest.c
+       zow35>
+   Old __hpux had the problem, but new 'HP-UX A.09.03 A 9000/735' is fine
+   if using -Aa, otherwise we have a problem.
+ */
+#ifndef MAX_PREPRO_ARGS
+#if !defined(__GNUC__) && (defined(VAXUltrix) || defined(__CF__APOLLO67) || (defined(sun)&&!defined(__sun)) || defined(_CRAY) || defined(__ultrix__) || (defined(__hpux)&&defined(__CF__KnR)))
+#define MAX_PREPRO_ARGS 31
+#else
+#define MAX_PREPRO_ARGS 99
+#endif
+#endif
+
+#if defined(AbsoftUNIXFortran) || defined(AbsoftProFortran)
+/* NOT NECESSARY FOR Absoft 10.2 and later */
+/* In addition to explicit Absoft stuff, only Absoft requires:
+   - DEFAULT coming from _cfSTR.
+     DEFAULT could have been called e.g. INT, but keep it for clarity.
+   - M term in CFARGT14 and CFARGT14FS.
+ */
+#define ABSOFT_cf1(T0) _(T0,_cfSTR)(0,ABSOFT1,0,0,0,0,0)
+#define ABSOFT_cf2(T0) _(T0,_cfSTR)(0,ABSOFT2,0,0,0,0,0)
+#define ABSOFT_cf3(T0) _(T0,_cfSTR)(0,ABSOFT3,0,0,0,0,0)
+#define DEFAULT_cfABSOFT1
+#define LOGICAL_cfABSOFT1
+#define  STRING_cfABSOFT1 ,MAX_LEN_FORTRAN_FUNCTION_STRING
+#define DEFAULT_cfABSOFT2
+#define LOGICAL_cfABSOFT2
+#define  STRING_cfABSOFT2 ,unsigned D0
+#define DEFAULT_cfABSOFT3
+#define LOGICAL_cfABSOFT3
+#define  STRING_cfABSOFT3 ,D0
+#else
+#define ABSOFT_cf1(T0)
+#define ABSOFT_cf2(T0)
+#define ABSOFT_cf3(T0)
+#endif
+
+/* _Z introduced to cicumvent IBM and HP silly preprocessor warning.
+   e.g. "Macro CFARGT14 invoked with a null argument."
+ */
+#define _Z
+
+#define  CFARGT14S(S,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE)                \
+ S(T1,1)   S(T2,2)   S(T3,3)    S(T4,4)    S(T5,5)    S(T6,6)    S(T7,7)       \
+ S(T8,8)   S(T9,9)   S(TA,10)   S(TB,11)   S(TC,12)   S(TD,13)   S(TE,14)
+#define  CFARGT27S(S,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,TP,TQ,TR) \
+ S(T1,1)   S(T2,2)   S(T3,3)    S(T4,4)    S(T5,5)    S(T6,6)    S(T7,7)       \
+ S(T8,8)   S(T9,9)   S(TA,10)   S(TB,11)   S(TC,12)   S(TD,13)   S(TE,14)      \
+ S(TF,15)  S(TG,16)  S(TH,17)   S(TI,18)   S(TJ,19)   S(TK,20)   S(TL,21)      \
+ S(TM,22)  S(TN,23)  S(TO,24)   S(TP,25)   S(TQ,26)   S(TR,27)
+
+#define  CFARGT14FS(F,S,M,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE)           \
+ F(T1,1,0) F(T2,2,1) F(T3,3,1)  F(T4,4,1)  F(T5,5,1)  F(T6,6,1)  F(T7,7,1)     \
+ F(T8,8,1) F(T9,9,1) F(TA,10,1) F(TB,11,1) F(TC,12,1) F(TD,13,1) F(TE,14,1)    \
+ M       CFARGT14S(S,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE)
+#define  CFARGT27FS(F,S,M,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,TP,TQ,TR) \
+ F(T1,1,0)  F(T2,2,1)  F(T3,3,1)  F(T4,4,1)  F(T5,5,1)  F(T6,6,1)  F(T7,7,1)   \
+ F(T8,8,1)  F(T9,9,1)  F(TA,10,1) F(TB,11,1) F(TC,12,1) F(TD,13,1) F(TE,14,1)  \
+ F(TF,15,1) F(TG,16,1) F(TH,17,1) F(TI,18,1) F(TJ,19,1) F(TK,20,1) F(TL,21,1)  \
+ F(TM,22,1) F(TN,23,1) F(TO,24,1) F(TP,25,1) F(TQ,26,1) F(TR,27,1)             \
+ M       CFARGT27S(S,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,TP,TQ,TR)
+
+#if !(defined(PowerStationFortran)||defined(hpuxFortran800))
+/*  Old CFARGT14 -> CFARGT14FS as seen below, for Absoft cross-compile yields:
+      SunOS> cc -c -Xa -DAbsoftUNIXFortran c.c
+      "c.c", line 406: warning: argument mismatch
+    Haven't checked if this is ANSI C or a SunOS bug. SunOS -Xs works ok.
+    Behavior is most clearly seen in example:
+      #define A 1 , 2
+      #define  C(X,Y,Z) x=X. y=Y. z=Z.
+      #define  D(X,Y,Z) C(X,Y,Z)
+      D(x,A,z)
+    Output from preprocessor is: x = x . y = 1 . z = 2 .
+ #define CFARGT14(F,S,M,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE) \
+       CFARGT14FS(F,S,M,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE)
+*/
+#define  CFARGT14(F,S,M,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE)             \
+ F(T1,1,0) F(T2,2,1) F(T3,3,1)  F(T4,4,1)  F(T5,5,1)  F(T6,6,1)  F(T7,7,1)     \
+ F(T8,8,1) F(T9,9,1) F(TA,10,1) F(TB,11,1) F(TC,12,1) F(TD,13,1) F(TE,14,1)    \
+ M       CFARGT14S(S,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE)
+#define  CFARGT27(F,S,M,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,TP,TQ,TR) \
+ F(T1,1,0)  F(T2,2,1)  F(T3,3,1)  F(T4,4,1)  F(T5,5,1)  F(T6,6,1)  F(T7,7,1)   \
+ F(T8,8,1)  F(T9,9,1)  F(TA,10,1) F(TB,11,1) F(TC,12,1) F(TD,13,1) F(TE,14,1)  \
+ F(TF,15,1) F(TG,16,1) F(TH,17,1) F(TI,18,1) F(TJ,19,1) F(TK,20,1) F(TL,21,1)  \
+ F(TM,22,1) F(TN,23,1) F(TO,24,1) F(TP,25,1) F(TQ,26,1) F(TR,27,1)             \
+ M       CFARGT27S(S,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,TP,TQ,TR)
+
+#define  CFARGT20(F,S,M,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK) \
+ F(T1,1,0)  F(T2,2,1)  F(T3,3,1)  F(T4,4,1)  F(T5,5,1)  F(T6,6,1)  F(T7,7,1)   \
+ F(T8,8,1)  F(T9,9,1)  F(TA,10,1) F(TB,11,1) F(TC,12,1) F(TD,13,1) F(TE,14,1)  \
+ F(TF,15,1) F(TG,16,1) F(TH,17,1) F(TI,18,1) F(TJ,19,1) F(TK,20,1)             \
+ S(T1,1)    S(T2,2)    S(T3,3)    S(T4,4)    S(T5,5)    S(T6,6)    S(T7,7)     \
+ S(T8,8)    S(T9,9)    S(TA,10)   S(TB,11)   S(TC,12)   S(TD,13)   S(TE,14)    \
+ S(TF,15)   S(TG,16)   S(TH,17)   S(TI,18)   S(TJ,19)   S(TK,20)
+#define CFARGTA14(F,S,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC,AD,AE) \
+ F(T1,A1,1,0)  F(T2,A2,2,1)  F(T3,A3,3,1) F(T4,A4,4,1)  F(T5,A5,5,1)  F(T6,A6,6,1)  \
+ F(T7,A7,7,1)  F(T8,A8,8,1)  F(T9,A9,9,1) F(TA,AA,10,1) F(TB,AB,11,1) F(TC,AC,12,1) \
+ F(TD,AD,13,1) F(TE,AE,14,1) S(T1,1)      S(T2,2)       S(T3,3)       S(T4,4)       \
+ S(T5,5)       S(T6,6)       S(T7,7)      S(T8,8)       S(T9,9)       S(TA,10)      \
+ S(TB,11)      S(TC,12)      S(TD,13)     S(TE,14)
+#if MAX_PREPRO_ARGS>31
+#define CFARGTA20(F,S,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC,AD,AE,AF,AG,AH,AI,AJ,AK) \
+ F(T1,A1,1,0)  F(T2,A2,2,1)  F(T3,A3,3,1)  F(T4,A4,4,1)  F(T5,A5,5,1)  F(T6,A6,6,1)  \
+ F(T7,A7,7,1)  F(T8,A8,8,1)  F(T9,A9,9,1)  F(TA,AA,10,1) F(TB,AB,11,1) F(TC,AC,12,1) \
+ F(TD,AD,13,1) F(TE,AE,14,1) F(TF,AF,15,1) F(TG,AG,16,1) F(TH,AH,17,1) F(TI,AI,18,1) \
+ F(TJ,AJ,19,1) F(TK,AK,20,1) S(T1,1)       S(T2,2)       S(T3,3)       S(T4,4)       \
+ S(T5,5)       S(T6,6)       S(T7,7)       S(T8,8)       S(T9,9)       S(TA,10)      \
+ S(TB,11)      S(TC,12)      S(TD,13)      S(TE,14)      S(TF,15)      S(TG,16)      \
+ S(TH,17)      S(TI,18)      S(TJ,19)      S(TK,20)
+#define CFARGTA27(F,S,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,TP,TQ,TR,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC,AD,AE,AF,AG,AH,AI,AJ,AK,AL,AM,AN,AO,AP,AQ,AR) \
+ F(T1,A1,1,0)  F(T2,A2,2,1)  F(T3,A3,3,1)  F(T4,A4,4,1)  F(T5,A5,5,1)  F(T6,A6,6,1)  \
+ F(T7,A7,7,1)  F(T8,A8,8,1)  F(T9,A9,9,1)  F(TA,AA,10,1) F(TB,AB,11,1) F(TC,AC,12,1) \
+ F(TD,AD,13,1) F(TE,AE,14,1) F(TF,AF,15,1) F(TG,AG,16,1) F(TH,AH,17,1) F(TI,AI,18,1) \
+ F(TJ,AJ,19,1) F(TK,AK,20,1) F(TL,AL,21,1) F(TM,AM,22,1) F(TN,AN,23,1) F(TO,AO,24,1) \
+ F(TP,AP,25,1) F(TQ,AQ,26,1) F(TR,AR,27,1) S(T1,1)       S(T2,2)       S(T3,3)       \
+ S(T4,4)       S(T5,5)       S(T6,6)       S(T7,7)       S(T8,8)       S(T9,9)       \
+ S(TA,10)      S(TB,11)      S(TC,12)      S(TD,13)      S(TE,14)      S(TF,15)      \
+ S(TG,16)      S(TH,17)      S(TI,18)      S(TJ,19)      S(TK,20)      S(TL,21)      \
+ S(TM,22)      S(TN,23)      S(TO,24)      S(TP,25)      S(TQ,26)      S(TR,27)
+#endif
+#else
+#define  CFARGT14(F,S,M,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE)             \
+ F(T1,1,0) S(T1,1) F(T2,2,1)  S(T2,2)  F(T3,3,1)  S(T3,3)  F(T4,4,1)  S(T4,4)  \
+ F(T5,5,1) S(T5,5) F(T6,6,1)  S(T6,6)  F(T7,7,1)  S(T7,7)  F(T8,8,1)  S(T8,8)  \
+ F(T9,9,1) S(T9,9) F(TA,10,1) S(TA,10) F(TB,11,1) S(TB,11) F(TC,12,1) S(TC,12) \
+ F(TD,13,1) S(TD,13) F(TE,14,1) S(TE,14)
+#define  CFARGT27(F,S,M,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,TP,TQ,TR) \
+ F(T1,1,0)  S(T1,1)  F(T2,2,1)  S(T2,2)  F(T3,3,1)  S(T3,3)  F(T4,4,1)  S(T4,4)  \
+ F(T5,5,1)  S(T5,5)  F(T6,6,1)  S(T6,6)  F(T7,7,1)  S(T7,7)  F(T8,8,1)  S(T8,8)  \
+ F(T9,9,1)  S(T9,9)  F(TA,10,1) S(TA,10) F(TB,11,1) S(TB,11) F(TC,12,1) S(TC,12) \
+ F(TD,13,1) S(TD,13) F(TE,14,1) S(TE,14) F(TF,15,1) S(TF,15) F(TG,16,1) S(TG,16) \
+ F(TH,17,1) S(TH,17) F(TI,18,1) S(TI,18) F(TJ,19,1) S(TJ,19) F(TK,20,1) S(TK,20) \
+ F(TL,21,1) S(TL,21) F(TM,22,1) S(TM,22) F(TN,23,1) S(TN,23) F(TO,24,1) S(TO,24) \
+ F(TP,25,1) S(TP,25) F(TQ,26,1) S(TQ,26) F(TR,27,1) S(TR,27)
+
+#define  CFARGT20(F,S,M,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK) \
+ F(T1,1,0)  S(T1,1)  F(T2,2,1)  S(T2,2)  F(T3,3,1)  S(T3,3)  F(T4,4,1)  S(T4,4)  \
+ F(T5,5,1)  S(T5,5)  F(T6,6,1)  S(T6,6)  F(T7,7,1)  S(T7,7)  F(T8,8,1)  S(T8,8)  \
+ F(T9,9,1)  S(T9,9)  F(TA,10,1) S(TA,10) F(TB,11,1) S(TB,11) F(TC,12,1) S(TC,12) \
+ F(TD,13,1) S(TD,13) F(TE,14,1) S(TE,14) F(TF,15,1) S(TF,15) F(TG,16,1) S(TG,16) \
+ F(TH,17,1) S(TH,17) F(TI,18,1) S(TI,18) F(TJ,19,1) S(TJ,19) F(TK,20,1) S(TK,20)
+#define CFARGTA14(F,S,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC,AD,AE) \
+ F(T1,A1,1,0)  S(T1,1)  F(T2,A2,2,1)  S(T2,2)  F(T3,A3,3,1)  S(T3,3)           \
+ F(T4,A4,4,1)  S(T4,4)  F(T5,A5,5,1)  S(T5,5)  F(T6,A6,6,1)  S(T6,6)           \
+ F(T7,A7,7,1)  S(T7,7)  F(T8,A8,8,1)  S(T8,8)  F(T9,A9,9,1)  S(T9,9)           \
+ F(TA,AA,10,1) S(TA,10) F(TB,AB,11,1) S(TB,11) F(TC,AC,12,1) S(TC,12)          \
+ F(TD,AD,13,1) S(TD,13) F(TE,AE,14,1) S(TE,14)
+#if MAX_PREPRO_ARGS>31
+#define CFARGTA20(F,S,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC,AD,AE,AF,AG,AH,AI,AJ,AK) \
+ F(T1,A1,1,0)  S(T1,1)  F(T2,A2,2,1)  S(T2,2)  F(T3,A3,3,1)  S(T3,3)           \
+ F(T4,A4,4,1)  S(T4,4)  F(T5,A5,5,1)  S(T5,5)  F(T6,A6,6,1)  S(T6,6)           \
+ F(T7,A7,7,1)  S(T7,7)  F(T8,A8,8,1)  S(T8,8)  F(T9,A9,9,1)  S(T9,9)           \
+ F(TA,AA,10,1) S(TA,10) F(TB,AB,11,1) S(TB,11) F(TC,AC,12,1) S(TC,12)          \
+ F(TD,AD,13,1) S(TD,13) F(TE,AE,14,1) S(TE,14) F(TF,AF,15,1) S(TF,15)          \
+ F(TG,AG,16,1) S(TG,16) F(TH,AH,17,1) S(TH,17) F(TI,AI,18,1) S(TI,18)          \
+ F(TJ,AJ,19,1) S(TJ,19) F(TK,AK,20,1) S(TK,20)                
+#define CFARGTA27(F,S,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,TP,TQ,TR,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC,AD,AE,AF,AG,AH,AI,AJ,AK,AL,AM,AN,AO,AP,AQ,AR) \
+ F(T1,A1,1,0)  S(T1,1)  F(T2,A2,2,1)  S(T2,2)  F(T3,A3,3,1)  S(T3,3)           \
+ F(T4,A4,4,1)  S(T4,4)  F(T5,A5,5,1)  S(T5,5)  F(T6,A6,6,1)  S(T6,6)           \
+ F(T7,A7,7,1)  S(T7,7)  F(T8,A8,8,1)  S(T8,8)  F(T9,A9,9,1)  S(T9,9)           \
+ F(TA,AA,10,1) S(TA,10) F(TB,AB,11,1) S(TB,11) F(TC,AC,12,1) S(TC,12)          \
+ F(TD,AD,13,1) S(TD,13) F(TE,AE,14,1) S(TE,14) F(TF,AF,15,1) S(TF,15)          \
+ F(TG,AG,16,1) S(TG,16) F(TH,AH,17,1) S(TH,17) F(TI,AI,18,1) S(TI,18)          \
+ F(TJ,AJ,19,1) S(TJ,19) F(TK,AK,20,1) S(TK,20) F(TL,AL,21,1) S(TL,21)          \
+ F(TM,AM,22,1) S(TM,22) F(TN,AN,23,1) S(TN,23) F(TO,AO,24,1) S(TO,24)          \
+ F(TP,AP,25,1) S(TP,25) F(TQ,AQ,26,1) S(TQ,26) F(TR,AR,27,1) S(TR,27)
+#endif
+#endif
+
+
+#define PROTOCCALLSFSUB1( UN,LN,T1) \
+        PROTOCCALLSFSUB14(UN,LN,T1,CF_0,CF_0,CF_0,CF_0,CF_0,CF_0,CF_0,CF_0,CF_0,CF_0,CF_0,CF_0,CF_0)
+#define PROTOCCALLSFSUB2( UN,LN,T1,T2) \
+        PROTOCCALLSFSUB14(UN,LN,T1,T2,CF_0,CF_0,CF_0,CF_0,CF_0,CF_0,CF_0,CF_0,CF_0,CF_0,CF_0,CF_0)
+#define PROTOCCALLSFSUB3( UN,LN,T1,T2,T3) \
+        PROTOCCALLSFSUB14(UN,LN,T1,T2,T3,CF_0,CF_0,CF_0,CF_0,CF_0,CF_0,CF_0,CF_0,CF_0,CF_0,CF_0)
+#define PROTOCCALLSFSUB4( UN,LN,T1,T2,T3,T4) \
+        PROTOCCALLSFSUB14(UN,LN,T1,T2,T3,T4,CF_0,CF_0,CF_0,CF_0,CF_0,CF_0,CF_0,CF_0,CF_0,CF_0)
+#define PROTOCCALLSFSUB5( UN,LN,T1,T2,T3,T4,T5) \
+        PROTOCCALLSFSUB14(UN,LN,T1,T2,T3,T4,T5,CF_0,CF_0,CF_0,CF_0,CF_0,CF_0,CF_0,CF_0,CF_0)
+#define PROTOCCALLSFSUB6( UN,LN,T1,T2,T3,T4,T5,T6) \
+        PROTOCCALLSFSUB14(UN,LN,T1,T2,T3,T4,T5,T6,CF_0,CF_0,CF_0,CF_0,CF_0,CF_0,CF_0,CF_0)
+#define PROTOCCALLSFSUB7( UN,LN,T1,T2,T3,T4,T5,T6,T7) \
+        PROTOCCALLSFSUB14(UN,LN,T1,T2,T3,T4,T5,T6,T7,CF_0,CF_0,CF_0,CF_0,CF_0,CF_0,CF_0)
+#define PROTOCCALLSFSUB8( UN,LN,T1,T2,T3,T4,T5,T6,T7,T8) \
+        PROTOCCALLSFSUB14(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,CF_0,CF_0,CF_0,CF_0,CF_0,CF_0)
+#define PROTOCCALLSFSUB9( UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9) \
+        PROTOCCALLSFSUB14(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,CF_0,CF_0,CF_0,CF_0,CF_0)
+#define PROTOCCALLSFSUB10(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA) \
+        PROTOCCALLSFSUB14(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,CF_0,CF_0,CF_0,CF_0)
+#define PROTOCCALLSFSUB11(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB) \
+        PROTOCCALLSFSUB14(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,CF_0,CF_0,CF_0)
+#define PROTOCCALLSFSUB12(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC) \
+        PROTOCCALLSFSUB14(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,CF_0,CF_0)
+#define PROTOCCALLSFSUB13(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD) \
+        PROTOCCALLSFSUB14(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,CF_0)
+
+
+#define PROTOCCALLSFSUB15(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF) \
+        PROTOCCALLSFSUB20(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,CF_0,CF_0,CF_0,CF_0,CF_0)
+#define PROTOCCALLSFSUB16(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG) \
+        PROTOCCALLSFSUB20(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,CF_0,CF_0,CF_0,CF_0)
+#define PROTOCCALLSFSUB17(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH) \
+        PROTOCCALLSFSUB20(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,CF_0,CF_0,CF_0)
+#define PROTOCCALLSFSUB18(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI) \
+        PROTOCCALLSFSUB20(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,CF_0,CF_0)
+#define PROTOCCALLSFSUB19(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ) \
+        PROTOCCALLSFSUB20(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,CF_0)
+
+#define PROTOCCALLSFSUB21(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL) \
+        PROTOCCALLSFSUB27(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,CF_0,CF_0,CF_0,CF_0,CF_0,CF_0)
+#define PROTOCCALLSFSUB22(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM) \
+        PROTOCCALLSFSUB27(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,CF_0,CF_0,CF_0,CF_0,CF_0)
+#define PROTOCCALLSFSUB23(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN) \
+        PROTOCCALLSFSUB27(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,CF_0,CF_0,CF_0,CF_0)
+#define PROTOCCALLSFSUB24(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO) \
+        PROTOCCALLSFSUB27(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,CF_0,CF_0,CF_0)
+#define PROTOCCALLSFSUB25(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,TP) \
+        PROTOCCALLSFSUB27(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,TP,CF_0,CF_0)
+#define PROTOCCALLSFSUB26(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,TP,TQ) \
+        PROTOCCALLSFSUB27(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,TP,TQ,CF_0)
+
+
+#ifndef FCALLSC_QUALIFIER
+#ifdef VISUAL_CPLUSPLUS
+#define FCALLSC_QUALIFIER __stdcall
+#else
+#define FCALLSC_QUALIFIER
+#endif
+#endif
+
+#ifdef __cplusplus
+#define CFextern extern "C"
+#else
+#define CFextern extern
+#endif
+
+
+#ifdef CFSUBASFUN
+#define PROTOCCALLSFSUB0(UN,LN) \
+   PROTOCCALLSFFUN0( VOID,UN,LN)
+#define PROTOCCALLSFSUB14(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE) \
+   PROTOCCALLSFFUN14(VOID,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE)
+#define PROTOCCALLSFSUB20(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK)\
+   PROTOCCALLSFFUN20(VOID,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK)
+#define PROTOCCALLSFSUB27(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,TP,TQ,TR)\
+   PROTOCCALLSFFUN27(VOID,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,TP,TQ,TR)
+#else
+/* Note: Prevent compiler warnings, null #define PROTOCCALLSFSUB14/20 after 
+   #include-ing cfortran.h if calling the FORTRAN wrapper within the same 
+   source code where the wrapper is created. */
+#define PROTOCCALLSFSUB0(UN,LN)     _(VOID,_cfPU)(CFC_(UN,LN))();
+#ifndef __CF__KnR
+#define PROTOCCALLSFSUB14(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE) \
+ _(VOID,_cfPU)(CFC_(UN,LN))( CFARGT14(NCF,KCF,_Z,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE) );
+#define PROTOCCALLSFSUB20(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK)\
+ _(VOID,_cfPU)(CFC_(UN,LN))( CFARGT20(NCF,KCF,_Z,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK) );
+#define PROTOCCALLSFSUB27(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,TP,TQ,TR)\
+ _(VOID,_cfPU)(CFC_(UN,LN))( CFARGT27(NCF,KCF,_Z,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,TP,TQ,TR) );
+#else
+#define PROTOCCALLSFSUB14(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE)     \
+         PROTOCCALLSFSUB0(UN,LN)
+#define PROTOCCALLSFSUB20(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK) \
+         PROTOCCALLSFSUB0(UN,LN)
+#define PROTOCCALLSFSUB27(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,TP,TQ,TR) \
+         PROTOCCALLSFSUB0(UN,LN)
+#endif
+#endif
+
+
+#ifdef OLD_VAXC                                  /* Allow %CC-I-PARAMNOTUSED. */
+#pragma standard
+#endif
+
+
+#define CCALLSFSUB1( UN,LN,T1,                        A1)         \
+        CCALLSFSUB5 (UN,LN,T1,CF_0,CF_0,CF_0,CF_0,A1,0,0,0,0)
+#define CCALLSFSUB2( UN,LN,T1,T2,                     A1,A2)      \
+        CCALLSFSUB5 (UN,LN,T1,T2,CF_0,CF_0,CF_0,A1,A2,0,0,0)
+#define CCALLSFSUB3( UN,LN,T1,T2,T3,                  A1,A2,A3)   \
+        CCALLSFSUB5 (UN,LN,T1,T2,T3,CF_0,CF_0,A1,A2,A3,0,0)
+#define CCALLSFSUB4( UN,LN,T1,T2,T3,T4,               A1,A2,A3,A4)\
+        CCALLSFSUB5 (UN,LN,T1,T2,T3,T4,CF_0,A1,A2,A3,A4,0)
+#define CCALLSFSUB5( UN,LN,T1,T2,T3,T4,T5,            A1,A2,A3,A4,A5)          \
+        CCALLSFSUB10(UN,LN,T1,T2,T3,T4,T5,CF_0,CF_0,CF_0,CF_0,CF_0,A1,A2,A3,A4,A5,0,0,0,0,0)
+#define CCALLSFSUB6( UN,LN,T1,T2,T3,T4,T5,T6,         A1,A2,A3,A4,A5,A6)       \
+        CCALLSFSUB10(UN,LN,T1,T2,T3,T4,T5,T6,CF_0,CF_0,CF_0,CF_0,A1,A2,A3,A4,A5,A6,0,0,0,0)
+#define CCALLSFSUB7( UN,LN,T1,T2,T3,T4,T5,T6,T7,      A1,A2,A3,A4,A5,A6,A7)    \
+        CCALLSFSUB10(UN,LN,T1,T2,T3,T4,T5,T6,T7,CF_0,CF_0,CF_0,A1,A2,A3,A4,A5,A6,A7,0,0,0)
+#define CCALLSFSUB8( UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,   A1,A2,A3,A4,A5,A6,A7,A8) \
+        CCALLSFSUB10(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,CF_0,CF_0,A1,A2,A3,A4,A5,A6,A7,A8,0,0)
+#define CCALLSFSUB9( UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,A1,A2,A3,A4,A5,A6,A7,A8,A9)\
+        CCALLSFSUB10(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,CF_0,A1,A2,A3,A4,A5,A6,A7,A8,A9,0)
+#define CCALLSFSUB10(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA)\
+        CCALLSFSUB14(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,CF_0,CF_0,CF_0,CF_0,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,0,0,0,0)
+#define CCALLSFSUB11(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB)\
+        CCALLSFSUB14(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,CF_0,CF_0,CF_0,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,0,0,0)
+#define CCALLSFSUB12(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC)\
+        CCALLSFSUB14(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,CF_0,CF_0,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC,0,0)
+#define CCALLSFSUB13(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC,AD)\
+        CCALLSFSUB14(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,CF_0,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC,AD,0)
+
+#ifdef __cplusplus
+#define CPPPROTOCLSFSUB0( UN,LN)
+#define CPPPROTOCLSFSUB14(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE)
+#define CPPPROTOCLSFSUB20(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK)
+#define CPPPROTOCLSFSUB27(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,TP,TQ,TR)
+#else
+#define CPPPROTOCLSFSUB0(UN,LN) \
+        PROTOCCALLSFSUB0(UN,LN)
+#define CPPPROTOCLSFSUB14(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE)     \
+        PROTOCCALLSFSUB14(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE)
+#define CPPPROTOCLSFSUB20(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK) \
+        PROTOCCALLSFSUB20(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK)
+#define CPPPROTOCLSFSUB27(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,TP,TQ,TR) \
+        PROTOCCALLSFSUB27(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,TP,TQ,TR)
+#endif
+
+#ifdef CFSUBASFUN
+#define CCALLSFSUB0(UN,LN) CCALLSFFUN0(UN,LN)
+#define CCALLSFSUB14(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC,AD,AE)\
+        CCALLSFFUN14(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC,AD,AE)
+#else
+/* do{...}while(0) allows if(a==b) FORT(); else BORT(); */
+#define CCALLSFSUB0( UN,LN) do{CPPPROTOCLSFSUB0(UN,LN) CFC_(UN,LN)();}while(0)
+#define CCALLSFSUB14(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC,AD,AE)\
+do{VVCF(T1,A1,B1) VVCF(T2,A2,B2) VVCF(T3,A3,B3) VVCF(T4,A4,B4) VVCF(T5,A5,B5)  \
+   VVCF(T6,A6,B6) VVCF(T7,A7,B7) VVCF(T8,A8,B8) VVCF(T9,A9,B9) VVCF(TA,AA,B10) \
+   VVCF(TB,AB,B11) VVCF(TC,AC,B12) VVCF(TD,AD,B13) VVCF(TE,AE,B14)             \
+   CPPPROTOCLSFSUB14(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE)          \
+   ACF(LN,T1,A1,1)  ACF(LN,T2,A2,2)  ACF(LN,T3,A3,3)                           \
+   ACF(LN,T4,A4,4)  ACF(LN,T5,A5,5)  ACF(LN,T6,A6,6)  ACF(LN,T7,A7,7)          \
+   ACF(LN,T8,A8,8)  ACF(LN,T9,A9,9)  ACF(LN,TA,AA,10) ACF(LN,TB,AB,11)         \
+   ACF(LN,TC,AC,12) ACF(LN,TD,AD,13) ACF(LN,TE,AE,14)                          \
+   CFC_(UN,LN)( CFARGTA14(AACF,JCF,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC,AD,AE) );\
+   WCF(T1,A1,1)  WCF(T2,A2,2)  WCF(T3,A3,3)  WCF(T4,A4,4)  WCF(T5,A5,5)        \
+   WCF(T6,A6,6)  WCF(T7,A7,7)  WCF(T8,A8,8)  WCF(T9,A9,9)  WCF(TA,AA,10)       \
+   WCF(TB,AB,11) WCF(TC,AC,12) WCF(TD,AD,13) WCF(TE,AE,14)      }while(0)
+#endif
+
+
+#if MAX_PREPRO_ARGS>31
+#define CCALLSFSUB15(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC,AD,AE,AF)\
+        CCALLSFSUB20(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,CF_0,CF_0,CF_0,CF_0,CF_0,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC,AD,AE,AF,0,0,0,0,0)
+#define CCALLSFSUB16(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC,AD,AE,AF,AG)\
+        CCALLSFSUB20(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,CF_0,CF_0,CF_0,CF_0,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC,AD,AE,AF,AG,0,0,0,0)
+#define CCALLSFSUB17(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC,AD,AE,AF,AG,AH)\
+        CCALLSFSUB20(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,CF_0,CF_0,CF_0,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC,AD,AE,AF,AG,AH,0,0,0)
+#define CCALLSFSUB18(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC,AD,AE,AF,AG,AH,AI)\
+        CCALLSFSUB20(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,CF_0,CF_0,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC,AD,AE,AF,AG,AH,AI,0,0)
+#define CCALLSFSUB19(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC,AD,AE,AF,AG,AH,AI,AJ)\
+        CCALLSFSUB20(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,CF_0,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC,AD,AE,AF,AG,AH,AI,AJ,0)
+
+#ifdef CFSUBASFUN
+#define CCALLSFSUB20(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH, \
+        TI,TJ,TK, A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC,AD,AE,AF,AG,AH,AI,AJ,AK) \
+        CCALLSFFUN20(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH, \
+        TI,TJ,TK, A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC,AD,AE,AF,AG,AH,AI,AJ,AK)
+#else
+#define CCALLSFSUB20(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH, \
+        TI,TJ,TK, A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC,AD,AE,AF,AG,AH,AI,AJ,AK) \
+do{VVCF(T1,A1,B1)  VVCF(T2,A2,B2)  VVCF(T3,A3,B3)  VVCF(T4,A4,B4)  VVCF(T5,A5,B5)   \
+   VVCF(T6,A6,B6)  VVCF(T7,A7,B7)  VVCF(T8,A8,B8)  VVCF(T9,A9,B9)  VVCF(TA,AA,B10)  \
+   VVCF(TB,AB,B11) VVCF(TC,AC,B12) VVCF(TD,AD,B13) VVCF(TE,AE,B14) VVCF(TF,AF,B15)  \
+   VVCF(TG,AG,B16) VVCF(TH,AH,B17) VVCF(TI,AI,B18) VVCF(TJ,AJ,B19) VVCF(TK,AK,B20)  \
+   CPPPROTOCLSFSUB20(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK)  \
+   ACF(LN,T1,A1,1)  ACF(LN,T2,A2,2)  ACF(LN,T3,A3,3)  ACF(LN,T4,A4,4)          \
+   ACF(LN,T5,A5,5)  ACF(LN,T6,A6,6)  ACF(LN,T7,A7,7)  ACF(LN,T8,A8,8)          \
+   ACF(LN,T9,A9,9)  ACF(LN,TA,AA,10) ACF(LN,TB,AB,11) ACF(LN,TC,AC,12)         \
+   ACF(LN,TD,AD,13) ACF(LN,TE,AE,14) ACF(LN,TF,AF,15) ACF(LN,TG,AG,16)         \
+   ACF(LN,TH,AH,17) ACF(LN,TI,AI,18) ACF(LN,TJ,AJ,19) ACF(LN,TK,AK,20)         \
+   CFC_(UN,LN)( CFARGTA20(AACF,JCF,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC,AD,AE,AF,AG,AH,AI,AJ,AK) ); \
+ WCF(T1,A1,1)  WCF(T2,A2,2)  WCF(T3,A3,3)  WCF(T4,A4,4)  WCF(T5,A5,5)  WCF(T6,A6,6)  \
+ WCF(T7,A7,7)  WCF(T8,A8,8)  WCF(T9,A9,9)  WCF(TA,AA,10) WCF(TB,AB,11) WCF(TC,AC,12) \
+ WCF(TD,AD,13) WCF(TE,AE,14) WCF(TF,AF,15) WCF(TG,AG,16) WCF(TH,AH,17) WCF(TI,AI,18) \
+ WCF(TJ,AJ,19) WCF(TK,AK,20) }while(0)
+#endif
+#endif         /* MAX_PREPRO_ARGS */
+
+#if MAX_PREPRO_ARGS>31
+#define CCALLSFSUB21(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC,AD,AE,AF,AG,AH,AI,AJ,AK,AL)\
+        CCALLSFSUB27(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,CF_0,CF_0,CF_0,CF_0,CF_0,CF_0,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC,AD,AE,AF,AG,AH,AI,AJ,AK,AL,0,0,0,0,0,0)
+#define CCALLSFSUB22(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC,AD,AE,AF,AG,AH,AI,AJ,AK,AL,AM)\
+        CCALLSFSUB27(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,CF_0,CF_0,CF_0,CF_0,CF_0,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC,AD,AE,AF,AG,AH,AI,AJ,AK,AL,AM,0,0,0,0,0)
+#define CCALLSFSUB23(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC,AD,AE,AF,AG,AH,AI,AJ,AK,AL,AM,AN)\
+        CCALLSFSUB27(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,CF_0,CF_0,CF_0,CF_0,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC,AD,AE,AF,AG,AH,AI,AJ,AK,AL,AM,AN,0,0,0,0)
+#define CCALLSFSUB24(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC,AD,AE,AF,AG,AH,AI,AJ,AK,AL,AM,AN,AO)\
+        CCALLSFSUB27(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,CF_0,CF_0,CF_0,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC,AD,AE,AF,AG,AH,AI,AJ,AK,AL,AM,AN,AO,0,0,0)
+#define CCALLSFSUB25(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,TP,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC,AD,AE,AF,AG,AH,AI,AJ,AK,AL,AM,AN,AO,AP)\
+        CCALLSFSUB27(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,TP,CF_0,CF_0,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC,AD,AE,AF,AG,AH,AI,AJ,AK,AL,AM,AN,AO,AP,0,0)
+#define CCALLSFSUB26(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,TP,TQ,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC,AD,AE,AF,AG,AH,AI,AJ,AK,AL,AM,AN,AO,AP,AQ)\
+        CCALLSFSUB27(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,TP,TQ,CF_0,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC,AD,AE,AF,AG,AH,AI,AJ,AK,AL,AM,AN,AO,AP,AQ,0)
+
+#ifdef CFSUBASFUN
+#define CCALLSFSUB27(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,TP,TQ,TR, \
+                           A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC,AD,AE,AF,AG,AH,AI,AJ,AK,AL,AM,AN,AO,AP,AQ,AR) \
+        CCALLSFFUN27(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,TP,TQ,TR, \
+                           A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC,AD,AE,AF,AG,AH,AI,AJ,AK,AL,AM,AN,AO,AP,AQ,AR)
+#else
+#define CCALLSFSUB27(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,TP,TQ,TR, \
+                           A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC,AD,AE,AF,AG,AH,AI,AJ,AK,AL,AM,AN,AO,AP,AQ,AR) \
+do{VVCF(T1,A1,B1)  VVCF(T2,A2,B2)  VVCF(T3,A3,B3)  VVCF(T4,A4,B4)  VVCF(T5,A5,B5)   \
+   VVCF(T6,A6,B6)  VVCF(T7,A7,B7)  VVCF(T8,A8,B8)  VVCF(T9,A9,B9)  VVCF(TA,AA,B10)  \
+   VVCF(TB,AB,B11) VVCF(TC,AC,B12) VVCF(TD,AD,B13) VVCF(TE,AE,B14) VVCF(TF,AF,B15)  \
+   VVCF(TG,AG,B16) VVCF(TH,AH,B17) VVCF(TI,AI,B18) VVCF(TJ,AJ,B19) VVCF(TK,AK,B20)  \
+   VVCF(TL,AL,B21) VVCF(TM,AM,B22) VVCF(TN,AN,B23) VVCF(TO,AO,B24) VVCF(TP,AP,B25)  \
+   VVCF(TQ,AQ,B26) VVCF(TR,AR,B27)                                                  \
+   CPPPROTOCLSFSUB27(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,TP,TQ,TR) \
+   ACF(LN,T1,A1,1)  ACF(LN,T2,A2,2)  ACF(LN,T3,A3,3)  ACF(LN,T4,A4,4)          \
+   ACF(LN,T5,A5,5)  ACF(LN,T6,A6,6)  ACF(LN,T7,A7,7)  ACF(LN,T8,A8,8)          \
+   ACF(LN,T9,A9,9)  ACF(LN,TA,AA,10) ACF(LN,TB,AB,11) ACF(LN,TC,AC,12)         \
+   ACF(LN,TD,AD,13) ACF(LN,TE,AE,14) ACF(LN,TF,AF,15) ACF(LN,TG,AG,16)         \
+   ACF(LN,TH,AH,17) ACF(LN,TI,AI,18) ACF(LN,TJ,AJ,19) ACF(LN,TK,AK,20)         \
+   ACF(LN,TL,AL,21) ACF(LN,TM,AM,22) ACF(LN,TN,AN,23) ACF(LN,TO,AO,24)         \
+   ACF(LN,TP,AP,25) ACF(LN,TQ,AQ,26) ACF(LN,TR,AR,27)                          \
+   CFC_(UN,LN)( CFARGTA27(AACF,JCF,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,TP,TQ,TR,\
+                                   A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC,AD,AE,AF,AG,AH,AI,AJ,AK,AL,AM,AN,AO,AP,AQ,AR) ); \
+ WCF(T1,A1,1)  WCF(T2,A2,2)  WCF(T3,A3,3)  WCF(T4,A4,4)  WCF(T5,A5,5)  WCF(T6,A6,6)  \
+ WCF(T7,A7,7)  WCF(T8,A8,8)  WCF(T9,A9,9)  WCF(TA,AA,10) WCF(TB,AB,11) WCF(TC,AC,12) \
+ WCF(TD,AD,13) WCF(TE,AE,14) WCF(TF,AF,15) WCF(TG,AG,16) WCF(TH,AH,17) WCF(TI,AI,18) \
+ WCF(TJ,AJ,19) WCF(TK,AK,20) WCF(TL,AL,21) WCF(TM,AM,22) WCF(TN,AN,23) WCF(TO,AO,24) \
+ WCF(TP,AP,25) WCF(TQ,AQ,26) WCF(TR,AR,27) }while(0)
+#endif
+#endif         /* MAX_PREPRO_ARGS */
+
+/*-------------------------------------------------------------------------*/
+
+/*               UTILITIES FOR C TO CALL FORTRAN FUNCTIONS                 */
+
+/*N.B. PROTOCCALLSFFUNn(..) generates code, whether or not the FORTRAN
+  function is called. Therefore, especially for creator's of C header files
+  for large FORTRAN libraries which include many functions, to reduce
+  compile time and object code size, it may be desirable to create
+  preprocessor directives to allow users to create code for only those
+  functions which they use.                                                */
+
+/* The following defines the maximum length string that a function can return.
+   Of course it may be undefine-d and re-define-d before individual
+   PROTOCCALLSFFUNn(..) as required. It would also be nice to have this derived
+   from the individual machines' limits.                                      */
+#define MAX_LEN_FORTRAN_FUNCTION_STRING 0x4FE
+
+/* The following defines a character used by CFORTRAN.H to flag the end of a
+   string coming out of a FORTRAN routine.                                 */
+#define CFORTRAN_NON_CHAR 0x7F
+
+#ifdef OLD_VAXC                                /* Prevent %CC-I-PARAMNOTUSED. */
+#pragma nostandard
+#endif
+
+#define _SEP_(TN,C,cfCOMMA)     _(__SEP_,C)(TN,cfCOMMA)
+#define __SEP_0(TN,cfCOMMA)  
+#define __SEP_1(TN,cfCOMMA)     _Icf(2,SEP,TN,cfCOMMA,0)
+#define        INT_cfSEP(T,B) _(A,B)
+#define       INTV_cfSEP(T,B) INT_cfSEP(T,B)
+#define      INTVV_cfSEP(T,B) INT_cfSEP(T,B)
+#define     INTVVV_cfSEP(T,B) INT_cfSEP(T,B)
+#define    INTVVVV_cfSEP(T,B) INT_cfSEP(T,B)
+#define   INTVVVVV_cfSEP(T,B) INT_cfSEP(T,B)
+#define  INTVVVVVV_cfSEP(T,B) INT_cfSEP(T,B)
+#define INTVVVVVVV_cfSEP(T,B) INT_cfSEP(T,B)
+#define       PINT_cfSEP(T,B) INT_cfSEP(T,B)
+#define      PVOID_cfSEP(T,B) INT_cfSEP(T,B)
+#define    ROUTINE_cfSEP(T,B) INT_cfSEP(T,B)
+#define     SIMPLE_cfSEP(T,B) INT_cfSEP(T,B)
+#define       VOID_cfSEP(T,B) INT_cfSEP(T,B)    /* For FORTRAN calls C subr.s.*/
+#define     STRING_cfSEP(T,B) INT_cfSEP(T,B)
+#define    STRINGV_cfSEP(T,B) INT_cfSEP(T,B)
+#define    PSTRING_cfSEP(T,B) INT_cfSEP(T,B)
+#define   PSTRINGV_cfSEP(T,B) INT_cfSEP(T,B)
+#define   PNSTRING_cfSEP(T,B) INT_cfSEP(T,B)
+#define   PPSTRING_cfSEP(T,B) INT_cfSEP(T,B)
+#define    ZTRINGV_cfSEP(T,B) INT_cfSEP(T,B)
+#define   PZTRINGV_cfSEP(T,B) INT_cfSEP(T,B)
+                         
+#if defined(SIGNED_BYTE) || !defined(UNSIGNED_BYTE)
+#ifdef OLD_VAXC
+#define INTEGER_BYTE               char    /* Old VAXC barfs on 'signed char' */
+#else
+#define INTEGER_BYTE        signed char    /* default */
+#endif
+#else
+#define INTEGER_BYTE        unsigned char
+#endif
+#define    BYTEVVVVVVV_cfTYPE INTEGER_BYTE
+#define  DOUBLEVVVVVVV_cfTYPE DOUBLE_PRECISION 
+#define   FLOATVVVVVVV_cfTYPE FORTRAN_REAL
+#define     INTVVVVVVV_cfTYPE int
+#define LOGICALVVVVVVV_cfTYPE int
+#define    LONGVVVVVVV_cfTYPE long
+#define LONGLONGVVVVVVV_cfTYPE LONGLONG   /* added by MR December 2005 */
+#define   SHORTVVVVVVV_cfTYPE short
+#define          PBYTE_cfTYPE INTEGER_BYTE
+#define        PDOUBLE_cfTYPE DOUBLE_PRECISION 
+#define         PFLOAT_cfTYPE FORTRAN_REAL
+#define           PINT_cfTYPE int
+#define       PLOGICAL_cfTYPE int
+#define          PLONG_cfTYPE long
+#define      PLONGLONG_cfTYPE LONGLONG  /* added by MR December 2005 */
+#define         PSHORT_cfTYPE short
+
+#define CFARGS0(A,T,V,W,X,Y,Z) _3(T,_cf,A)
+#define CFARGS1(A,T,V,W,X,Y,Z) _3(T,_cf,A)(V)
+#define CFARGS2(A,T,V,W,X,Y,Z) _3(T,_cf,A)(V,W)
+#define CFARGS3(A,T,V,W,X,Y,Z) _3(T,_cf,A)(V,W,X)
+#define CFARGS4(A,T,V,W,X,Y,Z) _3(T,_cf,A)(V,W,X,Y)
+#define CFARGS5(A,T,V,W,X,Y,Z) _3(T,_cf,A)(V,W,X,Y,Z)
+
+#define  _Icf(N,T,I,X,Y)                 _(I,_cfINT)(N,T,I,X,Y,0)
+#define _Icf4(N,T,I,X,Y,Z)               _(I,_cfINT)(N,T,I,X,Y,Z)
+#define           BYTE_cfINT(N,A,B,X,Y,Z)        DOUBLE_cfINT(N,A,B,X,Y,Z)
+#define         DOUBLE_cfINT(N,A,B,X,Y,Z) _(CFARGS,N)(A,INT,B,X,Y,Z,0)
+#define          FLOAT_cfINT(N,A,B,X,Y,Z)        DOUBLE_cfINT(N,A,B,X,Y,Z)
+#define            INT_cfINT(N,A,B,X,Y,Z)        DOUBLE_cfINT(N,A,B,X,Y,Z)
+#define        LOGICAL_cfINT(N,A,B,X,Y,Z)        DOUBLE_cfINT(N,A,B,X,Y,Z)
+#define           LONG_cfINT(N,A,B,X,Y,Z)        DOUBLE_cfINT(N,A,B,X,Y,Z)
+#define       LONGLONG_cfINT(N,A,B,X,Y,Z)        DOUBLE_cfINT(N,A,B,X,Y,Z) /* added by MR December 2005 */
+#define          SHORT_cfINT(N,A,B,X,Y,Z)        DOUBLE_cfINT(N,A,B,X,Y,Z)
+#define          PBYTE_cfINT(N,A,B,X,Y,Z)       PDOUBLE_cfINT(N,A,B,X,Y,Z)
+#define        PDOUBLE_cfINT(N,A,B,X,Y,Z) _(CFARGS,N)(A,PINT,B,X,Y,Z,0)
+#define         PFLOAT_cfINT(N,A,B,X,Y,Z)       PDOUBLE_cfINT(N,A,B,X,Y,Z)
+#define           PINT_cfINT(N,A,B,X,Y,Z)       PDOUBLE_cfINT(N,A,B,X,Y,Z)
+#define       PLOGICAL_cfINT(N,A,B,X,Y,Z)       PDOUBLE_cfINT(N,A,B,X,Y,Z)
+#define          PLONG_cfINT(N,A,B,X,Y,Z)       PDOUBLE_cfINT(N,A,B,X,Y,Z)
+#define      PLONGLONG_cfINT(N,A,B,X,Y,Z)       PDOUBLE_cfINT(N,A,B,X,Y,Z) /* added by MR December 2005 */
+#define         PSHORT_cfINT(N,A,B,X,Y,Z)       PDOUBLE_cfINT(N,A,B,X,Y,Z)
+#define          BYTEV_cfINT(N,A,B,X,Y,Z)       DOUBLEV_cfINT(N,A,B,X,Y,Z)
+#define         BYTEVV_cfINT(N,A,B,X,Y,Z)      DOUBLEVV_cfINT(N,A,B,X,Y,Z)
+#define        BYTEVVV_cfINT(N,A,B,X,Y,Z)     DOUBLEVVV_cfINT(N,A,B,X,Y,Z)
+#define       BYTEVVVV_cfINT(N,A,B,X,Y,Z)    DOUBLEVVVV_cfINT(N,A,B,X,Y,Z)
+#define      BYTEVVVVV_cfINT(N,A,B,X,Y,Z)   DOUBLEVVVVV_cfINT(N,A,B,X,Y,Z)
+#define     BYTEVVVVVV_cfINT(N,A,B,X,Y,Z)  DOUBLEVVVVVV_cfINT(N,A,B,X,Y,Z)
+#define    BYTEVVVVVVV_cfINT(N,A,B,X,Y,Z) DOUBLEVVVVVVV_cfINT(N,A,B,X,Y,Z)
+#define        DOUBLEV_cfINT(N,A,B,X,Y,Z) _(CFARGS,N)(A,INTV,B,X,Y,Z,0)
+#define       DOUBLEVV_cfINT(N,A,B,X,Y,Z) _(CFARGS,N)(A,INTVV,B,X,Y,Z,0)
+#define      DOUBLEVVV_cfINT(N,A,B,X,Y,Z) _(CFARGS,N)(A,INTVVV,B,X,Y,Z,0)
+#define     DOUBLEVVVV_cfINT(N,A,B,X,Y,Z) _(CFARGS,N)(A,INTVVVV,B,X,Y,Z,0)
+#define    DOUBLEVVVVV_cfINT(N,A,B,X,Y,Z) _(CFARGS,N)(A,INTVVVVV,B,X,Y,Z,0)
+#define   DOUBLEVVVVVV_cfINT(N,A,B,X,Y,Z) _(CFARGS,N)(A,INTVVVVVV,B,X,Y,Z,0)
+#define  DOUBLEVVVVVVV_cfINT(N,A,B,X,Y,Z) _(CFARGS,N)(A,INTVVVVVVV,B,X,Y,Z,0)
+#define         FLOATV_cfINT(N,A,B,X,Y,Z)       DOUBLEV_cfINT(N,A,B,X,Y,Z)
+#define        FLOATVV_cfINT(N,A,B,X,Y,Z)      DOUBLEVV_cfINT(N,A,B,X,Y,Z)
+#define       FLOATVVV_cfINT(N,A,B,X,Y,Z)     DOUBLEVVV_cfINT(N,A,B,X,Y,Z)
+#define      FLOATVVVV_cfINT(N,A,B,X,Y,Z)    DOUBLEVVVV_cfINT(N,A,B,X,Y,Z)
+#define     FLOATVVVVV_cfINT(N,A,B,X,Y,Z)   DOUBLEVVVVV_cfINT(N,A,B,X,Y,Z)
+#define    FLOATVVVVVV_cfINT(N,A,B,X,Y,Z)  DOUBLEVVVVVV_cfINT(N,A,B,X,Y,Z)
+#define   FLOATVVVVVVV_cfINT(N,A,B,X,Y,Z) DOUBLEVVVVVVV_cfINT(N,A,B,X,Y,Z)
+#define           INTV_cfINT(N,A,B,X,Y,Z)       DOUBLEV_cfINT(N,A,B,X,Y,Z)
+#define          INTVV_cfINT(N,A,B,X,Y,Z)      DOUBLEVV_cfINT(N,A,B,X,Y,Z)
+#define         INTVVV_cfINT(N,A,B,X,Y,Z)     DOUBLEVVV_cfINT(N,A,B,X,Y,Z)
+#define        INTVVVV_cfINT(N,A,B,X,Y,Z)    DOUBLEVVVV_cfINT(N,A,B,X,Y,Z)
+#define       INTVVVVV_cfINT(N,A,B,X,Y,Z)   DOUBLEVVVVV_cfINT(N,A,B,X,Y,Z)
+#define      INTVVVVVV_cfINT(N,A,B,X,Y,Z)  DOUBLEVVVVVV_cfINT(N,A,B,X,Y,Z)
+#define     INTVVVVVVV_cfINT(N,A,B,X,Y,Z) DOUBLEVVVVVVV_cfINT(N,A,B,X,Y,Z)
+#define       LOGICALV_cfINT(N,A,B,X,Y,Z)       DOUBLEV_cfINT(N,A,B,X,Y,Z)
+#define      LOGICALVV_cfINT(N,A,B,X,Y,Z)      DOUBLEVV_cfINT(N,A,B,X,Y,Z)
+#define     LOGICALVVV_cfINT(N,A,B,X,Y,Z)     DOUBLEVVV_cfINT(N,A,B,X,Y,Z)
+#define    LOGICALVVVV_cfINT(N,A,B,X,Y,Z)    DOUBLEVVVV_cfINT(N,A,B,X,Y,Z)
+#define   LOGICALVVVVV_cfINT(N,A,B,X,Y,Z)   DOUBLEVVVVV_cfINT(N,A,B,X,Y,Z)
+#define  LOGICALVVVVVV_cfINT(N,A,B,X,Y,Z)  DOUBLEVVVVVV_cfINT(N,A,B,X,Y,Z)
+#define LOGICALVVVVVVV_cfINT(N,A,B,X,Y,Z) DOUBLEVVVVVVV_cfINT(N,A,B,X,Y,Z)
+#define          LONGV_cfINT(N,A,B,X,Y,Z)       DOUBLEV_cfINT(N,A,B,X,Y,Z)
+#define         LONGVV_cfINT(N,A,B,X,Y,Z)      DOUBLEVV_cfINT(N,A,B,X,Y,Z)
+#define        LONGVVV_cfINT(N,A,B,X,Y,Z)     DOUBLEVVV_cfINT(N,A,B,X,Y,Z)
+#define       LONGVVVV_cfINT(N,A,B,X,Y,Z)    DOUBLEVVVV_cfINT(N,A,B,X,Y,Z)
+#define      LONGVVVVV_cfINT(N,A,B,X,Y,Z)   DOUBLEVVVVV_cfINT(N,A,B,X,Y,Z)
+#define     LONGVVVVVV_cfINT(N,A,B,X,Y,Z)  DOUBLEVVVVVV_cfINT(N,A,B,X,Y,Z)
+#define    LONGVVVVVVV_cfINT(N,A,B,X,Y,Z) DOUBLEVVVVVVV_cfINT(N,A,B,X,Y,Z)
+#define      LONGLONGV_cfINT(N,A,B,X,Y,Z)       DOUBLEV_cfINT(N,A,B,X,Y,Z) /* added by MR December 2005 */
+#define     LONGLONGVV_cfINT(N,A,B,X,Y,Z)      DOUBLEVV_cfINT(N,A,B,X,Y,Z) /* added by MR December 2005 */
+#define    LONGLONGVVV_cfINT(N,A,B,X,Y,Z)     DOUBLEVVV_cfINT(N,A,B,X,Y,Z) /* added by MR December 2005 */
+#define   LONGLONGVVVV_cfINT(N,A,B,X,Y,Z)    DOUBLEVVVV_cfINT(N,A,B,X,Y,Z) /* added by MR December 2005 */
+#define  LONGLONGVVVVV_cfINT(N,A,B,X,Y,Z)   DOUBLEVVVVV_cfINT(N,A,B,X,Y,Z) /* added by MR December 2005 */
+#define LONGLONGVVVVVV_cfINT(N,A,B,X,Y,Z)  DOUBLEVVVVVV_cfINT(N,A,B,X,Y,Z) /* added by MR December 2005 */
+#define LONGLONGVVVVVVV_cfINT(N,A,B,X,Y,Z) DOUBLEVVVVVVV_cfINT(N,A,B,X,Y,Z) /* added by MR December 2005 */
+#define         SHORTV_cfINT(N,A,B,X,Y,Z)       DOUBLEV_cfINT(N,A,B,X,Y,Z)
+#define        SHORTVV_cfINT(N,A,B,X,Y,Z)      DOUBLEVV_cfINT(N,A,B,X,Y,Z)
+#define       SHORTVVV_cfINT(N,A,B,X,Y,Z)     DOUBLEVVV_cfINT(N,A,B,X,Y,Z)
+#define      SHORTVVVV_cfINT(N,A,B,X,Y,Z)    DOUBLEVVVV_cfINT(N,A,B,X,Y,Z)
+#define     SHORTVVVVV_cfINT(N,A,B,X,Y,Z)   DOUBLEVVVVV_cfINT(N,A,B,X,Y,Z)
+#define    SHORTVVVVVV_cfINT(N,A,B,X,Y,Z)  DOUBLEVVVVVV_cfINT(N,A,B,X,Y,Z)
+#define   SHORTVVVVVVV_cfINT(N,A,B,X,Y,Z) DOUBLEVVVVVVV_cfINT(N,A,B,X,Y,Z)
+#define          PVOID_cfINT(N,A,B,X,Y,Z) _(CFARGS,N)(A,B,B,X,Y,Z,0)
+#define        ROUTINE_cfINT(N,A,B,X,Y,Z)         PVOID_cfINT(N,A,B,X,Y,Z)
+/*CRAY coughs on the first,
+  i.e. the usual trouble of not being able to
+  define macros to macros with arguments. 
+  New ultrix is worse, it coughs on all such uses.
+ */
+/*#define       SIMPLE_cfINT                    PVOID_cfINT*/
+#define         SIMPLE_cfINT(N,A,B,X,Y,Z)         PVOID_cfINT(N,A,B,X,Y,Z)
+#define           VOID_cfINT(N,A,B,X,Y,Z)         PVOID_cfINT(N,A,B,X,Y,Z)
+#define         STRING_cfINT(N,A,B,X,Y,Z)         PVOID_cfINT(N,A,B,X,Y,Z)
+#define        STRINGV_cfINT(N,A,B,X,Y,Z)         PVOID_cfINT(N,A,B,X,Y,Z)
+#define        PSTRING_cfINT(N,A,B,X,Y,Z)         PVOID_cfINT(N,A,B,X,Y,Z)
+#define       PSTRINGV_cfINT(N,A,B,X,Y,Z)         PVOID_cfINT(N,A,B,X,Y,Z)
+#define       PNSTRING_cfINT(N,A,B,X,Y,Z)         PVOID_cfINT(N,A,B,X,Y,Z)
+#define       PPSTRING_cfINT(N,A,B,X,Y,Z)         PVOID_cfINT(N,A,B,X,Y,Z)
+#define        ZTRINGV_cfINT(N,A,B,X,Y,Z)         PVOID_cfINT(N,A,B,X,Y,Z)
+#define       PZTRINGV_cfINT(N,A,B,X,Y,Z)         PVOID_cfINT(N,A,B,X,Y,Z)
+#define           CF_0_cfINT(N,A,B,X,Y,Z)
+                         
+
+#define   UCF(TN,I,C)  _SEP_(TN,C,cfCOMMA) _Icf(2,U,TN,_(A,I),0)
+#define  UUCF(TN,I,C)  _SEP_(TN,C,cfCOMMA) _SEP_(TN,1,I) 
+#define UUUCF(TN,I,C)  _SEP_(TN,C,cfCOLON) _Icf(2,U,TN,_(A,I),0)
+#define        INT_cfU(T,A) _(T,VVVVVVV_cfTYPE)   A
+#define       INTV_cfU(T,A) _(T,VVVVVV_cfTYPE)  * A
+#define      INTVV_cfU(T,A) _(T,VVVVV_cfTYPE)   * A
+#define     INTVVV_cfU(T,A) _(T,VVVV_cfTYPE)    * A
+#define    INTVVVV_cfU(T,A) _(T,VVV_cfTYPE)     * A
+#define   INTVVVVV_cfU(T,A) _(T,VV_cfTYPE)      * A
+#define  INTVVVVVV_cfU(T,A) _(T,V_cfTYPE)       * A
+#define INTVVVVVVV_cfU(T,A) _(T,_cfTYPE)        * A
+#define       PINT_cfU(T,A) _(T,_cfTYPE)        * A
+#define      PVOID_cfU(T,A) void  *A 
+#define    ROUTINE_cfU(T,A) void (*A)(CF_NULL_PROTO) 
+#define       VOID_cfU(T,A) void   A    /* Needed for C calls FORTRAN sub.s.  */
+#define     STRING_cfU(T,A) char  *A    /*            via VOID and wrapper.   */
+#define    STRINGV_cfU(T,A) char  *A
+#define    PSTRING_cfU(T,A) char  *A
+#define   PSTRINGV_cfU(T,A) char  *A
+#define    ZTRINGV_cfU(T,A) char  *A
+#define   PZTRINGV_cfU(T,A) char  *A
+
+/* VOID breaks U into U and UU. */
+#define       INT_cfUU(T,A) _(T,VVVVVVV_cfTYPE) A
+#define      VOID_cfUU(T,A)             /* Needed for FORTRAN calls C sub.s.  */
+#define    STRING_cfUU(T,A) char *A 
+
+
+#define      BYTE_cfPU(A)   CFextern INTEGER_BYTE      FCALLSC_QUALIFIER A
+#define    DOUBLE_cfPU(A)   CFextern DOUBLE_PRECISION  FCALLSC_QUALIFIER A
+#if ! (defined(FLOATFUNCTIONTYPE)&&defined(ASSIGNFLOAT)&&defined(RETURNFLOAT))
+#if defined (f2cFortran) && ! defined (gFortran)
+/* f2c/g77 return double from FORTRAN REAL functions. (KMCCARTY, 2005/12/09) */
+#define     FLOAT_cfPU(A)   CFextern DOUBLE_PRECISION  FCALLSC_QUALIFIER A
+#else
+#define     FLOAT_cfPU(A)   CFextern FORTRAN_REAL      FCALLSC_QUALIFIER A
+#endif
+#else				   	                   
+#define     FLOAT_cfPU(A)   CFextern FLOATFUNCTIONTYPE FCALLSC_QUALIFIER A
+#endif				   	                   
+#define       INT_cfPU(A)   CFextern int   FCALLSC_QUALIFIER   A
+#define   LOGICAL_cfPU(A)   CFextern int   FCALLSC_QUALIFIER   A
+#define      LONG_cfPU(A)   CFextern long  FCALLSC_QUALIFIER   A
+#define     SHORT_cfPU(A)   CFextern short FCALLSC_QUALIFIER   A
+#define    STRING_cfPU(A)   CFextern void  FCALLSC_QUALIFIER   A
+#define      VOID_cfPU(A)   CFextern void  FCALLSC_QUALIFIER   A
+
+#define    BYTE_cfE INTEGER_BYTE     A0;
+#define  DOUBLE_cfE DOUBLE_PRECISION A0;
+#if ! (defined(FLOATFUNCTIONTYPE)&&defined(ASSIGNFLOAT)&&defined(RETURNFLOAT))
+#define   FLOAT_cfE FORTRAN_REAL  A0;
+#else
+#define   FLOAT_cfE FORTRAN_REAL AA0;   FLOATFUNCTIONTYPE A0;
+#endif
+#define     INT_cfE int    A0;
+#define LOGICAL_cfE int    A0;
+#define    LONG_cfE long   A0;
+#define   SHORT_cfE short  A0;
+#define    VOID_cfE
+#ifdef vmsFortran
+#define  STRING_cfE static char AA0[1+MAX_LEN_FORTRAN_FUNCTION_STRING];        \
+                       static fstring A0 =                                     \
+             {MAX_LEN_FORTRAN_FUNCTION_STRING,DSC$K_DTYPE_T,DSC$K_CLASS_S,AA0};\
+               memset(AA0, CFORTRAN_NON_CHAR, MAX_LEN_FORTRAN_FUNCTION_STRING);\
+                                    *(AA0+MAX_LEN_FORTRAN_FUNCTION_STRING)='\0';
+#else
+#ifdef CRAYFortran
+#define  STRING_cfE static char AA0[1+MAX_LEN_FORTRAN_FUNCTION_STRING];        \
+                   static _fcd A0; *(AA0+MAX_LEN_FORTRAN_FUNCTION_STRING)='\0';\
+                memset(AA0,CFORTRAN_NON_CHAR, MAX_LEN_FORTRAN_FUNCTION_STRING);\
+                            A0 = _cptofcd(AA0,MAX_LEN_FORTRAN_FUNCTION_STRING);
+#else
+/* 'cc: SC3.0.1 13 Jul 1994' barfs on char A0[0x4FE+1]; 
+ * char A0[0x4FE +1]; char A0[1+0x4FE]; are both OK.     */
+#define STRING_cfE static char A0[1+MAX_LEN_FORTRAN_FUNCTION_STRING];          \
+                       memset(A0, CFORTRAN_NON_CHAR,                           \
+                              MAX_LEN_FORTRAN_FUNCTION_STRING);                \
+                       *(A0+MAX_LEN_FORTRAN_FUNCTION_STRING)='\0';
+#endif
+#endif
+/* ESTRING must use static char. array which is guaranteed to exist after
+   function returns.                                                     */
+
+/* N.B.i) The diff. for 0 (Zero) and >=1 arguments.
+       ii)That the following create an unmatched bracket, i.e. '(', which
+          must of course be matched in the call.
+       iii)Commas must be handled very carefully                         */
+#define    INT_cfGZ(T,UN,LN) A0=CFC_(UN,LN)(
+#define   VOID_cfGZ(T,UN,LN)    CFC_(UN,LN)(
+#ifdef vmsFortran
+#define STRING_cfGZ(T,UN,LN)    CFC_(UN,LN)(&A0
+#else
+#if defined(CRAYFortran) || defined(AbsoftUNIXFortran) || defined(AbsoftProFortran)
+#define STRING_cfGZ(T,UN,LN)    CFC_(UN,LN)( A0
+#else
+#define STRING_cfGZ(T,UN,LN)    CFC_(UN,LN)( A0,MAX_LEN_FORTRAN_FUNCTION_STRING
+#endif
+#endif
+
+#define     INT_cfG(T,UN,LN)    INT_cfGZ(T,UN,LN)
+#define    VOID_cfG(T,UN,LN)   VOID_cfGZ(T,UN,LN)
+#define  STRING_cfG(T,UN,LN) STRING_cfGZ(T,UN,LN), /*, is only diff. from _cfG*/
+
+#define    BYTEVVVVVVV_cfPP
+#define     INTVVVVVVV_cfPP     /* These complement FLOATVVVVVVV_cfPP. */
+#define  DOUBLEVVVVVVV_cfPP
+#define LOGICALVVVVVVV_cfPP
+#define    LONGVVVVVVV_cfPP
+#define   SHORTVVVVVVV_cfPP
+#define          PBYTE_cfPP
+#define           PINT_cfPP
+#define        PDOUBLE_cfPP
+#define       PLOGICAL_cfPP
+#define          PLONG_cfPP
+#define         PSHORT_cfPP
+#define         PFLOAT_cfPP FLOATVVVVVVV_cfPP
+
+#define BCF(TN,AN,C)        _SEP_(TN,C,cfCOMMA) _Icf(2,B,TN,AN,0)
+#define        INT_cfB(T,A) (_(T,VVVVVVV_cfTYPE)) A
+#define       INTV_cfB(T,A)            A
+#define      INTVV_cfB(T,A)           (A)[0]
+#define     INTVVV_cfB(T,A)           (A)[0][0]
+#define    INTVVVV_cfB(T,A)           (A)[0][0][0]
+#define   INTVVVVV_cfB(T,A)           (A)[0][0][0][0]
+#define  INTVVVVVV_cfB(T,A)           (A)[0][0][0][0][0]
+#define INTVVVVVVV_cfB(T,A)           (A)[0][0][0][0][0][0]
+#define       PINT_cfB(T,A) _(T,_cfPP)&A
+#define     STRING_cfB(T,A) (char *)   A
+#define    STRINGV_cfB(T,A) (char *)   A
+#define    PSTRING_cfB(T,A) (char *)   A
+#define   PSTRINGV_cfB(T,A) (char *)   A
+#define      PVOID_cfB(T,A) (void *)   A
+#define    ROUTINE_cfB(T,A) (cfCAST_FUNCTION)A
+#define    ZTRINGV_cfB(T,A) (char *)   A
+#define   PZTRINGV_cfB(T,A) (char *)   A
+                                                              	
+#define SCF(TN,NAME,I,A)    _(TN,_cfSTR)(3,S,NAME,I,A,0,0)
+#define  DEFAULT_cfS(M,I,A)
+#define  LOGICAL_cfS(M,I,A)
+#define PLOGICAL_cfS(M,I,A)
+#define   STRING_cfS(M,I,A) ,sizeof(A)
+#define  STRINGV_cfS(M,I,A) ,( (unsigned)0xFFFF*firstindexlength(A) \
+                              +secondindexlength(A))
+#define  PSTRING_cfS(M,I,A) ,sizeof(A)
+#define PSTRINGV_cfS(M,I,A) STRINGV_cfS(M,I,A)
+#define  ZTRINGV_cfS(M,I,A)
+#define PZTRINGV_cfS(M,I,A)
+
+#define   HCF(TN,I)         _(TN,_cfSTR)(3,H,cfCOMMA, H,_(C,I),0,0)
+#define  HHCF(TN,I)         _(TN,_cfSTR)(3,H,cfCOMMA,HH,_(C,I),0,0)
+#define HHHCF(TN,I)         _(TN,_cfSTR)(3,H,cfCOLON, H,_(C,I),0,0)
+#define  H_CF_SPECIAL       unsigned
+#define HH_CF_SPECIAL
+#define  DEFAULT_cfH(M,I,A)
+#define  LOGICAL_cfH(S,U,B)
+#define PLOGICAL_cfH(S,U,B)
+#define   STRING_cfH(S,U,B) _(A,S) _(U,_CF_SPECIAL) B
+#define  STRINGV_cfH(S,U,B) STRING_cfH(S,U,B)
+#define  PSTRING_cfH(S,U,B) STRING_cfH(S,U,B)
+#define PSTRINGV_cfH(S,U,B) STRING_cfH(S,U,B)
+#define PNSTRING_cfH(S,U,B) STRING_cfH(S,U,B)
+#define PPSTRING_cfH(S,U,B) STRING_cfH(S,U,B)
+#define  ZTRINGV_cfH(S,U,B)
+#define PZTRINGV_cfH(S,U,B)
+
+/* Need VOID_cfSTR because Absoft forced function types go through _cfSTR. */
+/* No spaces inside expansion. They screws up macro catenation kludge.     */
+#define           VOID_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E)
+#define           BYTE_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E)
+#define         DOUBLE_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E)
+#define          FLOAT_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E)
+#define            INT_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E)
+#define        LOGICAL_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,LOGICAL,A,B,C,D,E)
+#define           LONG_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E)
+#define       LONGLONG_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E) /* added by MR December 2005 */
+#define          SHORT_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E)
+#define          BYTEV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E)
+#define         BYTEVV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E)
+#define        BYTEVVV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E)
+#define       BYTEVVVV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E)
+#define      BYTEVVVVV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E)
+#define     BYTEVVVVVV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E)
+#define    BYTEVVVVVVV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E)
+#define        DOUBLEV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E)
+#define       DOUBLEVV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E)
+#define      DOUBLEVVV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E)
+#define     DOUBLEVVVV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E)
+#define    DOUBLEVVVVV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E)
+#define   DOUBLEVVVVVV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E)
+#define  DOUBLEVVVVVVV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E)
+#define         FLOATV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E)
+#define        FLOATVV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E)
+#define       FLOATVVV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E)
+#define      FLOATVVVV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E)
+#define     FLOATVVVVV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E)
+#define    FLOATVVVVVV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E)
+#define   FLOATVVVVVVV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E)
+#define           INTV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E)
+#define          INTVV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E)
+#define         INTVVV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E)
+#define        INTVVVV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E)
+#define       INTVVVVV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E)
+#define      INTVVVVVV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E)
+#define     INTVVVVVVV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E)
+#define       LOGICALV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E)
+#define      LOGICALVV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E)
+#define     LOGICALVVV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E)
+#define    LOGICALVVVV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E)
+#define   LOGICALVVVVV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E)
+#define  LOGICALVVVVVV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E)
+#define LOGICALVVVVVVV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E)
+#define          LONGV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E)
+#define         LONGVV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E)
+#define        LONGVVV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E)
+#define       LONGVVVV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E)
+#define      LONGVVVVV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E)
+#define     LONGVVVVVV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E)
+#define    LONGVVVVVVV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E)
+#define      LONGLONGV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E) /* added by MR December 2005 */
+#define     LONGLONGVV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E) /* added by MR December 2005 */
+#define    LONGLONGVVV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E) /* added by MR December 2005 */
+#define   LONGLONGVVVV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E) /* added by MR December 2005 */
+#define  LONGLONGVVVVV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E) /* added by MR December 2005 */
+#define LONGLONGVVVVVV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E) /* added by MR December 2005 */
+#define LONGLONGVVVVVVV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E) /* added by MR December 2005 */
+#define         SHORTV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E)
+#define        SHORTVV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E)
+#define       SHORTVVV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E)
+#define      SHORTVVVV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E)
+#define     SHORTVVVVV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E)
+#define    SHORTVVVVVV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E)
+#define   SHORTVVVVVVV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E)
+#define          PBYTE_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E)
+#define        PDOUBLE_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E)
+#define         PFLOAT_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E)
+#define           PINT_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E)
+#define       PLOGICAL_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,PLOGICAL,A,B,C,D,E)
+#define          PLONG_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E)
+#define      PLONGLONG_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E) /* added by MR December 2005 */
+#define         PSHORT_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E)
+#define         STRING_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,STRING,A,B,C,D,E)
+#define        PSTRING_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,PSTRING,A,B,C,D,E)
+#define        STRINGV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,STRINGV,A,B,C,D,E)
+#define       PSTRINGV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,PSTRINGV,A,B,C,D,E)
+#define       PNSTRING_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,PNSTRING,A,B,C,D,E)
+#define       PPSTRING_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,PPSTRING,A,B,C,D,E)
+#define          PVOID_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E)
+#define        ROUTINE_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E)
+#define         SIMPLE_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E)
+#define        ZTRINGV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,ZTRINGV,A,B,C,D,E)
+#define       PZTRINGV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,PZTRINGV,A,B,C,D,E)
+#define           CF_0_cfSTR(N,T,A,B,C,D,E)
+
+/* See ACF table comments, which explain why CCF was split into two. */
+#define CCF(NAME,TN,I)     _(TN,_cfSTR)(5,C,NAME,I,_(A,I),_(B,I),_(C,I))
+#define  DEFAULT_cfC(M,I,A,B,C)
+#define  LOGICAL_cfC(M,I,A,B,C)  A=C2FLOGICAL( A);
+#define PLOGICAL_cfC(M,I,A,B,C) *A=C2FLOGICAL(*A);
+#ifdef vmsFortran
+#define   STRING_cfC(M,I,A,B,C) (B.clen=strlen(A),B.f.dsc$a_pointer=A,         \
+        C==sizeof(char*)||C==(unsigned)(B.clen+1)?B.f.dsc$w_length=B.clen:     \
+          (memset((A)+B.clen,' ',C-B.clen-1),A[B.f.dsc$w_length=C-1]='\0'));
+      /* PSTRING_cfC to beware of array A which does not contain any \0.      */
+#define  PSTRING_cfC(M,I,A,B,C) (B.dsc$a_pointer=A, C==sizeof(char*) ?         \
+             B.dsc$w_length=strlen(A):  (A[C-1]='\0',B.dsc$w_length=strlen(A), \
+       memset((A)+B.dsc$w_length,' ',C-B.dsc$w_length-1), B.dsc$w_length=C-1));
+#else
+#define   STRING_cfC(M,I,A,B,C) (B.nombre=A,B.clen=strlen(A),                             \
+                C==sizeof(char*)||C==(unsigned)(B.clen+1)?B.flen=B.clen:       \
+                        (memset(B.nombre+B.clen,' ',C-B.clen-1),B.nombre[B.flen=C-1]='\0'));
+#define  PSTRING_cfC(M,I,A,B,C) (C==sizeof(char*)? B=strlen(A):                \
+                    (A[C-1]='\0',B=strlen(A),memset((A)+B,' ',C-B-1),B=C-1));
+#endif
+          /* For CRAYFortran for (P)STRINGV_cfC, B.fs is set, but irrelevant. */
+#define  STRINGV_cfC(M,I,A,B,C) \
+        AATRINGV_cfA(    A,B,(C/0xFFFF)*(C%0xFFFF),C/0xFFFF,C%0xFFFF)
+#define PSTRINGV_cfC(M,I,A,B,C) \
+       APATRINGV_cfA(    A,B,(C/0xFFFF)*(C%0xFFFF),C/0xFFFF,C%0xFFFF)
+#define  ZTRINGV_cfC(M,I,A,B,C) \
+        AATRINGV_cfA(    A,B, (_3(M,_ELEMS_,I))*((_3(M,_ELEMLEN_,I))+1),       \
+                              (_3(M,_ELEMS_,I)), (_3(M,_ELEMLEN_,I))+1   )
+#define PZTRINGV_cfC(M,I,A,B,C) \
+       APATRINGV_cfA(    A,B, (_3(M,_ELEMS_,I))*((_3(M,_ELEMLEN_,I))+1),       \
+                              (_3(M,_ELEMS_,I)), (_3(M,_ELEMLEN_,I))+1   )
+
+#define     BYTE_cfCCC(A,B) &A
+#define   DOUBLE_cfCCC(A,B) &A
+#if !defined(__CF__KnR)
+#define    FLOAT_cfCCC(A,B) &A
+                               /* Although the VAX doesn't, at least the      */
+#else                          /* HP and K&R mips promote float arg.'s of     */
+#define    FLOAT_cfCCC(A,B) &B /* unprototyped functions to double. Cannot    */
+#endif                         /* use A here to pass the argument to FORTRAN. */
+#define      INT_cfCCC(A,B) &A
+#define  LOGICAL_cfCCC(A,B) &A
+#define     LONG_cfCCC(A,B) &A
+#define    SHORT_cfCCC(A,B) &A
+#define    PBYTE_cfCCC(A,B)  A
+#define  PDOUBLE_cfCCC(A,B)  A
+#define   PFLOAT_cfCCC(A,B)  A
+#define     PINT_cfCCC(A,B)  A
+#define PLOGICAL_cfCCC(A,B)  B=A       /* B used to keep a common W table. */
+#define    PLONG_cfCCC(A,B)  A
+#define   PSHORT_cfCCC(A,B)  A
+
+#define CCCF(TN,I,M)           _SEP_(TN,M,cfCOMMA) _Icf(3,CC,TN,_(A,I),_(B,I))
+#define        INT_cfCC(T,A,B) _(T,_cfCCC)(A,B) 
+#define       INTV_cfCC(T,A,B)  A
+#define      INTVV_cfCC(T,A,B)  A
+#define     INTVVV_cfCC(T,A,B)  A
+#define    INTVVVV_cfCC(T,A,B)  A
+#define   INTVVVVV_cfCC(T,A,B)  A
+#define  INTVVVVVV_cfCC(T,A,B)  A
+#define INTVVVVVVV_cfCC(T,A,B)  A
+#define       PINT_cfCC(T,A,B) _(T,_cfCCC)(A,B) 
+#define      PVOID_cfCC(T,A,B)  A
+#if defined(apolloFortran) || defined(hpuxFortran800) || defined(AbsoftUNIXFortran)
+#define    ROUTINE_cfCC(T,A,B) &A
+#else
+#define    ROUTINE_cfCC(T,A,B)  A
+#endif
+#define     SIMPLE_cfCC(T,A,B)  A
+#ifdef vmsFortran
+#define     STRING_cfCC(T,A,B) &B.f
+#define    STRINGV_cfCC(T,A,B) &B
+#define    PSTRING_cfCC(T,A,B) &B
+#define   PSTRINGV_cfCC(T,A,B) &B
+#else
+#ifdef CRAYFortran
+#define     STRING_cfCC(T,A,B) _cptofcd(A,B.flen)
+#define    STRINGV_cfCC(T,A,B) _cptofcd(B.s,B.flen)
+#define    PSTRING_cfCC(T,A,B) _cptofcd(A,B)
+#define   PSTRINGV_cfCC(T,A,B) _cptofcd(A,B.flen)
+#else
+#define     STRING_cfCC(T,A,B)  A
+#define    STRINGV_cfCC(T,A,B)  B.fs
+#define    PSTRING_cfCC(T,A,B)  A
+#define   PSTRINGV_cfCC(T,A,B)  B.fs
+#endif
+#endif
+#define    ZTRINGV_cfCC(T,A,B)   STRINGV_cfCC(T,A,B)
+#define   PZTRINGV_cfCC(T,A,B)  PSTRINGV_cfCC(T,A,B)
+
+#define    BYTE_cfX  return A0;
+#define  DOUBLE_cfX  return A0;
+#if ! (defined(FLOATFUNCTIONTYPE)&&defined(ASSIGNFLOAT)&&defined(RETURNFLOAT))
+#define   FLOAT_cfX  return A0;
+#else
+#define   FLOAT_cfX  ASSIGNFLOAT(AA0,A0); return AA0;
+#endif
+#define     INT_cfX  return A0;
+#define LOGICAL_cfX  return F2CLOGICAL(A0);
+#define    LONG_cfX  return A0;
+#define   SHORT_cfX  return A0;
+#define    VOID_cfX  return   ;
+#if defined(vmsFortran) || defined(CRAYFortran)
+#define  STRING_cfX  return kill_trailing(                                     \
+                                      kill_trailing(AA0,CFORTRAN_NON_CHAR),' ');
+#else
+#define  STRING_cfX  return kill_trailing(                                     \
+                                      kill_trailing( A0,CFORTRAN_NON_CHAR),' ');
+#endif
+
+#define CFFUN(NAME) _(__cf__,NAME)
+
+/* Note that we don't use LN here, but we keep it for consistency. */
+#define CCALLSFFUN0(UN,LN) CFFUN(UN)()
+
+#ifdef OLD_VAXC                                  /* Allow %CC-I-PARAMNOTUSED. */
+#pragma standard
+#endif
+
+#define CCALLSFFUN1( UN,LN,T1,                        A1)         \
+        CCALLSFFUN5 (UN,LN,T1,CF_0,CF_0,CF_0,CF_0,A1,0,0,0,0)
+#define CCALLSFFUN2( UN,LN,T1,T2,                     A1,A2)      \
+        CCALLSFFUN5 (UN,LN,T1,T2,CF_0,CF_0,CF_0,A1,A2,0,0,0)
+#define CCALLSFFUN3( UN,LN,T1,T2,T3,                  A1,A2,A3)   \
+        CCALLSFFUN5 (UN,LN,T1,T2,T3,CF_0,CF_0,A1,A2,A3,0,0)
+#define CCALLSFFUN4( UN,LN,T1,T2,T3,T4,               A1,A2,A3,A4)\
+        CCALLSFFUN5 (UN,LN,T1,T2,T3,T4,CF_0,A1,A2,A3,A4,0)
+#define CCALLSFFUN5( UN,LN,T1,T2,T3,T4,T5,            A1,A2,A3,A4,A5)          \
+        CCALLSFFUN10(UN,LN,T1,T2,T3,T4,T5,CF_0,CF_0,CF_0,CF_0,CF_0,A1,A2,A3,A4,A5,0,0,0,0,0)
+#define CCALLSFFUN6( UN,LN,T1,T2,T3,T4,T5,T6,         A1,A2,A3,A4,A5,A6)       \
+        CCALLSFFUN10(UN,LN,T1,T2,T3,T4,T5,T6,CF_0,CF_0,CF_0,CF_0,A1,A2,A3,A4,A5,A6,0,0,0,0)
+#define CCALLSFFUN7( UN,LN,T1,T2,T3,T4,T5,T6,T7,      A1,A2,A3,A4,A5,A6,A7)    \
+        CCALLSFFUN10(UN,LN,T1,T2,T3,T4,T5,T6,T7,CF_0,CF_0,CF_0,A1,A2,A3,A4,A5,A6,A7,0,0,0)
+#define CCALLSFFUN8( UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,   A1,A2,A3,A4,A5,A6,A7,A8) \
+        CCALLSFFUN10(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,CF_0,CF_0,A1,A2,A3,A4,A5,A6,A7,A8,0,0)
+#define CCALLSFFUN9( UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,A1,A2,A3,A4,A5,A6,A7,A8,A9)\
+        CCALLSFFUN10(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,CF_0,A1,A2,A3,A4,A5,A6,A7,A8,A9,0)
+#define CCALLSFFUN10(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA)\
+        CCALLSFFUN14(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,CF_0,CF_0,CF_0,CF_0,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,0,0,0,0)
+#define CCALLSFFUN11(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB)\
+        CCALLSFFUN14(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,CF_0,CF_0,CF_0,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,0,0,0)
+#define CCALLSFFUN12(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC)\
+        CCALLSFFUN14(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,CF_0,CF_0,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC,0,0)
+#define CCALLSFFUN13(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC,AD)\
+        CCALLSFFUN14(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,CF_0,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC,AD,0)
+
+#define CCALLSFFUN14(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC,AD,AE)\
+((CFFUN(UN)(  BCF(T1,A1,0) BCF(T2,A2,1) BCF(T3,A3,1) BCF(T4,A4,1) BCF(T5,A5,1) \
+              BCF(T6,A6,1) BCF(T7,A7,1) BCF(T8,A8,1) BCF(T9,A9,1) BCF(TA,AA,1) \
+              BCF(TB,AB,1) BCF(TC,AC,1) BCF(TD,AD,1) BCF(TE,AE,1)              \
+           SCF(T1,LN,1,A1)  SCF(T2,LN,2,A2)  SCF(T3,LN,3,A3)  SCF(T4,LN,4,A4)  \
+           SCF(T5,LN,5,A5)  SCF(T6,LN,6,A6)  SCF(T7,LN,7,A7)  SCF(T8,LN,8,A8)  \
+           SCF(T9,LN,9,A9)  SCF(TA,LN,10,AA) SCF(TB,LN,11,AB) SCF(TC,LN,12,AC) \
+           SCF(TD,LN,13,AD) SCF(TE,LN,14,AE))))
+
+/*  N.B. Create a separate function instead of using (call function, function
+value here) because in order to create the variables needed for the input
+arg.'s which may be const.'s one has to do the creation within {}, but these
+can never be placed within ()'s. Therefore one must create wrapper functions.
+gcc, on the other hand may be able to avoid the wrapper functions. */
+
+/* Prototypes are needed to correctly handle the value returned correctly. N.B.
+Can only have prototype arg.'s with difficulty, a la G... table since FORTRAN
+functions returning strings have extra arg.'s. Don't bother, since this only
+causes a compiler warning to come up when one uses FCALLSCFUNn and CCALLSFFUNn
+for the same function in the same source code. Something done by the experts in
+debugging only.*/    
+
+#define PROTOCCALLSFFUN0(F,UN,LN)                                              \
+_(F,_cfPU)( CFC_(UN,LN))(CF_NULL_PROTO);                                       \
+static _Icf(2,U,F,CFFUN(UN),0)() {_(F,_cfE) _Icf(3,GZ,F,UN,LN) ABSOFT_cf1(F));_(F,_cfX)}
+
+#define PROTOCCALLSFFUN1( T0,UN,LN,T1)                                         \
+        PROTOCCALLSFFUN5 (T0,UN,LN,T1,CF_0,CF_0,CF_0,CF_0)
+#define PROTOCCALLSFFUN2( T0,UN,LN,T1,T2)                                      \
+        PROTOCCALLSFFUN5 (T0,UN,LN,T1,T2,CF_0,CF_0,CF_0)
+#define PROTOCCALLSFFUN3( T0,UN,LN,T1,T2,T3)                                   \
+        PROTOCCALLSFFUN5 (T0,UN,LN,T1,T2,T3,CF_0,CF_0)
+#define PROTOCCALLSFFUN4( T0,UN,LN,T1,T2,T3,T4)                                \
+        PROTOCCALLSFFUN5 (T0,UN,LN,T1,T2,T3,T4,CF_0)
+#define PROTOCCALLSFFUN5( T0,UN,LN,T1,T2,T3,T4,T5)                             \
+        PROTOCCALLSFFUN10(T0,UN,LN,T1,T2,T3,T4,T5,CF_0,CF_0,CF_0,CF_0,CF_0)
+#define PROTOCCALLSFFUN6( T0,UN,LN,T1,T2,T3,T4,T5,T6)                          \
+        PROTOCCALLSFFUN10(T0,UN,LN,T1,T2,T3,T4,T5,T6,CF_0,CF_0,CF_0,CF_0)
+#define PROTOCCALLSFFUN7( T0,UN,LN,T1,T2,T3,T4,T5,T6,T7)                       \
+        PROTOCCALLSFFUN10(T0,UN,LN,T1,T2,T3,T4,T5,T6,T7,CF_0,CF_0,CF_0)
+#define PROTOCCALLSFFUN8( T0,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8)                    \
+        PROTOCCALLSFFUN10(T0,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,CF_0,CF_0)
+#define PROTOCCALLSFFUN9( T0,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9)                 \
+        PROTOCCALLSFFUN10(T0,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,CF_0)
+#define PROTOCCALLSFFUN10(T0,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA)              \
+        PROTOCCALLSFFUN14(T0,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,CF_0,CF_0,CF_0,CF_0)
+#define PROTOCCALLSFFUN11(T0,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB)           \
+        PROTOCCALLSFFUN14(T0,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,CF_0,CF_0,CF_0)
+#define PROTOCCALLSFFUN12(T0,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC)        \
+        PROTOCCALLSFFUN14(T0,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,CF_0,CF_0)
+#define PROTOCCALLSFFUN13(T0,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD)     \
+        PROTOCCALLSFFUN14(T0,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,CF_0)
+
+/* HP/UX 9.01 cc requires the blank between '_Icf(3,G,T0,UN,LN) CCCF(T1,1,0)' */
+
+#ifndef __CF__KnR
+#define PROTOCCALLSFFUN14(T0,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE)  \
+ _(T0,_cfPU)(CFC_(UN,LN))(CF_NULL_PROTO); static _Icf(2,U,T0,CFFUN(UN),0)(     \
+   CFARGT14FS(UCF,HCF,_Z,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE) )          \
+{       CFARGT14S(VCF,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE)    _(T0,_cfE) \
+ CCF(LN,T1,1)  CCF(LN,T2,2)  CCF(LN,T3,3)  CCF(LN,T4,4)  CCF(LN,T5,5)          \
+ CCF(LN,T6,6)  CCF(LN,T7,7)  CCF(LN,T8,8)  CCF(LN,T9,9)  CCF(LN,TA,10)         \
+ CCF(LN,TB,11) CCF(LN,TC,12) CCF(LN,TD,13) CCF(LN,TE,14)    _Icf(3,G,T0,UN,LN) \
+ CFARGT14(CCCF,JCF,ABSOFT_cf1(T0),T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE)); \
+ WCF(T1,A1,1)   WCF(T2,A2,2)   WCF(T3,A3,3)   WCF(T4,A4,4)  WCF(T5,A5,5)       \
+ WCF(T6,A6,6)   WCF(T7,A7,7)   WCF(T8,A8,8)   WCF(T9,A9,9)  WCF(TA,A10,10)     \
+ WCF(TB,A11,11) WCF(TC,A12,12) WCF(TD,A13,13) WCF(TE,A14,14) _(T0,_cfX)}
+#else
+#define PROTOCCALLSFFUN14(T0,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE)  \
+ _(T0,_cfPU)(CFC_(UN,LN))(CF_NULL_PROTO); static _Icf(2,U,T0,CFFUN(UN),0)(     \
+   CFARGT14FS(UUCF,HHCF,_Z,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE) )        \
+ CFARGT14FS(UUUCF,HHHCF,_Z,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE) ;        \
+{       CFARGT14S(VCF,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE)    _(T0,_cfE) \
+ CCF(LN,T1,1)  CCF(LN,T2,2)  CCF(LN,T3,3)  CCF(LN,T4,4)  CCF(LN,T5,5)          \
+ CCF(LN,T6,6)  CCF(LN,T7,7)  CCF(LN,T8,8)  CCF(LN,T9,9)  CCF(LN,TA,10)         \
+ CCF(LN,TB,11) CCF(LN,TC,12) CCF(LN,TD,13) CCF(LN,TE,14)    _Icf(3,G,T0,UN,LN) \
+ CFARGT14(CCCF,JCF,ABSOFT_cf1(T0),T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE)); \
+ WCF(T1,A1,1)   WCF(T2,A2,2)   WCF(T3,A3,3)   WCF(T4,A4,4)   WCF(T5,A5,5)      \
+ WCF(T6,A6,6)   WCF(T7,A7,7)   WCF(T8,A8,8)   WCF(T9,A9,9)   WCF(TA,A10,10)    \
+ WCF(TB,A11,11) WCF(TC,A12,12) WCF(TD,A13,13) WCF(TE,A14,14) _(T0,_cfX)}
+#endif
+
+/*-------------------------------------------------------------------------*/
+
+/*               UTILITIES FOR FORTRAN TO CALL C ROUTINES                  */
+
+#ifdef OLD_VAXC                                /* Prevent %CC-I-PARAMNOTUSED. */
+#pragma nostandard
+#endif
+
+#if defined(vmsFortran) || defined(CRAYFortran)
+#define   DCF(TN,I)
+#define  DDCF(TN,I)
+#define DDDCF(TN,I)
+#else
+#define   DCF(TN,I)          HCF(TN,I)
+#define  DDCF(TN,I)         HHCF(TN,I)
+#define DDDCF(TN,I)        HHHCF(TN,I)
+#endif
+
+#define QCF(TN,I)       _(TN,_cfSTR)(1,Q,_(B,I), 0,0,0,0)
+#define  DEFAULT_cfQ(B)
+#define  LOGICAL_cfQ(B)
+#define PLOGICAL_cfQ(B)
+#define  STRINGV_cfQ(B) char *B; unsigned int _(B,N);
+#define   STRING_cfQ(B) char *B=NULL;
+#define  PSTRING_cfQ(B) char *B=NULL;
+#define PSTRINGV_cfQ(B) STRINGV_cfQ(B)
+#define PNSTRING_cfQ(B) char *B=NULL;
+#define PPSTRING_cfQ(B)
+
+#ifdef     __sgi   /* Else SGI gives warning 182 contrary to its C LRM A.17.7 */
+#define ROUTINE_orig    *(void**)& 
+#else
+#define ROUTINE_orig     (void *)  
+#endif
+
+#define ROUTINE_1     ROUTINE_orig   
+#define ROUTINE_2     ROUTINE_orig   
+#define ROUTINE_3     ROUTINE_orig   
+#define ROUTINE_4     ROUTINE_orig   
+#define ROUTINE_5     ROUTINE_orig   
+#define ROUTINE_6     ROUTINE_orig   
+#define ROUTINE_7     ROUTINE_orig   
+#define ROUTINE_8     ROUTINE_orig   
+#define ROUTINE_9     ROUTINE_orig   
+#define ROUTINE_10    ROUTINE_orig   
+#define ROUTINE_11    ROUTINE_orig   
+#define ROUTINE_12    ROUTINE_orig   
+#define ROUTINE_13    ROUTINE_orig   
+#define ROUTINE_14    ROUTINE_orig   
+#define ROUTINE_15    ROUTINE_orig   
+#define ROUTINE_16    ROUTINE_orig   
+#define ROUTINE_17    ROUTINE_orig   
+#define ROUTINE_18    ROUTINE_orig   
+#define ROUTINE_19    ROUTINE_orig   
+#define ROUTINE_20    ROUTINE_orig   
+#define ROUTINE_21    ROUTINE_orig   
+#define ROUTINE_22    ROUTINE_orig   
+#define ROUTINE_23    ROUTINE_orig   
+#define ROUTINE_24    ROUTINE_orig   
+#define ROUTINE_25    ROUTINE_orig   
+#define ROUTINE_26    ROUTINE_orig   
+#define ROUTINE_27    ROUTINE_orig   
+
+#define TCF(NAME,TN,I,M)              _SEP_(TN,M,cfCOMMA) _(TN,_cfT)(NAME,I,_(A,I),_(B,I),_(C,I))
+#define           BYTE_cfT(M,I,A,B,D) *A
+#define         DOUBLE_cfT(M,I,A,B,D) *A
+#define          FLOAT_cfT(M,I,A,B,D) *A
+#define            INT_cfT(M,I,A,B,D) *A
+#define        LOGICAL_cfT(M,I,A,B,D)  F2CLOGICAL(*A)
+#define           LONG_cfT(M,I,A,B,D) *A
+#define       LONGLONG_cfT(M,I,A,B,D) *A /* added by MR December 2005 */
+#define          SHORT_cfT(M,I,A,B,D) *A
+#define          BYTEV_cfT(M,I,A,B,D)  A
+#define        DOUBLEV_cfT(M,I,A,B,D)  A
+#define         FLOATV_cfT(M,I,A,B,D)  VOIDP A
+#define           INTV_cfT(M,I,A,B,D)  A
+#define       LOGICALV_cfT(M,I,A,B,D)  A
+#define          LONGV_cfT(M,I,A,B,D)  A
+#define      LONGLONGV_cfT(M,I,A,B,D)  A /* added by MR December 2005 */
+#define         SHORTV_cfT(M,I,A,B,D)  A
+#define         BYTEVV_cfT(M,I,A,B,D)  (void *)A /* We have to cast to void *,*/
+#define        BYTEVVV_cfT(M,I,A,B,D)  (void *)A /* since we don't know the   */
+#define       BYTEVVVV_cfT(M,I,A,B,D)  (void *)A /* dimensions of the array.  */
+#define      BYTEVVVVV_cfT(M,I,A,B,D)  (void *)A /* i.e. Unfortunately, can't */
+#define     BYTEVVVVVV_cfT(M,I,A,B,D)  (void *)A /* check that the type       */
+#define    BYTEVVVVVVV_cfT(M,I,A,B,D)  (void *)A /* matches the prototype.    */
+#define       DOUBLEVV_cfT(M,I,A,B,D)  (void *)A
+#define      DOUBLEVVV_cfT(M,I,A,B,D)  (void *)A
+#define     DOUBLEVVVV_cfT(M,I,A,B,D)  (void *)A
+#define    DOUBLEVVVVV_cfT(M,I,A,B,D)  (void *)A
+#define   DOUBLEVVVVVV_cfT(M,I,A,B,D)  (void *)A
+#define  DOUBLEVVVVVVV_cfT(M,I,A,B,D)  (void *)A
+#define        FLOATVV_cfT(M,I,A,B,D)  (void *)A
+#define       FLOATVVV_cfT(M,I,A,B,D)  (void *)A
+#define      FLOATVVVV_cfT(M,I,A,B,D)  (void *)A
+#define     FLOATVVVVV_cfT(M,I,A,B,D)  (void *)A
+#define    FLOATVVVVVV_cfT(M,I,A,B,D)  (void *)A
+#define   FLOATVVVVVVV_cfT(M,I,A,B,D)  (void *)A
+#define          INTVV_cfT(M,I,A,B,D)  (void *)A  
+#define         INTVVV_cfT(M,I,A,B,D)  (void *)A  
+#define        INTVVVV_cfT(M,I,A,B,D)  (void *)A  
+#define       INTVVVVV_cfT(M,I,A,B,D)  (void *)A
+#define      INTVVVVVV_cfT(M,I,A,B,D)  (void *)A
+#define     INTVVVVVVV_cfT(M,I,A,B,D)  (void *)A
+#define      LOGICALVV_cfT(M,I,A,B,D)  (void *)A
+#define     LOGICALVVV_cfT(M,I,A,B,D)  (void *)A
+#define    LOGICALVVVV_cfT(M,I,A,B,D)  (void *)A
+#define   LOGICALVVVVV_cfT(M,I,A,B,D)  (void *)A
+#define  LOGICALVVVVVV_cfT(M,I,A,B,D)  (void *)A
+#define LOGICALVVVVVVV_cfT(M,I,A,B,D)  (void *)A
+#define         LONGVV_cfT(M,I,A,B,D)  (void *)A
+#define        LONGVVV_cfT(M,I,A,B,D)  (void *)A
+#define       LONGVVVV_cfT(M,I,A,B,D)  (void *)A
+#define      LONGVVVVV_cfT(M,I,A,B,D)  (void *)A
+#define     LONGVVVVVV_cfT(M,I,A,B,D)  (void *)A
+#define    LONGVVVVVVV_cfT(M,I,A,B,D)  (void *)A
+#define     LONGLONGVV_cfT(M,I,A,B,D)  (void *)A /* added by MR December 2005 */
+#define    LONGLONGVVV_cfT(M,I,A,B,D)  (void *)A /* added by MR December 2005 */
+#define   LONGLONGVVVV_cfT(M,I,A,B,D)  (void *)A /* added by MR December 2005 */
+#define  LONGLONGVVVVV_cfT(M,I,A,B,D)  (void *)A /* added by MR December 2005 */
+#define LONGLONGVVVVVV_cfT(M,I,A,B,D)  (void *)A /* added by MR December 2005 */
+#define LONGLONGVVVVVVV_cfT(M,I,A,B,D)  (void *)A /* added by MR December 2005 */
+#define        SHORTVV_cfT(M,I,A,B,D)  (void *)A
+#define       SHORTVVV_cfT(M,I,A,B,D)  (void *)A
+#define      SHORTVVVV_cfT(M,I,A,B,D)  (void *)A
+#define     SHORTVVVVV_cfT(M,I,A,B,D)  (void *)A
+#define    SHORTVVVVVV_cfT(M,I,A,B,D)  (void *)A
+#define   SHORTVVVVVVV_cfT(M,I,A,B,D)  (void *)A
+#define          PBYTE_cfT(M,I,A,B,D)  A
+#define        PDOUBLE_cfT(M,I,A,B,D)  A
+#define         PFLOAT_cfT(M,I,A,B,D)  VOIDP A
+#define           PINT_cfT(M,I,A,B,D)  A
+#define       PLOGICAL_cfT(M,I,A,B,D)  ((*A=F2CLOGICAL(*A)),A)
+#define          PLONG_cfT(M,I,A,B,D)  A
+#define      PLONGLONG_cfT(M,I,A,B,D)  A /* added by MR December 2005 */
+#define         PSHORT_cfT(M,I,A,B,D)  A
+#define          PVOID_cfT(M,I,A,B,D)  A
+#if defined(apolloFortran) || defined(hpuxFortran800) || defined(AbsoftUNIXFortran)
+#define        ROUTINE_cfT(M,I,A,B,D)  _(ROUTINE_,I)  (*A)
+#else
+#define        ROUTINE_cfT(M,I,A,B,D)  _(ROUTINE_,I)    A
+#endif
+/* A == pointer to the characters
+   D == length of the string, or of an element in an array of strings
+   E == number of elements in an array of strings                             */
+#define TTSTR(    A,B,D)                                                       \
+           ((B=_cf_malloc(D+1))[D]='\0', memcpy(B,A,D), kill_trailing(B,' '))
+#define TTTTSTR(  A,B,D)   (!(D<4||A[0]||A[1]||A[2]||A[3]))?NULL:              \
+                            memchr(A,'\0',D)                 ?A   : TTSTR(A,B,D)
+#define TTTTSTRV( A,B,D,E) (_(B,N)=E,B=_cf_malloc(_(B,N)*(D+1)), (void *)      \
+  vkill_trailing(f2cstrv(A,B,D+1, _(B,N)*(D+1)), D+1,_(B,N)*(D+1),' '))
+#ifdef vmsFortran
+#define         STRING_cfT(M,I,A,B,D)  TTTTSTR( A->dsc$a_pointer,B,A->dsc$w_length)
+#define        STRINGV_cfT(M,I,A,B,D)  TTTTSTRV(A->dsc$a_pointer, B,           \
+                                             A->dsc$w_length , A->dsc$l_m[0])
+#define        PSTRING_cfT(M,I,A,B,D)    TTSTR( A->dsc$a_pointer,B,A->dsc$w_length)
+#define       PPSTRING_cfT(M,I,A,B,D)           A->dsc$a_pointer
+#else
+#ifdef CRAYFortran
+#define         STRING_cfT(M,I,A,B,D)  TTTTSTR( _fcdtocp(A),B,_fcdlen(A))
+#define        STRINGV_cfT(M,I,A,B,D)  TTTTSTRV(_fcdtocp(A),B,_fcdlen(A),      \
+                              num_elem(_fcdtocp(A),_fcdlen(A),_3(M,_STRV_A,I)))
+#define        PSTRING_cfT(M,I,A,B,D)    TTSTR( _fcdtocp(A),B,_fcdlen(A))
+#define       PPSTRING_cfT(M,I,A,B,D)           _fcdtocp(A)
+#else
+#define         STRING_cfT(M,I,A,B,D)  TTTTSTR( A,B,D)
+#define        STRINGV_cfT(M,I,A,B,D)  TTTTSTRV(A,B,D, num_elem(A,D,_3(M,_STRV_A,I)))
+#define        PSTRING_cfT(M,I,A,B,D)    TTSTR( A,B,D)
+#define       PPSTRING_cfT(M,I,A,B,D)           A
+#endif
+#endif
+#define       PNSTRING_cfT(M,I,A,B,D)    STRING_cfT(M,I,A,B,D)
+#define       PSTRINGV_cfT(M,I,A,B,D)   STRINGV_cfT(M,I,A,B,D)
+#define           CF_0_cfT(M,I,A,B,D)
+
+#define RCF(TN,I)           _(TN,_cfSTR)(3,R,_(A,I),_(B,I),_(C,I),0,0)
+#define  DEFAULT_cfR(A,B,D)
+#define  LOGICAL_cfR(A,B,D)
+#define PLOGICAL_cfR(A,B,D) *A=C2FLOGICAL(*A);
+#define   STRING_cfR(A,B,D) if (B) _cf_free(B);
+#define  STRINGV_cfR(A,B,D) _cf_free(B);
+/* A and D as defined above for TSTRING(V) */
+#define RRRRPSTR( A,B,D)    if (B) memcpy(A,B, _cfMIN(strlen(B),D)),           \
+                  (D>strlen(B)?memset(A+strlen(B),' ', D-strlen(B)):0), _cf_free(B);
+#define RRRRPSTRV(A,B,D)    c2fstrv(B,A,D+1,(D+1)*_(B,N)), _cf_free(B);
+#ifdef vmsFortran
+#define  PSTRING_cfR(A,B,D) RRRRPSTR( A->dsc$a_pointer,B,A->dsc$w_length)
+#define PSTRINGV_cfR(A,B,D) RRRRPSTRV(A->dsc$a_pointer,B,A->dsc$w_length)
+#else
+#ifdef CRAYFortran
+#define  PSTRING_cfR(A,B,D) RRRRPSTR( _fcdtocp(A),B,_fcdlen(A))
+#define PSTRINGV_cfR(A,B,D) RRRRPSTRV(_fcdtocp(A),B,_fcdlen(A))
+#else
+#define  PSTRING_cfR(A,B,D) RRRRPSTR( A,B,D)
+#define PSTRINGV_cfR(A,B,D) RRRRPSTRV(A,B,D)
+#endif
+#endif
+#define PNSTRING_cfR(A,B,D) PSTRING_cfR(A,B,D)
+#define PPSTRING_cfR(A,B,D)
+
+#define    BYTE_cfFZ(UN,LN) INTEGER_BYTE     FCALLSC_QUALIFIER fcallsc(UN,LN)(
+#define  DOUBLE_cfFZ(UN,LN) DOUBLE_PRECISION FCALLSC_QUALIFIER fcallsc(UN,LN)(
+#define     INT_cfFZ(UN,LN) int   FCALLSC_QUALIFIER fcallsc(UN,LN)(
+#define LOGICAL_cfFZ(UN,LN) int   FCALLSC_QUALIFIER fcallsc(UN,LN)(
+#define    LONG_cfFZ(UN,LN) long  FCALLSC_QUALIFIER fcallsc(UN,LN)(
+#define LONGLONG_cfFZ(UN,LN) LONGLONG FCALLSC_QUALIFIER fcallsc(UN,LN)( /* added by MR December 2005 */
+#define   SHORT_cfFZ(UN,LN) short FCALLSC_QUALIFIER fcallsc(UN,LN)(
+#define    VOID_cfFZ(UN,LN) void  FCALLSC_QUALIFIER fcallsc(UN,LN)(
+#ifndef __CF__KnR
+/* The void is req'd by the Apollo, to make this an ANSI function declaration.
+   The Apollo promotes K&R float functions to double. */
+#if defined (f2cFortran) && ! defined (gFortran)
+/* f2c/g77 return double from FORTRAN REAL functions. (KMCCARTY, 2005/12/09) */
+#define FLOAT_cfFZ(UN,LN) DOUBLE_PRECISION FCALLSC_QUALIFIER fcallsc(UN,LN)(void
+#else
+#define FLOAT_cfFZ(UN,LN) FORTRAN_REAL FCALLSC_QUALIFIER fcallsc(UN,LN)(void
+#endif
+#ifdef vmsFortran
+#define  STRING_cfFZ(UN,LN) void  FCALLSC_QUALIFIER fcallsc(UN,LN)(fstring *AS
+#else
+#ifdef CRAYFortran
+#define  STRING_cfFZ(UN,LN) void  FCALLSC_QUALIFIER fcallsc(UN,LN)(_fcd     AS
+#else
+#if  defined(AbsoftUNIXFortran) || defined(AbsoftProFortran)
+#define  STRING_cfFZ(UN,LN) void  FCALLSC_QUALIFIER fcallsc(UN,LN)(char    *AS
+#else
+#define  STRING_cfFZ(UN,LN) void  FCALLSC_QUALIFIER fcallsc(UN,LN)(char    *AS, unsigned D0
+#endif
+#endif
+#endif
+#else
+#if ! (defined(FLOATFUNCTIONTYPE)&&defined(ASSIGNFLOAT)&&defined(RETURNFLOAT))
+#if defined (f2cFortran) && ! defined (gFortran)
+/* f2c/g77 return double from FORTRAN REAL functions. (KMCCARTY, 2005/12/09) */
+#define   FLOAT_cfFZ(UN,LN) DOUBLE_PRECISION  FCALLSC_QUALIFIER fcallsc(UN,LN)(
+#else
+#define   FLOAT_cfFZ(UN,LN) FORTRAN_REAL      FCALLSC_QUALIFIER fcallsc(UN,LN)(
+#endif
+#else
+#define   FLOAT_cfFZ(UN,LN) FLOATFUNCTIONTYPE FCALLSC_QUALIFIER fcallsc(UN,LN)(
+#endif
+#if defined(vmsFortran) || defined(CRAYFortran) || defined(AbsoftUNIXFortran)
+#define  STRING_cfFZ(UN,LN) void  FCALLSC_QUALIFIER fcallsc(UN,LN)(AS
+#else
+#define  STRING_cfFZ(UN,LN) void  FCALLSC_QUALIFIER fcallsc(UN,LN)(AS, D0
+#endif
+#endif
+
+#define    BYTE_cfF(UN,LN)     BYTE_cfFZ(UN,LN)
+#define  DOUBLE_cfF(UN,LN)   DOUBLE_cfFZ(UN,LN)
+#ifndef __CF_KnR
+#if defined (f2cFortran) && ! defined (gFortran)
+/* f2c/g77 return double from FORTRAN REAL functions. (KMCCARTY, 2005/12/09) */
+#define   FLOAT_cfF(UN,LN)  DOUBLE_PRECISION FCALLSC_QUALIFIER fcallsc(UN,LN)(
+#else
+#define   FLOAT_cfF(UN,LN)  FORTRAN_REAL FCALLSC_QUALIFIER fcallsc(UN,LN)(
+#endif
+#else
+#define   FLOAT_cfF(UN,LN)    FLOAT_cfFZ(UN,LN)
+#endif
+#define     INT_cfF(UN,LN)      INT_cfFZ(UN,LN)
+#define LOGICAL_cfF(UN,LN)  LOGICAL_cfFZ(UN,LN)
+#define    LONG_cfF(UN,LN)     LONG_cfFZ(UN,LN)
+#define LONGLONG_cfF(UN,LN) LONGLONG_cfFZ(UN,LN) /* added by MR December 2005 */
+#define   SHORT_cfF(UN,LN)    SHORT_cfFZ(UN,LN)
+#define    VOID_cfF(UN,LN)     VOID_cfFZ(UN,LN)
+#define  STRING_cfF(UN,LN)   STRING_cfFZ(UN,LN),
+
+#define     INT_cfFF
+#define    VOID_cfFF
+#ifdef vmsFortran
+#define  STRING_cfFF           fstring *AS; 
+#else
+#ifdef CRAYFortran
+#define  STRING_cfFF           _fcd     AS;
+#else
+#define  STRING_cfFF           char    *AS; unsigned D0;
+#endif
+#endif
+
+#define     INT_cfL            A0=
+#define  STRING_cfL            A0=
+#define    VOID_cfL                        
+
+#define    INT_cfK
+#define   VOID_cfK
+/* KSTRING copies the string into the position provided by the caller. */
+#ifdef vmsFortran
+#define STRING_cfK                                                             \
+ memcpy(AS->dsc$a_pointer,A0,_cfMIN(AS->dsc$w_length,(A0==NULL?0:strlen(A0))));\
+ AS->dsc$w_length>(A0==NULL?0:strlen(A0))?                                     \
+  memset(AS->dsc$a_pointer+(A0==NULL?0:strlen(A0)),' ',                        \
+         AS->dsc$w_length-(A0==NULL?0:strlen(A0))):0;
+#else
+#ifdef CRAYFortran
+#define STRING_cfK                                                             \
+ memcpy(_fcdtocp(AS),A0, _cfMIN(_fcdlen(AS),(A0==NULL?0:strlen(A0))) );        \
+ _fcdlen(AS)>(A0==NULL?0:strlen(A0))?                                          \
+  memset(_fcdtocp(AS)+(A0==NULL?0:strlen(A0)),' ',                             \
+         _fcdlen(AS)-(A0==NULL?0:strlen(A0))):0;
+#else
+#define STRING_cfK         memcpy(AS,A0, _cfMIN(D0,(A0==NULL?0:strlen(A0))) ); \
+                 D0>(A0==NULL?0:strlen(A0))?memset(AS+(A0==NULL?0:strlen(A0)), \
+                                            ' ', D0-(A0==NULL?0:strlen(A0))):0;
+#endif
+#endif
+
+/* Note that K.. and I.. can't be combined since K.. has to access data before
+R.., in order for functions returning strings which are also passed in as
+arguments to work correctly. Note that R.. frees and hence may corrupt the
+string. */
+#define    BYTE_cfI  return A0;
+#define  DOUBLE_cfI  return A0;
+#if ! (defined(FLOATFUNCTIONTYPE)&&defined(ASSIGNFLOAT)&&defined(RETURNFLOAT))
+#define   FLOAT_cfI  return A0;
+#else
+#define   FLOAT_cfI  RETURNFLOAT(A0);
+#endif
+#define     INT_cfI  return A0;
+#ifdef hpuxFortran800
+/* Incredibly, functions must return true as 1, elsewhere .true.==0x01000000. */
+#define LOGICAL_cfI  return ((A0)?1:0);
+#else
+#define LOGICAL_cfI  return C2FLOGICAL(A0);
+#endif
+#define    LONG_cfI  return A0;
+#define LONGLONG_cfI  return A0; /* added by MR December 2005 */
+#define   SHORT_cfI  return A0;
+#define  STRING_cfI  return   ;
+#define    VOID_cfI  return   ;
+
+#ifdef OLD_VAXC                                  /* Allow %CC-I-PARAMNOTUSED. */
+#pragma standard
+#endif
+
+#define FCALLSCSUB0( CN,UN,LN)             FCALLSCFUN0(VOID,CN,UN,LN)
+#define FCALLSCSUB1( CN,UN,LN,T1)          FCALLSCFUN1(VOID,CN,UN,LN,T1)
+#define FCALLSCSUB2( CN,UN,LN,T1,T2)       FCALLSCFUN2(VOID,CN,UN,LN,T1,T2)
+#define FCALLSCSUB3( CN,UN,LN,T1,T2,T3)    FCALLSCFUN3(VOID,CN,UN,LN,T1,T2,T3)
+#define FCALLSCSUB4( CN,UN,LN,T1,T2,T3,T4) \
+    FCALLSCFUN4(VOID,CN,UN,LN,T1,T2,T3,T4)
+#define FCALLSCSUB5( CN,UN,LN,T1,T2,T3,T4,T5) \
+    FCALLSCFUN5(VOID,CN,UN,LN,T1,T2,T3,T4,T5)
+#define FCALLSCSUB6( CN,UN,LN,T1,T2,T3,T4,T5,T6) \
+    FCALLSCFUN6(VOID,CN,UN,LN,T1,T2,T3,T4,T5,T6)       
+#define FCALLSCSUB7( CN,UN,LN,T1,T2,T3,T4,T5,T6,T7) \
+    FCALLSCFUN7(VOID,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7)
+#define FCALLSCSUB8( CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8) \
+    FCALLSCFUN8(VOID,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8)
+#define FCALLSCSUB9( CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9) \
+    FCALLSCFUN9(VOID,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9)
+#define FCALLSCSUB10(CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA) \
+   FCALLSCFUN10(VOID,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA)
+#define FCALLSCSUB11(CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB) \
+   FCALLSCFUN11(VOID,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB)
+#define FCALLSCSUB12(CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC) \
+   FCALLSCFUN12(VOID,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC)
+#define FCALLSCSUB13(CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD) \
+   FCALLSCFUN13(VOID,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD)
+#define FCALLSCSUB14(CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE) \
+   FCALLSCFUN14(VOID,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE)
+#define FCALLSCSUB15(CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF) \
+   FCALLSCFUN15(VOID,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF)
+#define FCALLSCSUB16(CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG) \
+   FCALLSCFUN16(VOID,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG)
+#define FCALLSCSUB17(CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH) \
+   FCALLSCFUN17(VOID,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH)
+#define FCALLSCSUB18(CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI) \
+   FCALLSCFUN18(VOID,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI)
+#define FCALLSCSUB19(CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ) \
+   FCALLSCFUN19(VOID,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ)
+#define FCALLSCSUB20(CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK) \
+   FCALLSCFUN20(VOID,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK)
+#define FCALLSCSUB21(CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL) \
+   FCALLSCFUN21(VOID,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL)
+#define FCALLSCSUB22(CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM) \
+   FCALLSCFUN22(VOID,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM)
+#define FCALLSCSUB23(CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN) \
+   FCALLSCFUN23(VOID,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN)
+#define FCALLSCSUB24(CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO) \
+   FCALLSCFUN24(VOID,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO)
+#define FCALLSCSUB25(CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,TP) \
+   FCALLSCFUN25(VOID,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,TP)
+#define FCALLSCSUB26(CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,TP,TQ) \
+   FCALLSCFUN26(VOID,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,TP,TQ)
+#define FCALLSCSUB27(CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,TP,TQ,TR) \
+   FCALLSCFUN27(VOID,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,TP,TQ,TR)
+
+
+#define FCALLSCFUN1( T0,CN,UN,LN,T1) \
+        FCALLSCFUN5 (T0,CN,UN,LN,T1,CF_0,CF_0,CF_0,CF_0)
+#define FCALLSCFUN2( T0,CN,UN,LN,T1,T2) \
+        FCALLSCFUN5 (T0,CN,UN,LN,T1,T2,CF_0,CF_0,CF_0)
+#define FCALLSCFUN3( T0,CN,UN,LN,T1,T2,T3) \
+        FCALLSCFUN5 (T0,CN,UN,LN,T1,T2,T3,CF_0,CF_0)
+#define FCALLSCFUN4( T0,CN,UN,LN,T1,T2,T3,T4) \
+        FCALLSCFUN5 (T0,CN,UN,LN,T1,T2,T3,T4,CF_0)
+#define FCALLSCFUN5( T0,CN,UN,LN,T1,T2,T3,T4,T5) \
+        FCALLSCFUN10(T0,CN,UN,LN,T1,T2,T3,T4,T5,CF_0,CF_0,CF_0,CF_0,CF_0)
+#define FCALLSCFUN6( T0,CN,UN,LN,T1,T2,T3,T4,T5,T6) \
+        FCALLSCFUN10(T0,CN,UN,LN,T1,T2,T3,T4,T5,T6,CF_0,CF_0,CF_0,CF_0)
+#define FCALLSCFUN7( T0,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7) \
+        FCALLSCFUN10(T0,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,CF_0,CF_0,CF_0)
+#define FCALLSCFUN8( T0,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8) \
+        FCALLSCFUN10(T0,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,CF_0,CF_0)
+#define FCALLSCFUN9( T0,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9) \
+        FCALLSCFUN10(T0,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,CF_0)
+#define FCALLSCFUN10(T0,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA) \
+        FCALLSCFUN14(T0,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,CF_0,CF_0,CF_0,CF_0)
+#define FCALLSCFUN11(T0,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB) \
+        FCALLSCFUN14(T0,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,CF_0,CF_0,CF_0)
+#define FCALLSCFUN12(T0,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC) \
+        FCALLSCFUN14(T0,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,CF_0,CF_0)
+#define FCALLSCFUN13(T0,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD) \
+        FCALLSCFUN14(T0,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,CF_0)
+
+
+#define FCALLSCFUN15(T0,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF) \
+        FCALLSCFUN20(T0,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,CF_0,CF_0,CF_0,CF_0,CF_0)
+#define FCALLSCFUN16(T0,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG) \
+        FCALLSCFUN20(T0,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,CF_0,CF_0,CF_0,CF_0)
+#define FCALLSCFUN17(T0,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH) \
+        FCALLSCFUN20(T0,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,CF_0,CF_0,CF_0)
+#define FCALLSCFUN18(T0,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI) \
+        FCALLSCFUN20(T0,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,CF_0,CF_0)
+#define FCALLSCFUN19(T0,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ) \
+        FCALLSCFUN20(T0,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,CF_0)
+#define FCALLSCFUN20(T0,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK) \
+        FCALLSCFUN27(T0,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,CF_0,CF_0,CF_0,CF_0,CF_0,CF_0,CF_0)
+#define FCALLSCFUN21(T0,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL) \
+        FCALLSCFUN27(T0,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,CF_0,CF_0,CF_0,CF_0,CF_0,CF_0)
+#define FCALLSCFUN22(T0,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM) \
+        FCALLSCFUN27(T0,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,CF_0,CF_0,CF_0,CF_0,CF_0)
+#define FCALLSCFUN23(T0,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN) \
+        FCALLSCFUN27(T0,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,CF_0,CF_0,CF_0,CF_0)
+#define FCALLSCFUN24(T0,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO) \
+        FCALLSCFUN27(T0,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,CF_0,CF_0,CF_0)
+#define FCALLSCFUN25(T0,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,TP) \
+        FCALLSCFUN27(T0,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,TP,CF_0,CF_0)
+#define FCALLSCFUN26(T0,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,TP,TQ) \
+        FCALLSCFUN27(T0,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,TP,TQ,CF_0)
+
+
+#ifndef __CF__KnR
+#define FCALLSCFUN0(T0,CN,UN,LN) CFextern _(T0,_cfFZ)(UN,LN) ABSOFT_cf2(T0))   \
+        {_Icf(2,UU,T0,A0,0); _Icf(0,L,T0,0,0) CN(); _Icf(0,K,T0,0,0) _(T0,_cfI)}
+
+#define FCALLSCFUN14(T0,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE)    \
+                                 CFextern _(T0,_cfF)(UN,LN)                    \
+ CFARGT14(NCF,DCF,ABSOFT_cf2(T0),T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE) )  \
+ {                 CFARGT14S(QCF,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE)    \
+  _Icf(2,UU,T0,A0,0); _Icf(0,L,T0,0,0)      CN(    TCF(LN,T1,1,0)  TCF(LN,T2,2,1) \
+    TCF(LN,T3,3,1)  TCF(LN,T4,4,1) TCF(LN,T5,5,1)  TCF(LN,T6,6,1)  TCF(LN,T7,7,1) \
+    TCF(LN,T8,8,1)  TCF(LN,T9,9,1) TCF(LN,TA,10,1) TCF(LN,TB,11,1) TCF(LN,TC,12,1) \
+    TCF(LN,TD,13,1) TCF(LN,TE,14,1) );                          _Icf(0,K,T0,0,0) \
+                   CFARGT14S(RCF,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE)  _(T0,_cfI) }
+
+#define FCALLSCFUN27(T0,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,TP,TQ,TR)   \
+                                 CFextern _(T0,_cfF)(UN,LN)                    \
+ CFARGT27(NCF,DCF,ABSOFT_cf2(T0),T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,TP,TQ,TR) ) \
+ {                 CFARGT27S(QCF,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,TP,TQ,TR)   \
+  _Icf(2,UU,T0,A0,0); _Icf(0,L,T0,0,0)      CN(     TCF(LN,T1,1,0)  TCF(LN,T2,2,1)  \
+    TCF(LN,T3,3,1)  TCF(LN,T4,4,1)  TCF(LN,T5,5,1)  TCF(LN,T6,6,1)  TCF(LN,T7,7,1)  \
+    TCF(LN,T8,8,1)  TCF(LN,T9,9,1)  TCF(LN,TA,10,1) TCF(LN,TB,11,1) TCF(LN,TC,12,1) \
+    TCF(LN,TD,13,1) TCF(LN,TE,14,1) TCF(LN,TF,15,1) TCF(LN,TG,16,1) TCF(LN,TH,17,1) \
+    TCF(LN,TI,18,1) TCF(LN,TJ,19,1) TCF(LN,TK,20,1) TCF(LN,TL,21,1) TCF(LN,TM,22,1) \
+    TCF(LN,TN,23,1) TCF(LN,TO,24,1) TCF(LN,TP,25,1) TCF(LN,TQ,26,1) TCF(LN,TR,27,1) ); _Icf(0,K,T0,0,0) \
+                   CFARGT27S(RCF,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,TP,TQ,TR)  _(T0,_cfI) }
+
+#else
+#define FCALLSCFUN0(T0,CN,UN,LN) CFextern _(T0,_cfFZ)(UN,LN) ABSOFT_cf3(T0)) _Icf(0,FF,T0,0,0)\
+        {_Icf(2,UU,T0,A0,0); _Icf(0,L,T0,0,0) CN(); _Icf(0,K,T0,0,0) _(T0,_cfI)}
+
+#define FCALLSCFUN14(T0,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE)    \
+                                 CFextern _(T0,_cfF)(UN,LN)                    \
+ CFARGT14(NNCF,DDCF,ABSOFT_cf3(T0),T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE)) _Icf(0,FF,T0,0,0) \
+       CFARGT14FS(NNNCF,DDDCF,_Z,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE);   \
+ {                 CFARGT14S(QCF,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE)    \
+  _Icf(2,UU,T0,A0,0); _Icf(0,L,T0,0,0)      CN(  TCF(LN,T1,1,0) TCF(LN,T2,2,1) \
+    TCF(LN,T3,3,1) TCF(LN,T4,4,1) TCF(LN,T5,5,1) TCF(LN,T6,6,1) TCF(LN,T7,7,1) \
+    TCF(LN,T8,8,1) TCF(LN,T9,9,1) TCF(LN,TA,10,1) TCF(LN,TB,11,1) TCF(LN,TC,12,1) \
+    TCF(LN,TD,13,1) TCF(LN,TE,14,1) );                          _Icf(0,K,T0,0,0) \
+                   CFARGT14S(RCF,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE)  _(T0,_cfI)}
+
+#define FCALLSCFUN27(T0,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,TP,TQ,TR)  \
+                                 CFextern _(T0,_cfF)(UN,LN)                    \
+ CFARGT27(NNCF,DDCF,ABSOFT_cf3(T0),T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,TP,TQ,TR)) _Icf(0,FF,T0,0,0) \
+       CFARGT27FS(NNNCF,DDDCF,_Z,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,TP,TQ,TR); \
+ {                 CFARGT27S(QCF,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,TP,TQ,TR)  \
+  _Icf(2,UU,T0,A0,0); _Icf(0,L,T0,0,0)      CN(     TCF(LN,T1,1,0)  TCF(LN,T2,2,1)  \
+    TCF(LN,T3,3,1)  TCF(LN,T4,4,1)  TCF(LN,T5,5,1)  TCF(LN,T6,6,1)  TCF(LN,T7,7,1)  \
+    TCF(LN,T8,8,1)  TCF(LN,T9,9,1)  TCF(LN,TA,10,1) TCF(LN,TB,11,1) TCF(LN,TC,12,1) \
+    TCF(LN,TD,13,1) TCF(LN,TE,14,1) TCF(LN,TF,15,1) TCF(LN,TG,16,1) TCF(LN,TH,17,1) \
+    TCF(LN,TI,18,1) TCF(LN,TJ,19,1) TCF(LN,TK,20,1) TCF(LN,TL,21,1) TCF(LN,TM,22,1) \
+    TCF(LN,TN,23,1) TCF(LN,TO,24,1) TCF(LN,TP,25,1) TCF(LN,TQ,26,1) TCF(LN,TR,27,1) ); _Icf(0,K,T0,0,0) \
+                   CFARGT27S(RCF,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,TP,TQ,TR)  _(T0,_cfI)}
+
+#endif
+
+
+#endif	 /* __CFORTRAN_LOADED */
diff --git a/libsrc/fort-attio.c b/libsrc/fort-attio.c
new file mode 100644
index 0000000..d978c5d
--- /dev/null
+++ b/libsrc/fort-attio.c
@@ -0,0 +1,150 @@
+#include <config.h>
+#include <string.h>
+#include <errno.h>
+
+#include "netcdf.h"
+#include "netcdf_f.h"
+#include "nfconfig.inc"
+#include "ncfortran.h"
+
+
+/*
+ * Write an attribute from a FORTRAN CHARACTER*(*) variable.
+ */
+FCALLSCFUN5(NF_INT, nc_put_att_text, NF_PUT_ATT_TEXT, nf_put_att_text,
+	    NCID, VARID, STRING, COUNT, CBUF)
+
+
+/*
+ * Read an attribute into a FORTRAN CHARACTER*(*) variable.
+ */
+FCALLSCFUN4(NF_INT, nc_get_att_text, NF_GET_ATT_TEXT, nf_get_att_text,
+	    NCID, VARID, STRING, CBUF)
+
+
+/*
+ * Write an attribute from an INTEGER*1 array.
+ */
+#if NF_INT1_IS_C_SIGNED_CHAR
+FCALLSCFUN6(NF_INT, nc_put_att_schar, NF_PUT_ATT_INT1, nf_put_att_int1,
+	    NCID, VARID, STRING, TYPE, COUNT, INT1ATT)
+#elif NF_INT1_IS_C_SHORT
+FCALLSCFUN6(NF_INT, nc_put_att_short, NF_PUT_ATT_INT1, nf_put_att_int1,
+	    NCID, VARID, STRING, TYPE, COUNT, INT1ATT)
+#elif NF_INT1_IS_C_INT
+FCALLSCFUN6(NF_INT, nc_put_att_int, NF_PUT_ATT_INT1, nf_put_att_int1,
+	    NCID, VARID, STRING, TYPE, COUNT, INT1ATT)
+#elif NF_INT1_IS_C_LONG
+FCALLSCFUN6(NF_INT, nc_put_att_long, NF_PUT_ATT_INT1, nf_put_att_int1,
+	    NCID, VARID, STRING, TYPE, COUNT, INT1ATT)
+#endif
+
+
+/*
+ * Read an attribute into an INTEGER*1 array.
+ */
+#if NF_INT1_IS_C_SIGNED_CHAR
+FCALLSCFUN4(NF_INT, nc_get_att_schar, NF_GET_ATT_INT1, nf_get_att_int1,
+	    NCID, VARID, STRING, PINT1ATT)
+#elif NF_INT1_IS_C_SHORT
+FCALLSCFUN4(NF_INT, nc_get_att_short, NF_GET_ATT_INT1, nf_get_att_int1,
+	    NCID, VARID, STRING, PINT1ATT)
+#elif NF_INT1_IS_C_INT
+FCALLSCFUN4(NF_INT, nc_get_att_int, NF_GET_ATT_INT1, nf_get_att_int1,
+	    NCID, VARID, STRING, PINT1ATT)
+#elif NF_INT1_IS_C_LONG
+FCALLSCFUN4(NF_INT, nc_get_att_long, NF_GET_ATT_INT1, nf_get_att_int1,
+	    NCID, VARID, STRING, PINT1ATT)
+#endif
+
+
+/*
+ * Write an attribute from an INTEGER*2 array.
+ */
+#if NF_INT2_IS_C_SHORT
+FCALLSCFUN6(NF_INT, nc_put_att_short, NF_PUT_ATT_INT2, nf_put_att_int2,
+	    NCID, VARID, STRING, TYPE, COUNT, INT2ATT)
+#elif NF_INT2_IS_C_INT
+FCALLSCFUN6(NF_INT, nc_put_att_int, NF_PUT_ATT_INT2, nf_put_att_int2,
+	    NCID, VARID, STRING, TYPE, COUNT, INT2ATT)
+#elif NF_INT2_IS_C_LONG
+FCALLSCFUN6(NF_INT, nc_put_att_long, NF_PUT_ATT_INT2, nf_put_att_int2,
+	    NCID, VARID, STRING, TYPE, COUNT, INT2ATT)
+#endif
+
+
+/*
+ * Read an attribute into an INTEGER*2 array.
+ */
+#if NF_INT2_IS_C_SHORT
+FCALLSCFUN4(NF_INT, nc_get_att_short, NF_GET_ATT_INT2, nf_get_att_int2,
+	    NCID, VARID, STRING, PINT2ATT)
+#elif NF_INT2_IS_C_INT
+FCALLSCFUN4(NF_INT, nc_get_att_int, NF_GET_ATT_INT2, nf_get_att_int2,
+	    NCID, VARID, STRING, PINT2ATT)
+#elif NF_INT2_IS_C_LONG
+FCALLSCFUN4(NF_INT, nc_get_att_long, NF_GET_ATT_INT2, nf_get_att_int2,
+	    NCID, VARID, STRING, PINT2ATT)
+#endif
+
+
+/*
+ * Write an attribute from an INTEGER array.
+ */
+#if NF_INT_IS_C_INT
+FCALLSCFUN6(NF_INT, nc_put_att_int, NF_PUT_ATT_INT, nf_put_att_int,
+	    NCID, VARID, STRING, TYPE, COUNT, INTATT)
+#elif NF_INT_IS_C_LONG
+FCALLSCFUN6(NF_INT, nc_put_att_long, NF_PUT_ATT_INT, nf_put_att_int,
+	    NCID, VARID, STRING, TYPE, COUNT, INTATT)
+#endif
+
+
+/*
+ * Read an attribute into an INTEGER array.
+ */
+#if NF_INT_IS_C_INT
+FCALLSCFUN4(NF_INT, nc_get_att_int, NF_GET_ATT_INT, nf_get_att_int,
+	    NCID, VARID, STRING, PINTATT)
+#elif NF_INT_IS_C_LONG
+FCALLSCFUN4(NF_INT, nc_get_att_long, NF_GET_ATT_INT, nf_get_att_int,
+	    NCID, VARID, STRING, PINTATT)
+#endif
+
+
+/*
+ * Write an attribute from a REAL array.
+ */
+#if NF_REAL_IS_C_DOUBLE
+FCALLSCFUN6(NF_INT, nc_put_att_double, NF_PUT_ATT_REAL, nf_put_att_real,
+	    NCID, VARID, STRING, TYPE, COUNT, DOUBLEATT)
+#else
+FCALLSCFUN6(NF_INT, nc_put_att_float, NF_PUT_ATT_REAL, nf_put_att_real,
+	    NCID, VARID, STRING, TYPE, COUNT, REALATT)
+#endif
+
+
+/*
+ * Read an attribute into a REAL array.
+ */
+#if NF_REAL_IS_C_DOUBLE
+FCALLSCFUN4(NF_INT, nc_get_att_double, NF_GET_ATT_REAL, nf_get_att_real,
+	    NCID, VARID, STRING, PDOUBLEATT)
+#else
+FCALLSCFUN4(NF_INT, nc_get_att_float, NF_GET_ATT_REAL, nf_get_att_real,
+	    NCID, VARID, STRING, PREALATT)
+#endif
+
+
+/*
+ * Write an attribute from a DOUBLEPRECISION array.
+ */
+FCALLSCFUN6(NF_INT, nc_put_att_double, NF_PUT_ATT_DOUBLE, nf_put_att_double,
+	    NCID, VARID, STRING, TYPE, COUNT, DOUBLEATT)
+
+
+/*
+ * Read an attribute into a DOUBLEPRECISION array.
+ */
+FCALLSCFUN4(NF_INT, nc_get_att_double, NF_GET_ATT_DOUBLE, nf_get_att_double,
+	    NCID, VARID, STRING, PDOUBLEATT)
diff --git a/libsrc/fort-control.c b/libsrc/fort-control.c
new file mode 100644
index 0000000..0ed3f19
--- /dev/null
+++ b/libsrc/fort-control.c
@@ -0,0 +1,137 @@
+#include <config.h>
+#include "netcdf.h"
+#include "ncfortran.h"
+
+#ifdef LOGGING
+FCALLSCFUN1(NF_INT, nc_set_log_level, NF_SET_LOG_LEVEL, nf_set_log_level,
+	    FINT2CINT)
+#endif /* LOGGING */
+
+/*
+ * Create a netCDF dataset.
+ */
+FCALLSCFUN3(NF_INT, nc_create, NF_CREATE, nf_create,
+	    STRING, FINT2CINT, PNCID)
+
+
+/*
+ * Create a netCDF dataset with I/O attributes.
+ */
+FCALLSCFUN5(NF_INT, nc__create, NF__CREATE, nf__create,
+	    STRING, FINT2CINT, FINT2CSIZET, PVOID, PNCID)
+
+
+/*
+ * Open a netCDF dataset.
+ */
+FCALLSCFUN3(NF_INT, nc_open, NF_OPEN, nf_open,
+	    STRING, FINT2CINT, PNCID)
+
+
+/*
+ * Open a netCDF dataset with I/O attributes.
+ */
+FCALLSCFUN4(NF_INT, nc__open, NF__OPEN, nf__open,
+	    STRING, FINT2CINT, PVOID, PNCID)
+
+
+/*
+ * Set the fill mode of a netCDF dataset.
+ */
+FCALLSCFUN3(NF_INT, nc_set_fill, NF_SET_FILL, nf_set_fill,
+	    NCID, FINT2CINT, PCINT2FINT)
+
+
+/*
+ * Set the fill mode of a netCDF dataset.
+ */
+FCALLSCFUN2(NF_INT, nc_set_default_format, NF_SET_DEFAULT_FORMAT, 
+	    nf_set_default_format, FINT2CINT, PCINT2FINT)
+
+
+/*
+ * Put a netCDF dataset into redefine mode.
+ */
+FCALLSCFUN1(NF_INT, nc_redef, NF_REDEF, nf_redef,
+	    NCID)
+
+
+/*
+ * End definition mode for a netCDF dataset.
+ */
+FCALLSCFUN1(NF_INT, nc_enddef, NF_ENDDEF, nf_enddef,
+	    NCID)
+
+
+/*
+ * End definition mode for a netCDF dataset with I/O attributes.
+ */
+FCALLSCFUN5(NF_INT, nc__enddef, NF__ENDDEF, nf__enddef,
+	    NCID, FINT2CSIZET, FINT2CSIZET, FINT2CSIZET, FINT2CSIZET)
+
+
+/*
+ * Synchronize the external representation of a netCDF dataset with its
+ * internal one.
+ */
+FCALLSCFUN1(NF_INT, nc_sync, NF_SYNC, nf_sync,
+	    NCID)
+
+
+/*
+ * Abort changes to a netCDF dataset.
+ */
+FCALLSCFUN1(NF_INT, nc_abort, NF_ABORT, nf_abort,
+	    NCID)
+
+
+/*
+ * Close a netCDF dataset.
+ */
+FCALLSCFUN1(NF_INT, nc_close, NF_CLOSE, nf_close,
+	    NCID)
+
+
+/*
+ * Delete a netCDF dataset by name.
+ */
+/*EXTERNL int nc_delete(const char * path);*/ /* defined in ../libsrc/nc.c */
+FCALLSCFUN1(NF_INT, nc_delete, NF_DELETE, nf_delete,
+	    STRING)
+
+/*
+ * Create a netCDF dataset with I/O attributes and specific base pe.
+ */
+FCALLSCFUN6(NF_INT, nc__create_mp, NF__CREATE_MP, nf__create_mp,
+	    STRING, FINT2CINT, FINT2CSIZET, FINT2CINT, PVOID, PNCID)
+
+/*
+ * Open a netCDF dataset with I/O attributes and specific base pe.
+ */
+FCALLSCFUN5(NF_INT, nc__open_mp, NF__OPEN_MP, nf__open_mp,
+	    STRING, FINT2CINT, FINT2CINT, PVOID, PNCID)
+
+/*
+ * Delete a netCDF dataset by name using a specific base pe.
+ */
+FCALLSCFUN2(NF_INT, nc_delete_mp, NF_DELETE_MP, nf_delete_mp,
+	    STRING, FINT2CINT)
+
+/*
+ * Set netCDF of base PE
+ */
+FCALLSCFUN2(NF_INT, nc_set_base_pe, NF_SET_BASE_PE, nf_set_base_pe,
+	    NCID, FINT2CINT)
+
+/*
+ * Inquire netCDF of base PE
+ */
+FCALLSCFUN2(NF_INT, nc_inq_base_pe, NF_INQ_BASE_PE, nf_inq_base_pe,
+	    NCID, PCINT2FINT)
+
+/*
+ * Inquire netCDF current path
+ */
+
+FCALLSCFUN3(NF_INT, nc_inq_path, NF_INQ_PATH, nf_inq_path,
+            NCID, PSIZET, PSTRING)
diff --git a/libsrc/fort-dim.c b/libsrc/fort-dim.c
new file mode 100644
index 0000000..9bcb8fb
--- /dev/null
+++ b/libsrc/fort-dim.c
@@ -0,0 +1,56 @@
+/*
+This file is part of the netCDF Fortran 77 API.
+
+This file handles the netCDF dimension functions.
+
+Copyright 2006, University Corporation for Atmospheric Research. See
+the COPYRIGHT file for copying and redistribution conditions.
+
+$Id: fort-dim.c,v 1.3 2006/08/16 03:56:51 ed Exp $
+*/
+
+#include <config.h>
+#include "netcdf.h"
+#include "ncfortran.h"
+
+
+/*
+ * Define a netCDF dimension.
+ */
+FCALLSCFUN4(NF_INT, nc_def_dim, NF_DEF_DIM, nf_def_dim,
+	    NCID, STRING, COUNT, PDIMID)
+
+
+/*
+ * Obtain a netCDF dimension's index.
+ */
+FCALLSCFUN3(NF_INT, nc_inq_dimid, NF_INQ_DIMID, nf_inq_dimid,
+	    NCID, STRING, PDIMID)
+
+
+/*
+ * Inquire about a netCDF dimension.
+ */
+FCALLSCFUN4(NF_INT, nc_inq_dim, NF_INQ_DIM, nf_inq_dim,
+	    NCID, DIMID, PSTRING, PCOUNT)
+
+
+/*
+ * Obtain a netCDF dimension's name.
+ */
+FCALLSCFUN3(NF_INT, nc_inq_dimname, NF_INQ_DIMNAME, nf_inq_dimname,
+	    NCID, DIMID, PSTRING)
+
+
+/*
+ * Obtain a netCDF dimension's length.
+ */
+FCALLSCFUN3(NF_INT, nc_inq_dimlen, NF_INQ_DIMLEN, nf_inq_dimlen,
+	    NCID, DIMID, PCOUNT)
+
+
+/*
+ * Rename a netCDF dimension.
+ */
+FCALLSCFUN3(NF_INT, nc_rename_dim, NF_RENAME_DIM, nf_rename_dim,
+	    NCID, DIMID, STRING)
diff --git a/libsrc/fort-genatt.c b/libsrc/fort-genatt.c
new file mode 100644
index 0000000..9f437a0
--- /dev/null
+++ b/libsrc/fort-genatt.c
@@ -0,0 +1,70 @@
+/*
+This file is part of the netCDF Fortran 77 API.
+
+This file handles the netCDF attribute functions.
+
+Copyright 2006, University Corporation for Atmospheric Research. See
+the COPYRIGHT file for copying and redistribution conditions.
+
+$Id: fort-genatt.c,v 1.4 2006/08/16 03:56:51 ed Exp $
+*/
+
+#include <config.h>
+#include "netcdf.h"
+#include "ncfortran.h"
+
+
+/*
+ * Inquire about a netCDF attribute.
+ */
+FCALLSCFUN5(NF_INT, nc_inq_att, NF_INQ_ATT, nf_inq_att,
+	    NCID, VARID, STRING, PTYPE, PCOUNT)
+
+
+/*
+ * Obtain the index of a netCDF attribute.
+ */
+FCALLSCFUN4(NF_INT, nc_inq_attid, NF_INQ_ATTID, nf_inq_attid,
+	    NCID, VARID, STRING, PATTID)
+
+
+/*
+ * Obtain the type of a netCDF attribute.
+ */
+FCALLSCFUN4(NF_INT, nc_inq_atttype, NF_INQ_ATTTYPE, nf_inq_atttype,
+	    NCID, VARID, STRING, PTYPE)
+
+
+/*
+ * Obtain the length of a netCDF attribute.
+ */
+FCALLSCFUN4(NF_INT, nc_inq_attlen, NF_INQ_ATTLEN, nf_inq_attlen,
+	    NCID, VARID, STRING, PCOUNT)
+
+
+/*
+ * Obtain the name of a netCDF attribute.
+ */
+FCALLSCFUN4(NF_INT, nc_inq_attname, NF_INQ_ATTNAME, nf_inq_attname,
+	    NCID, VARID, ATTID, PSTRING)
+
+
+/*
+ * Copy an attribute from one netCDF dataset to another.
+ */
+FCALLSCFUN5(NF_INT, nc_copy_att, NF_COPY_ATT, nf_copy_att,
+	    NCID1, VARID1, STRING, NCID2, VARID2)
+
+
+/*
+ * Rename a netCDF attribute.
+ */
+FCALLSCFUN4(NF_INT, nc_rename_att, NF_RENAME_ATT, nf_rename_att,
+	    NCID, VARID, STRING, STRING)
+
+
+/*
+ * Remove a netCDF attribute.
+ */
+FCALLSCFUN3(NF_INT, nc_del_att, NF_DEL_ATT, nf_del_att,
+	    NCID, VARID, STRING)
diff --git a/libsrc/fort-geninq.c b/libsrc/fort-geninq.c
new file mode 100644
index 0000000..27ca9fc
--- /dev/null
+++ b/libsrc/fort-geninq.c
@@ -0,0 +1,55 @@
+/*
+This file is part of the netCDF Fortran 77 API.
+
+This file handles the netCDF inquiry functions.
+
+Copyright 2006, University Corporation for Atmospheric Research. See
+the COPYRIGHT file for copying and redistribution conditions.
+
+$Id: fort-geninq.c,v 1.4 2006/08/16 03:56:54 ed Exp $
+*/
+
+#include <config.h>
+#include "netcdf.h"
+#include "ncfortran.h"
+
+
+/*
+ * Generally inquire about a netCDF dataset.
+ */
+FCALLSCFUN5(NF_INT, nc_inq, NF_INQ, nf_inq,
+	    NCID, PNDIMS, PNVARS, PNATTS, PDIMID)
+
+
+/*
+ * Inquire about the number of dimensions in a netCDF dataset.
+ */
+FCALLSCFUN2(NF_INT, nc_inq_ndims, NF_INQ_NDIMS, nf_inq_ndims,
+	    NCID, PNDIMS)
+
+
+/*
+ * Inquire about the number of variables in a netCDF dataset.
+ */
+FCALLSCFUN2(NF_INT, nc_inq_nvars, NF_INQ_NVARS, nf_inq_nvars,
+	    NCID, PNVARS)
+
+
+/*
+ * Inquire about the number of attributes in a netCDF dataset.
+ */
+FCALLSCFUN2(NF_INT, nc_inq_natts, NF_INQ_NATTS, nf_inq_natts,
+	    NCID, PNATTS)
+
+
+/*
+ * Inquire about the index of the unlimited dimension in a netCDF dataset.
+ */
+FCALLSCFUN2(NF_INT, nc_inq_unlimdim, NF_INQ_UNLIMDIM, nf_inq_unlimdim,
+	    NCID, PDIMID)
+
+/*
+ * Inquire about the format version of a netCDF dataset.
+ */
+FCALLSCFUN2(NF_INT, nc_inq_format, NF_INQ_FORMAT, nf_inq_format,
+	    NCID, PFORMAT)
diff --git a/libsrc/fort-genvar.c b/libsrc/fort-genvar.c
new file mode 100644
index 0000000..ed12495
--- /dev/null
+++ b/libsrc/fort-genvar.c
@@ -0,0 +1,84 @@
+/*
+This file is part of the netCDF Fortran 77 API.
+
+This file handles the netCDF variable functions.
+
+Copyright 2006, University Corporation for Atmospheric Research. See
+the COPYRIGHT file for copying and redistribution conditions.
+
+$Id: fort-genvar.c,v 1.4 2008/02/19 21:47:05 ed Exp $
+*/
+
+#include <config.h>
+#include "netcdf.h"
+#include "ncfortran.h"
+#include "fort-lib.h"
+
+/*
+ * Define a netCDF variable.
+ */
+FCALLSCFUN6(NF_INT, nc_def_var, NF_DEF_VAR, nf_def_var,
+	    NCID, STRING, TYPE, NDIMS, DIMIDS, PVARID)
+
+
+/*
+ * Inquire about a netCDF variable.
+ */
+FCALLSCFUN7(NF_INT, nc_inq_var, NF_INQ_VAR, nf_inq_var,
+	    NCID, VARID, PSTRING, PTYPE, PNDIMS, PDIMIDS, PNATTS)
+
+
+/*
+ * Obtain the ID of a netCDF variable.
+ */
+FCALLSCFUN3(NF_INT, nc_inq_varid, NF_INQ_VARID, nf_inq_varid,
+	    NCID, STRING, PVARID)
+
+
+/*
+ * Obtain the name of a netCDF variable.
+ */
+FCALLSCFUN3(NF_INT, nc_inq_varname, NF_INQ_VARNAME, nf_inq_varname,
+	    NCID, VARID, PSTRING)
+
+
+/*
+ * Obtain the type of a netCDF variable.
+ */
+FCALLSCFUN3(NF_INT, nc_inq_vartype, NF_INQ_VARTYPE, nf_inq_vartype,
+	    NCID, VARID, PTYPE)
+
+
+/*
+ * Obtain the number of dimensions of a netCDF variable.
+ */
+FCALLSCFUN3(NF_INT, nc_inq_varndims, NF_INQ_VARNDIMS, nf_inq_varndims,
+	    NCID, VARID, PNDIMS)
+
+
+/*
+ * Obtain the shape of a netCDF variable.
+ */
+FCALLSCFUN3(NF_INT, nc_inq_vardimid, NF_INQ_VARDIMID, nf_inq_vardimid,
+	    NCID, VARID, PDIMIDS)
+
+
+/*
+ * Obtain the number of attributes of a netCDF variable.
+ */
+FCALLSCFUN3(NF_INT, nc_inq_varnatts, NF_INQ_VARNATTS, nf_inq_varnatts,
+	    NCID, VARID, PNATTS)
+
+
+/*
+ * Rename a netCDF variable.
+ */
+FCALLSCFUN3(NF_INT, nc_rename_var, NF_RENAME_VAR, nf_rename_var,
+	    NCID, VARID, STRING)
+
+
+/*
+ * Copy a netCDF variable.
+ */
+FCALLSCFUN3(NF_INT, nc_copy_var, NF_COPY_VAR, nf_copy_var,
+	    NCID1, VARID, NCID2)
diff --git a/libsrc/fort-lib.c b/libsrc/fort-lib.c
new file mode 100644
index 0000000..ae93d20
--- /dev/null
+++ b/libsrc/fort-lib.c
@@ -0,0 +1,276 @@
+/*
+This file is part of the netCDF Fortran 77 API.
+
+This file handles the the conversion of vecors from fortran to C.
+
+Copyright 2006, University Corporation for Atmospheric Research. See
+the COPYRIGHT file for copying and redistribution conditions.
+*/
+
+#include <config.h>
+#include <stddef.h>	/* for NULL */
+#include <errno.h>
+
+#include "netcdf.h"
+#include "ncfortran.h"
+#include "fort-lib.h"
+
+/*
+ * Convert a C dimension-ID vector into a FORTRAN dimension-ID vector.
+ */
+EXTERNL NF_INTEGER *
+c2f_dimids(int ncid, int varid, const int* cdimids, NF_INTEGER* fdimids)
+{
+    int	i;
+    int	ndims;
+
+    if (nc_inq_varndims(ncid, varid, &ndims) != 0)
+	return NULL;
+
+    for (i = 0; i < ndims; ++i)
+	fdimids[ndims - 1 - i] = cdimids[i] + 1;
+
+    return fdimids;
+}
+
+/*
+ * Convert a FORTRAN dimension-ID vector into a C dimension-ID vector.
+ */
+EXTERNL int *
+f2c_dimids(int ndims, const NF_INTEGER* fdimids, int* cdimids)
+{
+    int	i;
+
+    for (i = 0; i < ndims; ++i)
+	cdimids[i] = fdimids[ndims - 1 - i] - 1;
+
+    return cdimids;
+}
+
+/* Convert a C dimension-ID vector into a FORTRAN dimension-ID vector. */
+EXTERNL NF_INTEGER *
+c2f_chunksizes(int ncid, int varid, const int *cchunksizes, NF_INTEGER *fchunksizes)
+{
+    int	i;
+    int	ndims;
+
+    if (nc_inq_varndims(ncid, varid, &ndims))
+	return NULL;
+
+    for (i = 0; i < ndims; ++i)
+	fchunksizes[ndims - 1 - i] = cchunksizes[i];
+
+    return fchunksizes;
+}
+
+/* Convert a FORTRAN dimension-ID vector into a C dimension-ID vector. */
+EXTERNL int *
+f2c_chunksizes(int ncid, int varid, const NF_INTEGER *fchunksizes, int *cchunksizes)
+{
+    int	i;
+    int	ndims;
+
+    if (nc_inq_varndims(ncid, varid, &ndims))
+	return NULL;
+
+    for (i = 0; i < ndims; ++i)
+	cchunksizes[i] = fchunksizes[ndims - 1 - i];
+
+    return cchunksizes;
+}
+
+/*
+ * Convert FORTRAN co-ordinates into C co-ordinates.
+ */
+EXTERNL size_t *
+f2c_coords(int ncid, int varid, const NF_INTEGER* fcoords,
+	   size_t *ccoords)
+{
+    int	i;
+    int	ndims;
+
+    if (nc_inq_varndims(ncid, varid, &ndims) != 0)
+	return NULL;
+
+    for (i = 0; i < ndims; ++i)
+	ccoords[i] = fcoords[ndims - 1 - i] - 1;
+
+    return ccoords;
+}
+
+
+/*
+ * Convert FORTRAN counts into C counts.
+ */
+EXTERNL size_t *
+f2c_counts(int ncid, int varid, const NF_INTEGER* fcounts,
+    size_t* ccounts)
+{
+    int	i;
+    int	ndims;
+
+    if (nc_inq_varndims(ncid, varid, &ndims) != 0)
+	return NULL;
+
+    for (i = 0; i < ndims; ++i)
+	ccounts[i] = fcounts[ndims - 1 - i];
+
+    return ccounts;
+}
+
+
+/*
+ * Convert FORTRAN strides into C strides.
+ *
+ * Helper function.
+ */
+EXTERNL ptrdiff_t *
+f2c_strides(int ncid, int varid, const NF_INTEGER* fstrides,
+    ptrdiff_t* cstrides)
+{
+    int	i;
+    int	ndims;
+
+    if (nc_inq_varndims(ncid, varid, &ndims) != 0)
+	return NULL;
+
+    for (i = 0; i < ndims; ++i)
+	cstrides[i] = fstrides[ndims - 1 - i];
+
+    return cstrides;
+}
+
+
+/*
+ * Convert a FORTRAN mapping vector into a C mapping vector.
+ */
+EXTERNL ptrdiff_t *
+f2c_maps(int ncid, int varid, const NF_INTEGER* fmaps, ptrdiff_t* cmaps)
+{
+    return f2c_strides(ncid, varid, fmaps, cmaps);
+}
+
+#ifdef USE_NETCDF4
+/* These appear to only be defined in netcdf-4*/
+
+/* Get the varids for a fortran function (i.e. add 1 to each
+ * varid.) */
+EXTERNL int
+nc_inq_varids_f(int ncid, int *nvars, int *fvarids)
+{
+   int *varids, nvars1;
+   int i, ret = NC_NOERR;
+
+   /* Get the information from the C library. */
+   if ((ret = nc_inq_varids(ncid, &nvars1, NULL)))
+      return ret;
+   if (!(varids = malloc(nvars1 * sizeof(int))))
+      return NC_ENOMEM;
+   if ((ret = nc_inq_varids(ncid, NULL, varids)))
+      goto exit;
+
+   /* Add one to each, for fortran. */
+   for (i = 0; i < nvars1; i++)
+      fvarids[i] = varids[i] + 1;
+
+   /* Tell the user how many there are. */
+   if (nvars)
+      *nvars = nvars1;
+
+  exit:
+   free(varids);
+   return ret;
+}
+
+/* Get the dimids for a fortran function (i.e. add 1 to each
+ * dimid.) */
+EXTERNL int
+nc_inq_dimids_f(int ncid, int *ndims, int *fdimids, int parent)
+{
+   int *dimids, ndims1;
+   int i, ret = NC_NOERR;
+
+   /* Get the information from the C library. */
+   if ((ret = nc_inq_dimids(ncid, &ndims1, NULL, parent)))
+      return ret;
+   if (!(dimids = malloc(ndims1 * sizeof(int))))
+      return NC_ENOMEM;
+   if ((ret = nc_inq_dimids(ncid, NULL, dimids, parent)))
+      goto exit;
+
+   /* Add one to each, for fortran. */
+   for (i = 0; i < ndims1; i++)
+      fdimids[i] = dimids[i] + 1;
+
+   /* Tell the user how many there are. */
+   if (ndims)
+      *ndims = ndims1;
+
+  exit:
+   free(dimids);
+   return ret;
+}
+
+/* Swap the dim sizes for fortran. */
+EXTERNL int
+nc_insert_array_compound_f(int ncid, int typeid, char *name, 
+			 size_t offset, nc_type field_typeid,
+			 int ndims, int *dim_sizesp)
+{
+   int *dim_sizes_f;
+   int i, ret;
+
+   if (ndims <= 0)
+      return NC_EINVAL;
+
+   /* Allocate some storage to hold ids. */
+   if (!(dim_sizes_f = malloc(ndims * sizeof(int))))
+      return NC_ENOMEM;
+
+   /* Create a backwards list of dimension sizes. */
+   for (i = 0; i < ndims; i++)
+      dim_sizes_f[i] = dim_sizesp[ndims - i - 1];
+
+   /* Call with backwards list. */
+   ret = nc_insert_array_compound(ncid, typeid, name, offset, field_typeid, 
+				  ndims, dim_sizes_f);
+
+   /* Clean up. */
+   free(dim_sizes_f);
+   return ret;
+}
+
+EXTERNL int
+nc_inq_compound_field_f(int ncid, nc_type xtype, int fieldid, char *name, 
+			size_t *offsetp, nc_type *field_typeidp, int *ndimsp, 
+			int *dim_sizesp)
+{
+   int ndims;
+   int ret;
+
+   /* Find out how many dims. */
+   if ((ret = nc_inq_compound_field(ncid, xtype, fieldid, NULL, NULL, 
+				    NULL, &ndims, NULL)))
+      return ret;
+
+   /* Call the function. */
+   if ((ret = nc_inq_compound_field(ncid, xtype, fieldid, name, offsetp, 
+				    field_typeidp, ndimsp, dim_sizesp)))
+      return ret;
+
+   /* Swap the order of the dimsizes. */
+   if (ndims)
+   {
+      int *f, *b, temp;
+      for (f = dim_sizesp, b = &dim_sizesp[ndims - 1]; f < b; f++, b--)
+      {
+	 temp = *f;
+	 *f = *b;
+	 *b = temp;
+      }
+   }  
+
+   return NC_NOERR;
+}
+
+#endif /*USE_NETCDF4*/
diff --git a/libsrc/fort-lib.h b/libsrc/fort-lib.h
new file mode 100644
index 0000000..f22411d
--- /dev/null
+++ b/libsrc/fort-lib.h
@@ -0,0 +1,109 @@
+/* This is part of the netCDF package.
+   Copyright 2011 University Corporation for Atmospheric Research/Unidata
+   See COPYRIGHT file for conditions of use.
+
+   Includes prototypes for some functions used to translate parameters
+   between C and Fortran.
+  */
+
+#ifndef UD_FORT_LIB_H
+#define UD_FORT_LIB_H
+
+#include <stddef.h>	/* for ptrdiff_t, size_t */
+#include "ncfortran.h"
+#include <netcdf_f.h>
+
+/*
+ * PURPOSE: Convert a C dimension-ID vector into a FORTRAN dimension-ID
+ *	    vector
+ * REQUIRE: <ncid> is valid && <varid> is valid && <cdimids> != NULL &&
+ *	    <fdimids> != NULL && <cdimids> != <fdimids>
+ * PROMISE: The order of the dimensions will be reversed and 1 will be
+ *	    added to each element.  RESULT == <fdimids>
+ */
+EXTERNL NF_INTEGER *
+c2f_dimids(int		ncid,		/* netCDF dataset ID */
+	   int		varid,		/* netCDF variable ID */
+	   const int *cdimids,	/* C dim IDs */
+	   NF_INTEGER *fdimids);	/* FORTRAN dim IDs */
+
+/*
+ * PURPOSE: Convert a FORTRAN dimension-ID vector into a C dimension-ID
+ *	    vector
+ * REQUIRE: <ndims> == 0 || (<ndims> >= 0 && <fdimids> != NULL &&
+ *	    <cdimids> != NULL && <fdimids> != <cdimids>)
+ * PROMISE: The order of the dimensions will be reversed and 1 will be
+ *	    subtracted from each element.  RESULT == <cdimids>
+ */
+EXTERNL  int *
+f2c_dimids(int ndims, 		/* number of dims  */
+	   const NF_INTEGER *fdimids,	/* FORTRAN dim IDs */
+	   int *cdimids);	/* C dim IDs */
+
+/* These two are the same as the dimids, but for chunksizes, so that 1
+ * is not added/subtracted. */
+EXTERNL  NF_INTEGER * 
+c2f_chunksizes(int ncid, int varid, const int* cchunksizes, 
+	       NF_INTEGER *fchunksizes);
+
+EXTERNL int * 
+f2c_chunksizes(int ncid, int varid, const NF_INTEGER *fchunksizes, 
+	       int *cchunksizes);
+
+/*
+ * PURPOSE: Convert a FORTRAN co-ordinate vector into a C co-ordinate vector
+ * REQUIRE: <ncid> refers to an open dataset && <varid> refers to an
+ *	    existing variable && <fcoords> != NULL && <ccoords> != NULL &&
+ *	    <fcoords> != <ccoords>
+ * PROMISE: The order of the co-ordinates will be reversed and 1 will be
+ *	    subtracted from each element.  RESULT == <ccoords>.
+ */
+EXTERNL size_t *
+f2c_coords(int ncid,		/* dataset ID */
+	   int varid,		/* variable ID */
+	   const NF_INTEGER *fcoords,	/* FORTRAN coords */
+	   size_t *ccoords);	/* C coords */
+
+/*
+ * PURPOSE: Convert a FORTRAN edge-count vector into a C edge-count vector
+ * REQUIRE: <ncid> refers to an open dataset && <varid> refers to an
+ *	    existing variable && <fcounts> != NULL && <ccounts> != NULL &&
+ *	    <fcounts> != <ccounts> && <fcounts> != <ccounts>
+ * PROMISE: The order of the edge-counts will be reversed.  
+ *	    RESULT == <ccounts>.
+ */
+EXTERNL size_t *
+f2c_counts(int		ncid,		/* dataset ID */
+	   int		varid,		/* variable ID */
+	   const NF_INTEGER*	fcounts,	/* FORTRAN counts */
+	   size_t*	ccounts);	/* C counts */
+
+/*
+ * PURPOSE: Convert a FORTRAN stride vector into a C stride vector
+ * REQUIRE: <ncid> refers to an open dataset && <varid> refers to an
+ *	    existing variable && <fstrides> != NULL && <cstrides> != NULL &&
+ *	    <fstrides> != <cstrides>
+ * PROMISE: The order of the strides will be reversed.  RESULT == <cstrides>.
+ */
+EXTERNL ptrdiff_t *
+f2c_strides(int		ncid,		/* dataset ID */
+	    int		varid,		/* variable ID */
+	    const NF_INTEGER *fstrides,	/* FORTRAN strides */
+	    ptrdiff_t *cstrides);	/* C strides */
+
+/*
+ * PURPOSE: Convert a FORTRAN mapping vector into a C mapping vector
+ * REQUIRE: <ncid> refers to an open dataset && <varid> refers to an
+ *	    existing variable && <fmaps> != NULL && <cmaps> != NULL &&
+ *	    <fmaps> != <cmaps>
+ * PROMISE: The order of the mapping vector will be reversed.
+ *	    RESULT == <cmaps>.
+ */
+EXTERNL ptrdiff_t *
+f2c_maps(int		ncid,		/* dataset ID */
+	 int		varid,		/* variable ID */
+	 const NF_INTEGER *fmaps,		/* FORTRAN mapping */
+	 ptrdiff_t *cmaps);		/* C mapping */
+
+
+#endif	/* header-file lockout */
diff --git a/libsrc/fort-misc.c b/libsrc/fort-misc.c
new file mode 100644
index 0000000..494b572
--- /dev/null
+++ b/libsrc/fort-misc.c
@@ -0,0 +1,53 @@
+/*
+This file is part of the netCDF Fortran 77 API.
+
+This file handles the netCDF strerror and libvers functions.
+
+Copyright 2006, University Corporation for Atmospheric Research. See
+the COPYRIGHT file for copying and redistribution conditions.
+
+$Id: fort-misc.c,v 1.8 2007/07/26 20:29:45 ed Exp $
+*/
+
+#include <config.h>
+#include "netcdf.h"
+#include "ncfortran.h"
+
+
+/*
+ * Return a string that identifies the version of the netCDF library.
+ */
+FCALLSCFUN0(STRING, (char*)nc_inq_libvers, NF_INQ_LIBVERS, nf_inq_libvers)
+
+
+/*
+ * Return the string associated with an error code.
+ */
+#ifdef ABSOFT10_HACK
+extern void NF_STRERROR(char *AS, unsigned D0, const int *A1) 
+{ 
+   char *A0;
+   A0= (char*)nc_strerror( (int)*A1 );
+   memcpy(AS,A0, (D0<(A0==((void *)0)?0:strlen(A0))?D0:(A0==((void *)0)?0:strlen(A0))) );
+   D0>(A0==((void *)0)?0:strlen(A0))?memset(AS+(A0==((void *)0)?0:strlen(A0)), ' ', D0-(A0==((void *)0)?0:strlen(A0))):0;
+   return ;
+}
+#else
+FCALLSCFUN1(STRING, (char*)nc_strerror, NF_STRERROR, nf_strerror, 
+	    FINT2CINT)
+#endif
+
+
+static int
+nc_issyserr(int errcode)
+{
+    return errcode > 0;
+}
+
+
+/*
+ * Indicate whether or not an error-code refers to a system error
+ * rather than a netCDF error
+ */
+FCALLSCFUN1(LOGICAL, nc_issyserr, NF_ISSYSERR, nf_issyserr,
+	    FINT2CINT)
diff --git a/libsrc/fort-nc4.c b/libsrc/fort-nc4.c
new file mode 100644
index 0000000..2d174d3
--- /dev/null
+++ b/libsrc/fort-nc4.c
@@ -0,0 +1,241 @@
+/*
+This file is part of netcdf-4, a netCDF-like interface for HDF5, or a
+HDF5 backend for netCDF, depending on your point of view.
+
+This file provides the fortran functions for the new functions added
+to the API as part of netCDF-4. This file is only compiled for
+netCDF-4 builds.
+
+Copyright 2005, University Corporation for Atmospheric Research. See
+COPYRIGHT file for copying and redistribution conditions.
+
+$Id: fort-nc4.c,v 1.55 2010/01/19 18:31:43 ed Exp $
+*/
+
+#include <config.h>
+#include "netcdf_f.h"
+#include <ncfortran.h>
+#include <fort-lib.h>
+
+
+FCALLSCFUN5(NF_INT, nc_create_par_fortran, NF_CREATE_PAR, nf_create_par,
+	    STRING, FINT2CINT, FINT2CINT, FINT2CINT, PCINT2FINT)
+
+FCALLSCFUN5(NF_INT, nc_open_par_fortran, NF_OPEN_PAR, nf_open_par,
+	    STRING, FINT2CINT, FINT2CINT, FINT2CINT, PCINT2FINT)
+
+FCALLSCFUN3(NF_INT, nc_var_par_access, NF_VAR_PAR_ACCESS, nf_var_par_access,
+	    NCID, VARID, FINT2CINT)
+
+FCALLSCFUN3(NF_INT, nc_inq_ncid, NF_INQ_NCID, nf_inq_ncid,
+	    NCID, STRING, PCINT2FINT)
+
+FCALLSCFUN3(NF_INT, nc_inq_grps, NF_INQ_GRPS, nf_inq_grps,
+	    NCID, PCINT2FINT, INTV)
+
+FCALLSCFUN2(NF_INT, nc_inq_grpname, NF_INQ_GRPNAME, nf_inq_grpname,
+	    NCID, PSTRING)
+
+FCALLSCFUN3(NF_INT, nc_inq_grpname_full, NF_INQ_GRPNAME_FULL, nf_inq_grpname_full,
+	    NCID, PSIZET, PSTRING)
+
+FCALLSCFUN2(NF_INT, nc_inq_grpname_len, NF_INQ_GRPNAME_LEN, nf_inq_grpname_len,
+	    NCID, PSIZET)
+
+FCALLSCFUN2(NF_INT, nc_inq_grp_parent, NF_INQ_GRP_PARENT, nf_inq_grp_parent,
+	    NCID, PCINT2FINT)
+
+FCALLSCFUN3(NF_INT, nc_inq_grp_ncid, NF_INQ_GRP_NCID, nf_inq_grp_ncid,
+	    NCID, STRING, PCINT2FINT)
+
+FCALLSCFUN3(NF_INT, nc_inq_grp_full_ncid, NF_INQ_GRP_FULL_NCID, nf_inq_grp_full_ncid,
+	    NCID, STRING, PCINT2FINT)
+
+FCALLSCFUN3(NF_INT, nc_inq_varids_f, NF_INQ_VARIDS, nf_inq_varids,
+	    NCID, PCINT2FINT, INTV)
+
+FCALLSCFUN4(NF_INT, nc_inq_dimids_f, NF_INQ_DIMIDS, nf_inq_dimids,
+	    NCID, PCINT2FINT, INTV, FINT2CINT)
+
+FCALLSCFUN3(NF_INT, nc_inq_typeids, NF_INQ_TYPEIDS, nf_inq_typeids,
+	    NCID, PCINT2FINT, INTV)
+
+FCALLSCFUN3(NF_INT, nc_inq_typeid, NF_INQ_TYPEID, nf_inq_typeid,
+	    NCID, STRING, PCINT2FINT)
+
+FCALLSCFUN3(NF_INT, nc_def_grp, NF_DEF_GRP, nf_def_grp,
+	    NCID, STRING, PCINT2FINT)
+
+FCALLSCFUN2(NF_INT, nc_rename_grp, NF_RENAME_GRP, nf_rename_grp,
+            NCID, STRING)
+
+FCALLSCFUN4(NF_INT, nc_def_compound, NF_DEF_COMPOUND, nf_def_compound,
+	    NCID, FINT2CSIZET, STRING, PCINT2FINT)
+
+FCALLSCFUN5(NF_INT, nc_insert_compound, NF_INSERT_COMPOUND, nf_insert_compound,
+	    NCID, FINT2CINT, STRING, FINT2CSIZET, FINT2CINT)
+
+FCALLSCFUN7(NF_INT, nc_insert_array_compound_f, NF_INSERT_ARRAY_COMPOUND, 
+	    nf_insert_array_compound,
+	    NCID, FINT2CINT, STRING, FINT2CSIZET, 
+	    FINT2CINT, FINT2CINT, INTV)
+
+FCALLSCFUN4(NF_INT, nc_inq_type, NF_INQ_TYPE, nf_inq_type,
+	    NCID, FINT2CINT, PSTRING, PSIZET)
+
+FCALLSCFUN5(NF_INT, nc_inq_compound, NF_INQ_COMPOUND, nf_inq_compound,
+	    NCID, FINT2CINT, STRING, PSIZET, PSIZET)
+
+FCALLSCFUN3(NF_INT, nc_inq_compound_name, NF_INQ_COMPOUND_NAME, nf_inq_compound_name,
+	    NCID, FINT2CINT, STRING)
+
+FCALLSCFUN3(NF_INT, nc_inq_compound_size, NF_INQ_COMPOUND_SIZE, nf_inq_compound_size,
+	    NCID, FINT2CINT, PSIZET)
+
+FCALLSCFUN3(NF_INT, nc_inq_compound_nfields, NF_INQ_COMPOUND_NFIELDS, 
+	    nf_inq_compound_nfields,
+	    NCID, FINT2CINT, PSIZET)
+
+FCALLSCFUN8(NF_INT, nc_inq_compound_field_f, NF_INQ_COMPOUND_FIELD, 
+	    nf_inq_compound_field,
+	    NCID, FINT2CINT, VARID, PSTRING, PSIZET, PCINT2FINT, 
+	    PCINT2FINT, INTV)
+
+FCALLSCFUN4(NF_INT, nc_inq_compound_fieldname, NF_INQ_COMPOUND_FIELDNAME, 
+	    nf_inq_compound_fieldname,
+	    NCID, FINT2CINT, FIELDIDX, PSTRING)
+
+FCALLSCFUN4(NF_INT, nc_inq_compound_fieldindex, NF_INQ_COMPOUND_FIELDINDEX, 
+	    nf_inq_compound_fieldindex,
+	    NCID, FINT2CINT, STRING, PCNDX2FNDX)
+
+FCALLSCFUN4(NF_INT, nc_inq_compound_fieldoffset, NF_INQ_COMPOUND_FIELDOFFSET, 
+	    nf_inq_compound_fieldoffset,
+	    NCID, FINT2CINT, FIELDIDX, PSIZET)
+
+FCALLSCFUN4(NF_INT, nc_inq_compound_fieldtype, NF_INQ_COMPOUND_FIELDTYPE, 
+	    nf_inq_compound_fieldtype,
+	    NCID, FINT2CINT, FIELDIDX, PCINT2FINT)
+
+FCALLSCFUN4(NF_INT, nc_inq_compound_fieldndims, NF_INQ_COMPOUND_FIELDNDIMS, 
+	    nf_inq_compound_fieldndims,
+	    NCID, FINT2CINT, FIELDIDX, PCINT2FINT)
+
+FCALLSCFUN4(NF_INT, nc_inq_compound_fielddim_sizes, NF_INQ_COMPOUND_FIELDDIM_SIZES, 
+	    nf_inq_compound_fielddim_sizes,
+	    NCID, FINT2CINT, FIELDIDX, PCINT2FINT)
+
+FCALLSCFUN4(NF_INT, nc_def_vlen, NF_DEF_VLEN, nf_def_vlen,
+	    NCID, STRING, FINT2CINT, PCINT2FINT)
+
+FCALLSCFUN5(NF_INT, nc_inq_vlen, NF_INQ_VLEN, nf_inq_vlen,
+	    NCID, FINT2CINT, PSTRING, PSIZET, PCINT2FINT)
+
+FCALLSCFUN7(NF_INT, nc_inq_user_type, NF_INQ_USER_TYPE, nf_inq_user_type,
+	    NCID, FINT2CINT, PSTRING, PSIZET, PCINT2FINT, PSIZET, PCINT2FINT)
+
+FCALLSCFUN4(NF_INT, nc_def_enum, NF_DEF_ENUM, nf_def_enum,
+	    NCID, FINT2CINT, STRING, PCINT2FINT)
+
+FCALLSCFUN4(NF_INT, nc_insert_enum, NF_INSERT_ENUM, nf_insert_enum,
+	    NCID, FINT2CINT, STRING, PVOID)
+
+FCALLSCFUN6(NF_INT, nc_inq_enum, NF_INQ_ENUM, nf_inq_enum,
+	    NCID, FINT2CINT, STRING, PCINT2FINT, PSIZET, PSIZET)
+
+FCALLSCFUN5(NF_INT, nc_inq_enum_member, NF_INQ_ENUM_MEMBER, nf_inq_enum_member,
+	    NCID, FINT2CINT, FNDX2CNDX, PSTRING, PVOID)
+
+FCALLSCFUN4(NF_INT, nc_inq_enum_ident, NF_INQ_ENUM_IDENT, nf_inq_enum_ident,
+	    NCID, FINT2CINT, FINT2CINT, PSTRING)
+
+FCALLSCFUN4(NF_INT, nc_def_opaque, NF_DEF_OPAQUE, nf_def_opaque,
+	    NCID, FINT2CSIZET, STRING, PCINT2FINT)
+
+FCALLSCFUN4(NF_INT, nc_inq_opaque, NF_INQ_OPAQUE, nf_inq_opaque,
+	    NCID, FINT2CSIZET, STRING, PSIZET)
+
+FCALLSCFUN4(NF_INT, nc_def_var_chunking_ints, NF_DEF_VAR_CHUNKING, nf_def_var_chunking,
+	    NCID, VARID, FINT2CINT, CHUNKSIZES)
+
+FCALLSCFUN5(NF_INT, nc_def_var_deflate, NF_DEF_VAR_DEFLATE, nf_def_var_deflate,
+	    NCID, VARID, FINT2CINT, FINT2CINT, FINT2CINT)
+
+FCALLSCFUN4(NF_INT, nc_def_var_fill, NF_DEF_VAR_FILL, nf_def_var_fill,
+	    NCID, VARID, FINT2CINT, PVOID)
+
+FCALLSCFUN4(NF_INT, nc_inq_var_fill, NF_INQ_VAR_FILL, nf_inq_var_fill,
+	    NCID, VARID, PCINT2FINT, PVOID)
+
+FCALLSCFUN3(NF_INT, nc_def_var_fletcher32, NF_DEF_VAR_FLETCHER32, nf_def_var_fletcher32,
+	    NCID, VARID, FINT2CINT)
+
+FCALLSCFUN4(NF_INT, nc_inq_var_chunking_ints, NF_INQ_VAR_CHUNKING, nf_inq_var_chunking,
+	    NCID, VARID, PCINT2FINT, PCHUNKSIZES)
+
+FCALLSCFUN5(NF_INT, nc_inq_var_deflate, NF_INQ_VAR_DEFLATE, nf_inq_var_deflate,
+	    NCID, VARID, PCINT2FINT, PCINT2FINT, PCINT2FINT)
+
+FCALLSCFUN4(NF_INT, nc_inq_var_szip, NF_INQ_VAR_SZIP, nf_inq_var_szip,
+	    NCID, VARID, PCINT2FINT, PCINT2FINT)
+
+FCALLSCFUN3(NF_INT, nc_inq_var_fletcher32, NF_INQ_VAR_FLETCHER32, nf_inq_var_fletcher32,
+	    NCID, VARID, PCINT2FINT)
+
+FCALLSCFUN3(NF_INT, nc_def_var_endian, NF_DEF_VAR_ENDIAN, nf_def_var_endian,
+	    NCID, VARID, FINT2CINT)
+
+FCALLSCFUN3(NF_INT, nc_inq_var_endian, NF_INQ_VAR_ENDIAN, nf_inq_var_endian,
+	    NCID, VARID, PCINT2FINT)
+
+FCALLSCFUN6(NF_INT, nc_put_att, NF_PUT_ATT, nf_put_att,
+	    NCID, VARID, STRING, FINT2CINT, FINT2CSIZET, PVOID)
+
+FCALLSCFUN4(NF_INT, nc_get_att, NF_GET_ATT, nf_get_att,
+	    NCID, VARID, STRING, PVOID)
+
+FCALLSCFUN5(NF_INT, nc_put_vlen_element, NF_PUT_VLEN_ELEMENT, nf_put_vlen_element,
+	    NCID, FINT2CINT, PVOID, FINT2CSIZET, PVOID)
+
+FCALLSCFUN5(NF_INT, nc_get_vlen_element, NF_GET_VLEN_ELEMENT, nf_get_vlen_element,
+	    NCID, FINT2CINT, PVOID, PSIZET, PVOID)
+
+FCALLSCFUN1(NF_INT, nc_free_vlen, NF_FREE_VLEN, nf_free_vlen, PVOID)
+FCALLSCFUN2(NF_INT, nc_free_vlens, NF_FREE_VLENS, nf_free_vlens, FINT2CSIZET, PVOID)
+FCALLSCFUN2(NF_INT, nc_free_string, NF_FREE_STRING, nf_free_string, FINT2CSIZET, PVOID)
+
+FCALLSCFUN4(NF_INT, nc_put_var1_longlong, NF_PUT_VAR1_INT64, nf_put_var1_int64,
+	    NCID, VARID, COORDS, INTVAR)
+FCALLSCFUN5(NF_INT, nc_put_vara_longlong, NF_PUT_VARA_INT64, nf_put_vara_int64,
+	    NCID, VARID, COORDS, COUNTS, INTVARV)
+FCALLSCFUN6(NF_INT, nc_put_vars_longlong, NF_PUT_VARS_INT64, nf_put_vars_int64,
+	    NCID, VARID, COORDS, COUNTS, STRIDES, INTVARV)
+FCALLSCFUN7(NF_INT, nc_put_varm_longlong, NF_PUT_VARM_INT64, nf_put_varm_int64,
+            NCID, VARID, COORDS, COUNTS, STRIDES, MAPS, PINTVARV)
+FCALLSCFUN3(NF_INT, nc_put_var_longlong, NF_PUT_VAR_INT64, nf_put_var_int64,
+	    NCID, VARID, PINTVAR)
+
+FCALLSCFUN4(NF_INT, nc_get_var1_longlong, NF_GET_VAR1_INT64, nf_get_var1_int64,
+	    NCID, VARID, COORDS, INTVAR)
+FCALLSCFUN5(NF_INT, nc_get_vara_longlong, NF_GET_VARA_INT64, nf_get_vara_int64,
+	    NCID, VARID, COORDS, COUNTS, INTVARV)
+FCALLSCFUN6(NF_INT, nc_get_vars_longlong, NF_GET_VARS_INT64, nf_get_vars_int64,
+	    NCID, VARID, COORDS, COUNTS, STRIDES, INTVARV)
+FCALLSCFUN7(NF_INT, nc_get_varm_longlong, NF_GET_VARM_INT64, nf_get_varm_int64,
+            NCID, VARID, COORDS, COUNTS, STRIDES, MAPS, PINTVARV)
+FCALLSCFUN3(NF_INT, nc_get_var_longlong, NF_GET_VAR_INT64, nf_get_var_int64,
+	    NCID, VARID, PINTVAR)
+
+FCALLSCFUN3(NF_INT, nc_set_chunk_cache_ints, NF_SET_CHUNK_CACHE, nf_set_chunk_cache,
+	    INT, INT, INT)
+FCALLSCFUN3(NF_INT, nc_get_chunk_cache_ints, NF_GET_CHUNK_CACHE, nf_get_chunk_cache,
+	    PINT, PINT, PINT)
+
+FCALLSCFUN5(NF_INT, nc_set_var_chunk_cache_ints, NF_SET_VAR_CHUNK_CACHE, nf_set_var_chunk_cache,
+	    NCID, VARID, INT, INT, INT)
+FCALLSCFUN5(NF_INT, nc_get_var_chunk_cache_ints, NF_GET_VAR_CHUNK_CACHE, nf_get_var_chunk_cache,
+	    NCID, VARID, PINT, PINT, PINT)
+
+
+
+
diff --git a/libsrc/fort-v2compat.c b/libsrc/fort-v2compat.c
new file mode 100644
index 0000000..8e8e2a2
--- /dev/null
+++ b/libsrc/fort-v2compat.c
@@ -0,0 +1,1965 @@
+/*
+ *	Copyright 1996, University Corporation for Atmospheric Research
+ *      See netcdf/COPYRIGHT file for copying and redistribution conditions.
+ */
+
+/* $Id: fort-v2compat.c,v 1.33 2009/01/27 19:48:34 ed Exp $ */
+
+/*
+ *  Source for netCDF FORTRAN jacket library.
+ */
+
+/*
+ * OVERVIEW
+ *
+ * This file contains jacket routines written in C for interfacing
+ * Fortran netCDF-2 function calls to the actual C-binding netCDF
+ * function call -- using either the netCDF-2 or netCDF-3 C API.
+ * In general, these functions handle character-string parameter
+ * conventions, convert between column-major-order arrays and
+ * row-major-order arrays, and map between array indices beginning
+ * at one and array indices beginning at zero.  They also adapt the
+ * differing error handling mechanisms between version 2 and version 3.
+ */
+
+#include <config.h>
+
+#ifndef NO_NETCDF_2
+
+/* LINTLIBRARY */
+
+#include	<config.h>
+#include	<ctype.h>
+#include        <string.h>
+#include	<stdlib.h>
+#include	<stdio.h>
+#include	"netcdf.h"
+#include	"nfconfig.inc"
+#include	"ncfortran.h"	/* netCDF FORTRAN-calling-C interface */
+#include	"fort-lib.h"
+
+
+/*
+ * Additional Fortran-calling-C interface types specific to the version 2
+ * API:
+ */
+#define NCOPTS		FINT2CINT	/* Input, netCDF options argument */
+#define PNCOPTS		PCINT2FINT	/* Output, netCDF options argument */
+#define CLOBMODE	FINT2CINT	/* Input, clobber-mode argument */
+#define PRCODE		PCINT2FINT	/* Output, return-code argument */
+#define RWMODE		FINT2CINT	/* Input, read-write mode argument */
+#define DIMLEN		FINT2CINT	/* Input, dimension-length argument */
+#define PDIMLEN		PCINT2FINT	/* Output, dimension-length argument */
+#define LENSTR		FINT2CINT	/* Input, string-length argument */
+#define ATTLEN		FINT2CINT	/* Input, attribute length argument */
+#define PATTLEN		PCINT2FINT	/* Output, attribute length argument */
+#define FILLMODE	FINT2CINT	/* Input, fill-mode argument */
+
+#define V2IMAP_cfINT(N,A,B,X,Y,Z)	DOUBLE_cfINT(N,A,B,X,Y,Z)
+#define V2IMAPVVVVVVV_cfTYPE		NF_INTEGER
+#define V2IMAP_cfSTR(N,T,A,B,C,D,E)	_(CFARGS,N)(T,V2IMAP,A,B,C,D,E)
+#define V2IMAP_cfH(S,U,B)
+#define V2IMAP_cfQ(B)			ptrdiff_t B[MAX_NC_DIMS];
+#define V2IMAP_cfT(M,I,A,B,D)		f2c_v2imap(*fncid, *fvarid-1, A, B)
+#define V2IMAP_cfR(A,B,D)
+
+
+/**
+ * Convert a Version 2 Fortran IMAP vector into a Version 3 C imap vector.
+ */
+static ptrdiff_t*
+f2c_v2imap(int ncid, int varid, const int* fimap, ptrdiff_t* cimap)
+{
+    int		rank;
+    nc_type	datatype;
+
+    if (nc_inq_vartype(ncid, varid, &datatype) ||
+	nc_inq_varndims(ncid, varid, &rank) || rank <= 0)
+    {
+	return NULL;
+    }
+
+    /* else */
+    if (fimap[0] == 0)
+    {
+	/*
+	 * Special Fortran version 2 semantics: use external netCDF variable 
+	 * structure.
+	 */
+	int		dimids[NC_MAX_VAR_DIMS];
+	int		idim;
+	size_t	total;
+
+	if (nc_inq_vardimid(ncid, varid, dimids) != NC_NOERR)
+	    return NULL;
+
+	for (total = 1, idim = rank - 1; idim >= 0; --idim)
+	{
+	    size_t	length;
+
+	    cimap[idim] = total;
+
+	    if (nc_inq_dimlen(ncid, dimids[idim], &length) != NC_NOERR)
+		return NULL;
+
+	    total *= length;
+	}
+    }
+    else
+    {
+	/*
+	 * Regular Fortran version 2 semantics: convert byte counts to
+	 * element counts.
+	 */
+	int	idim;
+	size_t	size;
+
+	switch (datatype)
+	{
+
+	    case NC_CHAR:
+		size = sizeof(char);
+		break;
+	    case NC_BYTE:
+#		if NF_INT1_IS_C_SIGNED_CHAR
+		    size = sizeof(signed char);
+#		elif NF_INT1_IS_C_SHORT
+		    size = sizeof(short);
+#		elif NF_INT1_IS_C_INT
+		    size = sizeof(int);
+#		elif NF_INT1_IS_C_LONG
+		    size = sizeof(long);
+#		endif
+		break;
+	    case NC_SHORT:
+#		if NF_INT2_IS_C_SHORT
+		    size = sizeof(short);
+#		elif NF_INT2_IS_C_INT
+		    size = sizeof(int);
+#		elif NF_INT2_IS_C_LONG
+		    size = sizeof(long);
+#		endif
+		break;
+	    case NC_INT:
+#		if NF_INT_IS_C_INT
+		    size = sizeof(int);
+#		elif NF_INT_IS_C_LONG
+		    size = sizeof(long);
+#		endif
+		break;
+	    case NC_FLOAT:
+#		if NF_REAL_IS_C_FLOAT
+		    size = sizeof(float);
+#		elif NF_REAL_IS_C_DOUBLE
+		    size = sizeof(double);
+#		endif
+		break;
+	    case NC_DOUBLE:
+#		if NF_DOUBLEPRECISION_IS_C_FLOAT
+		    size = sizeof(float);
+#		elif NF_DOUBLEPRECISION_IS_C_DOUBLE
+		    size = sizeof(double);
+#		endif
+		break;
+	    default:
+		return NULL;
+	}
+
+	for (idim = 0; idim < rank; ++idim)
+	    cimap[idim] = fimap[rank - 1 - idim] / size;
+    }
+
+    return cimap;
+}
+
+
+/*
+ * Compute the product of dimensional counts.
+ */
+static size_t
+dimprod(const size_t* count, int rank)
+{
+    int		i;
+    size_t	prod = 1;
+
+    for (i = 0; i < rank; ++i)
+	prod *= count[i];
+
+    return prod;
+}
+
+
+/*
+ * Set the C global variable ncopts.
+ */
+static void
+c_ncpopt(
+    int val     /* NC_FATAL, NC_VERBOSE, or NC_FATAL|NC_VERBOSE */
+)
+{
+    ncopts = val;
+}
+
+/* FORTRAN interface to the above. */
+FCALLSCSUB1(c_ncpopt,NCPOPT,ncpopt,
+    NCOPTS)
+
+
+/*
+ * Get the C global variable ncopts from FORTRAN.
+ */
+static void
+c_ncgopt(
+    int	*val	/* NC_FATAL, NC_VERBOSE, or NC_FATAL|NC_VERBOSE */
+)
+{
+    *val = ncopts;
+}
+
+/* FORTRAN interface to the above. */
+FCALLSCSUB1(c_ncgopt,NCGOPT,ncgopt,
+    PNCOPTS)
+
+
+/*
+ * Create a new netCDF file, returning a netCDF ID.  New netCDF
+ * file is placed in define mode.
+ */
+static int
+c_nccre(
+    const char *pathname,	/* file name of new netCDF file */
+    int clobmode,	/* either NCCLOB or NCNOCLOB */
+    int *rcode		/* returned error code */
+)
+{
+    int ncid = -1;
+
+    if (pathname == NULL)
+       *rcode = NC_EINVAL;
+    else
+    {
+       *rcode = ((ncid = nccreate (pathname, clobmode)) == -1)
+	  ? ncerr
+	  : 0;
+    }
+    
+    if (*rcode != 0)
+    {
+       nc_advise("NCCRE", *rcode, "");
+       *rcode = ncerr;
+    }
+
+    return ncid;
+}
+
+/* FORTRAN interface to the above. */
+FCALLSCFUN3(NF_INT,c_nccre,NCCRE,nccre,
+    STRING,CLOBMODE,PRCODE)
+
+
+/*
+ * Open an existing netCDF file for access.
+ */
+static int
+c_ncopn(
+    const char *pathname,	/* file name for netCDF to be opened */
+    int rwmode,			/* either NCWRITE or NCNOWRIT */
+    int *rcode			/* returned error code */
+)
+{
+    int ncid = -1;
+
+    /* Include NC_LOCK in check, in case NC_LOCK is ever implemented */
+    if (rwmode < 0 ||
+	rwmode > NC_WRITE + NC_SHARE + NC_CLASSIC_MODEL + NC_LOCK)
+    {
+        *rcode = NC_EINVAL;
+        nc_advise("NCOPN", *rcode,
+		"bad flag, did you forget to include netcdf.inc?");
+    }
+    else
+    {
+	if (pathname == NULL) {
+	    *rcode = NC_EINVAL;
+	}
+	else
+	{
+	    *rcode = ((ncid = ncopen (pathname, rwmode)) == -1)
+			? ncerr
+			: 0;
+	}
+
+	if (*rcode != 0)
+	{
+	    nc_advise("NCOPN", *rcode, "");
+	    *rcode = ncerr;
+	}
+    }
+
+    return ncid;
+}
+
+/* FORTRAN interface to the above. */
+FCALLSCFUN3(NF_INT,c_ncopn,NCOPN,ncopn,
+    STRING,RWMODE,PRCODE)
+
+
+/*
+ * Add a new dimension to an open netCDF file in define mode.
+ */
+static int
+c_ncddef (
+    int ncid,		/* netCDF ID */
+    const char *dimname,/* dimension name */
+    int dimlen,		/* size of dimension */
+    int *rcode		/* returned error code */
+)
+{
+    int dimid;
+
+    if ((dimid = ncdimdef (ncid, dimname, (long)dimlen)) == -1)
+	*rcode = ncerr;
+    else
+    {
+	dimid++;
+	*rcode = 0;
+    }
+
+    return dimid;
+}
+
+/* FORTRAN interface to the above. */
+FCALLSCFUN4(NF_INT,c_ncddef,NCDDEF,ncddef,
+    NCID,STRING,DIMLEN,PRCODE)
+
+
+/*
+ * Return the ID of a netCDF dimension, given the name of the dimension.
+ */
+static int
+c_ncdid (
+    int ncid,		/* netCDF ID */
+    const char *dimname,/* dimension name */
+    int *rcode		/* returned error code */
+)
+{
+    int dimid;
+
+    if ((dimid = ncdimid (ncid, dimname)) == -1)
+	*rcode = ncerr;
+    else
+    {
+	dimid++;
+	*rcode = 0;
+    }
+
+    return dimid;
+}
+
+/* FORTRAN interface to the above. */
+FCALLSCFUN3(NF_INT,c_ncdid,NCDID,ncdid,
+    NCID,STRING,PRCODE)
+
+
+/*
+ * Add a new variable to an open netCDF file in define mode.
+ */
+static int
+c_ncvdef (
+    int ncid,		/* netCDF ID */
+    const char *varname,/* name of variable */
+    nc_type datatype,	/* netCDF datatype of variable */
+    int ndims,		/* number of dimensions of variable */
+    int *dimids,	/* array of ndims dimensions IDs */
+    int *rcode		/* returned error code */
+)
+{
+    int	varid, status;
+
+    if ((status = nc_def_var(ncid, varname, datatype, ndims, dimids, &varid)))
+    {
+	nc_advise("NCVDEF", status, "");
+	*rcode = ncerr;
+	varid = -1;
+    }
+    else
+    {
+	varid++;
+	*rcode = 0;
+    }
+
+    return varid;
+}
+
+/* FORTRAN interface to the above. */
+FCALLSCFUN6(NF_INT,c_ncvdef,NCVDEF,ncvdef,
+    NCID,STRING,TYPE,NDIMS,DIMIDS,PRCODE)
+
+
+/*
+ * Return the ID of a netCDF variable given its name.
+ */
+static int
+c_ncvid (
+    int ncid,		/* netCDF ID */
+    const char *varname,/* variable name */
+    int *rcode		/* returned error code */
+)
+{
+    int varid;
+
+    if ((varid = ncvarid (ncid, varname)) == -1)
+	*rcode = ncerr;
+    else
+    {
+	varid++;
+	*rcode = 0;
+    }
+
+    return varid;
+}
+
+/* FORTRAN interface to the above. */
+FCALLSCFUN3(NF_INT,c_ncvid,NCVID,ncvid,
+    NCID,STRING,PRCODE)
+
+
+/*
+ * Return number of bytes per netCDF data type.
+ */
+static int
+c_nctlen (
+    nc_type datatype,	/* netCDF datatype */
+    int* rcode		/* returned error code */
+)
+{
+    int itype;
+
+    *rcode = ((itype = (int) nctypelen (datatype)) == -1)
+		?  ncerr
+		: 0;
+
+    return itype;
+}
+
+/* FORTRAN interface to the above. */
+FCALLSCFUN2(NF_INT,c_nctlen,NCTLEN,nctlen,
+    TYPE,PRCODE)
+
+
+/*
+ * Close an open netCDF file.
+ */
+static void
+c_ncclos (
+    int ncid,		/* netCDF ID */
+    int* rcode		/* returned error code */
+)
+{
+    *rcode = ncclose(ncid) == -1
+		? ncerr
+		: 0;
+}
+
+/* FORTRAN interface to the above. */
+FCALLSCSUB2(c_ncclos,NCCLOS,ncclos,
+    NCID,PRCODE)
+
+
+/*
+ * Put an open netCDF into define mode.
+ */
+static void
+c_ncredf (
+    int ncid,		/* netCDF ID */
+    int *rcode		/* returned error code */
+)
+{
+    *rcode = ncredef(ncid) == -1
+		? ncerr
+		: 0;
+}
+
+/* FORTRAN interface to the above. */
+FCALLSCSUB2(c_ncredf,NCREDF,ncredf,
+    NCID,PRCODE)
+
+
+/*
+ * Take an open netCDF out of define mode.
+ */
+static void
+c_ncendf (
+    int ncid,		/* netCDF ID */
+    int *rcode		/* returned error code */
+)
+{
+    *rcode = ncendef (ncid) == -1
+		? ncerr
+		: 0;
+}
+
+/* FORTRAN interface to the above. */
+FCALLSCSUB2(c_ncendf,NCENDF,ncendf,
+    NCID,PRCODE)
+
+
+/*
+ * Return information about an open netCDF file given its netCDF ID.
+ */
+static void
+c_ncinq (
+    int ncid,		/* netCDF ID */
+    int* indims,	/* returned number of dimensions */
+    int* invars,	/* returned number of variables */
+    int* inatts,	/* returned number of attributes */
+    int* irecdim,	/* returned ID of the unlimited dimension */
+    int* rcode		/* returned error code */
+)
+{
+    *rcode = ncinquire(ncid, indims, invars, inatts, irecdim) == -1
+		? ncerr
+		: 0;
+}
+
+/* FORTRAN interface to the above. */
+FCALLSCSUB6(c_ncinq,NCINQ,ncinq,
+    NCID,PNDIMS,PNVARS,PNATTS,PDIMID,PRCODE)
+
+
+/*
+ * Make sure that the disk copy of a netCDF file open for writing
+ * is current.
+ */
+static void
+c_ncsnc(
+    int ncid,		/* netCDF ID */
+    int* rcode		/* returned error code */
+)
+{
+    *rcode = ncsync (ncid) == -1
+		? ncerr
+		: 0;
+}
+
+/* FORTRAN interface to the above. */
+FCALLSCSUB2(c_ncsnc,NCSNC,ncsnc,
+    NCID,PRCODE)
+
+
+/*
+ * Restore the netCDF to a known consistent state in case anything
+ * goes wrong during the definition of new dimensions, variables
+ * or attributes.
+ */
+static void
+c_ncabor (
+    int ncid,		/* netCDF ID */
+    int* rcode		/* returned error code */
+)
+{
+    *rcode = ncabort(ncid) == -1
+		? ncerr
+		: 0;
+}
+
+/* FORTRAN interface to the above. */
+FCALLSCSUB2(c_ncabor,NCABOR,ncabor,
+    NCID,PRCODE)
+
+
+/*
+ * Return the name and size of a dimension, given its ID.
+ */
+static void
+c_ncdinq (
+    int ncid,			/* netCDF ID */
+    int dimid,			/* dimension ID */
+    char* dimname,		/* returned dimension name */
+    int* size,			/* returned dimension size */
+    int* rcode			/* returned error code */
+)
+{
+    long siz;
+
+    if (ncdiminq (ncid, dimid, dimname, &siz) == -1)
+	*rcode = ncerr;
+    else
+    {
+	*size = siz;
+	*rcode = 0;
+    }
+}
+
+/* FORTRAN interface to the above. */
+FCALLSCSUB5(c_ncdinq,NCDINQ,ncdinq,
+    NCID,DIMID,PSTRING,PDIMLEN,PRCODE)
+
+
+/*
+ * Rename an existing dimension in a netCDF open for writing.
+ */
+static void
+c_ncdren (
+    int ncid,			/* netCDF ID */
+    int dimid,			/* dimension ID */
+    const char* dimname,	/* new name of dimension */
+    int* rcode			/* returned error code */
+)
+{
+    *rcode = ncdimrename(ncid, dimid, dimname) == -1
+		? ncerr
+		: 0;
+}
+
+/* FORTRAN interface to the above. */
+FCALLSCSUB4(c_ncdren,NCDREN,ncdren,
+    NCID,DIMID,STRING,PRCODE)
+
+
+/*
+ * Return information about a netCDF variable, given its ID.
+ */
+static void
+c_ncvinq (
+    int ncid,		/* netCDF ID */
+    int varid,		/* variable ID */
+    char* varname,	/* returned variable name */
+    nc_type* datatype,	/* returned variable type */
+    int* indims,	/* returned number of dimensions */
+    int* dimarray,	/* returned array of ndims dimension IDs */
+    int* inatts,	/* returned number of attributes */
+    int* rcode		/* returned error code */
+)
+{
+    *rcode = ncvarinq(ncid, varid, varname, datatype, indims,
+		      dimarray, inatts) == -1
+		? ncerr
+		: 0;
+}
+
+/* FORTRAN interface to the above. */
+FCALLSCSUB8(c_ncvinq,NCVINQ,ncvinq,
+    NCID,VARID,PSTRING,PTYPE,PNDIMS,PDIMIDS,PNATTS,PRCODE)
+
+
+/*
+ * Put a single numeric data value into a variable of an open netCDF.
+ */
+static void
+c_ncvpt1 (
+    int			ncid,	/* netCDF ID */
+    int	 		varid,	/* variable ID */
+    const size_t*	indices,/* multidim index of data to be written */
+    const void*		value,	/* pointer to data value to be written */
+    int*		rcode	/* returned error code */
+)
+{
+    int		status;
+    nc_type	datatype;
+
+    if ((status = nc_inq_vartype(ncid, varid, &datatype)) == 0)
+    {
+	switch (datatype)
+	{
+	case NC_CHAR:
+	    status = NC_ECHAR;
+	    break;
+	case NC_BYTE:
+#	    if NF_INT1_IS_C_SIGNED_CHAR
+		status = nc_put_var1_schar(ncid, varid, indices,
+					   (const signed char*)value);
+#	    elif NF_INT1_IS_C_SHORT
+		status = nc_put_var1_short(ncid, varid, indices,
+					   (const short*)value);
+#	    elif NF_INT1_IS_C_INT
+		status = nc_put_var1_int(ncid, varid, indices,
+					   (const int*)value);
+#	    elif NF_INT1_IS_C_LONG
+		status = nc_put_var1_long(ncid, varid, indices,
+					   (const long*)value);
+#	    endif
+	    break;
+	case NC_SHORT:
+#	    if NF_INT2_IS_C_SHORT
+		status = nc_put_var1_short(ncid, varid, indices,
+					   (const short*)value);
+#	    elif NF_INT2_IS_C_INT
+		status = nc_put_var1_int(ncid, varid, indices,
+					   (const int*)value);
+#	    elif NF_INT2_IS_C_LONG
+		status = nc_put_var1_long(ncid, varid, indices,
+					   (const long*)value);
+#	    endif
+	    break;
+	case NC_INT:
+#	    if NF_INT_IS_C_INT
+		status = nc_put_var1_int(ncid, varid, indices,
+					   (const int*)value);
+#	    elif NF_INT_IS_C_LONG
+		status = nc_put_var1_long(ncid, varid, indices,
+					   (const long*)value);
+#	    endif
+	    break;
+	case NC_FLOAT:
+#	    if NF_REAL_IS_C_FLOAT
+		status = nc_put_var1_float(ncid, varid, indices,
+					   (const float*)value);
+#	    elif NF_REAL_IS_C_DOUBLE
+		status = nc_put_var1_double(ncid, varid, indices,
+					   (const double*)value);
+#	    endif
+	    break;
+	case NC_DOUBLE:
+#	    if NF_DOUBLEPRECISION_IS_C_FLOAT
+		status = nc_put_var1_float(ncid, varid, indices,
+					   (const float*)value);
+#	    elif NF_DOUBLEPRECISION_IS_C_DOUBLE
+		status = nc_put_var1_double(ncid, varid, indices,
+					   (const double*)value);
+#	    endif
+	    break;
+	}
+    }
+
+    if (status == 0)
+	*rcode = 0;
+    else
+    {
+	nc_advise("NCVPT1", status, "");
+	*rcode = ncerr;
+    }
+}
+
+/* FORTRAN interface to the above. */
+FCALLSCSUB5(c_ncvpt1,NCVPT1,ncvpt1,
+    NCID,VARID,COORDS,PVOID,PRCODE)
+
+
+/* 
+ * Put a single character into an open netCDF file.
+ */
+static void
+c_ncvp1c(
+    int			ncid,	/* netCDF ID */
+    int	 		varid,	/* variable ID */
+    const size_t*	indices,/* multidim index of data to be written */
+    const char*		value,	/* pointer to data value to be written */
+    int*		rcode	/* returned error code */
+)
+{
+    int		status;
+    nc_type	datatype;
+
+    if ((status = nc_inq_vartype(ncid, varid, &datatype)) == 0)
+    {
+	status = datatype != NC_CHAR
+		    ? NC_ECHAR
+		    : nc_put_var1_text(ncid, varid, indices, value);
+    }
+
+    if (status == 0)
+	*rcode = 0;
+    else
+    {
+	nc_advise("NCVP1C", status, "");
+	*rcode = ncerr;
+    }
+}
+
+/* FORTRAN interface to the above. */
+FCALLSCSUB5(c_ncvp1c,NCVP1C,ncvp1c,
+    NCID,VARID,COORDS,CBUF,PRCODE)
+
+
+/*
+ * Write a hypercube of numeric values into a netCDF variable of an open
+ * netCDF file.
+ */
+static void
+c_ncvpt (
+    int			ncid,	/* netCDF ID */
+    int			varid,	/* variable ID */
+    const size_t*	start,	/* multidimensional index of hypercube corner */
+    const size_t*	count,	/* multidimensional hypercube edge lengths */
+    const void*		value,	/* block of data values to be written */
+    int*		rcode	/* returned error code */
+)
+{
+    int		status;
+    nc_type	datatype;
+
+    if ((status = nc_inq_vartype(ncid, varid, &datatype)) == 0)
+    {
+	switch (datatype)
+	{
+	case NC_CHAR:
+	    status = NC_ECHAR;
+	    break;
+	case NC_BYTE:
+#	    if NF_INT1_IS_C_SIGNED_CHAR
+		status = nc_put_vara_schar(ncid, varid, start, count,
+					   (const signed char*)value);
+#	    elif NF_INT1_IS_C_SHORT
+		status = nc_put_vara_short(ncid, varid, start, count,
+					   (const short*)value);
+#	    elif NF_INT1_IS_C_INT
+		status = nc_put_vara_int(ncid, varid, start, count,
+					   (const int*)value);
+#	    elif NF_INT1_IS_C_LONG
+		status = nc_put_vara_long(ncid, varid, start, count,
+					   (const long*)value);
+#	    endif
+	    break;
+	case NC_SHORT:
+#	    if NF_INT2_IS_C_SHORT
+		status = nc_put_vara_short(ncid, varid, start, count,
+					   (const short*)value);
+#	    elif NF_INT2_IS_C_INT
+		status = nc_put_vara_int(ncid, varid, start, count,
+					   (const int*)value);
+#	    elif NF_INT2_IS_C_LONG
+		status = nc_put_vara_long(ncid, varid, start, count,
+					   (const long*)value);
+#	    endif
+	    break;
+	case NC_INT:
+#	    if NF_INT_IS_C_INT
+		status = nc_put_vara_int(ncid, varid, start, count,
+					   (const int*)value);
+#	    elif NF_INT_IS_C_LONG
+		status = nc_put_vara_long(ncid, varid, start, count,
+					   (const long*)value);
+#	    endif
+	    break;
+	case NC_FLOAT:
+#	    if NF_REAL_IS_C_FLOAT
+		status = nc_put_vara_float(ncid, varid, start, count,
+					   (const float*)value);
+#	    elif NF_REAL_IS_C_DOUBLE
+		status = nc_put_vara_double(ncid, varid, start, count,
+					   (const double*)value);
+#	    endif
+	    break;
+	case NC_DOUBLE:
+#	    if NF_DOUBLEPRECISION_IS_C_FLOAT
+		status = nc_put_vara_float(ncid, varid, start, count,
+					   (const float*)value);
+#	    elif NF_DOUBLEPRECISION_IS_C_DOUBLE
+		status = nc_put_vara_double(ncid, varid, start, count,
+					   (const double*)value);
+#	    endif
+	    break;
+	}
+    }
+
+    if (status == 0)
+	*rcode = 0;
+    else
+    {
+	nc_advise("NCVPT", status, "");
+	*rcode = ncerr;
+    }
+}
+
+
+/* FORTRAN interface to the above. */
+FCALLSCSUB6(c_ncvpt,NCVPT,ncvpt,
+    NCID,VARID,COORDS,COUNTS,PVOID,PRCODE)
+
+
+/*
+ * Write a hypercube of character values into an open netCDF file.
+ */
+static void
+c_ncvptc(
+    int			ncid,	/* netCDF ID */
+    int			varid,	/* variable ID */
+    const size_t*	start,	/* multidimensional index of hypercube corner */
+    const size_t*	count,	/* multidimensional hypercube edge lengths */
+    const char*		value,	/* block of data values to be written */
+    int			lenstr,	/* declared length of the data argument */
+    int*		rcode	/* returned error code */
+)
+{
+    int		status;
+    nc_type	datatype;
+
+    if ((status = nc_inq_vartype(ncid, varid, &datatype)) == 0)
+    {
+	if (datatype != NC_CHAR)
+	    status = NC_ECHAR;
+	else
+	{
+	    int	rank;
+
+	    status = nc_inq_varndims(ncid, varid, &rank);
+	    if (status == 0)
+	    {
+		if (dimprod(count, rank) > (size_t)lenstr)
+		    status = NC_ESTS;
+		else
+		    status = nc_put_vara_text(ncid, varid, start, count, value);
+	    }
+	}
+    }
+
+    if (status == 0)
+	*rcode = 0;
+    else
+    {
+	nc_advise("NCVPTC", status, "");
+	*rcode = ncerr;
+    }
+}
+
+
+/* FORTRAN interface to the above. */
+FCALLSCSUB7(c_ncvptc,NCVPTC,ncvptc,
+    NCID,VARID,COORDS,COUNTS,CBUF,LENSTR,PRCODE)
+
+
+/*
+ * Write a generalized hypercube of numeric values into a netCDF variable of 
+ * an open netCDF file.
+ */
+static void
+c_ncvptg (
+    int			ncid,	/* netCDF ID */
+    int			varid,	/* variable ID */
+    const size_t*	start,	/* multidimensional index of hypercube corner */
+    const size_t*	count,	/* multidimensional hypercube edge lengths */
+    const ptrdiff_t*	strides,/* netCDF variable access strides */
+    const ptrdiff_t*	imap,	/* memory values access mapping vector */
+    const void*		value,	/* block of data values to be written */
+    int*		rcode	/* returned error code */
+)
+{
+    int		status;
+    int		rank;
+    nc_type	datatype;
+
+    if ((status = nc_inq_vartype(ncid, varid, &datatype)) == 0 &&
+	(status = nc_inq_varndims(ncid, varid, &rank)) == 0)
+    {
+	switch (datatype)
+	{
+	case NC_CHAR:
+	    status = NC_ECHAR;
+	    break;
+	case NC_BYTE:
+#	    if NF_INT1_IS_C_SIGNED_CHAR
+		status = nc_put_varm_schar(ncid, varid, start, count,
+					   strides, imap,
+					   (const signed char*)value);
+#	    elif NF_INT1_IS_C_SHORT
+		status = nc_put_varm_short(ncid, varid, start, count,
+					   strides, imap,
+					   (const short*)value);
+#	    elif NF_INT1_IS_C_INT
+		status = nc_put_varm_int(ncid, varid, start, count,
+					   strides, imap,
+					   (const int*)value);
+#	    elif NF_INT1_IS_C_LONG
+		status = nc_put_varm_long(ncid, varid, start, count,
+					   strides, imap,
+					   (const long*)value);
+#	    endif
+	    break;
+	case NC_SHORT:
+#	    if NF_INT2_IS_C_SHORT
+		status = nc_put_varm_short(ncid, varid, start, count,
+					   strides, imap,
+					   (const short*)value);
+#	    elif NF_INT2_IS_C_INT
+		status = nc_put_varm_int(ncid, varid, start, count,
+					   strides, imap,
+					   (const int*)value);
+#	    elif NF_INT2_IS_C_LONG
+		status = nc_put_varm_long(ncid, varid, start, count,
+					   strides, imap,
+					   (const long*)value);
+#	    endif
+	    break;
+	case NC_INT:
+#	    if NF_INT_IS_C_INT
+		status = nc_put_varm_int(ncid, varid, start, count,
+					   strides, imap,
+					   (const int*)value);
+#	    elif NF_INT_IS_C_LONG
+		status = nc_put_varm_long(ncid, varid, start, count,
+					   strides, imap,
+					   (const long*)value);
+#	    endif
+	    break;
+	case NC_FLOAT:
+#	    if NF_REAL_IS_C_FLOAT
+		status = nc_put_varm_float(ncid, varid, start, count,
+					   strides, imap,
+					   (const float*)value);
+#	    elif NF_REAL_IS_C_DOUBLE
+		status = nc_put_varm_double(ncid, varid, start, count,
+					   strides, imap,
+					   (const double*)value);
+#	    endif
+	    break;
+	case NC_DOUBLE:
+#	    if NF_DOUBLEPRECISION_IS_C_FLOAT
+		status = nc_put_varm_float(ncid, varid, start, count,
+					   strides, imap,
+					   (const float*)value);
+#	    elif NF_DOUBLEPRECISION_IS_C_DOUBLE
+		status = nc_put_varm_double(ncid, varid, start, count,
+					   strides, imap,
+					   (const double*)value);
+#	    endif
+	    break;
+	}
+    }
+
+    if (status == 0)
+	*rcode = 0;
+    else
+    {
+	nc_advise("NCVPTG", status, "");
+	*rcode = ncerr;
+    }
+}
+
+
+/* FORTRAN interface to the above. */
+FCALLSCSUB8(c_ncvptg,NCVPTG,ncvptg,
+    NCID,VARID,COORDS,COUNTS,STRIDES,V2IMAP,PVOID,PRCODE)
+
+
+/*
+ * Write a generalized hypercube of character values into a netCDF variable of 
+ * an open netCDF file.
+ */
+static void
+c_ncvpgc(
+    int			ncid,	/* netCDF ID */
+    int			varid,	/* variable ID */
+    const size_t*	start,	/* multidimensional index of hypercube corner */
+    const size_t*	count,	/* multidimensional hypercube edge lengths */
+    const ptrdiff_t*	strides,/* netCDF variable access strides */
+    const ptrdiff_t*	imap,	/* memory values access mapping vector */
+    const char*		value,	/* block of data values to be written */
+    int*		rcode	/* returned error code */
+)
+{
+    int		status;
+    int		rank;
+    nc_type	datatype;
+
+    if ((status = nc_inq_vartype(ncid, varid, &datatype)) == 0 &&
+	(status = nc_inq_varndims(ncid, varid, &rank)) == 0)
+    {
+	switch (datatype)
+	{
+	case NC_CHAR:
+	    status = nc_put_varm_text(ncid, varid, start, count,
+				       strides, imap,
+				       value);
+	    break;
+	default:
+	    status = NC_ECHAR;
+	    break;
+	}
+    }
+
+    if (status == 0)
+	*rcode = 0;
+    else
+    {
+	nc_advise("NCVPGC", status, "");
+	*rcode = ncerr;
+    }
+}
+
+
+/* FORTRAN interface to the above. */
+FCALLSCSUB8(c_ncvpgc,NCVPGC,ncvpgc,
+    NCID,VARID,COORDS,COUNTS,STRIDES,V2IMAP,CBUF,PRCODE)
+
+
+/*
+ * Get a single numeric value from a variable of an open netCDF file.
+ */
+static void
+c_ncvgt1 (
+    int			ncid,	/* netCDF ID */
+    int	 		varid,	/* variable ID */
+    const size_t*	indices,/* multidim index of data to be read */
+    void*		value,	/* pointer to data value to be read */
+    int*		rcode	/* returned error code */
+)
+{
+    int		status;
+    nc_type	datatype;
+
+    if ((status = nc_inq_vartype(ncid, varid, &datatype)) == 0)
+    {
+	switch (datatype)
+	{
+	case NC_CHAR:
+	    status = NC_ECHAR;
+	    break;
+	case NC_BYTE:
+#	    if NF_INT1_IS_C_SIGNED_CHAR
+		status = nc_get_var1_schar(ncid, varid, indices,
+					   (signed char*)value);
+#	    elif NF_INT1_IS_C_SHORT
+		status = nc_get_var1_short(ncid, varid, indices,
+					   (short*)value);
+#	    elif NF_INT1_IS_C_INT
+		status = nc_get_var1_int(ncid, varid, indices,
+					   (int*)value);
+#	    elif NF_INT1_IS_C_LONG
+		status = nc_get_var1_long(ncid, varid, indices,
+					   (long*)value);
+#	    endif
+	    break;
+	case NC_SHORT:
+#	    if NF_INT2_IS_C_SHORT
+		status = nc_get_var1_short(ncid, varid, indices,
+					   (short*)value);
+#	    elif NF_INT2_IS_C_INT
+		status = nc_get_var1_int(ncid, varid, indices,
+					   (int*)value);
+#	    elif NF_INT2_IS_C_LONG
+		status = nc_get_var1_long(ncid, varid, indices,
+					   (long*)value);
+#	    endif
+	    break;
+	case NC_INT:
+#	    if NF_INT_IS_C_INT
+		status = nc_get_var1_int(ncid, varid, indices,
+					   (int*)value);
+#	    elif NF_INT_IS_C_LONG
+		status = nc_get_var1_long(ncid, varid, indices,
+					   (long*)value);
+#	    endif
+	    break;
+	case NC_FLOAT:
+#	    if NF_REAL_IS_C_FLOAT
+		status = nc_get_var1_float(ncid, varid, indices,
+					   (float*)value);
+#	    elif NF_REAL_IS_C_DOUBLE
+		status = nc_get_var1_double(ncid, varid, indices,
+					   (double*)value);
+#	    endif
+	    break;
+	case NC_DOUBLE:
+#	    if NF_DOUBLEPRECISION_IS_C_FLOAT
+		status = nc_get_var1_float(ncid, varid, indices,
+					   (float*)value);
+#	    elif NF_DOUBLEPRECISION_IS_C_DOUBLE
+		status = nc_get_var1_double(ncid, varid, indices,
+					   (double*)value);
+#	    endif
+	    break;
+	}
+    }
+
+    if (status == 0)
+	*rcode = 0;
+    else
+    {
+	nc_advise("NCVGT1", status, "");
+	*rcode = ncerr;
+    }
+}
+
+
+/* FORTRAN interface to the above. */
+FCALLSCSUB5(c_ncvgt1,NCVGT1,ncvgt1,
+    NCID,VARID,COORDS,PVOID,PRCODE)
+
+
+/*
+ * Get a single character data value from a variable of an open
+ * netCDF file.
+ */
+static void
+c_ncvg1c(
+    int			ncid,	/* netCDF ID */
+    int	 		varid,	/* variable ID */
+    const size_t*	indices,/* multidim index of data to be read */
+    char*		value,	/* pointer to data value to be read */
+    int*		rcode	/* returned error code */
+)
+{
+    int		status;
+    nc_type	datatype;
+
+    if ((status = nc_inq_vartype(ncid, varid, &datatype)) == 0)
+    {
+	switch (datatype)
+	{
+	case NC_CHAR:
+	    status = nc_get_var1_text(ncid, varid, indices, value);
+	    break;
+	default:
+	    status = NC_ECHAR;
+	    break;
+	}
+    }
+
+    if (status == 0)
+	*rcode = 0;
+    else
+    {
+	nc_advise("NCVG1C", status, "");
+	*rcode = ncerr;
+    }
+}
+
+
+/* FORTRAN interface to the above. */
+FCALLSCSUB5(c_ncvg1c,NCVG1C,ncvg1c,
+    NCID,VARID,COORDS,CBUF,PRCODE)
+
+
+/*
+ * Read a hypercube of numeric values from a netCDF variable of an open
+ * netCDF file.
+ */
+static void
+c_ncvgt(
+    int			ncid,	/* netCDF ID */
+    int			varid,	/* variable ID */
+    const size_t*	start,	/* multidimensional index of hypercube corner */
+    const size_t*	count,	/* multidimensional hypercube edge lengths */
+    void*		value,	/* block of data values to be read */
+    int*		rcode	/* returned error code */
+)
+{
+    int		status;
+    nc_type	datatype;
+
+    if ((status = nc_inq_vartype(ncid, varid, &datatype)) == 0)
+    {
+	switch (datatype)
+	{
+	case NC_CHAR:
+	    status = NC_ECHAR;
+	    break;
+	case NC_BYTE:
+#	    if NF_INT1_IS_C_SIGNED_CHAR
+		status = nc_get_vara_schar(ncid, varid, start, count,
+					   (signed char*)value);
+#	    elif NF_INT1_IS_C_SHORT
+		status = nc_get_vara_short(ncid, varid, start, count,
+					   (short*)value);
+#	    elif NF_INT1_IS_C_INT
+		status = nc_get_vara_int(ncid, varid, start, count,
+					   (int*)value);
+#	    elif NF_INT1_IS_C_LONG
+		status = nc_get_vara_long(ncid, varid, start, count,
+					   (long*)value);
+#	    endif
+	    break;
+	case NC_SHORT:
+#	    if NF_INT2_IS_C_SHORT
+		status = nc_get_vara_short(ncid, varid, start, count,
+					   (short*)value);
+#	    elif NF_INT2_IS_C_INT
+		status = nc_get_vara_int(ncid, varid, start, count,
+					   (int*)value);
+#	    elif NF_INT2_IS_C_LONG
+		status = nc_get_vara_long(ncid, varid, start, count,
+					   (long*)value);
+#	    endif
+	    break;
+	case NC_INT:
+#	    if NF_INT_IS_C_INT
+		status = nc_get_vara_int(ncid, varid, start, count,
+					   (int*)value);
+#	    elif NF_INT_IS_C_LONG
+		status = nc_get_vara_long(ncid, varid, start, count,
+					   (long*)value);
+#	    endif
+	    break;
+	case NC_FLOAT:
+#	    if NF_REAL_IS_C_FLOAT
+		status = nc_get_vara_float(ncid, varid, start, count,
+					   (float*)value);
+#	    elif NF_REAL_IS_C_DOUBLE
+		status = nc_get_vara_double(ncid, varid, start, count,
+					   (double*)value);
+#	    endif
+	    break;
+	case NC_DOUBLE:
+#	    if NF_DOUBLEPRECISION_IS_C_FLOAT
+		status = nc_get_vara_float(ncid, varid, start, count,
+					   (float*)value);
+#	    elif NF_DOUBLEPRECISION_IS_C_DOUBLE
+		status = nc_get_vara_double(ncid, varid, start, count,
+					   (double*)value);
+#	    endif
+	    break;
+	}
+    }
+
+    if (status == 0)
+	*rcode = 0;
+    else
+    {
+	nc_advise("NCVGT", status, "");
+	*rcode = ncerr;
+    }
+}
+
+
+/* FORTRAN interface to the above. */
+FCALLSCSUB6(c_ncvgt,NCVGT,ncvgt,
+    NCID,VARID,COORDS,COUNTS,PVOID,PRCODE)
+
+
+/*
+ * Read a hypercube of character values from a netCDF variable.
+ */
+static void
+c_ncvgtc(
+    int			ncid,	/* netCDF ID */
+    int			varid,	/* variable ID */
+    const size_t*	start,	/* multidimensional index of hypercube corner */
+    const size_t*	count,	/* multidimensional hypercube edge lengths */
+    char*		value,	/* block of data values to be read */
+    int			lenstr,	/* declared length of the data argument */
+    int*		rcode	/* returned error code */
+)
+{
+    int		status;
+    nc_type	datatype;
+
+    if ((status = nc_inq_vartype(ncid, varid, &datatype)) == 0)
+    {
+	if (datatype != NC_CHAR)
+	    status = NC_ECHAR;
+	else if ((status = nc_get_vara_text(ncid, varid, start, count, value))
+		 == 0)
+	{
+	    int	rank;
+
+	    if ((status = nc_inq_varndims(ncid, varid, &rank)) == 0)
+	    {
+		size_t	total = dimprod(count, rank);
+
+		(void) memset(value+total, ' ', lenstr - total);
+	    }
+	}
+    }
+
+    if (status == 0)
+	*rcode = 0;
+    else
+    {
+	nc_advise("NCVGTC", status, "");
+	*rcode = ncerr;
+    }
+}
+
+/* FORTRAN interface to the above. */
+FCALLSCSUB7(c_ncvgtc,NCVGTC,ncvgtc,
+    NCID,VARID,COORDS,COUNTS,CBUF,LENSTR,PRCODE)
+
+
+/*
+ * Read a generalized hypercube of numeric values from a netCDF variable of an 
+ * open netCDF file.
+ */
+static void
+c_ncvgtg (
+    int			ncid,	/* netCDF ID */
+    int			varid,	/* variable ID */
+    const size_t*	start,	/* multidimensional index of hypercube corner */
+    const size_t*	count,	/* multidimensional hypercube edge lengths */
+    const ptrdiff_t*	strides,/* netCDF variable access strides */
+    const ptrdiff_t*	imap,	/* memory values access basis vector */
+    void*		value,	/* block of data values to be read */
+    int*		rcode	/* returned error code */
+)
+{
+    int		status;
+    int		rank;
+    nc_type	datatype;
+
+    if ((status = nc_inq_vartype(ncid, varid, &datatype)) == 0 &&
+	(status = nc_inq_varndims(ncid, varid, &rank)) == 0)
+    {
+	switch (datatype)
+	{
+	case NC_CHAR:
+	    status = NC_ECHAR;
+	    break;
+	case NC_BYTE:
+#	    if NF_INT1_IS_C_SIGNED_CHAR
+		status = nc_get_varm_schar(ncid, varid, start, count,
+					   strides, imap,
+					   (signed char*)value);
+#	    elif NF_INT1_IS_C_SHORT
+		status = nc_get_varm_short(ncid, varid, start, count,
+					   strides, imap,
+					   (short*)value);
+#	    elif NF_INT1_IS_C_INT
+		status = nc_get_varm_int(ncid, varid, start, count,
+					   strides, imap,
+					   (int*)value);
+#	    elif NF_INT1_IS_C_LONG
+		status = nc_get_varm_long(ncid, varid, start, count,
+					   strides, imap,
+					   (long*)value);
+#	    endif
+	    break;
+	case NC_SHORT:
+#	    if NF_INT2_IS_C_SHORT
+		status = nc_get_varm_short(ncid, varid, start, count,
+					   strides, imap,
+					   (short*)value);
+#	    elif NF_INT2_IS_C_INT
+		status = nc_get_varm_int(ncid, varid, start, count,
+					   strides, imap,
+					   (int*)value);
+#	    elif NF_INT2_IS_C_LONG
+		status = nc_get_varm_long(ncid, varid, start, count,
+					   strides, imap,
+					   (long*)value);
+#	    endif
+	    break;
+	case NC_INT:
+#	    if NF_INT_IS_C_INT
+		status = nc_get_varm_int(ncid, varid, start, count,
+					   strides, imap,
+					   (int*)value);
+#	    elif NF_INT_IS_C_LONG
+		status = nc_get_varm_long(ncid, varid, start, count,
+					   strides, imap,
+					   (long*)value);
+#	    endif
+	    break;
+	case NC_FLOAT:
+#	    if NF_REAL_IS_C_FLOAT
+		status = nc_get_varm_float(ncid, varid, start, count,
+					   strides, imap,
+					   (float*)value);
+#	    elif NF_REAL_IS_C_DOUBLE
+		status = nc_get_varm_double(ncid, varid, start, count,
+					   strides, imap,
+					   (double*)value);
+#	    endif
+	    break;
+	case NC_DOUBLE:
+#	    if NF_DOUBLEPRECISION_IS_C_FLOAT
+		status = nc_get_varm_float(ncid, varid, start, count,
+					   strides, imap,
+					   (float*)value);
+#	    elif NF_DOUBLEPRECISION_IS_C_DOUBLE
+		status = nc_get_varm_double(ncid, varid, start, count,
+					   strides, imap,
+					   (double*)value);
+#	    endif
+	    break;
+	}
+    }
+
+    if (status == 0)
+	*rcode = 0;
+    else
+    {
+	nc_advise("NCVGTG", status, "");
+	*rcode = ncerr;
+    }
+}
+
+/* FORTRAN interface to the above. */
+FCALLSCSUB8(c_ncvgtg,NCVGTG,ncvgtg,
+    NCID,VARID,COORDS,COUNTS,STRIDES,V2IMAP,PVOID,PRCODE)
+
+
+/*
+ * Read a generalized hypercube of character values from a netCDF variable 
+ * of an open netCDF file.
+ */
+static void
+c_ncvggc(
+    int			ncid,	/* netCDF ID */
+    int			varid,	/* variable ID */
+    const size_t*	start,	/* multidimensional index of hypercube corner */
+    const size_t*	count,	/* multidimensional hypercube edge lengths */
+    const ptrdiff_t*	strides,/* netCDF variable access strides */
+    const ptrdiff_t*	imap,	/* memory values access basis vector */
+    char*		value,	/* block of data values to be written */
+    int*		rcode	/* returned error code */
+)
+{
+    int		status;
+    int		rank;
+    nc_type	datatype;
+
+    if ((status = nc_inq_vartype(ncid, varid, &datatype)) == 0 &&
+	(status = nc_inq_varndims(ncid, varid, &rank)) == 0)
+    {
+	switch (datatype)
+	{
+	case NC_CHAR:
+	    status = nc_get_varm_text(ncid, varid, start, count,
+				       strides, imap,
+				       value);
+	    break;
+	default:
+	    status = NC_ECHAR;
+	    break;
+	}
+    }
+
+    if (status == 0)
+	*rcode = 0;
+    else
+    {
+	nc_advise("NCVGGC", status, "");
+	*rcode = ncerr;
+    }
+}
+
+/* FORTRAN interface to the above. */
+FCALLSCSUB8(c_ncvggc,NCVGGC,ncvggc,
+    NCID,VARID,COORDS,COUNTS,STRIDES,V2IMAP,CBUF,PRCODE)
+
+
+/*
+ * Change the name of a netCDF variable in an open netCDF file.
+ */
+static void
+c_ncvren (
+    int ncid,		/* netCDF ID */
+    int varid,		/* variable ID */
+    const char* varname,/* new name for variable */
+    int* rcode		/* returned error code */
+)
+{
+    *rcode = ncvarrename (ncid, varid, varname) == -1
+		? ncerr
+		: 0;
+}
+
+/* FORTRAN interface to the above. */
+FCALLSCSUB4(c_ncvren,NCVREN,ncvren,
+    NCID,VARID,STRING,PRCODE)
+
+
+/*
+ * Add or changes a numeric variable or global attribute of an open
+ * netCDF file.
+ */
+static void
+c_ncapt (
+    int		ncid,		/* netCDF ID */
+    int		varid,		/* variable ID */
+    const char*	attname,	/* attribute name */
+    nc_type	datatype,	/* attribute datatype */
+    size_t	attlen,		/* attribute length */
+    const void*	value,		/* pointer to data values */
+    int*	rcode		/* returned error code */
+)
+{
+    int		status;
+
+    switch (datatype)
+    {
+    case NC_CHAR:
+	status = NC_ECHAR;
+	break;
+    case NC_BYTE:
+#	if NF_INT1_IS_C_SIGNED_CHAR
+	    status = nc_put_att_schar(ncid, varid, attname, datatype,
+				       attlen, (const signed char*)value);
+#	elif NF_INT1_IS_C_SHORT
+	    status = nc_put_att_short(ncid, varid, attname, datatype,
+				       attlen, (const short*)value);
+#	elif NF_INT1_IS_C_INT
+	    status = nc_put_att_int(ncid, varid, attname, datatype,
+				       attlen, (const int*)value);
+#	elif NF_INT1_IS_C_LONG
+	    status = nc_put_att_long(ncid, varid, attname, datatype,
+				       attlen, (const long*)value);
+#	endif
+	break;
+    case NC_SHORT:
+#	if NF_INT2_IS_C_SHORT
+	    status = nc_put_att_short(ncid, varid, attname, datatype,
+				       attlen, (const short*)value);
+#	elif NF_INT2_IS_C_INT
+	    status = nc_put_att_int(ncid, varid, attname, datatype,
+				       attlen, (const int*)value);
+#	elif NF_INT2_IS_C_LONG
+	    status = nc_put_att_long(ncid, varid, attname, datatype,
+				       attlen, (const long*)value);
+#	endif
+	break;
+    case NC_INT:
+#	if NF_INT_IS_C_INT
+	    status = nc_put_att_int(ncid, varid, attname, datatype,
+				       attlen, (const int*)value);
+#	elif NF_INT_IS_C_LONG
+	    status = nc_put_att_long(ncid, varid, attname, datatype,
+				       attlen, (const long*)value);
+#	endif
+	break;
+    case NC_FLOAT:
+#	if NF_REAL_IS_C_FLOAT
+	    status = nc_put_att_float(ncid, varid, attname, datatype,
+				       attlen, (const float*)value);
+#	elif NF_REAL_IS_C_DOUBLE
+	    status = nc_put_att_double(ncid, varid, attname, datatype,
+				       attlen, (const double*)value);
+#	endif
+	break;
+    case NC_DOUBLE:
+#	if NF_DOUBLEPRECISION_IS_C_FLOAT
+	    status = nc_put_att_float(ncid, varid, attname, datatype,
+				       attlen, (const float*)value);
+#	elif NF_DOUBLEPRECISION_IS_C_DOUBLE
+	    status = nc_put_att_double(ncid, varid, attname, datatype,
+				       attlen, (const double*)value);
+#	endif
+	break;
+    }
+
+    if (status == 0)
+	*rcode = 0;
+    else
+    {
+	nc_advise("NCAPT", status, "");
+	*rcode = ncerr;
+    }
+}
+
+/* FORTRAN interface to the above. */
+FCALLSCSUB7(c_ncapt,NCAPT,ncapt,
+    NCID,VARID,STRING,TYPE,COUNT,PVOID,PRCODE)
+
+
+/*
+ * Add or change a character attribute of an open netCDF file.
+ */
+static void
+c_ncaptc(
+    int		ncid,		/* netCDF ID */
+    int		varid,		/* variable ID */
+    const char*	attname,	/* attribute name */
+    nc_type	datatype,	/* attribute datatype */
+    size_t	attlen,		/* attribute length */
+    const char*	value,		/* pointer to data values */
+    int*	rcode		/* returned error code */
+)
+{
+    int		status;
+
+    if (datatype != NC_CHAR)
+	status = NC_ECHAR;
+    else
+	status = nc_put_att_text(ncid, varid, attname, attlen, value);
+
+    if (status == 0)
+	*rcode = 0;
+    else
+    {
+	nc_advise("NCAPTC", status, "");
+	*rcode = ncerr;
+    }
+}
+
+/* FORTRAN interface to the above. */
+FCALLSCSUB7(c_ncaptc,NCAPTC,ncaptc,
+    NCID,VARID,STRING,TYPE,COUNT,CBUF,PRCODE)
+
+
+/*
+ * Return information about a netCDF attribute given its variable
+ * ID and name.
+ */
+static void
+c_ncainq (
+    int ncid,			/* netCDF ID */
+    int varid,			/* variable ID */
+    const char* attname,	/* attribute name */
+    nc_type* datatype,		/* returned attribute datatype */
+    int* attlen,		/* returned attribute length */
+    int* rcode			/* returned error code */
+)
+{
+    *rcode = ncattinq(ncid, varid, attname, datatype, attlen)
+	     == -1
+		? ncerr
+		: 0;
+}
+
+/* FORTRAN interface to the above. */
+FCALLSCSUB6(c_ncainq,NCAINQ,ncainq,
+    NCID,VARID,STRING,PTYPE,PATTLEN,PRCODE)
+
+
+/*
+ * Get the value of a netCDF attribute given its variable ID and name.
+ */
+static void
+c_ncagt(
+    int		ncid,		/* netCDF ID */
+    int		varid,		/* variable ID */
+    const char*	attname,	/* attribute name */
+    void*	value,		/* pointer to data values */
+    int*	rcode		/* returned error code */
+)
+{
+    int		status;
+    nc_type	datatype;
+
+    if ((status = nc_inq_atttype(ncid, varid, attname, &datatype)) == 0)
+    {
+	switch (datatype)
+	{
+	case NC_CHAR:
+	    status = NC_ECHAR;
+	    break;
+	case NC_BYTE:
+#    	if NF_INT1_IS_C_SIGNED_CHAR
+		status = nc_get_att_schar(ncid, varid, attname, 
+					   (signed char*)value);
+#    	elif NF_INT1_IS_C_SHORT
+		status = nc_get_att_short(ncid, varid, attname, 
+					   (short*)value);
+#    	elif NF_INT1_IS_C_INT
+		status = nc_get_att_int(ncid, varid, attname, 
+					   (int*)value);
+#    	elif NF_INT1_IS_C_LONG
+		status = nc_get_att_long(ncid, varid, attname, 
+					   (long*)value);
+#    	endif
+	    break;
+	case NC_SHORT:
+#    	if NF_INT2_IS_C_SHORT
+		status = nc_get_att_short(ncid, varid, attname, 
+					   (short*)value);
+#    	elif NF_INT2_IS_C_INT
+		status = nc_get_att_int(ncid, varid, attname, 
+					   (int*)value);
+#    	elif NF_INT2_IS_C_LONG
+		status = nc_get_att_long(ncid, varid, attname, 
+					   (long*)value);
+#    	endif
+	    break;
+	case NC_INT:
+#	    if NF_INT_IS_C_INT
+		status = nc_get_att_int(ncid, varid, attname, 
+					   (int*)value);
+#	    elif NF_INT_IS_C_LONG
+		status = nc_get_att_long(ncid, varid, attname, 
+					   (long*)value);
+#	    endif
+	    break;
+	case NC_FLOAT:
+#    	if NF_REAL_IS_C_FLOAT
+		status = nc_get_att_float(ncid, varid, attname, 
+					   (float*)value);
+#    	elif NF_REAL_IS_C_DOUBLE
+		status = nc_get_att_double(ncid, varid, attname, 
+					   (double*)value);
+#    	endif
+	    break;
+	case NC_DOUBLE:
+#    	if NF_DOUBLEPRECISION_IS_C_FLOAT
+		status = nc_get_att_float(ncid, varid, attname, 
+					   (float*)value);
+#    	elif NF_DOUBLEPRECISION_IS_C_DOUBLE
+		status = nc_get_att_double(ncid, varid, attname, 
+					   (double*)value);
+#    	endif
+	    break;
+	}
+    }
+
+    if (status == 0)
+	*rcode = 0;
+    else
+    {
+	nc_advise("NCAGT", status, "");
+	*rcode = ncerr;
+    }
+}
+
+/* FORTRAN interface to the above. */
+FCALLSCSUB5(c_ncagt,NCAGT,ncagt,
+    NCID,VARID,STRING,PVOID,PRCODE)
+
+
+/*
+ * Get the value of a netCDF character attribute given its variable
+ * ID and name.
+ */
+static void
+c_ncagtc(
+    int		ncid,		/* netCDF ID */
+    int		varid,		/* variable ID */
+    const char*	attname,	/* attribute name */
+    char*	value,		/* pointer to data values */
+    int		attlen,		/* length of string argument */
+    int*	rcode		/* returned error code */
+)
+{
+    int		status;
+    nc_type	datatype;
+
+    if ((status = nc_inq_atttype(ncid, varid, attname, &datatype)) == 0)
+    {
+	if (datatype != NC_CHAR)
+	    status = NC_ECHAR;
+	else
+	{
+	    size_t	len;
+
+	    status = nc_inq_attlen(ncid, varid, attname, &len);
+	    if (status == 0)
+	    {
+		if (attlen < len)
+		    status = NC_ESTS;
+		else
+		{
+		    status = nc_get_att_text(ncid, varid, attname, 
+					       value);
+		    if (status == 0)
+			(void) memset(value+len, ' ', attlen - len);
+		}
+	    }
+	}
+    }
+
+    if (status == 0)
+	*rcode = 0;
+    else
+    {
+	nc_advise("NCAGTC", status, "");
+	*rcode = ncerr;
+    }
+}
+
+/* FORTRAN interface to the above. */
+FCALLSCSUB6(c_ncagtc,NCAGTC,ncagtc,
+    NCID,VARID,STRING,CBUF,ATTLEN,PRCODE)
+
+
+/*
+ * Copy an attribute from one open netCDF file to another.
+ */
+static void
+c_ncacpy (
+    int inncid,		/* input netCDF ID */
+    int invarid,	/* variable ID of input netCDF or NC_GLOBAL */
+    const char* attname,/* name of attribute in input netCDF to be copied */
+    int outncid,	/* ID of output netCDF file for attribute */
+    int outvarid,	/* ID of associated netCDF variable or NC_GLOBAL */
+    int* rcode		/* returned error code */
+)
+{
+    *rcode = ncattcopy(inncid, invarid, attname, outncid, outvarid)
+	     == -1
+		? ncerr
+		: 0;
+}
+
+/* FORTRAN interface to the above. */
+FCALLSCSUB6(c_ncacpy,NCACPY,ncacpy,
+    NCID1,VARID1,STRING,NCID2,VARID2,PRCODE)
+
+
+/*
+ * Get the name of an attribute given its variable ID and number
+ * as an attribute of that variable.
+ */
+static void
+c_ncanam (
+    int ncid,		/* netCDF ID */
+    int varid,		/* variable ID */
+    int attnum,		/* attribute number */
+    char* attname,	/* returned attribute name */
+    int* rcode		/* returned error code */
+)
+{
+    *rcode = ncattname(ncid, varid, attnum, attname) == -1
+		? ncerr
+		: 0;
+}
+
+/* FORTRAN interface to the above. */
+FCALLSCSUB5(c_ncanam,NCANAM,ncanam,
+    NCID,VARID,ATTID,PSTRING,PRCODE)
+
+
+/*
+ * Rename an attribute in an open netCDF file.
+ */
+static void
+c_ncaren (
+    int ncid,		/* netCDF ID */
+    int varid,		/* variable ID */
+    const char* attname,/* attribute name */
+    const char* newname,/* new name */
+    int* rcode		/* returned error code */
+)
+{
+    *rcode = ncattrename(ncid, varid, attname, newname) == -1
+		? ncerr
+		: 0;
+}
+
+/* FORTRAN interface to the above. */
+FCALLSCSUB5(c_ncaren,NCAREN,ncaren,
+    NCID,VARID,STRING,STRING,PRCODE)
+
+
+/*
+ * Delete an attribute from an open netCDF file given the attribute name.
+ */
+static void
+c_ncadel (
+    int ncid,		/* netCDF ID */
+    int varid,		/* variable ID */
+    const char* attname,/* attribute name */
+    int* rcode		/* returned error code */
+)
+{
+    *rcode = ncattdel(ncid, varid, attname) == -1
+		? ncerr
+		: 0;
+}
+
+/* FORTRAN interface to the above. */
+FCALLSCSUB4(c_ncadel,NCADEL,ncadel,
+    NCID,VARID,STRING,PRCODE)
+
+
+/*
+ * Set the fill mode of a netCDF file open for writing.
+ */
+static int
+c_ncsfil (
+    int ncid,		/* netCDF ID */
+    int fillmode,	/* fill mode, NCNOFILL or NCFILL */
+    int* rcode		/* returned error code */
+)
+{
+    int retval;
+
+    *rcode = ((retval = ncsetfill(ncid, fillmode)) == -1)
+		? ncerr
+		: 0;
+
+    return retval;
+}
+
+/* FORTRAN interface to the above. */
+FCALLSCFUN3(NF_INT,c_ncsfil,NCSFIL,ncsfil,
+    NCID,FILLMODE,PRCODE)
+
+#endif /*!NO_NETCDF_2*/
diff --git a/libsrc/fort-var1io.c b/libsrc/fort-var1io.c
new file mode 100644
index 0000000..05801fb
--- /dev/null
+++ b/libsrc/fort-var1io.c
@@ -0,0 +1,166 @@
+/*
+This file is part of the netCDF Fortran 77 API.
+
+This file handles the netCDF var1 functions.
+
+Copyright 2006, University Corporation for Atmospheric Research. See
+the COPYRIGHT file for copying and redistribution conditions.
+
+$Id: fort-var1io.c,v 1.10 2008/02/25 17:24:24 ed Exp $
+*/
+
+#include <config.h>
+#include "netcdf.h"
+#include "nfconfig.inc"
+#include "ncfortran.h"
+#include "fort-lib.h"
+
+
+/*
+ * Write a single value from a FORTRAN CHARACTER*(*) variable (the
+ * `single value' is the whole string).
+ */
+FCALLSCFUN4(NF_INT, nc_put_var1_text, NF_PUT_VAR1_TEXT, nf_put_var1_text,
+	    NCID, VARID, COORDS, CBUF)
+
+
+/*
+ * Read a single value into a FORTRAN CHARACTER*(*) variable (the
+ * `single value' is the whole string).
+ */
+FCALLSCFUN4(NF_INT, nc_get_var1_text, NF_GET_VAR1_TEXT, nf_get_var1_text,
+	    NCID, VARID, COORDS, CBUF)
+
+
+/*
+ * Write a single value from a FORTRAN INTEGER*1 variable.
+ */
+#if NF_INT1_IS_C_SIGNED_CHAR
+FCALLSCFUN4(NF_INT, nc_put_var1_schar, NF_PUT_VAR1_INT1, nf_put_var1_int1,
+	    NCID, VARID, COORDS, INT1VAR)
+#elif NF_INT1_IS_C_SHORT
+FCALLSCFUN4(NF_INT, nc_put_var1_short, NF_PUT_VAR1_INT1, nf_put_var1_int1,
+	    NCID, VARID, COORDS, INT1VAR)
+#elif NF_INT1_IS_C_INT
+FCALLSCFUN4(NF_INT, nc_put_var1_int, NF_PUT_VAR1_INT1, nf_put_var1_int1,
+	    NCID, VARID, COORDS, INT1VAR)
+#elif NF_INT1_IS_C_LONG
+FCALLSCFUN4(NF_INT, nc_put_var1_long, NF_PUT_VAR1_INT1, nf_put_var1_int1,
+	    NCID, VARID, COORDS, INT1VAR)
+#endif
+
+
+/*
+ * Read a single value into a FORTRAN INTEGER*1 variable.
+ */
+#if NF_INT1_IS_C_SIGNED_CHAR
+FCALLSCFUN4(NF_INT, nc_get_var1_schar, NF_GET_VAR1_INT1, nf_get_var1_int1,
+	    NCID, VARID, COORDS, PINT1VAR)
+#elif NF_INT1_IS_C_SHORT
+FCALLSCFUN4(NF_INT, nc_get_var1_short, NF_GET_VAR1_INT1, nf_get_var1_int1,
+	    NCID, VARID, COORDS, PINT1VAR)
+#elif NF_INT1_IS_C_INT
+FCALLSCFUN4(NF_INT, nc_get_var1_int, NF_GET_VAR1_INT1, nf_get_var1_int1,
+	    NCID, VARID, COORDS, PINT1VAR)
+#elif NF_INT1_IS_C_LONG
+FCALLSCFUN4(NF_INT, nc_get_var1_long, NF_GET_VAR1_INT1, nf_get_var1_int1,
+	    NCID, VARID, COORDS, PINT1VAR)
+#endif
+
+
+/*
+ * Write a single value from a FORTRAN INTEGER*2 variable.
+ */
+#if NF_INT2_IS_C_SHORT
+FCALLSCFUN4(NF_INT, nc_put_var1_short, NF_PUT_VAR1_INT2, nf_put_var1_int2,
+	    NCID, VARID, COORDS, INT2VAR)
+#elif NF_INT2_IS_C_INT
+FCALLSCFUN4(NF_INT, nc_put_var1_int, NF_PUT_VAR1_INT2, nf_put_var1_int2,
+	    NCID, VARID, COORDS, INT2VAR)
+#elif NF_INT2_IS_C_LONG
+FCALLSCFUN4(NF_INT, nc_put_var1_long, NF_PUT_VAR1_INT2, nf_put_var1_int2,
+	    NCID, VARID, COORDS, INT2VAR)
+#endif
+
+
+/*
+ * Read a single value into a FORTRAN INTEGER*2 variable.
+ */
+#if NF_INT2_IS_C_SHORT
+FCALLSCFUN4(NF_INT, nc_get_var1_short, NF_GET_VAR1_INT2, nf_get_var1_int2,
+	    NCID, VARID, COORDS, PINT2VAR)
+#elif NF_INT2_IS_C_INT
+FCALLSCFUN4(NF_INT, nc_get_var1_int, NF_GET_VAR1_INT2, nf_get_var1_int2,
+	    NCID, VARID, COORDS, PINT2VAR)
+#elif NF_INT2_IS_C_LONG
+FCALLSCFUN4(NF_INT, nc_get_var1_long, NF_GET_VAR1_INT2, nf_get_var1_int2,
+	    NCID, VARID, COORDS, PINT2VAR)
+#endif
+
+
+/*
+ * Write a single value from a FORTRAN INTEGER variable.
+ */
+#if NF_INT_IS_C_INT
+FCALLSCFUN4(NF_INT, nc_put_var1_int, NF_PUT_VAR1_INT, nf_put_var1_int,
+	    NCID, VARID, COORDS, INTVAR)
+#elif NF_INT_IS_C_LONG
+FCALLSCFUN4(NF_INT, nc_put_var1_long, NF_PUT_VAR1_INT, nf_put_var1_int,
+	    NCID, VARID, COORDS, INTVAR)
+#endif
+
+
+/*
+ * Read a single value into a FORTRAN INTEGER variable.
+ */
+#if NF_INT_IS_C_INT
+FCALLSCFUN4(NF_INT, nc_get_var1_int, NF_GET_VAR1_INT, nf_get_var1_int,
+	    NCID, VARID, COORDS, PINTVAR)
+#elif NF_INT_IS_C_LONG
+FCALLSCFUN4(NF_INT, nc_get_var1_long, NF_GET_VAR1_INT, nf_get_var1_int,
+	    NCID, VARID, COORDS, PINTVAR)
+#endif
+
+
+/*
+ * Write a single value from a FORTRAN REAL variable.
+ */
+#if NF_REAL_IS_C_DOUBLE
+FCALLSCFUN4(NF_INT, nc_put_var1_double, NF_PUT_VAR1_REAL, nf_put_var1_real,
+	    NCID, VARID, COORDS, DOUBLEVAR)
+#else
+FCALLSCFUN4(NF_INT, nc_put_var1_float, NF_PUT_VAR1_REAL, nf_put_var1_real,
+	    NCID, VARID, COORDS, REALVAR)
+#endif
+
+
+/*
+ * Read a single value into a FORTRAN REAL variable.
+ */
+#if NF_REAL_IS_C_DOUBLE
+FCALLSCFUN4(NF_INT, nc_get_var1_double, NF_GET_VAR1_REAL, nf_get_var1_real,
+	    NCID, VARID, COORDS, PDOUBLEVAR)
+#else
+FCALLSCFUN4(NF_INT, nc_get_var1_float, NF_GET_VAR1_REAL, nf_get_var1_real,
+	    NCID, VARID, COORDS, PREALVAR)
+#endif
+
+
+/*
+ * Write a single value from a FORTRAN DOUBLEPRECISION variable.
+ */
+FCALLSCFUN4(NF_INT, nc_put_var1_double, NF_PUT_VAR1_DOUBLE, nf_put_var1_double,
+	    NCID, VARID, COORDS, DOUBLEVAR)
+
+
+/*
+ * Read a single value into a FORTRAN DOUBLEPRECISION variable.
+ */
+FCALLSCFUN4(NF_INT, nc_get_var1_double, NF_GET_VAR1_DOUBLE, nf_get_var1_double,
+	    NCID, VARID, COORDS, PDOUBLEVAR)
+
+FCALLSCFUN4(NF_INT, nc_put_var1, NF_PUT_VAR1, nf_put_var1,
+	    NCID, VARID, COORDS, PVOID)
+
+FCALLSCFUN4(NF_INT, nc_get_var1, NF_GET_VAR1, nf_get_var1,
+	    NCID, VARID, COORDS, PVOID)
diff --git a/libsrc/fort-varaio.c b/libsrc/fort-varaio.c
new file mode 100644
index 0000000..4573ea8
--- /dev/null
+++ b/libsrc/fort-varaio.c
@@ -0,0 +1,164 @@
+/*
+This file is part of the netCDF Fortran 77 API.
+
+This file handles the netCDF vara functions.
+
+Copyright 2006, University Corporation for Atmospheric Research. See
+the COPYRIGHT file for copying and redistribution conditions.
+
+$Id: fort-varaio.c,v 1.10 2008/02/25 17:24:24 ed Exp $
+*/
+
+#include <config.h>
+#include "netcdf.h"
+#include "nfconfig.inc"
+#include "ncfortran.h"
+#include "fort-lib.h"
+
+
+/*
+ * Write values from a FORTRAN CHARACTER*(*) variable.
+ */
+FCALLSCFUN5(NF_INT, nc_put_vara_text, NF_PUT_VARA_TEXT, nf_put_vara_text,
+	    NCID, VARID, COORDS, COUNTS, CBUF)
+
+
+/*
+ * Read values into a FORTRAN CHARACTER*(*) variable.
+ */
+FCALLSCFUN5(NF_INT, nc_get_vara_text, NF_GET_VARA_TEXT, nf_get_vara_text,
+	    NCID, VARID, COORDS, COUNTS, CBUF)
+
+
+/*
+ * Write values from a FORTRAN INTEGER*1 variable array.
+ */
+#if NF_INT1_IS_C_SIGNED_CHAR
+FCALLSCFUN5(NF_INT, nc_put_vara_schar, NF_PUT_VARA_INT1, nf_put_vara_int1,
+	    NCID, VARID, COORDS, COUNTS, INT1VARV)
+#elif NF_INT1_IS_C_SHORT
+FCALLSCFUN5(NF_INT, nc_put_vara_short, NF_PUT_VARA_INT1, nf_put_vara_int1,
+	    NCID, VARID, COORDS, COUNTS, INT1VARV)
+#elif NF_INT1_IS_C_INT
+FCALLSCFUN5(NF_INT, nc_put_vara_int, NF_PUT_VARA_INT1, nf_put_vara_int1,
+	    NCID, VARID, COORDS, COUNTS, INT1VARV)
+#elif NF_INT1_IS_C_LONG
+FCALLSCFUN5(NF_INT, nc_put_vara_long, NF_PUT_VARA_INT1, nf_put_vara_int1,
+	    NCID, VARID, COORDS, COUNTS, INT1VARV)
+#endif
+
+
+/*
+ * Read values into a FORTRAN INTEGER*1 variable array.
+ */
+#if NF_INT1_IS_C_SIGNED_CHAR
+FCALLSCFUN5(NF_INT, nc_get_vara_schar, NF_GET_VARA_INT1, nf_get_vara_int1,
+	    NCID, VARID, COORDS, COUNTS, PINT1VARV)
+#elif NF_INT1_IS_C_SHORT
+FCALLSCFUN5(NF_INT, nc_get_vara_short, NF_GET_VARA_INT1, nf_get_vara_int1,
+	    NCID, VARID, COORDS, COUNTS, PINT1VARV)
+#elif NF_INT1_IS_C_INT
+FCALLSCFUN5(NF_INT, nc_get_vara_int, NF_GET_VARA_INT1, nf_get_vara_int1,
+	    NCID, VARID, COORDS, COUNTS, PINT1VARV)
+#elif NF_INT1_IS_C_LONG
+FCALLSCFUN5(NF_INT, nc_get_vara_long, NF_GET_VARA_INT1, nf_get_vara_int1,
+	    NCID, VARID, COORDS, COUNTS, PINT1VARV)
+#endif
+
+
+/*
+ * Write values from a FORTRAN INTEGER*2 variable array.
+ */
+#if NF_INT2_IS_C_SHORT
+FCALLSCFUN5(NF_INT, nc_put_vara_short, NF_PUT_VARA_INT2, nf_put_vara_int2,
+	    NCID, VARID, COORDS, COUNTS, INT2VARV)
+#elif NF_INT2_IS_C_INT
+FCALLSCFUN5(NF_INT, nc_put_vara_int, NF_PUT_VARA_INT2, nf_put_vara_int2,
+	    NCID, VARID, COORDS, COUNTS, INT2VARV)
+#elif NF_INT2_IS_C_LONG
+FCALLSCFUN5(NF_INT, nc_put_vara_long, NF_PUT_VARA_INT2, nf_put_vara_int2,
+	    NCID, VARID, COORDS, COUNTS, INT2VARV)
+#endif
+
+
+/*
+ * Read values into a FORTRAN INTEGER*2 variable array.
+ */
+#if NF_INT2_IS_C_SHORT
+FCALLSCFUN5(NF_INT, nc_get_vara_short, NF_GET_VARA_INT2, nf_get_vara_int2,
+	    NCID, VARID, COORDS, COUNTS, PINT2VARV)
+#elif NF_INT2_IS_C_INT
+FCALLSCFUN5(NF_INT, nc_get_vara_int, NF_GET_VARA_INT2, nf_get_vara_int2,
+	    NCID, VARID, COORDS, COUNTS, PINT2VARV)
+#elif NF_INT2_IS_C_LONG
+FCALLSCFUN5(NF_INT, nc_get_vara_long, NF_GET_VARA_INT2, nf_get_vara_int2,
+	    NCID, VARID, COORDS, COUNTS, PINT2VARV)
+#endif
+
+
+/*
+ * Write values from a FORTRAN INTEGER variable array.
+ */
+#if NF_INT_IS_C_INT
+FCALLSCFUN5(NF_INT, nc_put_vara_int, NF_PUT_VARA_INT, nf_put_vara_int,
+	    NCID, VARID, COORDS, COUNTS, INTVARV)
+#elif NF_INT_IS_C_LONG
+FCALLSCFUN5(NF_INT, nc_put_vara_long, NF_PUT_VARA_INT, nf_put_vara_int,
+	    NCID, VARID, COORDS, COUNTS, INTVARV)
+#endif
+
+
+/*
+ * Read values into a FORTRAN INTEGER variable array.
+ */
+#if NF_INT_IS_C_INT
+FCALLSCFUN5(NF_INT, nc_get_vara_int, NF_GET_VARA_INT, nf_get_vara_int,
+	    NCID, VARID, COORDS, COUNTS, PINTVARV)
+#elif NF_INT_IS_C_LONG
+FCALLSCFUN5(NF_INT, nc_get_vara_long, NF_GET_VARA_INT, nf_get_vara_int,
+	    NCID, VARID, COORDS, COUNTS, PINTVARV)
+#endif
+
+
+/*
+ * Write values from a FORTRAN REAL variable array.
+ */
+#if NF_REAL_IS_C_DOUBLE
+FCALLSCFUN5(NF_INT, nc_put_vara_double, NF_PUT_VARA_REAL, nf_put_vara_real,
+	    NCID, VARID, COORDS, COUNTS, DOUBLEVARV)
+#else
+FCALLSCFUN5(NF_INT, nc_put_vara_float, NF_PUT_VARA_REAL, nf_put_vara_real,
+	    NCID, VARID, COORDS, COUNTS, REALVARV)
+#endif
+
+
+/*
+ * Read values into a FORTRAN REAL variable array.
+ */
+#if NF_REAL_IS_C_DOUBLE
+FCALLSCFUN5(NF_INT, nc_get_vara_double, NF_GET_VARA_REAL, nf_get_vara_real,
+	    NCID, VARID, COORDS, COUNTS, PDOUBLEVARV)
+#else
+FCALLSCFUN5(NF_INT, nc_get_vara_float, NF_GET_VARA_REAL, nf_get_vara_real,
+	    NCID, VARID, COORDS, COUNTS, PREALVARV)
+#endif
+
+
+/*
+ * Write values from a FORTRAN DOUBLEPRECISION variable array.
+ */
+FCALLSCFUN5(NF_INT, nc_put_vara_double, NF_PUT_VARA_DOUBLE, nf_put_vara_double,
+	    NCID, VARID, COORDS, COUNTS, DOUBLEVARV)
+
+
+/*
+ * Read values into a FORTRAN DOUBLEPRECISION variable array.
+ */
+FCALLSCFUN5(NF_INT, nc_get_vara_double, NF_GET_VARA_DOUBLE, nf_get_vara_double,
+	    NCID, VARID, COORDS, COUNTS, PDOUBLEVARV)
+
+FCALLSCFUN5(NF_INT, nc_put_vara, NF_PUT_VARA, nf_put_vara,
+	    NCID, VARID, COORDS, COUNTS, PVOID)
+
+FCALLSCFUN5(NF_INT, nc_get_vara, NF_GET_VARA, nf_get_vara,
+	    NCID, VARID, COORDS, COUNTS, PVOID)
diff --git a/libsrc/fort-vario.c b/libsrc/fort-vario.c
new file mode 100644
index 0000000..14e2090
--- /dev/null
+++ b/libsrc/fort-vario.c
@@ -0,0 +1,168 @@
+/*
+This file is part of the netCDF Fortran 77 API.
+
+This file handles the netCDF var functions.
+
+Copyright 2006, University Corporation for Atmospheric Research. See
+the COPYRIGHT file for copying and redistribution conditions.
+
+$Id: fort-vario.c,v 1.15 2008/03/21 15:49:16 dmh Exp $
+*/
+
+#include <config.h>
+#include "netcdf.h"
+#include "nfconfig.inc"
+#include "ncfortran.h"
+#include "fort-lib.h"
+
+
+/*
+ * Write an entire variable from a FORTRAN CHARACTER*(*) variable.
+ */
+FCALLSCFUN3(NF_INT, nc_put_var_text, NF_PUT_VAR_TEXT, nf_put_var_text,
+	    NCID, VARID, CBUF)
+
+
+/*
+ * Read an entire variable into a FORTRAN CHARACTER*(*) variable.
+ */
+FCALLSCFUN3(NF_INT, nc_get_var_text, NF_GET_VAR_TEXT, nf_get_var_text,
+	    NCID, VARID, CBUF)
+
+
+/*
+ * Write an entire variable from a FORTRAN INTEGER*1 variable.
+ */
+#if NF_INT1_IS_C_SIGNED_CHAR
+FCALLSCFUN3(NF_INT, nc_put_var_schar, NF_PUT_VAR_INT1, nf_put_var_int1,
+	    NCID, VARID, INT1VAR)
+#elif NF_INT1_IS_C_SHORT
+FCALLSCFUN3(NF_INT, nc_put_var_short, NF_PUT_VAR_INT1, nf_put_var_int1,
+	    NCID, VARID, INT1VAR)
+#elif NF_INT1_IS_C_INT
+FCALLSCFUN3(NF_INT, nc_put_var_int, NF_PUT_VAR_INT1, nf_put_var_int1,
+	    NCID, VARID, INT1VAR)
+#elif NF_INT1_IS_C_LONG
+FCALLSCFUN3(NF_INT, nc_put_var_long, NF_PUT_VAR_INT1, nf_put_var_int1,
+	    NCID, VARID, INT1VAR)
+#endif
+
+
+/*
+ * Read an entire variable into a FORTRAN INTEGER*1 variable.
+ */
+#if NF_INT1_IS_C_SIGNED_CHAR
+FCALLSCFUN3(NF_INT, nc_get_var_schar, NF_GET_VAR_INT1, nf_get_var_int1,
+	    NCID, VARID, PINT1VAR)
+#elif NF_INT1_IS_C_SHORT
+FCALLSCFUN3(NF_INT, nc_get_var_short, NF_GET_VAR_INT1, nf_get_var_int1,
+	    NCID, VARID, PINT1VAR)
+#elif NF_INT1_IS_C_INT
+FCALLSCFUN3(NF_INT, nc_get_var_int, NF_GET_VAR_INT1, nf_get_var_int1,
+	    NCID, VARID, PINT1VAR)
+#elif NF_INT1_IS_C_LONG
+FCALLSCFUN3(NF_INT, nc_get_var_long, NF_GET_VAR_INT1, nf_get_var_int1,
+	    NCID, VARID, PINT1VAR)
+#endif
+
+
+/*
+ * Write an entire variable from a FORTRAN INTEGER*2 variable.
+ */
+#if NF_INT2_IS_C_SHORT
+FCALLSCFUN3(NF_INT, nc_put_var_short, NF_PUT_VAR_INT2, nf_put_var_int2,
+	    NCID, VARID, INT2VAR)
+#elif NF_INT2_IS_C_INT
+FCALLSCFUN3(NF_INT, nc_put_var_int, NF_PUT_VAR_INT2, nf_put_var_int2,
+	    NCID, VARID, INT2VAR)
+#elif NF_INT2_IS_C_LONG
+FCALLSCFUN3(NF_INT, nc_put_var_long, NF_PUT_VAR_INT2, nf_put_var_int2,
+	    NCID, VARID, INT2VAR)
+#endif
+
+
+/*
+ * Read an entire variable into a FORTRAN INTEGER*2 variable.
+ */
+#if NF_INT2_IS_C_SHORT
+FCALLSCFUN3(NF_INT, nc_get_var_short, NF_GET_VAR_INT2, nf_get_var_int2,
+	    NCID, VARID, PINT2VAR)
+#elif NF_INT2_IS_C_INT
+FCALLSCFUN3(NF_INT, nc_get_var_int, NF_GET_VAR_INT2, nf_get_var_int2,
+	    NCID, VARID, PINT2VAR)
+#elif NF_INT2_IS_C_LONG
+FCALLSCFUN3(NF_INT, nc_get_var_long, NF_GET_VAR_INT2, nf_get_var_int2,
+	    NCID, VARID, PINT2VAR)
+#endif
+
+
+/*
+ * Write an entire variable from a FORTRAN INTEGER variable.
+ */
+#if NF_INT_IS_C_INT
+FCALLSCFUN3(NF_INT, nc_put_var_int, NF_PUT_VAR_INT, nf_put_var_int,
+	    NCID, VARID, INTVAR)
+#elif NF_INT_IS_C_LONG
+FCALLSCFUN3(NF_INT, nc_put_var_long, NF_PUT_VAR_INT, nf_put_var_int,
+	    NCID, VARID, INTVAR)
+#endif
+
+
+/*
+ * Read an entire variable into a FORTRAN INTEGER variable.
+ */
+#if NF_INT_IS_C_INT
+FCALLSCFUN3(NF_INT, nc_get_var_int, NF_GET_VAR_INT, nf_get_var_int,
+	    NCID, VARID, PINTVAR)
+#elif NF_INT_IS_C_LONG
+FCALLSCFUN3(NF_INT, nc_get_var_long, NF_GET_VAR_INT, nf_get_var_int,
+	    NCID, VARID, PINTVAR)
+#endif
+
+
+/*
+ * Write an entire variable from a FORTRAN REAL variable.
+ */
+#if NF_REAL_IS_C_DOUBLE
+FCALLSCFUN3(NF_INT, nc_put_var_double, NF_PUT_VAR_REAL, nf_put_var_real,
+	    NCID, VARID, DOUBLEVAR)
+#else
+FCALLSCFUN3(NF_INT, nc_put_var_float, NF_PUT_VAR_REAL, nf_put_var_real,
+	    NCID, VARID, REALVAR)
+#endif
+
+
+/*
+ * Read an entire variable into a FORTRAN REAL variable.
+ */
+#if NF_REAL_IS_C_DOUBLE
+FCALLSCFUN3(NF_INT, nc_get_var_double, NF_GET_VAR_REAL, nf_get_var_real,
+	    NCID, VARID, PDOUBLEVAR)
+#else
+FCALLSCFUN3(NF_INT, nc_get_var_float, NF_GET_VAR_REAL, nf_get_var_real,
+	    NCID, VARID, PREALVAR)
+#endif
+
+
+/*
+ * Write an entire variable from a FORTRAN DOUBLEPRECISION variable.
+ */
+FCALLSCFUN3(NF_INT, nc_put_var_double, NF_PUT_VAR_DOUBLE, nf_put_var_double,
+	    NCID, VARID, DOUBLEVAR)
+
+
+/*
+ * Read an entire variable into a FORTRAN DOUBLEPRECISION variable.
+ */
+FCALLSCFUN3(NF_INT, nc_get_var_double, NF_GET_VAR_DOUBLE, nf_get_var_double,
+	    NCID, VARID, PDOUBLEVAR)
+
+/* Apparently only defined for netcdf-4 */
+#ifdef USE_NETCDF4
+
+/* Handle any type. */
+FCALLSCFUN3(NF_INT, nc_put_var, NF_PUT_VAR, nf_put_var, NCID, VARID, PVOID)
+
+/* Handle any type. */
+FCALLSCFUN3(NF_INT, nc_get_var, NF_GET_VAR, nf_get_var, NCID, VARID, PVOID)
+#endif
diff --git a/libsrc/fort-varmio.c b/libsrc/fort-varmio.c
new file mode 100644
index 0000000..b47308f
--- /dev/null
+++ b/libsrc/fort-varmio.c
@@ -0,0 +1,158 @@
+/*
+This file is part of the netCDF Fortran 77 API.
+
+This file handles the netCDF varm functions.
+
+Copyright 2006, University Corporation for Atmospheric Research. See
+the COPYRIGHT file for copying and redistribution conditions.
+
+$Id: fort-varmio.c,v 1.9 2006/08/16 03:55:12 ed Exp $
+*/
+
+#include <config.h>
+#include "netcdf.h"
+#include "nfconfig.inc"
+#include "ncfortran.h"
+#include "fort-lib.h"
+
+
+/*
+ * Write values from a FORTRAN CHARACTER*(*) variable.
+ */
+FCALLSCFUN7(NF_INT, nc_put_varm_text, NF_PUT_VARM_TEXT, nf_put_varm_text,
+	    NCID, VARID, COORDS, COUNTS, STRIDES, MAPS, CBUF)
+
+
+/*
+ * Read values into a FORTRAN CHARACTER*(*) variable.
+ */
+FCALLSCFUN7(NF_INT, nc_get_varm_text, NF_GET_VARM_TEXT, nf_get_varm_text,
+	    NCID, VARID, COORDS, COUNTS, STRIDES, MAPS, CBUF)
+
+
+/*
+ * Write values from a FORTRAN INTEGER*1 variable array.
+ */
+#if NF_INT1_IS_C_SIGNED_CHAR
+FCALLSCFUN7(NF_INT, nc_put_varm_schar, NF_PUT_VARM_INT1, nf_put_varm_int1,
+	    NCID, VARID, COORDS, COUNTS, STRIDES, MAPS, INT1VARV)
+#elif NF_INT1_IS_C_SHORT
+FCALLSCFUN7(NF_INT, nc_put_varm_short, NF_PUT_VARM_INT1, nf_put_varm_int1,
+	    NCID, VARID, COORDS, COUNTS, STRIDES, MAPS, INT1VARV)
+#elif NF_INT1_IS_C_INT
+FCALLSCFUN7(NF_INT, nc_put_varm_int, NF_PUT_VARM_INT1, nf_put_varm_int1,
+	    NCID, VARID, COORDS, COUNTS, STRIDES, MAPS, INT1VARV)
+#elif NF_INT1_IS_C_LONG
+FCALLSCFUN7(NF_INT, nc_put_varm_long, NF_PUT_VARM_INT1, nf_put_varm_int1,
+	    NCID, VARID, COORDS, COUNTS, STRIDES, MAPS, INT1VARV)
+#endif
+
+
+/*
+ * Read values into a FORTRAN INTEGER*1 variable array.
+ */
+#if NF_INT1_IS_C_SIGNED_CHAR
+FCALLSCFUN7(NF_INT, nc_get_varm_schar, NF_GET_VARM_INT1, nf_get_varm_int1,
+	    NCID, VARID, COORDS, COUNTS, STRIDES, MAPS, PINT1VARV)
+#elif NF_INT1_IS_C_SHORT
+FCALLSCFUN7(NF_INT, nc_get_varm_short, NF_GET_VARM_INT1, nf_get_varm_int1,
+	    NCID, VARID, COORDS, COUNTS, STRIDES, MAPS, PINT1VARV)
+#elif NF_INT1_IS_C_INT
+FCALLSCFUN7(NF_INT, nc_get_varm_int, NF_GET_VARM_INT1, nf_get_varm_int1,
+	    NCID, VARID, COORDS, COUNTS, STRIDES, MAPS, PINT1VARV)
+#elif NF_INT1_IS_C_LONG
+FCALLSCFUN7(NF_INT, nc_get_varm_long, NF_GET_VARM_INT1, nf_get_varm_int1,
+	    NCID, VARID, COORDS, COUNTS, STRIDES, MAPS, PINT1VARV)
+#endif
+
+
+/*
+ * Write values from a FORTRAN INTEGER*2 variable array.
+ */
+#if NF_INT2_IS_C_SHORT
+FCALLSCFUN7(NF_INT, nc_put_varm_short, NF_PUT_VARM_INT2, nf_put_varm_int2,
+	    NCID, VARID, COORDS, COUNTS, STRIDES, MAPS, INT2VARV)
+#elif NF_INT2_IS_C_INT
+FCALLSCFUN7(NF_INT, nc_put_varm_int, NF_PUT_VARM_INT2, nf_put_varm_int2,
+	    NCID, VARID, COORDS, COUNTS, STRIDES, MAPS, INT2VARV)
+#elif NF_INT2_IS_C_LONG
+FCALLSCFUN7(NF_INT, nc_put_varm_long, NF_PUT_VARM_INT2, nf_put_varm_int2,
+	    NCID, VARID, COORDS, COUNTS, STRIDES, MAPS, INT2VARV)
+#endif
+
+
+/*
+ * Read values into a FORTRAN INTEGER*2 variable array.
+ */
+#if NF_INT2_IS_C_SHORT
+FCALLSCFUN7(NF_INT, nc_get_varm_short, NF_GET_VARM_INT2, nf_get_varm_int2,
+	    NCID, VARID, COORDS, COUNTS, STRIDES, MAPS, PINT2VARV)
+#elif NF_INT2_IS_C_INT
+FCALLSCFUN7(NF_INT, nc_get_varm_int, NF_GET_VARM_INT2, nf_get_varm_int2,
+	    NCID, VARID, COORDS, COUNTS, STRIDES, MAPS, PINT2VARV)
+#elif NF_INT2_IS_C_LONG
+FCALLSCFUN7(NF_INT, nc_get_varm_long, NF_GET_VARM_INT2, nf_get_varm_int2,
+	    NCID, VARID, COORDS, COUNTS, STRIDES, MAPS, PINT2VARV)
+#endif
+
+
+/*
+ * Write values from a FORTRAN INTEGER variable array.
+ */
+#if NF_INT_IS_C_INT
+FCALLSCFUN7(NF_INT, nc_put_varm_int, NF_PUT_VARM_INT, nf_put_varm_int,
+	    NCID, VARID, COORDS, COUNTS, STRIDES, MAPS, INTVARV)
+#elif NF_INT_IS_C_LONG
+FCALLSCFUN7(NF_INT, nc_put_varm_long, NF_PUT_VARM_INT, nf_put_varm_int,
+	    NCID, VARID, COORDS, COUNTS, STRIDES, MAPS, INTVARV)
+#endif
+
+
+/*
+ * Read values into a FORTRAN INTEGER variable array.
+ */
+#if NF_INT_IS_C_INT
+FCALLSCFUN7(NF_INT, nc_get_varm_int, NF_GET_VARM_INT, nf_get_varm_int,
+	    NCID, VARID, COORDS, COUNTS, STRIDES, MAPS, PINTVARV)
+#elif NF_INT_IS_C_LONG
+FCALLSCFUN7(NF_INT, nc_get_varm_long, NF_GET_VARM_INT, nf_get_varm_int,
+	    NCID, VARID, COORDS, COUNTS, STRIDES, MAPS, PINTVARV)
+#endif
+
+
+/*
+ * Write values from a FORTRAN REAL variable array.
+ */
+#if NF_REAL_IS_C_DOUBLE
+FCALLSCFUN7(NF_INT, nc_put_varm_double, NF_PUT_VARM_REAL, nf_put_varm_real,
+	    NCID, VARID, COORDS, COUNTS, STRIDES, MAPS, DOUBLEVARV)
+#else
+FCALLSCFUN7(NF_INT, nc_put_varm_float, NF_PUT_VARM_REAL, nf_put_varm_real,
+	    NCID, VARID, COORDS, COUNTS, STRIDES, MAPS, REALVARV)
+#endif
+
+
+/*
+ * Read values into a FORTRAN REAL variable array.
+ */
+#if NF_REAL_IS_C_DOUBLE
+FCALLSCFUN7(NF_INT, nc_get_varm_double, NF_GET_VARM_REAL, nf_get_varm_real,
+	    NCID, VARID, COORDS, COUNTS, STRIDES, MAPS, PDOUBLEVARV)
+#else
+FCALLSCFUN7(NF_INT, nc_get_varm_float, NF_GET_VARM_REAL, nf_get_varm_real,
+	    NCID, VARID, COORDS, COUNTS, STRIDES, MAPS, PREALVARV)
+#endif
+
+
+/*
+ * Write values from a FORTRAN DOUBLEPRECISION variable array.
+ */
+FCALLSCFUN7(NF_INT, nc_put_varm_double, NF_PUT_VARM_DOUBLE, nf_put_varm_double,
+	    NCID, VARID, COORDS, COUNTS, STRIDES, MAPS, DOUBLEVARV)
+
+
+/*
+ * Read values into a FORTRAN DOUBLEPRECISION variable array.
+ */
+FCALLSCFUN7(NF_INT, nc_get_varm_double, NF_GET_VARM_DOUBLE, nf_get_varm_double,
+	    NCID, VARID, COORDS, COUNTS, STRIDES, MAPS, PDOUBLEVARV)
diff --git a/libsrc/fort-varsio.c b/libsrc/fort-varsio.c
new file mode 100644
index 0000000..0db3992
--- /dev/null
+++ b/libsrc/fort-varsio.c
@@ -0,0 +1,167 @@
+/*
+This file is part of the netCDF Fortran 77 API.
+
+This file handles the netCDF vars functions.
+
+Copyright 2006, University Corporation for Atmospheric Research. See
+the COPYRIGHT file for copying and redistribution conditions.
+
+$Id: fort-varsio.c,v 1.10 2008/02/25 17:24:24 ed Exp $
+*/
+
+#include <config.h>
+#include "netcdf.h"
+#include "nfconfig.inc"
+#include "ncfortran.h"
+#include "fort-lib.h"
+
+
+/*
+ * Write values from a FORTRAN CHARACTER*(*) variable.
+ */
+FCALLSCFUN6(NF_INT, nc_put_vars_text, NF_PUT_VARS_TEXT, nf_put_vars_text,
+	    NCID, VARID, COORDS, COUNTS, STRIDES, CBUF)
+
+
+/*
+ * Read values into a FORTRAN CHARACTER*(*) variable.
+ */
+FCALLSCFUN6(NF_INT, nc_get_vars_text, NF_GET_VARS_TEXT, nf_get_vars_text,
+	    NCID, VARID, COORDS, COUNTS, STRIDES, CBUF)
+
+
+/*
+ * Write values from a FORTRAN INTEGER*1 variable array.
+ */
+#if NF_INT1_IS_C_SIGNED_CHAR
+FCALLSCFUN6(NF_INT, nc_put_vars_schar, NF_PUT_VARS_INT1, nf_put_vars_int1,
+	    NCID, VARID, COORDS, COUNTS, STRIDES, INT1VARV)
+#elif NF_INT1_IS_C_SHORT
+FCALLSCFUN6(NF_INT, nc_put_vars_short, NF_PUT_VARS_INT1, nf_put_vars_int1,
+	    NCID, VARID, COORDS, COUNTS, STRIDES, INT1VARV)
+#elif NF_INT1_IS_C_INT
+FCALLSCFUN6(NF_INT, nc_put_vars_int, NF_PUT_VARS_INT1, nf_put_vars_int1,
+	    NCID, VARID, COORDS, COUNTS, STRIDES, INT1VARV)
+#elif NF_INT1_IS_C_LONG
+FCALLSCFUN6(NF_INT, nc_put_vars_long, NF_PUT_VARS_INT1, nf_put_vars_int1,
+	    NCID, VARID, COORDS, COUNTS, STRIDES, INT1VARV)
+#endif
+
+
+/*
+ * Read values into a FORTRAN INTEGER*1 variable array.
+ */
+#if NF_INT1_IS_C_SIGNED_CHAR
+FCALLSCFUN6(NF_INT, nc_get_vars_schar, NF_GET_VARS_INT1, nf_get_vars_int1,
+	    NCID, VARID, COORDS, COUNTS, STRIDES, PINT1VARV)
+#elif NF_INT1_IS_C_SHORT
+FCALLSCFUN6(NF_INT, nc_get_vars_short, NF_GET_VARS_INT1, nf_get_vars_int1,
+	    NCID, VARID, COORDS, COUNTS, STRIDES, PINT1VARV)
+#elif NF_INT1_IS_C_INT
+FCALLSCFUN6(NF_INT, nc_get_vars_int, NF_GET_VARS_INT1, nf_get_vars_int1,
+	    NCID, VARID, COORDS, COUNTS, STRIDES, PINT1VARV)
+#elif NF_INT1_IS_C_LONG
+FCALLSCFUN6(NF_INT, nc_get_vars_long, NF_GET_VARS_INT1, nf_get_vars_int1,
+	    NCID, VARID, COORDS, COUNTS, STRIDES, PINT1VARV)
+#endif
+
+
+/*
+ * Write values from a FORTRAN INTEGER*2 variable array.
+ */
+#if NF_INT2_IS_C_SHORT
+FCALLSCFUN6(NF_INT, nc_put_vars_short, NF_PUT_VARS_INT2, nf_put_vars_int2,
+	    NCID, VARID, COORDS, COUNTS, STRIDES, INT2VARV)
+#elif NF_INT2_IS_C_INT
+FCALLSCFUN6(NF_INT, nc_put_vars_int, NF_PUT_VARS_INT2, nf_put_vars_int2,
+	    NCID, VARID, COORDS, COUNTS, STRIDES, INT2VARV)
+#elif NF_INT2_IS_C_LONG
+FCALLSCFUN6(NF_INT, nc_put_vars_long, NF_PUT_VARS_INT2, nf_put_vars_int2,
+	    NCID, VARID, COORDS, COUNTS, STRIDES, INT2VARV)
+#endif
+
+
+/*
+ * Read values into a FORTRAN INTEGER*2 variable array.
+ */
+#if NF_INT2_IS_C_SHORT
+FCALLSCFUN6(NF_INT, nc_get_vars_short, NF_GET_VARS_INT2, nf_get_vars_int2,
+	    NCID, VARID, COORDS, COUNTS, STRIDES, PINT2VARV)
+#elif NF_INT2_IS_C_INT
+FCALLSCFUN6(NF_INT, nc_get_vars_int, NF_GET_VARS_INT2, nf_get_vars_int2,
+	    NCID, VARID, COORDS, COUNTS, STRIDES, PINT2VARV)
+#elif NF_INT2_IS_C_LONG
+FCALLSCFUN6(NF_INT, nc_get_vars_long, NF_GET_VARS_INT2, nf_get_vars_int2,
+	    NCID, VARID, COORDS, COUNTS, STRIDES, PINT2VARV)
+#endif
+
+
+/*
+ * Write values from a FORTRAN INTEGER variable array.
+ */
+#if NF_INT_IS_C_INT
+FCALLSCFUN6(NF_INT, nc_put_vars_int, NF_PUT_VARS_INT, nf_put_vars_int,
+	    NCID, VARID, COORDS, COUNTS, STRIDES, INTVARV)
+#elif NF_INT_IS_C_LONG
+FCALLSCFUN6(NF_INT, nc_put_vars_long, NF_PUT_VARS_INT, nf_put_vars_int,
+	    NCID, VARID, COORDS, COUNTS, STRIDES, INTVARV)
+#endif
+
+
+/*
+ * Read values into a FORTRAN INTEGER variable array.
+ */
+#if NF_INT_IS_C_INT
+FCALLSCFUN6(NF_INT, nc_get_vars_int, NF_GET_VARS_INT, nf_get_vars_int,
+	    NCID, VARID, COORDS, COUNTS, STRIDES, PINTVARV)
+#elif NF_INT_IS_C_LONG
+FCALLSCFUN6(NF_INT, nc_get_vars_long, NF_GET_VARS_INT, nf_get_vars_int,
+	    NCID, VARID, COORDS, COUNTS, STRIDES, PINTVARV)
+#endif
+
+
+/*
+ * Write values from a FORTRAN REAL variable array.
+ */
+#if NF_REAL_IS_C_DOUBLE
+FCALLSCFUN6(NF_INT, nc_put_vars_double, NF_PUT_VARS_REAL, nf_put_vars_real,
+	    NCID, VARID, COORDS, COUNTS, STRIDES, DOUBLEVARV)
+#else
+FCALLSCFUN6(NF_INT, nc_put_vars_float, NF_PUT_VARS_REAL, nf_put_vars_real,
+	    NCID, VARID, COORDS, COUNTS, STRIDES, REALVARV)
+#endif
+
+
+/*
+ * Read values into a FORTRAN REAL variable array.
+ */
+#if NF_REAL_IS_C_DOUBLE
+FCALLSCFUN6(NF_INT, nc_get_vars_double, NF_GET_VARS_REAL, nf_get_vars_real,
+	    NCID, VARID, COORDS, COUNTS, STRIDES, PDOUBLEVARV)
+#else
+FCALLSCFUN6(NF_INT, nc_get_vars_float, NF_GET_VARS_REAL, nf_get_vars_real,
+	    NCID, VARID, COORDS, COUNTS, STRIDES, PREALVARV)
+#endif
+
+
+/*
+ * Write values from a FORTRAN DOUBLEPRECISION variable array.
+ */
+FCALLSCFUN6(NF_INT, nc_put_vars_double, NF_PUT_VARS_DOUBLE, nf_put_vars_double,
+	    NCID, VARID, COORDS, COUNTS, STRIDES, DOUBLEVARV)
+
+
+/*
+ * Read values into a FORTRAN DOUBLEPRECISION variable array.
+ */
+FCALLSCFUN6(NF_INT, nc_get_vars_double, NF_GET_VARS_DOUBLE, nf_get_vars_double,
+	    NCID, VARID, COORDS, COUNTS, STRIDES, PDOUBLEVARV)
+
+FCALLSCFUN6(NF_INT, nc_put_vars, NF_PUT_VARS, nf_put_vars,
+	    NCID, VARID, COORDS, COUNTS, STRIDES, PVOID)
+
+FCALLSCFUN6(NF_INT, nc_get_vars, NF_GET_VARS, nf_get_vars,
+	    NCID, VARID, COORDS, COUNTS, STRIDES, PVOID)
+
+
+
diff --git a/libsrc/ncfortran.h b/libsrc/ncfortran.h
new file mode 100644
index 0000000..d86f28c
--- /dev/null
+++ b/libsrc/ncfortran.h
@@ -0,0 +1,896 @@
+/*
+ * This file contains `cfortran.h' definitions that are specific to the
+ * netCDF-3 package.
+ */
+
+
+#ifndef UD_NCFORTRAN_H
+#define UD_NCFORTRAN_H
+
+#include "netcdf_f.h"
+#include "cfortran.h"
+#include "nfconfig.inc"
+
+/*
+ * The type of a Fortran INTEGER:
+ */
+#if NF_INT_IS_C_INT
+#   define	NF_INTEGER	int
+#   define	NF_INT		INT
+#elif NF_INT_IS_C_LONG
+#   define	NF_INTEGER	long
+#   define	NF_INT		LONG
+#else
+#   include "NF_INT_IS_C_... not defined"
+#endif
+
+/*
+ * Input, Fortran INTEGER converted to C "int" (helper macro):
+ */
+#define FINT2CINT_cfINT(N,A,B,X,Y,Z)	SIMPLE_cfINT(N,A,B,X,Y,Z)
+#define FINT2CINT_cfSEP(T,  B)		SIMPLE_cfSEP(T,B)
+#define FINT2CINT_cfN(  T,A)		const NF_INTEGER *A
+#define FINT2CINT_cfSTR(N,T,A,B,C,D,E)	SIMPLE_cfSTR(N,T,A,B,C,D,E)
+#define FINT2CINT_cfT(M,I,A,B,D)	(int)*A
+
+
+/*
+ * Input, Fortran INTEGER converted to C "size_t":
+ */
+#define FINT2CSIZET_cfINT(N,A,B,X,Y,Z)		SIMPLE_cfINT(N,A,B,X,Y,Z)
+#define FINT2CSIZET_cfSEP(T,  B)		SIMPLE_cfSEP(T,B)
+#define FINT2CSIZET_cfN(  T,A)			const NF_INTEGER *A
+#define FINT2CSIZET_cfSTR(N,T,A,B,C,D,E)	SIMPLE_cfSTR(N,T,A,B,C,D,E)
+#define FINT2CSIZET_cfT(M,I,A,B,D)		(size_t)*A
+
+
+/*
+ * Input/Output, I/O size hint:
+ */
+#define PCHUNKSIZEHINT_cfINT(N,A,B,X,Y,Z)	PDOUBLE_cfINT(N,A,B,X,Y,Z)
+#define PCHUNKSIZEHINT_cfTYPE		NF_INTEGER
+#define PCHUNKSIZEHINT_cfSTR(N,T,A,B,C,D,E)	\
+					_(CFARGS,N)(T,PCHUNKSIZEHINT,A,B,C,D,E)
+#define PCHUNKSIZEHINT_cfH(S,U,B)
+#define PCHUNKSIZEHINT_cfQ(B)		size_t B;
+#define PCHUNKSIZEHINT_cfT(M,I,A,B,D)	((void*)(B=*A), &B)
+#define PCHUNKSIZEHINT_cfR(A,B,D)	*A=B;
+
+
+/*
+ * Output, C "int" converted to Fortran INTEGER (helper macro):
+ */
+#define PCINT2FINT_cfINT(N,A,B,X,Y,Z)	PDOUBLE_cfINT(N,A,B,X,Y,Z)
+#define PCINT2FINT_cfTYPE		NF_INTEGER
+#define PCINT2FINT_cfSTR(N,T,A,B,C,D,E)	_(CFARGS,N)(T,PCINT2FINT,A,B,C,D,E)
+#define PCINT2FINT_cfH(S,U,B)
+#define PCINT2FINT_cfQ(B)		int B;
+#define PCINT2FINT_cfT(M,I,A,B,D)	&B
+#define PCINT2FINT_cfR(A,B,D)		*A=B;
+
+
+/*
+ * Input, Fortran index converted to C index:
+ */
+#define FNDX2CNDX_cfINT(N,A,B,X,Y,Z)	SIMPLE_cfINT(N,A,B,X,Y,Z)
+#define FNDX2CNDX_cfSEP(T,  B)		SIMPLE_cfSEP(T,B)
+#define FNDX2CNDX_cfN(  T,A)		const NF_INTEGER *A
+#define FNDX2CNDX_cfSTR(N,T,A,B,C,D,E)	SIMPLE_cfSTR(N,T,A,B,C,D,E)
+#define FNDX2CNDX_cfT(M,I,A,B,D)	(*A-1)
+
+
+/*
+ * Output, C index converted to Fortran index:
+ */
+#define PCNDX2FNDX_cfINT(N,A,B,X,Y,Z)	PDOUBLE_cfINT(N,A,B,X,Y,Z)
+#define PCNDX2FNDX_cfTYPE		NF_INTEGER
+#define PCNDX2FNDX_cfSTR(N,T,A,B,C,D,E)	_(CFARGS,N)(T,PCNDX2FNDX,A,B,C,D,E)
+#define PCNDX2FNDX_cfH(S,U,B)
+#define PCNDX2FNDX_cfQ(B)		int B;
+#define PCNDX2FNDX_cfT(M,I,A,B,D)	&B
+#define PCNDX2FNDX_cfR(A,B,D)		*A=B+1;
+
+
+/*******************************************************************************
+ * Character buffer:
+ */
+
+#define CBUF_cfINT(N,A,B,X,Y,Z)		STRING_cfINT(N,A,B,X,Y,Z)
+#define CBUF_cfSEP(T,  B)		STRING_cfSEP(T,B)
+#define CBUF_cfN(  T,A)			STRING_cfN(T,A)
+#define CBUF_cfSTR(N,T,A,B,C,D,E)	STRING_cfSTR(N,T,A,B,C,D,E)
+#if defined(vmsFortran)
+#   define CBUF_cfT(M,I,A,B,D)		A->dsc$a_pointer
+#elif defined(CRAYFortran)
+#   define CBUF_cfT(M,I,A,B,D)		_fcdtocp(A)
+#else
+#   define CBUF_cfT(M,I,A,B,D)		A
+#endif
+
+
+/*******************************************************************************
+ * netCDf attributes:
+ */
+
+#define TEXTATT			STRING
+#define PTEXTATT		PSTRING
+
+#define INT1ATT			INT1VARV
+#define PINT1ATT		PINT1VARV
+
+#define INT2ATT			INT2VARV
+#define PINT2ATT		PINT2VARV
+
+#define INTATT			INTVARV
+#define PINTATT			PINTVARV
+
+#define REALATT			REALVARV
+#define PREALATT		PREALVARV
+
+#define DOUBLEATT		DOUBLEVARV
+#define PDOUBLEATT		PDOUBLEVARV
+
+
+/*
+ * Input, attribute ID:
+ */
+#define ATTID	FNDX2CNDX
+
+
+/*
+ * Output, attribute ID:
+ */
+#define PATTID	PCNDX2FNDX
+
+
+/*******************************************************************************
+ * netCDf type:
+ */
+
+
+/*
+ * Input, netCDF type:
+ */
+#define TYPE_cfINT(N,A,B,X,Y,Z)		SIMPLE_cfINT(N,A,B,X,Y,Z)
+#define TYPE_cfSEP(T,  B)		SIMPLE_cfSEP(T,B)
+#define TYPE_cfN(  T,A)			NF_INTEGER *A
+#define TYPE_cfSTR(N,T,A,B,C,D,E)	SIMPLE_cfSTR(N,T,A,B,C,D,E)
+#define TYPE_cfT(M,I,A,B,D)		((nc_type)*A)
+
+
+/*
+ * Output, netCDF type:
+ */
+#define PTYPE_cfINT(N,A,B,X,Y,Z)	PDOUBLE_cfINT(N,A,B,X,Y,Z)
+#define PTYPE_cfTYPE			NF_INTEGER
+#define PTYPE_cfSTR(N,T,A,B,C,D,E)	_(CFARGS,N)(T,PTYPE,A,B,C,D,E)
+#define PTYPE_cfH(S,U,B)
+#define PTYPE_cfQ(B)			nc_type B;
+#define PTYPE_cfT(M,I,A,B,D)		&B
+#define PTYPE_cfR(A,B,D)		*A=B;
+
+
+/*******************************************************************************
+ * netCDf number-of-<whatever>:
+ */
+
+
+/*
+ * Input, number-of-dimensions:
+ */
+#define NDIMS_cfINT(N,A,B,X,Y,Z)	SIMPLE_cfINT(N,A,B,X,Y,Z)
+#define NDIMS_cfSEP(T,  B)		SIMPLE_cfSEP(T,B)
+#define NDIMS_cfN(  T,A)		NF_INTEGER *fndims
+#define NDIMS_cfSTR(N,T,A,B,C,D,E)	SIMPLE_cfSTR(N,T,A,B,C,D,E)
+#define NDIMS_cfT(M,I,A,B,D)		((int)*fndims)
+
+
+/*
+ * Output number-of-dimensions:
+ */
+#define	PNDIMS	PCINT2FINT
+
+
+/*
+ * Input number-of-variables:
+ */
+#define NVARS	FINT2CINT
+
+
+/*
+ * Output number-of-variables:
+ */
+#define	PNVARS	PNDIMS
+
+
+/*
+ * Input number-of-attributes:
+ */
+#define NATTS	FINT2CINT
+
+
+/*
+ * Output number-of-attributes:
+ */
+#define	PNATTS	PNDIMS
+
+/*
+ * Output format version number
+ */
+#define PFORMAT  PNDIMS
+
+
+/*******************************************************************************
+ * netCDf variables:
+ */
+
+
+/*
+ * Input, CHARACTER*(*) variable:
+ */
+#define TEXTVAR			STRING
+
+
+/*
+ * Output, CHARACTER*(*) variable:
+ */
+#define PTEXTVAR		PSTRING
+
+
+/*
+ * Input, CHARACTER*(*) variable array:
+ */
+#define TEXTVARV		STRING
+
+
+/*
+ * Output, CHARACTER*(*) variable array:
+ */
+#define PTEXTVARV		PSTRING
+
+
+/*
+ * Input, INTEGER*1 variable:
+ */
+#define INT1VAR_cfINT(N,A,B,X,Y,Z)	SIMPLE_cfINT(N,A,B,X,Y,Z)
+#define INT1VAR_cfSEP(T,  B)		SIMPLE_cfSEP(T,B)
+#if NF_INT1_IS_C_SIGNED_CHAR
+#   define INT1VAR_cfN(  T,A)		const signed char *A
+#elif NF_INT1_IS_C_SHORT
+#   define INT1VAR_cfN(  T,A)		const short *A
+#elif NF_INT1_IS_C_INT
+#   define INT1VAR_cfN(  T,A)		const int *A
+#elif NF_INT1_IS_C_LONG
+#   define INT1VAR_cfN(  T,A)		const long *A
+#endif
+#define INT1VAR_cfSTR(N,T,A,B,C,D,E)	SIMPLE_cfSTR(N,T,A,B,C,D,E)
+#define INT1VAR_cfT(M,I,A,B,D)		A
+
+
+/*
+ * Output, INTEGER*1 variable:
+ */
+#define PINT1VAR_cfINT(N,A,B,X,Y,Z)	SIMPLE_cfINT(N,A,B,X,Y,Z)
+#define PINT1VAR_cfSEP(T,  B)		SIMPLE_cfSEP(T,B)
+#if NF_INT1_IS_C_SIGNED_CHAR
+#   define PINT1VAR_cfN(  T,A)		signed char *A
+#elif NF_INT1_IS_C_SHORT
+#   define PINT1VAR_cfN(  T,A)		short *A
+#elif NF_INT1_IS_C_INT
+#   define PINT1VAR_cfN(  T,A)		int *A
+#elif NF_INT1_IS_C_LONG
+#   define PINT1VAR_cfN(  T,A)		long *A
+#endif
+#define PINT1VAR_cfSTR(N,T,A,B,C,D,E)	SIMPLE_cfSTR(N,T,A,B,C,D,E)
+#define PINT1VAR_cfT(M,I,A,B,D)		A
+
+
+/*
+ * Input, INTEGER*1 variable array:
+ */
+#define INT1VARV	INT1VAR
+
+
+/*
+ * Output, INTEGER*1 variable array:
+ */
+#define PINT1VARV	PINT1VAR
+
+
+/*
+ * Input, INTEGER*2 variable:
+ */
+#define INT2VAR_cfINT(N,A,B,X,Y,Z)	SIMPLE_cfINT(N,A,B,X,Y,Z)
+#define INT2VAR_cfSEP(T,  B)		SIMPLE_cfSEP(T,B)
+#if NF_INT2_IS_C_SHORT
+#   define INT2VAR_cfN(  T,A)		const short *A
+#elif NF_INT2_IS_C_INT
+#   define INT2VAR_cfN(  T,A)		const int *A
+#elif NF_INT2_IS_C_LONG
+#   define INT2VAR_cfN(  T,A)		const long *A
+#endif
+#define INT2VAR_cfSTR(N,T,A,B,C,D,E)	SIMPLE_cfSTR(N,T,A,B,C,D,E)
+#define INT2VAR_cfT(M,I,A,B,D)		A
+
+
+/*
+ * Output, INTEGER*2 variable:
+ */
+#define PINT2VAR_cfINT(N,A,B,X,Y,Z)	SIMPLE_cfINT(N,A,B,X,Y,Z)
+#define PINT2VAR_cfSEP(T,  B)		SIMPLE_cfSEP(T,B)
+#if NF_INT2_IS_C_SHORT
+#   define PINT2VAR_cfN(  T,A)		short *A
+#elif NF_INT2_IS_C_INT
+#   define PINT2VAR_cfN(  T,A)		int *A
+#elif NF_INT2_IS_C_LONG
+#   define PINT2VAR_cfN(  T,A)		long *A
+#endif
+#define PINT2VAR_cfSTR(N,T,A,B,C,D,E)	SIMPLE_cfSTR(N,T,A,B,C,D,E)
+#define PINT2VAR_cfT(M,I,A,B,D)		A
+
+
+/*
+ * Input, INTEGER*2 variable array:
+ */
+#define INT2VARV		INT2VAR
+
+
+/*
+ * Output, INTEGER*2 variable array:
+ */
+#define PINT2VARV		PINT2VAR
+
+
+/*
+ * Input, INTEGER variable:
+ */
+#define INTVAR_cfINT(N,A,B,X,Y,Z)	SIMPLE_cfINT(N,A,B,X,Y,Z)
+#define INTVAR_cfSEP(T,  B)		SIMPLE_cfSEP(T,B)
+#define INTVAR_cfN(  T,A)		const NF_INTEGER *A
+#define INTVAR_cfSTR(N,T,A,B,C,D,E)	SIMPLE_cfSTR(N,T,A,B,C,D,E)
+#define INTVAR_cfT(M,I,A,B,D)		A
+
+
+/*
+ * Output, INTEGER variable:
+ */
+#define PINTVAR_cfINT(N,A,B,X,Y,Z)	SIMPLE_cfINT(N,A,B,X,Y,Z)
+#define PINTVAR_cfSEP(T,  B)		SIMPLE_cfSEP(T,B)
+#define PINTVAR_cfN(  T,A)		NF_INTEGER *A
+#define PINTVAR_cfSTR(N,T,A,B,C,D,E)	SIMPLE_cfSTR(N,T,A,B,C,D,E)
+#define PINTVAR_cfT(M,I,A,B,D)		A
+
+
+/*
+ * Input, INTEGER variable array:
+ */
+#define INTVARV			INTVAR
+
+
+/*
+ * Output, INTEGER variable array:
+ */
+#define PINTVARV		PINTVAR
+
+
+/*
+ * Input, REAL variable:
+ */
+#define REALVAR_cfINT(N,A,B,X,Y,Z)	SIMPLE_cfINT(N,A,B,X,Y,Z)
+#define REALVAR_cfSEP(T,  B)		SIMPLE_cfSEP(T,B)
+#if NF_REAL_IS_C_DOUBLE
+#   define REALVAR_cfN(  T,A)		const double *A
+#else
+#   define REALVAR_cfN(  T,A)		const float *A
+#endif
+#define REALVAR_cfSTR(N,T,A,B,C,D,E)	SIMPLE_cfSTR(N,T,A,B,C,D,E)
+#define REALVAR_cfT(M,I,A,B,D)		A
+
+
+/*
+ * Output, REAL variable:
+ */
+#define PREALVAR_cfINT(N,A,B,X,Y,Z)	SIMPLE_cfINT(N,A,B,X,Y,Z)
+#define PREALVAR_cfSEP(T,  B)		SIMPLE_cfSEP(T,B)
+#if NF_REAL_IS_C_DOUBLE
+#   define PREALVAR_cfN(  T,A)		double *A
+#else
+#   define PREALVAR_cfN(  T,A)		float *A
+#endif
+#define PREALVAR_cfSTR(N,T,A,B,C,D,E)	SIMPLE_cfSTR(N,T,A,B,C,D,E)
+#define PREALVAR_cfT(M,I,A,B,D)		A
+
+
+/*
+ * Input, REAL variable array:
+ */
+#define REALVARV		REALVAR
+
+
+/*
+ * Output, REAL variable array:
+ */
+#define PREALVARV		PREALVAR
+
+
+/*
+ * Input, DOUBLEPRECISION variable:
+ */
+#define DOUBLEVAR_cfINT(N,A,B,X,Y,Z)	SIMPLE_cfINT(N,A,B,X,Y,Z)
+#define DOUBLEVAR_cfSEP(T,  B)		SIMPLE_cfSEP(T,B)
+#define DOUBLEVAR_cfN(  T,A)		const double *A
+#define DOUBLEVAR_cfSTR(N,T,A,B,C,D,E)	SIMPLE_cfSTR(N,T,A,B,C,D,E)
+#define DOUBLEVAR_cfT(M,I,A,B,D)	A
+
+
+/*
+ * Output, DOUBLEPRECISION variable:
+ */
+#define PDOUBLEVAR_cfINT(N,A,B,X,Y,Z)	SIMPLE_cfINT(N,A,B,X,Y,Z)
+#define PDOUBLEVAR_cfSEP(T,  B)		SIMPLE_cfSEP(T,B)
+#define PDOUBLEVAR_cfN(  T,A)		double *A
+#define PDOUBLEVAR_cfSTR(N,T,A,B,C,D,E)	SIMPLE_cfSTR(N,T,A,B,C,D,E)
+#define PDOUBLEVAR_cfT(M,I,A,B,D)	A
+
+
+/*
+ * Input, DOUBLEPRECISION variable array:
+ */
+#define DOUBLEVARV		DOUBLEVAR
+
+
+/*
+ * Output, DOUBLEPRECISION variable array:
+ */
+#define PDOUBLEVARV		PDOUBLEVAR
+
+
+/*******************************************************************************
+ * Miscellaneious netCDF stuff:
+ */
+
+
+/*
+ * Output, `size_t' variable:
+ */
+#define PSIZET_cfINT(N,A,B,X,Y,Z)	PDOUBLE_cfINT(N,A,B,X,Y,Z)
+#define PSIZET_cfTYPE			NF_INTEGER
+#define PSIZET_cfSTR(N,T,A,B,C,D,E)	_(CFARGS,N)(T,PSIZET,A,B,C,D,E)
+#define PSIZET_cfH(S,U,B)
+#define PSIZET_cfQ(B)			size_t B;
+#define PSIZET_cfT(M,I,A,B,D)		&B
+#define PSIZET_cfR(A,B,D)		*A=B;
+
+
+/*
+ * Input dimension-ID:
+ */
+#define DIMID	FNDX2CNDX
+
+
+/*
+ * Output, dimension-ID:
+ */
+#define PDIMID_cfINT(N,A,B,X,Y,Z)	PDOUBLE_cfINT(N,A,B,X,Y,Z)
+#define PDIMID_cfTYPE			NF_INTEGER
+#define PDIMID_cfSTR(N,T,A,B,C,D,E)	_(CFARGS,N)(T,PDIMID,A,B,C,D,E)
+#define PDIMID_cfH(S,U,B)
+#define PDIMID_cfQ(B)			int B = -1;
+#define PDIMID_cfT(M,I,A,B,D)		&B
+#define PDIMID_cfR(A,B,D)		*A=(B == -1 ? -1 : B+1);
+
+
+/*
+ * Input, dimension-ID vector:
+ */
+#define DIMIDS_cfINT(N,A,B,X,Y,Z)	DOUBLE_cfINT(N,A,B,X,Y,Z)
+#define DIMIDSVVVVVVV_cfTYPE		NF_INTEGER
+#define DIMIDS_cfSTR(N,T,A,B,C,D,E)	_(CFARGS,N)(T,DIMIDS,A,B,C,D,E)
+#define DIMIDS_cfH(S,U,B)
+#define DIMIDS_cfQ(B)			int B[NC_MAX_DIMS];
+#define DIMIDS_cfT(M,I,A,B,D)		f2c_dimids(*fndims, A, B)
+#define DIMIDS_cfR(A,B,D)
+
+
+/*
+ * Output, dimension-ID vector:
+ */
+#define PDIMIDS_cfINT(N,A,B,X,Y,Z)	PDOUBLE_cfINT(N,A,B,X,Y,Z)
+#define PDIMIDS_cfTYPE			NF_INTEGER
+#define PDIMIDS_cfSTR(N,T,A,B,C,D,E)	_(CFARGS,N)(T,PDIMIDS,A,B,C,D,E)
+#define PDIMIDS_cfH(S,U,B)
+#define PDIMIDS_cfQ(B)			int B[NC_MAX_DIMS];
+#define PDIMIDS_cfT(M,I,A,B,D)		B
+#define PDIMIDS_cfR(A,B,D)		c2f_dimids(*fncid, *fvarid-1, B, A);
+
+/*
+ * Input, chunksizes vector:
+ */
+#define CHUNKSIZES_cfINT(N,A,B,X,Y,Z)	        DOUBLE_cfINT(N,A,B,X,Y,Z)
+#define CHUNKSIZESVVVVVVV_cfTYPE		NF_INTEGER
+#define CHUNKSIZES_cfSTR(N,T,A,B,C,D,E)	        _(CFARGS,N)(T,CHUNKSIZES,A,B,C,D,E)
+#define CHUNKSIZES_cfH(S,U,B)
+#define CHUNKSIZES_cfQ(B)			int B[NC_MAX_DIMS];
+#define CHUNKSIZES_cfT(M,I,A,B,D)		f2c_chunksizes(*fncid, *fvarid-1, A, B)
+#define CHUNKSIZES_cfR(A,B,D)
+
+
+/*
+ * Output, chunksizes vector:
+ */
+#define PCHUNKSIZES_cfINT(N,A,B,X,Y,Z)	PDOUBLE_cfINT(N,A,B,X,Y,Z)
+#define PCHUNKSIZES_cfTYPE			NF_INTEGER
+#define PCHUNKSIZES_cfSTR(N,T,A,B,C,D,E)	_(CFARGS,N)(T,PCHUNKSIZES,A,B,C,D,E)
+#define PCHUNKSIZES_cfH(S,U,B)
+#define PCHUNKSIZES_cfQ(B)			int B[NC_MAX_DIMS];
+#define PCHUNKSIZES_cfT(M,I,A,B,D)		B
+#define PCHUNKSIZES_cfR(A,B,D)		c2f_chunksizes(*fncid, *fvarid-1, B, A);
+
+
+/*
+ * Input, netCDF dataset ID:
+ */
+#define NCID_cfINT(N,A,B,X,Y,Z)		SIMPLE_cfINT(N,A,B,X,Y,Z)
+#define NCID_cfSEP(T,  B)		SIMPLE_cfSEP(T,B)
+#define NCID_cfN(  T,A)			NF_INTEGER *fncid
+#define NCID_cfSTR(N,T,A,B,C,D,E)	SIMPLE_cfSTR(N,T,A,B,C,D,E)
+#define NCID_cfT(M,I,A,B,D)		*fncid
+
+
+/*
+ * Two, input, netCDF dataset IDs:
+ */
+#define NCID1	FINT2CINT
+#define NCID2	FINT2CINT
+
+
+/*
+ * Output, netCDF dataset ID:
+ */
+#define PNCID	PCINT2FINT
+
+
+/*
+ * Input, netCDF variable ID:
+ */
+#define VARID_cfINT(N,A,B,X,Y,Z)	SIMPLE_cfINT(N,A,B,X,Y,Z)
+#define VARID_cfSEP(T,  B)		SIMPLE_cfSEP(T,B)
+#define VARID_cfN(  T,A)		NF_INTEGER *fvarid
+#define VARID_cfSTR(N,T,A,B,C,D,E)	SIMPLE_cfSTR(N,T,A,B,C,D,E)
+#define VARID_cfT(M,I,A,B,D)		(*fvarid-1)
+
+
+/*
+ * Two, input, netCDF variable IDs:
+ */
+#define VARID1_cfINT(N,A,B,X,Y,Z)	SIMPLE_cfINT(N,A,B,X,Y,Z)
+#define VARID1_cfSEP(T,  B)		SIMPLE_cfSEP(T,B)
+#define VARID1_cfN(  T,A)		NF_INTEGER *fvarid1
+#define VARID1_cfSTR(N,T,A,B,C,D,E)	SIMPLE_cfSTR(N,T,A,B,C,D,E)
+#define VARID1_cfT(M,I,A,B,D)		(*fvarid1-1)
+
+#define VARID2_cfINT(N,A,B,X,Y,Z)	SIMPLE_cfINT(N,A,B,X,Y,Z)
+#define VARID2_cfSEP(T,  B)		SIMPLE_cfSEP(T,B)
+#define VARID2_cfN(  T,A)		NF_INTEGER *fvarid2
+#define VARID2_cfSTR(N,T,A,B,C,D,E)	SIMPLE_cfSTR(N,T,A,B,C,D,E)
+#define VARID2_cfT(M,I,A,B,D)		(*fvarid2-1)
+
+
+/*
+ * Output, netCDF variable ID:
+ */
+#define PVARID	PCNDX2FNDX
+
+/*
+ * Input, netCDF field index:
+ */
+#define FIELDIDX_cfINT(N,A,B,X,Y,Z)	SIMPLE_cfINT(N,A,B,X,Y,Z)
+#define FIELDIDX_cfSEP(T,  B)		SIMPLE_cfSEP(T,B)
+#define FIELDIDX_cfN(  T,A)		NF_INTEGER *ffieldidx
+#define FIELDIDX_cfSTR(N,T,A,B,C,D,E)	SIMPLE_cfSTR(N,T,A,B,C,D,E)
+#define FIELDIDX_cfT(M,I,A,B,D)		(*ffieldidx-1)
+
+/*
+ * Input, co-ordinate vector:
+ */
+#define COORDS_cfINT(N,A,B,X,Y,Z)	DOUBLE_cfINT(N,A,B,X,Y,Z)
+#define COORDSVVVVVVV_cfTYPE		NF_INTEGER
+#define COORDS_cfSTR(N,T,A,B,C,D,E)	_(CFARGS,N)(T,COORDS,A,B,C,D,E)
+#define COORDS_cfH(S,U,B)
+#define COORDS_cfQ(B)			size_t B[NC_MAX_DIMS];
+#define COORDS_cfT(M,I,A,B,D)		f2c_coords(*fncid, *fvarid-1, A, B)
+#define COORDS_cfR(A,B,D)
+
+
+/*
+ * Input count:
+ */
+#define COUNT_cfINT(N,A,B,X,Y,Z)	SIMPLE_cfINT(N,A,B,X,Y,Z)
+#define COUNT_cfSEP(T,  B)		SIMPLE_cfSEP(T,B)
+#define COUNT_cfN(  T,A)		const NF_INTEGER *A
+#define COUNT_cfSTR(N,T,A,B,C,D,E)	SIMPLE_cfSTR(N,T,A,B,C,D,E)
+#define COUNT_cfT(M,I,A,B,D)		(size_t)*A
+
+
+/*
+ * Output count:
+ */
+#define PCOUNT	PSIZET
+
+
+/*
+ * Input, count vector:
+ */
+#define COUNTS_cfINT(N,A,B,X,Y,Z)	DOUBLE_cfINT(N,A,B,X,Y,Z)
+#define COUNTSVVVVVVV_cfTYPE		NF_INTEGER
+#define COUNTS_cfSTR(N,T,A,B,C,D,E)	_(CFARGS,N)(T,COUNTS,A,B,C,D,E)
+#define COUNTS_cfH(S,U,B)
+#define COUNTS_cfQ(B)			size_t B[NC_MAX_DIMS];
+#define COUNTS_cfT(M,I,A,B,D)		f2c_counts(*fncid, *fvarid-1, A, B)
+#define COUNTS_cfR(A,B,D)
+
+
+/*
+ * Input, stride vector:
+ */
+#define STRIDES_cfINT(N,A,B,X,Y,Z)	DOUBLE_cfINT(N,A,B,X,Y,Z)
+#define STRIDESVVVVVVV_cfTYPE		NF_INTEGER
+#define STRIDES_cfSTR(N,T,A,B,C,D,E)	_(CFARGS,N)(T,STRIDES,A,B,C,D,E)
+#define STRIDES_cfH(S,U,B)
+#define STRIDES_cfQ(B)			ptrdiff_t B[NC_MAX_DIMS];
+#define STRIDES_cfT(M,I,A,B,D)		f2c_strides(*fncid, *fvarid-1, A, B)
+#define STRIDES_cfR(A,B,D)
+
+
+/*
+ * Input, mapping vector:
+ */
+#define MAPS_cfINT(N,A,B,X,Y,Z)		DOUBLE_cfINT(N,A,B,X,Y,Z)
+#define MAPSVVVVVVV_cfTYPE		NF_INTEGER
+#define MAPS_cfSTR(N,T,A,B,C,D,E)	_(CFARGS,N)(T,MAPS,A,B,C,D,E)
+#define MAPS_cfH(S,U,B)
+#define MAPS_cfQ(B)			ptrdiff_t B[NC_MAX_DIMS];
+#define MAPS_cfT(M,I,A,B,D)		f2c_maps(*fncid, *fvarid-1, A, B)
+#define MAPS_cfR(A,B,D)
+
+
+/*******************************************************************************
+ * The following is for f2c-support only.
+ */
+
+#if defined(f2cFortran) && !defined(pgiFortran) && !defined(gFortran)
+
+/*
+ * The f2c(1) utility on BSD/OS and Linux systems adds an additional
+ * underscore suffix (besides the usual one) to global names that have
+ * an embedded underscore.  For example, `nfclose' becomes `nfclose_',
+ * but `nf_close' becomes `nf_close__.  Consequently, we have to modify
+ * some names.
+ */
+#ifdef LOGGING
+#define nf_set_log_level        nf_set_log_level_
+#endif /* LOGGING */
+#define nf_inq_libvers		nf_inq_libvers_
+#define nf_strerror		nf_strerror_
+#define nf_issyserr		nf_issyserr_
+#define nf_create		nf_create_
+#define nf_open			nf_open_
+#define nf_set_fill		nf_set_fill_
+#define nf_set_default_format	nf_set_default_format_
+#define nf_redef		nf_redef_
+#define nf_enddef		nf_enddef_
+#define nf_sync			nf_sync_
+#define nf_abort		nf_abort_
+#define nf_close		nf_close_
+#define nf_delete		nf_delete_
+#define nf_inq			nf_inq_
+#define nf_inq_ndims		nf_inq_ndims_
+#define nf_inq_nvars		nf_inq_nvars_
+#define nf_inq_natts		nf_inq_natts_
+#define nf_inq_unlimdim		nf_inq_unlimdim_
+#define nf_inq_format		nf_inq_format_
+#define nf_def_dim		nf_def_dim_
+#define nf_inq_dimid		nf_inq_dimid_
+#define nf_inq_dim		nf_inq_dim_
+#define nf_inq_dimname		nf_inq_dimname_
+#define nf_inq_dimlen		nf_inq_dimlen_
+#define nf_rename_dim		nf_rename_dim_
+#define nf_inq_att		nf_inq_att_
+#define nf_inq_attid		nf_inq_attid_
+#define nf_inq_atttype		nf_inq_atttype_
+#define nf_inq_attlen		nf_inq_attlen_
+#define nf_inq_attname		nf_inq_attname_
+#define nf_copy_att		nf_copy_att_
+#define nf_rename_att		nf_rename_att_
+#define nf_del_att		nf_del_att_
+#define nf_put_att_text		nf_put_att_text_
+#define nf_get_att_text		nf_get_att_text_
+#define nf_put_att_int1		nf_put_att_int1_
+#define nf_get_att_int1		nf_get_att_int1_
+#define nf_put_att_int2		nf_put_att_int2_
+#define nf_get_att_int2		nf_get_att_int2_
+#define nf_put_att_int		nf_put_att_int_
+#define nf_get_att_int		nf_get_att_int_
+#define nf_put_att_real		nf_put_att_real_
+#define nf_get_att_real		nf_get_att_real_
+#define nf_put_att_double	nf_put_att_double_
+#define nf_get_att_double	nf_get_att_double_
+#define nf_def_var		nf_def_var_
+#define nf_inq_var		nf_inq_var_
+#define nf_inq_varid		nf_inq_varid_
+#define nf_inq_varname		nf_inq_varname_
+#define nf_inq_vartype		nf_inq_vartype_
+#define nf_inq_varndims		nf_inq_varndims_
+#define nf_inq_vardimid		nf_inq_vardimid_
+#define nf_inq_varnatts		nf_inq_varnatts_
+#define nf_rename_var		nf_rename_var_
+#define nf_copy_var		nf_copy_var_
+#define nf_put_var_text		nf_put_var_text_
+#define nf_get_var_text		nf_get_var_text_
+#define nf_put_var_int1		nf_put_var_int1_
+#define nf_get_var_int1		nf_get_var_int1_
+#define nf_put_var_int2		nf_put_var_int2_
+#define nf_get_var_int2		nf_get_var_int2_
+#define nf_put_var_int		nf_put_var_int_
+#define nf_get_var_int		nf_get_var_int_
+#define nf_put_var_real		nf_put_var_real_
+#define nf_get_var_real		nf_get_var_real_
+#define nf_put_var_double	nf_put_var_double_
+#define nf_get_var_double	nf_get_var_double_
+#define nf_put_var1_text	nf_put_var1_text_
+#define nf_get_var1_text	nf_get_var1_text_
+#define nf_put_var1_int1	nf_put_var1_int1_
+#define nf_get_var1_int1	nf_get_var1_int1_
+#define nf_put_var1_int2	nf_put_var1_int2_
+#define nf_get_var1_int2	nf_get_var1_int2_
+#define nf_put_var1_int		nf_put_var1_int_
+#define nf_get_var1_int		nf_get_var1_int_
+#define nf_put_var1_real	nf_put_var1_real_
+#define nf_get_var1_real	nf_get_var1_real_
+#define nf_put_var1_double	nf_put_var1_double_
+#define nf_get_var1_double	nf_get_var1_double_
+#define nf_put_vara_text	nf_put_vara_text_
+#define nf_get_vara_text	nf_get_vara_text_
+#define nf_put_vara_int1	nf_put_vara_int1_
+#define nf_get_vara_int1	nf_get_vara_int1_
+#define nf_put_vara_int2	nf_put_vara_int2_
+#define nf_get_vara_int2	nf_get_vara_int2_
+#define nf_put_vara_int		nf_put_vara_int_
+#define nf_get_vara_int		nf_get_vara_int_
+#define nf_put_vara_real	nf_put_vara_real_
+#define nf_get_vara_real	nf_get_vara_real_
+#define nf_put_vara_double	nf_put_vara_double_
+#define nf_get_vara_double	nf_get_vara_double_
+#define nf_put_vars_text	nf_put_vars_text_
+#define nf_get_vars_text	nf_get_vars_text_
+#define nf_put_vars_int1	nf_put_vars_int1_
+#define nf_get_vars_int1	nf_get_vars_int1_
+#define nf_put_vars_int2	nf_put_vars_int2_
+#define nf_get_vars_int2	nf_get_vars_int2_
+#define nf_put_vars_int		nf_put_vars_int_
+#define nf_get_vars_int		nf_get_vars_int_
+#define nf_put_vars_real	nf_put_vars_real_
+#define nf_get_vars_real	nf_get_vars_real_
+#define nf_put_vars_double	nf_put_vars_double_
+#define nf_get_vars_double	nf_get_vars_double_
+#define nf_put_varm_text	nf_put_varm_text_
+#define nf_get_varm_text	nf_get_varm_text_
+#define nf_put_varm_int1	nf_put_varm_int1_
+#define nf_get_varm_int1	nf_get_varm_int1_
+#define nf_put_varm_int2	nf_put_varm_int2_
+#define nf_get_varm_int2	nf_get_varm_int2_
+#define nf_put_varm_int		nf_put_varm_int_
+#define nf_get_varm_int		nf_get_varm_int_
+#define nf_put_varm_real	nf_put_varm_real_
+#define nf_get_varm_real	nf_get_varm_real_
+#define nf_put_varm_double	nf_put_varm_double_
+#define nf_get_varm_double	nf_get_varm_double_
+#define nf__create              nf__create_
+#define nf__create_mp           nf__create_mp_
+#define nf__enddef              nf__enddef_
+#define nf__open                nf__open_
+#define nf__open_mp             nf__open_mp_
+#define nf_delete_mp            nf_delete_mp_
+#define nf_inq_base_pe          nf_inq_base_pe_
+#define nf_set_base_pe          nf_set_base_pe_
+
+#ifdef USE_NETCDF4
+#define nf_create_par nf_create_par_
+#define nf_open_par nf_open_par_
+#define nf_var_par_access nf_var_par_access_
+#define nf_inq_ncid nf_inq_ncid_
+#define nf_inq_grps nf_inq_grps_
+#define nf_inq_grpname nf_inq_grpname_
+#define nf_inq_grp_parent nf_inq_grp_parent_
+#define nf_inq_grp_ncid nf_inq_grp_ncid_
+#define nf_inq_varids nf_inq_varids_
+#define nf_inq_dimids nf_inq_dimids_
+#define nf_inq_typeids nf_inq_typeids_
+#define nf_inq_typeid nf_inq_typeid_
+#define nf_def_grp nf_def_grp_
+#define nf_def_compound nf_def_compound_
+#define nf_insert_compound nf_insert_compound_
+#define nf_insert_array_compound nf_insert_array_compound_
+#define nf_inq_type nf_inq_type_
+#define nf_inq_compound nf_inq_compound_
+#define nf_inq_compound_name nf_inq_compound_name_
+#define nf_inq_compound_size nf_inq_compound_size_
+#define nf_inq_compound_nfields nf_inq_compound_nfields_
+#define nf_inq_compound_field nf_inq_compound_field_
+#define nf_inq_compound_fieldname nf_inq_compound_fieldname_
+#define nf_inq_compound_fieldindex nf_inq_compound_fieldindex_
+#define nf_inq_compound_fieldtype nf_inq_compound_fieldtype_
+#define nf_inq_compound_fieldndims nf_inq_compound_fieldndims_
+#define nf_inq_compound_fielddim_sizes nf_inq_compound_fielddim_sizes_
+#define nf_def_vlen nf_def_vlen_
+#define nf_inq_vlen nf_inq_vlen_
+#define nf_free_vlen nf_free_vlen_
+#define nf_inq_user_type nf_inq_user_type_
+#define nf_put_att nf_put_att_
+#define nf_get_att nf_get_att_
+#define nf_def_enum nf_def_enum_
+#define nf_insert_enum nf_insert_enum_
+#define nf_inq_enum nf_inq_enum_
+#define nf_inq_enum_member nf_inq_enum_member_
+#define nf_inq_enum_ident nf_inq_enum_ident_
+#define nf_def_opaque nf_def_opaque_
+#define nf_inq_opaque nf_inq_opaque_
+#define nf_put_var nf_put_var_
+#define nf_put_var1 nf_put_var1_
+#define nf_put_vara nf_put_vara_
+#define nf_put_vars nf_put_vars_
+#define nf_put_varm nf_put_varm_
+#define nf_get_var nf_get_var_
+#define nf_get_var1 nf_get_var1_
+#define nf_get_vara nf_get_vara_
+#define nf_get_vars nf_get_vars_
+#define nf_get_varm nf_get_varm_
+#define nf_put_var_int64 nf_put_var_int64_
+#define nf_put_var1_int64 nf_put_var1_int64_
+#define nf_put_vara_int64 nf_put_vara_int64_
+#define nf_put_vars_int64 nf_put_vars_int64_
+#define nf_put_varm_int64 nf_put_varm_int64_
+#define nf_get_var_int64 nf_get_var_int64_
+#define nf_get_var1_int64 nf_get_var1_int64_
+#define nf_get_vara_int64 nf_get_vara_int64_
+#define nf_get_vars_int64 nf_get_vars_int64_
+#define nf_get_varm_int64 nf_get_varm_int64_
+#define nf_def_var_chunking nf_def_var_chunking_
+#define nf_def_var_deflate nf_def_var_deflate_
+#define nf_def_var_szip nf_def_var_szip_
+#define nf_def_var_fletcher32 nf_def_var_fletcher32_
+#define nf_inq_var_chunking nf_inq_var_chunking_
+#define nf_inq_var_deflate nf_inq_var_deflate_
+#define nf_inq_var_szip nf_inq_var_szip_
+#define nf_inq_var_fletcher32 nf_inq_var_fletcher32_
+#define nf_def_var_endian nf_def_var_endian_
+#define nf_inq_var_endian nf_inq_var_endian_
+#define nf_def_var_fill nf_def_var_fill_
+#define nf_inq_var_fill nf_inq_var_fill_
+#define nf_get_vlen_element nf_get_vlen_element_
+#define nf_inq_compound_fieldoffset nf_inq_compound_fieldoffset_
+#define nf_inq_grp_full nf_inq_grp_full_
+#define nf_inq_grpname_full nf_inq_grpname_full_
+#define nf_inq_grpname_len nf_inq_grpname_len_
+#define nf_put_vlen_element nf_put_vlen_element_
+#define nf_inq_grp_full_ncid nf_inq_grp_full_ncid_
+#define nf_set_chunk_cache nf_set_chunk_cache_
+#define nf_get_chunk_cache nf_get_chunk_cache_
+#define nf_set_var_chunk_cache nf_set_var_chunk_cache_
+#define nf_get_var_chunk_cache nf_get_var_chunk_cache_
+#define nf_free_string nf_free_string_
+#define nf_free_vlens nf_free_vlens_
+
+#endif /* USE_NETCDF4 */
+
+#endif	/* f2cFortran */
+
+#if defined(DLL_NETCDF) /* define when library is a DLL */
+#  if defined(NC_DLL_EXPORT) /* define when building the library */
+#   define extern extern __declspec(dllexport)
+#  else
+#   define extern extern __declspec(dllimport)
+#  endif
+#endif	/* defined(DLL_NETCDF) */
+
+#endif	/* header-file lockout */
diff --git a/libsrc/netcdf_f.h b/libsrc/netcdf_f.h
new file mode 100644
index 0000000..096dddd
--- /dev/null
+++ b/libsrc/netcdf_f.h
@@ -0,0 +1,63 @@
+/*
+ * Copyright 1993-2011 University Corporation for Atmospheric Research/Unidata
+ * 
+ * This header contains prototypes for functions only called by fortran 77.
+ */
+#ifndef _NETCDF_F_
+#define _NETCDF_F_
+
+#include <netcdf.h>
+
+#if defined(__cplusplus)
+extern "C" {
+#endif
+
+EXTERNL int
+nc_inq_var_chunking_ints(int ncid, int varid, int *contiguousp, int *chunksizesp);
+
+EXTERNL int
+nc_def_var_chunking_ints(int ncid, int varid, int contiguous, int *chunksizesp);
+
+EXTERNL int
+nc_open_par_fortran(const char *path, int mode, int comm, 
+		    int info, int *ncidp);
+
+EXTERNL int
+nc_create_par_fortran(const char *path, int cmode, int comm, 
+		      int info, int *ncidp);
+
+EXTERNL int
+nc_set_chunk_cache_ints(int size, int nelems, int preemption);
+
+EXTERNL int
+nc_get_chunk_cache_ints(int *sizep, int *nelemsp, int *preemptionp);
+
+EXTERNL int
+nc_set_var_chunk_cache_ints(int ncid, int varid, int size, int nelems, 
+			    int preemption);
+EXTERNL int
+nc_get_var_chunk_cache_ints(int ncid, int varid, int *sizep, 
+			    int *nelemsp, int *preemptionp);
+
+/* Prototypes for some extra functions in fort-lib.c. */
+EXTERNL int 
+nc_inq_varids_f(int ncid, int *nvars, int *fvarids);
+
+EXTERNL int 
+nc_inq_dimids_f(int ncid, int *ndims, int *fdimids, int parent);
+
+EXTERNL int 
+nc_insert_array_compound_f(int ncid, int typeid, char *name, 
+			   size_t offset, nc_type field_typeid,
+			   int ndims, int *dim_sizesp);
+
+EXTERNL int 
+nc_inq_compound_field_f(int ncid, nc_type xtype, int fieldid, char *name, 
+			size_t *offsetp, nc_type *field_typeidp, int *ndimsp, 
+			int *dim_sizesp);
+
+#if defined(__cplusplus)
+}
+#endif
+
+#endif
diff --git a/libsrc/netcdf_f77.3 b/libsrc/netcdf_f77.3
new file mode 100644
index 0000000..24571cd
--- /dev/null
+++ b/libsrc/netcdf_f77.3
@@ -0,0 +1,1370 @@
+.nr yr \n(yr+1900
+.af mo 01
+.af dy 01
+.TH NETCDF 3 "1997-04-18" "Printed: \n(yr-\n(mo-\n(dy" "UNIDATA LIBRARY FUNCTIONS"
+.SH NAME
+netcdf \- Unidata's Network Common Data Form (netCDF) library interface
+.SH SYNOPSIS
+.ft B
+.na
+.nh
+include netcdf.inc
+.sp
+.SS Most Systems:
+f77 ...  -lnetcdf -lhdf5_hl -lhdf5 -lz -lm
+.sp
+.SS CRAY PVP Systems:
+f90 -dp -i64 ... -lnetcdf
+
+.ad
+.hy
+Complete documentation for the netCDF libraries can be found at the netCDF website: http://www.unidata.ucar.edu/software/netcdf/.
+.sp
+.SH "LIBRARY VERSION"
+.LP
+This document describes versions 3 and 4
+of Unidata netCDF data-access interface
+for the FORTRAN programming language.
+.HP
+\fBcharacter*80 nf_inq_libvers(void)\fR
+.sp
+Returns a string identifying the version of the netCDF library, and
+when it was built, like: "3.1a of Aug 22 1996 12:57:47 $".
+.LP
+The RCS \fBident(1)\fP command will find a string like
+"$\|Id: @\|(#) netcdf library version 3.1a of Sep  6 1996 15:56:26 $"
+in the library. The SCCS \fBwhat(1)\fP command will find a string like
+"netcdf library version 3.1a of Aug 23 1996 16:07:40 $".
+.SH "RETURN VALUES"
+.LP
+All netCDF functions (except
+\fBnf_inq_libvers(\|)\fR and \fBnf_strerror(\|)\fR) return an integer status.
+
+If this returned status value is not equal to
+\fBNF_NOERR\fR (zero), it
+indicates that an error occurred. The possible status values are defined in 
+netcdf.inc.
+.HP
+\fBcharacter*80 nf_strerror(integer \fIstatus\fP)\fR
+.sp
+Returns a string textual translation of the \fIstatus\fP
+value, like "Attribute or variable name contains illegal characters"
+or "No such file or directory".
+.sp
+.SH "FILE OPERATIONS"
+.LP
+.HP
+\fBinteger function nf_create(character*(*) \fIpath\fP, integer \fIcmode\fP, integer \fIncid\fP)\fR
+.sp
+Creates a new netCDF dataset at \fIpath\fP,
+returning a netCDF ID in \fIncid\fP.
+The argument \fIcmode\fP may include the bitwise-or
+of the following flags:
+\fBNF_NOCLOBBER\fR
+to protect existing datasets (default
+silently blows them away),
+\fBNF_SHARE\fR
+for synchronous dataset updates for classic format files
+(default is to buffer accesses),
+.sp
+When a netCDF dataset is created, is is opened
+\fBNF_WRITE\fR.
+The new netCDF dataset is in define mode.
+\fBNF_64BIT_OFFSET\fR.
+to create a file in the 64-bit offset format 
+(as opposed to classic format, the default). 
+\fBNF_TRUE\fR to create a netCDF-4/HDF5 file, 
+and \fBNF_CLASSIC_MODEL\fR to guarantee that netCDF-4/HDF5 files maintain compatibility 
+with the netCDF classic data model.
+.HP
+\fBinteger function nf__create(character*(*) \fIpath\fP, integer \fIcmode\fP, integer \fIinitialsize\fP, integer \fIchunksize\fP, integer \fIncid\fP)\fR
+.sp
+Like \fBnf_create(\|)\fR but has additional performance tuning parameters.
+.sp
+The argument \fIinitialsize\fP sets the initial size of the file at
+creation time.
+.sp
+See \fBnf__open(\|)\fR below for an explanation of the \fIchunksize\fP
+parameter.
+.HP
+\fBinteger function nf_open(character*(*) \fIpath\fP, integer \fImode\fP, integer \fIncid\fP)\fR
+.sp
+(Corresponds to \fBncopn(\|)\fR in version 2)
+.sp
+Opens a existing netCDF dataset at \fIpath\fP
+returning a netCDF ID
+in \fIncid\fP.
+The type of access is described by the \fImode\fP parameter,
+which may include the bitwise-or
+of the following flags:
+\fBNF_WRITE\fR
+for read-write access (default
+read-only),
+\fBNF_SHARE\fR
+for synchronous dataset updates (default is
+to buffer accesses), and
+\fBNF_LOCK\fR
+(not yet implemented).
+.sp
+As of NetCDF version 4.1, and if TRUE support was enabled
+when the NetCDF library was built, the path parameter
+may specify a TRUE URL. In this case, the access mode is
+forced to be read-only.
+.HP
+\fBinteger function nf__open(character*(*) \fIpath\fP, integer \fImode\fP, integer \fIchunksize\fP, integer \fIncid\fP)\fR
+.sp
+Like \fBnf_open(\|)\fR but has an additional performance tuning parameter.
+.sp
+The argument referenced by \fIchunksize\fP controls a space versus time
+tradeoff, memory allocated in the netcdf library versus number of system
+calls.
+Because of internal requirements, the value may not be set to exactly
+the value requested.
+The actual value chosen is returned by reference.
+Using the value \fBNF_SIZEHINT_DEFAULT\fR causes the library to choose a
+default.
+How the system choses the default depends on the system.
+On many systems, the "preferred I/O block size" is available from the 
+\fBstat()\fR system call, \fBstruct stat\fR member \fBst_blksize\fR.
+If this is available it is used. Lacking that, twice the system pagesize
+is used.
+Lacking a call to discover the system pagesize, we just set default
+chunksize to 8192.
+.sp
+The chunksize is a property of a given open netcdf descriptor
+\fIncid\fP, it is not a persistent property of the netcdf dataset.
+.sp
+As with \fBnf__open(\|)\fR, the path parameter
+may specify a TRUE URL, but the tuning parameters are ignored.
+.HP
+\fBinteger function nf_redef(integer \fIncid\fP)\fR
+.sp
+(Corresponds to \fBncredf(\|)\fR in version 2)
+.sp
+Puts an open netCDF dataset into define mode, 
+so dimensions, variables, and attributes can be added or renamed and 
+attributes can be deleted.
+.HP
+\fBinteger function nf_enddef(integer \fIncid\fP)\fR
+.sp
+(Corresponds to \fBncendf(\|)\fR in version 2)
+.sp
+Takes an open netCDF dataset out of define mode.
+The changes made to the netCDF dataset
+while it was in define mode are checked and committed to disk if no
+problems occurred.  Some data values may be written as well,
+see "VARIABLE PREFILLING" below.
+After a successful call, variable data can be read or written to the dataset.
+.HP
+\fBinteger function nf__enddef(integer \fIncid\fP, integer \fIh_minfree\fP, integer \fIv_align\fP, integer \fIv_minfree\fP, integer \fIr_align\fP)\fR
+.sp
+Like \fBnf_enddef(\|)\fR but has additional performance tuning parameters.
+.sp
+Caution: this function exposes internals of the netcdf version 1 file
+format.
+It may not be available on future netcdf implementations.
+.sp
+The current netcdf file format has three sections,
+the "header" section, the data section for fixed size variables, and
+the data section for variables which have an unlimited dimension (record
+variables).
+The header begins at the beginning of the file. The index
+(offset) of the beginning of the other two sections is contained in the
+header. Typically, there is no space between the sections. This causes
+copying overhead to accrue if one wishes to change the size of the
+sections,
+as may happen when changing names of things, text attribute values,
+adding
+attributes or adding variables. Also, for buffered i/o, there may be
+advantages
+to aligning sections in certain ways.
+.sp
+The minfree parameters allow one to control costs of future calls
+to \fBnf_redef(\|)\fR, \fBnf_enddef(\|)\fR by requesting that \fIminfree\fP bytes be
+available at the end of the section.
+The \fIh_minfree\fP parameter sets the pad
+at the end of the "header" section. The \fIv_minfree\fP parameter sets
+the pad at the end of the data section for fixed size variables.
+.sp
+The align parameters allow one to set the alignment of the beginning of
+the corresponding sections. The beginning of the section is rounded up
+to an index which is a multiple of the align parameter. The flag value
+\fBNF_ALIGN_CHUNK\fR tells the library to use the chunksize (see above)
+as the align parameter.
+The \fIv_align\fP parameter controls the alignment of the beginning of
+the data section for fixed size variables.
+The \fIr_align\fP parameter controls the alignment of the beginning of
+the data section for variables which have an unlimited dimension (record
+variables).
+.sp
+The file format requires mod 4 alignment, so the align parameters
+are silently rounded up to multiples of 4. The usual call,
+\fBnf_enddef(\fIncid\fP)\fR
+is equivalent to
+\fBnf__enddef(\fIncid\fP, 0, 4, 0, 4)\fR.
+.sp
+The file format does not contain a "record size" value, this is
+calculated from the sizes of the record variables. This unfortunate fact
+prevents us from providing minfree and alignment control of the
+"records"
+in a netcdf file. If you add a variable which has an unlimited
+dimension,
+the third section will always be copied with the new variable added.
+.HP
+\fBinteger function nf_sync(integer \fIncid\fP)\fR
+.sp
+(Corresponds to \fBncsnc(\|)\fR in version 2)
+.sp
+Unless the
+\fBNF_SHARE\fR
+bit is set in
+\fBnf_open(\|)\fR or \fBnf_create(\|)\fR,
+accesses to the underlying netCDF dataset are
+buffered by the library. This function synchronizes the state of
+the underlying dataset and the library.
+This is done automatically by
+\fBnf_close(\|)\fR and \fBnf_enddef(\|)\fR.
+.HP
+\fBinteger function nf_abort(integer \fIncid\fP)\fR
+.sp
+(Corresponds to \fBncabor(\|)\fR in version 2)
+.sp
+You don't need to call this function.
+This function is called automatically by
+\fBnf_close(\|)\fR
+if the netCDF was in define mode and something goes wrong with the commit.
+If the netCDF dataset isn't in define mode, then this function is equivalent to
+\fBnf_close(\|)\fR.
+If it is called after
+\fBnf_redef(\|)\fR,
+but before
+\fBnf_enddef(\|)\fR,
+the new definitions are not committed and the dataset is closed.
+If it is called after
+\fBnf_create(\|)\fR
+but before
+\fBnf_enddef(\|)\fR,
+the dataset disappears.
+.HP
+\fBinteger function nf_close(integer \fIncid\fP)\fR
+.sp
+(Corresponds to
+\fBncclos(\|)\fR in version 2)
+.sp
+Closes an open netCDF dataset.
+If the dataset is in define mode,
+\fBnf_enddef(\|)\fR
+will be called before closing.
+After a dataset is closed, its ID may be reassigned to another dataset.
+.HP
+\fBinteger function nf_inq(integer \fIncid\fP, integer \fIndims\fP, integer \fInvars\fP,
+integer \fInatts\fP, integer \fIunlimdimid\fP)\fR
+.HP
+\fBinteger function nf_inq_ndims(integer \fIncid\fP, integer \fIndims\fP)\fR
+.HP
+\fBinteger function nf_inq_nvars(integer \fIncid\fP, integer \fInvars\fP)\fR
+.HP
+\fBinteger function nf_inq_natts(integer \fIncid\fP, integer \fInatts\fP)\fR
+.HP
+\fBinteger function nf_inq_unlimdim(integer \fIncid\fP, integer \fIunlimdimid\fP)\fR
+.HP
+\fBinteger function nf_inq_format(integer \fIncid\fP, integer \fIformatn\fP)\fR
+.sp
+Use these functions to find out what is in a netCDF dataset.
+Upon successful return,
+\fIndims\fP will contain  the
+number of dimensions defined for this netCDF dataset,
+\fInvars\fP will contain the number of variables,
+\fInatts\fP will contain the number of attributes, and
+\fIunlimdimid\fP will contain the
+dimension ID of the unlimited dimension if one exists, or
+0 otherwise.
+\fIformatn\fP will contain the version number of the dataset <format>, one of
+\fBNF_FORMAT_CLASSIC\fR, \fBNF_FORMAT_64BIT\fR, \fBNF_FORMAT_NETCDF4\fR, or
+\fBNF_FORMAT_NETCDF4_CLASSIC\fR.
+
+.HP
+\fBinteger function nf_def_dim(integer \fIncid\fP, character*(*) \fIname\fP, integer \fIlen\fP, integer \fIdimid\fP)\fR
+.sp
+(Corresponds to \fBncddef(\|)\fR in version 2)
+.sp
+Adds a new dimension to an open netCDF dataset, which must be 
+in define mode.
+\fIname\fP is the dimension name.
+\fIdimid\fP will contain the dimension ID of the newly created dimension.
+
+.SH "USER DEFINED TYPES"
+.LP
+Users many define types for a netCDF-4/HDF5 file (unless the
+\fBNF_CLASSIC_MODEL\fR was used when the file was creates). Users may
+define compound types, variable length arrays, enumeration types, and
+opaque types.
+.sp
+
+.HP
+\fBinteger function nf_def_compound(integer \fIncid\fP, integer \fIsize\fP, character*(*) \fIname\fP, integer \fItypeidp\fP)\fR
+.sp
+Define a compound type.
+.HP
+\fBinteger function nf_insert_compound(integer \fIncid\fP, integer \fI\fP, character*(*) \fIname\fP, integer \fIoffset\fP, integer \fIfield_typeid\fP)\fR
+.sp
+Insert an element into a compound type. May not be done after type has been used, or after the type has been written by an enddef.
+.HP
+\fBinteger function nf_insert_array_compound(integer \fIncid\fP, integer \fI\fP, character*(*) \fIname\fP, integer \fIoffset\fP, integer \fIfield_typeid\fP, integer \fIndims\fP, integer \fIdim_sizes\fP(1))\fR
+.sp 
+Insert an array into a compound type.
+.HP
+\fBinteger function nf_inq_type(integer \fIncid\fP, integer \fI\fP, character*(*) \fIname\fP, integer \fIsizep\fP)\fR
+.sp
+Learn about a type.
+.HP
+\fBinteger function nf_inq_compound(integer \fIncid\fP, integer \fI\fP, character*(*) \fIname\fP, integer \fIsizep\fP, integer \fInfieldsp\fP)\fR
+.HP
+\fBinteger function nf_inq_compound_name(integer \fIncid\fP, integer \fI\fP, character*(*) \fIname\fP)\fR
+.HP
+\fBinteger function nf_inq_compound_size(integer \fIncid\fP, integer \fI\fP, integer \fIsizep\fP)\fR
+.HP
+\fBinteger function nf_inq_compound_nfields(integer \fIncid\fP, integer \fI\fP, integer \fInfieldsp\fP)\fR
+.HP
+\fBinteger function nf_inq_compound_fieldname(integer \fIncid\fP, integer \fI\fP, integer \fIfieldid\fP, character*(*) \fIname\fP)\fR
+.HP
+\fBinteger function nf_inq_compound_fieldindex(integer \fIncid\fP, integer \fI\fP, character*(*) \fIname\fP, integer \fIfieldidp\fP)\fR
+.HP
+\fBinteger function nf_inq_compound_fieldoffset(integer \fIncid\fP, integer \fI\fP, integer \fIfieldid\fP, integer \fIoffsetp\fP)\fR
+.HP
+\fBinteger function nf_inq_compound_fieldtype(integer \fIncid\fP, integer \fI\fP, integer \fIfieldid\fP, integer \fIfield_typeid\fP)\fR
+.HP
+\fBinteger function nf_inq_compound_fieldndims(integer \fIncid\fP, integer \fI\fP, integer \fIfieldid\fP, integer \fIndims\fP)\fR
+.HP
+\fBinteger function nf_inq_compound_fielddim_sizes(integer \fIncid\fP, integer \fI\fP, integer \fIfieldid\fP, integer \fIdim_sizes\fP(1))\fR
+.sp
+Learn about a compound type.
+.HP
+\fBinteger function nf_def_vlen(integer \fIncid\fP, character*(*) \fIname\fP, integer \fIbase_typeid\fP, integer \fIxtypep\fP)\fR
+.sp
+Create a varaible length array type.
+.HP
+\fBinteger function nf_inq_vlen(integer \fIncid\fP, integer \fI\fP, character*(*) \fIname\fP, integer \fIdatum_sizep\fP, integer \fIbase_nc_typep\fP)\fR
+.sp
+Learn about a varaible length array type.
+.HP
+\fBinteger function nf_free_vlen(nc_vlen_t *vl)\fR
+.sp
+Free memory comsumed by reading data of a varaible length array type.
+.HP
+\fBinteger function nf_put_vlen_element(integer \fIncid\fP, integer \fI\fP, void * \fIvlen_element\fP, integer \fIlen\fP, void * \fIdata\fP)\fR
+.sp
+Write one VLEN.
+.HP
+\fBinteger function nf_get_vlen_element(integer \fIncid\fP, integer \fI\fP, void * \fIvlen_element\fP, integer \fIlen\fP, void * \fIdata\fP)\fR
+.sp
+Read one VLEN.
+.HP
+\fBinteger function nf_free_string(integer \fIlen\fP, char **data)\fR
+.sp
+Free memory comsumed by reading data of a string type.
+.HP
+\fBinteger function nf_inq_user_type(integer \fIncid\fP, integer \fI\fP, character*(*) \fIname\fP, integer \fI\fP, integer \fI\fP, integer \fI\fP, integer \fI\fP)\fR
+.sp
+Learn about a user define type.
+.HP
+\fBinteger function nf_def_enum(integer \fIncid\fP, integer \fIbase_typeid\fP, character*(*) \fIname\fP, integer \fItypeidp\fP)\fR
+.sp
+Define an enumeration type.
+.HP
+\fBinteger function nf_insert_enum(integer \fIncid\fP, integer \fIbase_typeid\fP, character*(*) \fIname\fP, const void *value)\fR
+.sp
+Insert a name-value pair into enumeration type.
+.HP
+\fBinteger function nf_inq_enum_member(integer \fIncid\fP, integer \fIxtype\fP, integer \fIidx\fP, character*(*) \fIname\fP, void *value)\fR
+.HP
+\fBinteger function nf_inq_enum_ident(integer \fIncid\fP, integer \fIxtype\fP, integer \fIidx\fP, integer*8 \fIvalue\fP, character*(*) \fIidentifier\fP)\fR
+.sp
+Learn about a name-value pair into enumeration type.
+.HP
+\fBinteger function nf_def_opaque(integer \fIncid\fP, integer \fIsize\fP, character*(*) \fIname\fP, integer \fIxtypep\fP)\fR
+.sp
+Create an opaque type.
+.HP
+\fBinteger function nf_inq_opaque(integer \fIncid\fP, integer \fIxtype\fP, character*(*) \fIname\fP, integer \fIsizep\fP)\fR
+.sp
+Learn about opaque type.
+.HP
+.SH "GROUPS"
+.sp
+Users may organize data into hierarchical groups in netCDF-4/HDF5 files (unless \fBNF_CLASSIC_MODEL\fR was used when creating the file).
+.HP
+\fBinteger function nf_inq_grps(integer \fIncid\fP, integer \fInumgrps\fP, integer \fIncids\fP(1))\fR
+.sp
+Learn how many groups (and their ncids) are available from the group represented by ncid.
+.HP
+\fBinteger function nf_inq_grpname(integer \fIncid\fP, character*(*) \fIname\fP)\fR
+.HP
+\fBinteger function nf_inq_grpname_full(integer \fIncid\fP, integer \fIlen\fP, character*(*) \fIname\fP)\fR
+.HP
+\fBinteger function nf_inq_grpname_len(integer \fIncid\fP, integer \fIlen\fP)\fR
+.HP
+\fBinteger function nf_inq_grp_parent(integer \fIncid\fP, integer \fIncid\fP)\fR
+.HP
+\fBinteger function nf_inq_grp_ncid(integer \fIncid\fP, character*(*) \fIname\fP, integer \fIncid\fP)\fR
+.HP
+\fBinteger function nf_inq_full_ncid(integer \fIncid\fP, character*(*) \fIname\fP, integer \fIncid\fP)\fR
+.sp
+Learn about a group.
+.HP
+\fBinteger function nf_inq_varids(integer \fIncid\fP, integer \fInvars\fP, integer \fI\fP)\fR
+.sp
+Get the varids in a group.
+.HP
+\fBinteger function nf_inq_dimids(integer \fIncid\fP, integer \fIndims\fP, integer \fIdimids\fP, integer \fIinclude_parents\fP)\fR
+.sp
+Get the dimids in a group and (potentially) its parents.
+.HP
+\fBinteger function nf_inq_typeids(integer \fIncid\fP, integer \fIntypes\fP, integer \fItypeids\fP(1))\fR
+.sp
+Get the typeids of user-defined types in a group.
+.HP
+\fBinteger function nf_def_grp(integer \fIncid\fP, character*(*) \fIname\fP, integer \fIncid\fP)\fR
+.sp
+Create a group.
+.LP
+
+.SH "DIMENSIONS"
+.LP
+.HP
+\fBinteger function nf_inq_dimid(integer \fIncid\fP, character*(*) \fIname\fP, integer \fIdimid\fP)\fR
+.sp
+(Corresponds to \fBncdid(\|)\fR in version 2)
+.sp
+Given a dimension name, returns the ID of a netCDF dimension in \fIdimid\fP.
+.HP
+\fBinteger function nf_inq_dim(integer \fIncid\fP, integer \fIdimid\fP, character*(*) \fIname\fP, integer \fIlen\fP)\fR
+.HP
+\fBinteger function nf_inq_dimname(integer \fIncid\fP, integer \fIdimid\fP, character*(*) \fIname\fP)\fR
+.HP
+\fBinteger function nf_inq_dimlen(integer \fIncid\fP, integer \fIdimid\fP, integer \fIlen\fP)\fR
+.sp
+Use these functions to find out about a dimension.
+
+\fIname\fP should be  big enough (\fBNF_MAX_NAME\fR)
+to hold the dimension name as the name will be copied into your storage.
+The length return parameter, \fIlen\fP
+will contain the size of the dimension.
+For the unlimited dimension, the returned length is the current
+maximum value used for writing into any of the variables which use
+the dimension.
+.HP
+\fBinteger function nf_rename_dim(integer \fIncid\fP, integer \fIdimid\fP, character*(*) \fIname\fP)\fR
+.sp
+(Corresponds to \fBncdren(\|)\fR in version 2)
+.sp
+Renames an existing dimension in an open netCDF dataset.
+If the new name is longer than the old name, the netCDF dataset must be in 
+define mode.
+You cannot rename a dimension to have the same name as another dimension.
+.SH "VARIABLES"
+.LP
+.HP
+\fBinteger function nf_def_var(integer \fIncid\fP, character*(*) \fIname\fP, integer \fIxtype\fP, integer \fIndims\fP, integer \fIdimids\fP(1), integer \fIvarid\fP)\fR
+.sp
+(Corresponds to \fBncvdef(\|)\fR in version 2)
+.sp
+Adds a new variable to a netCDF dataset. The netCDF must be in define mode.
+\fIvarid\fP will be set to the netCDF variable ID.
+.HP
+\fBinteger function nf_inq_varid(integer \fIncid\fP, character*(*) \fIname\fP, integer \fIvarid\fP)\fR
+.sp
+(Corresponds to \fBncvid(\|)\fR in version 2)
+.sp
+Returns the ID of a netCDF variable in \fIvarid\fP given its name.
+.HP
+\fBinteger function nf_inq_var(integer \fIncid\fP, integer \fIvarid\fP, character*(*) \fIname\fP, integer \fIxtype\fP, integer \fIndims\fP, integer \fIdimids\fP(1),
+integer \fInatts\fP)\fR
+.HP
+\fBinteger function nf_inq_varname(integer \fIncid\fP, integer \fIvarid\fP, character*(*) \fIname\fP)\fR
+.HP
+\fBinteger function nf_inq_vartype(integer \fIncid\fP, integer \fIvarid\fP, integer \fIxtype\fP)\fR
+.HP
+\fBinteger function nf_inq_varndims(integer \fIncid\fP, integer \fIvarid\fP, integer \fIndims\fP)\fR
+.HP
+\fBinteger function nf_inq_vardimid(integer \fIncid\fP, integer \fIvarid\fP, integer \fIdimids\fP(1))\fR
+.HP
+\fBinteger function nf_inq_varnatts(integer \fIncid\fP, integer \fIvarid\fP, integer \fInatts\fP)\fR
+.sp
+Returns information about a netCDF variable, given its ID.
+
+.HP
+\fBinteger function nf_rename_var(integer \fIncid\fP, integer \fIvarid\fP, character*(*) \fIname\fP)\fR
+.sp
+(Corresponds to \fBncvren(\|)\fR in version 2)
+.sp
+Changes the name of a netCDF variable.
+If the new name is longer than the old name, the netCDF must be in define mode.
+You cannot rename a variable to have the name of any existing variable.
+
+.SH "VARIABLES \fIin\fP NETCDF-4 FILES"
+.LP
+The following functions may only be used on variables in a
+netCDF-4/HDF5 data file. These functions must be called after the
+variable is defined, but before an enddef call.
+.sp
+\fBinteger function nf_def_var_deflate(integer \fIncid\fP, integer \fIvarid\fP, integer \fIshuffle\fP, integer \fIdeflate\fP, integer \fIdeflate_level\fP)\fR
+.sp
+Turn on compression and/or shuffle filter. (Shuffle filter is only useful for integer data.)
+.HP
+\fBinteger function nf_inq_var_deflate(integer \fIncid\fP, integer \fIvarid\fP, integer \fIshufflep\fP, integer \fIdeflatep\fP, integer \fIdeflate_levelp\fP)\fR
+.sp
+Learn about a variable's deflate settings.
+.HP
+\fBinteger function nf_def_var_fletcher32(integer \fIncid\fP, integer \fIvarid\fP, integer \fIfletcher32\fP)\fR
+.sp
+Turn on checksumming for a variable.
+.HP
+\fBinteger function nf_inq_var_fletcher32(integer \fIncid\fP, integer \fIvarid\fP, integer \fIfletcher32\fP)\fR
+.sp
+Learn about checksumming for a variable.
+.HP
+\fBinteger function nf_def_var_chunking(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstorage\fP, integer \fIchunksizesp\fP(1))\fR
+.sp
+Set chunksizes for a variable.
+.HP
+\fBinteger function nf_inq_var_chunking(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstoragep\fP, integer \fIchunksizesp\fP(1))\fR
+.sp
+Learn about chunksizes for a variable.
+.HP
+\fBinteger function nf_def_var_fill(integer \fIncid\fP, integer \fIvarid\fP, integer \fIno_fill\fP, integer \fIchunksizesp\fP(1))\fR
+.sp
+Set a fill value for a variable.
+.HP
+\fBinteger function nf_inq_var_fill(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstoragep\fP, integer \fIchunksizesp\fP(1))\fR
+.sp
+Learn the fill value for a variable.
+.HP
+\fBinteger function nf_def_var_endian(integer \fIncid\fP, integer \fIvarid\fP, integer \fIendian\fP)\fR
+.sp
+Set endianness of variable.
+.HP
+\fBinteger function nf_inq_var_endian(integer \fIncid\fP, integer \fIvarid\fP, integer \fIendianp\fP)\fR
+.sp
+Learn the endianness of a variable.
+.HP
+
+.SH "WRITING AND READING WHOLE VARIABLES"
+.LP
+.HP
+\fBinteger function nf_put_var_text(integer \fIncid\fP, integer \fIvarid\fP, character*(*) \fIout\fP)\fR
+
+.HP
+\fBinteger function nf_put_var_int1(integer \fIncid\fP, integer \fIvarid\fP, integer*1 \fIout\fP(1))\fR
+.HP
+\fBinteger function nf_put_var_int2(integer \fIncid\fP, integer \fIvarid\fP, integer*2 \fIout\fP(1))\fR
+.HP
+\fBinteger function nf_put_var_int(integer \fIncid\fP, integer \fIvarid\fP, integer \fIout\fP(1))\fR
+
+.HP
+\fBinteger function nf_put_var_real(integer \fIncid\fP, integer \fIvarid\fP, real \fIout\fP(1))\fR
+.HP
+\fBinteger function nf_put_var_double(integer \fIncid\fP, integer \fIvarid\fP, doubleprecision \fIout\fP(1))\fR
+.HP
+\fBinteger function nf_put_var_ubyte(integer \fIncid\fP, integer \fIvarid\fP, integer*1 \fIout\fP(1))\fR
+.HP
+\fBinteger function nf_put_var_ushort(integer \fIncid\fP, integer \fIvarid\fP, integer*2 \fIout\fP(1))\fR
+.HP
+\fBinteger function nf_put_var_uint(integer \fIncid\fP, integer \fIvarid\fP, integer*4 \fIout\fP(1))\fR
+.HP
+\fBinteger function nf_put_var_(integer \fIncid\fP, integer \fIvarid\fP, integer*8 \fIout\fP(1))\fR
+.HP
+\fBinteger function nf_put_var_uint64(integer \fIncid\fP, integer \fIvarid\fP, integer*8 \fIout\fP(1))\fR
+.HP
+\fBinteger function nf_put_var_string(integer \fIncid\fP, integer \fIvarid\fP, character* \fIout\fP(1))\fR
+
+
+.sp
+Writes an entire netCDF variable (i.e. all the values).  The netCDF
+dataset must be open and in data mode.  The type of the data is
+specified in the function name, and it is converted to the external
+type of the specified variable, if possible, otherwise an
+\fBNF_ERANGE\fR error is returned. Note that rounding is not performed
+during the conversion. Floating point numbers are truncated when
+converted to integers.
+.HP
+\fBinteger function nf_get_var_text(integer \fIncid\fP, integer \fIvarid\fP, character*(*) \fIin\fP)\fR
+
+.HP
+\fBinteger function nf_get_var_int1(integer \fIncid\fP, integer \fIvarid\fP, integer*1 \fIin\fP(1))\fR
+.HP
+\fBinteger function nf_get_var_int2(integer \fIncid\fP, integer \fIvarid\fP, integer*2 \fIin\fP(1))\fR
+.HP
+\fBinteger function nf_get_var_int(integer \fIncid\fP, integer \fIvarid\fP, integer \fIin\fP(1))\fR
+
+.HP
+\fBinteger function nf_get_var_real(integer \fIncid\fP, integer \fIvarid\fP, real \fIin\fP(1))\fR
+.HP
+\fBinteger function nf_get_var_double(integer \fIncid\fP, integer \fIvarid\fP, doubleprecision \fIin\fP(1))\fR
+.HP
+\fBinteger function nf_get_var_ubyte(integer \fIncid\fP, integer \fIvarid\fP, integer*1 \fIin\fP(1))\fR
+.HP
+\fBinteger function nf_get_var_ushort(integer \fIncid\fP, integer \fIvarid\fP, integer*2 \fIin\fP(1))\fR
+.HP
+\fBinteger function nf_get_var_uint(integer \fIncid\fP, integer \fIvarid\fP, integer*4 \fIin\fP(1))\fR
+.HP
+\fBinteger function nf_get_var_(integer \fIncid\fP, integer \fIvarid\fP, integer*8 \fIin\fP(1))\fR
+.HP
+\fBinteger function nf_get_var_uint64(integer \fIncid\fP, integer \fIvarid\fP, integer*8 \fIin\fP(1))\fR
+.HP
+\fBinteger function nf_get_var_string(integer \fIncid\fP, integer \fIvarid\fP, character* \fIin\fP(1))\fR
+
+
+.sp
+Reads an entire netCDF variable (i.e. all the values).
+The netCDF dataset must be open and in data mode.  
+The data is converted from the external type of the specified variable,
+if necessary, to the type specified in the function name.  If conversion is
+not possible, an \fBNF_ERANGE\fR error is returned.
+.SH "WRITING AND READING ONE DATUM"
+.LP
+.HP
+\fBinteger function nf_put_var1_text(integer \fIncid\fP, integer \fIvarid\fP, integer \fIindex\fP(1), character*1 \fI*out\fP)\fR
+
+.HP
+\fBinteger function nf_put_var1_int1(integer \fIncid\fP, integer \fIvarid\fP, integer \fIindex\fP(1), integer*1 \fI*out\fP)\fR
+.HP
+\fBinteger function nf_put_var1_int2(integer \fIncid\fP, integer \fIvarid\fP, integer \fIindex\fP(1), integer*2 \fI*out\fP)\fR
+.HP
+\fBinteger function nf_put_var1_int(integer \fIncid\fP, integer \fIvarid\fP, integer \fIindex\fP(1), integer \fI*out\fP)\fR
+
+.HP
+\fBinteger function nf_put_var1_real(integer \fIncid\fP, integer \fIvarid\fP, integer \fIindex\fP(1), real \fI*out\fP)\fR
+.HP
+\fBinteger function nf_put_var1_double(integer \fIncid\fP, integer \fIvarid\fP, integer \fIindex\fP(1), doubleprecision \fI*out\fP)\fR
+.HP
+\fBinteger function nf_put_var1_ubyte(integer \fIncid\fP, integer \fIvarid\fP, integer \fIindex\fP(1), integer*1 \fI*out\fP)\fR
+.HP
+\fBinteger function nf_put_var1_ushort(integer \fIncid\fP, integer \fIvarid\fP, integer \fIindex\fP(1), integer*2 \fI*out\fP)\fR
+.HP
+\fBinteger function nf_put_var1_uint(integer \fIncid\fP, integer \fIvarid\fP, integer \fIindex\fP(1), integer*4 \fI*out\fP)\fR
+.HP
+\fBinteger function nf_put_var1_(integer \fIncid\fP, integer \fIvarid\fP, integer \fIindex\fP(1), integer*8 \fI*out\fP)\fR
+.HP
+\fBinteger function nf_put_var1_uint64(integer \fIncid\fP, integer \fIvarid\fP, integer \fIindex\fP(1), integer*8 \fI*out\fP)\fR
+.HP
+\fBinteger function nf_put_var1_string(integer \fIncid\fP, integer \fIvarid\fP, integer \fIindex\fP(1), character* \fI*out\fP)\fR
+
+
+.sp
+Puts a single data value into a variable at the position \fIindex\fP of an
+open netCDF dataset that is in data mode.  The type of the data is
+specified in the function name, and it is converted to the external type
+of the specified variable, if possible, otherwise an \fBNF_ERANGE\fR
+error is returned.
+.HP
+\fBinteger function nf_get_var1_text(integer \fIncid\fP, integer \fIvarid\fP, integer \fIindex\fP(1), character*1 \fIin\fP)\fR
+
+.HP
+\fBinteger function nf_get_var1_int1(integer \fIncid\fP, integer \fIvarid\fP, integer \fIindex\fP(1), integer*1 \fIin\fP)\fR
+.HP
+\fBinteger function nf_get_var1_int2(integer \fIncid\fP, integer \fIvarid\fP, integer \fIindex\fP(1), integer*2 \fIin\fP)\fR
+.HP
+\fBinteger function nf_get_var1_int(integer \fIncid\fP, integer \fIvarid\fP, integer \fIindex\fP(1), integer \fIin\fP)\fR
+
+.HP
+\fBinteger function nf_get_var1_real(integer \fIncid\fP, integer \fIvarid\fP, integer \fIindex\fP(1), real \fIin\fP)\fR
+.HP
+\fBinteger function nf_get_var1_double(integer \fIncid\fP, integer \fIvarid\fP, integer \fIindex\fP(1), doubleprecision \fIin\fP)\fR
+.HP
+\fBinteger function nf_get_var1_ubyte(integer \fIncid\fP, integer \fIvarid\fP, integer \fIindex\fP(1), integer*1 \fIin\fP)\fR
+.HP
+\fBinteger function nf_get_var1_ushort(integer \fIncid\fP, integer \fIvarid\fP, integer \fIindex\fP(1), integer*2 \fIin\fP)\fR
+.HP
+\fBinteger function nf_get_var1_uint(integer \fIncid\fP, integer \fIvarid\fP, integer \fIindex\fP(1), integer*4 \fIin\fP)\fR
+.HP
+\fBinteger function nf_get_var1_(integer \fIncid\fP, integer \fIvarid\fP, integer \fIindex\fP(1), integer*8 \fIin\fP)\fR
+.HP
+\fBinteger function nf_get_var1_uint64(integer \fIncid\fP, integer \fIvarid\fP, integer \fIindex\fP(1), integer*8 \fIin\fP)\fR
+.HP
+\fBinteger function nf_get_var1_string(integer \fIncid\fP, integer \fIvarid\fP, integer \fIindex\fP(1), character* \fIin\fP)\fR
+
+
+.sp
+Gets a single data value from a variable at the position \fIindex\fP
+of an open netCDF dataset that is in data mode.  
+The data is converted from the external type of the specified variable,
+if necessary, to the type specified in the function name.  If conversion is
+not possible, an \fBNF_ERANGE\fR error is returned.
+.SH "WRITING AND READING AN ARRAY"
+.LP
+.HP
+\fBinteger function nf_put_vara_text(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), character*(*) \fIout\fP)\fR
+
+.HP
+\fBinteger function nf_put_vara_int1(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), integer*1 \fIout\fP(1))\fR
+.HP
+\fBinteger function nf_put_vara_int2(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), integer*2 \fIout\fP(1))\fR
+.HP
+\fBinteger function nf_put_vara_int(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), integer \fIout\fP(1))\fR
+
+.HP
+\fBinteger function nf_put_vara_real(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), real \fIout\fP(1))\fR
+.HP
+\fBinteger function nf_put_vara_double(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), doubleprecision \fIout\fP(1))\fR
+.HP
+\fBinteger function nf_put_vara_ubyte(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), integer*1 \fIout\fP(1))\fR
+.HP
+\fBinteger function nf_put_vara_ushort(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), integer*2 \fIout\fP(1))\fR
+.HP
+\fBinteger function nf_put_vara_uint(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), integer*4 \fIout\fP(1))\fR
+.HP
+\fBinteger function nf_put_vara_(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), integer*8 \fIout\fP(1))\fR
+.HP
+\fBinteger function nf_put_vara_uint64(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), integer*8 \fIout\fP(1))\fR
+.HP
+\fBinteger function nf_put_vara_string(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), character* \fIout\fP(1))\fR
+
+
+.sp
+Writes an array section of values into a netCDF variable of an open
+netCDF dataset, which must be in data mode.  The array section is specified
+by the \fIstart\fP and \fIcount\fP vectors, which give the starting index
+and count of values along each dimension of the specified variable.
+The type of the data is
+specified in the function name and is converted to the external type
+of the specified variable, if possible, otherwise an \fBNF_ERANGE\fR
+error is returned.
+.HP
+\fBinteger function nf_get_vara_text(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), character*(*) \fIin\fP)\fR
+
+.HP
+\fBinteger function nf_get_vara_int1(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), integer*1 \fIin\fP(1))\fR
+.HP
+\fBinteger function nf_get_vara_int2(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), integer*2 \fIin\fP(1))\fR
+.HP
+\fBinteger function nf_get_vara_int(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), integer \fIin\fP(1))\fR
+
+.HP
+\fBinteger function nf_get_vara_real(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), real \fIin\fP(1))\fR
+.HP
+\fBinteger function nf_get_vara_double(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), doubleprecision \fIin\fP(1))\fR
+.HP
+\fBinteger function nf_get_vara_ubyte(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), integer*1 \fIin\fP(1))\fR
+.HP
+\fBinteger function nf_get_vara_ushort(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), integer*2 \fIin\fP(1))\fR
+.HP
+\fBinteger function nf_get_vara_uint(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), integer*4 \fIin\fP(1))\fR
+.HP
+\fBinteger function nf_get_vara_(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), integer*8 \fIin\fP(1))\fR
+.HP
+\fBinteger function nf_get_vara_uint64(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), integer*8 \fIin\fP(1))\fR
+.HP
+\fBinteger function nf_get_vara_string(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), character* \fIin\fP(1))\fR
+
+
+.sp
+Reads an array section of values from a netCDF variable of an open
+netCDF dataset, which must be in data mode.  The array section is specified
+by the \fIstart\fP and \fIcount\fP vectors, which give the starting index
+and count of values along each dimension of the specified variable.
+The data is converted from the external type of the specified variable,
+if necessary, to the type specified in the function name.  If conversion is
+not possible, an \fBNF_ERANGE\fR error is returned.
+.SH "WRITING AND READING A SLICED ARRAY"
+.LP
+.HP
+\fBinteger function nf_put_vars_text(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), integer \fIstride\fP(1), character*(*) \fIout\fP)\fR
+
+.HP
+\fBinteger function nf_put_vars_int1(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), integer \fIstride\fP(1), integer*1 \fIout\fP(1))\fR
+.HP
+\fBinteger function nf_put_vars_int2(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), integer \fIstride\fP(1), integer*2 \fIout\fP(1))\fR
+.HP
+\fBinteger function nf_put_vars_int(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), integer \fIstride\fP(1), integer \fIout\fP(1))\fR
+
+.HP
+\fBinteger function nf_put_vars_real(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), integer \fIstride\fP(1), real \fIout\fP(1))\fR
+.HP
+\fBinteger function nf_put_vars_double(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), integer \fIstride\fP(1), doubleprecision \fIout\fP(1))\fR
+.HP
+\fBinteger function nf_put_vars_ubyte(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), integer \fIstride\fP(1), integer*1 \fIout\fP(1))\fR
+.HP
+\fBinteger function nf_put_vars_ushort(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), integer \fIstride\fP(1), integer*2 \fIout\fP(1))\fR
+.HP
+\fBinteger function nf_put_vars_uint(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), integer \fIstride\fP(1), integer*4 \fIout\fP(1))\fR
+.HP
+\fBinteger function nf_put_vars_(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), integer \fIstride\fP(1), integer*8 \fIout\fP(1))\fR
+.HP
+\fBinteger function nf_put_vars_uint64(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), integer \fIstride\fP(1), integer*8 \fIout\fP(1))\fR
+.HP
+\fBinteger function nf_put_vars_string(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), integer \fIstride\fP(1), character* \fIout\fP(1))\fR
+
+
+.sp
+These functions are used for \fIstrided output\fP, which is like the
+array section output described above, except that
+the sampling stride (the interval between accessed values) is
+specified for each dimension.
+For an explanation of the sampling stride
+vector, see COMMON ARGUMENTS DESCRIPTIONS below.
+.HP
+\fBinteger function nf_get_vars_text(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), integer \fIstride\fP(1), character*(*) \fIin\fP)\fR
+
+.HP
+\fBinteger function nf_get_vars_int1(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), integer \fIstride\fP(1), integer*1 \fIin\fP(1))\fR
+.HP
+\fBinteger function nf_get_vars_int2(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), integer \fIstride\fP(1), integer*2 \fIin\fP(1))\fR
+.HP
+\fBinteger function nf_get_vars_int(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), integer \fIstride\fP(1), integer \fIin\fP(1))\fR
+
+.HP
+\fBinteger function nf_get_vars_real(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), integer \fIstride\fP(1), real \fIin\fP(1))\fR
+.HP
+\fBinteger function nf_get_vars_double(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), integer \fIstride\fP(1), doubleprecision \fIin\fP(1))\fR
+.HP
+\fBinteger function nf_get_vars_ubyte(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), integer \fIstride\fP(1), integer*1 \fIin\fP(1))\fR
+.HP
+\fBinteger function nf_get_vars_ushort(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), integer \fIstride\fP(1), integer*2 \fIin\fP(1))\fR
+.HP
+\fBinteger function nf_get_vars_uint(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), integer \fIstride\fP(1), integer*4 \fIin\fP(1))\fR
+.HP
+\fBinteger function nf_get_vars_(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), integer \fIstride\fP(1), integer*8 \fIin\fP(1))\fR
+.HP
+\fBinteger function nf_get_vars_uint64(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), integer \fIstride\fP(1), integer*8 \fIin\fP(1))\fR
+.HP
+\fBinteger function nf_get_vars_string(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), integer \fIstride\fP(1), character* \fIin\fP(1))\fR
+
+
+.sp
+These functions are used for \fIstrided input\fP, which is like the
+array section input described above, except that 
+the sampling stride (the interval between accessed values) is
+specified for each dimension.
+For an explanation of the sampling stride
+vector, see COMMON ARGUMENTS DESCRIPTIONS below.
+.SH "WRITING AND READING A MAPPED ARRAY"
+.LP
+.HP
+\fBinteger function nf_put_varm_text(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), integer \fIstride\fP(1), \fIimap\fP, character*(*) \fIout\fP)\fR
+
+.HP
+\fBinteger function nf_put_varm_int1(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), integer \fIstride\fP(1), \fIimap\fP, integer*1 \fIout\fP(1))\fR
+.HP
+\fBinteger function nf_put_varm_int2(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), integer \fIstride\fP(1), \fIimap\fP, integer*2 \fIout\fP(1))\fR
+.HP
+\fBinteger function nf_put_varm_int(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), integer \fIstride\fP(1), \fIimap\fP, integer \fIout\fP(1))\fR
+
+.HP
+\fBinteger function nf_put_varm_real(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), integer \fIstride\fP(1), \fIimap\fP, real \fIout\fP(1))\fR
+.HP
+\fBinteger function nf_put_varm_double(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), integer \fIstride\fP(1), \fIimap\fP, doubleprecision \fIout\fP(1))\fR
+.HP
+\fBinteger function nf_put_varm_ubyte(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), integer \fIstride\fP(1), \fIimap\fP, integer*1 \fIout\fP(1))\fR
+.HP
+\fBinteger function nf_put_varm_ushort(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), integer \fIstride\fP(1), \fIimap\fP, integer*2 \fIout\fP(1))\fR
+.HP
+\fBinteger function nf_put_varm_uint(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), integer \fIstride\fP(1), \fIimap\fP, integer*4 \fIout\fP(1))\fR
+.HP
+\fBinteger function nf_put_varm_(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), integer \fIstride\fP(1), \fIimap\fP, integer*8 \fIout\fP(1))\fR
+.HP
+\fBinteger function nf_put_varm_uint64(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), integer \fIstride\fP(1), \fIimap\fP, integer*8 \fIout\fP(1))\fR
+.HP
+\fBinteger function nf_put_varm_string(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), integer \fIstride\fP(1), \fIimap\fP, character* \fIout\fP(1))\fR
+
+
+.sp
+These functions are used for \fImapped output\fP, which is like
+strided output described above, except that an additional index mapping
+vector is provided to specify the in-memory arrangement of the data
+values.
+For an explanation of the index
+mapping vector, see COMMON ARGUMENTS DESCRIPTIONS below.
+.HP
+\fBinteger function nf_get_varm_text(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), integer \fIstride\fP(1), \fIimap\fP, character*(*) \fIin\fP)\fR
+
+.HP
+\fBinteger function nf_get_varm_int1(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), integer \fIstride\fP(1), \fIimap\fP, integer*1 \fIin\fP(1))\fR
+.HP
+\fBinteger function nf_get_varm_int2(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), integer \fIstride\fP(1), \fIimap\fP, integer*2 \fIin\fP(1))\fR
+.HP
+\fBinteger function nf_get_varm_int(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), integer \fIstride\fP(1), \fIimap\fP, integer \fIin\fP(1))\fR
+
+.HP
+\fBinteger function nf_get_varm_real(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), integer \fIstride\fP(1), \fIimap\fP, real \fIin\fP(1))\fR
+.HP
+\fBinteger function nf_get_varm_double(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), integer \fIstride\fP(1), \fIimap\fP, doubleprecision \fIin\fP(1))\fR
+.HP
+\fBinteger function nf_get_varm_ubyte(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), integer \fIstride\fP(1), \fIimap\fP, integer*1 \fIin\fP(1))\fR
+.HP
+\fBinteger function nf_get_varm_ushort(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), integer \fIstride\fP(1), \fIimap\fP, integer*2 \fIin\fP(1))\fR
+.HP
+\fBinteger function nf_get_varm_uint(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), integer \fIstride\fP(1), \fIimap\fP, integer*4 \fIin\fP(1))\fR
+.HP
+\fBinteger function nf_get_varm_(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), integer \fIstride\fP(1), \fIimap\fP, integer*8 \fIin\fP(1))\fR
+.HP
+\fBinteger function nf_get_varm_uint64(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), integer \fIstride\fP(1), \fIimap\fP, integer*8 \fIin\fP(1))\fR
+.HP
+\fBinteger function nf_get_varm_string(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), integer \fIstride\fP(1), \fIimap\fP, character* \fIin\fP(1))\fR
+
+
+.sp
+These functions are used for \fImapped input\fP, which is like
+strided input described above, except that an additional index mapping
+vector is provided to specify the in-memory arrangement of the data
+values.
+For an explanation of the index
+mapping vector, see COMMON ARGUMENTS DESCRIPTIONS below.
+.SH "ATTRIBUTES"
+.LP
+.HP
+\fBinteger function nf_put_att_text(integer \fIncid\fP, integer \fIvarid\fP, character*(*) \fIname\fP, integer \fIxtype\fP, integer \fIlen\fP, character*(*) \fIout\fP)\fR
+
+.HP
+\fBinteger function nf_put_att_int1(integer \fIncid\fP, integer \fIvarid\fP, character*(*) \fIname\fP, integer \fIxtype\fP, integer \fIlen\fP, integer*1 \fIout\fP(1))\fR
+.HP
+\fBinteger function nf_put_att_int2(integer \fIncid\fP, integer \fIvarid\fP, character*(*) \fIname\fP, integer \fIxtype\fP, integer \fIlen\fP, integer*2 \fIout\fP(1))\fR
+.HP
+\fBinteger function nf_put_att_int(integer \fIncid\fP, integer \fIvarid\fP, character*(*) \fIname\fP, integer \fIxtype\fP, integer \fIlen\fP, integer \fIout\fP(1))\fR
+
+.HP
+\fBinteger function nf_put_att_real(integer \fIncid\fP, integer \fIvarid\fP, character*(*) \fIname\fP, integer \fIxtype\fP, integer \fIlen\fP, real \fIout\fP(1))\fR
+.HP
+\fBinteger function nf_put_att_double(integer \fIncid\fP, integer \fIvarid\fP, character*(*) \fIname\fP, integer \fIxtype\fP, integer \fIlen\fP, doubleprecision \fIout\fP(1))\fR
+.HP
+\fBinteger function nf_put_att_ubyte(integer \fIncid\fP, integer \fIvarid\fP, character*(*) \fIname\fP, integer \fIxtype\fP, integer \fIlen\fP, integer*1 \fIout\fP(1))\fR
+.HP
+\fBinteger function nf_put_att_ushort(integer \fIncid\fP, integer \fIvarid\fP, character*(*) \fIname\fP, integer \fIxtype\fP, integer \fIlen\fP, integer*2 \fIout\fP(1))\fR
+.HP
+\fBinteger function nf_put_att_uint(integer \fIncid\fP, integer \fIvarid\fP, character*(*) \fIname\fP, integer \fIxtype\fP, integer \fIlen\fP, integer*4 \fIout\fP(1))\fR
+.HP
+\fBinteger function nf_put_att_(integer \fIncid\fP, integer \fIvarid\fP, character*(*) \fIname\fP, integer \fIxtype\fP, integer \fIlen\fP, integer*8 \fIout\fP(1))\fR
+.HP
+\fBinteger function nf_put_att_uint64(integer \fIncid\fP, integer \fIvarid\fP, character*(*) \fIname\fP, integer \fIxtype\fP, integer \fIlen\fP, integer*8 \fIout\fP(1))\fR
+.HP
+\fBinteger function nf_put_att_string(integer \fIncid\fP, integer \fIvarid\fP, character*(*) \fIname\fP, integer \fIxtype\fP, integer \fIlen\fP, character* \fIout\fP(1))\fR
+
+
+.HP
+\fBinteger function nf_put_att(integer \fIncid\fP, integer \fIvarid\fP, character*(*) \fIname\fP, integer \fIxtype\fP, integer \fIlen\fP, void * \fIip\fP)\fR
+.HP
+\fBinteger function nf_get_att(integer \fIncid\fP, integer \fIvarid\fP, character*(*) \fIname\fP, void * \fIip\fP)\fR
+.sp
+Unlike variables, attributes do not have 
+separate functions for defining and writing values.
+This family of functions defines a new attribute with a value or changes
+the value of an existing attribute.
+If the attribute is new, or if the space required to
+store the attribute value is greater than before,
+the netCDF dataset must be in define mode.
+The parameter \fIlen\fP is the number of values from \fIout\fP to transfer.
+It is often one, except that for
+\fBnf_put_att_text(\|)\fR it will usually be
+\fBlen_trim(\fIout\fP)\fR.
+.sp
+For these functions, the type component of the function name refers to
+the in-memory type of the value, whereas the \fIxtype\fP argument refers to the
+external type for storing the value.  An \fBNF_ERANGE\fR
+error results if
+a conversion between these types is not possible.  In this case the value
+is represented with the appropriate fill-value for the associated 
+external type.
+.HP
+\fBinteger function nf_inq_attname(integer \fIncid\fP, integer \fIvarid\fP, integer \fIattnum\fP, character*(*) \fIname\fP)\fR
+.sp
+Gets the
+name of an attribute, given its variable ID and attribute number.
+This function is useful in generic applications that
+need to get the names of all the attributes associated with a variable,
+since attributes are accessed by name rather than number in all other
+attribute functions.  The number of an attribute is more volatile than
+the name, since it can change when other attributes of the same variable
+are deleted.  The attributes for each variable are numbered
+from 1 (the first attribute) to
+\fInvatts\fP,
+where \fInvatts\fP is
+the number of attributes for the variable, as returned from a call to
+\fBnf_inq_varnatts(\|)\fR.
+
+.HP
+\fBinteger function nf_inq_att(integer \fIncid\fP, integer \fIvarid\fP, character*(*) \fIname\fP, integer \fIxtype\fP, integer \fIlen\fP)\fR
+.HP
+\fBinteger function nf_inq_attid(integer \fIncid\fP, integer \fIvarid\fP, character*(*) \fIname\fP, integer \fIattnum\fP)\fR
+.HP
+\fBinteger function nf_inq_atttype(integer \fIncid\fP, integer \fIvarid\fP, character*(*) \fIname\fP, integer \fIxtype\fP)\fR
+.HP
+\fBinteger function nf_inq_attlen(integer \fIncid\fP, integer \fIvarid\fP, character*(*) \fIname\fP, integer \fIlen\fP)\fR
+.sp
+These functions return information about a netCDF attribute,
+given its variable ID and name.  The information returned is the
+external type in \fIxtype\fP
+and the number of elements in the attribute as \fIlen\fP.
+
+.HP
+\fBinteger function nf_copy_att(integer \fIncid\fP, integer \fIvarid_in\fP, character*(*) \fIname\fP, integer \fIncid_out\fP, integer \fIvarid_out\fP)\fR
+.sp
+Copies an
+attribute from one netCDF dataset to another.  It can also be used to
+copy an attribute from one variable to another within the same netCDF.
+\fIncid_in\fP is the netCDF ID of an input netCDF dataset from which the
+attribute will be copied.
+\fIvarid_in\fP
+is the ID of the variable in the input netCDF dataset from which the
+attribute will be copied, or \fBNF_GLOBAL\fR
+for a global attribute.
+\fIname\fP
+is the name of the attribute in the input netCDF dataset to be copied.
+\fIncid_out\fP
+is the netCDF ID of the output netCDF dataset to which the attribute will be 
+copied.
+It is permissible for the input and output netCDF ID's to be the same.  The
+output netCDF dataset should be in define mode if the attribute to be
+copied does not already exist for the target variable, or if it would
+cause an existing target attribute to grow.
+\fIvarid_out\fP
+is the ID of the variable in the output netCDF dataset to which the attribute will
+be copied, or \fBNF_GLOBAL\fR to copy to a global attribute.
+.HP
+\fBinteger function nf_rename_att(integer \fIncid\fP, integer \fIvarid\fP, character*(*) \fIname\fP, character*(*) \fInewname\fP)\fR
+.sp
+Changes the
+name of an attribute.  If the new name is longer than the original name,
+the netCDF must be in define mode.  You cannot rename an attribute to
+have the same name as another attribute of the same variable.
+\fIname\fP is the original attribute name.
+\fInewname\fP
+is the new name to be assigned to the specified attribute.  If the new name
+is longer than the old name, the netCDF dataset must be in define mode.
+.HP
+\fBinteger function nf_del_att(integer \fIncid\fP, integer \fIvarid\fP, character*(*) \fIname\fP)\fR
+.sp
+Deletes an attribute from a netCDF dataset.  The dataset must be in
+define mode.
+.HP
+\fBinteger function nf_get_att_text(integer \fIncid\fP, integer \fIvarid\fP, character*(*) \fIname\fP, character*(*) \fIin\fP)\fR
+
+.HP
+\fBinteger function nf_get_att_int1(integer \fIncid\fP, integer \fIvarid\fP, character*(*) \fIname\fP, integer*1 \fIin\fP(1))\fR
+.HP
+\fBinteger function nf_get_att_int2(integer \fIncid\fP, integer \fIvarid\fP, character*(*) \fIname\fP, integer*2 \fIin\fP(1))\fR
+.HP
+\fBinteger function nf_get_att_int(integer \fIncid\fP, integer \fIvarid\fP, character*(*) \fIname\fP, integer \fIin\fP(1))\fR
+
+.HP
+\fBinteger function nf_get_att_real(integer \fIncid\fP, integer \fIvarid\fP, character*(*) \fIname\fP, real \fIin\fP(1))\fR
+.HP
+\fBinteger function nf_get_att_double(integer \fIncid\fP, integer \fIvarid\fP, character*(*) \fIname\fP, doubleprecision \fIin\fP(1))\fR
+.HP
+\fBinteger function nf_get_att_ubyte(integer \fIncid\fP, integer \fIvarid\fP, character*(*) \fIname\fP, integer*1 \fIin\fP(1))\fR
+.HP
+\fBinteger function nf_get_att_ushort(integer \fIncid\fP, integer \fIvarid\fP, character*(*) \fIname\fP, integer*2 \fIin\fP(1))\fR
+.HP
+\fBinteger function nf_get_att_uint(integer \fIncid\fP, integer \fIvarid\fP, character*(*) \fIname\fP, integer*4 \fIin\fP(1))\fR
+.HP
+\fBinteger function nf_get_att_(integer \fIncid\fP, integer \fIvarid\fP, character*(*) \fIname\fP, integer*8 \fIin\fP(1))\fR
+.HP
+\fBinteger function nf_get_att_uint64(integer \fIncid\fP, integer \fIvarid\fP, character*(*) \fIname\fP, integer*8 \fIin\fP(1))\fR
+.HP
+\fBinteger function nf_get_att_string(integer \fIncid\fP, integer \fIvarid\fP, character*(*) \fIname\fP, character* \fIin\fP(1))\fR
+
+
+.sp
+Gets the value(s) of a netCDF attribute, given its
+variable ID and name.  Converts from the external type to the type
+specified in
+the function name, if possible, otherwise returns an \fBNF_ERANGE\fR
+error.
+All elements of the vector of attribute
+values are returned, so you must allocate enough space to hold
+them.  If you don't know how much space to reserve, call
+\fBnf_inq_attlen(\|)\fR
+first to find out the length of the attribute.
+.SH "COMMON ARGUMENT DESCRIPTIONS"
+.LP
+In this section we define some common arguments which are used in the 
+"FUNCTION DESCRIPTIONS" section.
+.TP
+integer \fIncid\fP
+is the netCDF ID returned from a previous, successful call to
+\fBnf_open(\|)\fR or \fBnf_create(\|)\fR
+.TP
+character*(*) \fIname\fP
+is the name of a dimension, variable, or attribute. The names of 
+dimensions, variables and attributes consist of arbitrary
+sequences of alphanumeric characters (as well as underscore '_',
+period '.' and hyphen '-'), beginning with a letter or
+underscore. (However names commencing with underscore are reserved for
+system use.) Case is significant in netCDF names. A zero-length name
+is not allowed.
+
+The maximum allowable number of characters 
+ is \fBNF_MAX_NAME\fR.
+.TP
+integer \fIxtype\fP
+specifies the external data type of a netCDF variable or attribute and
+is one of the following:
+\fBNF_BYTE\fR, \fBNF_CHAR\fR, \fBNF_SHORT\fR, \fBNF_INT\fR, 
+\fBNF_FLOAT\fR, or \fBNF_DOUBLE\fR.
+These are used to specify 8-bit integers,
+characters, 16-bit integers, 32-bit integers, 32-bit IEEE floating point
+numbers, and 64-bit IEEE floating-point numbers, respectively.
+
+.TP
+integer \fIdimids\fP(1)
+is a vector of dimension ID's and defines the shape of a netCDF variable.
+The size of the vector shall be greater than or equal to the
+rank (i.e. the number of dimensions) of the variable (\fIndims\fP).
+The vector shall be ordered by the speed with which a dimension varies:
+\fIdimids\fP(1)
+shall be the dimension ID of the most rapidly
+varying dimension and
+\fIdimids\fP(\fIndims\fP)
+shall be the dimension ID of the most slowly
+varying dimension.
+The maximum possible number of
+dimensions for a variable is given by the symbolic constant
+\fBNF_MAX_VAR_DIMS\fR.
+.TP
+integer \fIdimid\fP
+is the ID of a netCDF dimension.
+netCDF dimension ID's are allocated sequentially from the 
+positive
+integers beginning with 1.
+.TP
+integer \fIndims\fP
+is either the total number of dimensions in a netCDF dataset or the rank
+(i.e. the number of dimensions) of a netCDF variable.
+The value shall not be negative or greater than the symbolic constant 
+\fBNF_MAX_VAR_DIMS\fR.
+.TP
+integer \fIvarid\fP
+is the ID of a netCDF variable or (for the attribute-access functions) 
+the symbolic constant
+\fBNF_GLOBAL\fR,
+which is used to reference global attributes.
+netCDF variable ID's are allocated sequentially from the 
+positive
+integers beginning with 1.
+.TP
+integer \fInatts\fP
+is the number of global attributes in a netCDF dataset  for the
+\fBnf_inquire(\|)\fR
+function or the number
+of attributes associated with a netCDF variable for the
+\fBnf_varinq(\|)\fR
+function.
+.TP
+integer \fIindex\fP(1)
+specifies the indicial coordinates of the netCDF data value to be accessed.
+The indices start at 1;
+thus, for example, the first data value of a
+two-dimensional variable is (1,1).
+The size of the vector shall be at least the rank of the associated
+netCDF variable and its elements shall correspond, in order, to the
+variable's dimensions.
+.TP
+integer \fIstart\fP(1)
+specifies the starting point
+for accessing a netCDF variable's data values
+in terms of the indicial coordinates of 
+the corner of the array section.
+The indices start at 1;
+thus, the first data
+value of a variable is (1, 1, ..., 1).
+The size of the vector shall be at least the rank of the associated
+netCDF variable and its elements shall correspond, in order, to the
+variable's dimensions.
+.TP
+integer \fIcount\fP(1)
+specifies the number of indices selected along each dimension of the
+array section.
+Thus, to access a single value, for example, specify \fIcount\fP as
+(1, 1, ..., 1).
+Note that, for strided I/O, this argument must be adjusted
+to be compatible with the \fIstride\fP and \fIstart\fP arguments so that 
+the interaction of the
+three does not attempt to access an invalid data co-ordinate.
+The elements of the
+\fIcount\fP vector correspond, in order, to the variable's dimensions.
+.TP
+integer \fIstride\fP(1)
+specifies the sampling interval along each dimension of the netCDF
+variable.   The elements of the stride vector correspond, in order,
+to the netCDF variable's dimensions (\fIstride\fP(1))
+gives the sampling interval along the most rapidly 
+varying dimension of the netCDF variable).  Sampling intervals are
+specified in type-independent units of elements (a value of 1 selects
+consecutive elements of the netCDF variable along the corresponding
+dimension, a value of 2 selects every other element, etc.).
+
+.TP
+\fIimap\fP
+specifies the mapping between the dimensions of a netCDF variable and
+the in-memory structure of the internal data array.  The elements of
+the index mapping vector correspond, in order, to the netCDF variable's
+dimensions (\fIimap\fP(1) gives the distance
+between elements of the internal array corresponding to the most
+rapidly varying dimension of the netCDF variable).
+Distances between elements are specified in type-independent units of
+elements (the distance between internal elements that occupy adjacent
+memory locations is 1 and not the element's byte-length as in netCDF 2).
+
+.SH "VARIABLE PREFILLING"
+.LP
+By default, the netCDF interface sets the values of
+all newly-defined variables of finite length (i.e. those that do not have
+an unlimited, dimension) to the type-dependent fill-value associated with each 
+variable.  This is done when \fBnf_enddef(\|)\fR
+is called.  The
+fill-value for a variable may be changed from the default value by
+defining the attribute `\fB_FillValue\fR' for the variable.  This
+attribute must have the same type as the variable and be of length one.
+.LP
+Variables with an unlimited dimension are also prefilled, but on
+an `as needed' basis.  For example, if the first write of such a
+variable is to position 5, then
+positions
+1 through 4
+(and no others)
+would be set to the fill-value at the same time.
+.LP
+This default prefilling of data values may be disabled by
+or'ing the
+\fBNF_NOFILL\fR
+flag into the mode parameter of \fBnf_open(\|)\fR or \fBnf_create(\|)\fR,
+or, by calling the function \fBnf_set_fill(\|)\fR
+with the argument \fBNF_NOFILL\fR.
+For variables that do not use the unlimited dimension,
+this call must
+be made before
+\fBnf_enddef(\|)\fR.
+For variables that
+use the unlimited dimension, this call
+may be made at any time.
+.LP
+One can obtain increased performance of the netCDF interface by using 
+this feature, but only at the expense of requiring the application to set
+every single data value.  The performance
+enhancing behavior of this function is dependent on the particulars of
+the implementation and dataset format.
+The flag value controlled by \fBnf_set_fill(\|)\fR
+is per netCDF ID,
+not per variable or per write. 
+Allowing this to change affects the degree to which
+a program can be effectively parallelized.
+Given all of this, we state that the use
+of this feature may not be available (or even needed) in future
+releases. Programmers are cautioned against heavy reliance upon this
+feature.
+.HP
+\fBinteger function nf_setfill(integer \fIncid\fP, integer \fIfillmode\fP, integer \fIold_fillemode\fP)\fR
+
+.sp
+Determines whether or not variable prefilling will be done (see 
+above).
+The netCDF dataset shall be writable.
+\fIfillmode\fP is either \fBNF_FILL\fR
+to enable prefilling (the
+default) or \fBNF_NOFILL\fR
+to disable prefilling.
+This function returns the previous setting in \fIold_fillmode\fP.
+
+.HP
+.SH "MPP FUNCTION DESCRIPTIONS"
+.LP
+Additional functions for use on SGI/Cray MPP machines (_CRAYMPP).
+These are used to set and inquire which PE is the base for MPP
+for a particular netCDF. These are only relevant when
+using the SGI/Cray ``global''
+Flexible File I/O layer and desire to have
+only a subset of PEs to open the specific netCDF file.
+For technical reasons, these functions are available on all platforms.
+On a platform other than SGI/Cray MPP, it is as if
+only processor available were processor 0.
+.LP
+To use this feature, you need to specify a communicator group and call
+\fBglio_group_mpi(\|)\fR or \fBglio_group_shmem(\|)\fR prior to the netCDF
+\fBnf_open(\|)\fR and \fBnf_create(\|)\fR calls.
+.HP
+\fBinteger function nf__create_mp(character*(*) \fIpath\fP, integer \fIcmode\fP, integer \fIinitialsize\fP, integer \fIpe\fP, integer \fIchunksize\fP, integer \fIncid\fP)\fR
+.sp
+Like \fBnf__create(\|)\fR but allows the base PE to be set.
+.sp
+The argument \fIpe\fP sets the base PE at creation time. In the MPP
+environment, \fBnf__create(\|)\fR and \fBnf_create(\|)\fR set the base PE to processor
+zero by default.
+.HP
+\fBinteger function nf__open_mp(character*(*) \fIpath\fP, integer \fImode\fP, integer \fIpe\fP, integer \fIchunksize\fP, integer \fIncid\fP)\fR
+.sp
+Like \fBnf__open(\|)\fR but allows the base PE to be set.
+The argument \fIpe\fP sets the base PE at creation time. In the MPP
+environment, \fBnf__open(\|)\fR and \fBnf_open(\|)\fR set the base PE to processor
+zero by default.
+.HP
+\fBinteger function nf_inq_base_pe(integer \fIncid\fP, integer \fIpe\fP)\fR
+.sp
+Inquires of the netCDF dataset which PE is being used as the base for MPP use.
+This is safe to use at any time.
+.HP
+\fBinteger function nf_set_base_pe(integer \fIncid\fP, integer \fIpe\fP)\fR
+.sp
+Resets the base PE for the netCDF dataset.
+Only perform this operation when the affected communicator group
+synchronizes before and after the call.
+This operation is very risky and should only be contemplated
+under only the most extreme cases.
+.SH "ENVIRONMENT VARIABLES"
+.TP 4
+.B NETCDF_FFIOSPEC
+Specifies the Flexible File I/O buffers for netCDF I/O when executing
+under the UNICOS operating system (the variable is ignored on other
+operating systems).
+An appropriate specification can greatly increase the efficiency of 
+netCDF I/O -- to the extent that it can actually surpass FORTRAN binary 
+I/O.
+This environment variable has been made a little more generalized,
+such that other FFIO option specifications can now be added.
+The default specification is \fBbufa:336:2\fP,
+unless a current FFIO specification is in operation,
+which will be honored.
+See UNICOS Flexible File I/O for more information.
+.SH "MAILING-LISTS"
+.LP
+Both a mailing list and a digest are available for
+discussion of the netCDF interface and announcements about netCDF bugs,
+fixes, and enhancements.
+To begin or change your subscription to either the mailing-list or the
+digest, send one of the following in the body (not
+the subject line) of an email message to "majordomo at unidata.ucar.edu".
+Use your email address in place of \fIjdoe at host.inst.domain\fP.
+.sp
+To subscribe to the netCDF mailing list:
+.RS
+\fBsubscribe netcdfgroup \fIjdoe at host.inst.domain\fR
+.RE
+To unsubscribe from the netCDF mailing list:
+.RS
+\fBunsubscribe netcdfgroup \fIjdoe at host.inst.domain\fR
+.RE
+To subscribe to the netCDF digest:
+.RS
+\fBsubscribe netcdfdigest \fIjdoe at host.inst.domain\fR
+.RE
+To unsubscribe from the netCDF digest:
+.RS
+\fBunsubscribe netcdfdigest \fIjdoe at host.inst.domain\fR
+.RE
+To retrieve the general introductory information for the mailing list:
+.RS
+\fBinfo netcdfgroup\fR
+.RE
+To get a synopsis of other majordomo commands:
+.RS
+\fBhelp\fR
+.RE
+.SH "SEE ALSO"
+.LP
+.BR ncdump (1),
+.BR ncgen (1),
+.BR netcdf (3f).
+.LP
+\fInetCDF User's Guide\fP, published
+by the Unidata Program Center, University Corporation for Atmospheric
+Research, located in Boulder, Colorado.
+
+NetCDF home page at http:/www.unidata.ucar.edu/netcdf.
diff --git a/libsrc/nfconfig.in b/libsrc/nfconfig.in
new file mode 100644
index 0000000..66de30d
--- /dev/null
+++ b/libsrc/nfconfig.in
@@ -0,0 +1,103 @@
+#if 0
+    $Id: nfconfig.in,v 1.11 1997/12/03 17:41:42 steve Exp $ 
+#endif
+
+
+#ifndef UD_NETCDF_CPP_INC
+#define UD_NETCDF_CPP_INC
+
+
+#if 0
+    Do not have C-style comments in here because this file is processed
+    by both the FORTRAN compiler (for the nf_test/ stuff) and the C
+    compiler (for the FORTRAN-callable interface routines) and some 
+    FORTRAN preprocessors do not understand the /*...*/ syntax.
+#endif
+
+
+#if 0
+    The following macros define the supplementary FORTRAN arithmetic
+    datatypes beyond the standard INTEGER, REAL, and DOUBLEPRECISION --
+    ostensibly corresponding to 8-bit and 16-bit integers, respectively.
+    For example:
+
+	#define NF_INT1_T        byte
+	#define NF_INT2_T        integer*2
+
+    These are the types of the relevant arguments in the NF_*_INT1() and
+    NF_*_INT2() netCDF FORTRAN function calls.  The word "ostensibly"
+    is used advisedly: on some systems an "integer*2" datatype,
+    nevertheless, occupies 64 bits (we are not making this up).
+
+    If your FORTRAN system does not have the respective supplementary
+    datatype, then do not define the corresponding macro.
+#endif
+#undef NF_INT1_T
+#undef NF_INT2_T
+
+
+#if 0
+   Define the following NF_*_IS_C_* macros appropriatly for your system.
+   The "INT1", "INT2" and "INT" after the "NF_" refer to the NF_INT1_T
+   FORTRAN datatype, the NF_INT2_T FORTRAN datatype, and the INTEGER
+   FORTRAN datatype, respectively.  If the respective FORTRAN datatype
+   does not exist, then do not define the corresponding macro.
+#endif
+#undef NF_INT1_IS_C_SIGNED_CHAR
+#undef NF_INT1_IS_C_SHORT
+#undef NF_INT1_IS_C_INT
+#undef NF_INT1_IS_C_LONG
+#undef NF_INT2_IS_C_SHORT
+#undef NF_INT2_IS_C_INT
+#undef NF_INT2_IS_C_LONG
+#undef NF_INT_IS_C_INT
+#undef NF_INT_IS_C_LONG
+#undef NF_REAL_IS_C_FLOAT
+#undef NF_REAL_IS_C_DOUBLE
+#undef NF_DOUBLEPRECISION_IS_C_DOUBLE
+#undef NF_DOUBLEPRECISION_IS_C_FLOAT
+
+
+#if 0
+   Whether the system uses something besides the IEEE floating-point
+   format to represent floating-point values.
+#endif
+#undef NO_IEEE_FLOAT
+
+
+#if 0
+   END OF CUSTOMIZATION
+#endif
+
+
+#if 0
+    FORTRAN data types corresponding to netCDF version 2 "byte" and "short"
+    data types (e.g. INTEGER*1, INTEGER*2).  See file "ftest.F" for usage.
+#endif
+#if !defined(NO_NETCDF_2)
+#   undef NCBYTE_T
+#   undef NCSHORT_T
+#endif
+
+#if 0
+  Set configuration flags for Fortran 2003 processing
+#endif
+
+#if 0
+  Set NO_NETCDF_2 to undefined - include netCDF2
+#endif
+#undef NO_NETCDF_2
+
+#if 0
+  Set USE_NETCDF4 to defined - include netCDF4 code
+#endif
+#undef USE_NETCDF4
+
+#if 0
+  Set HAVE_TS29113_SUPPORT to defined - TS29113 types (like CPTRDIFF_T) defined
+#endif
+#undef HAVE_TS29113_SUPPORT
+#undef SIZEOF_PTRDIFF_T
+
+#endif /*UD_NETCDF_CPP_INC*/
+
diff --git a/libsrc/nfconfig.in.cmake b/libsrc/nfconfig.in.cmake
new file mode 100644
index 0000000..92ee065
--- /dev/null
+++ b/libsrc/nfconfig.in.cmake
@@ -0,0 +1,97 @@
+#if 0
+    $Id: nfconfig.in,v 1.11 1997/12/03 17:41:42 steve Exp $ 
+#endif
+
+
+#ifndef UD_NETCDF_CPP_INC
+#define UD_NETCDF_CPP_INC
+
+
+#if 0
+    Do not have C-style comments in here because this file is processed
+    by both the FORTRAN compiler (for the nf_test/ stuff) and the C
+    compiler (for the FORTRAN-callable interface routines) and some 
+    FORTRAN preprocessors do not understand the /*...*/ syntax.
+#endif
+
+
+#if 0
+    The following macros define the supplementary FORTRAN arithmetic
+    datatypes beyond the standard INTEGER, REAL, and DOUBLEPRECISION --
+    ostensibly corresponding to 8-bit and 16-bit integers, respectively.
+    For example:
+
+	#define NF_INT1_T        byte
+	#define NF_INT2_T        integer*2
+
+    These are the types of the relevant arguments in the NF_*_INT1() and
+    NF_*_INT2() netCDF FORTRAN function calls.  The word "ostensibly"
+    is used advisedly: on some systems an "integer*2" datatype,
+    nevertheless, occupies 64 bits (we are not making this up).
+
+    If your FORTRAN system does not have the respective supplementary
+    datatype, then do not define the corresponding macro.
+#endif
+#cmakedefine NF_INT1_T byte
+#cmakedefine NF_INT2_T integer*2
+
+
+#if 0
+   Define the following NF_*_IS_C_* macros appropriatly for your system.
+   The "INT1", "INT2" and "INT" after the "NF_" refer to the NF_INT1_T
+   FORTRAN datatype, the NF_INT2_T FORTRAN datatype, and the INTEGER
+   FORTRAN datatype, respectively.  If the respective FORTRAN datatype
+   does not exist, then do not define the corresponding macro.
+#endif
+#cmakedefine NF_INT1_IS_C_SIGNED_CHAR  1
+#cmakedefine NF_INT1_IS_C_SHORT  1
+#cmakedefine NF_INT1_IS_C_INT  1
+#cmakedefine NF_INT1_IS_C_LONG  1
+#cmakedefine NF_INT2_IS_C_SHORT  1
+#cmakedefine NF_INT2_IS_C_INT  1
+#cmakedefine NF_INT2_IS_C_LONG  1
+#cmakedefine NF_INT_IS_C_INT  1
+#cmakedefine NF_INT_IS_C_LONG  1
+#cmakedefine NF_REAL_IS_C_FLOAT  1
+#cmakedefine NF_REAL_IS_C_DOUBLE  1
+#cmakedefine NF_DOUBLEPRECISION_IS_C_DOUBLE  1
+#cmakedefine NF_DOUBLEPRECISION_IS_C_FLOAT  1
+
+
+#if 0
+   Whether the system uses something besides the IEEE floating-point
+   format to represent floating-point values.
+#endif
+#cmakedefine NO_IEEE_FLOAT
+
+
+#if 0
+   END OF CUSTOMIZATION
+#endif
+
+
+#if 0
+    FORTRAN data types corresponding to netCDF version 2 "byte" and "short"
+    data types (e.g. INTEGER*1, INTEGER*2).  See file "ftest.F" for usage.
+#endif
+#if !defined(NO_NETCDF_2)
+#cmakedefine NCBYTE_T byte
+#cmakedefine NCSHORT_T integer*2
+#endif
+
+#if 0
+  Set configuration flags for Fortran 2003 processing
+#endif
+
+#if 0
+  Set NO_NETCDF_2 to undefined - include netCDF2
+#endif
+#cmakedefine NO_NETCDF_2
+
+#if 0
+  Set USE_NETCDF4 to defined - include netCDF4 code
+#endif
+#cmakedefine USE_NETCDF4  1
+
+#endif /*UD_NETCDF_CPP_INC*/
+
diff --git a/libsrc/nfconfig.inc b/libsrc/nfconfig.inc
new file mode 100644
index 0000000..11ee4f8
--- /dev/null
+++ b/libsrc/nfconfig.inc
@@ -0,0 +1,103 @@
+#if 0
+    $Id: nfconfig.in,v 1.11 1997/12/03 17:41:42 steve Exp $ 
+#endif
+
+
+#ifndef UD_NETCDF_CPP_INC
+#define UD_NETCDF_CPP_INC
+
+
+#if 0
+    Do not have C-style comments in here because this file is processed
+    by both the FORTRAN compiler (for the nf_test/ stuff) and the C
+    compiler (for the FORTRAN-callable interface routines) and some 
+    FORTRAN preprocessors do not understand the /*...*/ syntax.
+#endif
+
+
+#if 0
+    The following macros define the supplementary FORTRAN arithmetic
+    datatypes beyond the standard INTEGER, REAL, and DOUBLEPRECISION --
+    ostensibly corresponding to 8-bit and 16-bit integers, respectively.
+    For example:
+
+	#define NF_INT1_T byte
+	#define NF_INT2_T integer*2
+
+    These are the types of the relevant arguments in the NF_*_INT1() and
+    NF_*_INT2() netCDF FORTRAN function calls.  The word "ostensibly"
+    is used advisedly: on some systems an "integer*2" datatype,
+    nevertheless, occupies 64 bits (we are not making this up).
+
+    If your FORTRAN system does not have the respective supplementary
+    datatype, then do not define the corresponding macro.
+#endif
+#define NF_INT1_T byte
+#define NF_INT2_T integer*2
+
+
+#if 0
+   Define the following NF_*_IS_C_* macros appropriatly for your system.
+   The "INT1", "INT2" and "INT" after the "NF_" refer to the NF_INT1_T
+   FORTRAN datatype, the NF_INT2_T FORTRAN datatype, and the INTEGER
+   FORTRAN datatype, respectively.  If the respective FORTRAN datatype
+   does not exist, then do not define the corresponding macro.
+#endif
+#define NF_INT1_IS_C_SIGNED_CHAR 1
+#undef NF_INT1_IS_C_SHORT
+#undef NF_INT1_IS_C_INT
+#undef NF_INT1_IS_C_LONG
+#define NF_INT2_IS_C_SHORT 1
+#undef NF_INT2_IS_C_INT
+#undef NF_INT2_IS_C_LONG
+#define NF_INT_IS_C_INT 1
+#undef NF_INT_IS_C_LONG
+#define NF_REAL_IS_C_FLOAT 1
+#undef NF_REAL_IS_C_DOUBLE
+#define NF_DOUBLEPRECISION_IS_C_DOUBLE 1
+#undef NF_DOUBLEPRECISION_IS_C_FLOAT
+
+
+#if 0
+   Whether the system uses something besides the IEEE floating-point
+   format to represent floating-point values.
+#endif
+#undef NO_IEEE_FLOAT
+
+
+#if 0
+   END OF CUSTOMIZATION
+#endif
+
+
+#if 0
+    FORTRAN data types corresponding to netCDF version 2 "byte" and "short"
+    data types (e.g. INTEGER*1, INTEGER*2).  See file "ftest.F" for usage.
+#endif
+#if !defined(NO_NETCDF_2)
+#   define NCBYTE_T byte
+#   define NCSHORT_T integer*2
+#endif
+
+#if 0
+  Set configuration flags for Fortran 2003 processing
+#endif
+
+#if 0
+  Set NO_NETCDF_2 to undefined - include netCDF2
+#endif
+#undef NO_NETCDF_2
+
+#if 0
+  Set USE_NETCDF4 to defined - include netCDF4 code
+#endif
+#define USE_NETCDF4 1
+
+#if 0
+  Set HAVE_TS29113_SUPPORT to defined - TS29113 types (like CPTRDIFF_T) defined
+#endif
+#define HAVE_TS29113_SUPPORT 1
+#define SIZEOF_PTRDIFF_T 8
+
+#endif /*UD_NETCDF_CPP_INC*/
+
diff --git a/ltmain.sh b/ltmain.sh
new file mode 100644
index 0000000..63ae69d
--- /dev/null
+++ b/ltmain.sh
@@ -0,0 +1,9655 @@
+
+# libtool (GNU libtool) 2.4.2
+# Written by Gordon Matzigkeit <gord at gnu.ai.mit.edu>, 1996
+
+# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2006,
+# 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc.
+# This is free software; see the source for copying conditions.  There is NO
+# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+# GNU Libtool is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# As a special exception to the GNU General Public License,
+# if you distribute this file as part of a program or library that
+# is built using GNU Libtool, you may include this file under the
+# same distribution terms that you use for the rest of that program.
+#
+# GNU Libtool is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GNU Libtool; see the file COPYING.  If not, a copy
+# can be downloaded from http://www.gnu.org/licenses/gpl.html,
+# or obtained by writing to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+# Usage: $progname [OPTION]... [MODE-ARG]...
+#
+# Provide generalized library-building support services.
+#
+#       --config             show all configuration variables
+#       --debug              enable verbose shell tracing
+#   -n, --dry-run            display commands without modifying any files
+#       --features           display basic configuration information and exit
+#       --mode=MODE          use operation mode MODE
+#       --preserve-dup-deps  don't remove duplicate dependency libraries
+#       --quiet, --silent    don't print informational messages
+#       --no-quiet, --no-silent
+#                            print informational messages (default)
+#       --no-warn            don't display warning messages
+#       --tag=TAG            use configuration variables from tag TAG
+#   -v, --verbose            print more informational messages than default
+#       --no-verbose         don't print the extra informational messages
+#       --version            print version information
+#   -h, --help, --help-all   print short, long, or detailed help message
+#
+# MODE must be one of the following:
+#
+#         clean              remove files from the build directory
+#         compile            compile a source file into a libtool object
+#         execute            automatically set library path, then run a program
+#         finish             complete the installation of libtool libraries
+#         install            install libraries or executables
+#         link               create a library or an executable
+#         uninstall          remove libraries from an installed directory
+#
+# MODE-ARGS vary depending on the MODE.  When passed as first option,
+# `--mode=MODE' may be abbreviated as `MODE' or a unique abbreviation of that.
+# Try `$progname --help --mode=MODE' for a more detailed description of MODE.
+#
+# When reporting a bug, please describe a test case to reproduce it and
+# include the following information:
+#
+#         host-triplet:	$host
+#         shell:		$SHELL
+#         compiler:		$LTCC
+#         compiler flags:		$LTCFLAGS
+#         linker:		$LD (gnu? $with_gnu_ld)
+#         $progname:	(GNU libtool) 2.4.2
+#         automake:	$automake_version
+#         autoconf:	$autoconf_version
+#
+# Report bugs to <bug-libtool at gnu.org>.
+# GNU libtool home page: <http://www.gnu.org/software/libtool/>.
+# General help using GNU software: <http://www.gnu.org/gethelp/>.
+
+PROGRAM=libtool
+PACKAGE=libtool
+VERSION=2.4.2
+TIMESTAMP=""
+package_revision=1.3337
+
+# 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+"$@"}'='"$@"'
+  setopt NO_GLOB_SUBST
+else
+  case `(set -o) 2>/dev/null` in *posix*) set -o posix;; esac
+fi
+BIN_SH=xpg4; export BIN_SH # for Tru64
+DUALCASE=1; export DUALCASE # for MKS sh
+
+# A function that is used when there is no print builtin or printf.
+func_fallback_echo ()
+{
+  eval 'cat <<_LTECHO_EOF
+$1
+_LTECHO_EOF'
+}
+
+# NLS nuisances: We save the old values to restore during execute mode.
+lt_user_locale=
+lt_safe_locale=
+for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES
+do
+  eval "if test \"\${$lt_var+set}\" = set; then
+          save_$lt_var=\$$lt_var
+          $lt_var=C
+	  export $lt_var
+	  lt_user_locale=\"$lt_var=\\\$save_\$lt_var; \$lt_user_locale\"
+	  lt_safe_locale=\"$lt_var=C; \$lt_safe_locale\"
+	fi"
+done
+LC_ALL=C
+LANGUAGE=C
+export LANGUAGE LC_ALL
+
+$lt_unset CDPATH
+
+
+# Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh
+# is ksh but when the shell is invoked as "sh" and the current value of
+# the _XPG environment variable is not equal to 1 (one), the special
+# positional parameter $0, within a function call, is the name of the
+# function.
+progpath="$0"
+
+
+
+: ${CP="cp -f"}
+test "${ECHO+set}" = set || ECHO=${as_echo-'printf %s\n'}
+: ${MAKE="make"}
+: ${MKDIR="mkdir"}
+: ${MV="mv -f"}
+: ${RM="rm -f"}
+: ${SHELL="${CONFIG_SHELL-/bin/sh}"}
+: ${Xsed="$SED -e 1s/^X//"}
+
+# Global variables:
+EXIT_SUCCESS=0
+EXIT_FAILURE=1
+EXIT_MISMATCH=63  # $? = 63 is used to indicate version mismatch to missing.
+EXIT_SKIP=77	  # $? = 77 is used to indicate a skipped test to automake.
+
+exit_status=$EXIT_SUCCESS
+
+# Make sure IFS has a sensible default
+lt_nl='
+'
+IFS=" 	$lt_nl"
+
+dirname="s,/[^/]*$,,"
+basename="s,^.*/,,"
+
+# func_dirname file append nondir_replacement
+# Compute the dirname of FILE.  If nonempty, add APPEND to the result,
+# otherwise set result to NONDIR_REPLACEMENT.
+func_dirname ()
+{
+    func_dirname_result=`$ECHO "${1}" | $SED "$dirname"`
+    if test "X$func_dirname_result" = "X${1}"; then
+      func_dirname_result="${3}"
+    else
+      func_dirname_result="$func_dirname_result${2}"
+    fi
+} # func_dirname may be replaced by extended shell implementation
+
+
+# func_basename file
+func_basename ()
+{
+    func_basename_result=`$ECHO "${1}" | $SED "$basename"`
+} # func_basename may be replaced by extended shell implementation
+
+
+# func_dirname_and_basename file append nondir_replacement
+# perform func_basename and func_dirname in a single function
+# call:
+#   dirname:  Compute the dirname of FILE.  If nonempty,
+#             add APPEND to the result, otherwise set result
+#             to NONDIR_REPLACEMENT.
+#             value returned in "$func_dirname_result"
+#   basename: Compute filename of FILE.
+#             value retuned in "$func_basename_result"
+# Implementation must be kept synchronized with func_dirname
+# and func_basename. For efficiency, we do not delegate to
+# those functions but instead duplicate the functionality here.
+func_dirname_and_basename ()
+{
+    # Extract subdirectory from the argument.
+    func_dirname_result=`$ECHO "${1}" | $SED -e "$dirname"`
+    if test "X$func_dirname_result" = "X${1}"; then
+      func_dirname_result="${3}"
+    else
+      func_dirname_result="$func_dirname_result${2}"
+    fi
+    func_basename_result=`$ECHO "${1}" | $SED -e "$basename"`
+} # func_dirname_and_basename may be replaced by extended shell implementation
+
+
+# func_stripname prefix suffix name
+# strip PREFIX and SUFFIX off of NAME.
+# PREFIX and SUFFIX must not contain globbing or regex special
+# characters, hashes, percent signs, but SUFFIX may contain a leading
+# dot (in which case that matches only a dot).
+# func_strip_suffix prefix name
+func_stripname ()
+{
+    case ${2} in
+      .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;;
+      *)  func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;;
+    esac
+} # func_stripname may be replaced by extended shell implementation
+
+
+# These SED scripts presuppose an absolute path with a trailing slash.
+pathcar='s,^/\([^/]*\).*$,\1,'
+pathcdr='s,^/[^/]*,,'
+removedotparts=':dotsl
+		s@/\./@/@g
+		t dotsl
+		s,/\.$,/,'
+collapseslashes='s@/\{1,\}@/@g'
+finalslash='s,/*$,/,'
+
+# func_normal_abspath PATH
+# Remove doubled-up and trailing slashes, "." path components,
+# and cancel out any ".." path components in PATH after making
+# it an absolute path.
+#             value returned in "$func_normal_abspath_result"
+func_normal_abspath ()
+{
+  # Start from root dir and reassemble the path.
+  func_normal_abspath_result=
+  func_normal_abspath_tpath=$1
+  func_normal_abspath_altnamespace=
+  case $func_normal_abspath_tpath in
+    "")
+      # Empty path, that just means $cwd.
+      func_stripname '' '/' "`pwd`"
+      func_normal_abspath_result=$func_stripname_result
+      return
+    ;;
+    # The next three entries are used to spot a run of precisely
+    # two leading slashes without using negated character classes;
+    # we take advantage of case's first-match behaviour.
+    ///*)
+      # Unusual form of absolute path, do nothing.
+    ;;
+    //*)
+      # Not necessarily an ordinary path; POSIX reserves leading '//'
+      # and for example Cygwin uses it to access remote file shares
+      # over CIFS/SMB, so we conserve a leading double slash if found.
+      func_normal_abspath_altnamespace=/
+    ;;
+    /*)
+      # Absolute path, do nothing.
+    ;;
+    *)
+      # Relative path, prepend $cwd.
+      func_normal_abspath_tpath=`pwd`/$func_normal_abspath_tpath
+    ;;
+  esac
+  # Cancel out all the simple stuff to save iterations.  We also want
+  # the path to end with a slash for ease of parsing, so make sure
+  # there is one (and only one) here.
+  func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \
+        -e "$removedotparts" -e "$collapseslashes" -e "$finalslash"`
+  while :; do
+    # Processed it all yet?
+    if test "$func_normal_abspath_tpath" = / ; then
+      # If we ascended to the root using ".." the result may be empty now.
+      if test -z "$func_normal_abspath_result" ; then
+        func_normal_abspath_result=/
+      fi
+      break
+    fi
+    func_normal_abspath_tcomponent=`$ECHO "$func_normal_abspath_tpath" | $SED \
+        -e "$pathcar"`
+    func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \
+        -e "$pathcdr"`
+    # Figure out what to do with it
+    case $func_normal_abspath_tcomponent in
+      "")
+        # Trailing empty path component, ignore it.
+      ;;
+      ..)
+        # Parent dir; strip last assembled component from result.
+        func_dirname "$func_normal_abspath_result"
+        func_normal_abspath_result=$func_dirname_result
+      ;;
+      *)
+        # Actual path component, append it.
+        func_normal_abspath_result=$func_normal_abspath_result/$func_normal_abspath_tcomponent
+      ;;
+    esac
+  done
+  # Restore leading double-slash if one was found on entry.
+  func_normal_abspath_result=$func_normal_abspath_altnamespace$func_normal_abspath_result
+}
+
+# func_relative_path SRCDIR DSTDIR
+# generates a relative path from SRCDIR to DSTDIR, with a trailing
+# slash if non-empty, suitable for immediately appending a filename
+# without needing to append a separator.
+#             value returned in "$func_relative_path_result"
+func_relative_path ()
+{
+  func_relative_path_result=
+  func_normal_abspath "$1"
+  func_relative_path_tlibdir=$func_normal_abspath_result
+  func_normal_abspath "$2"
+  func_relative_path_tbindir=$func_normal_abspath_result
+
+  # Ascend the tree starting from libdir
+  while :; do
+    # check if we have found a prefix of bindir
+    case $func_relative_path_tbindir in
+      $func_relative_path_tlibdir)
+        # found an exact match
+        func_relative_path_tcancelled=
+        break
+        ;;
+      $func_relative_path_tlibdir*)
+        # found a matching prefix
+        func_stripname "$func_relative_path_tlibdir" '' "$func_relative_path_tbindir"
+        func_relative_path_tcancelled=$func_stripname_result
+        if test -z "$func_relative_path_result"; then
+          func_relative_path_result=.
+        fi
+        break
+        ;;
+      *)
+        func_dirname $func_relative_path_tlibdir
+        func_relative_path_tlibdir=${func_dirname_result}
+        if test "x$func_relative_path_tlibdir" = x ; then
+          # Have to descend all the way to the root!
+          func_relative_path_result=../$func_relative_path_result
+          func_relative_path_tcancelled=$func_relative_path_tbindir
+          break
+        fi
+        func_relative_path_result=../$func_relative_path_result
+        ;;
+    esac
+  done
+
+  # Now calculate path; take care to avoid doubling-up slashes.
+  func_stripname '' '/' "$func_relative_path_result"
+  func_relative_path_result=$func_stripname_result
+  func_stripname '/' '/' "$func_relative_path_tcancelled"
+  if test "x$func_stripname_result" != x ; then
+    func_relative_path_result=${func_relative_path_result}/${func_stripname_result}
+  fi
+
+  # Normalisation. If bindir is libdir, return empty string,
+  # else relative path ending with a slash; either way, target
+  # file name can be directly appended.
+  if test ! -z "$func_relative_path_result"; then
+    func_stripname './' '' "$func_relative_path_result/"
+    func_relative_path_result=$func_stripname_result
+  fi
+}
+
+# The name of this program:
+func_dirname_and_basename "$progpath"
+progname=$func_basename_result
+
+# Make sure we have an absolute path for reexecution:
+case $progpath in
+  [\\/]*|[A-Za-z]:\\*) ;;
+  *[\\/]*)
+     progdir=$func_dirname_result
+     progdir=`cd "$progdir" && pwd`
+     progpath="$progdir/$progname"
+     ;;
+  *)
+     save_IFS="$IFS"
+     IFS=${PATH_SEPARATOR-:}
+     for progdir in $PATH; do
+       IFS="$save_IFS"
+       test -x "$progdir/$progname" && break
+     done
+     IFS="$save_IFS"
+     test -n "$progdir" || progdir=`pwd`
+     progpath="$progdir/$progname"
+     ;;
+esac
+
+# Sed substitution that helps us do robust quoting.  It backslashifies
+# metacharacters that are still active within double-quoted strings.
+Xsed="${SED}"' -e 1s/^X//'
+sed_quote_subst='s/\([`"$\\]\)/\\\1/g'
+
+# Same as above, but do not quote variable references.
+double_quote_subst='s/\(["`\\]\)/\\\1/g'
+
+# Sed substitution that turns a string into a regex matching for the
+# string literally.
+sed_make_literal_regex='s,[].[^$\\*\/],\\&,g'
+
+# Sed substitution that converts a w32 file name or path
+# which contains forward slashes, into one that contains
+# (escaped) backslashes.  A very naive implementation.
+lt_sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g'
+
+# Re-`\' parameter expansions in output of double_quote_subst that were
+# `\'-ed in input to the same.  If an odd number of `\' preceded a '$'
+# in input to double_quote_subst, that '$' was protected from expansion.
+# Since each input `\' is now two `\'s, look for any number of runs of
+# four `\'s followed by two `\'s and then a '$'.  `\' that '$'.
+bs='\\'
+bs2='\\\\'
+bs4='\\\\\\\\'
+dollar='\$'
+sed_double_backslash="\
+  s/$bs4/&\\
+/g
+  s/^$bs2$dollar/$bs&/
+  s/\\([^$bs]\\)$bs2$dollar/\\1$bs2$bs$dollar/g
+  s/\n//g"
+
+# Standard options:
+opt_dry_run=false
+opt_help=false
+opt_quiet=false
+opt_verbose=false
+opt_warning=:
+
+# func_echo arg...
+# Echo program name prefixed message, along with the current mode
+# name if it has been set yet.
+func_echo ()
+{
+    $ECHO "$progname: ${opt_mode+$opt_mode: }$*"
+}
+
+# func_verbose arg...
+# Echo program name prefixed message in verbose mode only.
+func_verbose ()
+{
+    $opt_verbose && func_echo ${1+"$@"}
+
+    # A bug in bash halts the script if the last line of a function
+    # fails when set -e is in force, so we need another command to
+    # work around that:
+    :
+}
+
+# func_echo_all arg...
+# Invoke $ECHO with all args, space-separated.
+func_echo_all ()
+{
+    $ECHO "$*"
+}
+
+# func_error arg...
+# Echo program name prefixed message to standard error.
+func_error ()
+{
+    $ECHO "$progname: ${opt_mode+$opt_mode: }"${1+"$@"} 1>&2
+}
+
+# func_warning arg...
+# Echo program name prefixed warning message to standard error.
+func_warning ()
+{
+    $opt_warning && $ECHO "$progname: ${opt_mode+$opt_mode: }warning: "${1+"$@"} 1>&2
+
+    # bash bug again:
+    :
+}
+
+# func_fatal_error arg...
+# Echo program name prefixed message to standard error, and exit.
+func_fatal_error ()
+{
+    func_error ${1+"$@"}
+    exit $EXIT_FAILURE
+}
+
+# func_fatal_help arg...
+# Echo program name prefixed message to standard error, followed by
+# a help hint, and exit.
+func_fatal_help ()
+{
+    func_error ${1+"$@"}
+    func_fatal_error "$help"
+}
+help="Try \`$progname --help' for more information."  ## default
+
+
+# func_grep expression filename
+# Check whether EXPRESSION matches any line of FILENAME, without output.
+func_grep ()
+{
+    $GREP "$1" "$2" >/dev/null 2>&1
+}
+
+
+# func_mkdir_p directory-path
+# Make sure the entire path to DIRECTORY-PATH is available.
+func_mkdir_p ()
+{
+    my_directory_path="$1"
+    my_dir_list=
+
+    if test -n "$my_directory_path" && test "$opt_dry_run" != ":"; then
+
+      # Protect directory names starting with `-'
+      case $my_directory_path in
+        -*) my_directory_path="./$my_directory_path" ;;
+      esac
+
+      # While some portion of DIR does not yet exist...
+      while test ! -d "$my_directory_path"; do
+        # ...make a list in topmost first order.  Use a colon delimited
+	# list incase some portion of path contains whitespace.
+        my_dir_list="$my_directory_path:$my_dir_list"
+
+        # If the last portion added has no slash in it, the list is done
+        case $my_directory_path in */*) ;; *) break ;; esac
+
+        # ...otherwise throw away the child directory and loop
+        my_directory_path=`$ECHO "$my_directory_path" | $SED -e "$dirname"`
+      done
+      my_dir_list=`$ECHO "$my_dir_list" | $SED 's,:*$,,'`
+
+      save_mkdir_p_IFS="$IFS"; IFS=':'
+      for my_dir in $my_dir_list; do
+	IFS="$save_mkdir_p_IFS"
+        # mkdir can fail with a `File exist' error if two processes
+        # try to create one of the directories concurrently.  Don't
+        # stop in that case!
+        $MKDIR "$my_dir" 2>/dev/null || :
+      done
+      IFS="$save_mkdir_p_IFS"
+
+      # Bail out if we (or some other process) failed to create a directory.
+      test -d "$my_directory_path" || \
+        func_fatal_error "Failed to create \`$1'"
+    fi
+}
+
+
+# func_mktempdir [string]
+# Make a temporary directory that won't clash with other running
+# libtool processes, and avoids race conditions if possible.  If
+# given, STRING is the basename for that directory.
+func_mktempdir ()
+{
+    my_template="${TMPDIR-/tmp}/${1-$progname}"
+
+    if test "$opt_dry_run" = ":"; then
+      # Return a directory name, but don't create it in dry-run mode
+      my_tmpdir="${my_template}-$$"
+    else
+
+      # If mktemp works, use that first and foremost
+      my_tmpdir=`mktemp -d "${my_template}-XXXXXXXX" 2>/dev/null`
+
+      if test ! -d "$my_tmpdir"; then
+        # Failing that, at least try and use $RANDOM to avoid a race
+        my_tmpdir="${my_template}-${RANDOM-0}$$"
+
+        save_mktempdir_umask=`umask`
+        umask 0077
+        $MKDIR "$my_tmpdir"
+        umask $save_mktempdir_umask
+      fi
+
+      # If we're not in dry-run mode, bomb out on failure
+      test -d "$my_tmpdir" || \
+        func_fatal_error "cannot create temporary directory \`$my_tmpdir'"
+    fi
+
+    $ECHO "$my_tmpdir"
+}
+
+
+# func_quote_for_eval arg
+# Aesthetically quote ARG to be evaled later.
+# This function returns two values: FUNC_QUOTE_FOR_EVAL_RESULT
+# is double-quoted, suitable for a subsequent eval, whereas
+# FUNC_QUOTE_FOR_EVAL_UNQUOTED_RESULT has merely all characters
+# which are still active within double quotes backslashified.
+func_quote_for_eval ()
+{
+    case $1 in
+      *[\\\`\"\$]*)
+	func_quote_for_eval_unquoted_result=`$ECHO "$1" | $SED "$sed_quote_subst"` ;;
+      *)
+        func_quote_for_eval_unquoted_result="$1" ;;
+    esac
+
+    case $func_quote_for_eval_unquoted_result in
+      # Double-quote args containing shell metacharacters to delay
+      # word splitting, command substitution and and variable
+      # expansion for a subsequent eval.
+      # Many Bourne shells cannot handle close brackets correctly
+      # in scan sets, so we specify it separately.
+      *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*|"")
+        func_quote_for_eval_result="\"$func_quote_for_eval_unquoted_result\""
+        ;;
+      *)
+        func_quote_for_eval_result="$func_quote_for_eval_unquoted_result"
+    esac
+}
+
+
+# func_quote_for_expand arg
+# Aesthetically quote ARG to be evaled later; same as above,
+# but do not quote variable references.
+func_quote_for_expand ()
+{
+    case $1 in
+      *[\\\`\"]*)
+	my_arg=`$ECHO "$1" | $SED \
+	    -e "$double_quote_subst" -e "$sed_double_backslash"` ;;
+      *)
+        my_arg="$1" ;;
+    esac
+
+    case $my_arg in
+      # Double-quote args containing shell metacharacters to delay
+      # word splitting and command substitution for a subsequent eval.
+      # Many Bourne shells cannot handle close brackets correctly
+      # in scan sets, so we specify it separately.
+      *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*|"")
+        my_arg="\"$my_arg\""
+        ;;
+    esac
+
+    func_quote_for_expand_result="$my_arg"
+}
+
+
+# func_show_eval cmd [fail_exp]
+# Unless opt_silent is true, then output CMD.  Then, if opt_dryrun is
+# not true, evaluate CMD.  If the evaluation of CMD fails, and FAIL_EXP
+# is given, then evaluate it.
+func_show_eval ()
+{
+    my_cmd="$1"
+    my_fail_exp="${2-:}"
+
+    ${opt_silent-false} || {
+      func_quote_for_expand "$my_cmd"
+      eval "func_echo $func_quote_for_expand_result"
+    }
+
+    if ${opt_dry_run-false}; then :; else
+      eval "$my_cmd"
+      my_status=$?
+      if test "$my_status" -eq 0; then :; else
+	eval "(exit $my_status); $my_fail_exp"
+      fi
+    fi
+}
+
+
+# func_show_eval_locale cmd [fail_exp]
+# Unless opt_silent is true, then output CMD.  Then, if opt_dryrun is
+# not true, evaluate CMD.  If the evaluation of CMD fails, and FAIL_EXP
+# is given, then evaluate it.  Use the saved locale for evaluation.
+func_show_eval_locale ()
+{
+    my_cmd="$1"
+    my_fail_exp="${2-:}"
+
+    ${opt_silent-false} || {
+      func_quote_for_expand "$my_cmd"
+      eval "func_echo $func_quote_for_expand_result"
+    }
+
+    if ${opt_dry_run-false}; then :; else
+      eval "$lt_user_locale
+	    $my_cmd"
+      my_status=$?
+      eval "$lt_safe_locale"
+      if test "$my_status" -eq 0; then :; else
+	eval "(exit $my_status); $my_fail_exp"
+      fi
+    fi
+}
+
+# func_tr_sh
+# Turn $1 into a string suitable for a shell variable name.
+# Result is stored in $func_tr_sh_result.  All characters
+# not in the set a-zA-Z0-9_ are replaced with '_'. Further,
+# if $1 begins with a digit, a '_' is prepended as well.
+func_tr_sh ()
+{
+  case $1 in
+  [0-9]* | *[!a-zA-Z0-9_]*)
+    func_tr_sh_result=`$ECHO "$1" | $SED 's/^\([0-9]\)/_\1/; s/[^a-zA-Z0-9_]/_/g'`
+    ;;
+  * )
+    func_tr_sh_result=$1
+    ;;
+  esac
+}
+
+
+# func_version
+# Echo version message to standard output and exit.
+func_version ()
+{
+    $opt_debug
+
+    $SED -n '/(C)/!b go
+	:more
+	/\./!{
+	  N
+	  s/\n# / /
+	  b more
+	}
+	:go
+	/^# '$PROGRAM' (GNU /,/# warranty; / {
+        s/^# //
+	s/^# *$//
+        s/\((C)\)[ 0-9,-]*\( [1-9][0-9]*\)/\1\2/
+        p
+     }' < "$progpath"
+     exit $?
+}
+
+# func_usage
+# Echo short help message to standard output and exit.
+func_usage ()
+{
+    $opt_debug
+
+    $SED -n '/^# Usage:/,/^#  *.*--help/ {
+        s/^# //
+	s/^# *$//
+	s/\$progname/'$progname'/
+	p
+    }' < "$progpath"
+    echo
+    $ECHO "run \`$progname --help | more' for full usage"
+    exit $?
+}
+
+# func_help [NOEXIT]
+# Echo long help message to standard output and exit,
+# unless 'noexit' is passed as argument.
+func_help ()
+{
+    $opt_debug
+
+    $SED -n '/^# Usage:/,/# Report bugs to/ {
+	:print
+        s/^# //
+	s/^# *$//
+	s*\$progname*'$progname'*
+	s*\$host*'"$host"'*
+	s*\$SHELL*'"$SHELL"'*
+	s*\$LTCC*'"$LTCC"'*
+	s*\$LTCFLAGS*'"$LTCFLAGS"'*
+	s*\$LD*'"$LD"'*
+	s/\$with_gnu_ld/'"$with_gnu_ld"'/
+	s/\$automake_version/'"`(${AUTOMAKE-automake} --version) 2>/dev/null |$SED 1q`"'/
+	s/\$autoconf_version/'"`(${AUTOCONF-autoconf} --version) 2>/dev/null |$SED 1q`"'/
+	p
+	d
+     }
+     /^# .* home page:/b print
+     /^# General help using/b print
+     ' < "$progpath"
+    ret=$?
+    if test -z "$1"; then
+      exit $ret
+    fi
+}
+
+# func_missing_arg argname
+# Echo program name prefixed message to standard error and set global
+# exit_cmd.
+func_missing_arg ()
+{
+    $opt_debug
+
+    func_error "missing argument for $1."
+    exit_cmd=exit
+}
+
+
+# func_split_short_opt shortopt
+# Set func_split_short_opt_name and func_split_short_opt_arg shell
+# variables after splitting SHORTOPT after the 2nd character.
+func_split_short_opt ()
+{
+    my_sed_short_opt='1s/^\(..\).*$/\1/;q'
+    my_sed_short_rest='1s/^..\(.*\)$/\1/;q'
+
+    func_split_short_opt_name=`$ECHO "$1" | $SED "$my_sed_short_opt"`
+    func_split_short_opt_arg=`$ECHO "$1" | $SED "$my_sed_short_rest"`
+} # func_split_short_opt may be replaced by extended shell implementation
+
+
+# func_split_long_opt longopt
+# Set func_split_long_opt_name and func_split_long_opt_arg shell
+# variables after splitting LONGOPT at the `=' sign.
+func_split_long_opt ()
+{
+    my_sed_long_opt='1s/^\(--[^=]*\)=.*/\1/;q'
+    my_sed_long_arg='1s/^--[^=]*=//'
+
+    func_split_long_opt_name=`$ECHO "$1" | $SED "$my_sed_long_opt"`
+    func_split_long_opt_arg=`$ECHO "$1" | $SED "$my_sed_long_arg"`
+} # func_split_long_opt may be replaced by extended shell implementation
+
+exit_cmd=:
+
+
+
+
+
+magic="%%%MAGIC variable%%%"
+magic_exe="%%%MAGIC EXE variable%%%"
+
+# Global variables.
+nonopt=
+preserve_args=
+lo2o="s/\\.lo\$/.${objext}/"
+o2lo="s/\\.${objext}\$/.lo/"
+extracted_archives=
+extracted_serial=0
+
+# If this variable is set in any of the actions, the command in it
+# will be execed at the end.  This prevents here-documents from being
+# left over by shells.
+exec_cmd=
+
+# func_append var value
+# Append VALUE to the end of shell variable VAR.
+func_append ()
+{
+    eval "${1}=\$${1}\${2}"
+} # func_append may be replaced by extended shell implementation
+
+# func_append_quoted var value
+# Quote VALUE and append to the end of shell variable VAR, separated
+# by a space.
+func_append_quoted ()
+{
+    func_quote_for_eval "${2}"
+    eval "${1}=\$${1}\\ \$func_quote_for_eval_result"
+} # func_append_quoted may be replaced by extended shell implementation
+
+
+# func_arith arithmetic-term...
+func_arith ()
+{
+    func_arith_result=`expr "${@}"`
+} # func_arith may be replaced by extended shell implementation
+
+
+# func_len string
+# STRING may not start with a hyphen.
+func_len ()
+{
+    func_len_result=`expr "${1}" : ".*" 2>/dev/null || echo $max_cmd_len`
+} # func_len may be replaced by extended shell implementation
+
+
+# func_lo2o object
+func_lo2o ()
+{
+    func_lo2o_result=`$ECHO "${1}" | $SED "$lo2o"`
+} # func_lo2o may be replaced by extended shell implementation
+
+
+# func_xform libobj-or-source
+func_xform ()
+{
+    func_xform_result=`$ECHO "${1}" | $SED 's/\.[^.]*$/.lo/'`
+} # func_xform may be replaced by extended shell implementation
+
+
+# func_fatal_configuration arg...
+# Echo program name prefixed message to standard error, followed by
+# a configuration failure hint, and exit.
+func_fatal_configuration ()
+{
+    func_error ${1+"$@"}
+    func_error "See the $PACKAGE documentation for more information."
+    func_fatal_error "Fatal configuration error."
+}
+
+
+# func_config
+# Display the configuration for all the tags in this script.
+func_config ()
+{
+    re_begincf='^# ### BEGIN LIBTOOL'
+    re_endcf='^# ### END LIBTOOL'
+
+    # Default configuration.
+    $SED "1,/$re_begincf CONFIG/d;/$re_endcf CONFIG/,\$d" < "$progpath"
+
+    # Now print the configurations for the tags.
+    for tagname in $taglist; do
+      $SED -n "/$re_begincf TAG CONFIG: $tagname\$/,/$re_endcf TAG CONFIG: $tagname\$/p" < "$progpath"
+    done
+
+    exit $?
+}
+
+# func_features
+# Display the features supported by this script.
+func_features ()
+{
+    echo "host: $host"
+    if test "$build_libtool_libs" = yes; then
+      echo "enable shared libraries"
+    else
+      echo "disable shared libraries"
+    fi
+    if test "$build_old_libs" = yes; then
+      echo "enable static libraries"
+    else
+      echo "disable static libraries"
+    fi
+
+    exit $?
+}
+
+# func_enable_tag tagname
+# Verify that TAGNAME is valid, and either flag an error and exit, or
+# enable the TAGNAME tag.  We also add TAGNAME to the global $taglist
+# variable here.
+func_enable_tag ()
+{
+  # Global variable:
+  tagname="$1"
+
+  re_begincf="^# ### BEGIN LIBTOOL TAG CONFIG: $tagname\$"
+  re_endcf="^# ### END LIBTOOL TAG CONFIG: $tagname\$"
+  sed_extractcf="/$re_begincf/,/$re_endcf/p"
+
+  # Validate tagname.
+  case $tagname in
+    *[!-_A-Za-z0-9,/]*)
+      func_fatal_error "invalid tag name: $tagname"
+      ;;
+  esac
+
+  # Don't test for the "default" C tag, as we know it's
+  # there but not specially marked.
+  case $tagname in
+    CC) ;;
+    *)
+      if $GREP "$re_begincf" "$progpath" >/dev/null 2>&1; then
+	taglist="$taglist $tagname"
+
+	# Evaluate the configuration.  Be careful to quote the path
+	# and the sed script, to avoid splitting on whitespace, but
+	# also don't use non-portable quotes within backquotes within
+	# quotes we have to do it in 2 steps:
+	extractedcf=`$SED -n -e "$sed_extractcf" < "$progpath"`
+	eval "$extractedcf"
+      else
+	func_error "ignoring unknown tag $tagname"
+      fi
+      ;;
+  esac
+}
+
+# func_check_version_match
+# Ensure that we are using m4 macros, and libtool script from the same
+# release of libtool.
+func_check_version_match ()
+{
+  if test "$package_revision" != "$macro_revision"; then
+    if test "$VERSION" != "$macro_version"; then
+      if test -z "$macro_version"; then
+        cat >&2 <<_LT_EOF
+$progname: Version mismatch error.  This is $PACKAGE $VERSION, but the
+$progname: definition of this LT_INIT comes from an older release.
+$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION
+$progname: and run autoconf again.
+_LT_EOF
+      else
+        cat >&2 <<_LT_EOF
+$progname: Version mismatch error.  This is $PACKAGE $VERSION, but the
+$progname: definition of this LT_INIT comes from $PACKAGE $macro_version.
+$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION
+$progname: and run autoconf again.
+_LT_EOF
+      fi
+    else
+      cat >&2 <<_LT_EOF
+$progname: Version mismatch error.  This is $PACKAGE $VERSION, revision $package_revision,
+$progname: but the definition of this LT_INIT comes from revision $macro_revision.
+$progname: You should recreate aclocal.m4 with macros from revision $package_revision
+$progname: of $PACKAGE $VERSION and run autoconf again.
+_LT_EOF
+    fi
+
+    exit $EXIT_MISMATCH
+  fi
+}
+
+
+# Shorthand for --mode=foo, only valid as the first argument
+case $1 in
+clean|clea|cle|cl)
+  shift; set dummy --mode clean ${1+"$@"}; shift
+  ;;
+compile|compil|compi|comp|com|co|c)
+  shift; set dummy --mode compile ${1+"$@"}; shift
+  ;;
+execute|execut|execu|exec|exe|ex|e)
+  shift; set dummy --mode execute ${1+"$@"}; shift
+  ;;
+finish|finis|fini|fin|fi|f)
+  shift; set dummy --mode finish ${1+"$@"}; shift
+  ;;
+install|instal|insta|inst|ins|in|i)
+  shift; set dummy --mode install ${1+"$@"}; shift
+  ;;
+link|lin|li|l)
+  shift; set dummy --mode link ${1+"$@"}; shift
+  ;;
+uninstall|uninstal|uninsta|uninst|unins|unin|uni|un|u)
+  shift; set dummy --mode uninstall ${1+"$@"}; shift
+  ;;
+esac
+
+
+
+# Option defaults:
+opt_debug=:
+opt_dry_run=false
+opt_config=false
+opt_preserve_dup_deps=false
+opt_features=false
+opt_finish=false
+opt_help=false
+opt_help_all=false
+opt_silent=:
+opt_warning=:
+opt_verbose=:
+opt_silent=false
+opt_verbose=false
+
+
+# Parse options once, thoroughly.  This comes as soon as possible in the
+# script to make things like `--version' happen as quickly as we can.
+{
+  # this just eases exit handling
+  while test $# -gt 0; do
+    opt="$1"
+    shift
+    case $opt in
+      --debug|-x)	opt_debug='set -x'
+			func_echo "enabling shell trace mode"
+			$opt_debug
+			;;
+      --dry-run|--dryrun|-n)
+			opt_dry_run=:
+			;;
+      --config)
+			opt_config=:
+func_config
+			;;
+      --dlopen|-dlopen)
+			optarg="$1"
+			opt_dlopen="${opt_dlopen+$opt_dlopen
+}$optarg"
+			shift
+			;;
+      --preserve-dup-deps)
+			opt_preserve_dup_deps=:
+			;;
+      --features)
+			opt_features=:
+func_features
+			;;
+      --finish)
+			opt_finish=:
+set dummy --mode finish ${1+"$@"}; shift
+			;;
+      --help)
+			opt_help=:
+			;;
+      --help-all)
+			opt_help_all=:
+opt_help=': help-all'
+			;;
+      --mode)
+			test $# = 0 && func_missing_arg $opt && break
+			optarg="$1"
+			opt_mode="$optarg"
+case $optarg in
+  # Valid mode arguments:
+  clean|compile|execute|finish|install|link|relink|uninstall) ;;
+
+  # Catch anything else as an error
+  *) func_error "invalid argument for $opt"
+     exit_cmd=exit
+     break
+     ;;
+esac
+			shift
+			;;
+      --no-silent|--no-quiet)
+			opt_silent=false
+func_append preserve_args " $opt"
+			;;
+      --no-warning|--no-warn)
+			opt_warning=false
+func_append preserve_args " $opt"
+			;;
+      --no-verbose)
+			opt_verbose=false
+func_append preserve_args " $opt"
+			;;
+      --silent|--quiet)
+			opt_silent=:
+func_append preserve_args " $opt"
+        opt_verbose=false
+			;;
+      --verbose|-v)
+			opt_verbose=:
+func_append preserve_args " $opt"
+opt_silent=false
+			;;
+      --tag)
+			test $# = 0 && func_missing_arg $opt && break
+			optarg="$1"
+			opt_tag="$optarg"
+func_append preserve_args " $opt $optarg"
+func_enable_tag "$optarg"
+			shift
+			;;
+
+      -\?|-h)		func_usage				;;
+      --help)		func_help				;;
+      --version)	func_version				;;
+
+      # Separate optargs to long options:
+      --*=*)
+			func_split_long_opt "$opt"
+			set dummy "$func_split_long_opt_name" "$func_split_long_opt_arg" ${1+"$@"}
+			shift
+			;;
+
+      # Separate non-argument short options:
+      -\?*|-h*|-n*|-v*)
+			func_split_short_opt "$opt"
+			set dummy "$func_split_short_opt_name" "-$func_split_short_opt_arg" ${1+"$@"}
+			shift
+			;;
+
+      --)		break					;;
+      -*)		func_fatal_help "unrecognized option \`$opt'" ;;
+      *)		set dummy "$opt" ${1+"$@"};	shift; break  ;;
+    esac
+  done
+
+  # Validate options:
+
+  # save first non-option argument
+  if test "$#" -gt 0; then
+    nonopt="$opt"
+    shift
+  fi
+
+  # preserve --debug
+  test "$opt_debug" = : || func_append preserve_args " --debug"
+
+  case $host in
+    *cygwin* | *mingw* | *pw32* | *cegcc*)
+      # don't eliminate duplications in $postdeps and $predeps
+      opt_duplicate_compiler_generated_deps=:
+      ;;
+    *)
+      opt_duplicate_compiler_generated_deps=$opt_preserve_dup_deps
+      ;;
+  esac
+
+  $opt_help || {
+    # Sanity checks first:
+    func_check_version_match
+
+    if test "$build_libtool_libs" != yes && test "$build_old_libs" != yes; then
+      func_fatal_configuration "not configured to build any kind of library"
+    fi
+
+    # Darwin sucks
+    eval std_shrext=\"$shrext_cmds\"
+
+    # Only execute mode is allowed to have -dlopen flags.
+    if test -n "$opt_dlopen" && test "$opt_mode" != execute; then
+      func_error "unrecognized option \`-dlopen'"
+      $ECHO "$help" 1>&2
+      exit $EXIT_FAILURE
+    fi
+
+    # Change the help message to a mode-specific one.
+    generic_help="$help"
+    help="Try \`$progname --help --mode=$opt_mode' for more information."
+  }
+
+
+  # Bail if the options were screwed
+  $exit_cmd $EXIT_FAILURE
+}
+
+
+
+
+## ----------- ##
+##    Main.    ##
+## ----------- ##
+
+# func_lalib_p file
+# True iff FILE is a libtool `.la' library or `.lo' object file.
+# This function is only a basic sanity check; it will hardly flush out
+# determined imposters.
+func_lalib_p ()
+{
+    test -f "$1" &&
+      $SED -e 4q "$1" 2>/dev/null \
+        | $GREP "^# Generated by .*$PACKAGE" > /dev/null 2>&1
+}
+
+# func_lalib_unsafe_p file
+# True iff FILE is a libtool `.la' library or `.lo' object file.
+# This function implements the same check as func_lalib_p without
+# resorting to external programs.  To this end, it redirects stdin and
+# closes it afterwards, without saving the original file descriptor.
+# As a safety measure, use it only where a negative result would be
+# fatal anyway.  Works if `file' does not exist.
+func_lalib_unsafe_p ()
+{
+    lalib_p=no
+    if test -f "$1" && test -r "$1" && exec 5<&0 <"$1"; then
+	for lalib_p_l in 1 2 3 4
+	do
+	    read lalib_p_line
+	    case "$lalib_p_line" in
+		\#\ Generated\ by\ *$PACKAGE* ) lalib_p=yes; break;;
+	    esac
+	done
+	exec 0<&5 5<&-
+    fi
+    test "$lalib_p" = yes
+}
+
+# func_ltwrapper_script_p file
+# True iff FILE is a libtool wrapper script
+# This function is only a basic sanity check; it will hardly flush out
+# determined imposters.
+func_ltwrapper_script_p ()
+{
+    func_lalib_p "$1"
+}
+
+# func_ltwrapper_executable_p file
+# True iff FILE is a libtool wrapper executable
+# This function is only a basic sanity check; it will hardly flush out
+# determined imposters.
+func_ltwrapper_executable_p ()
+{
+    func_ltwrapper_exec_suffix=
+    case $1 in
+    *.exe) ;;
+    *) func_ltwrapper_exec_suffix=.exe ;;
+    esac
+    $GREP "$magic_exe" "$1$func_ltwrapper_exec_suffix" >/dev/null 2>&1
+}
+
+# func_ltwrapper_scriptname file
+# Assumes file is an ltwrapper_executable
+# uses $file to determine the appropriate filename for a
+# temporary ltwrapper_script.
+func_ltwrapper_scriptname ()
+{
+    func_dirname_and_basename "$1" "" "."
+    func_stripname '' '.exe' "$func_basename_result"
+    func_ltwrapper_scriptname_result="$func_dirname_result/$objdir/${func_stripname_result}_ltshwrapper"
+}
+
+# func_ltwrapper_p file
+# True iff FILE is a libtool wrapper script or wrapper executable
+# This function is only a basic sanity check; it will hardly flush out
+# determined imposters.
+func_ltwrapper_p ()
+{
+    func_ltwrapper_script_p "$1" || func_ltwrapper_executable_p "$1"
+}
+
+
+# func_execute_cmds commands fail_cmd
+# Execute tilde-delimited COMMANDS.
+# If FAIL_CMD is given, eval that upon failure.
+# FAIL_CMD may read-access the current command in variable CMD!
+func_execute_cmds ()
+{
+    $opt_debug
+    save_ifs=$IFS; IFS='~'
+    for cmd in $1; do
+      IFS=$save_ifs
+      eval cmd=\"$cmd\"
+      func_show_eval "$cmd" "${2-:}"
+    done
+    IFS=$save_ifs
+}
+
+
+# func_source file
+# Source FILE, adding directory component if necessary.
+# Note that it is not necessary on cygwin/mingw to append a dot to
+# FILE even if both FILE and FILE.exe exist: automatic-append-.exe
+# behavior happens only for exec(3), not for open(2)!  Also, sourcing
+# `FILE.' does not work on cygwin managed mounts.
+func_source ()
+{
+    $opt_debug
+    case $1 in
+    */* | *\\*)	. "$1" ;;
+    *)		. "./$1" ;;
+    esac
+}
+
+
+# func_resolve_sysroot PATH
+# Replace a leading = in PATH with a sysroot.  Store the result into
+# func_resolve_sysroot_result
+func_resolve_sysroot ()
+{
+  func_resolve_sysroot_result=$1
+  case $func_resolve_sysroot_result in
+  =*)
+    func_stripname '=' '' "$func_resolve_sysroot_result"
+    func_resolve_sysroot_result=$lt_sysroot$func_stripname_result
+    ;;
+  esac
+}
+
+# func_replace_sysroot PATH
+# If PATH begins with the sysroot, replace it with = and
+# store the result into func_replace_sysroot_result.
+func_replace_sysroot ()
+{
+  case "$lt_sysroot:$1" in
+  ?*:"$lt_sysroot"*)
+    func_stripname "$lt_sysroot" '' "$1"
+    func_replace_sysroot_result="=$func_stripname_result"
+    ;;
+  *)
+    # Including no sysroot.
+    func_replace_sysroot_result=$1
+    ;;
+  esac
+}
+
+# func_infer_tag arg
+# Infer tagged configuration to use if any are available and
+# if one wasn't chosen via the "--tag" command line option.
+# Only attempt this if the compiler in the base compile
+# command doesn't match the default compiler.
+# arg is usually of the form 'gcc ...'
+func_infer_tag ()
+{
+    $opt_debug
+    if test -n "$available_tags" && test -z "$tagname"; then
+      CC_quoted=
+      for arg in $CC; do
+	func_append_quoted CC_quoted "$arg"
+      done
+      CC_expanded=`func_echo_all $CC`
+      CC_quoted_expanded=`func_echo_all $CC_quoted`
+      case $@ in
+      # Blanks in the command may have been stripped by the calling shell,
+      # but not from the CC environment variable when configure was run.
+      " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \
+      " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) ;;
+      # Blanks at the start of $base_compile will cause this to fail
+      # if we don't check for them as well.
+      *)
+	for z in $available_tags; do
+	  if $GREP "^# ### BEGIN LIBTOOL TAG CONFIG: $z$" < "$progpath" > /dev/null; then
+	    # Evaluate the configuration.
+	    eval "`${SED} -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$z'$/,/^# ### END LIBTOOL TAG CONFIG: '$z'$/p' < $progpath`"
+	    CC_quoted=
+	    for arg in $CC; do
+	      # Double-quote args containing other shell metacharacters.
+	      func_append_quoted CC_quoted "$arg"
+	    done
+	    CC_expanded=`func_echo_all $CC`
+	    CC_quoted_expanded=`func_echo_all $CC_quoted`
+	    case "$@ " in
+	    " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \
+	    " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*)
+	      # The compiler in the base compile command matches
+	      # the one in the tagged configuration.
+	      # Assume this is the tagged configuration we want.
+	      tagname=$z
+	      break
+	      ;;
+	    esac
+	  fi
+	done
+	# If $tagname still isn't set, then no tagged configuration
+	# was found and let the user know that the "--tag" command
+	# line option must be used.
+	if test -z "$tagname"; then
+	  func_echo "unable to infer tagged configuration"
+	  func_fatal_error "specify a tag with \`--tag'"
+#	else
+#	  func_verbose "using $tagname tagged configuration"
+	fi
+	;;
+      esac
+    fi
+}
+
+
+
+# func_write_libtool_object output_name pic_name nonpic_name
+# Create a libtool object file (analogous to a ".la" file),
+# but don't create it if we're doing a dry run.
+func_write_libtool_object ()
+{
+    write_libobj=${1}
+    if test "$build_libtool_libs" = yes; then
+      write_lobj=\'${2}\'
+    else
+      write_lobj=none
+    fi
+
+    if test "$build_old_libs" = yes; then
+      write_oldobj=\'${3}\'
+    else
+      write_oldobj=none
+    fi
+
+    $opt_dry_run || {
+      cat >${write_libobj}T <<EOF
+# $write_libobj - a libtool object file
+# Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# Name of the PIC object.
+pic_object=$write_lobj
+
+# Name of the non-PIC object
+non_pic_object=$write_oldobj
+
+EOF
+      $MV "${write_libobj}T" "${write_libobj}"
+    }
+}
+
+
+##################################################
+# FILE NAME AND PATH CONVERSION HELPER FUNCTIONS #
+##################################################
+
+# func_convert_core_file_wine_to_w32 ARG
+# Helper function used by file name conversion functions when $build is *nix,
+# and $host is mingw, cygwin, or some other w32 environment. Relies on a
+# correctly configured wine environment available, with the winepath program
+# in $build's $PATH.
+#
+# ARG is the $build file name to be converted to w32 format.
+# Result is available in $func_convert_core_file_wine_to_w32_result, and will
+# be empty on error (or when ARG is empty)
+func_convert_core_file_wine_to_w32 ()
+{
+  $opt_debug
+  func_convert_core_file_wine_to_w32_result="$1"
+  if test -n "$1"; then
+    # Unfortunately, winepath does not exit with a non-zero error code, so we
+    # are forced to check the contents of stdout. On the other hand, if the
+    # command is not found, the shell will set an exit code of 127 and print
+    # *an error message* to stdout. So we must check for both error code of
+    # zero AND non-empty stdout, which explains the odd construction:
+    func_convert_core_file_wine_to_w32_tmp=`winepath -w "$1" 2>/dev/null`
+    if test "$?" -eq 0 && test -n "${func_convert_core_file_wine_to_w32_tmp}"; then
+      func_convert_core_file_wine_to_w32_result=`$ECHO "$func_convert_core_file_wine_to_w32_tmp" |
+        $SED -e "$lt_sed_naive_backslashify"`
+    else
+      func_convert_core_file_wine_to_w32_result=
+    fi
+  fi
+}
+# end: func_convert_core_file_wine_to_w32
+
+
+# func_convert_core_path_wine_to_w32 ARG
+# Helper function used by path conversion functions when $build is *nix, and
+# $host is mingw, cygwin, or some other w32 environment. Relies on a correctly
+# configured wine environment available, with the winepath program in $build's
+# $PATH. Assumes ARG has no leading or trailing path separator characters.
+#
+# ARG is path to be converted from $build format to win32.
+# Result is available in $func_convert_core_path_wine_to_w32_result.
+# Unconvertible file (directory) names in ARG are skipped; if no directory names
+# are convertible, then the result may be empty.
+func_convert_core_path_wine_to_w32 ()
+{
+  $opt_debug
+  # unfortunately, winepath doesn't convert paths, only file names
+  func_convert_core_path_wine_to_w32_result=""
+  if test -n "$1"; then
+    oldIFS=$IFS
+    IFS=:
+    for func_convert_core_path_wine_to_w32_f in $1; do
+      IFS=$oldIFS
+      func_convert_core_file_wine_to_w32 "$func_convert_core_path_wine_to_w32_f"
+      if test -n "$func_convert_core_file_wine_to_w32_result" ; then
+        if test -z "$func_convert_core_path_wine_to_w32_result"; then
+          func_convert_core_path_wine_to_w32_result="$func_convert_core_file_wine_to_w32_result"
+        else
+          func_append func_convert_core_path_wine_to_w32_result ";$func_convert_core_file_wine_to_w32_result"
+        fi
+      fi
+    done
+    IFS=$oldIFS
+  fi
+}
+# end: func_convert_core_path_wine_to_w32
+
+
+# func_cygpath ARGS...
+# Wrapper around calling the cygpath program via LT_CYGPATH. This is used when
+# when (1) $build is *nix and Cygwin is hosted via a wine environment; or (2)
+# $build is MSYS and $host is Cygwin, or (3) $build is Cygwin. In case (1) or
+# (2), returns the Cygwin file name or path in func_cygpath_result (input
+# file name or path is assumed to be in w32 format, as previously converted
+# from $build's *nix or MSYS format). In case (3), returns the w32 file name
+# or path in func_cygpath_result (input file name or path is assumed to be in
+# Cygwin format). Returns an empty string on error.
+#
+# ARGS are passed to cygpath, with the last one being the file name or path to
+# be converted.
+#
+# Specify the absolute *nix (or w32) name to cygpath in the LT_CYGPATH
+# environment variable; do not put it in $PATH.
+func_cygpath ()
+{
+  $opt_debug
+  if test -n "$LT_CYGPATH" && test -f "$LT_CYGPATH"; then
+    func_cygpath_result=`$LT_CYGPATH "$@" 2>/dev/null`
+    if test "$?" -ne 0; then
+      # on failure, ensure result is empty
+      func_cygpath_result=
+    fi
+  else
+    func_cygpath_result=
+    func_error "LT_CYGPATH is empty or specifies non-existent file: \`$LT_CYGPATH'"
+  fi
+}
+#end: func_cygpath
+
+
+# func_convert_core_msys_to_w32 ARG
+# Convert file name or path ARG from MSYS format to w32 format.  Return
+# result in func_convert_core_msys_to_w32_result.
+func_convert_core_msys_to_w32 ()
+{
+  $opt_debug
+  # awkward: cmd appends spaces to result
+  func_convert_core_msys_to_w32_result=`( cmd //c echo "$1" ) 2>/dev/null |
+    $SED -e 's/[ ]*$//' -e "$lt_sed_naive_backslashify"`
+}
+#end: func_convert_core_msys_to_w32
+
+
+# func_convert_file_check ARG1 ARG2
+# Verify that ARG1 (a file name in $build format) was converted to $host
+# format in ARG2. Otherwise, emit an error message, but continue (resetting
+# func_to_host_file_result to ARG1).
+func_convert_file_check ()
+{
+  $opt_debug
+  if test -z "$2" && test -n "$1" ; then
+    func_error "Could not determine host file name corresponding to"
+    func_error "  \`$1'"
+    func_error "Continuing, but uninstalled executables may not work."
+    # Fallback:
+    func_to_host_file_result="$1"
+  fi
+}
+# end func_convert_file_check
+
+
+# func_convert_path_check FROM_PATHSEP TO_PATHSEP FROM_PATH TO_PATH
+# Verify that FROM_PATH (a path in $build format) was converted to $host
+# format in TO_PATH. Otherwise, emit an error message, but continue, resetting
+# func_to_host_file_result to a simplistic fallback value (see below).
+func_convert_path_check ()
+{
+  $opt_debug
+  if test -z "$4" && test -n "$3"; then
+    func_error "Could not determine the host path corresponding to"
+    func_error "  \`$3'"
+    func_error "Continuing, but uninstalled executables may not work."
+    # Fallback.  This is a deliberately simplistic "conversion" and
+    # should not be "improved".  See libtool.info.
+    if test "x$1" != "x$2"; then
+      lt_replace_pathsep_chars="s|$1|$2|g"
+      func_to_host_path_result=`echo "$3" |
+        $SED -e "$lt_replace_pathsep_chars"`
+    else
+      func_to_host_path_result="$3"
+    fi
+  fi
+}
+# end func_convert_path_check
+
+
+# func_convert_path_front_back_pathsep FRONTPAT BACKPAT REPL ORIG
+# Modifies func_to_host_path_result by prepending REPL if ORIG matches FRONTPAT
+# and appending REPL if ORIG matches BACKPAT.
+func_convert_path_front_back_pathsep ()
+{
+  $opt_debug
+  case $4 in
+  $1 ) func_to_host_path_result="$3$func_to_host_path_result"
+    ;;
+  esac
+  case $4 in
+  $2 ) func_append func_to_host_path_result "$3"
+    ;;
+  esac
+}
+# end func_convert_path_front_back_pathsep
+
+
+##################################################
+# $build to $host FILE NAME CONVERSION FUNCTIONS #
+##################################################
+# invoked via `$to_host_file_cmd ARG'
+#
+# In each case, ARG is the path to be converted from $build to $host format.
+# Result will be available in $func_to_host_file_result.
+
+
+# func_to_host_file ARG
+# Converts the file name ARG from $build format to $host format. Return result
+# in func_to_host_file_result.
+func_to_host_file ()
+{
+  $opt_debug
+  $to_host_file_cmd "$1"
+}
+# end func_to_host_file
+
+
+# func_to_tool_file ARG LAZY
+# converts the file name ARG from $build format to toolchain format. Return
+# result in func_to_tool_file_result.  If the conversion in use is listed
+# in (the comma separated) LAZY, no conversion takes place.
+func_to_tool_file ()
+{
+  $opt_debug
+  case ,$2, in
+    *,"$to_tool_file_cmd",*)
+      func_to_tool_file_result=$1
+      ;;
+    *)
+      $to_tool_file_cmd "$1"
+      func_to_tool_file_result=$func_to_host_file_result
+      ;;
+  esac
+}
+# end func_to_tool_file
+
+
+# func_convert_file_noop ARG
+# Copy ARG to func_to_host_file_result.
+func_convert_file_noop ()
+{
+  func_to_host_file_result="$1"
+}
+# end func_convert_file_noop
+
+
+# func_convert_file_msys_to_w32 ARG
+# Convert file name ARG from (mingw) MSYS to (mingw) w32 format; automatic
+# conversion to w32 is not available inside the cwrapper.  Returns result in
+# func_to_host_file_result.
+func_convert_file_msys_to_w32 ()
+{
+  $opt_debug
+  func_to_host_file_result="$1"
+  if test -n "$1"; then
+    func_convert_core_msys_to_w32 "$1"
+    func_to_host_file_result="$func_convert_core_msys_to_w32_result"
+  fi
+  func_convert_file_check "$1" "$func_to_host_file_result"
+}
+# end func_convert_file_msys_to_w32
+
+
+# func_convert_file_cygwin_to_w32 ARG
+# Convert file name ARG from Cygwin to w32 format.  Returns result in
+# func_to_host_file_result.
+func_convert_file_cygwin_to_w32 ()
+{
+  $opt_debug
+  func_to_host_file_result="$1"
+  if test -n "$1"; then
+    # because $build is cygwin, we call "the" cygpath in $PATH; no need to use
+    # LT_CYGPATH in this case.
+    func_to_host_file_result=`cygpath -m "$1"`
+  fi
+  func_convert_file_check "$1" "$func_to_host_file_result"
+}
+# end func_convert_file_cygwin_to_w32
+
+
+# func_convert_file_nix_to_w32 ARG
+# Convert file name ARG from *nix to w32 format.  Requires a wine environment
+# and a working winepath. Returns result in func_to_host_file_result.
+func_convert_file_nix_to_w32 ()
+{
+  $opt_debug
+  func_to_host_file_result="$1"
+  if test -n "$1"; then
+    func_convert_core_file_wine_to_w32 "$1"
+    func_to_host_file_result="$func_convert_core_file_wine_to_w32_result"
+  fi
+  func_convert_file_check "$1" "$func_to_host_file_result"
+}
+# end func_convert_file_nix_to_w32
+
+
+# func_convert_file_msys_to_cygwin ARG
+# Convert file name ARG from MSYS to Cygwin format.  Requires LT_CYGPATH set.
+# Returns result in func_to_host_file_result.
+func_convert_file_msys_to_cygwin ()
+{
+  $opt_debug
+  func_to_host_file_result="$1"
+  if test -n "$1"; then
+    func_convert_core_msys_to_w32 "$1"
+    func_cygpath -u "$func_convert_core_msys_to_w32_result"
+    func_to_host_file_result="$func_cygpath_result"
+  fi
+  func_convert_file_check "$1" "$func_to_host_file_result"
+}
+# end func_convert_file_msys_to_cygwin
+
+
+# func_convert_file_nix_to_cygwin ARG
+# Convert file name ARG from *nix to Cygwin format.  Requires Cygwin installed
+# in a wine environment, working winepath, and LT_CYGPATH set.  Returns result
+# in func_to_host_file_result.
+func_convert_file_nix_to_cygwin ()
+{
+  $opt_debug
+  func_to_host_file_result="$1"
+  if test -n "$1"; then
+    # convert from *nix to w32, then use cygpath to convert from w32 to cygwin.
+    func_convert_core_file_wine_to_w32 "$1"
+    func_cygpath -u "$func_convert_core_file_wine_to_w32_result"
+    func_to_host_file_result="$func_cygpath_result"
+  fi
+  func_convert_file_check "$1" "$func_to_host_file_result"
+}
+# end func_convert_file_nix_to_cygwin
+
+
+#############################################
+# $build to $host PATH CONVERSION FUNCTIONS #
+#############################################
+# invoked via `$to_host_path_cmd ARG'
+#
+# In each case, ARG is the path to be converted from $build to $host format.
+# The result will be available in $func_to_host_path_result.
+#
+# Path separators are also converted from $build format to $host format.  If
+# ARG begins or ends with a path separator character, it is preserved (but
+# converted to $host format) on output.
+#
+# All path conversion functions are named using the following convention:
+#   file name conversion function    : func_convert_file_X_to_Y ()
+#   path conversion function         : func_convert_path_X_to_Y ()
+# where, for any given $build/$host combination the 'X_to_Y' value is the
+# same.  If conversion functions are added for new $build/$host combinations,
+# the two new functions must follow this pattern, or func_init_to_host_path_cmd
+# will break.
+
+
+# func_init_to_host_path_cmd
+# Ensures that function "pointer" variable $to_host_path_cmd is set to the
+# appropriate value, based on the value of $to_host_file_cmd.
+to_host_path_cmd=
+func_init_to_host_path_cmd ()
+{
+  $opt_debug
+  if test -z "$to_host_path_cmd"; then
+    func_stripname 'func_convert_file_' '' "$to_host_file_cmd"
+    to_host_path_cmd="func_convert_path_${func_stripname_result}"
+  fi
+}
+
+
+# func_to_host_path ARG
+# Converts the path ARG from $build format to $host format. Return result
+# in func_to_host_path_result.
+func_to_host_path ()
+{
+  $opt_debug
+  func_init_to_host_path_cmd
+  $to_host_path_cmd "$1"
+}
+# end func_to_host_path
+
+
+# func_convert_path_noop ARG
+# Copy ARG to func_to_host_path_result.
+func_convert_path_noop ()
+{
+  func_to_host_path_result="$1"
+}
+# end func_convert_path_noop
+
+
+# func_convert_path_msys_to_w32 ARG
+# Convert path ARG from (mingw) MSYS to (mingw) w32 format; automatic
+# conversion to w32 is not available inside the cwrapper.  Returns result in
+# func_to_host_path_result.
+func_convert_path_msys_to_w32 ()
+{
+  $opt_debug
+  func_to_host_path_result="$1"
+  if test -n "$1"; then
+    # Remove leading and trailing path separator characters from ARG.  MSYS
+    # behavior is inconsistent here; cygpath turns them into '.;' and ';.';
+    # and winepath ignores them completely.
+    func_stripname : : "$1"
+    func_to_host_path_tmp1=$func_stripname_result
+    func_convert_core_msys_to_w32 "$func_to_host_path_tmp1"
+    func_to_host_path_result="$func_convert_core_msys_to_w32_result"
+    func_convert_path_check : ";" \
+      "$func_to_host_path_tmp1" "$func_to_host_path_result"
+    func_convert_path_front_back_pathsep ":*" "*:" ";" "$1"
+  fi
+}
+# end func_convert_path_msys_to_w32
+
+
+# func_convert_path_cygwin_to_w32 ARG
+# Convert path ARG from Cygwin to w32 format.  Returns result in
+# func_to_host_file_result.
+func_convert_path_cygwin_to_w32 ()
+{
+  $opt_debug
+  func_to_host_path_result="$1"
+  if test -n "$1"; then
+    # See func_convert_path_msys_to_w32:
+    func_stripname : : "$1"
+    func_to_host_path_tmp1=$func_stripname_result
+    func_to_host_path_result=`cygpath -m -p "$func_to_host_path_tmp1"`
+    func_convert_path_check : ";" \
+      "$func_to_host_path_tmp1" "$func_to_host_path_result"
+    func_convert_path_front_back_pathsep ":*" "*:" ";" "$1"
+  fi
+}
+# end func_convert_path_cygwin_to_w32
+
+
+# func_convert_path_nix_to_w32 ARG
+# Convert path ARG from *nix to w32 format.  Requires a wine environment and
+# a working winepath.  Returns result in func_to_host_file_result.
+func_convert_path_nix_to_w32 ()
+{
+  $opt_debug
+  func_to_host_path_result="$1"
+  if test -n "$1"; then
+    # See func_convert_path_msys_to_w32:
+    func_stripname : : "$1"
+    func_to_host_path_tmp1=$func_stripname_result
+    func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1"
+    func_to_host_path_result="$func_convert_core_path_wine_to_w32_result"
+    func_convert_path_check : ";" \
+      "$func_to_host_path_tmp1" "$func_to_host_path_result"
+    func_convert_path_front_back_pathsep ":*" "*:" ";" "$1"
+  fi
+}
+# end func_convert_path_nix_to_w32
+
+
+# func_convert_path_msys_to_cygwin ARG
+# Convert path ARG from MSYS to Cygwin format.  Requires LT_CYGPATH set.
+# Returns result in func_to_host_file_result.
+func_convert_path_msys_to_cygwin ()
+{
+  $opt_debug
+  func_to_host_path_result="$1"
+  if test -n "$1"; then
+    # See func_convert_path_msys_to_w32:
+    func_stripname : : "$1"
+    func_to_host_path_tmp1=$func_stripname_result
+    func_convert_core_msys_to_w32 "$func_to_host_path_tmp1"
+    func_cygpath -u -p "$func_convert_core_msys_to_w32_result"
+    func_to_host_path_result="$func_cygpath_result"
+    func_convert_path_check : : \
+      "$func_to_host_path_tmp1" "$func_to_host_path_result"
+    func_convert_path_front_back_pathsep ":*" "*:" : "$1"
+  fi
+}
+# end func_convert_path_msys_to_cygwin
+
+
+# func_convert_path_nix_to_cygwin ARG
+# Convert path ARG from *nix to Cygwin format.  Requires Cygwin installed in a
+# a wine environment, working winepath, and LT_CYGPATH set.  Returns result in
+# func_to_host_file_result.
+func_convert_path_nix_to_cygwin ()
+{
+  $opt_debug
+  func_to_host_path_result="$1"
+  if test -n "$1"; then
+    # Remove leading and trailing path separator characters from
+    # ARG. msys behavior is inconsistent here, cygpath turns them
+    # into '.;' and ';.', and winepath ignores them completely.
+    func_stripname : : "$1"
+    func_to_host_path_tmp1=$func_stripname_result
+    func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1"
+    func_cygpath -u -p "$func_convert_core_path_wine_to_w32_result"
+    func_to_host_path_result="$func_cygpath_result"
+    func_convert_path_check : : \
+      "$func_to_host_path_tmp1" "$func_to_host_path_result"
+    func_convert_path_front_back_pathsep ":*" "*:" : "$1"
+  fi
+}
+# end func_convert_path_nix_to_cygwin
+
+
+# func_mode_compile arg...
+func_mode_compile ()
+{
+    $opt_debug
+    # Get the compilation command and the source file.
+    base_compile=
+    srcfile="$nonopt"  #  always keep a non-empty value in "srcfile"
+    suppress_opt=yes
+    suppress_output=
+    arg_mode=normal
+    libobj=
+    later=
+    pie_flag=
+
+    for arg
+    do
+      case $arg_mode in
+      arg  )
+	# do not "continue".  Instead, add this to base_compile
+	lastarg="$arg"
+	arg_mode=normal
+	;;
+
+      target )
+	libobj="$arg"
+	arg_mode=normal
+	continue
+	;;
+
+      normal )
+	# Accept any command-line options.
+	case $arg in
+	-o)
+	  test -n "$libobj" && \
+	    func_fatal_error "you cannot specify \`-o' more than once"
+	  arg_mode=target
+	  continue
+	  ;;
+
+	-pie | -fpie | -fPIE)
+          func_append pie_flag " $arg"
+	  continue
+	  ;;
+
+	-shared | -static | -prefer-pic | -prefer-non-pic)
+	  func_append later " $arg"
+	  continue
+	  ;;
+
+	-no-suppress)
+	  suppress_opt=no
+	  continue
+	  ;;
+
+	-Xcompiler)
+	  arg_mode=arg  #  the next one goes into the "base_compile" arg list
+	  continue      #  The current "srcfile" will either be retained or
+	  ;;            #  replaced later.  I would guess that would be a bug.
+
+	-Wc,*)
+	  func_stripname '-Wc,' '' "$arg"
+	  args=$func_stripname_result
+	  lastarg=
+	  save_ifs="$IFS"; IFS=','
+	  for arg in $args; do
+	    IFS="$save_ifs"
+	    func_append_quoted lastarg "$arg"
+	  done
+	  IFS="$save_ifs"
+	  func_stripname ' ' '' "$lastarg"
+	  lastarg=$func_stripname_result
+
+	  # Add the arguments to base_compile.
+	  func_append base_compile " $lastarg"
+	  continue
+	  ;;
+
+	*)
+	  # Accept the current argument as the source file.
+	  # The previous "srcfile" becomes the current argument.
+	  #
+	  lastarg="$srcfile"
+	  srcfile="$arg"
+	  ;;
+	esac  #  case $arg
+	;;
+      esac    #  case $arg_mode
+
+      # Aesthetically quote the previous argument.
+      func_append_quoted base_compile "$lastarg"
+    done # for arg
+
+    case $arg_mode in
+    arg)
+      func_fatal_error "you must specify an argument for -Xcompile"
+      ;;
+    target)
+      func_fatal_error "you must specify a target with \`-o'"
+      ;;
+    *)
+      # Get the name of the library object.
+      test -z "$libobj" && {
+	func_basename "$srcfile"
+	libobj="$func_basename_result"
+      }
+      ;;
+    esac
+
+    # Recognize several different file suffixes.
+    # If the user specifies -o file.o, it is replaced with file.lo
+    case $libobj in
+    *.[cCFSifmso] | \
+    *.ada | *.adb | *.ads | *.asm | \
+    *.c++ | *.cc | *.ii | *.class | *.cpp | *.cxx | \
+    *.[fF][09]? | *.for | *.java | *.go | *.obj | *.sx | *.cu | *.cup)
+      func_xform "$libobj"
+      libobj=$func_xform_result
+      ;;
+    esac
+
+    case $libobj in
+    *.lo) func_lo2o "$libobj"; obj=$func_lo2o_result ;;
+    *)
+      func_fatal_error "cannot determine name of library object from \`$libobj'"
+      ;;
+    esac
+
+    func_infer_tag $base_compile
+
+    for arg in $later; do
+      case $arg in
+      -shared)
+	test "$build_libtool_libs" != yes && \
+	  func_fatal_configuration "can not build a shared library"
+	build_old_libs=no
+	continue
+	;;
+
+      -static)
+	build_libtool_libs=no
+	build_old_libs=yes
+	continue
+	;;
+
+      -prefer-pic)
+	pic_mode=yes
+	continue
+	;;
+
+      -prefer-non-pic)
+	pic_mode=no
+	continue
+	;;
+      esac
+    done
+
+    func_quote_for_eval "$libobj"
+    test "X$libobj" != "X$func_quote_for_eval_result" \
+      && $ECHO "X$libobj" | $GREP '[]~#^*{};<>?"'"'"'	 &()|`$[]' \
+      && func_warning "libobj name \`$libobj' may not contain shell special characters."
+    func_dirname_and_basename "$obj" "/" ""
+    objname="$func_basename_result"
+    xdir="$func_dirname_result"
+    lobj=${xdir}$objdir/$objname
+
+    test -z "$base_compile" && \
+      func_fatal_help "you must specify a compilation command"
+
+    # Delete any leftover library objects.
+    if test "$build_old_libs" = yes; then
+      removelist="$obj $lobj $libobj ${libobj}T"
+    else
+      removelist="$lobj $libobj ${libobj}T"
+    fi
+
+    # On Cygwin there's no "real" PIC flag so we must build both object types
+    case $host_os in
+    cygwin* | mingw* | pw32* | os2* | cegcc*)
+      pic_mode=default
+      ;;
+    esac
+    if test "$pic_mode" = no && test "$deplibs_check_method" != pass_all; then
+      # non-PIC code in shared libraries is not supported
+      pic_mode=default
+    fi
+
+    # Calculate the filename of the output object if compiler does
+    # not support -o with -c
+    if test "$compiler_c_o" = no; then
+      output_obj=`$ECHO "$srcfile" | $SED 's%^.*/%%; s%\.[^.]*$%%'`.${objext}
+      lockfile="$output_obj.lock"
+    else
+      output_obj=
+      need_locks=no
+      lockfile=
+    fi
+
+    # Lock this critical section if it is needed
+    # We use this script file to make the link, it avoids creating a new file
+    if test "$need_locks" = yes; then
+      until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do
+	func_echo "Waiting for $lockfile to be removed"
+	sleep 2
+      done
+    elif test "$need_locks" = warn; then
+      if test -f "$lockfile"; then
+	$ECHO "\
+*** ERROR, $lockfile exists and contains:
+`cat $lockfile 2>/dev/null`
+
+This indicates that another process is trying to use the same
+temporary object file, and libtool could not work around it because
+your compiler does not support \`-c' and \`-o' together.  If you
+repeat this compilation, it may succeed, by chance, but you had better
+avoid parallel builds (make -j) in this platform, or get a better
+compiler."
+
+	$opt_dry_run || $RM $removelist
+	exit $EXIT_FAILURE
+      fi
+      func_append removelist " $output_obj"
+      $ECHO "$srcfile" > "$lockfile"
+    fi
+
+    $opt_dry_run || $RM $removelist
+    func_append removelist " $lockfile"
+    trap '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' 1 2 15
+
+    func_to_tool_file "$srcfile" func_convert_file_msys_to_w32
+    srcfile=$func_to_tool_file_result
+    func_quote_for_eval "$srcfile"
+    qsrcfile=$func_quote_for_eval_result
+
+    # Only build a PIC object if we are building libtool libraries.
+    if test "$build_libtool_libs" = yes; then
+      # Without this assignment, base_compile gets emptied.
+      fbsd_hideous_sh_bug=$base_compile
+
+      if test "$pic_mode" != no; then
+	command="$base_compile $qsrcfile $pic_flag"
+      else
+	# Don't build PIC code
+	command="$base_compile $qsrcfile"
+      fi
+
+      func_mkdir_p "$xdir$objdir"
+
+      if test -z "$output_obj"; then
+	# Place PIC objects in $objdir
+	func_append command " -o $lobj"
+      fi
+
+      func_show_eval_locale "$command"	\
+          'test -n "$output_obj" && $RM $removelist; exit $EXIT_FAILURE'
+
+      if test "$need_locks" = warn &&
+	 test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then
+	$ECHO "\
+*** ERROR, $lockfile contains:
+`cat $lockfile 2>/dev/null`
+
+but it should contain:
+$srcfile
+
+This indicates that another process is trying to use the same
+temporary object file, and libtool could not work around it because
+your compiler does not support \`-c' and \`-o' together.  If you
+repeat this compilation, it may succeed, by chance, but you had better
+avoid parallel builds (make -j) in this platform, or get a better
+compiler."
+
+	$opt_dry_run || $RM $removelist
+	exit $EXIT_FAILURE
+      fi
+
+      # Just move the object if needed, then go on to compile the next one
+      if test -n "$output_obj" && test "X$output_obj" != "X$lobj"; then
+	func_show_eval '$MV "$output_obj" "$lobj"' \
+	  'error=$?; $opt_dry_run || $RM $removelist; exit $error'
+      fi
+
+      # Allow error messages only from the first compilation.
+      if test "$suppress_opt" = yes; then
+	suppress_output=' >/dev/null 2>&1'
+      fi
+    fi
+
+    # Only build a position-dependent object if we build old libraries.
+    if test "$build_old_libs" = yes; then
+      if test "$pic_mode" != yes; then
+	# Don't build PIC code
+	command="$base_compile $qsrcfile$pie_flag"
+      else
+	command="$base_compile $qsrcfile $pic_flag"
+      fi
+      if test "$compiler_c_o" = yes; then
+	func_append command " -o $obj"
+      fi
+
+      # Suppress compiler output if we already did a PIC compilation.
+      func_append command "$suppress_output"
+      func_show_eval_locale "$command" \
+        '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE'
+
+      if test "$need_locks" = warn &&
+	 test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then
+	$ECHO "\
+*** ERROR, $lockfile contains:
+`cat $lockfile 2>/dev/null`
+
+but it should contain:
+$srcfile
+
+This indicates that another process is trying to use the same
+temporary object file, and libtool could not work around it because
+your compiler does not support \`-c' and \`-o' together.  If you
+repeat this compilation, it may succeed, by chance, but you had better
+avoid parallel builds (make -j) in this platform, or get a better
+compiler."
+
+	$opt_dry_run || $RM $removelist
+	exit $EXIT_FAILURE
+      fi
+
+      # Just move the object if needed
+      if test -n "$output_obj" && test "X$output_obj" != "X$obj"; then
+	func_show_eval '$MV "$output_obj" "$obj"' \
+	  'error=$?; $opt_dry_run || $RM $removelist; exit $error'
+      fi
+    fi
+
+    $opt_dry_run || {
+      func_write_libtool_object "$libobj" "$objdir/$objname" "$objname"
+
+      # Unlock the critical section if it was locked
+      if test "$need_locks" != no; then
+	removelist=$lockfile
+        $RM "$lockfile"
+      fi
+    }
+
+    exit $EXIT_SUCCESS
+}
+
+$opt_help || {
+  test "$opt_mode" = compile && func_mode_compile ${1+"$@"}
+}
+
+func_mode_help ()
+{
+    # We need to display help for each of the modes.
+    case $opt_mode in
+      "")
+        # Generic help is extracted from the usage comments
+        # at the start of this file.
+        func_help
+        ;;
+
+      clean)
+        $ECHO \
+"Usage: $progname [OPTION]... --mode=clean RM [RM-OPTION]... FILE...
+
+Remove files from the build directory.
+
+RM is the name of the program to use to delete files associated with each FILE
+(typically \`/bin/rm').  RM-OPTIONS are options (such as \`-f') to be passed
+to RM.
+
+If FILE is a libtool library, object or program, all the files associated
+with it are deleted. Otherwise, only FILE itself is deleted using RM."
+        ;;
+
+      compile)
+      $ECHO \
+"Usage: $progname [OPTION]... --mode=compile COMPILE-COMMAND... SOURCEFILE
+
+Compile a source file into a libtool library object.
+
+This mode accepts the following additional options:
+
+  -o OUTPUT-FILE    set the output file name to OUTPUT-FILE
+  -no-suppress      do not suppress compiler output for multiple passes
+  -prefer-pic       try to build PIC objects only
+  -prefer-non-pic   try to build non-PIC objects only
+  -shared           do not build a \`.o' file suitable for static linking
+  -static           only build a \`.o' file suitable for static linking
+  -Wc,FLAG          pass FLAG directly to the compiler
+
+COMPILE-COMMAND is a command to be used in creating a \`standard' object file
+from the given SOURCEFILE.
+
+The output file name is determined by removing the directory component from
+SOURCEFILE, then substituting the C source code suffix \`.c' with the
+library object suffix, \`.lo'."
+        ;;
+
+      execute)
+        $ECHO \
+"Usage: $progname [OPTION]... --mode=execute COMMAND [ARGS]...
+
+Automatically set library path, then run a program.
+
+This mode accepts the following additional options:
+
+  -dlopen FILE      add the directory containing FILE to the library path
+
+This mode sets the library path environment variable according to \`-dlopen'
+flags.
+
+If any of the ARGS are libtool executable wrappers, then they are translated
+into their corresponding uninstalled binary, and any of their required library
+directories are added to the library path.
+
+Then, COMMAND is executed, with ARGS as arguments."
+        ;;
+
+      finish)
+        $ECHO \
+"Usage: $progname [OPTION]... --mode=finish [LIBDIR]...
+
+Complete the installation of libtool libraries.
+
+Each LIBDIR is a directory that contains libtool libraries.
+
+The commands that this mode executes may require superuser privileges.  Use
+the \`--dry-run' option if you just want to see what would be executed."
+        ;;
+
+      install)
+        $ECHO \
+"Usage: $progname [OPTION]... --mode=install INSTALL-COMMAND...
+
+Install executables or libraries.
+
+INSTALL-COMMAND is the installation command.  The first component should be
+either the \`install' or \`cp' program.
+
+The following components of INSTALL-COMMAND are treated specially:
+
+  -inst-prefix-dir PREFIX-DIR  Use PREFIX-DIR as a staging area for installation
+
+The rest of the components are interpreted as arguments to that command (only
+BSD-compatible install options are recognized)."
+        ;;
+
+      link)
+        $ECHO \
+"Usage: $progname [OPTION]... --mode=link LINK-COMMAND...
+
+Link object files or libraries together to form another library, or to
+create an executable program.
+
+LINK-COMMAND is a command using the C compiler that you would use to create
+a program from several object files.
+
+The following components of LINK-COMMAND are treated specially:
+
+  -all-static       do not do any dynamic linking at all
+  -avoid-version    do not add a version suffix if possible
+  -bindir BINDIR    specify path to binaries directory (for systems where
+                    libraries must be found in the PATH setting at runtime)
+  -dlopen FILE      \`-dlpreopen' FILE if it cannot be dlopened at runtime
+  -dlpreopen FILE   link in FILE and add its symbols to lt_preloaded_symbols
+  -export-dynamic   allow symbols from OUTPUT-FILE to be resolved with dlsym(3)
+  -export-symbols SYMFILE
+                    try to export only the symbols listed in SYMFILE
+  -export-symbols-regex REGEX
+                    try to export only the symbols matching REGEX
+  -LLIBDIR          search LIBDIR for required installed libraries
+  -lNAME            OUTPUT-FILE requires the installed library libNAME
+  -module           build a library that can dlopened
+  -no-fast-install  disable the fast-install mode
+  -no-install       link a not-installable executable
+  -no-undefined     declare that a library does not refer to external symbols
+  -o OUTPUT-FILE    create OUTPUT-FILE from the specified objects
+  -objectlist FILE  Use a list of object files found in FILE to specify objects
+  -precious-files-regex REGEX
+                    don't remove output files matching REGEX
+  -release RELEASE  specify package release information
+  -rpath LIBDIR     the created library will eventually be installed in LIBDIR
+  -R[ ]LIBDIR       add LIBDIR to the runtime path of programs and libraries
+  -shared           only do dynamic linking of libtool libraries
+  -shrext SUFFIX    override the standard shared library file extension
+  -static           do not do any dynamic linking of uninstalled libtool libraries
+  -static-libtool-libs
+                    do not do any dynamic linking of libtool libraries
+  -version-info CURRENT[:REVISION[:AGE]]
+                    specify library version info [each variable defaults to 0]
+  -weak LIBNAME     declare that the target provides the LIBNAME interface
+  -Wc,FLAG
+  -Xcompiler FLAG   pass linker-specific FLAG directly to the compiler
+  -Wl,FLAG
+  -Xlinker FLAG     pass linker-specific FLAG directly to the linker
+  -XCClinker FLAG   pass link-specific FLAG to the compiler driver (CC)
+
+All other options (arguments beginning with \`-') are ignored.
+
+Every other argument is treated as a filename.  Files ending in \`.la' are
+treated as uninstalled libtool libraries, other files are standard or library
+object files.
+
+If the OUTPUT-FILE ends in \`.la', then a libtool library is created,
+only library objects (\`.lo' files) may be specified, and \`-rpath' is
+required, except when creating a convenience library.
+
+If OUTPUT-FILE ends in \`.a' or \`.lib', then a standard library is created
+using \`ar' and \`ranlib', or on Windows using \`lib'.
+
+If OUTPUT-FILE ends in \`.lo' or \`.${objext}', then a reloadable object file
+is created, otherwise an executable program is created."
+        ;;
+
+      uninstall)
+        $ECHO \
+"Usage: $progname [OPTION]... --mode=uninstall RM [RM-OPTION]... FILE...
+
+Remove libraries from an installation directory.
+
+RM is the name of the program to use to delete files associated with each FILE
+(typically \`/bin/rm').  RM-OPTIONS are options (such as \`-f') to be passed
+to RM.
+
+If FILE is a libtool library, all the files associated with it are deleted.
+Otherwise, only FILE itself is deleted using RM."
+        ;;
+
+      *)
+        func_fatal_help "invalid operation mode \`$opt_mode'"
+        ;;
+    esac
+
+    echo
+    $ECHO "Try \`$progname --help' for more information about other modes."
+}
+
+# Now that we've collected a possible --mode arg, show help if necessary
+if $opt_help; then
+  if test "$opt_help" = :; then
+    func_mode_help
+  else
+    {
+      func_help noexit
+      for opt_mode in compile link execute install finish uninstall clean; do
+	func_mode_help
+      done
+    } | sed -n '1p; 2,$s/^Usage:/  or: /p'
+    {
+      func_help noexit
+      for opt_mode in compile link execute install finish uninstall clean; do
+	echo
+	func_mode_help
+      done
+    } |
+    sed '1d
+      /^When reporting/,/^Report/{
+	H
+	d
+      }
+      $x
+      /information about other modes/d
+      /more detailed .*MODE/d
+      s/^Usage:.*--mode=\([^ ]*\) .*/Description of \1 mode:/'
+  fi
+  exit $?
+fi
+
+
+# func_mode_execute arg...
+func_mode_execute ()
+{
+    $opt_debug
+    # The first argument is the command name.
+    cmd="$nonopt"
+    test -z "$cmd" && \
+      func_fatal_help "you must specify a COMMAND"
+
+    # Handle -dlopen flags immediately.
+    for file in $opt_dlopen; do
+      test -f "$file" \
+	|| func_fatal_help "\`$file' is not a file"
+
+      dir=
+      case $file in
+      *.la)
+	func_resolve_sysroot "$file"
+	file=$func_resolve_sysroot_result
+
+	# Check to see that this really is a libtool archive.
+	func_lalib_unsafe_p "$file" \
+	  || func_fatal_help "\`$lib' is not a valid libtool archive"
+
+	# Read the libtool library.
+	dlname=
+	library_names=
+	func_source "$file"
+
+	# Skip this library if it cannot be dlopened.
+	if test -z "$dlname"; then
+	  # Warn if it was a shared library.
+	  test -n "$library_names" && \
+	    func_warning "\`$file' was not linked with \`-export-dynamic'"
+	  continue
+	fi
+
+	func_dirname "$file" "" "."
+	dir="$func_dirname_result"
+
+	if test -f "$dir/$objdir/$dlname"; then
+	  func_append dir "/$objdir"
+	else
+	  if test ! -f "$dir/$dlname"; then
+	    func_fatal_error "cannot find \`$dlname' in \`$dir' or \`$dir/$objdir'"
+	  fi
+	fi
+	;;
+
+      *.lo)
+	# Just add the directory containing the .lo file.
+	func_dirname "$file" "" "."
+	dir="$func_dirname_result"
+	;;
+
+      *)
+	func_warning "\`-dlopen' is ignored for non-libtool libraries and objects"
+	continue
+	;;
+      esac
+
+      # Get the absolute pathname.
+      absdir=`cd "$dir" && pwd`
+      test -n "$absdir" && dir="$absdir"
+
+      # Now add the directory to shlibpath_var.
+      if eval "test -z \"\$$shlibpath_var\""; then
+	eval "$shlibpath_var=\"\$dir\""
+      else
+	eval "$shlibpath_var=\"\$dir:\$$shlibpath_var\""
+      fi
+    done
+
+    # This variable tells wrapper scripts just to set shlibpath_var
+    # rather than running their programs.
+    libtool_execute_magic="$magic"
+
+    # Check if any of the arguments is a wrapper script.
+    args=
+    for file
+    do
+      case $file in
+      -* | *.la | *.lo ) ;;
+      *)
+	# Do a test to see if this is really a libtool program.
+	if func_ltwrapper_script_p "$file"; then
+	  func_source "$file"
+	  # Transform arg to wrapped name.
+	  file="$progdir/$program"
+	elif func_ltwrapper_executable_p "$file"; then
+	  func_ltwrapper_scriptname "$file"
+	  func_source "$func_ltwrapper_scriptname_result"
+	  # Transform arg to wrapped name.
+	  file="$progdir/$program"
+	fi
+	;;
+      esac
+      # Quote arguments (to preserve shell metacharacters).
+      func_append_quoted args "$file"
+    done
+
+    if test "X$opt_dry_run" = Xfalse; then
+      if test -n "$shlibpath_var"; then
+	# Export the shlibpath_var.
+	eval "export $shlibpath_var"
+      fi
+
+      # Restore saved environment variables
+      for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES
+      do
+	eval "if test \"\${save_$lt_var+set}\" = set; then
+                $lt_var=\$save_$lt_var; export $lt_var
+	      else
+		$lt_unset $lt_var
+	      fi"
+      done
+
+      # Now prepare to actually exec the command.
+      exec_cmd="\$cmd$args"
+    else
+      # Display what would be done.
+      if test -n "$shlibpath_var"; then
+	eval "\$ECHO \"\$shlibpath_var=\$$shlibpath_var\""
+	echo "export $shlibpath_var"
+      fi
+      $ECHO "$cmd$args"
+      exit $EXIT_SUCCESS
+    fi
+}
+
+test "$opt_mode" = execute && func_mode_execute ${1+"$@"}
+
+
+# func_mode_finish arg...
+func_mode_finish ()
+{
+    $opt_debug
+    libs=
+    libdirs=
+    admincmds=
+
+    for opt in "$nonopt" ${1+"$@"}
+    do
+      if test -d "$opt"; then
+	func_append libdirs " $opt"
+
+      elif test -f "$opt"; then
+	if func_lalib_unsafe_p "$opt"; then
+	  func_append libs " $opt"
+	else
+	  func_warning "\`$opt' is not a valid libtool archive"
+	fi
+
+      else
+	func_fatal_error "invalid argument \`$opt'"
+      fi
+    done
+
+    if test -n "$libs"; then
+      if test -n "$lt_sysroot"; then
+        sysroot_regex=`$ECHO "$lt_sysroot" | $SED "$sed_make_literal_regex"`
+        sysroot_cmd="s/\([ ']\)$sysroot_regex/\1/g;"
+      else
+        sysroot_cmd=
+      fi
+
+      # Remove sysroot references
+      if $opt_dry_run; then
+        for lib in $libs; do
+          echo "removing references to $lt_sysroot and \`=' prefixes from $lib"
+        done
+      else
+        tmpdir=`func_mktempdir`
+        for lib in $libs; do
+	  sed -e "${sysroot_cmd} s/\([ ']-[LR]\)=/\1/g; s/\([ ']\)=/\1/g" $lib \
+	    > $tmpdir/tmp-la
+	  mv -f $tmpdir/tmp-la $lib
+	done
+        ${RM}r "$tmpdir"
+      fi
+    fi
+
+    if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then
+      for libdir in $libdirs; do
+	if test -n "$finish_cmds"; then
+	  # Do each command in the finish commands.
+	  func_execute_cmds "$finish_cmds" 'admincmds="$admincmds
+'"$cmd"'"'
+	fi
+	if test -n "$finish_eval"; then
+	  # Do the single finish_eval.
+	  eval cmds=\"$finish_eval\"
+	  $opt_dry_run || eval "$cmds" || func_append admincmds "
+       $cmds"
+	fi
+      done
+    fi
+
+    # Exit here if they wanted silent mode.
+    $opt_silent && exit $EXIT_SUCCESS
+
+    if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then
+      echo "----------------------------------------------------------------------"
+      echo "Libraries have been installed in:"
+      for libdir in $libdirs; do
+	$ECHO "   $libdir"
+      done
+      echo
+      echo "If you ever happen to want to link against installed libraries"
+      echo "in a given directory, LIBDIR, you must either use libtool, and"
+      echo "specify the full pathname of the library, or use the \`-LLIBDIR'"
+      echo "flag during linking and do at least one of the following:"
+      if test -n "$shlibpath_var"; then
+	echo "   - add LIBDIR to the \`$shlibpath_var' environment variable"
+	echo "     during execution"
+      fi
+      if test -n "$runpath_var"; then
+	echo "   - add LIBDIR to the \`$runpath_var' environment variable"
+	echo "     during linking"
+      fi
+      if test -n "$hardcode_libdir_flag_spec"; then
+	libdir=LIBDIR
+	eval flag=\"$hardcode_libdir_flag_spec\"
+
+	$ECHO "   - use the \`$flag' linker flag"
+      fi
+      if test -n "$admincmds"; then
+	$ECHO "   - have your system administrator run these commands:$admincmds"
+      fi
+      if test -f /etc/ld.so.conf; then
+	echo "   - have your system administrator add LIBDIR to \`/etc/ld.so.conf'"
+      fi
+      echo
+
+      echo "See any operating system documentation about shared libraries for"
+      case $host in
+	solaris2.[6789]|solaris2.1[0-9])
+	  echo "more information, such as the ld(1), crle(1) and ld.so(8) manual"
+	  echo "pages."
+	  ;;
+	*)
+	  echo "more information, such as the ld(1) and ld.so(8) manual pages."
+	  ;;
+      esac
+      echo "----------------------------------------------------------------------"
+    fi
+    exit $EXIT_SUCCESS
+}
+
+test "$opt_mode" = finish && func_mode_finish ${1+"$@"}
+
+
+# func_mode_install arg...
+func_mode_install ()
+{
+    $opt_debug
+    # There may be an optional sh(1) argument at the beginning of
+    # install_prog (especially on Windows NT).
+    if test "$nonopt" = "$SHELL" || test "$nonopt" = /bin/sh ||
+       # Allow the use of GNU shtool's install command.
+       case $nonopt in *shtool*) :;; *) false;; esac; then
+      # Aesthetically quote it.
+      func_quote_for_eval "$nonopt"
+      install_prog="$func_quote_for_eval_result "
+      arg=$1
+      shift
+    else
+      install_prog=
+      arg=$nonopt
+    fi
+
+    # The real first argument should be the name of the installation program.
+    # Aesthetically quote it.
+    func_quote_for_eval "$arg"
+    func_append install_prog "$func_quote_for_eval_result"
+    install_shared_prog=$install_prog
+    case " $install_prog " in
+      *[\\\ /]cp\ *) install_cp=: ;;
+      *) install_cp=false ;;
+    esac
+
+    # We need to accept at least all the BSD install flags.
+    dest=
+    files=
+    opts=
+    prev=
+    install_type=
+    isdir=no
+    stripme=
+    no_mode=:
+    for arg
+    do
+      arg2=
+      if test -n "$dest"; then
+	func_append files " $dest"
+	dest=$arg
+	continue
+      fi
+
+      case $arg in
+      -d) isdir=yes ;;
+      -f)
+	if $install_cp; then :; else
+	  prev=$arg
+	fi
+	;;
+      -g | -m | -o)
+	prev=$arg
+	;;
+      -s)
+	stripme=" -s"
+	continue
+	;;
+      -*)
+	;;
+      *)
+	# If the previous option needed an argument, then skip it.
+	if test -n "$prev"; then
+	  if test "x$prev" = x-m && test -n "$install_override_mode"; then
+	    arg2=$install_override_mode
+	    no_mode=false
+	  fi
+	  prev=
+	else
+	  dest=$arg
+	  continue
+	fi
+	;;
+      esac
+
+      # Aesthetically quote the argument.
+      func_quote_for_eval "$arg"
+      func_append install_prog " $func_quote_for_eval_result"
+      if test -n "$arg2"; then
+	func_quote_for_eval "$arg2"
+      fi
+      func_append install_shared_prog " $func_quote_for_eval_result"
+    done
+
+    test -z "$install_prog" && \
+      func_fatal_help "you must specify an install program"
+
+    test -n "$prev" && \
+      func_fatal_help "the \`$prev' option requires an argument"
+
+    if test -n "$install_override_mode" && $no_mode; then
+      if $install_cp; then :; else
+	func_quote_for_eval "$install_override_mode"
+	func_append install_shared_prog " -m $func_quote_for_eval_result"
+      fi
+    fi
+
+    if test -z "$files"; then
+      if test -z "$dest"; then
+	func_fatal_help "no file or destination specified"
+      else
+	func_fatal_help "you must specify a destination"
+      fi
+    fi
+
+    # Strip any trailing slash from the destination.
+    func_stripname '' '/' "$dest"
+    dest=$func_stripname_result
+
+    # Check to see that the destination is a directory.
+    test -d "$dest" && isdir=yes
+    if test "$isdir" = yes; then
+      destdir="$dest"
+      destname=
+    else
+      func_dirname_and_basename "$dest" "" "."
+      destdir="$func_dirname_result"
+      destname="$func_basename_result"
+
+      # Not a directory, so check to see that there is only one file specified.
+      set dummy $files; shift
+      test "$#" -gt 1 && \
+	func_fatal_help "\`$dest' is not a directory"
+    fi
+    case $destdir in
+    [\\/]* | [A-Za-z]:[\\/]*) ;;
+    *)
+      for file in $files; do
+	case $file in
+	*.lo) ;;
+	*)
+	  func_fatal_help "\`$destdir' must be an absolute directory name"
+	  ;;
+	esac
+      done
+      ;;
+    esac
+
+    # This variable tells wrapper scripts just to set variables rather
+    # than running their programs.
+    libtool_install_magic="$magic"
+
+    staticlibs=
+    future_libdirs=
+    current_libdirs=
+    for file in $files; do
+
+      # Do each installation.
+      case $file in
+      *.$libext)
+	# Do the static libraries later.
+	func_append staticlibs " $file"
+	;;
+
+      *.la)
+	func_resolve_sysroot "$file"
+	file=$func_resolve_sysroot_result
+
+	# Check to see that this really is a libtool archive.
+	func_lalib_unsafe_p "$file" \
+	  || func_fatal_help "\`$file' is not a valid libtool archive"
+
+	library_names=
+	old_library=
+	relink_command=
+	func_source "$file"
+
+	# Add the libdir to current_libdirs if it is the destination.
+	if test "X$destdir" = "X$libdir"; then
+	  case "$current_libdirs " in
+	  *" $libdir "*) ;;
+	  *) func_append current_libdirs " $libdir" ;;
+	  esac
+	else
+	  # Note the libdir as a future libdir.
+	  case "$future_libdirs " in
+	  *" $libdir "*) ;;
+	  *) func_append future_libdirs " $libdir" ;;
+	  esac
+	fi
+
+	func_dirname "$file" "/" ""
+	dir="$func_dirname_result"
+	func_append dir "$objdir"
+
+	if test -n "$relink_command"; then
+	  # Determine the prefix the user has applied to our future dir.
+	  inst_prefix_dir=`$ECHO "$destdir" | $SED -e "s%$libdir\$%%"`
+
+	  # Don't allow the user to place us outside of our expected
+	  # location b/c this prevents finding dependent libraries that
+	  # are installed to the same prefix.
+	  # At present, this check doesn't affect windows .dll's that
+	  # are installed into $libdir/../bin (currently, that works fine)
+	  # but it's something to keep an eye on.
+	  test "$inst_prefix_dir" = "$destdir" && \
+	    func_fatal_error "error: cannot install \`$file' to a directory not ending in $libdir"
+
+	  if test -n "$inst_prefix_dir"; then
+	    # Stick the inst_prefix_dir data into the link command.
+	    relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%"`
+	  else
+	    relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%%"`
+	  fi
+
+	  func_warning "relinking \`$file'"
+	  func_show_eval "$relink_command" \
+	    'func_fatal_error "error: relink \`$file'\'' with the above command before installing it"'
+	fi
+
+	# See the names of the shared library.
+	set dummy $library_names; shift
+	if test -n "$1"; then
+	  realname="$1"
+	  shift
+
+	  srcname="$realname"
+	  test -n "$relink_command" && srcname="$realname"T
+
+	  # Install the shared library and build the symlinks.
+	  func_show_eval "$install_shared_prog $dir/$srcname $destdir/$realname" \
+	      'exit $?'
+	  tstripme="$stripme"
+	  case $host_os in
+	  cygwin* | mingw* | pw32* | cegcc*)
+	    case $realname in
+	    *.dll.a)
+	      tstripme=""
+	      ;;
+	    esac
+	    ;;
+	  esac
+	  if test -n "$tstripme" && test -n "$striplib"; then
+	    func_show_eval "$striplib $destdir/$realname" 'exit $?'
+	  fi
+
+	  if test "$#" -gt 0; then
+	    # Delete the old symlinks, and create new ones.
+	    # Try `ln -sf' first, because the `ln' binary might depend on
+	    # the symlink we replace!  Solaris /bin/ln does not understand -f,
+	    # so we also need to try rm && ln -s.
+	    for linkname
+	    do
+	      test "$linkname" != "$realname" \
+		&& func_show_eval "(cd $destdir && { $LN_S -f $realname $linkname || { $RM $linkname && $LN_S $realname $linkname; }; })"
+	    done
+	  fi
+
+	  # Do each command in the postinstall commands.
+	  lib="$destdir/$realname"
+	  func_execute_cmds "$postinstall_cmds" 'exit $?'
+	fi
+
+	# Install the pseudo-library for information purposes.
+	func_basename "$file"
+	name="$func_basename_result"
+	instname="$dir/$name"i
+	func_show_eval "$install_prog $instname $destdir/$name" 'exit $?'
+
+	# Maybe install the static library, too.
+	test -n "$old_library" && func_append staticlibs " $dir/$old_library"
+	;;
+
+      *.lo)
+	# Install (i.e. copy) a libtool object.
+
+	# Figure out destination file name, if it wasn't already specified.
+	if test -n "$destname"; then
+	  destfile="$destdir/$destname"
+	else
+	  func_basename "$file"
+	  destfile="$func_basename_result"
+	  destfile="$destdir/$destfile"
+	fi
+
+	# Deduce the name of the destination old-style object file.
+	case $destfile in
+	*.lo)
+	  func_lo2o "$destfile"
+	  staticdest=$func_lo2o_result
+	  ;;
+	*.$objext)
+	  staticdest="$destfile"
+	  destfile=
+	  ;;
+	*)
+	  func_fatal_help "cannot copy a libtool object to \`$destfile'"
+	  ;;
+	esac
+
+	# Install the libtool object if requested.
+	test -n "$destfile" && \
+	  func_show_eval "$install_prog $file $destfile" 'exit $?'
+
+	# Install the old object if enabled.
+	if test "$build_old_libs" = yes; then
+	  # Deduce the name of the old-style object file.
+	  func_lo2o "$file"
+	  staticobj=$func_lo2o_result
+	  func_show_eval "$install_prog \$staticobj \$staticdest" 'exit $?'
+	fi
+	exit $EXIT_SUCCESS
+	;;
+
+      *)
+	# Figure out destination file name, if it wasn't already specified.
+	if test -n "$destname"; then
+	  destfile="$destdir/$destname"
+	else
+	  func_basename "$file"
+	  destfile="$func_basename_result"
+	  destfile="$destdir/$destfile"
+	fi
+
+	# If the file is missing, and there is a .exe on the end, strip it
+	# because it is most likely a libtool script we actually want to
+	# install
+	stripped_ext=""
+	case $file in
+	  *.exe)
+	    if test ! -f "$file"; then
+	      func_stripname '' '.exe' "$file"
+	      file=$func_stripname_result
+	      stripped_ext=".exe"
+	    fi
+	    ;;
+	esac
+
+	# Do a test to see if this is really a libtool program.
+	case $host in
+	*cygwin* | *mingw*)
+	    if func_ltwrapper_executable_p "$file"; then
+	      func_ltwrapper_scriptname "$file"
+	      wrapper=$func_ltwrapper_scriptname_result
+	    else
+	      func_stripname '' '.exe' "$file"
+	      wrapper=$func_stripname_result
+	    fi
+	    ;;
+	*)
+	    wrapper=$file
+	    ;;
+	esac
+	if func_ltwrapper_script_p "$wrapper"; then
+	  notinst_deplibs=
+	  relink_command=
+
+	  func_source "$wrapper"
+
+	  # Check the variables that should have been set.
+	  test -z "$generated_by_libtool_version" && \
+	    func_fatal_error "invalid libtool wrapper script \`$wrapper'"
+
+	  finalize=yes
+	  for lib in $notinst_deplibs; do
+	    # Check to see that each library is installed.
+	    libdir=
+	    if test -f "$lib"; then
+	      func_source "$lib"
+	    fi
+	    libfile="$libdir/"`$ECHO "$lib" | $SED 's%^.*/%%g'` ### testsuite: skip nested quoting test
+	    if test -n "$libdir" && test ! -f "$libfile"; then
+	      func_warning "\`$lib' has not been installed in \`$libdir'"
+	      finalize=no
+	    fi
+	  done
+
+	  relink_command=
+	  func_source "$wrapper"
+
+	  outputname=
+	  if test "$fast_install" = no && test -n "$relink_command"; then
+	    $opt_dry_run || {
+	      if test "$finalize" = yes; then
+	        tmpdir=`func_mktempdir`
+		func_basename "$file$stripped_ext"
+		file="$func_basename_result"
+	        outputname="$tmpdir/$file"
+	        # Replace the output file specification.
+	        relink_command=`$ECHO "$relink_command" | $SED 's%@OUTPUT@%'"$outputname"'%g'`
+
+	        $opt_silent || {
+	          func_quote_for_expand "$relink_command"
+		  eval "func_echo $func_quote_for_expand_result"
+	        }
+	        if eval "$relink_command"; then :
+	          else
+		  func_error "error: relink \`$file' with the above command before installing it"
+		  $opt_dry_run || ${RM}r "$tmpdir"
+		  continue
+	        fi
+	        file="$outputname"
+	      else
+	        func_warning "cannot relink \`$file'"
+	      fi
+	    }
+	  else
+	    # Install the binary that we compiled earlier.
+	    file=`$ECHO "$file$stripped_ext" | $SED "s%\([^/]*\)$%$objdir/\1%"`
+	  fi
+	fi
+
+	# remove .exe since cygwin /usr/bin/install will append another
+	# one anyway
+	case $install_prog,$host in
+	*/usr/bin/install*,*cygwin*)
+	  case $file:$destfile in
+	  *.exe:*.exe)
+	    # this is ok
+	    ;;
+	  *.exe:*)
+	    destfile=$destfile.exe
+	    ;;
+	  *:*.exe)
+	    func_stripname '' '.exe' "$destfile"
+	    destfile=$func_stripname_result
+	    ;;
+	  esac
+	  ;;
+	esac
+	func_show_eval "$install_prog\$stripme \$file \$destfile" 'exit $?'
+	$opt_dry_run || if test -n "$outputname"; then
+	  ${RM}r "$tmpdir"
+	fi
+	;;
+      esac
+    done
+
+    for file in $staticlibs; do
+      func_basename "$file"
+      name="$func_basename_result"
+
+      # Set up the ranlib parameters.
+      oldlib="$destdir/$name"
+      func_to_tool_file "$oldlib" func_convert_file_msys_to_w32
+      tool_oldlib=$func_to_tool_file_result
+
+      func_show_eval "$install_prog \$file \$oldlib" 'exit $?'
+
+      if test -n "$stripme" && test -n "$old_striplib"; then
+	func_show_eval "$old_striplib $tool_oldlib" 'exit $?'
+      fi
+
+      # Do each command in the postinstall commands.
+      func_execute_cmds "$old_postinstall_cmds" 'exit $?'
+    done
+
+    test -n "$future_libdirs" && \
+      func_warning "remember to run \`$progname --finish$future_libdirs'"
+
+    if test -n "$current_libdirs"; then
+      # Maybe just do a dry run.
+      $opt_dry_run && current_libdirs=" -n$current_libdirs"
+      exec_cmd='$SHELL $progpath $preserve_args --finish$current_libdirs'
+    else
+      exit $EXIT_SUCCESS
+    fi
+}
+
+test "$opt_mode" = install && func_mode_install ${1+"$@"}
+
+
+# func_generate_dlsyms outputname originator pic_p
+# Extract symbols from dlprefiles and create ${outputname}S.o with
+# a dlpreopen symbol table.
+func_generate_dlsyms ()
+{
+    $opt_debug
+    my_outputname="$1"
+    my_originator="$2"
+    my_pic_p="${3-no}"
+    my_prefix=`$ECHO "$my_originator" | sed 's%[^a-zA-Z0-9]%_%g'`
+    my_dlsyms=
+
+    if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then
+      if test -n "$NM" && test -n "$global_symbol_pipe"; then
+	my_dlsyms="${my_outputname}S.c"
+      else
+	func_error "not configured to extract global symbols from dlpreopened files"
+      fi
+    fi
+
+    if test -n "$my_dlsyms"; then
+      case $my_dlsyms in
+      "") ;;
+      *.c)
+	# Discover the nlist of each of the dlfiles.
+	nlist="$output_objdir/${my_outputname}.nm"
+
+	func_show_eval "$RM $nlist ${nlist}S ${nlist}T"
+
+	# Parse the name list into a source file.
+	func_verbose "creating $output_objdir/$my_dlsyms"
+
+	$opt_dry_run || $ECHO > "$output_objdir/$my_dlsyms" "\
+/* $my_dlsyms - symbol resolution table for \`$my_outputname' dlsym emulation. */
+/* Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION */
+
+#ifdef __cplusplus
+extern \"C\" {
+#endif
+
+#if defined(__GNUC__) && (((__GNUC__ == 4) && (__GNUC_MINOR__ >= 4)) || (__GNUC__ > 4))
+#pragma GCC diagnostic ignored \"-Wstrict-prototypes\"
+#endif
+
+/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests.  */
+#if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE)
+/* DATA imports from DLLs on WIN32 con't be const, because runtime
+   relocations are performed -- see ld's documentation on pseudo-relocs.  */
+# define LT_DLSYM_CONST
+#elif defined(__osf__)
+/* This system does not cope well with relocations in const data.  */
+# define LT_DLSYM_CONST
+#else
+# define LT_DLSYM_CONST const
+#endif
+
+/* External symbol declarations for the compiler. */\
+"
+
+	if test "$dlself" = yes; then
+	  func_verbose "generating symbol list for \`$output'"
+
+	  $opt_dry_run || echo ': @PROGRAM@ ' > "$nlist"
+
+	  # Add our own program objects to the symbol list.
+	  progfiles=`$ECHO "$objs$old_deplibs" | $SP2NL | $SED "$lo2o" | $NL2SP`
+	  for progfile in $progfiles; do
+	    func_to_tool_file "$progfile" func_convert_file_msys_to_w32
+	    func_verbose "extracting global C symbols from \`$func_to_tool_file_result'"
+	    $opt_dry_run || eval "$NM $func_to_tool_file_result | $global_symbol_pipe >> '$nlist'"
+	  done
+
+	  if test -n "$exclude_expsyms"; then
+	    $opt_dry_run || {
+	      eval '$EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T'
+	      eval '$MV "$nlist"T "$nlist"'
+	    }
+	  fi
+
+	  if test -n "$export_symbols_regex"; then
+	    $opt_dry_run || {
+	      eval '$EGREP -e "$export_symbols_regex" "$nlist" > "$nlist"T'
+	      eval '$MV "$nlist"T "$nlist"'
+	    }
+	  fi
+
+	  # Prepare the list of exported symbols
+	  if test -z "$export_symbols"; then
+	    export_symbols="$output_objdir/$outputname.exp"
+	    $opt_dry_run || {
+	      $RM $export_symbols
+	      eval "${SED} -n -e '/^: @PROGRAM@ $/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"'
+	      case $host in
+	      *cygwin* | *mingw* | *cegcc* )
+                eval "echo EXPORTS "'> "$output_objdir/$outputname.def"'
+                eval 'cat "$export_symbols" >> "$output_objdir/$outputname.def"'
+	        ;;
+	      esac
+	    }
+	  else
+	    $opt_dry_run || {
+	      eval "${SED} -e 's/\([].[*^$]\)/\\\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$outputname.exp"'
+	      eval '$GREP -f "$output_objdir/$outputname.exp" < "$nlist" > "$nlist"T'
+	      eval '$MV "$nlist"T "$nlist"'
+	      case $host in
+	        *cygwin* | *mingw* | *cegcc* )
+	          eval "echo EXPORTS "'> "$output_objdir/$outputname.def"'
+	          eval 'cat "$nlist" >> "$output_objdir/$outputname.def"'
+	          ;;
+	      esac
+	    }
+	  fi
+	fi
+
+	for dlprefile in $dlprefiles; do
+	  func_verbose "extracting global C symbols from \`$dlprefile'"
+	  func_basename "$dlprefile"
+	  name="$func_basename_result"
+          case $host in
+	    *cygwin* | *mingw* | *cegcc* )
+	      # if an import library, we need to obtain dlname
+	      if func_win32_import_lib_p "$dlprefile"; then
+	        func_tr_sh "$dlprefile"
+	        eval "curr_lafile=\$libfile_$func_tr_sh_result"
+	        dlprefile_dlbasename=""
+	        if test -n "$curr_lafile" && func_lalib_p "$curr_lafile"; then
+	          # Use subshell, to avoid clobbering current variable values
+	          dlprefile_dlname=`source "$curr_lafile" && echo "$dlname"`
+	          if test -n "$dlprefile_dlname" ; then
+	            func_basename "$dlprefile_dlname"
+	            dlprefile_dlbasename="$func_basename_result"
+	          else
+	            # no lafile. user explicitly requested -dlpreopen <import library>.
+	            $sharedlib_from_linklib_cmd "$dlprefile"
+	            dlprefile_dlbasename=$sharedlib_from_linklib_result
+	          fi
+	        fi
+	        $opt_dry_run || {
+	          if test -n "$dlprefile_dlbasename" ; then
+	            eval '$ECHO ": $dlprefile_dlbasename" >> "$nlist"'
+	          else
+	            func_warning "Could not compute DLL name from $name"
+	            eval '$ECHO ": $name " >> "$nlist"'
+	          fi
+	          func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32
+	          eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe |
+	            $SED -e '/I __imp/d' -e 's/I __nm_/D /;s/_nm__//' >> '$nlist'"
+	        }
+	      else # not an import lib
+	        $opt_dry_run || {
+	          eval '$ECHO ": $name " >> "$nlist"'
+	          func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32
+	          eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'"
+	        }
+	      fi
+	    ;;
+	    *)
+	      $opt_dry_run || {
+	        eval '$ECHO ": $name " >> "$nlist"'
+	        func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32
+	        eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'"
+	      }
+	    ;;
+          esac
+	done
+
+	$opt_dry_run || {
+	  # Make sure we have at least an empty file.
+	  test -f "$nlist" || : > "$nlist"
+
+	  if test -n "$exclude_expsyms"; then
+	    $EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T
+	    $MV "$nlist"T "$nlist"
+	  fi
+
+	  # Try sorting and uniquifying the output.
+	  if $GREP -v "^: " < "$nlist" |
+	      if sort -k 3 </dev/null >/dev/null 2>&1; then
+		sort -k 3
+	      else
+		sort +2
+	      fi |
+	      uniq > "$nlist"S; then
+	    :
+	  else
+	    $GREP -v "^: " < "$nlist" > "$nlist"S
+	  fi
+
+	  if test -f "$nlist"S; then
+	    eval "$global_symbol_to_cdecl"' < "$nlist"S >> "$output_objdir/$my_dlsyms"'
+	  else
+	    echo '/* NONE */' >> "$output_objdir/$my_dlsyms"
+	  fi
+
+	  echo >> "$output_objdir/$my_dlsyms" "\
+
+/* The mapping between symbol names and symbols.  */
+typedef struct {
+  const char *name;
+  void *address;
+} lt_dlsymlist;
+extern LT_DLSYM_CONST lt_dlsymlist
+lt_${my_prefix}_LTX_preloaded_symbols[];
+LT_DLSYM_CONST lt_dlsymlist
+lt_${my_prefix}_LTX_preloaded_symbols[] =
+{\
+  { \"$my_originator\", (void *) 0 },"
+
+	  case $need_lib_prefix in
+	  no)
+	    eval "$global_symbol_to_c_name_address" < "$nlist" >> "$output_objdir/$my_dlsyms"
+	    ;;
+	  *)
+	    eval "$global_symbol_to_c_name_address_lib_prefix" < "$nlist" >> "$output_objdir/$my_dlsyms"
+	    ;;
+	  esac
+	  echo >> "$output_objdir/$my_dlsyms" "\
+  {0, (void *) 0}
+};
+
+/* This works around a problem in FreeBSD linker */
+#ifdef FREEBSD_WORKAROUND
+static const void *lt_preloaded_setup() {
+  return lt_${my_prefix}_LTX_preloaded_symbols;
+}
+#endif
+
+#ifdef __cplusplus
+}
+#endif\
+"
+	} # !$opt_dry_run
+
+	pic_flag_for_symtable=
+	case "$compile_command " in
+	*" -static "*) ;;
+	*)
+	  case $host in
+	  # compiling the symbol table file with pic_flag works around
+	  # a FreeBSD bug that causes programs to crash when -lm is
+	  # linked before any other PIC object.  But we must not use
+	  # pic_flag when linking with -static.  The problem exists in
+	  # FreeBSD 2.2.6 and is fixed in FreeBSD 3.1.
+	  *-*-freebsd2.*|*-*-freebsd3.0*|*-*-freebsdelf3.0*)
+	    pic_flag_for_symtable=" $pic_flag -DFREEBSD_WORKAROUND" ;;
+	  *-*-hpux*)
+	    pic_flag_for_symtable=" $pic_flag"  ;;
+	  *)
+	    if test "X$my_pic_p" != Xno; then
+	      pic_flag_for_symtable=" $pic_flag"
+	    fi
+	    ;;
+	  esac
+	  ;;
+	esac
+	symtab_cflags=
+	for arg in $LTCFLAGS; do
+	  case $arg in
+	  -pie | -fpie | -fPIE) ;;
+	  *) func_append symtab_cflags " $arg" ;;
+	  esac
+	done
+
+	# Now compile the dynamic symbol file.
+	func_show_eval '(cd $output_objdir && $LTCC$symtab_cflags -c$no_builtin_flag$pic_flag_for_symtable "$my_dlsyms")' 'exit $?'
+
+	# Clean up the generated files.
+	func_show_eval '$RM "$output_objdir/$my_dlsyms" "$nlist" "${nlist}S" "${nlist}T"'
+
+	# Transform the symbol file into the correct name.
+	symfileobj="$output_objdir/${my_outputname}S.$objext"
+	case $host in
+	*cygwin* | *mingw* | *cegcc* )
+	  if test -f "$output_objdir/$my_outputname.def"; then
+	    compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"`
+	    finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"`
+	  else
+	    compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"`
+	    finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"`
+	  fi
+	  ;;
+	*)
+	  compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"`
+	  finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"`
+	  ;;
+	esac
+	;;
+      *)
+	func_fatal_error "unknown suffix for \`$my_dlsyms'"
+	;;
+      esac
+    else
+      # We keep going just in case the user didn't refer to
+      # lt_preloaded_symbols.  The linker will fail if global_symbol_pipe
+      # really was required.
+
+      # Nullify the symbol file.
+      compile_command=`$ECHO "$compile_command" | $SED "s% @SYMFILE@%%"`
+      finalize_command=`$ECHO "$finalize_command" | $SED "s% @SYMFILE@%%"`
+    fi
+}
+
+# func_win32_libid arg
+# return the library type of file 'arg'
+#
+# Need a lot of goo to handle *both* DLLs and import libs
+# Has to be a shell function in order to 'eat' the argument
+# that is supplied when $file_magic_command is called.
+# Despite the name, also deal with 64 bit binaries.
+func_win32_libid ()
+{
+  $opt_debug
+  win32_libid_type="unknown"
+  win32_fileres=`file -L $1 2>/dev/null`
+  case $win32_fileres in
+  *ar\ archive\ import\ library*) # definitely import
+    win32_libid_type="x86 archive import"
+    ;;
+  *ar\ archive*) # could be an import, or static
+    # Keep the egrep pattern in sync with the one in _LT_CHECK_MAGIC_METHOD.
+    if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null |
+       $EGREP 'file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' >/dev/null; then
+      func_to_tool_file "$1" func_convert_file_msys_to_w32
+      win32_nmres=`eval $NM -f posix -A \"$func_to_tool_file_result\" |
+	$SED -n -e '
+	    1,100{
+		/ I /{
+		    s,.*,import,
+		    p
+		    q
+		}
+	    }'`
+      case $win32_nmres in
+      import*)  win32_libid_type="x86 archive import";;
+      *)        win32_libid_type="x86 archive static";;
+      esac
+    fi
+    ;;
+  *DLL*)
+    win32_libid_type="x86 DLL"
+    ;;
+  *executable*) # but shell scripts are "executable" too...
+    case $win32_fileres in
+    *MS\ Windows\ PE\ Intel*)
+      win32_libid_type="x86 DLL"
+      ;;
+    esac
+    ;;
+  esac
+  $ECHO "$win32_libid_type"
+}
+
+# func_cygming_dll_for_implib ARG
+#
+# Platform-specific function to extract the
+# name of the DLL associated with the specified
+# import library ARG.
+# Invoked by eval'ing the libtool variable
+#    $sharedlib_from_linklib_cmd
+# Result is available in the variable
+#    $sharedlib_from_linklib_result
+func_cygming_dll_for_implib ()
+{
+  $opt_debug
+  sharedlib_from_linklib_result=`$DLLTOOL --identify-strict --identify "$1"`
+}
+
+# func_cygming_dll_for_implib_fallback_core SECTION_NAME LIBNAMEs
+#
+# The is the core of a fallback implementation of a
+# platform-specific function to extract the name of the
+# DLL associated with the specified import library LIBNAME.
+#
+# SECTION_NAME is either .idata$6 or .idata$7, depending
+# on the platform and compiler that created the implib.
+#
+# Echos the name of the DLL associated with the
+# specified import library.
+func_cygming_dll_for_implib_fallback_core ()
+{
+  $opt_debug
+  match_literal=`$ECHO "$1" | $SED "$sed_make_literal_regex"`
+  $OBJDUMP -s --section "$1" "$2" 2>/dev/null |
+    $SED '/^Contents of section '"$match_literal"':/{
+      # Place marker at beginning of archive member dllname section
+      s/.*/====MARK====/
+      p
+      d
+    }
+    # These lines can sometimes be longer than 43 characters, but
+    # are always uninteresting
+    /:[	 ]*file format pe[i]\{,1\}-/d
+    /^In archive [^:]*:/d
+    # Ensure marker is printed
+    /^====MARK====/p
+    # Remove all lines with less than 43 characters
+    /^.\{43\}/!d
+    # From remaining lines, remove first 43 characters
+    s/^.\{43\}//' |
+    $SED -n '
+      # Join marker and all lines until next marker into a single line
+      /^====MARK====/ b para
+      H
+      $ b para
+      b
+      :para
+      x
+      s/\n//g
+      # Remove the marker
+      s/^====MARK====//
+      # Remove trailing dots and whitespace
+      s/[\. \t]*$//
+      # Print
+      /./p' |
+    # we now have a list, one entry per line, of the stringified
+    # contents of the appropriate section of all members of the
+    # archive which possess that section. Heuristic: eliminate
+    # all those which have a first or second character that is
+    # a '.' (that is, objdump's representation of an unprintable
+    # character.) This should work for all archives with less than
+    # 0x302f exports -- but will fail for DLLs whose name actually
+    # begins with a literal '.' or a single character followed by
+    # a '.'.
+    #
+    # Of those that remain, print the first one.
+    $SED -e '/^\./d;/^.\./d;q'
+}
+
+# func_cygming_gnu_implib_p ARG
+# This predicate returns with zero status (TRUE) if
+# ARG is a GNU/binutils-style import library. Returns
+# with nonzero status (FALSE) otherwise.
+func_cygming_gnu_implib_p ()
+{
+  $opt_debug
+  func_to_tool_file "$1" func_convert_file_msys_to_w32
+  func_cygming_gnu_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $EGREP ' (_head_[A-Za-z0-9_]+_[ad]l*|[A-Za-z0-9_]+_[ad]l*_iname)$'`
+  test -n "$func_cygming_gnu_implib_tmp"
+}
+
+# func_cygming_ms_implib_p ARG
+# This predicate returns with zero status (TRUE) if
+# ARG is an MS-style import library. Returns
+# with nonzero status (FALSE) otherwise.
+func_cygming_ms_implib_p ()
+{
+  $opt_debug
+  func_to_tool_file "$1" func_convert_file_msys_to_w32
+  func_cygming_ms_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $GREP '_NULL_IMPORT_DESCRIPTOR'`
+  test -n "$func_cygming_ms_implib_tmp"
+}
+
+# func_cygming_dll_for_implib_fallback ARG
+# Platform-specific function to extract the
+# name of the DLL associated with the specified
+# import library ARG.
+#
+# This fallback implementation is for use when $DLLTOOL
+# does not support the --identify-strict option.
+# Invoked by eval'ing the libtool variable
+#    $sharedlib_from_linklib_cmd
+# Result is available in the variable
+#    $sharedlib_from_linklib_result
+func_cygming_dll_for_implib_fallback ()
+{
+  $opt_debug
+  if func_cygming_gnu_implib_p "$1" ; then
+    # binutils import library
+    sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$7' "$1"`
+  elif func_cygming_ms_implib_p "$1" ; then
+    # ms-generated import library
+    sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$6' "$1"`
+  else
+    # unknown
+    sharedlib_from_linklib_result=""
+  fi
+}
+
+
+# func_extract_an_archive dir oldlib
+func_extract_an_archive ()
+{
+    $opt_debug
+    f_ex_an_ar_dir="$1"; shift
+    f_ex_an_ar_oldlib="$1"
+    if test "$lock_old_archive_extraction" = yes; then
+      lockfile=$f_ex_an_ar_oldlib.lock
+      until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do
+	func_echo "Waiting for $lockfile to be removed"
+	sleep 2
+      done
+    fi
+    func_show_eval "(cd \$f_ex_an_ar_dir && $AR x \"\$f_ex_an_ar_oldlib\")" \
+		   'stat=$?; rm -f "$lockfile"; exit $stat'
+    if test "$lock_old_archive_extraction" = yes; then
+      $opt_dry_run || rm -f "$lockfile"
+    fi
+    if ($AR t "$f_ex_an_ar_oldlib" | sort | sort -uc >/dev/null 2>&1); then
+     :
+    else
+      func_fatal_error "object name conflicts in archive: $f_ex_an_ar_dir/$f_ex_an_ar_oldlib"
+    fi
+}
+
+
+# func_extract_archives gentop oldlib ...
+func_extract_archives ()
+{
+    $opt_debug
+    my_gentop="$1"; shift
+    my_oldlibs=${1+"$@"}
+    my_oldobjs=""
+    my_xlib=""
+    my_xabs=""
+    my_xdir=""
+
+    for my_xlib in $my_oldlibs; do
+      # Extract the objects.
+      case $my_xlib in
+	[\\/]* | [A-Za-z]:[\\/]*) my_xabs="$my_xlib" ;;
+	*) my_xabs=`pwd`"/$my_xlib" ;;
+      esac
+      func_basename "$my_xlib"
+      my_xlib="$func_basename_result"
+      my_xlib_u=$my_xlib
+      while :; do
+        case " $extracted_archives " in
+	*" $my_xlib_u "*)
+	  func_arith $extracted_serial + 1
+	  extracted_serial=$func_arith_result
+	  my_xlib_u=lt$extracted_serial-$my_xlib ;;
+	*) break ;;
+	esac
+      done
+      extracted_archives="$extracted_archives $my_xlib_u"
+      my_xdir="$my_gentop/$my_xlib_u"
+
+      func_mkdir_p "$my_xdir"
+
+      case $host in
+      *-darwin*)
+	func_verbose "Extracting $my_xabs"
+	# Do not bother doing anything if just a dry run
+	$opt_dry_run || {
+	  darwin_orig_dir=`pwd`
+	  cd $my_xdir || exit $?
+	  darwin_archive=$my_xabs
+	  darwin_curdir=`pwd`
+	  darwin_base_archive=`basename "$darwin_archive"`
+	  darwin_arches=`$LIPO -info "$darwin_archive" 2>/dev/null | $GREP Architectures 2>/dev/null || true`
+	  if test -n "$darwin_arches"; then
+	    darwin_arches=`$ECHO "$darwin_arches" | $SED -e 's/.*are://'`
+	    darwin_arch=
+	    func_verbose "$darwin_base_archive has multiple architectures $darwin_arches"
+	    for darwin_arch in  $darwin_arches ; do
+	      func_mkdir_p "unfat-$$/${darwin_base_archive}-${darwin_arch}"
+	      $LIPO -thin $darwin_arch -output "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" "${darwin_archive}"
+	      cd "unfat-$$/${darwin_base_archive}-${darwin_arch}"
+	      func_extract_an_archive "`pwd`" "${darwin_base_archive}"
+	      cd "$darwin_curdir"
+	      $RM "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}"
+	    done # $darwin_arches
+            ## Okay now we've a bunch of thin objects, gotta fatten them up :)
+	    darwin_filelist=`find unfat-$$ -type f -name \*.o -print -o -name \*.lo -print | $SED -e "$basename" | sort -u`
+	    darwin_file=
+	    darwin_files=
+	    for darwin_file in $darwin_filelist; do
+	      darwin_files=`find unfat-$$ -name $darwin_file -print | sort | $NL2SP`
+	      $LIPO -create -output "$darwin_file" $darwin_files
+	    done # $darwin_filelist
+	    $RM -rf unfat-$$
+	    cd "$darwin_orig_dir"
+	  else
+	    cd $darwin_orig_dir
+	    func_extract_an_archive "$my_xdir" "$my_xabs"
+	  fi # $darwin_arches
+	} # !$opt_dry_run
+	;;
+      *)
+        func_extract_an_archive "$my_xdir" "$my_xabs"
+	;;
+      esac
+      my_oldobjs="$my_oldobjs "`find $my_xdir -name \*.$objext -print -o -name \*.lo -print | sort | $NL2SP`
+    done
+
+    func_extract_archives_result="$my_oldobjs"
+}
+
+
+# func_emit_wrapper [arg=no]
+#
+# Emit a libtool wrapper script on stdout.
+# Don't directly open a file because we may want to
+# incorporate the script contents within a cygwin/mingw
+# wrapper executable.  Must ONLY be called from within
+# func_mode_link because it depends on a number of variables
+# set therein.
+#
+# ARG is the value that the WRAPPER_SCRIPT_BELONGS_IN_OBJDIR
+# variable will take.  If 'yes', then the emitted script
+# will assume that the directory in which it is stored is
+# the $objdir directory.  This is a cygwin/mingw-specific
+# behavior.
+func_emit_wrapper ()
+{
+	func_emit_wrapper_arg1=${1-no}
+
+	$ECHO "\
+#! $SHELL
+
+# $output - temporary wrapper script for $objdir/$outputname
+# Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION
+#
+# The $output program cannot be directly executed until all the libtool
+# libraries that it depends on are installed.
+#
+# This wrapper script should never be moved out of the build directory.
+# If it is, it will not operate correctly.
+
+# Sed substitution that helps us do robust quoting.  It backslashifies
+# metacharacters that are still active within double-quoted strings.
+sed_quote_subst='$sed_quote_subst'
+
+# 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+\"\$@\"}'='\"\$@\"'
+  setopt NO_GLOB_SUBST
+else
+  case \`(set -o) 2>/dev/null\` in *posix*) set -o posix;; esac
+fi
+BIN_SH=xpg4; export BIN_SH # for Tru64
+DUALCASE=1; export DUALCASE # for MKS sh
+
+# The HP-UX ksh and POSIX shell print the target directory to stdout
+# if CDPATH is set.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+relink_command=\"$relink_command\"
+
+# This environment variable determines our operation mode.
+if test \"\$libtool_install_magic\" = \"$magic\"; then
+  # install mode needs the following variables:
+  generated_by_libtool_version='$macro_version'
+  notinst_deplibs='$notinst_deplibs'
+else
+  # When we are sourced in execute mode, \$file and \$ECHO are already set.
+  if test \"\$libtool_execute_magic\" != \"$magic\"; then
+    file=\"\$0\""
+
+    qECHO=`$ECHO "$ECHO" | $SED "$sed_quote_subst"`
+    $ECHO "\
+
+# A function that is used when there is no print builtin or printf.
+func_fallback_echo ()
+{
+  eval 'cat <<_LTECHO_EOF
+\$1
+_LTECHO_EOF'
+}
+    ECHO=\"$qECHO\"
+  fi
+
+# Very basic option parsing. These options are (a) specific to
+# the libtool wrapper, (b) are identical between the wrapper
+# /script/ and the wrapper /executable/ which is used only on
+# windows platforms, and (c) all begin with the string "--lt-"
+# (application programs are unlikely to have options which match
+# this pattern).
+#
+# There are only two supported options: --lt-debug and
+# --lt-dump-script. There is, deliberately, no --lt-help.
+#
+# The first argument to this parsing function should be the
+# script's $0 value, followed by "$@".
+lt_option_debug=
+func_parse_lt_options ()
+{
+  lt_script_arg0=\$0
+  shift
+  for lt_opt
+  do
+    case \"\$lt_opt\" in
+    --lt-debug) lt_option_debug=1 ;;
+    --lt-dump-script)
+        lt_dump_D=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%/[^/]*$%%'\`
+        test \"X\$lt_dump_D\" = \"X\$lt_script_arg0\" && lt_dump_D=.
+        lt_dump_F=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%^.*/%%'\`
+        cat \"\$lt_dump_D/\$lt_dump_F\"
+        exit 0
+      ;;
+    --lt-*)
+        \$ECHO \"Unrecognized --lt- option: '\$lt_opt'\" 1>&2
+        exit 1
+      ;;
+    esac
+  done
+
+  # Print the debug banner immediately:
+  if test -n \"\$lt_option_debug\"; then
+    echo \"${outputname}:${output}:\${LINENO}: libtool wrapper (GNU $PACKAGE$TIMESTAMP) $VERSION\" 1>&2
+  fi
+}
+
+# Used when --lt-debug. Prints its arguments to stdout
+# (redirection is the responsibility of the caller)
+func_lt_dump_args ()
+{
+  lt_dump_args_N=1;
+  for lt_arg
+  do
+    \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[\$lt_dump_args_N]: \$lt_arg\"
+    lt_dump_args_N=\`expr \$lt_dump_args_N + 1\`
+  done
+}
+
+# Core function for launching the target application
+func_exec_program_core ()
+{
+"
+  case $host in
+  # Backslashes separate directories on plain windows
+  *-*-mingw | *-*-os2* | *-cegcc*)
+    $ECHO "\
+      if test -n \"\$lt_option_debug\"; then
+        \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[0]: \$progdir\\\\\$program\" 1>&2
+        func_lt_dump_args \${1+\"\$@\"} 1>&2
+      fi
+      exec \"\$progdir\\\\\$program\" \${1+\"\$@\"}
+"
+    ;;
+
+  *)
+    $ECHO "\
+      if test -n \"\$lt_option_debug\"; then
+        \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[0]: \$progdir/\$program\" 1>&2
+        func_lt_dump_args \${1+\"\$@\"} 1>&2
+      fi
+      exec \"\$progdir/\$program\" \${1+\"\$@\"}
+"
+    ;;
+  esac
+  $ECHO "\
+      \$ECHO \"\$0: cannot exec \$program \$*\" 1>&2
+      exit 1
+}
+
+# A function to encapsulate launching the target application
+# Strips options in the --lt-* namespace from \$@ and
+# launches target application with the remaining arguments.
+func_exec_program ()
+{
+  case \" \$* \" in
+  *\\ --lt-*)
+    for lt_wr_arg
+    do
+      case \$lt_wr_arg in
+      --lt-*) ;;
+      *) set x \"\$@\" \"\$lt_wr_arg\"; shift;;
+      esac
+      shift
+    done ;;
+  esac
+  func_exec_program_core \${1+\"\$@\"}
+}
+
+  # Parse options
+  func_parse_lt_options \"\$0\" \${1+\"\$@\"}
+
+  # Find the directory that this script lives in.
+  thisdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*$%%'\`
+  test \"x\$thisdir\" = \"x\$file\" && thisdir=.
+
+  # Follow symbolic links until we get to the real thisdir.
+  file=\`ls -ld \"\$file\" | $SED -n 's/.*-> //p'\`
+  while test -n \"\$file\"; do
+    destdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*\$%%'\`
+
+    # If there was a directory component, then change thisdir.
+    if test \"x\$destdir\" != \"x\$file\"; then
+      case \"\$destdir\" in
+      [\\\\/]* | [A-Za-z]:[\\\\/]*) thisdir=\"\$destdir\" ;;
+      *) thisdir=\"\$thisdir/\$destdir\" ;;
+      esac
+    fi
+
+    file=\`\$ECHO \"\$file\" | $SED 's%^.*/%%'\`
+    file=\`ls -ld \"\$thisdir/\$file\" | $SED -n 's/.*-> //p'\`
+  done
+
+  # Usually 'no', except on cygwin/mingw when embedded into
+  # the cwrapper.
+  WRAPPER_SCRIPT_BELONGS_IN_OBJDIR=$func_emit_wrapper_arg1
+  if test \"\$WRAPPER_SCRIPT_BELONGS_IN_OBJDIR\" = \"yes\"; then
+    # special case for '.'
+    if test \"\$thisdir\" = \".\"; then
+      thisdir=\`pwd\`
+    fi
+    # remove .libs from thisdir
+    case \"\$thisdir\" in
+    *[\\\\/]$objdir ) thisdir=\`\$ECHO \"\$thisdir\" | $SED 's%[\\\\/][^\\\\/]*$%%'\` ;;
+    $objdir )   thisdir=. ;;
+    esac
+  fi
+
+  # Try to get the absolute directory name.
+  absdir=\`cd \"\$thisdir\" && pwd\`
+  test -n \"\$absdir\" && thisdir=\"\$absdir\"
+"
+
+	if test "$fast_install" = yes; then
+	  $ECHO "\
+  program=lt-'$outputname'$exeext
+  progdir=\"\$thisdir/$objdir\"
+
+  if test ! -f \"\$progdir/\$program\" ||
+     { file=\`ls -1dt \"\$progdir/\$program\" \"\$progdir/../\$program\" 2>/dev/null | ${SED} 1q\`; \\
+       test \"X\$file\" != \"X\$progdir/\$program\"; }; then
+
+    file=\"\$\$-\$program\"
+
+    if test ! -d \"\$progdir\"; then
+      $MKDIR \"\$progdir\"
+    else
+      $RM \"\$progdir/\$file\"
+    fi"
+
+	  $ECHO "\
+
+    # relink executable if necessary
+    if test -n \"\$relink_command\"; then
+      if relink_command_output=\`eval \$relink_command 2>&1\`; then :
+      else
+	$ECHO \"\$relink_command_output\" >&2
+	$RM \"\$progdir/\$file\"
+	exit 1
+      fi
+    fi
+
+    $MV \"\$progdir/\$file\" \"\$progdir/\$program\" 2>/dev/null ||
+    { $RM \"\$progdir/\$program\";
+      $MV \"\$progdir/\$file\" \"\$progdir/\$program\"; }
+    $RM \"\$progdir/\$file\"
+  fi"
+	else
+	  $ECHO "\
+  program='$outputname'
+  progdir=\"\$thisdir/$objdir\"
+"
+	fi
+
+	$ECHO "\
+
+  if test -f \"\$progdir/\$program\"; then"
+
+	# fixup the dll searchpath if we need to.
+	#
+	# Fix the DLL searchpath if we need to.  Do this before prepending
+	# to shlibpath, because on Windows, both are PATH and uninstalled
+	# libraries must come first.
+	if test -n "$dllsearchpath"; then
+	  $ECHO "\
+    # Add the dll search path components to the executable PATH
+    PATH=$dllsearchpath:\$PATH
+"
+	fi
+
+	# Export our shlibpath_var if we have one.
+	if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then
+	  $ECHO "\
+    # Add our own library path to $shlibpath_var
+    $shlibpath_var=\"$temp_rpath\$$shlibpath_var\"
+
+    # Some systems cannot cope with colon-terminated $shlibpath_var
+    # The second colon is a workaround for a bug in BeOS R4 sed
+    $shlibpath_var=\`\$ECHO \"\$$shlibpath_var\" | $SED 's/::*\$//'\`
+
+    export $shlibpath_var
+"
+	fi
+
+	$ECHO "\
+    if test \"\$libtool_execute_magic\" != \"$magic\"; then
+      # Run the actual program with our arguments.
+      func_exec_program \${1+\"\$@\"}
+    fi
+  else
+    # The program doesn't exist.
+    \$ECHO \"\$0: error: \\\`\$progdir/\$program' does not exist\" 1>&2
+    \$ECHO \"This script is just a wrapper for \$program.\" 1>&2
+    \$ECHO \"See the $PACKAGE documentation for more information.\" 1>&2
+    exit 1
+  fi
+fi\
+"
+}
+
+
+# func_emit_cwrapperexe_src
+# emit the source code for a wrapper executable on stdout
+# Must ONLY be called from within func_mode_link because
+# it depends on a number of variable set therein.
+func_emit_cwrapperexe_src ()
+{
+	cat <<EOF
+
+/* $cwrappersource - temporary wrapper executable for $objdir/$outputname
+   Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION
+
+   The $output program cannot be directly executed until all the libtool
+   libraries that it depends on are installed.
+
+   This wrapper executable should never be moved out of the build directory.
+   If it is, it will not operate correctly.
+*/
+EOF
+	    cat <<"EOF"
+#ifdef _MSC_VER
+# define _CRT_SECURE_NO_DEPRECATE 1
+#endif
+#include <stdio.h>
+#include <stdlib.h>
+#ifdef _MSC_VER
+# include <direct.h>
+# include <process.h>
+# include <io.h>
+#else
+# include <unistd.h>
+# include <stdint.h>
+# ifdef __CYGWIN__
+#  include <io.h>
+# endif
+#endif
+#include <malloc.h>
+#include <stdarg.h>
+#include <assert.h>
+#include <string.h>
+#include <ctype.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <sys/stat.h>
+
+/* declarations of non-ANSI functions */
+#if defined(__MINGW32__)
+# ifdef __STRICT_ANSI__
+int _putenv (const char *);
+# endif
+#elif defined(__CYGWIN__)
+# ifdef __STRICT_ANSI__
+char *realpath (const char *, char *);
+int putenv (char *);
+int setenv (const char *, const char *, int);
+# endif
+/* #elif defined (other platforms) ... */
+#endif
+
+/* portability defines, excluding path handling macros */
+#if defined(_MSC_VER)
+# define setmode _setmode
+# define stat    _stat
+# define chmod   _chmod
+# define getcwd  _getcwd
+# define putenv  _putenv
+# define S_IXUSR _S_IEXEC
+# ifndef _INTPTR_T_DEFINED
+#  define _INTPTR_T_DEFINED
+#  define intptr_t int
+# endif
+#elif defined(__MINGW32__)
+# define setmode _setmode
+# define stat    _stat
+# define chmod   _chmod
+# define getcwd  _getcwd
+# define putenv  _putenv
+#elif defined(__CYGWIN__)
+# define HAVE_SETENV
+# define FOPEN_WB "wb"
+/* #elif defined (other platforms) ... */
+#endif
+
+#if defined(PATH_MAX)
+# define LT_PATHMAX PATH_MAX
+#elif defined(MAXPATHLEN)
+# define LT_PATHMAX MAXPATHLEN
+#else
+# define LT_PATHMAX 1024
+#endif
+
+#ifndef S_IXOTH
+# define S_IXOTH 0
+#endif
+#ifndef S_IXGRP
+# define S_IXGRP 0
+#endif
+
+/* path handling portability macros */
+#ifndef DIR_SEPARATOR
+# define DIR_SEPARATOR '/'
+# define PATH_SEPARATOR ':'
+#endif
+
+#if defined (_WIN32) || defined (__MSDOS__) || defined (__DJGPP__) || \
+  defined (__OS2__)
+# define HAVE_DOS_BASED_FILE_SYSTEM
+# define FOPEN_WB "wb"
+# ifndef DIR_SEPARATOR_2
+#  define DIR_SEPARATOR_2 '\\'
+# endif
+# ifndef PATH_SEPARATOR_2
+#  define PATH_SEPARATOR_2 ';'
+# endif
+#endif
+
+#ifndef DIR_SEPARATOR_2
+# define IS_DIR_SEPARATOR(ch) ((ch) == DIR_SEPARATOR)
+#else /* DIR_SEPARATOR_2 */
+# define IS_DIR_SEPARATOR(ch) \
+	(((ch) == DIR_SEPARATOR) || ((ch) == DIR_SEPARATOR_2))
+#endif /* DIR_SEPARATOR_2 */
+
+#ifndef PATH_SEPARATOR_2
+# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR)
+#else /* PATH_SEPARATOR_2 */
+# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR_2)
+#endif /* PATH_SEPARATOR_2 */
+
+#ifndef FOPEN_WB
+# define FOPEN_WB "w"
+#endif
+#ifndef _O_BINARY
+# define _O_BINARY 0
+#endif
+
+#define XMALLOC(type, num)      ((type *) xmalloc ((num) * sizeof(type)))
+#define XFREE(stale) do { \
+  if (stale) { free ((void *) stale); stale = 0; } \
+} while (0)
+
+#if defined(LT_DEBUGWRAPPER)
+static int lt_debug = 1;
+#else
+static int lt_debug = 0;
+#endif
+
+const char *program_name = "libtool-wrapper"; /* in case xstrdup fails */
+
+void *xmalloc (size_t num);
+char *xstrdup (const char *string);
+const char *base_name (const char *name);
+char *find_executable (const char *wrapper);
+char *chase_symlinks (const char *pathspec);
+int make_executable (const char *path);
+int check_executable (const char *path);
+char *strendzap (char *str, const char *pat);
+void lt_debugprintf (const char *file, int line, const char *fmt, ...);
+void lt_fatal (const char *file, int line, const char *message, ...);
+static const char *nonnull (const char *s);
+static const char *nonempty (const char *s);
+void lt_setenv (const char *name, const char *value);
+char *lt_extend_str (const char *orig_value, const char *add, int to_end);
+void lt_update_exe_path (const char *name, const char *value);
+void lt_update_lib_path (const char *name, const char *value);
+char **prepare_spawn (char **argv);
+void lt_dump_script (FILE *f);
+EOF
+
+	    cat <<EOF
+volatile const char * MAGIC_EXE = "$magic_exe";
+const char * LIB_PATH_VARNAME = "$shlibpath_var";
+EOF
+
+	    if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then
+              func_to_host_path "$temp_rpath"
+	      cat <<EOF
+const char * LIB_PATH_VALUE   = "$func_to_host_path_result";
+EOF
+	    else
+	      cat <<"EOF"
+const char * LIB_PATH_VALUE   = "";
+EOF
+	    fi
+
+	    if test -n "$dllsearchpath"; then
+              func_to_host_path "$dllsearchpath:"
+	      cat <<EOF
+const char * EXE_PATH_VARNAME = "PATH";
+const char * EXE_PATH_VALUE   = "$func_to_host_path_result";
+EOF
+	    else
+	      cat <<"EOF"
+const char * EXE_PATH_VARNAME = "";
+const char * EXE_PATH_VALUE   = "";
+EOF
+	    fi
+
+	    if test "$fast_install" = yes; then
+	      cat <<EOF
+const char * TARGET_PROGRAM_NAME = "lt-$outputname"; /* hopefully, no .exe */
+EOF
+	    else
+	      cat <<EOF
+const char * TARGET_PROGRAM_NAME = "$outputname"; /* hopefully, no .exe */
+EOF
+	    fi
+
+
+	    cat <<"EOF"
+
+#define LTWRAPPER_OPTION_PREFIX         "--lt-"
+
+static const char *ltwrapper_option_prefix = LTWRAPPER_OPTION_PREFIX;
+static const char *dumpscript_opt       = LTWRAPPER_OPTION_PREFIX "dump-script";
+static const char *debug_opt            = LTWRAPPER_OPTION_PREFIX "debug";
+
+int
+main (int argc, char *argv[])
+{
+  char **newargz;
+  int  newargc;
+  char *tmp_pathspec;
+  char *actual_cwrapper_path;
+  char *actual_cwrapper_name;
+  char *target_name;
+  char *lt_argv_zero;
+  intptr_t rval = 127;
+
+  int i;
+
+  program_name = (char *) xstrdup (base_name (argv[0]));
+  newargz = XMALLOC (char *, argc + 1);
+
+  /* very simple arg parsing; don't want to rely on getopt
+   * also, copy all non cwrapper options to newargz, except
+   * argz[0], which is handled differently
+   */
+  newargc=0;
+  for (i = 1; i < argc; i++)
+    {
+      if (strcmp (argv[i], dumpscript_opt) == 0)
+	{
+EOF
+	    case "$host" in
+	      *mingw* | *cygwin* )
+		# make stdout use "unix" line endings
+		echo "          setmode(1,_O_BINARY);"
+		;;
+	      esac
+
+	    cat <<"EOF"
+	  lt_dump_script (stdout);
+	  return 0;
+	}
+      if (strcmp (argv[i], debug_opt) == 0)
+	{
+          lt_debug = 1;
+          continue;
+	}
+      if (strcmp (argv[i], ltwrapper_option_prefix) == 0)
+        {
+          /* however, if there is an option in the LTWRAPPER_OPTION_PREFIX
+             namespace, but it is not one of the ones we know about and
+             have already dealt with, above (inluding dump-script), then
+             report an error. Otherwise, targets might begin to believe
+             they are allowed to use options in the LTWRAPPER_OPTION_PREFIX
+             namespace. The first time any user complains about this, we'll
+             need to make LTWRAPPER_OPTION_PREFIX a configure-time option
+             or a configure.ac-settable value.
+           */
+          lt_fatal (__FILE__, __LINE__,
+		    "unrecognized %s option: '%s'",
+                    ltwrapper_option_prefix, argv[i]);
+        }
+      /* otherwise ... */
+      newargz[++newargc] = xstrdup (argv[i]);
+    }
+  newargz[++newargc] = NULL;
+
+EOF
+	    cat <<EOF
+  /* The GNU banner must be the first non-error debug message */
+  lt_debugprintf (__FILE__, __LINE__, "libtool wrapper (GNU $PACKAGE$TIMESTAMP) $VERSION\n");
+EOF
+	    cat <<"EOF"
+  lt_debugprintf (__FILE__, __LINE__, "(main) argv[0]: %s\n", argv[0]);
+  lt_debugprintf (__FILE__, __LINE__, "(main) program_name: %s\n", program_name);
+
+  tmp_pathspec = find_executable (argv[0]);
+  if (tmp_pathspec == NULL)
+    lt_fatal (__FILE__, __LINE__, "couldn't find %s", argv[0]);
+  lt_debugprintf (__FILE__, __LINE__,
+                  "(main) found exe (before symlink chase) at: %s\n",
+		  tmp_pathspec);
+
+  actual_cwrapper_path = chase_symlinks (tmp_pathspec);
+  lt_debugprintf (__FILE__, __LINE__,
+                  "(main) found exe (after symlink chase) at: %s\n",
+		  actual_cwrapper_path);
+  XFREE (tmp_pathspec);
+
+  actual_cwrapper_name = xstrdup (base_name (actual_cwrapper_path));
+  strendzap (actual_cwrapper_path, actual_cwrapper_name);
+
+  /* wrapper name transforms */
+  strendzap (actual_cwrapper_name, ".exe");
+  tmp_pathspec = lt_extend_str (actual_cwrapper_name, ".exe", 1);
+  XFREE (actual_cwrapper_name);
+  actual_cwrapper_name = tmp_pathspec;
+  tmp_pathspec = 0;
+
+  /* target_name transforms -- use actual target program name; might have lt- prefix */
+  target_name = xstrdup (base_name (TARGET_PROGRAM_NAME));
+  strendzap (target_name, ".exe");
+  tmp_pathspec = lt_extend_str (target_name, ".exe", 1);
+  XFREE (target_name);
+  target_name = tmp_pathspec;
+  tmp_pathspec = 0;
+
+  lt_debugprintf (__FILE__, __LINE__,
+		  "(main) libtool target name: %s\n",
+		  target_name);
+EOF
+
+	    cat <<EOF
+  newargz[0] =
+    XMALLOC (char, (strlen (actual_cwrapper_path) +
+		    strlen ("$objdir") + 1 + strlen (actual_cwrapper_name) + 1));
+  strcpy (newargz[0], actual_cwrapper_path);
+  strcat (newargz[0], "$objdir");
+  strcat (newargz[0], "/");
+EOF
+
+	    cat <<"EOF"
+  /* stop here, and copy so we don't have to do this twice */
+  tmp_pathspec = xstrdup (newargz[0]);
+
+  /* do NOT want the lt- prefix here, so use actual_cwrapper_name */
+  strcat (newargz[0], actual_cwrapper_name);
+
+  /* DO want the lt- prefix here if it exists, so use target_name */
+  lt_argv_zero = lt_extend_str (tmp_pathspec, target_name, 1);
+  XFREE (tmp_pathspec);
+  tmp_pathspec = NULL;
+EOF
+
+	    case $host_os in
+	      mingw*)
+	    cat <<"EOF"
+  {
+    char* p;
+    while ((p = strchr (newargz[0], '\\')) != NULL)
+      {
+	*p = '/';
+      }
+    while ((p = strchr (lt_argv_zero, '\\')) != NULL)
+      {
+	*p = '/';
+      }
+  }
+EOF
+	    ;;
+	    esac
+
+	    cat <<"EOF"
+  XFREE (target_name);
+  XFREE (actual_cwrapper_path);
+  XFREE (actual_cwrapper_name);
+
+  lt_setenv ("BIN_SH", "xpg4"); /* for Tru64 */
+  lt_setenv ("DUALCASE", "1");  /* for MSK sh */
+  /* Update the DLL searchpath.  EXE_PATH_VALUE ($dllsearchpath) must
+     be prepended before (that is, appear after) LIB_PATH_VALUE ($temp_rpath)
+     because on Windows, both *_VARNAMEs are PATH but uninstalled
+     libraries must come first. */
+  lt_update_exe_path (EXE_PATH_VARNAME, EXE_PATH_VALUE);
+  lt_update_lib_path (LIB_PATH_VARNAME, LIB_PATH_VALUE);
+
+  lt_debugprintf (__FILE__, __LINE__, "(main) lt_argv_zero: %s\n",
+		  nonnull (lt_argv_zero));
+  for (i = 0; i < newargc; i++)
+    {
+      lt_debugprintf (__FILE__, __LINE__, "(main) newargz[%d]: %s\n",
+		      i, nonnull (newargz[i]));
+    }
+
+EOF
+
+	    case $host_os in
+	      mingw*)
+		cat <<"EOF"
+  /* execv doesn't actually work on mingw as expected on unix */
+  newargz = prepare_spawn (newargz);
+  rval = _spawnv (_P_WAIT, lt_argv_zero, (const char * const *) newargz);
+  if (rval == -1)
+    {
+      /* failed to start process */
+      lt_debugprintf (__FILE__, __LINE__,
+		      "(main) failed to launch target \"%s\": %s\n",
+		      lt_argv_zero, nonnull (strerror (errno)));
+      return 127;
+    }
+  return rval;
+EOF
+		;;
+	      *)
+		cat <<"EOF"
+  execv (lt_argv_zero, newargz);
+  return rval; /* =127, but avoids unused variable warning */
+EOF
+		;;
+	    esac
+
+	    cat <<"EOF"
+}
+
+void *
+xmalloc (size_t num)
+{
+  void *p = (void *) malloc (num);
+  if (!p)
+    lt_fatal (__FILE__, __LINE__, "memory exhausted");
+
+  return p;
+}
+
+char *
+xstrdup (const char *string)
+{
+  return string ? strcpy ((char *) xmalloc (strlen (string) + 1),
+			  string) : NULL;
+}
+
+const char *
+base_name (const char *name)
+{
+  const char *base;
+
+#if defined (HAVE_DOS_BASED_FILE_SYSTEM)
+  /* Skip over the disk name in MSDOS pathnames. */
+  if (isalpha ((unsigned char) name[0]) && name[1] == ':')
+    name += 2;
+#endif
+
+  for (base = name; *name; name++)
+    if (IS_DIR_SEPARATOR (*name))
+      base = name + 1;
+  return base;
+}
+
+int
+check_executable (const char *path)
+{
+  struct stat st;
+
+  lt_debugprintf (__FILE__, __LINE__, "(check_executable): %s\n",
+                  nonempty (path));
+  if ((!path) || (!*path))
+    return 0;
+
+  if ((stat (path, &st) >= 0)
+      && (st.st_mode & (S_IXUSR | S_IXGRP | S_IXOTH)))
+    return 1;
+  else
+    return 0;
+}
+
+int
+make_executable (const char *path)
+{
+  int rval = 0;
+  struct stat st;
+
+  lt_debugprintf (__FILE__, __LINE__, "(make_executable): %s\n",
+                  nonempty (path));
+  if ((!path) || (!*path))
+    return 0;
+
+  if (stat (path, &st) >= 0)
+    {
+      rval = chmod (path, st.st_mode | S_IXOTH | S_IXGRP | S_IXUSR);
+    }
+  return rval;
+}
+
+/* Searches for the full path of the wrapper.  Returns
+   newly allocated full path name if found, NULL otherwise
+   Does not chase symlinks, even on platforms that support them.
+*/
+char *
+find_executable (const char *wrapper)
+{
+  int has_slash = 0;
+  const char *p;
+  const char *p_next;
+  /* static buffer for getcwd */
+  char tmp[LT_PATHMAX + 1];
+  int tmp_len;
+  char *concat_name;
+
+  lt_debugprintf (__FILE__, __LINE__, "(find_executable): %s\n",
+                  nonempty (wrapper));
+
+  if ((wrapper == NULL) || (*wrapper == '\0'))
+    return NULL;
+
+  /* Absolute path? */
+#if defined (HAVE_DOS_BASED_FILE_SYSTEM)
+  if (isalpha ((unsigned char) wrapper[0]) && wrapper[1] == ':')
+    {
+      concat_name = xstrdup (wrapper);
+      if (check_executable (concat_name))
+	return concat_name;
+      XFREE (concat_name);
+    }
+  else
+    {
+#endif
+      if (IS_DIR_SEPARATOR (wrapper[0]))
+	{
+	  concat_name = xstrdup (wrapper);
+	  if (check_executable (concat_name))
+	    return concat_name;
+	  XFREE (concat_name);
+	}
+#if defined (HAVE_DOS_BASED_FILE_SYSTEM)
+    }
+#endif
+
+  for (p = wrapper; *p; p++)
+    if (*p == '/')
+      {
+	has_slash = 1;
+	break;
+      }
+  if (!has_slash)
+    {
+      /* no slashes; search PATH */
+      const char *path = getenv ("PATH");
+      if (path != NULL)
+	{
+	  for (p = path; *p; p = p_next)
+	    {
+	      const char *q;
+	      size_t p_len;
+	      for (q = p; *q; q++)
+		if (IS_PATH_SEPARATOR (*q))
+		  break;
+	      p_len = q - p;
+	      p_next = (*q == '\0' ? q : q + 1);
+	      if (p_len == 0)
+		{
+		  /* empty path: current directory */
+		  if (getcwd (tmp, LT_PATHMAX) == NULL)
+		    lt_fatal (__FILE__, __LINE__, "getcwd failed: %s",
+                              nonnull (strerror (errno)));
+		  tmp_len = strlen (tmp);
+		  concat_name =
+		    XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1);
+		  memcpy (concat_name, tmp, tmp_len);
+		  concat_name[tmp_len] = '/';
+		  strcpy (concat_name + tmp_len + 1, wrapper);
+		}
+	      else
+		{
+		  concat_name =
+		    XMALLOC (char, p_len + 1 + strlen (wrapper) + 1);
+		  memcpy (concat_name, p, p_len);
+		  concat_name[p_len] = '/';
+		  strcpy (concat_name + p_len + 1, wrapper);
+		}
+	      if (check_executable (concat_name))
+		return concat_name;
+	      XFREE (concat_name);
+	    }
+	}
+      /* not found in PATH; assume curdir */
+    }
+  /* Relative path | not found in path: prepend cwd */
+  if (getcwd (tmp, LT_PATHMAX) == NULL)
+    lt_fatal (__FILE__, __LINE__, "getcwd failed: %s",
+              nonnull (strerror (errno)));
+  tmp_len = strlen (tmp);
+  concat_name = XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1);
+  memcpy (concat_name, tmp, tmp_len);
+  concat_name[tmp_len] = '/';
+  strcpy (concat_name + tmp_len + 1, wrapper);
+
+  if (check_executable (concat_name))
+    return concat_name;
+  XFREE (concat_name);
+  return NULL;
+}
+
+char *
+chase_symlinks (const char *pathspec)
+{
+#ifndef S_ISLNK
+  return xstrdup (pathspec);
+#else
+  char buf[LT_PATHMAX];
+  struct stat s;
+  char *tmp_pathspec = xstrdup (pathspec);
+  char *p;
+  int has_symlinks = 0;
+  while (strlen (tmp_pathspec) && !has_symlinks)
+    {
+      lt_debugprintf (__FILE__, __LINE__,
+		      "checking path component for symlinks: %s\n",
+		      tmp_pathspec);
+      if (lstat (tmp_pathspec, &s) == 0)
+	{
+	  if (S_ISLNK (s.st_mode) != 0)
+	    {
+	      has_symlinks = 1;
+	      break;
+	    }
+
+	  /* search backwards for last DIR_SEPARATOR */
+	  p = tmp_pathspec + strlen (tmp_pathspec) - 1;
+	  while ((p > tmp_pathspec) && (!IS_DIR_SEPARATOR (*p)))
+	    p--;
+	  if ((p == tmp_pathspec) && (!IS_DIR_SEPARATOR (*p)))
+	    {
+	      /* no more DIR_SEPARATORS left */
+	      break;
+	    }
+	  *p = '\0';
+	}
+      else
+	{
+	  lt_fatal (__FILE__, __LINE__,
+		    "error accessing file \"%s\": %s",
+		    tmp_pathspec, nonnull (strerror (errno)));
+	}
+    }
+  XFREE (tmp_pathspec);
+
+  if (!has_symlinks)
+    {
+      return xstrdup (pathspec);
+    }
+
+  tmp_pathspec = realpath (pathspec, buf);
+  if (tmp_pathspec == 0)
+    {
+      lt_fatal (__FILE__, __LINE__,
+		"could not follow symlinks for %s", pathspec);
+    }
+  return xstrdup (tmp_pathspec);
+#endif
+}
+
+char *
+strendzap (char *str, const char *pat)
+{
+  size_t len, patlen;
+
+  assert (str != NULL);
+  assert (pat != NULL);
+
+  len = strlen (str);
+  patlen = strlen (pat);
+
+  if (patlen <= len)
+    {
+      str += len - patlen;
+      if (strcmp (str, pat) == 0)
+	*str = '\0';
+    }
+  return str;
+}
+
+void
+lt_debugprintf (const char *file, int line, const char *fmt, ...)
+{
+  va_list args;
+  if (lt_debug)
+    {
+      (void) fprintf (stderr, "%s:%s:%d: ", program_name, file, line);
+      va_start (args, fmt);
+      (void) vfprintf (stderr, fmt, args);
+      va_end (args);
+    }
+}
+
+static void
+lt_error_core (int exit_status, const char *file,
+	       int line, const char *mode,
+	       const char *message, va_list ap)
+{
+  fprintf (stderr, "%s:%s:%d: %s: ", program_name, file, line, mode);
+  vfprintf (stderr, message, ap);
+  fprintf (stderr, ".\n");
+
+  if (exit_status >= 0)
+    exit (exit_status);
+}
+
+void
+lt_fatal (const char *file, int line, const char *message, ...)
+{
+  va_list ap;
+  va_start (ap, message);
+  lt_error_core (EXIT_FAILURE, file, line, "FATAL", message, ap);
+  va_end (ap);
+}
+
+static const char *
+nonnull (const char *s)
+{
+  return s ? s : "(null)";
+}
+
+static const char *
+nonempty (const char *s)
+{
+  return (s && !*s) ? "(empty)" : nonnull (s);
+}
+
+void
+lt_setenv (const char *name, const char *value)
+{
+  lt_debugprintf (__FILE__, __LINE__,
+		  "(lt_setenv) setting '%s' to '%s'\n",
+                  nonnull (name), nonnull (value));
+  {
+#ifdef HAVE_SETENV
+    /* always make a copy, for consistency with !HAVE_SETENV */
+    char *str = xstrdup (value);
+    setenv (name, str, 1);
+#else
+    int len = strlen (name) + 1 + strlen (value) + 1;
+    char *str = XMALLOC (char, len);
+    sprintf (str, "%s=%s", name, value);
+    if (putenv (str) != EXIT_SUCCESS)
+      {
+        XFREE (str);
+      }
+#endif
+  }
+}
+
+char *
+lt_extend_str (const char *orig_value, const char *add, int to_end)
+{
+  char *new_value;
+  if (orig_value && *orig_value)
+    {
+      int orig_value_len = strlen (orig_value);
+      int add_len = strlen (add);
+      new_value = XMALLOC (char, add_len + orig_value_len + 1);
+      if (to_end)
+        {
+          strcpy (new_value, orig_value);
+          strcpy (new_value + orig_value_len, add);
+        }
+      else
+        {
+          strcpy (new_value, add);
+          strcpy (new_value + add_len, orig_value);
+        }
+    }
+  else
+    {
+      new_value = xstrdup (add);
+    }
+  return new_value;
+}
+
+void
+lt_update_exe_path (const char *name, const char *value)
+{
+  lt_debugprintf (__FILE__, __LINE__,
+		  "(lt_update_exe_path) modifying '%s' by prepending '%s'\n",
+                  nonnull (name), nonnull (value));
+
+  if (name && *name && value && *value)
+    {
+      char *new_value = lt_extend_str (getenv (name), value, 0);
+      /* some systems can't cope with a ':'-terminated path #' */
+      int len = strlen (new_value);
+      while (((len = strlen (new_value)) > 0) && IS_PATH_SEPARATOR (new_value[len-1]))
+        {
+          new_value[len-1] = '\0';
+        }
+      lt_setenv (name, new_value);
+      XFREE (new_value);
+    }
+}
+
+void
+lt_update_lib_path (const char *name, const char *value)
+{
+  lt_debugprintf (__FILE__, __LINE__,
+		  "(lt_update_lib_path) modifying '%s' by prepending '%s'\n",
+                  nonnull (name), nonnull (value));
+
+  if (name && *name && value && *value)
+    {
+      char *new_value = lt_extend_str (getenv (name), value, 0);
+      lt_setenv (name, new_value);
+      XFREE (new_value);
+    }
+}
+
+EOF
+	    case $host_os in
+	      mingw*)
+		cat <<"EOF"
+
+/* Prepares an argument vector before calling spawn().
+   Note that spawn() does not by itself call the command interpreter
+     (getenv ("COMSPEC") != NULL ? getenv ("COMSPEC") :
+      ({ OSVERSIONINFO v; v.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
+         GetVersionEx(&v);
+         v.dwPlatformId == VER_PLATFORM_WIN32_NT;
+      }) ? "cmd.exe" : "command.com").
+   Instead it simply concatenates the arguments, separated by ' ', and calls
+   CreateProcess().  We must quote the arguments since Win32 CreateProcess()
+   interprets characters like ' ', '\t', '\\', '"' (but not '<' and '>') in a
+   special way:
+   - Space and tab are interpreted as delimiters. They are not treated as
+     delimiters if they are surrounded by double quotes: "...".
+   - Unescaped double quotes are removed from the input. Their only effect is
+     that within double quotes, space and tab are treated like normal
+     characters.
+   - Backslashes not followed by double quotes are not special.
+   - But 2*n+1 backslashes followed by a double quote become
+     n backslashes followed by a double quote (n >= 0):
+       \" -> "
+       \\\" -> \"
+       \\\\\" -> \\"
+ */
+#define SHELL_SPECIAL_CHARS "\"\\ \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037"
+#define SHELL_SPACE_CHARS " \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037"
+char **
+prepare_spawn (char **argv)
+{
+  size_t argc;
+  char **new_argv;
+  size_t i;
+
+  /* Count number of arguments.  */
+  for (argc = 0; argv[argc] != NULL; argc++)
+    ;
+
+  /* Allocate new argument vector.  */
+  new_argv = XMALLOC (char *, argc + 1);
+
+  /* Put quoted arguments into the new argument vector.  */
+  for (i = 0; i < argc; i++)
+    {
+      const char *string = argv[i];
+
+      if (string[0] == '\0')
+	new_argv[i] = xstrdup ("\"\"");
+      else if (strpbrk (string, SHELL_SPECIAL_CHARS) != NULL)
+	{
+	  int quote_around = (strpbrk (string, SHELL_SPACE_CHARS) != NULL);
+	  size_t length;
+	  unsigned int backslashes;
+	  const char *s;
+	  char *quoted_string;
+	  char *p;
+
+	  length = 0;
+	  backslashes = 0;
+	  if (quote_around)
+	    length++;
+	  for (s = string; *s != '\0'; s++)
+	    {
+	      char c = *s;
+	      if (c == '"')
+		length += backslashes + 1;
+	      length++;
+	      if (c == '\\')
+		backslashes++;
+	      else
+		backslashes = 0;
+	    }
+	  if (quote_around)
+	    length += backslashes + 1;
+
+	  quoted_string = XMALLOC (char, length + 1);
+
+	  p = quoted_string;
+	  backslashes = 0;
+	  if (quote_around)
+	    *p++ = '"';
+	  for (s = string; *s != '\0'; s++)
+	    {
+	      char c = *s;
+	      if (c == '"')
+		{
+		  unsigned int j;
+		  for (j = backslashes + 1; j > 0; j--)
+		    *p++ = '\\';
+		}
+	      *p++ = c;
+	      if (c == '\\')
+		backslashes++;
+	      else
+		backslashes = 0;
+	    }
+	  if (quote_around)
+	    {
+	      unsigned int j;
+	      for (j = backslashes; j > 0; j--)
+		*p++ = '\\';
+	      *p++ = '"';
+	    }
+	  *p = '\0';
+
+	  new_argv[i] = quoted_string;
+	}
+      else
+	new_argv[i] = (char *) string;
+    }
+  new_argv[argc] = NULL;
+
+  return new_argv;
+}
+EOF
+		;;
+	    esac
+
+            cat <<"EOF"
+void lt_dump_script (FILE* f)
+{
+EOF
+	    func_emit_wrapper yes |
+	      $SED -n -e '
+s/^\(.\{79\}\)\(..*\)/\1\
+\2/
+h
+s/\([\\"]\)/\\\1/g
+s/$/\\n/
+s/\([^\n]*\).*/  fputs ("\1", f);/p
+g
+D'
+            cat <<"EOF"
+}
+EOF
+}
+# end: func_emit_cwrapperexe_src
+
+# func_win32_import_lib_p ARG
+# True if ARG is an import lib, as indicated by $file_magic_cmd
+func_win32_import_lib_p ()
+{
+    $opt_debug
+    case `eval $file_magic_cmd \"\$1\" 2>/dev/null | $SED -e 10q` in
+    *import*) : ;;
+    *) false ;;
+    esac
+}
+
+# func_mode_link arg...
+func_mode_link ()
+{
+    $opt_debug
+    case $host in
+    *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*)
+      # It is impossible to link a dll without this setting, and
+      # we shouldn't force the makefile maintainer to figure out
+      # which system we are compiling for in order to pass an extra
+      # flag for every libtool invocation.
+      # allow_undefined=no
+
+      # FIXME: Unfortunately, there are problems with the above when trying
+      # to make a dll which has undefined symbols, in which case not
+      # even a static library is built.  For now, we need to specify
+      # -no-undefined on the libtool link line when we can be certain
+      # that all symbols are satisfied, otherwise we get a static library.
+      allow_undefined=yes
+      ;;
+    *)
+      allow_undefined=yes
+      ;;
+    esac
+    libtool_args=$nonopt
+    base_compile="$nonopt $@"
+    compile_command=$nonopt
+    finalize_command=$nonopt
+
+    compile_rpath=
+    finalize_rpath=
+    compile_shlibpath=
+    finalize_shlibpath=
+    convenience=
+    old_convenience=
+    deplibs=
+    old_deplibs=
+    compiler_flags=
+    linker_flags=
+    dllsearchpath=
+    lib_search_path=`pwd`
+    inst_prefix_dir=
+    new_inherited_linker_flags=
+
+    avoid_version=no
+    bindir=
+    dlfiles=
+    dlprefiles=
+    dlself=no
+    export_dynamic=no
+    export_symbols=
+    export_symbols_regex=
+    generated=
+    libobjs=
+    ltlibs=
+    module=no
+    no_install=no
+    objs=
+    non_pic_objects=
+    precious_files_regex=
+    prefer_static_libs=no
+    preload=no
+    prev=
+    prevarg=
+    release=
+    rpath=
+    xrpath=
+    perm_rpath=
+    temp_rpath=
+    thread_safe=no
+    vinfo=
+    vinfo_number=no
+    weak_libs=
+    single_module="${wl}-single_module"
+    func_infer_tag $base_compile
+
+    # We need to know -static, to get the right output filenames.
+    for arg
+    do
+      case $arg in
+      -shared)
+	test "$build_libtool_libs" != yes && \
+	  func_fatal_configuration "can not build a shared library"
+	build_old_libs=no
+	break
+	;;
+      -all-static | -static | -static-libtool-libs)
+	case $arg in
+	-all-static)
+	  if test "$build_libtool_libs" = yes && test -z "$link_static_flag"; then
+	    func_warning "complete static linking is impossible in this configuration"
+	  fi
+	  if test -n "$link_static_flag"; then
+	    dlopen_self=$dlopen_self_static
+	  fi
+	  prefer_static_libs=yes
+	  ;;
+	-static)
+	  if test -z "$pic_flag" && test -n "$link_static_flag"; then
+	    dlopen_self=$dlopen_self_static
+	  fi
+	  prefer_static_libs=built
+	  ;;
+	-static-libtool-libs)
+	  if test -z "$pic_flag" && test -n "$link_static_flag"; then
+	    dlopen_self=$dlopen_self_static
+	  fi
+	  prefer_static_libs=yes
+	  ;;
+	esac
+	build_libtool_libs=no
+	build_old_libs=yes
+	break
+	;;
+      esac
+    done
+
+    # See if our shared archives depend on static archives.
+    test -n "$old_archive_from_new_cmds" && build_old_libs=yes
+
+    # Go through the arguments, transforming them on the way.
+    while test "$#" -gt 0; do
+      arg="$1"
+      shift
+      func_quote_for_eval "$arg"
+      qarg=$func_quote_for_eval_unquoted_result
+      func_append libtool_args " $func_quote_for_eval_result"
+
+      # If the previous option needs an argument, assign it.
+      if test -n "$prev"; then
+	case $prev in
+	output)
+	  func_append compile_command " @OUTPUT@"
+	  func_append finalize_command " @OUTPUT@"
+	  ;;
+	esac
+
+	case $prev in
+	bindir)
+	  bindir="$arg"
+	  prev=
+	  continue
+	  ;;
+	dlfiles|dlprefiles)
+	  if test "$preload" = no; then
+	    # Add the symbol object into the linking commands.
+	    func_append compile_command " @SYMFILE@"
+	    func_append finalize_command " @SYMFILE@"
+	    preload=yes
+	  fi
+	  case $arg in
+	  *.la | *.lo) ;;  # We handle these cases below.
+	  force)
+	    if test "$dlself" = no; then
+	      dlself=needless
+	      export_dynamic=yes
+	    fi
+	    prev=
+	    continue
+	    ;;
+	  self)
+	    if test "$prev" = dlprefiles; then
+	      dlself=yes
+	    elif test "$prev" = dlfiles && test "$dlopen_self" != yes; then
+	      dlself=yes
+	    else
+	      dlself=needless
+	      export_dynamic=yes
+	    fi
+	    prev=
+	    continue
+	    ;;
+	  *)
+	    if test "$prev" = dlfiles; then
+	      func_append dlfiles " $arg"
+	    else
+	      func_append dlprefiles " $arg"
+	    fi
+	    prev=
+	    continue
+	    ;;
+	  esac
+	  ;;
+	expsyms)
+	  export_symbols="$arg"
+	  test -f "$arg" \
+	    || func_fatal_error "symbol file \`$arg' does not exist"
+	  prev=
+	  continue
+	  ;;
+	expsyms_regex)
+	  export_symbols_regex="$arg"
+	  prev=
+	  continue
+	  ;;
+	framework)
+	  case $host in
+	    *-*-darwin*)
+	      case "$deplibs " in
+		*" $qarg.ltframework "*) ;;
+		*) func_append deplibs " $qarg.ltframework" # this is fixed later
+		   ;;
+	      esac
+	      ;;
+	  esac
+	  prev=
+	  continue
+	  ;;
+	inst_prefix)
+	  inst_prefix_dir="$arg"
+	  prev=
+	  continue
+	  ;;
+	objectlist)
+	  if test -f "$arg"; then
+	    save_arg=$arg
+	    moreargs=
+	    for fil in `cat "$save_arg"`
+	    do
+#	      func_append moreargs " $fil"
+	      arg=$fil
+	      # A libtool-controlled object.
+
+	      # Check to see that this really is a libtool object.
+	      if func_lalib_unsafe_p "$arg"; then
+		pic_object=
+		non_pic_object=
+
+		# Read the .lo file
+		func_source "$arg"
+
+		if test -z "$pic_object" ||
+		   test -z "$non_pic_object" ||
+		   test "$pic_object" = none &&
+		   test "$non_pic_object" = none; then
+		  func_fatal_error "cannot find name of object for \`$arg'"
+		fi
+
+		# Extract subdirectory from the argument.
+		func_dirname "$arg" "/" ""
+		xdir="$func_dirname_result"
+
+		if test "$pic_object" != none; then
+		  # Prepend the subdirectory the object is found in.
+		  pic_object="$xdir$pic_object"
+
+		  if test "$prev" = dlfiles; then
+		    if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then
+		      func_append dlfiles " $pic_object"
+		      prev=
+		      continue
+		    else
+		      # If libtool objects are unsupported, then we need to preload.
+		      prev=dlprefiles
+		    fi
+		  fi
+
+		  # CHECK ME:  I think I busted this.  -Ossama
+		  if test "$prev" = dlprefiles; then
+		    # Preload the old-style object.
+		    func_append dlprefiles " $pic_object"
+		    prev=
+		  fi
+
+		  # A PIC object.
+		  func_append libobjs " $pic_object"
+		  arg="$pic_object"
+		fi
+
+		# Non-PIC object.
+		if test "$non_pic_object" != none; then
+		  # Prepend the subdirectory the object is found in.
+		  non_pic_object="$xdir$non_pic_object"
+
+		  # A standard non-PIC object
+		  func_append non_pic_objects " $non_pic_object"
+		  if test -z "$pic_object" || test "$pic_object" = none ; then
+		    arg="$non_pic_object"
+		  fi
+		else
+		  # If the PIC object exists, use it instead.
+		  # $xdir was prepended to $pic_object above.
+		  non_pic_object="$pic_object"
+		  func_append non_pic_objects " $non_pic_object"
+		fi
+	      else
+		# Only an error if not doing a dry-run.
+		if $opt_dry_run; then
+		  # Extract subdirectory from the argument.
+		  func_dirname "$arg" "/" ""
+		  xdir="$func_dirname_result"
+
+		  func_lo2o "$arg"
+		  pic_object=$xdir$objdir/$func_lo2o_result
+		  non_pic_object=$xdir$func_lo2o_result
+		  func_append libobjs " $pic_object"
+		  func_append non_pic_objects " $non_pic_object"
+	        else
+		  func_fatal_error "\`$arg' is not a valid libtool object"
+		fi
+	      fi
+	    done
+	  else
+	    func_fatal_error "link input file \`$arg' does not exist"
+	  fi
+	  arg=$save_arg
+	  prev=
+	  continue
+	  ;;
+	precious_regex)
+	  precious_files_regex="$arg"
+	  prev=
+	  continue
+	  ;;
+	release)
+	  release="-$arg"
+	  prev=
+	  continue
+	  ;;
+	rpath | xrpath)
+	  # We need an absolute path.
+	  case $arg in
+	  [\\/]* | [A-Za-z]:[\\/]*) ;;
+	  *)
+	    func_fatal_error "only absolute run-paths are allowed"
+	    ;;
+	  esac
+	  if test "$prev" = rpath; then
+	    case "$rpath " in
+	    *" $arg "*) ;;
+	    *) func_append rpath " $arg" ;;
+	    esac
+	  else
+	    case "$xrpath " in
+	    *" $arg "*) ;;
+	    *) func_append xrpath " $arg" ;;
+	    esac
+	  fi
+	  prev=
+	  continue
+	  ;;
+	shrext)
+	  shrext_cmds="$arg"
+	  prev=
+	  continue
+	  ;;
+	weak)
+	  func_append weak_libs " $arg"
+	  prev=
+	  continue
+	  ;;
+	xcclinker)
+	  func_append linker_flags " $qarg"
+	  func_append compiler_flags " $qarg"
+	  prev=
+	  func_append compile_command " $qarg"
+	  func_append finalize_command " $qarg"
+	  continue
+	  ;;
+	xcompiler)
+	  func_append compiler_flags " $qarg"
+	  prev=
+	  func_append compile_command " $qarg"
+	  func_append finalize_command " $qarg"
+	  continue
+	  ;;
+	xlinker)
+	  func_append linker_flags " $qarg"
+	  func_append compiler_flags " $wl$qarg"
+	  prev=
+	  func_append compile_command " $wl$qarg"
+	  func_append finalize_command " $wl$qarg"
+	  continue
+	  ;;
+	*)
+	  eval "$prev=\"\$arg\""
+	  prev=
+	  continue
+	  ;;
+	esac
+      fi # test -n "$prev"
+
+      prevarg="$arg"
+
+      case $arg in
+      -all-static)
+	if test -n "$link_static_flag"; then
+	  # See comment for -static flag below, for more details.
+	  func_append compile_command " $link_static_flag"
+	  func_append finalize_command " $link_static_flag"
+	fi
+	continue
+	;;
+
+      -allow-undefined)
+	# FIXME: remove this flag sometime in the future.
+	func_fatal_error "\`-allow-undefined' must not be used because it is the default"
+	;;
+
+      -avoid-version)
+	avoid_version=yes
+	continue
+	;;
+
+      -bindir)
+	prev=bindir
+	continue
+	;;
+
+      -dlopen)
+	prev=dlfiles
+	continue
+	;;
+
+      -dlpreopen)
+	prev=dlprefiles
+	continue
+	;;
+
+      -export-dynamic)
+	export_dynamic=yes
+	continue
+	;;
+
+      -export-symbols | -export-symbols-regex)
+	if test -n "$export_symbols" || test -n "$export_symbols_regex"; then
+	  func_fatal_error "more than one -exported-symbols argument is not allowed"
+	fi
+	if test "X$arg" = "X-export-symbols"; then
+	  prev=expsyms
+	else
+	  prev=expsyms_regex
+	fi
+	continue
+	;;
+
+      -framework)
+	prev=framework
+	continue
+	;;
+
+      -inst-prefix-dir)
+	prev=inst_prefix
+	continue
+	;;
+
+      # The native IRIX linker understands -LANG:*, -LIST:* and -LNO:*
+      # so, if we see these flags be careful not to treat them like -L
+      -L[A-Z][A-Z]*:*)
+	case $with_gcc/$host in
+	no/*-*-irix* | /*-*-irix*)
+	  func_append compile_command " $arg"
+	  func_append finalize_command " $arg"
+	  ;;
+	esac
+	continue
+	;;
+
+      -L*)
+	func_stripname "-L" '' "$arg"
+	if test -z "$func_stripname_result"; then
+	  if test "$#" -gt 0; then
+	    func_fatal_error "require no space between \`-L' and \`$1'"
+	  else
+	    func_fatal_error "need path for \`-L' option"
+	  fi
+	fi
+	func_resolve_sysroot "$func_stripname_result"
+	dir=$func_resolve_sysroot_result
+	# We need an absolute path.
+	case $dir in
+	[\\/]* | [A-Za-z]:[\\/]*) ;;
+	*)
+	  absdir=`cd "$dir" && pwd`
+	  test -z "$absdir" && \
+	    func_fatal_error "cannot determine absolute directory name of \`$dir'"
+	  dir="$absdir"
+	  ;;
+	esac
+	case "$deplibs " in
+	*" -L$dir "* | *" $arg "*)
+	  # Will only happen for absolute or sysroot arguments
+	  ;;
+	*)
+	  # Preserve sysroot, but never include relative directories
+	  case $dir in
+	    [\\/]* | [A-Za-z]:[\\/]* | =*) func_append deplibs " $arg" ;;
+	    *) func_append deplibs " -L$dir" ;;
+	  esac
+	  func_append lib_search_path " $dir"
+	  ;;
+	esac
+	case $host in
+	*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*)
+	  testbindir=`$ECHO "$dir" | $SED 's*/lib$*/bin*'`
+	  case :$dllsearchpath: in
+	  *":$dir:"*) ;;
+	  ::) dllsearchpath=$dir;;
+	  *) func_append dllsearchpath ":$dir";;
+	  esac
+	  case :$dllsearchpath: in
+	  *":$testbindir:"*) ;;
+	  ::) dllsearchpath=$testbindir;;
+	  *) func_append dllsearchpath ":$testbindir";;
+	  esac
+	  ;;
+	esac
+	continue
+	;;
+
+      -l*)
+	if test "X$arg" = "X-lc" || test "X$arg" = "X-lm"; then
+	  case $host in
+	  *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-beos* | *-cegcc* | *-*-haiku*)
+	    # These systems don't actually have a C or math library (as such)
+	    continue
+	    ;;
+	  *-*-os2*)
+	    # These systems don't actually have a C library (as such)
+	    test "X$arg" = "X-lc" && continue
+	    ;;
+	  *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*)
+	    # Do not include libc due to us having libc/libc_r.
+	    test "X$arg" = "X-lc" && continue
+	    ;;
+	  *-*-rhapsody* | *-*-darwin1.[012])
+	    # Rhapsody C and math libraries are in the System framework
+	    func_append deplibs " System.ltframework"
+	    continue
+	    ;;
+	  *-*-sco3.2v5* | *-*-sco5v6*)
+	    # Causes problems with __ctype
+	    test "X$arg" = "X-lc" && continue
+	    ;;
+	  *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*)
+	    # Compiler inserts libc in the correct place for threads to work
+	    test "X$arg" = "X-lc" && continue
+	    ;;
+	  esac
+	elif test "X$arg" = "X-lc_r"; then
+	 case $host in
+	 *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*)
+	   # Do not include libc_r directly, use -pthread flag.
+	   continue
+	   ;;
+	 esac
+	fi
+	func_append deplibs " $arg"
+	continue
+	;;
+
+      -module)
+	module=yes
+	continue
+	;;
+
+      # Tru64 UNIX uses -model [arg] to determine the layout of C++
+      # classes, name mangling, and exception handling.
+      # Darwin uses the -arch flag to determine output architecture.
+      -model|-arch|-isysroot|--sysroot)
+	func_append compiler_flags " $arg"
+	func_append compile_command " $arg"
+	func_append finalize_command " $arg"
+	prev=xcompiler
+	continue
+	;;
+
+      -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \
+      |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*)
+	func_append compiler_flags " $arg"
+	func_append compile_command " $arg"
+	func_append finalize_command " $arg"
+	case "$new_inherited_linker_flags " in
+	    *" $arg "*) ;;
+	    * ) func_append new_inherited_linker_flags " $arg" ;;
+	esac
+	continue
+	;;
+
+      -multi_module)
+	single_module="${wl}-multi_module"
+	continue
+	;;
+
+      -no-fast-install)
+	fast_install=no
+	continue
+	;;
+
+      -no-install)
+	case $host in
+	*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-darwin* | *-cegcc*)
+	  # The PATH hackery in wrapper scripts is required on Windows
+	  # and Darwin in order for the loader to find any dlls it needs.
+	  func_warning "\`-no-install' is ignored for $host"
+	  func_warning "assuming \`-no-fast-install' instead"
+	  fast_install=no
+	  ;;
+	*) no_install=yes ;;
+	esac
+	continue
+	;;
+
+      -no-undefined)
+	allow_undefined=no
+	continue
+	;;
+
+      -objectlist)
+	prev=objectlist
+	continue
+	;;
+
+      -o) prev=output ;;
+
+      -precious-files-regex)
+	prev=precious_regex
+	continue
+	;;
+
+      -release)
+	prev=release
+	continue
+	;;
+
+      -rpath)
+	prev=rpath
+	continue
+	;;
+
+      -R)
+	prev=xrpath
+	continue
+	;;
+
+      -R*)
+	func_stripname '-R' '' "$arg"
+	dir=$func_stripname_result
+	# We need an absolute path.
+	case $dir in
+	[\\/]* | [A-Za-z]:[\\/]*) ;;
+	=*)
+	  func_stripname '=' '' "$dir"
+	  dir=$lt_sysroot$func_stripname_result
+	  ;;
+	*)
+	  func_fatal_error "only absolute run-paths are allowed"
+	  ;;
+	esac
+	case "$xrpath " in
+	*" $dir "*) ;;
+	*) func_append xrpath " $dir" ;;
+	esac
+	continue
+	;;
+
+      -shared)
+	# The effects of -shared are defined in a previous loop.
+	continue
+	;;
+
+      -shrext)
+	prev=shrext
+	continue
+	;;
+
+      -static | -static-libtool-libs)
+	# The effects of -static are defined in a previous loop.
+	# We used to do the same as -all-static on platforms that
+	# didn't have a PIC flag, but the assumption that the effects
+	# would be equivalent was wrong.  It would break on at least
+	# Digital Unix and AIX.
+	continue
+	;;
+
+      -thread-safe)
+	thread_safe=yes
+	continue
+	;;
+
+      -version-info)
+	prev=vinfo
+	continue
+	;;
+
+      -version-number)
+	prev=vinfo
+	vinfo_number=yes
+	continue
+	;;
+
+      -weak)
+        prev=weak
+	continue
+	;;
+
+      -Wc,*)
+	func_stripname '-Wc,' '' "$arg"
+	args=$func_stripname_result
+	arg=
+	save_ifs="$IFS"; IFS=','
+	for flag in $args; do
+	  IFS="$save_ifs"
+          func_quote_for_eval "$flag"
+	  func_append arg " $func_quote_for_eval_result"
+	  func_append compiler_flags " $func_quote_for_eval_result"
+	done
+	IFS="$save_ifs"
+	func_stripname ' ' '' "$arg"
+	arg=$func_stripname_result
+	;;
+
+      -Wl,*)
+	func_stripname '-Wl,' '' "$arg"
+	args=$func_stripname_result
+	arg=
+	save_ifs="$IFS"; IFS=','
+	for flag in $args; do
+	  IFS="$save_ifs"
+          func_quote_for_eval "$flag"
+	  func_append arg " $wl$func_quote_for_eval_result"
+	  func_append compiler_flags " $wl$func_quote_for_eval_result"
+	  func_append linker_flags " $func_quote_for_eval_result"
+	done
+	IFS="$save_ifs"
+	func_stripname ' ' '' "$arg"
+	arg=$func_stripname_result
+	;;
+
+      -Xcompiler)
+	prev=xcompiler
+	continue
+	;;
+
+      -Xlinker)
+	prev=xlinker
+	continue
+	;;
+
+      -XCClinker)
+	prev=xcclinker
+	continue
+	;;
+
+      # -msg_* for osf cc
+      -msg_*)
+	func_quote_for_eval "$arg"
+	arg="$func_quote_for_eval_result"
+	;;
+
+      # Flags to be passed through unchanged, with rationale:
+      # -64, -mips[0-9]      enable 64-bit mode for the SGI compiler
+      # -r[0-9][0-9]*        specify processor for the SGI compiler
+      # -xarch=*, -xtarget=* enable 64-bit mode for the Sun compiler
+      # +DA*, +DD*           enable 64-bit mode for the HP compiler
+      # -q*                  compiler args for the IBM compiler
+      # -m*, -t[45]*, -txscale* architecture-specific flags for GCC
+      # -F/path              path to uninstalled frameworks, gcc on darwin
+      # -p, -pg, --coverage, -fprofile-*  profiling flags for GCC
+      # @file                GCC response files
+      # -tp=*                Portland pgcc target processor selection
+      # --sysroot=*          for sysroot support
+      # -O*, -flto*, -fwhopr*, -fuse-linker-plugin GCC link-time optimization
+      -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*| \
+      -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*|-tp=*|--sysroot=*| \
+      -O*|-flto*|-fwhopr*|-fuse-linker-plugin)
+        func_quote_for_eval "$arg"
+	arg="$func_quote_for_eval_result"
+        func_append compile_command " $arg"
+        func_append finalize_command " $arg"
+        func_append compiler_flags " $arg"
+        continue
+        ;;
+
+      # Some other compiler flag.
+      -* | +*)
+        func_quote_for_eval "$arg"
+	arg="$func_quote_for_eval_result"
+	;;
+
+      *.$objext)
+	# A standard object.
+	func_append objs " $arg"
+	;;
+
+      *.lo)
+	# A libtool-controlled object.
+
+	# Check to see that this really is a libtool object.
+	if func_lalib_unsafe_p "$arg"; then
+	  pic_object=
+	  non_pic_object=
+
+	  # Read the .lo file
+	  func_source "$arg"
+
+	  if test -z "$pic_object" ||
+	     test -z "$non_pic_object" ||
+	     test "$pic_object" = none &&
+	     test "$non_pic_object" = none; then
+	    func_fatal_error "cannot find name of object for \`$arg'"
+	  fi
+
+	  # Extract subdirectory from the argument.
+	  func_dirname "$arg" "/" ""
+	  xdir="$func_dirname_result"
+
+	  if test "$pic_object" != none; then
+	    # Prepend the subdirectory the object is found in.
+	    pic_object="$xdir$pic_object"
+
+	    if test "$prev" = dlfiles; then
+	      if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then
+		func_append dlfiles " $pic_object"
+		prev=
+		continue
+	      else
+		# If libtool objects are unsupported, then we need to preload.
+		prev=dlprefiles
+	      fi
+	    fi
+
+	    # CHECK ME:  I think I busted this.  -Ossama
+	    if test "$prev" = dlprefiles; then
+	      # Preload the old-style object.
+	      func_append dlprefiles " $pic_object"
+	      prev=
+	    fi
+
+	    # A PIC object.
+	    func_append libobjs " $pic_object"
+	    arg="$pic_object"
+	  fi
+
+	  # Non-PIC object.
+	  if test "$non_pic_object" != none; then
+	    # Prepend the subdirectory the object is found in.
+	    non_pic_object="$xdir$non_pic_object"
+
+	    # A standard non-PIC object
+	    func_append non_pic_objects " $non_pic_object"
+	    if test -z "$pic_object" || test "$pic_object" = none ; then
+	      arg="$non_pic_object"
+	    fi
+	  else
+	    # If the PIC object exists, use it instead.
+	    # $xdir was prepended to $pic_object above.
+	    non_pic_object="$pic_object"
+	    func_append non_pic_objects " $non_pic_object"
+	  fi
+	else
+	  # Only an error if not doing a dry-run.
+	  if $opt_dry_run; then
+	    # Extract subdirectory from the argument.
+	    func_dirname "$arg" "/" ""
+	    xdir="$func_dirname_result"
+
+	    func_lo2o "$arg"
+	    pic_object=$xdir$objdir/$func_lo2o_result
+	    non_pic_object=$xdir$func_lo2o_result
+	    func_append libobjs " $pic_object"
+	    func_append non_pic_objects " $non_pic_object"
+	  else
+	    func_fatal_error "\`$arg' is not a valid libtool object"
+	  fi
+	fi
+	;;
+
+      *.$libext)
+	# An archive.
+	func_append deplibs " $arg"
+	func_append old_deplibs " $arg"
+	continue
+	;;
+
+      *.la)
+	# A libtool-controlled library.
+
+	func_resolve_sysroot "$arg"
+	if test "$prev" = dlfiles; then
+	  # This library was specified with -dlopen.
+	  func_append dlfiles " $func_resolve_sysroot_result"
+	  prev=
+	elif test "$prev" = dlprefiles; then
+	  # The library was specified with -dlpreopen.
+	  func_append dlprefiles " $func_resolve_sysroot_result"
+	  prev=
+	else
+	  func_append deplibs " $func_resolve_sysroot_result"
+	fi
+	continue
+	;;
+
+      # Some other compiler argument.
+      *)
+	# Unknown arguments in both finalize_command and compile_command need
+	# to be aesthetically quoted because they are evaled later.
+	func_quote_for_eval "$arg"
+	arg="$func_quote_for_eval_result"
+	;;
+      esac # arg
+
+      # Now actually substitute the argument into the commands.
+      if test -n "$arg"; then
+	func_append compile_command " $arg"
+	func_append finalize_command " $arg"
+      fi
+    done # argument parsing loop
+
+    test -n "$prev" && \
+      func_fatal_help "the \`$prevarg' option requires an argument"
+
+    if test "$export_dynamic" = yes && test -n "$export_dynamic_flag_spec"; then
+      eval arg=\"$export_dynamic_flag_spec\"
+      func_append compile_command " $arg"
+      func_append finalize_command " $arg"
+    fi
+
+    oldlibs=
+    # calculate the name of the file, without its directory
+    func_basename "$output"
+    outputname="$func_basename_result"
+    libobjs_save="$libobjs"
+
+    if test -n "$shlibpath_var"; then
+      # get the directories listed in $shlibpath_var
+      eval shlib_search_path=\`\$ECHO \"\${$shlibpath_var}\" \| \$SED \'s/:/ /g\'\`
+    else
+      shlib_search_path=
+    fi
+    eval sys_lib_search_path=\"$sys_lib_search_path_spec\"
+    eval sys_lib_dlsearch_path=\"$sys_lib_dlsearch_path_spec\"
+
+    func_dirname "$output" "/" ""
+    output_objdir="$func_dirname_result$objdir"
+    func_to_tool_file "$output_objdir/"
+    tool_output_objdir=$func_to_tool_file_result
+    # Create the object directory.
+    func_mkdir_p "$output_objdir"
+
+    # Determine the type of output
+    case $output in
+    "")
+      func_fatal_help "you must specify an output file"
+      ;;
+    *.$libext) linkmode=oldlib ;;
+    *.lo | *.$objext) linkmode=obj ;;
+    *.la) linkmode=lib ;;
+    *) linkmode=prog ;; # Anything else should be a program.
+    esac
+
+    specialdeplibs=
+
+    libs=
+    # Find all interdependent deplibs by searching for libraries
+    # that are linked more than once (e.g. -la -lb -la)
+    for deplib in $deplibs; do
+      if $opt_preserve_dup_deps ; then
+	case "$libs " in
+	*" $deplib "*) func_append specialdeplibs " $deplib" ;;
+	esac
+      fi
+      func_append libs " $deplib"
+    done
+
+    if test "$linkmode" = lib; then
+      libs="$predeps $libs $compiler_lib_search_path $postdeps"
+
+      # Compute libraries that are listed more than once in $predeps
+      # $postdeps and mark them as special (i.e., whose duplicates are
+      # not to be eliminated).
+      pre_post_deps=
+      if $opt_duplicate_compiler_generated_deps; then
+	for pre_post_dep in $predeps $postdeps; do
+	  case "$pre_post_deps " in
+	  *" $pre_post_dep "*) func_append specialdeplibs " $pre_post_deps" ;;
+	  esac
+	  func_append pre_post_deps " $pre_post_dep"
+	done
+      fi
+      pre_post_deps=
+    fi
+
+    deplibs=
+    newdependency_libs=
+    newlib_search_path=
+    need_relink=no # whether we're linking any uninstalled libtool libraries
+    notinst_deplibs= # not-installed libtool libraries
+    notinst_path= # paths that contain not-installed libtool libraries
+
+    case $linkmode in
+    lib)
+	passes="conv dlpreopen link"
+	for file in $dlfiles $dlprefiles; do
+	  case $file in
+	  *.la) ;;
+	  *)
+	    func_fatal_help "libraries can \`-dlopen' only libtool libraries: $file"
+	    ;;
+	  esac
+	done
+	;;
+    prog)
+	compile_deplibs=
+	finalize_deplibs=
+	alldeplibs=no
+	newdlfiles=
+	newdlprefiles=
+	passes="conv scan dlopen dlpreopen link"
+	;;
+    *)  passes="conv"
+	;;
+    esac
+
+    for pass in $passes; do
+      # The preopen pass in lib mode reverses $deplibs; put it back here
+      # so that -L comes before libs that need it for instance...
+      if test "$linkmode,$pass" = "lib,link"; then
+	## FIXME: Find the place where the list is rebuilt in the wrong
+	##        order, and fix it there properly
+        tmp_deplibs=
+	for deplib in $deplibs; do
+	  tmp_deplibs="$deplib $tmp_deplibs"
+	done
+	deplibs="$tmp_deplibs"
+      fi
+
+      if test "$linkmode,$pass" = "lib,link" ||
+	 test "$linkmode,$pass" = "prog,scan"; then
+	libs="$deplibs"
+	deplibs=
+      fi
+      if test "$linkmode" = prog; then
+	case $pass in
+	dlopen) libs="$dlfiles" ;;
+	dlpreopen) libs="$dlprefiles" ;;
+	link) libs="$deplibs %DEPLIBS% $dependency_libs" ;;
+	esac
+      fi
+      if test "$linkmode,$pass" = "lib,dlpreopen"; then
+	# Collect and forward deplibs of preopened libtool libs
+	for lib in $dlprefiles; do
+	  # Ignore non-libtool-libs
+	  dependency_libs=
+	  func_resolve_sysroot "$lib"
+	  case $lib in
+	  *.la)	func_source "$func_resolve_sysroot_result" ;;
+	  esac
+
+	  # Collect preopened libtool deplibs, except any this library
+	  # has declared as weak libs
+	  for deplib in $dependency_libs; do
+	    func_basename "$deplib"
+            deplib_base=$func_basename_result
+	    case " $weak_libs " in
+	    *" $deplib_base "*) ;;
+	    *) func_append deplibs " $deplib" ;;
+	    esac
+	  done
+	done
+	libs="$dlprefiles"
+      fi
+      if test "$pass" = dlopen; then
+	# Collect dlpreopened libraries
+	save_deplibs="$deplibs"
+	deplibs=
+      fi
+
+      for deplib in $libs; do
+	lib=
+	found=no
+	case $deplib in
+	-mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \
+        |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*)
+	  if test "$linkmode,$pass" = "prog,link"; then
+	    compile_deplibs="$deplib $compile_deplibs"
+	    finalize_deplibs="$deplib $finalize_deplibs"
+	  else
+	    func_append compiler_flags " $deplib"
+	    if test "$linkmode" = lib ; then
+		case "$new_inherited_linker_flags " in
+		    *" $deplib "*) ;;
+		    * ) func_append new_inherited_linker_flags " $deplib" ;;
+		esac
+	    fi
+	  fi
+	  continue
+	  ;;
+	-l*)
+	  if test "$linkmode" != lib && test "$linkmode" != prog; then
+	    func_warning "\`-l' is ignored for archives/objects"
+	    continue
+	  fi
+	  func_stripname '-l' '' "$deplib"
+	  name=$func_stripname_result
+	  if test "$linkmode" = lib; then
+	    searchdirs="$newlib_search_path $lib_search_path $compiler_lib_search_dirs $sys_lib_search_path $shlib_search_path"
+	  else
+	    searchdirs="$newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path"
+	  fi
+	  for searchdir in $searchdirs; do
+	    for search_ext in .la $std_shrext .so .a; do
+	      # Search the libtool library
+	      lib="$searchdir/lib${name}${search_ext}"
+	      if test -f "$lib"; then
+		if test "$search_ext" = ".la"; then
+		  found=yes
+		else
+		  found=no
+		fi
+		break 2
+	      fi
+	    done
+	  done
+	  if test "$found" != yes; then
+	    # deplib doesn't seem to be a libtool library
+	    if test "$linkmode,$pass" = "prog,link"; then
+	      compile_deplibs="$deplib $compile_deplibs"
+	      finalize_deplibs="$deplib $finalize_deplibs"
+	    else
+	      deplibs="$deplib $deplibs"
+	      test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs"
+	    fi
+	    continue
+	  else # deplib is a libtool library
+	    # If $allow_libtool_libs_with_static_runtimes && $deplib is a stdlib,
+	    # We need to do some special things here, and not later.
+	    if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
+	      case " $predeps $postdeps " in
+	      *" $deplib "*)
+		if func_lalib_p "$lib"; then
+		  library_names=
+		  old_library=
+		  func_source "$lib"
+		  for l in $old_library $library_names; do
+		    ll="$l"
+		  done
+		  if test "X$ll" = "X$old_library" ; then # only static version available
+		    found=no
+		    func_dirname "$lib" "" "."
+		    ladir="$func_dirname_result"
+		    lib=$ladir/$old_library
+		    if test "$linkmode,$pass" = "prog,link"; then
+		      compile_deplibs="$deplib $compile_deplibs"
+		      finalize_deplibs="$deplib $finalize_deplibs"
+		    else
+		      deplibs="$deplib $deplibs"
+		      test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs"
+		    fi
+		    continue
+		  fi
+		fi
+		;;
+	      *) ;;
+	      esac
+	    fi
+	  fi
+	  ;; # -l
+	*.ltframework)
+	  if test "$linkmode,$pass" = "prog,link"; then
+	    compile_deplibs="$deplib $compile_deplibs"
+	    finalize_deplibs="$deplib $finalize_deplibs"
+	  else
+	    deplibs="$deplib $deplibs"
+	    if test "$linkmode" = lib ; then
+		case "$new_inherited_linker_flags " in
+		    *" $deplib "*) ;;
+		    * ) func_append new_inherited_linker_flags " $deplib" ;;
+		esac
+	    fi
+	  fi
+	  continue
+	  ;;
+	-L*)
+	  case $linkmode in
+	  lib)
+	    deplibs="$deplib $deplibs"
+	    test "$pass" = conv && continue
+	    newdependency_libs="$deplib $newdependency_libs"
+	    func_stripname '-L' '' "$deplib"
+	    func_resolve_sysroot "$func_stripname_result"
+	    func_append newlib_search_path " $func_resolve_sysroot_result"
+	    ;;
+	  prog)
+	    if test "$pass" = conv; then
+	      deplibs="$deplib $deplibs"
+	      continue
+	    fi
+	    if test "$pass" = scan; then
+	      deplibs="$deplib $deplibs"
+	    else
+	      compile_deplibs="$deplib $compile_deplibs"
+	      finalize_deplibs="$deplib $finalize_deplibs"
+	    fi
+	    func_stripname '-L' '' "$deplib"
+	    func_resolve_sysroot "$func_stripname_result"
+	    func_append newlib_search_path " $func_resolve_sysroot_result"
+	    ;;
+	  *)
+	    func_warning "\`-L' is ignored for archives/objects"
+	    ;;
+	  esac # linkmode
+	  continue
+	  ;; # -L
+	-R*)
+	  if test "$pass" = link; then
+	    func_stripname '-R' '' "$deplib"
+	    func_resolve_sysroot "$func_stripname_result"
+	    dir=$func_resolve_sysroot_result
+	    # Make sure the xrpath contains only unique directories.
+	    case "$xrpath " in
+	    *" $dir "*) ;;
+	    *) func_append xrpath " $dir" ;;
+	    esac
+	  fi
+	  deplibs="$deplib $deplibs"
+	  continue
+	  ;;
+	*.la)
+	  func_resolve_sysroot "$deplib"
+	  lib=$func_resolve_sysroot_result
+	  ;;
+	*.$libext)
+	  if test "$pass" = conv; then
+	    deplibs="$deplib $deplibs"
+	    continue
+	  fi
+	  case $linkmode in
+	  lib)
+	    # Linking convenience modules into shared libraries is allowed,
+	    # but linking other static libraries is non-portable.
+	    case " $dlpreconveniencelibs " in
+	    *" $deplib "*) ;;
+	    *)
+	      valid_a_lib=no
+	      case $deplibs_check_method in
+		match_pattern*)
+		  set dummy $deplibs_check_method; shift
+		  match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"`
+		  if eval "\$ECHO \"$deplib\"" 2>/dev/null | $SED 10q \
+		    | $EGREP "$match_pattern_regex" > /dev/null; then
+		    valid_a_lib=yes
+		  fi
+		;;
+		pass_all)
+		  valid_a_lib=yes
+		;;
+	      esac
+	      if test "$valid_a_lib" != yes; then
+		echo
+		$ECHO "*** Warning: Trying to link with static lib archive $deplib."
+		echo "*** I have the capability to make that library automatically link in when"
+		echo "*** you link to this library.  But I can only do this if you have a"
+		echo "*** shared version of the library, which you do not appear to have"
+		echo "*** because the file extensions .$libext of this argument makes me believe"
+		echo "*** that it is just a static archive that I should not use here."
+	      else
+		echo
+		$ECHO "*** Warning: Linking the shared library $output against the"
+		$ECHO "*** static library $deplib is not portable!"
+		deplibs="$deplib $deplibs"
+	      fi
+	      ;;
+	    esac
+	    continue
+	    ;;
+	  prog)
+	    if test "$pass" != link; then
+	      deplibs="$deplib $deplibs"
+	    else
+	      compile_deplibs="$deplib $compile_deplibs"
+	      finalize_deplibs="$deplib $finalize_deplibs"
+	    fi
+	    continue
+	    ;;
+	  esac # linkmode
+	  ;; # *.$libext
+	*.lo | *.$objext)
+	  if test "$pass" = conv; then
+	    deplibs="$deplib $deplibs"
+	  elif test "$linkmode" = prog; then
+	    if test "$pass" = dlpreopen || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then
+	      # If there is no dlopen support or we're linking statically,
+	      # we need to preload.
+	      func_append newdlprefiles " $deplib"
+	      compile_deplibs="$deplib $compile_deplibs"
+	      finalize_deplibs="$deplib $finalize_deplibs"
+	    else
+	      func_append newdlfiles " $deplib"
+	    fi
+	  fi
+	  continue
+	  ;;
+	%DEPLIBS%)
+	  alldeplibs=yes
+	  continue
+	  ;;
+	esac # case $deplib
+
+	if test "$found" = yes || test -f "$lib"; then :
+	else
+	  func_fatal_error "cannot find the library \`$lib' or unhandled argument \`$deplib'"
+	fi
+
+	# Check to see that this really is a libtool archive.
+	func_lalib_unsafe_p "$lib" \
+	  || func_fatal_error "\`$lib' is not a valid libtool archive"
+
+	func_dirname "$lib" "" "."
+	ladir="$func_dirname_result"
+
+	dlname=
+	dlopen=
+	dlpreopen=
+	libdir=
+	library_names=
+	old_library=
+	inherited_linker_flags=
+	# If the library was installed with an old release of libtool,
+	# it will not redefine variables installed, or shouldnotlink
+	installed=yes
+	shouldnotlink=no
+	avoidtemprpath=
+
+
+	# Read the .la file
+	func_source "$lib"
+
+	# Convert "-framework foo" to "foo.ltframework"
+	if test -n "$inherited_linker_flags"; then
+	  tmp_inherited_linker_flags=`$ECHO "$inherited_linker_flags" | $SED 's/-framework \([^ $]*\)/\1.ltframework/g'`
+	  for tmp_inherited_linker_flag in $tmp_inherited_linker_flags; do
+	    case " $new_inherited_linker_flags " in
+	      *" $tmp_inherited_linker_flag "*) ;;
+	      *) func_append new_inherited_linker_flags " $tmp_inherited_linker_flag";;
+	    esac
+	  done
+	fi
+	dependency_libs=`$ECHO " $dependency_libs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
+	if test "$linkmode,$pass" = "lib,link" ||
+	   test "$linkmode,$pass" = "prog,scan" ||
+	   { test "$linkmode" != prog && test "$linkmode" != lib; }; then
+	  test -n "$dlopen" && func_append dlfiles " $dlopen"
+	  test -n "$dlpreopen" && func_append dlprefiles " $dlpreopen"
+	fi
+
+	if test "$pass" = conv; then
+	  # Only check for convenience libraries
+	  deplibs="$lib $deplibs"
+	  if test -z "$libdir"; then
+	    if test -z "$old_library"; then
+	      func_fatal_error "cannot find name of link library for \`$lib'"
+	    fi
+	    # It is a libtool convenience library, so add in its objects.
+	    func_append convenience " $ladir/$objdir/$old_library"
+	    func_append old_convenience " $ladir/$objdir/$old_library"
+	  elif test "$linkmode" != prog && test "$linkmode" != lib; then
+	    func_fatal_error "\`$lib' is not a convenience library"
+	  fi
+	  tmp_libs=
+	  for deplib in $dependency_libs; do
+	    deplibs="$deplib $deplibs"
+	    if $opt_preserve_dup_deps ; then
+	      case "$tmp_libs " in
+	      *" $deplib "*) func_append specialdeplibs " $deplib" ;;
+	      esac
+	    fi
+	    func_append tmp_libs " $deplib"
+	  done
+	  continue
+	fi # $pass = conv
+
+
+	# Get the name of the library we link against.
+	linklib=
+	if test -n "$old_library" &&
+	   { test "$prefer_static_libs" = yes ||
+	     test "$prefer_static_libs,$installed" = "built,no"; }; then
+	  linklib=$old_library
+	else
+	  for l in $old_library $library_names; do
+	    linklib="$l"
+	  done
+	fi
+	if test -z "$linklib"; then
+	  func_fatal_error "cannot find name of link library for \`$lib'"
+	fi
+
+	# This library was specified with -dlopen.
+	if test "$pass" = dlopen; then
+	  if test -z "$libdir"; then
+	    func_fatal_error "cannot -dlopen a convenience library: \`$lib'"
+	  fi
+	  if test -z "$dlname" ||
+	     test "$dlopen_support" != yes ||
+	     test "$build_libtool_libs" = no; then
+	    # If there is no dlname, no dlopen support or we're linking
+	    # statically, we need to preload.  We also need to preload any
+	    # dependent libraries so libltdl's deplib preloader doesn't
+	    # bomb out in the load deplibs phase.
+	    func_append dlprefiles " $lib $dependency_libs"
+	  else
+	    func_append newdlfiles " $lib"
+	  fi
+	  continue
+	fi # $pass = dlopen
+
+	# We need an absolute path.
+	case $ladir in
+	[\\/]* | [A-Za-z]:[\\/]*) abs_ladir="$ladir" ;;
+	*)
+	  abs_ladir=`cd "$ladir" && pwd`
+	  if test -z "$abs_ladir"; then
+	    func_warning "cannot determine absolute directory name of \`$ladir'"
+	    func_warning "passing it literally to the linker, although it might fail"
+	    abs_ladir="$ladir"
+	  fi
+	  ;;
+	esac
+	func_basename "$lib"
+	laname="$func_basename_result"
+
+	# Find the relevant object directory and library name.
+	if test "X$installed" = Xyes; then
+	  if test ! -f "$lt_sysroot$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then
+	    func_warning "library \`$lib' was moved."
+	    dir="$ladir"
+	    absdir="$abs_ladir"
+	    libdir="$abs_ladir"
+	  else
+	    dir="$lt_sysroot$libdir"
+	    absdir="$lt_sysroot$libdir"
+	  fi
+	  test "X$hardcode_automatic" = Xyes && avoidtemprpath=yes
+	else
+	  if test ! -f "$ladir/$objdir/$linklib" && test -f "$abs_ladir/$linklib"; then
+	    dir="$ladir"
+	    absdir="$abs_ladir"
+	    # Remove this search path later
+	    func_append notinst_path " $abs_ladir"
+	  else
+	    dir="$ladir/$objdir"
+	    absdir="$abs_ladir/$objdir"
+	    # Remove this search path later
+	    func_append notinst_path " $abs_ladir"
+	  fi
+	fi # $installed = yes
+	func_stripname 'lib' '.la' "$laname"
+	name=$func_stripname_result
+
+	# This library was specified with -dlpreopen.
+	if test "$pass" = dlpreopen; then
+	  if test -z "$libdir" && test "$linkmode" = prog; then
+	    func_fatal_error "only libraries may -dlpreopen a convenience library: \`$lib'"
+	  fi
+	  case "$host" in
+	    # special handling for platforms with PE-DLLs.
+	    *cygwin* | *mingw* | *cegcc* )
+	      # Linker will automatically link against shared library if both
+	      # static and shared are present.  Therefore, ensure we extract
+	      # symbols from the import library if a shared library is present
+	      # (otherwise, the dlopen module name will be incorrect).  We do
+	      # this by putting the import library name into $newdlprefiles.
+	      # We recover the dlopen module name by 'saving' the la file
+	      # name in a special purpose variable, and (later) extracting the
+	      # dlname from the la file.
+	      if test -n "$dlname"; then
+	        func_tr_sh "$dir/$linklib"
+	        eval "libfile_$func_tr_sh_result=\$abs_ladir/\$laname"
+	        func_append newdlprefiles " $dir/$linklib"
+	      else
+	        func_append newdlprefiles " $dir/$old_library"
+	        # Keep a list of preopened convenience libraries to check
+	        # that they are being used correctly in the link pass.
+	        test -z "$libdir" && \
+	          func_append dlpreconveniencelibs " $dir/$old_library"
+	      fi
+	    ;;
+	    * )
+	      # Prefer using a static library (so that no silly _DYNAMIC symbols
+	      # are required to link).
+	      if test -n "$old_library"; then
+	        func_append newdlprefiles " $dir/$old_library"
+	        # Keep a list of preopened convenience libraries to check
+	        # that they are being used correctly in the link pass.
+	        test -z "$libdir" && \
+	          func_append dlpreconveniencelibs " $dir/$old_library"
+	      # Otherwise, use the dlname, so that lt_dlopen finds it.
+	      elif test -n "$dlname"; then
+	        func_append newdlprefiles " $dir/$dlname"
+	      else
+	        func_append newdlprefiles " $dir/$linklib"
+	      fi
+	    ;;
+	  esac
+	fi # $pass = dlpreopen
+
+	if test -z "$libdir"; then
+	  # Link the convenience library
+	  if test "$linkmode" = lib; then
+	    deplibs="$dir/$old_library $deplibs"
+	  elif test "$linkmode,$pass" = "prog,link"; then
+	    compile_deplibs="$dir/$old_library $compile_deplibs"
+	    finalize_deplibs="$dir/$old_library $finalize_deplibs"
+	  else
+	    deplibs="$lib $deplibs" # used for prog,scan pass
+	  fi
+	  continue
+	fi
+
+
+	if test "$linkmode" = prog && test "$pass" != link; then
+	  func_append newlib_search_path " $ladir"
+	  deplibs="$lib $deplibs"
+
+	  linkalldeplibs=no
+	  if test "$link_all_deplibs" != no || test -z "$library_names" ||
+	     test "$build_libtool_libs" = no; then
+	    linkalldeplibs=yes
+	  fi
+
+	  tmp_libs=
+	  for deplib in $dependency_libs; do
+	    case $deplib in
+	    -L*) func_stripname '-L' '' "$deplib"
+	         func_resolve_sysroot "$func_stripname_result"
+	         func_append newlib_search_path " $func_resolve_sysroot_result"
+		 ;;
+	    esac
+	    # Need to link against all dependency_libs?
+	    if test "$linkalldeplibs" = yes; then
+	      deplibs="$deplib $deplibs"
+	    else
+	      # Need to hardcode shared library paths
+	      # or/and link against static libraries
+	      newdependency_libs="$deplib $newdependency_libs"
+	    fi
+	    if $opt_preserve_dup_deps ; then
+	      case "$tmp_libs " in
+	      *" $deplib "*) func_append specialdeplibs " $deplib" ;;
+	      esac
+	    fi
+	    func_append tmp_libs " $deplib"
+	  done # for deplib
+	  continue
+	fi # $linkmode = prog...
+
+	if test "$linkmode,$pass" = "prog,link"; then
+	  if test -n "$library_names" &&
+	     { { test "$prefer_static_libs" = no ||
+	         test "$prefer_static_libs,$installed" = "built,yes"; } ||
+	       test -z "$old_library"; }; then
+	    # We need to hardcode the library path
+	    if test -n "$shlibpath_var" && test -z "$avoidtemprpath" ; then
+	      # Make sure the rpath contains only unique directories.
+	      case "$temp_rpath:" in
+	      *"$absdir:"*) ;;
+	      *) func_append temp_rpath "$absdir:" ;;
+	      esac
+	    fi
+
+	    # Hardcode the library path.
+	    # Skip directories that are in the system default run-time
+	    # search path.
+	    case " $sys_lib_dlsearch_path " in
+	    *" $absdir "*) ;;
+	    *)
+	      case "$compile_rpath " in
+	      *" $absdir "*) ;;
+	      *) func_append compile_rpath " $absdir" ;;
+	      esac
+	      ;;
+	    esac
+	    case " $sys_lib_dlsearch_path " in
+	    *" $libdir "*) ;;
+	    *)
+	      case "$finalize_rpath " in
+	      *" $libdir "*) ;;
+	      *) func_append finalize_rpath " $libdir" ;;
+	      esac
+	      ;;
+	    esac
+	  fi # $linkmode,$pass = prog,link...
+
+	  if test "$alldeplibs" = yes &&
+	     { test "$deplibs_check_method" = pass_all ||
+	       { test "$build_libtool_libs" = yes &&
+		 test -n "$library_names"; }; }; then
+	    # We only need to search for static libraries
+	    continue
+	  fi
+	fi
+
+	link_static=no # Whether the deplib will be linked statically
+	use_static_libs=$prefer_static_libs
+	if test "$use_static_libs" = built && test "$installed" = yes; then
+	  use_static_libs=no
+	fi
+	if test -n "$library_names" &&
+	   { test "$use_static_libs" = no || test -z "$old_library"; }; then
+	  case $host in
+	  *cygwin* | *mingw* | *cegcc*)
+	      # No point in relinking DLLs because paths are not encoded
+	      func_append notinst_deplibs " $lib"
+	      need_relink=no
+	    ;;
+	  *)
+	    if test "$installed" = no; then
+	      func_append notinst_deplibs " $lib"
+	      need_relink=yes
+	    fi
+	    ;;
+	  esac
+	  # This is a shared library
+
+	  # Warn about portability, can't link against -module's on some
+	  # systems (darwin).  Don't bleat about dlopened modules though!
+	  dlopenmodule=""
+	  for dlpremoduletest in $dlprefiles; do
+	    if test "X$dlpremoduletest" = "X$lib"; then
+	      dlopenmodule="$dlpremoduletest"
+	      break
+	    fi
+	  done
+	  if test -z "$dlopenmodule" && test "$shouldnotlink" = yes && test "$pass" = link; then
+	    echo
+	    if test "$linkmode" = prog; then
+	      $ECHO "*** Warning: Linking the executable $output against the loadable module"
+	    else
+	      $ECHO "*** Warning: Linking the shared library $output against the loadable module"
+	    fi
+	    $ECHO "*** $linklib is not portable!"
+	  fi
+	  if test "$linkmode" = lib &&
+	     test "$hardcode_into_libs" = yes; then
+	    # Hardcode the library path.
+	    # Skip directories that are in the system default run-time
+	    # search path.
+	    case " $sys_lib_dlsearch_path " in
+	    *" $absdir "*) ;;
+	    *)
+	      case "$compile_rpath " in
+	      *" $absdir "*) ;;
+	      *) func_append compile_rpath " $absdir" ;;
+	      esac
+	      ;;
+	    esac
+	    case " $sys_lib_dlsearch_path " in
+	    *" $libdir "*) ;;
+	    *)
+	      case "$finalize_rpath " in
+	      *" $libdir "*) ;;
+	      *) func_append finalize_rpath " $libdir" ;;
+	      esac
+	      ;;
+	    esac
+	  fi
+
+	  if test -n "$old_archive_from_expsyms_cmds"; then
+	    # figure out the soname
+	    set dummy $library_names
+	    shift
+	    realname="$1"
+	    shift
+	    libname=`eval "\\$ECHO \"$libname_spec\""`
+	    # use dlname if we got it. it's perfectly good, no?
+	    if test -n "$dlname"; then
+	      soname="$dlname"
+	    elif test -n "$soname_spec"; then
+	      # bleh windows
+	      case $host in
+	      *cygwin* | mingw* | *cegcc*)
+	        func_arith $current - $age
+		major=$func_arith_result
+		versuffix="-$major"
+		;;
+	      esac
+	      eval soname=\"$soname_spec\"
+	    else
+	      soname="$realname"
+	    fi
+
+	    # Make a new name for the extract_expsyms_cmds to use
+	    soroot="$soname"
+	    func_basename "$soroot"
+	    soname="$func_basename_result"
+	    func_stripname 'lib' '.dll' "$soname"
+	    newlib=libimp-$func_stripname_result.a
+
+	    # If the library has no export list, then create one now
+	    if test -f "$output_objdir/$soname-def"; then :
+	    else
+	      func_verbose "extracting exported symbol list from \`$soname'"
+	      func_execute_cmds "$extract_expsyms_cmds" 'exit $?'
+	    fi
+
+	    # Create $newlib
+	    if test -f "$output_objdir/$newlib"; then :; else
+	      func_verbose "generating import library for \`$soname'"
+	      func_execute_cmds "$old_archive_from_expsyms_cmds" 'exit $?'
+	    fi
+	    # make sure the library variables are pointing to the new library
+	    dir=$output_objdir
+	    linklib=$newlib
+	  fi # test -n "$old_archive_from_expsyms_cmds"
+
+	  if test "$linkmode" = prog || test "$opt_mode" != relink; then
+	    add_shlibpath=
+	    add_dir=
+	    add=
+	    lib_linked=yes
+	    case $hardcode_action in
+	    immediate | unsupported)
+	      if test "$hardcode_direct" = no; then
+		add="$dir/$linklib"
+		case $host in
+		  *-*-sco3.2v5.0.[024]*) add_dir="-L$dir" ;;
+		  *-*-sysv4*uw2*) add_dir="-L$dir" ;;
+		  *-*-sysv5OpenUNIX* | *-*-sysv5UnixWare7.[01].[10]* | \
+		    *-*-unixware7*) add_dir="-L$dir" ;;
+		  *-*-darwin* )
+		    # if the lib is a (non-dlopened) module then we can not
+		    # link against it, someone is ignoring the earlier warnings
+		    if /usr/bin/file -L $add 2> /dev/null |
+			 $GREP ": [^:]* bundle" >/dev/null ; then
+		      if test "X$dlopenmodule" != "X$lib"; then
+			$ECHO "*** Warning: lib $linklib is a module, not a shared library"
+			if test -z "$old_library" ; then
+			  echo
+			  echo "*** And there doesn't seem to be a static archive available"
+			  echo "*** The link will probably fail, sorry"
+			else
+			  add="$dir/$old_library"
+			fi
+		      elif test -n "$old_library"; then
+			add="$dir/$old_library"
+		      fi
+		    fi
+		esac
+	      elif test "$hardcode_minus_L" = no; then
+		case $host in
+		*-*-sunos*) add_shlibpath="$dir" ;;
+		esac
+		add_dir="-L$dir"
+		add="-l$name"
+	      elif test "$hardcode_shlibpath_var" = no; then
+		add_shlibpath="$dir"
+		add="-l$name"
+	      else
+		lib_linked=no
+	      fi
+	      ;;
+	    relink)
+	      if test "$hardcode_direct" = yes &&
+	         test "$hardcode_direct_absolute" = no; then
+		add="$dir/$linklib"
+	      elif test "$hardcode_minus_L" = yes; then
+		add_dir="-L$absdir"
+		# Try looking first in the location we're being installed to.
+		if test -n "$inst_prefix_dir"; then
+		  case $libdir in
+		    [\\/]*)
+		      func_append add_dir " -L$inst_prefix_dir$libdir"
+		      ;;
+		  esac
+		fi
+		add="-l$name"
+	      elif test "$hardcode_shlibpath_var" = yes; then
+		add_shlibpath="$dir"
+		add="-l$name"
+	      else
+		lib_linked=no
+	      fi
+	      ;;
+	    *) lib_linked=no ;;
+	    esac
+
+	    if test "$lib_linked" != yes; then
+	      func_fatal_configuration "unsupported hardcode properties"
+	    fi
+
+	    if test -n "$add_shlibpath"; then
+	      case :$compile_shlibpath: in
+	      *":$add_shlibpath:"*) ;;
+	      *) func_append compile_shlibpath "$add_shlibpath:" ;;
+	      esac
+	    fi
+	    if test "$linkmode" = prog; then
+	      test -n "$add_dir" && compile_deplibs="$add_dir $compile_deplibs"
+	      test -n "$add" && compile_deplibs="$add $compile_deplibs"
+	    else
+	      test -n "$add_dir" && deplibs="$add_dir $deplibs"
+	      test -n "$add" && deplibs="$add $deplibs"
+	      if test "$hardcode_direct" != yes &&
+		 test "$hardcode_minus_L" != yes &&
+		 test "$hardcode_shlibpath_var" = yes; then
+		case :$finalize_shlibpath: in
+		*":$libdir:"*) ;;
+		*) func_append finalize_shlibpath "$libdir:" ;;
+		esac
+	      fi
+	    fi
+	  fi
+
+	  if test "$linkmode" = prog || test "$opt_mode" = relink; then
+	    add_shlibpath=
+	    add_dir=
+	    add=
+	    # Finalize command for both is simple: just hardcode it.
+	    if test "$hardcode_direct" = yes &&
+	       test "$hardcode_direct_absolute" = no; then
+	      add="$libdir/$linklib"
+	    elif test "$hardcode_minus_L" = yes; then
+	      add_dir="-L$libdir"
+	      add="-l$name"
+	    elif test "$hardcode_shlibpath_var" = yes; then
+	      case :$finalize_shlibpath: in
+	      *":$libdir:"*) ;;
+	      *) func_append finalize_shlibpath "$libdir:" ;;
+	      esac
+	      add="-l$name"
+	    elif test "$hardcode_automatic" = yes; then
+	      if test -n "$inst_prefix_dir" &&
+		 test -f "$inst_prefix_dir$libdir/$linklib" ; then
+		add="$inst_prefix_dir$libdir/$linklib"
+	      else
+		add="$libdir/$linklib"
+	      fi
+	    else
+	      # We cannot seem to hardcode it, guess we'll fake it.
+	      add_dir="-L$libdir"
+	      # Try looking first in the location we're being installed to.
+	      if test -n "$inst_prefix_dir"; then
+		case $libdir in
+		  [\\/]*)
+		    func_append add_dir " -L$inst_prefix_dir$libdir"
+		    ;;
+		esac
+	      fi
+	      add="-l$name"
+	    fi
+
+	    if test "$linkmode" = prog; then
+	      test -n "$add_dir" && finalize_deplibs="$add_dir $finalize_deplibs"
+	      test -n "$add" && finalize_deplibs="$add $finalize_deplibs"
+	    else
+	      test -n "$add_dir" && deplibs="$add_dir $deplibs"
+	      test -n "$add" && deplibs="$add $deplibs"
+	    fi
+	  fi
+	elif test "$linkmode" = prog; then
+	  # Here we assume that one of hardcode_direct or hardcode_minus_L
+	  # is not unsupported.  This is valid on all known static and
+	  # shared platforms.
+	  if test "$hardcode_direct" != unsupported; then
+	    test -n "$old_library" && linklib="$old_library"
+	    compile_deplibs="$dir/$linklib $compile_deplibs"
+	    finalize_deplibs="$dir/$linklib $finalize_deplibs"
+	  else
+	    compile_deplibs="-l$name -L$dir $compile_deplibs"
+	    finalize_deplibs="-l$name -L$dir $finalize_deplibs"
+	  fi
+	elif test "$build_libtool_libs" = yes; then
+	  # Not a shared library
+	  if test "$deplibs_check_method" != pass_all; then
+	    # We're trying link a shared library against a static one
+	    # but the system doesn't support it.
+
+	    # Just print a warning and add the library to dependency_libs so
+	    # that the program can be linked against the static library.
+	    echo
+	    $ECHO "*** Warning: This system can not link to static lib archive $lib."
+	    echo "*** I have the capability to make that library automatically link in when"
+	    echo "*** you link to this library.  But I can only do this if you have a"
+	    echo "*** shared version of the library, which you do not appear to have."
+	    if test "$module" = yes; then
+	      echo "*** But as you try to build a module library, libtool will still create "
+	      echo "*** a static module, that should work as long as the dlopening application"
+	      echo "*** is linked with the -dlopen flag to resolve symbols at runtime."
+	      if test -z "$global_symbol_pipe"; then
+		echo
+		echo "*** However, this would only work if libtool was able to extract symbol"
+		echo "*** lists from a program, using \`nm' or equivalent, but libtool could"
+		echo "*** not find such a program.  So, this module is probably useless."
+		echo "*** \`nm' from GNU binutils and a full rebuild may help."
+	      fi
+	      if test "$build_old_libs" = no; then
+		build_libtool_libs=module
+		build_old_libs=yes
+	      else
+		build_libtool_libs=no
+	      fi
+	    fi
+	  else
+	    deplibs="$dir/$old_library $deplibs"
+	    link_static=yes
+	  fi
+	fi # link shared/static library?
+
+	if test "$linkmode" = lib; then
+	  if test -n "$dependency_libs" &&
+	     { test "$hardcode_into_libs" != yes ||
+	       test "$build_old_libs" = yes ||
+	       test "$link_static" = yes; }; then
+	    # Extract -R from dependency_libs
+	    temp_deplibs=
+	    for libdir in $dependency_libs; do
+	      case $libdir in
+	      -R*) func_stripname '-R' '' "$libdir"
+	           temp_xrpath=$func_stripname_result
+		   case " $xrpath " in
+		   *" $temp_xrpath "*) ;;
+		   *) func_append xrpath " $temp_xrpath";;
+		   esac;;
+	      *) func_append temp_deplibs " $libdir";;
+	      esac
+	    done
+	    dependency_libs="$temp_deplibs"
+	  fi
+
+	  func_append newlib_search_path " $absdir"
+	  # Link against this library
+	  test "$link_static" = no && newdependency_libs="$abs_ladir/$laname $newdependency_libs"
+	  # ... and its dependency_libs
+	  tmp_libs=
+	  for deplib in $dependency_libs; do
+	    newdependency_libs="$deplib $newdependency_libs"
+	    case $deplib in
+              -L*) func_stripname '-L' '' "$deplib"
+                   func_resolve_sysroot "$func_stripname_result";;
+              *) func_resolve_sysroot "$deplib" ;;
+            esac
+	    if $opt_preserve_dup_deps ; then
+	      case "$tmp_libs " in
+	      *" $func_resolve_sysroot_result "*)
+                func_append specialdeplibs " $func_resolve_sysroot_result" ;;
+	      esac
+	    fi
+	    func_append tmp_libs " $func_resolve_sysroot_result"
+	  done
+
+	  if test "$link_all_deplibs" != no; then
+	    # Add the search paths of all dependency libraries
+	    for deplib in $dependency_libs; do
+	      path=
+	      case $deplib in
+	      -L*) path="$deplib" ;;
+	      *.la)
+	        func_resolve_sysroot "$deplib"
+	        deplib=$func_resolve_sysroot_result
+	        func_dirname "$deplib" "" "."
+		dir=$func_dirname_result
+		# We need an absolute path.
+		case $dir in
+		[\\/]* | [A-Za-z]:[\\/]*) absdir="$dir" ;;
+		*)
+		  absdir=`cd "$dir" && pwd`
+		  if test -z "$absdir"; then
+		    func_warning "cannot determine absolute directory name of \`$dir'"
+		    absdir="$dir"
+		  fi
+		  ;;
+		esac
+		if $GREP "^installed=no" $deplib > /dev/null; then
+		case $host in
+		*-*-darwin*)
+		  depdepl=
+		  eval deplibrary_names=`${SED} -n -e 's/^library_names=\(.*\)$/\1/p' $deplib`
+		  if test -n "$deplibrary_names" ; then
+		    for tmp in $deplibrary_names ; do
+		      depdepl=$tmp
+		    done
+		    if test -f "$absdir/$objdir/$depdepl" ; then
+		      depdepl="$absdir/$objdir/$depdepl"
+		      darwin_install_name=`${OTOOL} -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'`
+                      if test -z "$darwin_install_name"; then
+                          darwin_install_name=`${OTOOL64} -L $depdepl  | awk '{if (NR == 2) {print $1;exit}}'`
+                      fi
+		      func_append compiler_flags " ${wl}-dylib_file ${wl}${darwin_install_name}:${depdepl}"
+		      func_append linker_flags " -dylib_file ${darwin_install_name}:${depdepl}"
+		      path=
+		    fi
+		  fi
+		  ;;
+		*)
+		  path="-L$absdir/$objdir"
+		  ;;
+		esac
+		else
+		  eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib`
+		  test -z "$libdir" && \
+		    func_fatal_error "\`$deplib' is not a valid libtool archive"
+		  test "$absdir" != "$libdir" && \
+		    func_warning "\`$deplib' seems to be moved"
+
+		  path="-L$absdir"
+		fi
+		;;
+	      esac
+	      case " $deplibs " in
+	      *" $path "*) ;;
+	      *) deplibs="$path $deplibs" ;;
+	      esac
+	    done
+	  fi # link_all_deplibs != no
+	fi # linkmode = lib
+      done # for deplib in $libs
+      if test "$pass" = link; then
+	if test "$linkmode" = "prog"; then
+	  compile_deplibs="$new_inherited_linker_flags $compile_deplibs"
+	  finalize_deplibs="$new_inherited_linker_flags $finalize_deplibs"
+	else
+	  compiler_flags="$compiler_flags "`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
+	fi
+      fi
+      dependency_libs="$newdependency_libs"
+      if test "$pass" = dlpreopen; then
+	# Link the dlpreopened libraries before other libraries
+	for deplib in $save_deplibs; do
+	  deplibs="$deplib $deplibs"
+	done
+      fi
+      if test "$pass" != dlopen; then
+	if test "$pass" != conv; then
+	  # Make sure lib_search_path contains only unique directories.
+	  lib_search_path=
+	  for dir in $newlib_search_path; do
+	    case "$lib_search_path " in
+	    *" $dir "*) ;;
+	    *) func_append lib_search_path " $dir" ;;
+	    esac
+	  done
+	  newlib_search_path=
+	fi
+
+	if test "$linkmode,$pass" != "prog,link"; then
+	  vars="deplibs"
+	else
+	  vars="compile_deplibs finalize_deplibs"
+	fi
+	for var in $vars dependency_libs; do
+	  # Add libraries to $var in reverse order
+	  eval tmp_libs=\"\$$var\"
+	  new_libs=
+	  for deplib in $tmp_libs; do
+	    # FIXME: Pedantically, this is the right thing to do, so
+	    #        that some nasty dependency loop isn't accidentally
+	    #        broken:
+	    #new_libs="$deplib $new_libs"
+	    # Pragmatically, this seems to cause very few problems in
+	    # practice:
+	    case $deplib in
+	    -L*) new_libs="$deplib $new_libs" ;;
+	    -R*) ;;
+	    *)
+	      # And here is the reason: when a library appears more
+	      # than once as an explicit dependence of a library, or
+	      # is implicitly linked in more than once by the
+	      # compiler, it is considered special, and multiple
+	      # occurrences thereof are not removed.  Compare this
+	      # with having the same library being listed as a
+	      # dependency of multiple other libraries: in this case,
+	      # we know (pedantically, we assume) the library does not
+	      # need to be listed more than once, so we keep only the
+	      # last copy.  This is not always right, but it is rare
+	      # enough that we require users that really mean to play
+	      # such unportable linking tricks to link the library
+	      # using -Wl,-lname, so that libtool does not consider it
+	      # for duplicate removal.
+	      case " $specialdeplibs " in
+	      *" $deplib "*) new_libs="$deplib $new_libs" ;;
+	      *)
+		case " $new_libs " in
+		*" $deplib "*) ;;
+		*) new_libs="$deplib $new_libs" ;;
+		esac
+		;;
+	      esac
+	      ;;
+	    esac
+	  done
+	  tmp_libs=
+	  for deplib in $new_libs; do
+	    case $deplib in
+	    -L*)
+	      case " $tmp_libs " in
+	      *" $deplib "*) ;;
+	      *) func_append tmp_libs " $deplib" ;;
+	      esac
+	      ;;
+	    *) func_append tmp_libs " $deplib" ;;
+	    esac
+	  done
+	  eval $var=\"$tmp_libs\"
+	done # for var
+      fi
+      # Last step: remove runtime libs from dependency_libs
+      # (they stay in deplibs)
+      tmp_libs=
+      for i in $dependency_libs ; do
+	case " $predeps $postdeps $compiler_lib_search_path " in
+	*" $i "*)
+	  i=""
+	  ;;
+	esac
+	if test -n "$i" ; then
+	  func_append tmp_libs " $i"
+	fi
+      done
+      dependency_libs=$tmp_libs
+    done # for pass
+    if test "$linkmode" = prog; then
+      dlfiles="$newdlfiles"
+    fi
+    if test "$linkmode" = prog || test "$linkmode" = lib; then
+      dlprefiles="$newdlprefiles"
+    fi
+
+    case $linkmode in
+    oldlib)
+      if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then
+	func_warning "\`-dlopen' is ignored for archives"
+      fi
+
+      case " $deplibs" in
+      *\ -l* | *\ -L*)
+	func_warning "\`-l' and \`-L' are ignored for archives" ;;
+      esac
+
+      test -n "$rpath" && \
+	func_warning "\`-rpath' is ignored for archives"
+
+      test -n "$xrpath" && \
+	func_warning "\`-R' is ignored for archives"
+
+      test -n "$vinfo" && \
+	func_warning "\`-version-info/-version-number' is ignored for archives"
+
+      test -n "$release" && \
+	func_warning "\`-release' is ignored for archives"
+
+      test -n "$export_symbols$export_symbols_regex" && \
+	func_warning "\`-export-symbols' is ignored for archives"
+
+      # Now set the variables for building old libraries.
+      build_libtool_libs=no
+      oldlibs="$output"
+      func_append objs "$old_deplibs"
+      ;;
+
+    lib)
+      # Make sure we only generate libraries of the form `libNAME.la'.
+      case $outputname in
+      lib*)
+	func_stripname 'lib' '.la' "$outputname"
+	name=$func_stripname_result
+	eval shared_ext=\"$shrext_cmds\"
+	eval libname=\"$libname_spec\"
+	;;
+      *)
+	test "$module" = no && \
+	  func_fatal_help "libtool library \`$output' must begin with \`lib'"
+
+	if test "$need_lib_prefix" != no; then
+	  # Add the "lib" prefix for modules if required
+	  func_stripname '' '.la' "$outputname"
+	  name=$func_stripname_result
+	  eval shared_ext=\"$shrext_cmds\"
+	  eval libname=\"$libname_spec\"
+	else
+	  func_stripname '' '.la' "$outputname"
+	  libname=$func_stripname_result
+	fi
+	;;
+      esac
+
+      if test -n "$objs"; then
+	if test "$deplibs_check_method" != pass_all; then
+	  func_fatal_error "cannot build libtool library \`$output' from non-libtool objects on this host:$objs"
+	else
+	  echo
+	  $ECHO "*** Warning: Linking the shared library $output against the non-libtool"
+	  $ECHO "*** objects $objs is not portable!"
+	  func_append libobjs " $objs"
+	fi
+      fi
+
+      test "$dlself" != no && \
+	func_warning "\`-dlopen self' is ignored for libtool libraries"
+
+      set dummy $rpath
+      shift
+      test "$#" -gt 1 && \
+	func_warning "ignoring multiple \`-rpath's for a libtool library"
+
+      install_libdir="$1"
+
+      oldlibs=
+      if test -z "$rpath"; then
+	if test "$build_libtool_libs" = yes; then
+	  # Building a libtool convenience library.
+	  # Some compilers have problems with a `.al' extension so
+	  # convenience libraries should have the same extension an
+	  # archive normally would.
+	  oldlibs="$output_objdir/$libname.$libext $oldlibs"
+	  build_libtool_libs=convenience
+	  build_old_libs=yes
+	fi
+
+	test -n "$vinfo" && \
+	  func_warning "\`-version-info/-version-number' is ignored for convenience libraries"
+
+	test -n "$release" && \
+	  func_warning "\`-release' is ignored for convenience libraries"
+      else
+
+	# Parse the version information argument.
+	save_ifs="$IFS"; IFS=':'
+	set dummy $vinfo 0 0 0
+	shift
+	IFS="$save_ifs"
+
+	test -n "$7" && \
+	  func_fatal_help "too many parameters to \`-version-info'"
+
+	# convert absolute version numbers to libtool ages
+	# this retains compatibility with .la files and attempts
+	# to make the code below a bit more comprehensible
+
+	case $vinfo_number in
+	yes)
+	  number_major="$1"
+	  number_minor="$2"
+	  number_revision="$3"
+	  #
+	  # There are really only two kinds -- those that
+	  # use the current revision as the major version
+	  # and those that subtract age and use age as
+	  # a minor version.  But, then there is irix
+	  # which has an extra 1 added just for fun
+	  #
+	  case $version_type in
+	  # correct linux to gnu/linux during the next big refactor
+	  darwin|linux|osf|windows|none)
+	    func_arith $number_major + $number_minor
+	    current=$func_arith_result
+	    age="$number_minor"
+	    revision="$number_revision"
+	    ;;
+	  freebsd-aout|freebsd-elf|qnx|sunos)
+	    current="$number_major"
+	    revision="$number_minor"
+	    age="0"
+	    ;;
+	  irix|nonstopux)
+	    func_arith $number_major + $number_minor
+	    current=$func_arith_result
+	    age="$number_minor"
+	    revision="$number_minor"
+	    lt_irix_increment=no
+	    ;;
+	  esac
+	  ;;
+	no)
+	  current="$1"
+	  revision="$2"
+	  age="$3"
+	  ;;
+	esac
+
+	# Check that each of the things are valid numbers.
+	case $current in
+	0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;;
+	*)
+	  func_error "CURRENT \`$current' must be a nonnegative integer"
+	  func_fatal_error "\`$vinfo' is not valid version information"
+	  ;;
+	esac
+
+	case $revision in
+	0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;;
+	*)
+	  func_error "REVISION \`$revision' must be a nonnegative integer"
+	  func_fatal_error "\`$vinfo' is not valid version information"
+	  ;;
+	esac
+
+	case $age in
+	0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;;
+	*)
+	  func_error "AGE \`$age' must be a nonnegative integer"
+	  func_fatal_error "\`$vinfo' is not valid version information"
+	  ;;
+	esac
+
+	if test "$age" -gt "$current"; then
+	  func_error "AGE \`$age' is greater than the current interface number \`$current'"
+	  func_fatal_error "\`$vinfo' is not valid version information"
+	fi
+
+	# Calculate the version variables.
+	major=
+	versuffix=
+	verstring=
+	case $version_type in
+	none) ;;
+
+	darwin)
+	  # Like Linux, but with the current version available in
+	  # verstring for coding it into the library header
+	  func_arith $current - $age
+	  major=.$func_arith_result
+	  versuffix="$major.$age.$revision"
+	  # Darwin ld doesn't like 0 for these options...
+	  func_arith $current + 1
+	  minor_current=$func_arith_result
+	  xlcverstring="${wl}-compatibility_version ${wl}$minor_current ${wl}-current_version ${wl}$minor_current.$revision"
+	  verstring="-compatibility_version $minor_current -current_version $minor_current.$revision"
+	  ;;
+
+	freebsd-aout)
+	  major=".$current"
+	  versuffix=".$current.$revision";
+	  ;;
+
+	freebsd-elf)
+	  major=".$current"
+	  versuffix=".$current"
+	  ;;
+
+	irix | nonstopux)
+	  if test "X$lt_irix_increment" = "Xno"; then
+	    func_arith $current - $age
+	  else
+	    func_arith $current - $age + 1
+	  fi
+	  major=$func_arith_result
+
+	  case $version_type in
+	    nonstopux) verstring_prefix=nonstopux ;;
+	    *)         verstring_prefix=sgi ;;
+	  esac
+	  verstring="$verstring_prefix$major.$revision"
+
+	  # Add in all the interfaces that we are compatible with.
+	  loop=$revision
+	  while test "$loop" -ne 0; do
+	    func_arith $revision - $loop
+	    iface=$func_arith_result
+	    func_arith $loop - 1
+	    loop=$func_arith_result
+	    verstring="$verstring_prefix$major.$iface:$verstring"
+	  done
+
+	  # Before this point, $major must not contain `.'.
+	  major=.$major
+	  versuffix="$major.$revision"
+	  ;;
+
+	linux) # correct to gnu/linux during the next big refactor
+	  func_arith $current - $age
+	  major=.$func_arith_result
+	  versuffix="$major.$age.$revision"
+	  ;;
+
+	osf)
+	  func_arith $current - $age
+	  major=.$func_arith_result
+	  versuffix=".$current.$age.$revision"
+	  verstring="$current.$age.$revision"
+
+	  # Add in all the interfaces that we are compatible with.
+	  loop=$age
+	  while test "$loop" -ne 0; do
+	    func_arith $current - $loop
+	    iface=$func_arith_result
+	    func_arith $loop - 1
+	    loop=$func_arith_result
+	    verstring="$verstring:${iface}.0"
+	  done
+
+	  # Make executables depend on our current version.
+	  func_append verstring ":${current}.0"
+	  ;;
+
+	qnx)
+	  major=".$current"
+	  versuffix=".$current"
+	  ;;
+
+	sunos)
+	  major=".$current"
+	  versuffix=".$current.$revision"
+	  ;;
+
+	windows)
+	  # Use '-' rather than '.', since we only want one
+	  # extension on DOS 8.3 filesystems.
+	  func_arith $current - $age
+	  major=$func_arith_result
+	  versuffix="-$major"
+	  ;;
+
+	*)
+	  func_fatal_configuration "unknown library version type \`$version_type'"
+	  ;;
+	esac
+
+	# Clear the version info if we defaulted, and they specified a release.
+	if test -z "$vinfo" && test -n "$release"; then
+	  major=
+	  case $version_type in
+	  darwin)
+	    # we can't check for "0.0" in archive_cmds due to quoting
+	    # problems, so we reset it completely
+	    verstring=
+	    ;;
+	  *)
+	    verstring="0.0"
+	    ;;
+	  esac
+	  if test "$need_version" = no; then
+	    versuffix=
+	  else
+	    versuffix=".0.0"
+	  fi
+	fi
+
+	# Remove version info from name if versioning should be avoided
+	if test "$avoid_version" = yes && test "$need_version" = no; then
+	  major=
+	  versuffix=
+	  verstring=""
+	fi
+
+	# Check to see if the archive will have undefined symbols.
+	if test "$allow_undefined" = yes; then
+	  if test "$allow_undefined_flag" = unsupported; then
+	    func_warning "undefined symbols not allowed in $host shared libraries"
+	    build_libtool_libs=no
+	    build_old_libs=yes
+	  fi
+	else
+	  # Don't allow undefined symbols.
+	  allow_undefined_flag="$no_undefined_flag"
+	fi
+
+      fi
+
+      func_generate_dlsyms "$libname" "$libname" "yes"
+      func_append libobjs " $symfileobj"
+      test "X$libobjs" = "X " && libobjs=
+
+      if test "$opt_mode" != relink; then
+	# Remove our outputs, but don't remove object files since they
+	# may have been created when compiling PIC objects.
+	removelist=
+	tempremovelist=`$ECHO "$output_objdir/*"`
+	for p in $tempremovelist; do
+	  case $p in
+	    *.$objext | *.gcno)
+	       ;;
+	    $output_objdir/$outputname | $output_objdir/$libname.* | $output_objdir/${libname}${release}.*)
+	       if test "X$precious_files_regex" != "X"; then
+		 if $ECHO "$p" | $EGREP -e "$precious_files_regex" >/dev/null 2>&1
+		 then
+		   continue
+		 fi
+	       fi
+	       func_append removelist " $p"
+	       ;;
+	    *) ;;
+	  esac
+	done
+	test -n "$removelist" && \
+	  func_show_eval "${RM}r \$removelist"
+      fi
+
+      # Now set the variables for building old libraries.
+      if test "$build_old_libs" = yes && test "$build_libtool_libs" != convenience ; then
+	func_append oldlibs " $output_objdir/$libname.$libext"
+
+	# Transform .lo files to .o files.
+	oldobjs="$objs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.${libext}$/d; $lo2o" | $NL2SP`
+      fi
+
+      # Eliminate all temporary directories.
+      #for path in $notinst_path; do
+      #	lib_search_path=`$ECHO "$lib_search_path " | $SED "s% $path % %g"`
+      #	deplibs=`$ECHO "$deplibs " | $SED "s% -L$path % %g"`
+      #	dependency_libs=`$ECHO "$dependency_libs " | $SED "s% -L$path % %g"`
+      #done
+
+      if test -n "$xrpath"; then
+	# If the user specified any rpath flags, then add them.
+	temp_xrpath=
+	for libdir in $xrpath; do
+	  func_replace_sysroot "$libdir"
+	  func_append temp_xrpath " -R$func_replace_sysroot_result"
+	  case "$finalize_rpath " in
+	  *" $libdir "*) ;;
+	  *) func_append finalize_rpath " $libdir" ;;
+	  esac
+	done
+	if test "$hardcode_into_libs" != yes || test "$build_old_libs" = yes; then
+	  dependency_libs="$temp_xrpath $dependency_libs"
+	fi
+      fi
+
+      # Make sure dlfiles contains only unique files that won't be dlpreopened
+      old_dlfiles="$dlfiles"
+      dlfiles=
+      for lib in $old_dlfiles; do
+	case " $dlprefiles $dlfiles " in
+	*" $lib "*) ;;
+	*) func_append dlfiles " $lib" ;;
+	esac
+      done
+
+      # Make sure dlprefiles contains only unique files
+      old_dlprefiles="$dlprefiles"
+      dlprefiles=
+      for lib in $old_dlprefiles; do
+	case "$dlprefiles " in
+	*" $lib "*) ;;
+	*) func_append dlprefiles " $lib" ;;
+	esac
+      done
+
+      if test "$build_libtool_libs" = yes; then
+	if test -n "$rpath"; then
+	  case $host in
+	  *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos* | *-cegcc* | *-*-haiku*)
+	    # these systems don't actually have a c library (as such)!
+	    ;;
+	  *-*-rhapsody* | *-*-darwin1.[012])
+	    # Rhapsody C library is in the System framework
+	    func_append deplibs " System.ltframework"
+	    ;;
+	  *-*-netbsd*)
+	    # Don't link with libc until the a.out ld.so is fixed.
+	    ;;
+	  *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*)
+	    # Do not include libc due to us having libc/libc_r.
+	    ;;
+	  *-*-sco3.2v5* | *-*-sco5v6*)
+	    # Causes problems with __ctype
+	    ;;
+	  *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*)
+	    # Compiler inserts libc in the correct place for threads to work
+	    ;;
+	  *)
+	    # Add libc to deplibs on all other systems if necessary.
+	    if test "$build_libtool_need_lc" = "yes"; then
+	      func_append deplibs " -lc"
+	    fi
+	    ;;
+	  esac
+	fi
+
+	# Transform deplibs into only deplibs that can be linked in shared.
+	name_save=$name
+	libname_save=$libname
+	release_save=$release
+	versuffix_save=$versuffix
+	major_save=$major
+	# I'm not sure if I'm treating the release correctly.  I think
+	# release should show up in the -l (ie -lgmp5) so we don't want to
+	# add it in twice.  Is that correct?
+	release=""
+	versuffix=""
+	major=""
+	newdeplibs=
+	droppeddeps=no
+	case $deplibs_check_method in
+	pass_all)
+	  # Don't check for shared/static.  Everything works.
+	  # This might be a little naive.  We might want to check
+	  # whether the library exists or not.  But this is on
+	  # osf3 & osf4 and I'm not really sure... Just
+	  # implementing what was already the behavior.
+	  newdeplibs=$deplibs
+	  ;;
+	test_compile)
+	  # This code stresses the "libraries are programs" paradigm to its
+	  # limits. Maybe even breaks it.  We compile a program, linking it
+	  # against the deplibs as a proxy for the library.  Then we can check
+	  # whether they linked in statically or dynamically with ldd.
+	  $opt_dry_run || $RM conftest.c
+	  cat > conftest.c <<EOF
+	  int main() { return 0; }
+EOF
+	  $opt_dry_run || $RM conftest
+	  if $LTCC $LTCFLAGS -o conftest conftest.c $deplibs; then
+	    ldd_output=`ldd conftest`
+	    for i in $deplibs; do
+	      case $i in
+	      -l*)
+		func_stripname -l '' "$i"
+		name=$func_stripname_result
+		if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
+		  case " $predeps $postdeps " in
+		  *" $i "*)
+		    func_append newdeplibs " $i"
+		    i=""
+		    ;;
+		  esac
+		fi
+		if test -n "$i" ; then
+		  libname=`eval "\\$ECHO \"$libname_spec\""`
+		  deplib_matches=`eval "\\$ECHO \"$library_names_spec\""`
+		  set dummy $deplib_matches; shift
+		  deplib_match=$1
+		  if test `expr "$ldd_output" : ".*$deplib_match"` -ne 0 ; then
+		    func_append newdeplibs " $i"
+		  else
+		    droppeddeps=yes
+		    echo
+		    $ECHO "*** Warning: dynamic linker does not accept needed library $i."
+		    echo "*** I have the capability to make that library automatically link in when"
+		    echo "*** you link to this library.  But I can only do this if you have a"
+		    echo "*** shared version of the library, which I believe you do not have"
+		    echo "*** because a test_compile did reveal that the linker did not use it for"
+		    echo "*** its dynamic dependency list that programs get resolved with at runtime."
+		  fi
+		fi
+		;;
+	      *)
+		func_append newdeplibs " $i"
+		;;
+	      esac
+	    done
+	  else
+	    # Error occurred in the first compile.  Let's try to salvage
+	    # the situation: Compile a separate program for each library.
+	    for i in $deplibs; do
+	      case $i in
+	      -l*)
+		func_stripname -l '' "$i"
+		name=$func_stripname_result
+		$opt_dry_run || $RM conftest
+		if $LTCC $LTCFLAGS -o conftest conftest.c $i; then
+		  ldd_output=`ldd conftest`
+		  if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
+		    case " $predeps $postdeps " in
+		    *" $i "*)
+		      func_append newdeplibs " $i"
+		      i=""
+		      ;;
+		    esac
+		  fi
+		  if test -n "$i" ; then
+		    libname=`eval "\\$ECHO \"$libname_spec\""`
+		    deplib_matches=`eval "\\$ECHO \"$library_names_spec\""`
+		    set dummy $deplib_matches; shift
+		    deplib_match=$1
+		    if test `expr "$ldd_output" : ".*$deplib_match"` -ne 0 ; then
+		      func_append newdeplibs " $i"
+		    else
+		      droppeddeps=yes
+		      echo
+		      $ECHO "*** Warning: dynamic linker does not accept needed library $i."
+		      echo "*** I have the capability to make that library automatically link in when"
+		      echo "*** you link to this library.  But I can only do this if you have a"
+		      echo "*** shared version of the library, which you do not appear to have"
+		      echo "*** because a test_compile did reveal that the linker did not use this one"
+		      echo "*** as a dynamic dependency that programs can get resolved with at runtime."
+		    fi
+		  fi
+		else
+		  droppeddeps=yes
+		  echo
+		  $ECHO "*** Warning!  Library $i is needed by this library but I was not able to"
+		  echo "*** make it link in!  You will probably need to install it or some"
+		  echo "*** library that it depends on before this library will be fully"
+		  echo "*** functional.  Installing it before continuing would be even better."
+		fi
+		;;
+	      *)
+		func_append newdeplibs " $i"
+		;;
+	      esac
+	    done
+	  fi
+	  ;;
+	file_magic*)
+	  set dummy $deplibs_check_method; shift
+	  file_magic_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"`
+	  for a_deplib in $deplibs; do
+	    case $a_deplib in
+	    -l*)
+	      func_stripname -l '' "$a_deplib"
+	      name=$func_stripname_result
+	      if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
+		case " $predeps $postdeps " in
+		*" $a_deplib "*)
+		  func_append newdeplibs " $a_deplib"
+		  a_deplib=""
+		  ;;
+		esac
+	      fi
+	      if test -n "$a_deplib" ; then
+		libname=`eval "\\$ECHO \"$libname_spec\""`
+		if test -n "$file_magic_glob"; then
+		  libnameglob=`func_echo_all "$libname" | $SED -e $file_magic_glob`
+		else
+		  libnameglob=$libname
+		fi
+		test "$want_nocaseglob" = yes && nocaseglob=`shopt -p nocaseglob`
+		for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do
+		  if test "$want_nocaseglob" = yes; then
+		    shopt -s nocaseglob
+		    potential_libs=`ls $i/$libnameglob[.-]* 2>/dev/null`
+		    $nocaseglob
+		  else
+		    potential_libs=`ls $i/$libnameglob[.-]* 2>/dev/null`
+		  fi
+		  for potent_lib in $potential_libs; do
+		      # Follow soft links.
+		      if ls -lLd "$potent_lib" 2>/dev/null |
+			 $GREP " -> " >/dev/null; then
+			continue
+		      fi
+		      # The statement above tries to avoid entering an
+		      # endless loop below, in case of cyclic links.
+		      # We might still enter an endless loop, since a link
+		      # loop can be closed while we follow links,
+		      # but so what?
+		      potlib="$potent_lib"
+		      while test -h "$potlib" 2>/dev/null; do
+			potliblink=`ls -ld $potlib | ${SED} 's/.* -> //'`
+			case $potliblink in
+			[\\/]* | [A-Za-z]:[\\/]*) potlib="$potliblink";;
+			*) potlib=`$ECHO "$potlib" | $SED 's,[^/]*$,,'`"$potliblink";;
+			esac
+		      done
+		      if eval $file_magic_cmd \"\$potlib\" 2>/dev/null |
+			 $SED -e 10q |
+			 $EGREP "$file_magic_regex" > /dev/null; then
+			func_append newdeplibs " $a_deplib"
+			a_deplib=""
+			break 2
+		      fi
+		  done
+		done
+	      fi
+	      if test -n "$a_deplib" ; then
+		droppeddeps=yes
+		echo
+		$ECHO "*** Warning: linker path does not have real file for library $a_deplib."
+		echo "*** I have the capability to make that library automatically link in when"
+		echo "*** you link to this library.  But I can only do this if you have a"
+		echo "*** shared version of the library, which you do not appear to have"
+		echo "*** because I did check the linker path looking for a file starting"
+		if test -z "$potlib" ; then
+		  $ECHO "*** with $libname but no candidates were found. (...for file magic test)"
+		else
+		  $ECHO "*** with $libname and none of the candidates passed a file format test"
+		  $ECHO "*** using a file magic. Last file checked: $potlib"
+		fi
+	      fi
+	      ;;
+	    *)
+	      # Add a -L argument.
+	      func_append newdeplibs " $a_deplib"
+	      ;;
+	    esac
+	  done # Gone through all deplibs.
+	  ;;
+	match_pattern*)
+	  set dummy $deplibs_check_method; shift
+	  match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"`
+	  for a_deplib in $deplibs; do
+	    case $a_deplib in
+	    -l*)
+	      func_stripname -l '' "$a_deplib"
+	      name=$func_stripname_result
+	      if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
+		case " $predeps $postdeps " in
+		*" $a_deplib "*)
+		  func_append newdeplibs " $a_deplib"
+		  a_deplib=""
+		  ;;
+		esac
+	      fi
+	      if test -n "$a_deplib" ; then
+		libname=`eval "\\$ECHO \"$libname_spec\""`
+		for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do
+		  potential_libs=`ls $i/$libname[.-]* 2>/dev/null`
+		  for potent_lib in $potential_libs; do
+		    potlib="$potent_lib" # see symlink-check above in file_magic test
+		    if eval "\$ECHO \"$potent_lib\"" 2>/dev/null | $SED 10q | \
+		       $EGREP "$match_pattern_regex" > /dev/null; then
+		      func_append newdeplibs " $a_deplib"
+		      a_deplib=""
+		      break 2
+		    fi
+		  done
+		done
+	      fi
+	      if test -n "$a_deplib" ; then
+		droppeddeps=yes
+		echo
+		$ECHO "*** Warning: linker path does not have real file for library $a_deplib."
+		echo "*** I have the capability to make that library automatically link in when"
+		echo "*** you link to this library.  But I can only do this if you have a"
+		echo "*** shared version of the library, which you do not appear to have"
+		echo "*** because I did check the linker path looking for a file starting"
+		if test -z "$potlib" ; then
+		  $ECHO "*** with $libname but no candidates were found. (...for regex pattern test)"
+		else
+		  $ECHO "*** with $libname and none of the candidates passed a file format test"
+		  $ECHO "*** using a regex pattern. Last file checked: $potlib"
+		fi
+	      fi
+	      ;;
+	    *)
+	      # Add a -L argument.
+	      func_append newdeplibs " $a_deplib"
+	      ;;
+	    esac
+	  done # Gone through all deplibs.
+	  ;;
+	none | unknown | *)
+	  newdeplibs=""
+	  tmp_deplibs=`$ECHO " $deplibs" | $SED 's/ -lc$//; s/ -[LR][^ ]*//g'`
+	  if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
+	    for i in $predeps $postdeps ; do
+	      # can't use Xsed below, because $i might contain '/'
+	      tmp_deplibs=`$ECHO " $tmp_deplibs" | $SED "s,$i,,"`
+	    done
+	  fi
+	  case $tmp_deplibs in
+	  *[!\	\ ]*)
+	    echo
+	    if test "X$deplibs_check_method" = "Xnone"; then
+	      echo "*** Warning: inter-library dependencies are not supported in this platform."
+	    else
+	      echo "*** Warning: inter-library dependencies are not known to be supported."
+	    fi
+	    echo "*** All declared inter-library dependencies are being dropped."
+	    droppeddeps=yes
+	    ;;
+	  esac
+	  ;;
+	esac
+	versuffix=$versuffix_save
+	major=$major_save
+	release=$release_save
+	libname=$libname_save
+	name=$name_save
+
+	case $host in
+	*-*-rhapsody* | *-*-darwin1.[012])
+	  # On Rhapsody replace the C library with the System framework
+	  newdeplibs=`$ECHO " $newdeplibs" | $SED 's/ -lc / System.ltframework /'`
+	  ;;
+	esac
+
+	if test "$droppeddeps" = yes; then
+	  if test "$module" = yes; then
+	    echo
+	    echo "*** Warning: libtool could not satisfy all declared inter-library"
+	    $ECHO "*** dependencies of module $libname.  Therefore, libtool will create"
+	    echo "*** a static module, that should work as long as the dlopening"
+	    echo "*** application is linked with the -dlopen flag."
+	    if test -z "$global_symbol_pipe"; then
+	      echo
+	      echo "*** However, this would only work if libtool was able to extract symbol"
+	      echo "*** lists from a program, using \`nm' or equivalent, but libtool could"
+	      echo "*** not find such a program.  So, this module is probably useless."
+	      echo "*** \`nm' from GNU binutils and a full rebuild may help."
+	    fi
+	    if test "$build_old_libs" = no; then
+	      oldlibs="$output_objdir/$libname.$libext"
+	      build_libtool_libs=module
+	      build_old_libs=yes
+	    else
+	      build_libtool_libs=no
+	    fi
+	  else
+	    echo "*** The inter-library dependencies that have been dropped here will be"
+	    echo "*** automatically added whenever a program is linked with this library"
+	    echo "*** or is declared to -dlopen it."
+
+	    if test "$allow_undefined" = no; then
+	      echo
+	      echo "*** Since this library must not contain undefined symbols,"
+	      echo "*** because either the platform does not support them or"
+	      echo "*** it was explicitly requested with -no-undefined,"
+	      echo "*** libtool will only create a static version of it."
+	      if test "$build_old_libs" = no; then
+		oldlibs="$output_objdir/$libname.$libext"
+		build_libtool_libs=module
+		build_old_libs=yes
+	      else
+		build_libtool_libs=no
+	      fi
+	    fi
+	  fi
+	fi
+	# Done checking deplibs!
+	deplibs=$newdeplibs
+      fi
+      # Time to change all our "foo.ltframework" stuff back to "-framework foo"
+      case $host in
+	*-*-darwin*)
+	  newdeplibs=`$ECHO " $newdeplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
+	  new_inherited_linker_flags=`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
+	  deplibs=`$ECHO " $deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
+	  ;;
+      esac
+
+      # move library search paths that coincide with paths to not yet
+      # installed libraries to the beginning of the library search list
+      new_libs=
+      for path in $notinst_path; do
+	case " $new_libs " in
+	*" -L$path/$objdir "*) ;;
+	*)
+	  case " $deplibs " in
+	  *" -L$path/$objdir "*)
+	    func_append new_libs " -L$path/$objdir" ;;
+	  esac
+	  ;;
+	esac
+      done
+      for deplib in $deplibs; do
+	case $deplib in
+	-L*)
+	  case " $new_libs " in
+	  *" $deplib "*) ;;
+	  *) func_append new_libs " $deplib" ;;
+	  esac
+	  ;;
+	*) func_append new_libs " $deplib" ;;
+	esac
+      done
+      deplibs="$new_libs"
+
+      # All the library-specific variables (install_libdir is set above).
+      library_names=
+      old_library=
+      dlname=
+
+      # Test again, we may have decided not to build it any more
+      if test "$build_libtool_libs" = yes; then
+	# Remove ${wl} instances when linking with ld.
+	# FIXME: should test the right _cmds variable.
+	case $archive_cmds in
+	  *\$LD\ *) wl= ;;
+        esac
+	if test "$hardcode_into_libs" = yes; then
+	  # Hardcode the library paths
+	  hardcode_libdirs=
+	  dep_rpath=
+	  rpath="$finalize_rpath"
+	  test "$opt_mode" != relink && rpath="$compile_rpath$rpath"
+	  for libdir in $rpath; do
+	    if test -n "$hardcode_libdir_flag_spec"; then
+	      if test -n "$hardcode_libdir_separator"; then
+		func_replace_sysroot "$libdir"
+		libdir=$func_replace_sysroot_result
+		if test -z "$hardcode_libdirs"; then
+		  hardcode_libdirs="$libdir"
+		else
+		  # Just accumulate the unique libdirs.
+		  case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in
+		  *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*)
+		    ;;
+		  *)
+		    func_append hardcode_libdirs "$hardcode_libdir_separator$libdir"
+		    ;;
+		  esac
+		fi
+	      else
+		eval flag=\"$hardcode_libdir_flag_spec\"
+		func_append dep_rpath " $flag"
+	      fi
+	    elif test -n "$runpath_var"; then
+	      case "$perm_rpath " in
+	      *" $libdir "*) ;;
+	      *) func_append perm_rpath " $libdir" ;;
+	      esac
+	    fi
+	  done
+	  # Substitute the hardcoded libdirs into the rpath.
+	  if test -n "$hardcode_libdir_separator" &&
+	     test -n "$hardcode_libdirs"; then
+	    libdir="$hardcode_libdirs"
+	    eval "dep_rpath=\"$hardcode_libdir_flag_spec\""
+	  fi
+	  if test -n "$runpath_var" && test -n "$perm_rpath"; then
+	    # We should set the runpath_var.
+	    rpath=
+	    for dir in $perm_rpath; do
+	      func_append rpath "$dir:"
+	    done
+	    eval "$runpath_var='$rpath\$$runpath_var'; export $runpath_var"
+	  fi
+	  test -n "$dep_rpath" && deplibs="$dep_rpath $deplibs"
+	fi
+
+	shlibpath="$finalize_shlibpath"
+	test "$opt_mode" != relink && shlibpath="$compile_shlibpath$shlibpath"
+	if test -n "$shlibpath"; then
+	  eval "$shlibpath_var='$shlibpath\$$shlibpath_var'; export $shlibpath_var"
+	fi
+
+	# Get the real and link names of the library.
+	eval shared_ext=\"$shrext_cmds\"
+	eval library_names=\"$library_names_spec\"
+	set dummy $library_names
+	shift
+	realname="$1"
+	shift
+
+	if test -n "$soname_spec"; then
+	  eval soname=\"$soname_spec\"
+	else
+	  soname="$realname"
+	fi
+	if test -z "$dlname"; then
+	  dlname=$soname
+	fi
+
+	lib="$output_objdir/$realname"
+	linknames=
+	for link
+	do
+	  func_append linknames " $link"
+	done
+
+	# Use standard objects if they are pic
+	test -z "$pic_flag" && libobjs=`$ECHO "$libobjs" | $SP2NL | $SED "$lo2o" | $NL2SP`
+	test "X$libobjs" = "X " && libobjs=
+
+	delfiles=
+	if test -n "$export_symbols" && test -n "$include_expsyms"; then
+	  $opt_dry_run || cp "$export_symbols" "$output_objdir/$libname.uexp"
+	  export_symbols="$output_objdir/$libname.uexp"
+	  func_append delfiles " $export_symbols"
+	fi
+
+	orig_export_symbols=
+	case $host_os in
+	cygwin* | mingw* | cegcc*)
+	  if test -n "$export_symbols" && test -z "$export_symbols_regex"; then
+	    # exporting using user supplied symfile
+	    if test "x`$SED 1q $export_symbols`" != xEXPORTS; then
+	      # and it's NOT already a .def file. Must figure out
+	      # which of the given symbols are data symbols and tag
+	      # them as such. So, trigger use of export_symbols_cmds.
+	      # export_symbols gets reassigned inside the "prepare
+	      # the list of exported symbols" if statement, so the
+	      # include_expsyms logic still works.
+	      orig_export_symbols="$export_symbols"
+	      export_symbols=
+	      always_export_symbols=yes
+	    fi
+	  fi
+	  ;;
+	esac
+
+	# Prepare the list of exported symbols
+	if test -z "$export_symbols"; then
+	  if test "$always_export_symbols" = yes || test -n "$export_symbols_regex"; then
+	    func_verbose "generating symbol list for \`$libname.la'"
+	    export_symbols="$output_objdir/$libname.exp"
+	    $opt_dry_run || $RM $export_symbols
+	    cmds=$export_symbols_cmds
+	    save_ifs="$IFS"; IFS='~'
+	    for cmd1 in $cmds; do
+	      IFS="$save_ifs"
+	      # Take the normal branch if the nm_file_list_spec branch
+	      # doesn't work or if tool conversion is not needed.
+	      case $nm_file_list_spec~$to_tool_file_cmd in
+		*~func_convert_file_noop | *~func_convert_file_msys_to_w32 | ~*)
+		  try_normal_branch=yes
+		  eval cmd=\"$cmd1\"
+		  func_len " $cmd"
+		  len=$func_len_result
+		  ;;
+		*)
+		  try_normal_branch=no
+		  ;;
+	      esac
+	      if test "$try_normal_branch" = yes \
+		 && { test "$len" -lt "$max_cmd_len" \
+		      || test "$max_cmd_len" -le -1; }
+	      then
+		func_show_eval "$cmd" 'exit $?'
+		skipped_export=false
+	      elif test -n "$nm_file_list_spec"; then
+		func_basename "$output"
+		output_la=$func_basename_result
+		save_libobjs=$libobjs
+		save_output=$output
+		output=${output_objdir}/${output_la}.nm
+		func_to_tool_file "$output"
+		libobjs=$nm_file_list_spec$func_to_tool_file_result
+		func_append delfiles " $output"
+		func_verbose "creating $NM input file list: $output"
+		for obj in $save_libobjs; do
+		  func_to_tool_file "$obj"
+		  $ECHO "$func_to_tool_file_result"
+		done > "$output"
+		eval cmd=\"$cmd1\"
+		func_show_eval "$cmd" 'exit $?'
+		output=$save_output
+		libobjs=$save_libobjs
+		skipped_export=false
+	      else
+		# The command line is too long to execute in one step.
+		func_verbose "using reloadable object file for export list..."
+		skipped_export=:
+		# Break out early, otherwise skipped_export may be
+		# set to false by a later but shorter cmd.
+		break
+	      fi
+	    done
+	    IFS="$save_ifs"
+	    if test -n "$export_symbols_regex" && test "X$skipped_export" != "X:"; then
+	      func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"'
+	      func_show_eval '$MV "${export_symbols}T" "$export_symbols"'
+	    fi
+	  fi
+	fi
+
+	if test -n "$export_symbols" && test -n "$include_expsyms"; then
+	  tmp_export_symbols="$export_symbols"
+	  test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols"
+	  $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"'
+	fi
+
+	if test "X$skipped_export" != "X:" && test -n "$orig_export_symbols"; then
+	  # The given exports_symbols file has to be filtered, so filter it.
+	  func_verbose "filter symbol list for \`$libname.la' to tag DATA exports"
+	  # FIXME: $output_objdir/$libname.filter potentially contains lots of
+	  # 's' commands which not all seds can handle. GNU sed should be fine
+	  # though. Also, the filter scales superlinearly with the number of
+	  # global variables. join(1) would be nice here, but unfortunately
+	  # isn't a blessed tool.
+	  $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter
+	  func_append delfiles " $export_symbols $output_objdir/$libname.filter"
+	  export_symbols=$output_objdir/$libname.def
+	  $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols
+	fi
+
+	tmp_deplibs=
+	for test_deplib in $deplibs; do
+	  case " $convenience " in
+	  *" $test_deplib "*) ;;
+	  *)
+	    func_append tmp_deplibs " $test_deplib"
+	    ;;
+	  esac
+	done
+	deplibs="$tmp_deplibs"
+
+	if test -n "$convenience"; then
+	  if test -n "$whole_archive_flag_spec" &&
+	    test "$compiler_needs_object" = yes &&
+	    test -z "$libobjs"; then
+	    # extract the archives, so we have objects to list.
+	    # TODO: could optimize this to just extract one archive.
+	    whole_archive_flag_spec=
+	  fi
+	  if test -n "$whole_archive_flag_spec"; then
+	    save_libobjs=$libobjs
+	    eval libobjs=\"\$libobjs $whole_archive_flag_spec\"
+	    test "X$libobjs" = "X " && libobjs=
+	  else
+	    gentop="$output_objdir/${outputname}x"
+	    func_append generated " $gentop"
+
+	    func_extract_archives $gentop $convenience
+	    func_append libobjs " $func_extract_archives_result"
+	    test "X$libobjs" = "X " && libobjs=
+	  fi
+	fi
+
+	if test "$thread_safe" = yes && test -n "$thread_safe_flag_spec"; then
+	  eval flag=\"$thread_safe_flag_spec\"
+	  func_append linker_flags " $flag"
+	fi
+
+	# Make a backup of the uninstalled library when relinking
+	if test "$opt_mode" = relink; then
+	  $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}U && $MV $realname ${realname}U)' || exit $?
+	fi
+
+	# Do each of the archive commands.
+	if test "$module" = yes && test -n "$module_cmds" ; then
+	  if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then
+	    eval test_cmds=\"$module_expsym_cmds\"
+	    cmds=$module_expsym_cmds
+	  else
+	    eval test_cmds=\"$module_cmds\"
+	    cmds=$module_cmds
+	  fi
+	else
+	  if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then
+	    eval test_cmds=\"$archive_expsym_cmds\"
+	    cmds=$archive_expsym_cmds
+	  else
+	    eval test_cmds=\"$archive_cmds\"
+	    cmds=$archive_cmds
+	  fi
+	fi
+
+	if test "X$skipped_export" != "X:" &&
+	   func_len " $test_cmds" &&
+	   len=$func_len_result &&
+	   test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then
+	  :
+	else
+	  # The command line is too long to link in one step, link piecewise
+	  # or, if using GNU ld and skipped_export is not :, use a linker
+	  # script.
+
+	  # Save the value of $output and $libobjs because we want to
+	  # use them later.  If we have whole_archive_flag_spec, we
+	  # want to use save_libobjs as it was before
+	  # whole_archive_flag_spec was expanded, because we can't
+	  # assume the linker understands whole_archive_flag_spec.
+	  # This may have to be revisited, in case too many
+	  # convenience libraries get linked in and end up exceeding
+	  # the spec.
+	  if test -z "$convenience" || test -z "$whole_archive_flag_spec"; then
+	    save_libobjs=$libobjs
+	  fi
+	  save_output=$output
+	  func_basename "$output"
+	  output_la=$func_basename_result
+
+	  # Clear the reloadable object creation command queue and
+	  # initialize k to one.
+	  test_cmds=
+	  concat_cmds=
+	  objlist=
+	  last_robj=
+	  k=1
+
+	  if test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "$with_gnu_ld" = yes; then
+	    output=${output_objdir}/${output_la}.lnkscript
+	    func_verbose "creating GNU ld script: $output"
+	    echo 'INPUT (' > $output
+	    for obj in $save_libobjs
+	    do
+	      func_to_tool_file "$obj"
+	      $ECHO "$func_to_tool_file_result" >> $output
+	    done
+	    echo ')' >> $output
+	    func_append delfiles " $output"
+	    func_to_tool_file "$output"
+	    output=$func_to_tool_file_result
+	  elif test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "X$file_list_spec" != X; then
+	    output=${output_objdir}/${output_la}.lnk
+	    func_verbose "creating linker input file list: $output"
+	    : > $output
+	    set x $save_libobjs
+	    shift
+	    firstobj=
+	    if test "$compiler_needs_object" = yes; then
+	      firstobj="$1 "
+	      shift
+	    fi
+	    for obj
+	    do
+	      func_to_tool_file "$obj"
+	      $ECHO "$func_to_tool_file_result" >> $output
+	    done
+	    func_append delfiles " $output"
+	    func_to_tool_file "$output"
+	    output=$firstobj\"$file_list_spec$func_to_tool_file_result\"
+	  else
+	    if test -n "$save_libobjs"; then
+	      func_verbose "creating reloadable object files..."
+	      output=$output_objdir/$output_la-${k}.$objext
+	      eval test_cmds=\"$reload_cmds\"
+	      func_len " $test_cmds"
+	      len0=$func_len_result
+	      len=$len0
+
+	      # Loop over the list of objects to be linked.
+	      for obj in $save_libobjs
+	      do
+		func_len " $obj"
+		func_arith $len + $func_len_result
+		len=$func_arith_result
+		if test "X$objlist" = X ||
+		   test "$len" -lt "$max_cmd_len"; then
+		  func_append objlist " $obj"
+		else
+		  # The command $test_cmds is almost too long, add a
+		  # command to the queue.
+		  if test "$k" -eq 1 ; then
+		    # The first file doesn't have a previous command to add.
+		    reload_objs=$objlist
+		    eval concat_cmds=\"$reload_cmds\"
+		  else
+		    # All subsequent reloadable object files will link in
+		    # the last one created.
+		    reload_objs="$objlist $last_robj"
+		    eval concat_cmds=\"\$concat_cmds~$reload_cmds~\$RM $last_robj\"
+		  fi
+		  last_robj=$output_objdir/$output_la-${k}.$objext
+		  func_arith $k + 1
+		  k=$func_arith_result
+		  output=$output_objdir/$output_la-${k}.$objext
+		  objlist=" $obj"
+		  func_len " $last_robj"
+		  func_arith $len0 + $func_len_result
+		  len=$func_arith_result
+		fi
+	      done
+	      # Handle the remaining objects by creating one last
+	      # reloadable object file.  All subsequent reloadable object
+	      # files will link in the last one created.
+	      test -z "$concat_cmds" || concat_cmds=$concat_cmds~
+	      reload_objs="$objlist $last_robj"
+	      eval concat_cmds=\"\${concat_cmds}$reload_cmds\"
+	      if test -n "$last_robj"; then
+	        eval concat_cmds=\"\${concat_cmds}~\$RM $last_robj\"
+	      fi
+	      func_append delfiles " $output"
+
+	    else
+	      output=
+	    fi
+
+	    if ${skipped_export-false}; then
+	      func_verbose "generating symbol list for \`$libname.la'"
+	      export_symbols="$output_objdir/$libname.exp"
+	      $opt_dry_run || $RM $export_symbols
+	      libobjs=$output
+	      # Append the command to create the export file.
+	      test -z "$concat_cmds" || concat_cmds=$concat_cmds~
+	      eval concat_cmds=\"\$concat_cmds$export_symbols_cmds\"
+	      if test -n "$last_robj"; then
+		eval concat_cmds=\"\$concat_cmds~\$RM $last_robj\"
+	      fi
+	    fi
+
+	    test -n "$save_libobjs" &&
+	      func_verbose "creating a temporary reloadable object file: $output"
+
+	    # Loop through the commands generated above and execute them.
+	    save_ifs="$IFS"; IFS='~'
+	    for cmd in $concat_cmds; do
+	      IFS="$save_ifs"
+	      $opt_silent || {
+		  func_quote_for_expand "$cmd"
+		  eval "func_echo $func_quote_for_expand_result"
+	      }
+	      $opt_dry_run || eval "$cmd" || {
+		lt_exit=$?
+
+		# Restore the uninstalled library and exit
+		if test "$opt_mode" = relink; then
+		  ( cd "$output_objdir" && \
+		    $RM "${realname}T" && \
+		    $MV "${realname}U" "$realname" )
+		fi
+
+		exit $lt_exit
+	      }
+	    done
+	    IFS="$save_ifs"
+
+	    if test -n "$export_symbols_regex" && ${skipped_export-false}; then
+	      func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"'
+	      func_show_eval '$MV "${export_symbols}T" "$export_symbols"'
+	    fi
+	  fi
+
+          if ${skipped_export-false}; then
+	    if test -n "$export_symbols" && test -n "$include_expsyms"; then
+	      tmp_export_symbols="$export_symbols"
+	      test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols"
+	      $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"'
+	    fi
+
+	    if test -n "$orig_export_symbols"; then
+	      # The given exports_symbols file has to be filtered, so filter it.
+	      func_verbose "filter symbol list for \`$libname.la' to tag DATA exports"
+	      # FIXME: $output_objdir/$libname.filter potentially contains lots of
+	      # 's' commands which not all seds can handle. GNU sed should be fine
+	      # though. Also, the filter scales superlinearly with the number of
+	      # global variables. join(1) would be nice here, but unfortunately
+	      # isn't a blessed tool.
+	      $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter
+	      func_append delfiles " $export_symbols $output_objdir/$libname.filter"
+	      export_symbols=$output_objdir/$libname.def
+	      $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols
+	    fi
+	  fi
+
+	  libobjs=$output
+	  # Restore the value of output.
+	  output=$save_output
+
+	  if test -n "$convenience" && test -n "$whole_archive_flag_spec"; then
+	    eval libobjs=\"\$libobjs $whole_archive_flag_spec\"
+	    test "X$libobjs" = "X " && libobjs=
+	  fi
+	  # Expand the library linking commands again to reset the
+	  # value of $libobjs for piecewise linking.
+
+	  # Do each of the archive commands.
+	  if test "$module" = yes && test -n "$module_cmds" ; then
+	    if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then
+	      cmds=$module_expsym_cmds
+	    else
+	      cmds=$module_cmds
+	    fi
+	  else
+	    if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then
+	      cmds=$archive_expsym_cmds
+	    else
+	      cmds=$archive_cmds
+	    fi
+	  fi
+	fi
+
+	if test -n "$delfiles"; then
+	  # Append the command to remove temporary files to $cmds.
+	  eval cmds=\"\$cmds~\$RM $delfiles\"
+	fi
+
+	# Add any objects from preloaded convenience libraries
+	if test -n "$dlprefiles"; then
+	  gentop="$output_objdir/${outputname}x"
+	  func_append generated " $gentop"
+
+	  func_extract_archives $gentop $dlprefiles
+	  func_append libobjs " $func_extract_archives_result"
+	  test "X$libobjs" = "X " && libobjs=
+	fi
+
+	save_ifs="$IFS"; IFS='~'
+	for cmd in $cmds; do
+	  IFS="$save_ifs"
+	  eval cmd=\"$cmd\"
+	  $opt_silent || {
+	    func_quote_for_expand "$cmd"
+	    eval "func_echo $func_quote_for_expand_result"
+	  }
+	  $opt_dry_run || eval "$cmd" || {
+	    lt_exit=$?
+
+	    # Restore the uninstalled library and exit
+	    if test "$opt_mode" = relink; then
+	      ( cd "$output_objdir" && \
+	        $RM "${realname}T" && \
+		$MV "${realname}U" "$realname" )
+	    fi
+
+	    exit $lt_exit
+	  }
+	done
+	IFS="$save_ifs"
+
+	# Restore the uninstalled library and exit
+	if test "$opt_mode" = relink; then
+	  $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}T && $MV $realname ${realname}T && $MV ${realname}U $realname)' || exit $?
+
+	  if test -n "$convenience"; then
+	    if test -z "$whole_archive_flag_spec"; then
+	      func_show_eval '${RM}r "$gentop"'
+	    fi
+	  fi
+
+	  exit $EXIT_SUCCESS
+	fi
+
+	# Create links to the real library.
+	for linkname in $linknames; do
+	  if test "$realname" != "$linkname"; then
+	    func_show_eval '(cd "$output_objdir" && $RM "$linkname" && $LN_S "$realname" "$linkname")' 'exit $?'
+	  fi
+	done
+
+	# If -module or -export-dynamic was specified, set the dlname.
+	if test "$module" = yes || test "$export_dynamic" = yes; then
+	  # On all known operating systems, these are identical.
+	  dlname="$soname"
+	fi
+      fi
+      ;;
+
+    obj)
+      if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then
+	func_warning "\`-dlopen' is ignored for objects"
+      fi
+
+      case " $deplibs" in
+      *\ -l* | *\ -L*)
+	func_warning "\`-l' and \`-L' are ignored for objects" ;;
+      esac
+
+      test -n "$rpath" && \
+	func_warning "\`-rpath' is ignored for objects"
+
+      test -n "$xrpath" && \
+	func_warning "\`-R' is ignored for objects"
+
+      test -n "$vinfo" && \
+	func_warning "\`-version-info' is ignored for objects"
+
+      test -n "$release" && \
+	func_warning "\`-release' is ignored for objects"
+
+      case $output in
+      *.lo)
+	test -n "$objs$old_deplibs" && \
+	  func_fatal_error "cannot build library object \`$output' from non-libtool objects"
+
+	libobj=$output
+	func_lo2o "$libobj"
+	obj=$func_lo2o_result
+	;;
+      *)
+	libobj=
+	obj="$output"
+	;;
+      esac
+
+      # Delete the old objects.
+      $opt_dry_run || $RM $obj $libobj
+
+      # Objects from convenience libraries.  This assumes
+      # single-version convenience libraries.  Whenever we create
+      # different ones for PIC/non-PIC, this we'll have to duplicate
+      # the extraction.
+      reload_conv_objs=
+      gentop=
+      # reload_cmds runs $LD directly, so let us get rid of
+      # -Wl from whole_archive_flag_spec and hope we can get by with
+      # turning comma into space..
+      wl=
+
+      if test -n "$convenience"; then
+	if test -n "$whole_archive_flag_spec"; then
+	  eval tmp_whole_archive_flags=\"$whole_archive_flag_spec\"
+	  reload_conv_objs=$reload_objs\ `$ECHO "$tmp_whole_archive_flags" | $SED 's|,| |g'`
+	else
+	  gentop="$output_objdir/${obj}x"
+	  func_append generated " $gentop"
+
+	  func_extract_archives $gentop $convenience
+	  reload_conv_objs="$reload_objs $func_extract_archives_result"
+	fi
+      fi
+
+      # If we're not building shared, we need to use non_pic_objs
+      test "$build_libtool_libs" != yes && libobjs="$non_pic_objects"
+
+      # Create the old-style object.
+      reload_objs="$objs$old_deplibs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.${libext}$/d; /\.lib$/d; $lo2o" | $NL2SP`" $reload_conv_objs" ### testsuite: skip nested quoting test
+
+      output="$obj"
+      func_execute_cmds "$reload_cmds" 'exit $?'
+
+      # Exit if we aren't doing a library object file.
+      if test -z "$libobj"; then
+	if test -n "$gentop"; then
+	  func_show_eval '${RM}r "$gentop"'
+	fi
+
+	exit $EXIT_SUCCESS
+      fi
+
+      if test "$build_libtool_libs" != yes; then
+	if test -n "$gentop"; then
+	  func_show_eval '${RM}r "$gentop"'
+	fi
+
+	# Create an invalid libtool object if no PIC, so that we don't
+	# accidentally link it into a program.
+	# $show "echo timestamp > $libobj"
+	# $opt_dry_run || eval "echo timestamp > $libobj" || exit $?
+	exit $EXIT_SUCCESS
+      fi
+
+      if test -n "$pic_flag" || test "$pic_mode" != default; then
+	# Only do commands if we really have different PIC objects.
+	reload_objs="$libobjs $reload_conv_objs"
+	output="$libobj"
+	func_execute_cmds "$reload_cmds" 'exit $?'
+      fi
+
+      if test -n "$gentop"; then
+	func_show_eval '${RM}r "$gentop"'
+      fi
+
+      exit $EXIT_SUCCESS
+      ;;
+
+    prog)
+      case $host in
+	*cygwin*) func_stripname '' '.exe' "$output"
+	          output=$func_stripname_result.exe;;
+      esac
+      test -n "$vinfo" && \
+	func_warning "\`-version-info' is ignored for programs"
+
+      test -n "$release" && \
+	func_warning "\`-release' is ignored for programs"
+
+      test "$preload" = yes \
+        && test "$dlopen_support" = unknown \
+	&& test "$dlopen_self" = unknown \
+	&& test "$dlopen_self_static" = unknown && \
+	  func_warning "\`LT_INIT([dlopen])' not used. Assuming no dlopen support."
+
+      case $host in
+      *-*-rhapsody* | *-*-darwin1.[012])
+	# On Rhapsody replace the C library is the System framework
+	compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's/ -lc / System.ltframework /'`
+	finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's/ -lc / System.ltframework /'`
+	;;
+      esac
+
+      case $host in
+      *-*-darwin*)
+	# Don't allow lazy linking, it breaks C++ global constructors
+	# But is supposedly fixed on 10.4 or later (yay!).
+	if test "$tagname" = CXX ; then
+	  case ${MACOSX_DEPLOYMENT_TARGET-10.0} in
+	    10.[0123])
+	      func_append compile_command " ${wl}-bind_at_load"
+	      func_append finalize_command " ${wl}-bind_at_load"
+	    ;;
+	  esac
+	fi
+	# Time to change all our "foo.ltframework" stuff back to "-framework foo"
+	compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
+	finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
+	;;
+      esac
+
+
+      # move library search paths that coincide with paths to not yet
+      # installed libraries to the beginning of the library search list
+      new_libs=
+      for path in $notinst_path; do
+	case " $new_libs " in
+	*" -L$path/$objdir "*) ;;
+	*)
+	  case " $compile_deplibs " in
+	  *" -L$path/$objdir "*)
+	    func_append new_libs " -L$path/$objdir" ;;
+	  esac
+	  ;;
+	esac
+      done
+      for deplib in $compile_deplibs; do
+	case $deplib in
+	-L*)
+	  case " $new_libs " in
+	  *" $deplib "*) ;;
+	  *) func_append new_libs " $deplib" ;;
+	  esac
+	  ;;
+	*) func_append new_libs " $deplib" ;;
+	esac
+      done
+      compile_deplibs="$new_libs"
+
+
+      func_append compile_command " $compile_deplibs"
+      func_append finalize_command " $finalize_deplibs"
+
+      if test -n "$rpath$xrpath"; then
+	# If the user specified any rpath flags, then add them.
+	for libdir in $rpath $xrpath; do
+	  # This is the magic to use -rpath.
+	  case "$finalize_rpath " in
+	  *" $libdir "*) ;;
+	  *) func_append finalize_rpath " $libdir" ;;
+	  esac
+	done
+      fi
+
+      # Now hardcode the library paths
+      rpath=
+      hardcode_libdirs=
+      for libdir in $compile_rpath $finalize_rpath; do
+	if test -n "$hardcode_libdir_flag_spec"; then
+	  if test -n "$hardcode_libdir_separator"; then
+	    if test -z "$hardcode_libdirs"; then
+	      hardcode_libdirs="$libdir"
+	    else
+	      # Just accumulate the unique libdirs.
+	      case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in
+	      *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*)
+		;;
+	      *)
+		func_append hardcode_libdirs "$hardcode_libdir_separator$libdir"
+		;;
+	      esac
+	    fi
+	  else
+	    eval flag=\"$hardcode_libdir_flag_spec\"
+	    func_append rpath " $flag"
+	  fi
+	elif test -n "$runpath_var"; then
+	  case "$perm_rpath " in
+	  *" $libdir "*) ;;
+	  *) func_append perm_rpath " $libdir" ;;
+	  esac
+	fi
+	case $host in
+	*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*)
+	  testbindir=`${ECHO} "$libdir" | ${SED} -e 's*/lib$*/bin*'`
+	  case :$dllsearchpath: in
+	  *":$libdir:"*) ;;
+	  ::) dllsearchpath=$libdir;;
+	  *) func_append dllsearchpath ":$libdir";;
+	  esac
+	  case :$dllsearchpath: in
+	  *":$testbindir:"*) ;;
+	  ::) dllsearchpath=$testbindir;;
+	  *) func_append dllsearchpath ":$testbindir";;
+	  esac
+	  ;;
+	esac
+      done
+      # Substitute the hardcoded libdirs into the rpath.
+      if test -n "$hardcode_libdir_separator" &&
+	 test -n "$hardcode_libdirs"; then
+	libdir="$hardcode_libdirs"
+	eval rpath=\" $hardcode_libdir_flag_spec\"
+      fi
+      compile_rpath="$rpath"
+
+      rpath=
+      hardcode_libdirs=
+      for libdir in $finalize_rpath; do
+	if test -n "$hardcode_libdir_flag_spec"; then
+	  if test -n "$hardcode_libdir_separator"; then
+	    if test -z "$hardcode_libdirs"; then
+	      hardcode_libdirs="$libdir"
+	    else
+	      # Just accumulate the unique libdirs.
+	      case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in
+	      *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*)
+		;;
+	      *)
+		func_append hardcode_libdirs "$hardcode_libdir_separator$libdir"
+		;;
+	      esac
+	    fi
+	  else
+	    eval flag=\"$hardcode_libdir_flag_spec\"
+	    func_append rpath " $flag"
+	  fi
+	elif test -n "$runpath_var"; then
+	  case "$finalize_perm_rpath " in
+	  *" $libdir "*) ;;
+	  *) func_append finalize_perm_rpath " $libdir" ;;
+	  esac
+	fi
+      done
+      # Substitute the hardcoded libdirs into the rpath.
+      if test -n "$hardcode_libdir_separator" &&
+	 test -n "$hardcode_libdirs"; then
+	libdir="$hardcode_libdirs"
+	eval rpath=\" $hardcode_libdir_flag_spec\"
+      fi
+      finalize_rpath="$rpath"
+
+      if test -n "$libobjs" && test "$build_old_libs" = yes; then
+	# Transform all the library objects into standard objects.
+	compile_command=`$ECHO "$compile_command" | $SP2NL | $SED "$lo2o" | $NL2SP`
+	finalize_command=`$ECHO "$finalize_command" | $SP2NL | $SED "$lo2o" | $NL2SP`
+      fi
+
+      func_generate_dlsyms "$outputname" "@PROGRAM@" "no"
+
+      # template prelinking step
+      if test -n "$prelink_cmds"; then
+	func_execute_cmds "$prelink_cmds" 'exit $?'
+      fi
+
+      wrappers_required=yes
+      case $host in
+      *cegcc* | *mingw32ce*)
+        # Disable wrappers for cegcc and mingw32ce hosts, we are cross compiling anyway.
+        wrappers_required=no
+        ;;
+      *cygwin* | *mingw* )
+        if test "$build_libtool_libs" != yes; then
+          wrappers_required=no
+        fi
+        ;;
+      *)
+        if test "$need_relink" = no || test "$build_libtool_libs" != yes; then
+          wrappers_required=no
+        fi
+        ;;
+      esac
+      if test "$wrappers_required" = no; then
+	# Replace the output file specification.
+	compile_command=`$ECHO "$compile_command" | $SED 's%@OUTPUT@%'"$output"'%g'`
+	link_command="$compile_command$compile_rpath"
+
+	# We have no uninstalled library dependencies, so finalize right now.
+	exit_status=0
+	func_show_eval "$link_command" 'exit_status=$?'
+
+	if test -n "$postlink_cmds"; then
+	  func_to_tool_file "$output"
+	  postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'`
+	  func_execute_cmds "$postlink_cmds" 'exit $?'
+	fi
+
+	# Delete the generated files.
+	if test -f "$output_objdir/${outputname}S.${objext}"; then
+	  func_show_eval '$RM "$output_objdir/${outputname}S.${objext}"'
+	fi
+
+	exit $exit_status
+      fi
+
+      if test -n "$compile_shlibpath$finalize_shlibpath"; then
+	compile_command="$shlibpath_var=\"$compile_shlibpath$finalize_shlibpath\$$shlibpath_var\" $compile_command"
+      fi
+      if test -n "$finalize_shlibpath"; then
+	finalize_command="$shlibpath_var=\"$finalize_shlibpath\$$shlibpath_var\" $finalize_command"
+      fi
+
+      compile_var=
+      finalize_var=
+      if test -n "$runpath_var"; then
+	if test -n "$perm_rpath"; then
+	  # We should set the runpath_var.
+	  rpath=
+	  for dir in $perm_rpath; do
+	    func_append rpath "$dir:"
+	  done
+	  compile_var="$runpath_var=\"$rpath\$$runpath_var\" "
+	fi
+	if test -n "$finalize_perm_rpath"; then
+	  # We should set the runpath_var.
+	  rpath=
+	  for dir in $finalize_perm_rpath; do
+	    func_append rpath "$dir:"
+	  done
+	  finalize_var="$runpath_var=\"$rpath\$$runpath_var\" "
+	fi
+      fi
+
+      if test "$no_install" = yes; then
+	# We don't need to create a wrapper script.
+	link_command="$compile_var$compile_command$compile_rpath"
+	# Replace the output file specification.
+	link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output"'%g'`
+	# Delete the old output file.
+	$opt_dry_run || $RM $output
+	# Link the executable and exit
+	func_show_eval "$link_command" 'exit $?'
+
+	if test -n "$postlink_cmds"; then
+	  func_to_tool_file "$output"
+	  postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'`
+	  func_execute_cmds "$postlink_cmds" 'exit $?'
+	fi
+
+	exit $EXIT_SUCCESS
+      fi
+
+      if test "$hardcode_action" = relink; then
+	# Fast installation is not supported
+	link_command="$compile_var$compile_command$compile_rpath"
+	relink_command="$finalize_var$finalize_command$finalize_rpath"
+
+	func_warning "this platform does not like uninstalled shared libraries"
+	func_warning "\`$output' will be relinked during installation"
+      else
+	if test "$fast_install" != no; then
+	  link_command="$finalize_var$compile_command$finalize_rpath"
+	  if test "$fast_install" = yes; then
+	    relink_command=`$ECHO "$compile_var$compile_command$compile_rpath" | $SED 's%@OUTPUT@%\$progdir/\$file%g'`
+	  else
+	    # fast_install is set to needless
+	    relink_command=
+	  fi
+	else
+	  link_command="$compile_var$compile_command$compile_rpath"
+	  relink_command="$finalize_var$finalize_command$finalize_rpath"
+	fi
+      fi
+
+      # Replace the output file specification.
+      link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'`
+
+      # Delete the old output files.
+      $opt_dry_run || $RM $output $output_objdir/$outputname $output_objdir/lt-$outputname
+
+      func_show_eval "$link_command" 'exit $?'
+
+      if test -n "$postlink_cmds"; then
+	func_to_tool_file "$output_objdir/$outputname"
+	postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output_objdir/$outputname"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'`
+	func_execute_cmds "$postlink_cmds" 'exit $?'
+      fi
+
+      # Now create the wrapper script.
+      func_verbose "creating $output"
+
+      # Quote the relink command for shipping.
+      if test -n "$relink_command"; then
+	# Preserve any variables that may affect compiler behavior
+	for var in $variables_saved_for_relink; do
+	  if eval test -z \"\${$var+set}\"; then
+	    relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command"
+	  elif eval var_value=\$$var; test -z "$var_value"; then
+	    relink_command="$var=; export $var; $relink_command"
+	  else
+	    func_quote_for_eval "$var_value"
+	    relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command"
+	  fi
+	done
+	relink_command="(cd `pwd`; $relink_command)"
+	relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"`
+      fi
+
+      # Only actually do things if not in dry run mode.
+      $opt_dry_run || {
+	# win32 will think the script is a binary if it has
+	# a .exe suffix, so we strip it off here.
+	case $output in
+	  *.exe) func_stripname '' '.exe' "$output"
+	         output=$func_stripname_result ;;
+	esac
+	# test for cygwin because mv fails w/o .exe extensions
+	case $host in
+	  *cygwin*)
+	    exeext=.exe
+	    func_stripname '' '.exe' "$outputname"
+	    outputname=$func_stripname_result ;;
+	  *) exeext= ;;
+	esac
+	case $host in
+	  *cygwin* | *mingw* )
+	    func_dirname_and_basename "$output" "" "."
+	    output_name=$func_basename_result
+	    output_path=$func_dirname_result
+	    cwrappersource="$output_path/$objdir/lt-$output_name.c"
+	    cwrapper="$output_path/$output_name.exe"
+	    $RM $cwrappersource $cwrapper
+	    trap "$RM $cwrappersource $cwrapper; exit $EXIT_FAILURE" 1 2 15
+
+	    func_emit_cwrapperexe_src > $cwrappersource
+
+	    # The wrapper executable is built using the $host compiler,
+	    # because it contains $host paths and files. If cross-
+	    # compiling, it, like the target executable, must be
+	    # executed on the $host or under an emulation environment.
+	    $opt_dry_run || {
+	      $LTCC $LTCFLAGS -o $cwrapper $cwrappersource
+	      $STRIP $cwrapper
+	    }
+
+	    # Now, create the wrapper script for func_source use:
+	    func_ltwrapper_scriptname $cwrapper
+	    $RM $func_ltwrapper_scriptname_result
+	    trap "$RM $func_ltwrapper_scriptname_result; exit $EXIT_FAILURE" 1 2 15
+	    $opt_dry_run || {
+	      # note: this script will not be executed, so do not chmod.
+	      if test "x$build" = "x$host" ; then
+		$cwrapper --lt-dump-script > $func_ltwrapper_scriptname_result
+	      else
+		func_emit_wrapper no > $func_ltwrapper_scriptname_result
+	      fi
+	    }
+	  ;;
+	  * )
+	    $RM $output
+	    trap "$RM $output; exit $EXIT_FAILURE" 1 2 15
+
+	    func_emit_wrapper no > $output
+	    chmod +x $output
+	  ;;
+	esac
+      }
+      exit $EXIT_SUCCESS
+      ;;
+    esac
+
+    # See if we need to build an old-fashioned archive.
+    for oldlib in $oldlibs; do
+
+      if test "$build_libtool_libs" = convenience; then
+	oldobjs="$libobjs_save $symfileobj"
+	addlibs="$convenience"
+	build_libtool_libs=no
+      else
+	if test "$build_libtool_libs" = module; then
+	  oldobjs="$libobjs_save"
+	  build_libtool_libs=no
+	else
+	  oldobjs="$old_deplibs $non_pic_objects"
+	  if test "$preload" = yes && test -f "$symfileobj"; then
+	    func_append oldobjs " $symfileobj"
+	  fi
+	fi
+	addlibs="$old_convenience"
+      fi
+
+      if test -n "$addlibs"; then
+	gentop="$output_objdir/${outputname}x"
+	func_append generated " $gentop"
+
+	func_extract_archives $gentop $addlibs
+	func_append oldobjs " $func_extract_archives_result"
+      fi
+
+      # Do each command in the archive commands.
+      if test -n "$old_archive_from_new_cmds" && test "$build_libtool_libs" = yes; then
+	cmds=$old_archive_from_new_cmds
+      else
+
+	# Add any objects from preloaded convenience libraries
+	if test -n "$dlprefiles"; then
+	  gentop="$output_objdir/${outputname}x"
+	  func_append generated " $gentop"
+
+	  func_extract_archives $gentop $dlprefiles
+	  func_append oldobjs " $func_extract_archives_result"
+	fi
+
+	# POSIX demands no paths to be encoded in archives.  We have
+	# to avoid creating archives with duplicate basenames if we
+	# might have to extract them afterwards, e.g., when creating a
+	# static archive out of a convenience library, or when linking
+	# the entirety of a libtool archive into another (currently
+	# not supported by libtool).
+	if (for obj in $oldobjs
+	    do
+	      func_basename "$obj"
+	      $ECHO "$func_basename_result"
+	    done | sort | sort -uc >/dev/null 2>&1); then
+	  :
+	else
+	  echo "copying selected object files to avoid basename conflicts..."
+	  gentop="$output_objdir/${outputname}x"
+	  func_append generated " $gentop"
+	  func_mkdir_p "$gentop"
+	  save_oldobjs=$oldobjs
+	  oldobjs=
+	  counter=1
+	  for obj in $save_oldobjs
+	  do
+	    func_basename "$obj"
+	    objbase="$func_basename_result"
+	    case " $oldobjs " in
+	    " ") oldobjs=$obj ;;
+	    *[\ /]"$objbase "*)
+	      while :; do
+		# Make sure we don't pick an alternate name that also
+		# overlaps.
+		newobj=lt$counter-$objbase
+		func_arith $counter + 1
+		counter=$func_arith_result
+		case " $oldobjs " in
+		*[\ /]"$newobj "*) ;;
+		*) if test ! -f "$gentop/$newobj"; then break; fi ;;
+		esac
+	      done
+	      func_show_eval "ln $obj $gentop/$newobj || cp $obj $gentop/$newobj"
+	      func_append oldobjs " $gentop/$newobj"
+	      ;;
+	    *) func_append oldobjs " $obj" ;;
+	    esac
+	  done
+	fi
+	func_to_tool_file "$oldlib" func_convert_file_msys_to_w32
+	tool_oldlib=$func_to_tool_file_result
+	eval cmds=\"$old_archive_cmds\"
+
+	func_len " $cmds"
+	len=$func_len_result
+	if test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then
+	  cmds=$old_archive_cmds
+	elif test -n "$archiver_list_spec"; then
+	  func_verbose "using command file archive linking..."
+	  for obj in $oldobjs
+	  do
+	    func_to_tool_file "$obj"
+	    $ECHO "$func_to_tool_file_result"
+	  done > $output_objdir/$libname.libcmd
+	  func_to_tool_file "$output_objdir/$libname.libcmd"
+	  oldobjs=" $archiver_list_spec$func_to_tool_file_result"
+	  cmds=$old_archive_cmds
+	else
+	  # the command line is too long to link in one step, link in parts
+	  func_verbose "using piecewise archive linking..."
+	  save_RANLIB=$RANLIB
+	  RANLIB=:
+	  objlist=
+	  concat_cmds=
+	  save_oldobjs=$oldobjs
+	  oldobjs=
+	  # Is there a better way of finding the last object in the list?
+	  for obj in $save_oldobjs
+	  do
+	    last_oldobj=$obj
+	  done
+	  eval test_cmds=\"$old_archive_cmds\"
+	  func_len " $test_cmds"
+	  len0=$func_len_result
+	  len=$len0
+	  for obj in $save_oldobjs
+	  do
+	    func_len " $obj"
+	    func_arith $len + $func_len_result
+	    len=$func_arith_result
+	    func_append objlist " $obj"
+	    if test "$len" -lt "$max_cmd_len"; then
+	      :
+	    else
+	      # the above command should be used before it gets too long
+	      oldobjs=$objlist
+	      if test "$obj" = "$last_oldobj" ; then
+		RANLIB=$save_RANLIB
+	      fi
+	      test -z "$concat_cmds" || concat_cmds=$concat_cmds~
+	      eval concat_cmds=\"\${concat_cmds}$old_archive_cmds\"
+	      objlist=
+	      len=$len0
+	    fi
+	  done
+	  RANLIB=$save_RANLIB
+	  oldobjs=$objlist
+	  if test "X$oldobjs" = "X" ; then
+	    eval cmds=\"\$concat_cmds\"
+	  else
+	    eval cmds=\"\$concat_cmds~\$old_archive_cmds\"
+	  fi
+	fi
+      fi
+      func_execute_cmds "$cmds" 'exit $?'
+    done
+
+    test -n "$generated" && \
+      func_show_eval "${RM}r$generated"
+
+    # Now create the libtool archive.
+    case $output in
+    *.la)
+      old_library=
+      test "$build_old_libs" = yes && old_library="$libname.$libext"
+      func_verbose "creating $output"
+
+      # Preserve any variables that may affect compiler behavior
+      for var in $variables_saved_for_relink; do
+	if eval test -z \"\${$var+set}\"; then
+	  relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command"
+	elif eval var_value=\$$var; test -z "$var_value"; then
+	  relink_command="$var=; export $var; $relink_command"
+	else
+	  func_quote_for_eval "$var_value"
+	  relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command"
+	fi
+      done
+      # Quote the link command for shipping.
+      relink_command="(cd `pwd`; $SHELL $progpath $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)"
+      relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"`
+      if test "$hardcode_automatic" = yes ; then
+	relink_command=
+      fi
+
+      # Only create the output if not a dry run.
+      $opt_dry_run || {
+	for installed in no yes; do
+	  if test "$installed" = yes; then
+	    if test -z "$install_libdir"; then
+	      break
+	    fi
+	    output="$output_objdir/$outputname"i
+	    # Replace all uninstalled libtool libraries with the installed ones
+	    newdependency_libs=
+	    for deplib in $dependency_libs; do
+	      case $deplib in
+	      *.la)
+		func_basename "$deplib"
+		name="$func_basename_result"
+		func_resolve_sysroot "$deplib"
+		eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $func_resolve_sysroot_result`
+		test -z "$libdir" && \
+		  func_fatal_error "\`$deplib' is not a valid libtool archive"
+		func_append newdependency_libs " ${lt_sysroot:+=}$libdir/$name"
+		;;
+	      -L*)
+		func_stripname -L '' "$deplib"
+		func_replace_sysroot "$func_stripname_result"
+		func_append newdependency_libs " -L$func_replace_sysroot_result"
+		;;
+	      -R*)
+		func_stripname -R '' "$deplib"
+		func_replace_sysroot "$func_stripname_result"
+		func_append newdependency_libs " -R$func_replace_sysroot_result"
+		;;
+	      *) func_append newdependency_libs " $deplib" ;;
+	      esac
+	    done
+	    dependency_libs="$newdependency_libs"
+	    newdlfiles=
+
+	    for lib in $dlfiles; do
+	      case $lib in
+	      *.la)
+	        func_basename "$lib"
+		name="$func_basename_result"
+		eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib`
+		test -z "$libdir" && \
+		  func_fatal_error "\`$lib' is not a valid libtool archive"
+		func_append newdlfiles " ${lt_sysroot:+=}$libdir/$name"
+		;;
+	      *) func_append newdlfiles " $lib" ;;
+	      esac
+	    done
+	    dlfiles="$newdlfiles"
+	    newdlprefiles=
+	    for lib in $dlprefiles; do
+	      case $lib in
+	      *.la)
+		# Only pass preopened files to the pseudo-archive (for
+		# eventual linking with the app. that links it) if we
+		# didn't already link the preopened objects directly into
+		# the library:
+		func_basename "$lib"
+		name="$func_basename_result"
+		eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib`
+		test -z "$libdir" && \
+		  func_fatal_error "\`$lib' is not a valid libtool archive"
+		func_append newdlprefiles " ${lt_sysroot:+=}$libdir/$name"
+		;;
+	      esac
+	    done
+	    dlprefiles="$newdlprefiles"
+	  else
+	    newdlfiles=
+	    for lib in $dlfiles; do
+	      case $lib in
+		[\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;;
+		*) abs=`pwd`"/$lib" ;;
+	      esac
+	      func_append newdlfiles " $abs"
+	    done
+	    dlfiles="$newdlfiles"
+	    newdlprefiles=
+	    for lib in $dlprefiles; do
+	      case $lib in
+		[\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;;
+		*) abs=`pwd`"/$lib" ;;
+	      esac
+	      func_append newdlprefiles " $abs"
+	    done
+	    dlprefiles="$newdlprefiles"
+	  fi
+	  $RM $output
+	  # place dlname in correct position for cygwin
+	  # In fact, it would be nice if we could use this code for all target
+	  # systems that can't hard-code library paths into their executables
+	  # and that have no shared library path variable independent of PATH,
+	  # but it turns out we can't easily determine that from inspecting
+	  # libtool variables, so we have to hard-code the OSs to which it
+	  # applies here; at the moment, that means platforms that use the PE
+	  # object format with DLL files.  See the long comment at the top of
+	  # tests/bindir.at for full details.
+	  tdlname=$dlname
+	  case $host,$output,$installed,$module,$dlname in
+	    *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll | *cegcc*,*lai,yes,no,*.dll)
+	      # If a -bindir argument was supplied, place the dll there.
+	      if test "x$bindir" != x ;
+	      then
+		func_relative_path "$install_libdir" "$bindir"
+		tdlname=$func_relative_path_result$dlname
+	      else
+		# Otherwise fall back on heuristic.
+		tdlname=../bin/$dlname
+	      fi
+	      ;;
+	  esac
+	  $ECHO > $output "\
+# $outputname - a libtool library file
+# Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# The name that we can dlopen(3).
+dlname='$tdlname'
+
+# Names of this library.
+library_names='$library_names'
+
+# The name of the static archive.
+old_library='$old_library'
+
+# Linker flags that can not go in dependency_libs.
+inherited_linker_flags='$new_inherited_linker_flags'
+
+# Libraries that this one depends upon.
+dependency_libs='$dependency_libs'
+
+# Names of additional weak libraries provided by this library
+weak_library_names='$weak_libs'
+
+# Version information for $libname.
+current=$current
+age=$age
+revision=$revision
+
+# Is this an already installed library?
+installed=$installed
+
+# Should we warn about portability when linking against -modules?
+shouldnotlink=$module
+
+# Files to dlopen/dlpreopen
+dlopen='$dlfiles'
+dlpreopen='$dlprefiles'
+
+# Directory that this library needs to be installed in:
+libdir='$install_libdir'"
+	  if test "$installed" = no && test "$need_relink" = yes; then
+	    $ECHO >> $output "\
+relink_command=\"$relink_command\""
+	  fi
+	done
+      }
+
+      # Do a symbolic link so that the libtool archive can be found in
+      # LD_LIBRARY_PATH before the program is installed.
+      func_show_eval '( cd "$output_objdir" && $RM "$outputname" && $LN_S "../$outputname" "$outputname" )' 'exit $?'
+      ;;
+    esac
+    exit $EXIT_SUCCESS
+}
+
+{ test "$opt_mode" = link || test "$opt_mode" = relink; } &&
+    func_mode_link ${1+"$@"}
+
+
+# func_mode_uninstall arg...
+func_mode_uninstall ()
+{
+    $opt_debug
+    RM="$nonopt"
+    files=
+    rmforce=
+    exit_status=0
+
+    # This variable tells wrapper scripts just to set variables rather
+    # than running their programs.
+    libtool_install_magic="$magic"
+
+    for arg
+    do
+      case $arg in
+      -f) func_append RM " $arg"; rmforce=yes ;;
+      -*) func_append RM " $arg" ;;
+      *) func_append files " $arg" ;;
+      esac
+    done
+
+    test -z "$RM" && \
+      func_fatal_help "you must specify an RM program"
+
+    rmdirs=
+
+    for file in $files; do
+      func_dirname "$file" "" "."
+      dir="$func_dirname_result"
+      if test "X$dir" = X.; then
+	odir="$objdir"
+      else
+	odir="$dir/$objdir"
+      fi
+      func_basename "$file"
+      name="$func_basename_result"
+      test "$opt_mode" = uninstall && odir="$dir"
+
+      # Remember odir for removal later, being careful to avoid duplicates
+      if test "$opt_mode" = clean; then
+	case " $rmdirs " in
+	  *" $odir "*) ;;
+	  *) func_append rmdirs " $odir" ;;
+	esac
+      fi
+
+      # Don't error if the file doesn't exist and rm -f was used.
+      if { test -L "$file"; } >/dev/null 2>&1 ||
+	 { test -h "$file"; } >/dev/null 2>&1 ||
+	 test -f "$file"; then
+	:
+      elif test -d "$file"; then
+	exit_status=1
+	continue
+      elif test "$rmforce" = yes; then
+	continue
+      fi
+
+      rmfiles="$file"
+
+      case $name in
+      *.la)
+	# Possibly a libtool archive, so verify it.
+	if func_lalib_p "$file"; then
+	  func_source $dir/$name
+
+	  # Delete the libtool libraries and symlinks.
+	  for n in $library_names; do
+	    func_append rmfiles " $odir/$n"
+	  done
+	  test -n "$old_library" && func_append rmfiles " $odir/$old_library"
+
+	  case "$opt_mode" in
+	  clean)
+	    case " $library_names " in
+	    *" $dlname "*) ;;
+	    *) test -n "$dlname" && func_append rmfiles " $odir/$dlname" ;;
+	    esac
+	    test -n "$libdir" && func_append rmfiles " $odir/$name $odir/${name}i"
+	    ;;
+	  uninstall)
+	    if test -n "$library_names"; then
+	      # Do each command in the postuninstall commands.
+	      func_execute_cmds "$postuninstall_cmds" 'test "$rmforce" = yes || exit_status=1'
+	    fi
+
+	    if test -n "$old_library"; then
+	      # Do each command in the old_postuninstall commands.
+	      func_execute_cmds "$old_postuninstall_cmds" 'test "$rmforce" = yes || exit_status=1'
+	    fi
+	    # FIXME: should reinstall the best remaining shared library.
+	    ;;
+	  esac
+	fi
+	;;
+
+      *.lo)
+	# Possibly a libtool object, so verify it.
+	if func_lalib_p "$file"; then
+
+	  # Read the .lo file
+	  func_source $dir/$name
+
+	  # Add PIC object to the list of files to remove.
+	  if test -n "$pic_object" &&
+	     test "$pic_object" != none; then
+	    func_append rmfiles " $dir/$pic_object"
+	  fi
+
+	  # Add non-PIC object to the list of files to remove.
+	  if test -n "$non_pic_object" &&
+	     test "$non_pic_object" != none; then
+	    func_append rmfiles " $dir/$non_pic_object"
+	  fi
+	fi
+	;;
+
+      *)
+	if test "$opt_mode" = clean ; then
+	  noexename=$name
+	  case $file in
+	  *.exe)
+	    func_stripname '' '.exe' "$file"
+	    file=$func_stripname_result
+	    func_stripname '' '.exe' "$name"
+	    noexename=$func_stripname_result
+	    # $file with .exe has already been added to rmfiles,
+	    # add $file without .exe
+	    func_append rmfiles " $file"
+	    ;;
+	  esac
+	  # Do a test to see if this is a libtool program.
+	  if func_ltwrapper_p "$file"; then
+	    if func_ltwrapper_executable_p "$file"; then
+	      func_ltwrapper_scriptname "$file"
+	      relink_command=
+	      func_source $func_ltwrapper_scriptname_result
+	      func_append rmfiles " $func_ltwrapper_scriptname_result"
+	    else
+	      relink_command=
+	      func_source $dir/$noexename
+	    fi
+
+	    # note $name still contains .exe if it was in $file originally
+	    # as does the version of $file that was added into $rmfiles
+	    func_append rmfiles " $odir/$name $odir/${name}S.${objext}"
+	    if test "$fast_install" = yes && test -n "$relink_command"; then
+	      func_append rmfiles " $odir/lt-$name"
+	    fi
+	    if test "X$noexename" != "X$name" ; then
+	      func_append rmfiles " $odir/lt-${noexename}.c"
+	    fi
+	  fi
+	fi
+	;;
+      esac
+      func_show_eval "$RM $rmfiles" 'exit_status=1'
+    done
+
+    # Try to remove the ${objdir}s in the directories where we deleted files
+    for dir in $rmdirs; do
+      if test -d "$dir"; then
+	func_show_eval "rmdir $dir >/dev/null 2>&1"
+      fi
+    done
+
+    exit $exit_status
+}
+
+{ test "$opt_mode" = uninstall || test "$opt_mode" = clean; } &&
+    func_mode_uninstall ${1+"$@"}
+
+test -z "$opt_mode" && {
+  help="$generic_help"
+  func_fatal_help "you must specify a MODE"
+}
+
+test -z "$exec_cmd" && \
+  func_fatal_help "invalid operation mode \`$opt_mode'"
+
+if test -n "$exec_cmd"; then
+  eval exec "$exec_cmd"
+  exit $EXIT_FAILURE
+fi
+
+exit $exit_status
+
+
+# The TAGs below are defined such that we never get into a situation
+# in which we disable both kinds of libraries.  Given conflicting
+# choices, we go for a static library, that is the most portable,
+# since we can't tell whether shared libraries were disabled because
+# the user asked for that or because the platform doesn't support
+# them.  This is particularly important on AIX, because we don't
+# support having both static and shared libraries enabled at the same
+# time on that platform, so we default to a shared-only configuration.
+# If a disable-shared tag is given, we'll fallback to a static-only
+# configuration.  But we'll never go from static-only to shared-only.
+
+# ### BEGIN LIBTOOL TAG CONFIG: disable-shared
+build_libtool_libs=no
+build_old_libs=yes
+# ### END LIBTOOL TAG CONFIG: disable-shared
+
+# ### BEGIN LIBTOOL TAG CONFIG: disable-static
+build_old_libs=`case $build_libtool_libs in yes) echo no;; *) echo yes;; esac`
+# ### END LIBTOOL TAG CONFIG: disable-static
+
+# Local Variables:
+# mode:shell-script
+# sh-indentation:2
+# End:
+# vi:sw=2
+
diff --git a/m4/libtool.m4 b/m4/libtool.m4
new file mode 100644
index 0000000..44e0ecf
--- /dev/null
+++ b/m4/libtool.m4
@@ -0,0 +1,7982 @@
+# libtool.m4 - Configure libtool for the host system. -*-Autoconf-*-
+#
+#   Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005,
+#                 2006, 2007, 2008, 2009, 2010, 2011 Free Software
+#                 Foundation, Inc.
+#   Written by Gordon Matzigkeit, 1996
+#
+# This file is free software; the Free Software Foundation gives
+# unlimited permission to copy and/or distribute it, with or without
+# modifications, as long as this notice is preserved.
+
+m4_define([_LT_COPYING], [dnl
+#   Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005,
+#                 2006, 2007, 2008, 2009, 2010, 2011 Free Software
+#                 Foundation, Inc.
+#   Written by Gordon Matzigkeit, 1996
+#
+#   This file is part of GNU Libtool.
+#
+# GNU Libtool is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License as
+# published by the Free Software Foundation; either version 2 of
+# the License, or (at your option) any later version.
+#
+# As a special exception to the GNU General Public License,
+# if you distribute this file as part of a program or library that
+# is built using GNU Libtool, you may include this file under the
+# same distribution terms that you use for the rest of that program.
+#
+# GNU Libtool is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GNU Libtool; see the file COPYING.  If not, a copy
+# can be downloaded from http://www.gnu.org/licenses/gpl.html, or
+# obtained by writing to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+])
+
+# serial 57 LT_INIT
+
+
+# LT_PREREQ(VERSION)
+# ------------------
+# Complain and exit if this libtool version is less that VERSION.
+m4_defun([LT_PREREQ],
+[m4_if(m4_version_compare(m4_defn([LT_PACKAGE_VERSION]), [$1]), -1,
+       [m4_default([$3],
+		   [m4_fatal([Libtool version $1 or higher is required],
+		             63)])],
+       [$2])])
+
+
+# _LT_CHECK_BUILDDIR
+# ------------------
+# Complain if the absolute build directory name contains unusual characters
+m4_defun([_LT_CHECK_BUILDDIR],
+[case `pwd` in
+  *\ * | *\	*)
+    AC_MSG_WARN([Libtool does not cope well with whitespace in `pwd`]) ;;
+esac
+])
+
+
+# LT_INIT([OPTIONS])
+# ------------------
+AC_DEFUN([LT_INIT],
+[AC_PREREQ([2.58])dnl We use AC_INCLUDES_DEFAULT
+AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl
+AC_BEFORE([$0], [LT_LANG])dnl
+AC_BEFORE([$0], [LT_OUTPUT])dnl
+AC_BEFORE([$0], [LTDL_INIT])dnl
+m4_require([_LT_CHECK_BUILDDIR])dnl
+
+dnl Autoconf doesn't catch unexpanded LT_ macros by default:
+m4_pattern_forbid([^_?LT_[A-Z_]+$])dnl
+m4_pattern_allow([^(_LT_EOF|LT_DLGLOBAL|LT_DLLAZY_OR_NOW|LT_MULTI_MODULE)$])dnl
+dnl aclocal doesn't pull ltoptions.m4, ltsugar.m4, or ltversion.m4
+dnl unless we require an AC_DEFUNed macro:
+AC_REQUIRE([LTOPTIONS_VERSION])dnl
+AC_REQUIRE([LTSUGAR_VERSION])dnl
+AC_REQUIRE([LTVERSION_VERSION])dnl
+AC_REQUIRE([LTOBSOLETE_VERSION])dnl
+m4_require([_LT_PROG_LTMAIN])dnl
+
+_LT_SHELL_INIT([SHELL=${CONFIG_SHELL-/bin/sh}])
+
+dnl Parse OPTIONS
+_LT_SET_OPTIONS([$0], [$1])
+
+# This can be used to rebuild libtool when needed
+LIBTOOL_DEPS="$ltmain"
+
+# Always use our own libtool.
+LIBTOOL='$(SHELL) $(top_builddir)/libtool'
+AC_SUBST(LIBTOOL)dnl
+
+_LT_SETUP
+
+# Only expand once:
+m4_define([LT_INIT])
+])# LT_INIT
+
+# Old names:
+AU_ALIAS([AC_PROG_LIBTOOL], [LT_INIT])
+AU_ALIAS([AM_PROG_LIBTOOL], [LT_INIT])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_PROG_LIBTOOL], [])
+dnl AC_DEFUN([AM_PROG_LIBTOOL], [])
+
+
+# _LT_CC_BASENAME(CC)
+# -------------------
+# Calculate cc_basename.  Skip known compiler wrappers and cross-prefix.
+m4_defun([_LT_CC_BASENAME],
+[for cc_temp in $1""; do
+  case $cc_temp in
+    compile | *[[\\/]]compile | ccache | *[[\\/]]ccache ) ;;
+    distcc | *[[\\/]]distcc | purify | *[[\\/]]purify ) ;;
+    \-*) ;;
+    *) break;;
+  esac
+done
+cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"`
+])
+
+
+# _LT_FILEUTILS_DEFAULTS
+# ----------------------
+# It is okay to use these file commands and assume they have been set
+# sensibly after `m4_require([_LT_FILEUTILS_DEFAULTS])'.
+m4_defun([_LT_FILEUTILS_DEFAULTS],
+[: ${CP="cp -f"}
+: ${MV="mv -f"}
+: ${RM="rm -f"}
+])# _LT_FILEUTILS_DEFAULTS
+
+
+# _LT_SETUP
+# ---------
+m4_defun([_LT_SETUP],
+[AC_REQUIRE([AC_CANONICAL_HOST])dnl
+AC_REQUIRE([AC_CANONICAL_BUILD])dnl
+AC_REQUIRE([_LT_PREPARE_SED_QUOTE_VARS])dnl
+AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])dnl
+
+_LT_DECL([], [PATH_SEPARATOR], [1], [The PATH separator for the build system])dnl
+dnl
+_LT_DECL([], [host_alias], [0], [The host system])dnl
+_LT_DECL([], [host], [0])dnl
+_LT_DECL([], [host_os], [0])dnl
+dnl
+_LT_DECL([], [build_alias], [0], [The build system])dnl
+_LT_DECL([], [build], [0])dnl
+_LT_DECL([], [build_os], [0])dnl
+dnl
+AC_REQUIRE([AC_PROG_CC])dnl
+AC_REQUIRE([LT_PATH_LD])dnl
+AC_REQUIRE([LT_PATH_NM])dnl
+dnl
+AC_REQUIRE([AC_PROG_LN_S])dnl
+test -z "$LN_S" && LN_S="ln -s"
+_LT_DECL([], [LN_S], [1], [Whether we need soft or hard links])dnl
+dnl
+AC_REQUIRE([LT_CMD_MAX_LEN])dnl
+_LT_DECL([objext], [ac_objext], [0], [Object file suffix (normally "o")])dnl
+_LT_DECL([], [exeext], [0], [Executable file suffix (normally "")])dnl
+dnl
+m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+m4_require([_LT_CHECK_SHELL_FEATURES])dnl
+m4_require([_LT_PATH_CONVERSION_FUNCTIONS])dnl
+m4_require([_LT_CMD_RELOAD])dnl
+m4_require([_LT_CHECK_MAGIC_METHOD])dnl
+m4_require([_LT_CHECK_SHAREDLIB_FROM_LINKLIB])dnl
+m4_require([_LT_CMD_OLD_ARCHIVE])dnl
+m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl
+m4_require([_LT_WITH_SYSROOT])dnl
+
+_LT_CONFIG_LIBTOOL_INIT([
+# See if we are running on zsh, and set the options which allow our
+# commands through without removal of \ escapes INIT.
+if test -n "\${ZSH_VERSION+set}" ; then
+   setopt NO_GLOB_SUBST
+fi
+])
+if test -n "${ZSH_VERSION+set}" ; then
+   setopt NO_GLOB_SUBST
+fi
+
+_LT_CHECK_OBJDIR
+
+m4_require([_LT_TAG_COMPILER])dnl
+
+case $host_os in
+aix3*)
+  # AIX sometimes has problems with the GCC collect2 program.  For some
+  # reason, if we set the COLLECT_NAMES environment variable, the problems
+  # vanish in a puff of smoke.
+  if test "X${COLLECT_NAMES+set}" != Xset; then
+    COLLECT_NAMES=
+    export COLLECT_NAMES
+  fi
+  ;;
+esac
+
+# Global variables:
+ofile=libtool
+can_build_shared=yes
+
+# All known linkers require a `.a' archive for static linking (except MSVC,
+# which needs '.lib').
+libext=a
+
+with_gnu_ld="$lt_cv_prog_gnu_ld"
+
+old_CC="$CC"
+old_CFLAGS="$CFLAGS"
+
+# Set sane defaults for various variables
+test -z "$CC" && CC=cc
+test -z "$LTCC" && LTCC=$CC
+test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS
+test -z "$LD" && LD=ld
+test -z "$ac_objext" && ac_objext=o
+
+_LT_CC_BASENAME([$compiler])
+
+# Only perform the check for file, if the check method requires it
+test -z "$MAGIC_CMD" && MAGIC_CMD=file
+case $deplibs_check_method in
+file_magic*)
+  if test "$file_magic_cmd" = '$MAGIC_CMD'; then
+    _LT_PATH_MAGIC
+  fi
+  ;;
+esac
+
+# Use C for the default configuration in the libtool script
+LT_SUPPORTED_TAG([CC])
+_LT_LANG_C_CONFIG
+_LT_LANG_DEFAULT_CONFIG
+_LT_CONFIG_COMMANDS
+])# _LT_SETUP
+
+
+# _LT_PREPARE_SED_QUOTE_VARS
+# --------------------------
+# Define a few sed substitution that help us do robust quoting.
+m4_defun([_LT_PREPARE_SED_QUOTE_VARS],
+[# Backslashify metacharacters that are still active within
+# double-quoted strings.
+sed_quote_subst='s/\([["`$\\]]\)/\\\1/g'
+
+# Same as above, but do not quote variable references.
+double_quote_subst='s/\([["`\\]]\)/\\\1/g'
+
+# Sed substitution to delay expansion of an escaped shell variable in a
+# double_quote_subst'ed string.
+delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g'
+
+# Sed substitution to delay expansion of an escaped single quote.
+delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g'
+
+# Sed substitution to avoid accidental globbing in evaled expressions
+no_glob_subst='s/\*/\\\*/g'
+])
+
+# _LT_PROG_LTMAIN
+# ---------------
+# Note that this code is called both from `configure', and `config.status'
+# now that we use AC_CONFIG_COMMANDS to generate libtool.  Notably,
+# `config.status' has no value for ac_aux_dir unless we are using Automake,
+# so we pass a copy along to make sure it has a sensible value anyway.
+m4_defun([_LT_PROG_LTMAIN],
+[m4_ifdef([AC_REQUIRE_AUX_FILE], [AC_REQUIRE_AUX_FILE([ltmain.sh])])dnl
+_LT_CONFIG_LIBTOOL_INIT([ac_aux_dir='$ac_aux_dir'])
+ltmain="$ac_aux_dir/ltmain.sh"
+])# _LT_PROG_LTMAIN
+
+
+## ------------------------------------- ##
+## Accumulate code for creating libtool. ##
+## ------------------------------------- ##
+
+# So that we can recreate a full libtool script including additional
+# tags, we accumulate the chunks of code to send to AC_CONFIG_COMMANDS
+# in macros and then make a single call at the end using the `libtool'
+# label.
+
+
+# _LT_CONFIG_LIBTOOL_INIT([INIT-COMMANDS])
+# ----------------------------------------
+# Register INIT-COMMANDS to be passed to AC_CONFIG_COMMANDS later.
+m4_define([_LT_CONFIG_LIBTOOL_INIT],
+[m4_ifval([$1],
+          [m4_append([_LT_OUTPUT_LIBTOOL_INIT],
+                     [$1
+])])])
+
+# Initialize.
+m4_define([_LT_OUTPUT_LIBTOOL_INIT])
+
+
+# _LT_CONFIG_LIBTOOL([COMMANDS])
+# ------------------------------
+# Register COMMANDS to be passed to AC_CONFIG_COMMANDS later.
+m4_define([_LT_CONFIG_LIBTOOL],
+[m4_ifval([$1],
+          [m4_append([_LT_OUTPUT_LIBTOOL_COMMANDS],
+                     [$1
+])])])
+
+# Initialize.
+m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS])
+
+
+# _LT_CONFIG_SAVE_COMMANDS([COMMANDS], [INIT_COMMANDS])
+# -----------------------------------------------------
+m4_defun([_LT_CONFIG_SAVE_COMMANDS],
+[_LT_CONFIG_LIBTOOL([$1])
+_LT_CONFIG_LIBTOOL_INIT([$2])
+])
+
+
+# _LT_FORMAT_COMMENT([COMMENT])
+# -----------------------------
+# Add leading comment marks to the start of each line, and a trailing
+# full-stop to the whole comment if one is not present already.
+m4_define([_LT_FORMAT_COMMENT],
+[m4_ifval([$1], [
+m4_bpatsubst([m4_bpatsubst([$1], [^ *], [# ])],
+              [['`$\]], [\\\&])]m4_bmatch([$1], [[!?.]$], [], [.])
+)])
+
+
+
+## ------------------------ ##
+## FIXME: Eliminate VARNAME ##
+## ------------------------ ##
+
+
+# _LT_DECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION], [IS-TAGGED?])
+# -------------------------------------------------------------------
+# CONFIGNAME is the name given to the value in the libtool script.
+# VARNAME is the (base) name used in the configure script.
+# VALUE may be 0, 1 or 2 for a computed quote escaped value based on
+# VARNAME.  Any other value will be used directly.
+m4_define([_LT_DECL],
+[lt_if_append_uniq([lt_decl_varnames], [$2], [, ],
+    [lt_dict_add_subkey([lt_decl_dict], [$2], [libtool_name],
+	[m4_ifval([$1], [$1], [$2])])
+    lt_dict_add_subkey([lt_decl_dict], [$2], [value], [$3])
+    m4_ifval([$4],
+	[lt_dict_add_subkey([lt_decl_dict], [$2], [description], [$4])])
+    lt_dict_add_subkey([lt_decl_dict], [$2],
+	[tagged?], [m4_ifval([$5], [yes], [no])])])
+])
+
+
+# _LT_TAGDECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION])
+# --------------------------------------------------------
+m4_define([_LT_TAGDECL], [_LT_DECL([$1], [$2], [$3], [$4], [yes])])
+
+
+# lt_decl_tag_varnames([SEPARATOR], [VARNAME1...])
+# ------------------------------------------------
+m4_define([lt_decl_tag_varnames],
+[_lt_decl_filter([tagged?], [yes], $@)])
+
+
+# _lt_decl_filter(SUBKEY, VALUE, [SEPARATOR], [VARNAME1..])
+# ---------------------------------------------------------
+m4_define([_lt_decl_filter],
+[m4_case([$#],
+  [0], [m4_fatal([$0: too few arguments: $#])],
+  [1], [m4_fatal([$0: too few arguments: $#: $1])],
+  [2], [lt_dict_filter([lt_decl_dict], [$1], [$2], [], lt_decl_varnames)],
+  [3], [lt_dict_filter([lt_decl_dict], [$1], [$2], [$3], lt_decl_varnames)],
+  [lt_dict_filter([lt_decl_dict], $@)])[]dnl
+])
+
+
+# lt_decl_quote_varnames([SEPARATOR], [VARNAME1...])
+# --------------------------------------------------
+m4_define([lt_decl_quote_varnames],
+[_lt_decl_filter([value], [1], $@)])
+
+
+# lt_decl_dquote_varnames([SEPARATOR], [VARNAME1...])
+# ---------------------------------------------------
+m4_define([lt_decl_dquote_varnames],
+[_lt_decl_filter([value], [2], $@)])
+
+
+# lt_decl_varnames_tagged([SEPARATOR], [VARNAME1...])
+# ---------------------------------------------------
+m4_define([lt_decl_varnames_tagged],
+[m4_assert([$# <= 2])dnl
+_$0(m4_quote(m4_default([$1], [[, ]])),
+    m4_ifval([$2], [[$2]], [m4_dquote(lt_decl_tag_varnames)]),
+    m4_split(m4_normalize(m4_quote(_LT_TAGS)), [ ]))])
+m4_define([_lt_decl_varnames_tagged],
+[m4_ifval([$3], [lt_combine([$1], [$2], [_], $3)])])
+
+
+# lt_decl_all_varnames([SEPARATOR], [VARNAME1...])
+# ------------------------------------------------
+m4_define([lt_decl_all_varnames],
+[_$0(m4_quote(m4_default([$1], [[, ]])),
+     m4_if([$2], [],
+	   m4_quote(lt_decl_varnames),
+	m4_quote(m4_shift($@))))[]dnl
+])
+m4_define([_lt_decl_all_varnames],
+[lt_join($@, lt_decl_varnames_tagged([$1],
+			lt_decl_tag_varnames([[, ]], m4_shift($@))))dnl
+])
+
+
+# _LT_CONFIG_STATUS_DECLARE([VARNAME])
+# ------------------------------------
+# Quote a variable value, and forward it to `config.status' so that its
+# declaration there will have the same value as in `configure'.  VARNAME
+# must have a single quote delimited value for this to work.
+m4_define([_LT_CONFIG_STATUS_DECLARE],
+[$1='`$ECHO "$][$1" | $SED "$delay_single_quote_subst"`'])
+
+
+# _LT_CONFIG_STATUS_DECLARATIONS
+# ------------------------------
+# We delimit libtool config variables with single quotes, so when
+# we write them to config.status, we have to be sure to quote all
+# embedded single quotes properly.  In configure, this macro expands
+# each variable declared with _LT_DECL (and _LT_TAGDECL) into:
+#
+#    <var>='`$ECHO "$<var>" | $SED "$delay_single_quote_subst"`'
+m4_defun([_LT_CONFIG_STATUS_DECLARATIONS],
+[m4_foreach([_lt_var], m4_quote(lt_decl_all_varnames),
+    [m4_n([_LT_CONFIG_STATUS_DECLARE(_lt_var)])])])
+
+
+# _LT_LIBTOOL_TAGS
+# ----------------
+# Output comment and list of tags supported by the script
+m4_defun([_LT_LIBTOOL_TAGS],
+[_LT_FORMAT_COMMENT([The names of the tagged configurations supported by this script])dnl
+available_tags="_LT_TAGS"dnl
+])
+
+
+# _LT_LIBTOOL_DECLARE(VARNAME, [TAG])
+# -----------------------------------
+# Extract the dictionary values for VARNAME (optionally with TAG) and
+# expand to a commented shell variable setting:
+#
+#    # Some comment about what VAR is for.
+#    visible_name=$lt_internal_name
+m4_define([_LT_LIBTOOL_DECLARE],
+[_LT_FORMAT_COMMENT(m4_quote(lt_dict_fetch([lt_decl_dict], [$1],
+					   [description])))[]dnl
+m4_pushdef([_libtool_name],
+    m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [libtool_name])))[]dnl
+m4_case(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [value])),
+    [0], [_libtool_name=[$]$1],
+    [1], [_libtool_name=$lt_[]$1],
+    [2], [_libtool_name=$lt_[]$1],
+    [_libtool_name=lt_dict_fetch([lt_decl_dict], [$1], [value])])[]dnl
+m4_ifval([$2], [_$2])[]m4_popdef([_libtool_name])[]dnl
+])
+
+
+# _LT_LIBTOOL_CONFIG_VARS
+# -----------------------
+# Produce commented declarations of non-tagged libtool config variables
+# suitable for insertion in the LIBTOOL CONFIG section of the `libtool'
+# script.  Tagged libtool config variables (even for the LIBTOOL CONFIG
+# section) are produced by _LT_LIBTOOL_TAG_VARS.
+m4_defun([_LT_LIBTOOL_CONFIG_VARS],
+[m4_foreach([_lt_var],
+    m4_quote(_lt_decl_filter([tagged?], [no], [], lt_decl_varnames)),
+    [m4_n([_LT_LIBTOOL_DECLARE(_lt_var)])])])
+
+
+# _LT_LIBTOOL_TAG_VARS(TAG)
+# -------------------------
+m4_define([_LT_LIBTOOL_TAG_VARS],
+[m4_foreach([_lt_var], m4_quote(lt_decl_tag_varnames),
+    [m4_n([_LT_LIBTOOL_DECLARE(_lt_var, [$1])])])])
+
+
+# _LT_TAGVAR(VARNAME, [TAGNAME])
+# ------------------------------
+m4_define([_LT_TAGVAR], [m4_ifval([$2], [$1_$2], [$1])])
+
+
+# _LT_CONFIG_COMMANDS
+# -------------------
+# Send accumulated output to $CONFIG_STATUS.  Thanks to the lists of
+# variables for single and double quote escaping we saved from calls
+# to _LT_DECL, we can put quote escaped variables declarations
+# into `config.status', and then the shell code to quote escape them in
+# for loops in `config.status'.  Finally, any additional code accumulated
+# from calls to _LT_CONFIG_LIBTOOL_INIT is expanded.
+m4_defun([_LT_CONFIG_COMMANDS],
+[AC_PROVIDE_IFELSE([LT_OUTPUT],
+	dnl If the libtool generation code has been placed in $CONFIG_LT,
+	dnl instead of duplicating it all over again into config.status,
+	dnl then we will have config.status run $CONFIG_LT later, so it
+	dnl needs to know what name is stored there:
+        [AC_CONFIG_COMMANDS([libtool],
+            [$SHELL $CONFIG_LT || AS_EXIT(1)], [CONFIG_LT='$CONFIG_LT'])],
+    dnl If the libtool generation code is destined for config.status,
+    dnl expand the accumulated commands and init code now:
+    [AC_CONFIG_COMMANDS([libtool],
+        [_LT_OUTPUT_LIBTOOL_COMMANDS], [_LT_OUTPUT_LIBTOOL_COMMANDS_INIT])])
+])#_LT_CONFIG_COMMANDS
+
+
+# Initialize.
+m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS_INIT],
+[
+
+# The HP-UX ksh and POSIX shell print the target directory to stdout
+# if CDPATH is set.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+sed_quote_subst='$sed_quote_subst'
+double_quote_subst='$double_quote_subst'
+delay_variable_subst='$delay_variable_subst'
+_LT_CONFIG_STATUS_DECLARATIONS
+LTCC='$LTCC'
+LTCFLAGS='$LTCFLAGS'
+compiler='$compiler_DEFAULT'
+
+# A function that is used when there is no print builtin or printf.
+func_fallback_echo ()
+{
+  eval 'cat <<_LTECHO_EOF
+\$[]1
+_LTECHO_EOF'
+}
+
+# Quote evaled strings.
+for var in lt_decl_all_varnames([[ \
+]], lt_decl_quote_varnames); do
+    case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in
+    *[[\\\\\\\`\\"\\\$]]*)
+      eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\""
+      ;;
+    *)
+      eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
+      ;;
+    esac
+done
+
+# Double-quote double-evaled strings.
+for var in lt_decl_all_varnames([[ \
+]], lt_decl_dquote_varnames); do
+    case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in
+    *[[\\\\\\\`\\"\\\$]]*)
+      eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\""
+      ;;
+    *)
+      eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
+      ;;
+    esac
+done
+
+_LT_OUTPUT_LIBTOOL_INIT
+])
+
+# _LT_GENERATED_FILE_INIT(FILE, [COMMENT])
+# ------------------------------------
+# Generate a child script FILE with all initialization necessary to
+# reuse the environment learned by the parent script, and make the
+# file executable.  If COMMENT is supplied, it is inserted after the
+# `#!' sequence but before initialization text begins.  After this
+# macro, additional text can be appended to FILE to form the body of
+# the child script.  The macro ends with non-zero status if the
+# file could not be fully written (such as if the disk is full).
+m4_ifdef([AS_INIT_GENERATED],
+[m4_defun([_LT_GENERATED_FILE_INIT],[AS_INIT_GENERATED($@)])],
+[m4_defun([_LT_GENERATED_FILE_INIT],
+[m4_require([AS_PREPARE])]dnl
+[m4_pushdef([AS_MESSAGE_LOG_FD])]dnl
+[lt_write_fail=0
+cat >$1 <<_ASEOF || lt_write_fail=1
+#! $SHELL
+# Generated by $as_me.
+$2
+SHELL=\${CONFIG_SHELL-$SHELL}
+export SHELL
+_ASEOF
+cat >>$1 <<\_ASEOF || lt_write_fail=1
+AS_SHELL_SANITIZE
+_AS_PREPARE
+exec AS_MESSAGE_FD>&1
+_ASEOF
+test $lt_write_fail = 0 && chmod +x $1[]dnl
+m4_popdef([AS_MESSAGE_LOG_FD])])])# _LT_GENERATED_FILE_INIT
+
+# LT_OUTPUT
+# ---------
+# This macro allows early generation of the libtool script (before
+# AC_OUTPUT is called), incase it is used in configure for compilation
+# tests.
+AC_DEFUN([LT_OUTPUT],
+[: ${CONFIG_LT=./config.lt}
+AC_MSG_NOTICE([creating $CONFIG_LT])
+_LT_GENERATED_FILE_INIT(["$CONFIG_LT"],
+[# Run this file to recreate a libtool stub with the current configuration.])
+
+cat >>"$CONFIG_LT" <<\_LTEOF
+lt_cl_silent=false
+exec AS_MESSAGE_LOG_FD>>config.log
+{
+  echo
+  AS_BOX([Running $as_me.])
+} >&AS_MESSAGE_LOG_FD
+
+lt_cl_help="\
+\`$as_me' creates a local libtool stub from the current configuration,
+for use in further configure time tests before the real libtool is
+generated.
+
+Usage: $[0] [[OPTIONS]]
+
+  -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
+
+Report bugs to <bug-libtool at gnu.org>."
+
+lt_cl_version="\
+m4_ifset([AC_PACKAGE_NAME], [AC_PACKAGE_NAME ])config.lt[]dnl
+m4_ifset([AC_PACKAGE_VERSION], [ AC_PACKAGE_VERSION])
+configured by $[0], generated by m4_PACKAGE_STRING.
+
+Copyright (C) 2011 Free Software Foundation, Inc.
+This config.lt script is free software; the Free Software Foundation
+gives unlimited permision to copy, distribute and modify it."
+
+while test $[#] != 0
+do
+  case $[1] in
+    --version | --v* | -V )
+      echo "$lt_cl_version"; exit 0 ;;
+    --help | --h* | -h )
+      echo "$lt_cl_help"; exit 0 ;;
+    --debug | --d* | -d )
+      debug=: ;;
+    --quiet | --q* | --silent | --s* | -q )
+      lt_cl_silent=: ;;
+
+    -*) AC_MSG_ERROR([unrecognized option: $[1]
+Try \`$[0] --help' for more information.]) ;;
+
+    *) AC_MSG_ERROR([unrecognized argument: $[1]
+Try \`$[0] --help' for more information.]) ;;
+  esac
+  shift
+done
+
+if $lt_cl_silent; then
+  exec AS_MESSAGE_FD>/dev/null
+fi
+_LTEOF
+
+cat >>"$CONFIG_LT" <<_LTEOF
+_LT_OUTPUT_LIBTOOL_COMMANDS_INIT
+_LTEOF
+
+cat >>"$CONFIG_LT" <<\_LTEOF
+AC_MSG_NOTICE([creating $ofile])
+_LT_OUTPUT_LIBTOOL_COMMANDS
+AS_EXIT(0)
+_LTEOF
+chmod +x "$CONFIG_LT"
+
+# configure is writing to config.log, but config.lt does its own redirection,
+# appending to config.log, which fails on DOS, as config.log is still kept
+# open by configure.  Here we exec the FD to /dev/null, effectively closing
+# config.log, so it can be properly (re)opened and appended to by config.lt.
+lt_cl_success=:
+test "$silent" = yes &&
+  lt_config_lt_args="$lt_config_lt_args --quiet"
+exec AS_MESSAGE_LOG_FD>/dev/null
+$SHELL "$CONFIG_LT" $lt_config_lt_args || lt_cl_success=false
+exec AS_MESSAGE_LOG_FD>>config.log
+$lt_cl_success || AS_EXIT(1)
+])# LT_OUTPUT
+
+
+# _LT_CONFIG(TAG)
+# ---------------
+# If TAG is the built-in tag, create an initial libtool script with a
+# default configuration from the untagged config vars.  Otherwise add code
+# to config.status for appending the configuration named by TAG from the
+# matching tagged config vars.
+m4_defun([_LT_CONFIG],
+[m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+_LT_CONFIG_SAVE_COMMANDS([
+  m4_define([_LT_TAG], m4_if([$1], [], [C], [$1]))dnl
+  m4_if(_LT_TAG, [C], [
+    # See if we are running on zsh, and set the options which allow our
+    # commands through without removal of \ escapes.
+    if test -n "${ZSH_VERSION+set}" ; then
+      setopt NO_GLOB_SUBST
+    fi
+
+    cfgfile="${ofile}T"
+    trap "$RM \"$cfgfile\"; exit 1" 1 2 15
+    $RM "$cfgfile"
+
+    cat <<_LT_EOF >> "$cfgfile"
+#! $SHELL
+
+# `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services.
+# Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION
+# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
+# NOTE: Changes made to this file will be lost: look at ltmain.sh.
+#
+_LT_COPYING
+_LT_LIBTOOL_TAGS
+
+# ### BEGIN LIBTOOL CONFIG
+_LT_LIBTOOL_CONFIG_VARS
+_LT_LIBTOOL_TAG_VARS
+# ### END LIBTOOL CONFIG
+
+_LT_EOF
+
+  case $host_os in
+  aix3*)
+    cat <<\_LT_EOF >> "$cfgfile"
+# AIX sometimes has problems with the GCC collect2 program.  For some
+# reason, if we set the COLLECT_NAMES environment variable, the problems
+# vanish in a puff of smoke.
+if test "X${COLLECT_NAMES+set}" != Xset; then
+  COLLECT_NAMES=
+  export COLLECT_NAMES
+fi
+_LT_EOF
+    ;;
+  esac
+
+  _LT_PROG_LTMAIN
+
+  # We use sed instead of cat because bash on DJGPP gets confused if
+  # if finds mixed CR/LF and LF-only lines.  Since sed operates in
+  # text mode, it properly converts lines to CR/LF.  This bash problem
+  # is reportedly fixed, but why not run on old versions too?
+  sed '$q' "$ltmain" >> "$cfgfile" \
+     || (rm -f "$cfgfile"; exit 1)
+
+  _LT_PROG_REPLACE_SHELLFNS
+
+   mv -f "$cfgfile" "$ofile" ||
+    (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile")
+  chmod +x "$ofile"
+],
+[cat <<_LT_EOF >> "$ofile"
+
+dnl Unfortunately we have to use $1 here, since _LT_TAG is not expanded
+dnl in a comment (ie after a #).
+# ### BEGIN LIBTOOL TAG CONFIG: $1
+_LT_LIBTOOL_TAG_VARS(_LT_TAG)
+# ### END LIBTOOL TAG CONFIG: $1
+_LT_EOF
+])dnl /m4_if
+],
+[m4_if([$1], [], [
+    PACKAGE='$PACKAGE'
+    VERSION='$VERSION'
+    TIMESTAMP='$TIMESTAMP'
+    RM='$RM'
+    ofile='$ofile'], [])
+])dnl /_LT_CONFIG_SAVE_COMMANDS
+])# _LT_CONFIG
+
+
+# LT_SUPPORTED_TAG(TAG)
+# ---------------------
+# Trace this macro to discover what tags are supported by the libtool
+# --tag option, using:
+#    autoconf --trace 'LT_SUPPORTED_TAG:$1'
+AC_DEFUN([LT_SUPPORTED_TAG], [])
+
+
+# C support is built-in for now
+m4_define([_LT_LANG_C_enabled], [])
+m4_define([_LT_TAGS], [])
+
+
+# LT_LANG(LANG)
+# -------------
+# Enable libtool support for the given language if not already enabled.
+AC_DEFUN([LT_LANG],
+[AC_BEFORE([$0], [LT_OUTPUT])dnl
+m4_case([$1],
+  [C],			[_LT_LANG(C)],
+  [C++],		[_LT_LANG(CXX)],
+  [Go],			[_LT_LANG(GO)],
+  [Java],		[_LT_LANG(GCJ)],
+  [Fortran 77],		[_LT_LANG(F77)],
+  [Fortran],		[_LT_LANG(FC)],
+  [Windows Resource],	[_LT_LANG(RC)],
+  [m4_ifdef([_LT_LANG_]$1[_CONFIG],
+    [_LT_LANG($1)],
+    [m4_fatal([$0: unsupported language: "$1"])])])dnl
+])# LT_LANG
+
+
+# _LT_LANG(LANGNAME)
+# ------------------
+m4_defun([_LT_LANG],
+[m4_ifdef([_LT_LANG_]$1[_enabled], [],
+  [LT_SUPPORTED_TAG([$1])dnl
+  m4_append([_LT_TAGS], [$1 ])dnl
+  m4_define([_LT_LANG_]$1[_enabled], [])dnl
+  _LT_LANG_$1_CONFIG($1)])dnl
+])# _LT_LANG
+
+
+m4_ifndef([AC_PROG_GO], [
+############################################################
+# NOTE: This macro has been submitted for inclusion into   #
+#  GNU Autoconf as AC_PROG_GO.  When it is available in    #
+#  a released version of Autoconf we should remove this    #
+#  macro and use it instead.                               #
+############################################################
+m4_defun([AC_PROG_GO],
+[AC_LANG_PUSH(Go)dnl
+AC_ARG_VAR([GOC],     [Go compiler command])dnl
+AC_ARG_VAR([GOFLAGS], [Go compiler flags])dnl
+_AC_ARG_VAR_LDFLAGS()dnl
+AC_CHECK_TOOL(GOC, gccgo)
+if test -z "$GOC"; then
+  if test -n "$ac_tool_prefix"; then
+    AC_CHECK_PROG(GOC, [${ac_tool_prefix}gccgo], [${ac_tool_prefix}gccgo])
+  fi
+fi
+if test -z "$GOC"; then
+  AC_CHECK_PROG(GOC, gccgo, gccgo, false)
+fi
+])#m4_defun
+])#m4_ifndef
+
+
+# _LT_LANG_DEFAULT_CONFIG
+# -----------------------
+m4_defun([_LT_LANG_DEFAULT_CONFIG],
+[AC_PROVIDE_IFELSE([AC_PROG_CXX],
+  [LT_LANG(CXX)],
+  [m4_define([AC_PROG_CXX], defn([AC_PROG_CXX])[LT_LANG(CXX)])])
+
+AC_PROVIDE_IFELSE([AC_PROG_F77],
+  [LT_LANG(F77)],
+  [m4_define([AC_PROG_F77], defn([AC_PROG_F77])[LT_LANG(F77)])])
+
+AC_PROVIDE_IFELSE([AC_PROG_FC],
+  [LT_LANG(FC)],
+  [m4_define([AC_PROG_FC], defn([AC_PROG_FC])[LT_LANG(FC)])])
+
+dnl The call to [A][M_PROG_GCJ] is quoted like that to stop aclocal
+dnl pulling things in needlessly.
+AC_PROVIDE_IFELSE([AC_PROG_GCJ],
+  [LT_LANG(GCJ)],
+  [AC_PROVIDE_IFELSE([A][M_PROG_GCJ],
+    [LT_LANG(GCJ)],
+    [AC_PROVIDE_IFELSE([LT_PROG_GCJ],
+      [LT_LANG(GCJ)],
+      [m4_ifdef([AC_PROG_GCJ],
+	[m4_define([AC_PROG_GCJ], defn([AC_PROG_GCJ])[LT_LANG(GCJ)])])
+       m4_ifdef([A][M_PROG_GCJ],
+	[m4_define([A][M_PROG_GCJ], defn([A][M_PROG_GCJ])[LT_LANG(GCJ)])])
+       m4_ifdef([LT_PROG_GCJ],
+	[m4_define([LT_PROG_GCJ], defn([LT_PROG_GCJ])[LT_LANG(GCJ)])])])])])
+
+AC_PROVIDE_IFELSE([AC_PROG_GO],
+  [LT_LANG(GO)],
+  [m4_define([AC_PROG_GO], defn([AC_PROG_GO])[LT_LANG(GO)])])
+
+AC_PROVIDE_IFELSE([LT_PROG_RC],
+  [LT_LANG(RC)],
+  [m4_define([LT_PROG_RC], defn([LT_PROG_RC])[LT_LANG(RC)])])
+])# _LT_LANG_DEFAULT_CONFIG
+
+# Obsolete macros:
+AU_DEFUN([AC_LIBTOOL_CXX], [LT_LANG(C++)])
+AU_DEFUN([AC_LIBTOOL_F77], [LT_LANG(Fortran 77)])
+AU_DEFUN([AC_LIBTOOL_FC], [LT_LANG(Fortran)])
+AU_DEFUN([AC_LIBTOOL_GCJ], [LT_LANG(Java)])
+AU_DEFUN([AC_LIBTOOL_RC], [LT_LANG(Windows Resource)])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LIBTOOL_CXX], [])
+dnl AC_DEFUN([AC_LIBTOOL_F77], [])
+dnl AC_DEFUN([AC_LIBTOOL_FC], [])
+dnl AC_DEFUN([AC_LIBTOOL_GCJ], [])
+dnl AC_DEFUN([AC_LIBTOOL_RC], [])
+
+
+# _LT_TAG_COMPILER
+# ----------------
+m4_defun([_LT_TAG_COMPILER],
+[AC_REQUIRE([AC_PROG_CC])dnl
+
+_LT_DECL([LTCC], [CC], [1], [A C compiler])dnl
+_LT_DECL([LTCFLAGS], [CFLAGS], [1], [LTCC compiler flags])dnl
+_LT_TAGDECL([CC], [compiler], [1], [A language specific compiler])dnl
+_LT_TAGDECL([with_gcc], [GCC], [0], [Is the compiler the GNU compiler?])dnl
+
+# If no C compiler was specified, use CC.
+LTCC=${LTCC-"$CC"}
+
+# If no C compiler flags were specified, use CFLAGS.
+LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
+
+# Allow CC to be a program name with arguments.
+compiler=$CC
+])# _LT_TAG_COMPILER
+
+
+# _LT_COMPILER_BOILERPLATE
+# ------------------------
+# Check for compiler boilerplate output or warnings with
+# the simple compiler test code.
+m4_defun([_LT_COMPILER_BOILERPLATE],
+[m4_require([_LT_DECL_SED])dnl
+ac_outfile=conftest.$ac_objext
+echo "$lt_simple_compile_test_code" >conftest.$ac_ext
+eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_compiler_boilerplate=`cat conftest.err`
+$RM conftest*
+])# _LT_COMPILER_BOILERPLATE
+
+
+# _LT_LINKER_BOILERPLATE
+# ----------------------
+# Check for linker boilerplate output or warnings with
+# the simple link test code.
+m4_defun([_LT_LINKER_BOILERPLATE],
+[m4_require([_LT_DECL_SED])dnl
+ac_outfile=conftest.$ac_objext
+echo "$lt_simple_link_test_code" >conftest.$ac_ext
+eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_linker_boilerplate=`cat conftest.err`
+$RM -r conftest*
+])# _LT_LINKER_BOILERPLATE
+
+# _LT_REQUIRED_DARWIN_CHECKS
+# -------------------------
+m4_defun_once([_LT_REQUIRED_DARWIN_CHECKS],[
+  case $host_os in
+    rhapsody* | darwin*)
+    AC_CHECK_TOOL([DSYMUTIL], [dsymutil], [:])
+    AC_CHECK_TOOL([NMEDIT], [nmedit], [:])
+    AC_CHECK_TOOL([LIPO], [lipo], [:])
+    AC_CHECK_TOOL([OTOOL], [otool], [:])
+    AC_CHECK_TOOL([OTOOL64], [otool64], [:])
+    _LT_DECL([], [DSYMUTIL], [1],
+      [Tool to manipulate archived DWARF debug symbol files on Mac OS X])
+    _LT_DECL([], [NMEDIT], [1],
+      [Tool to change global to local symbols on Mac OS X])
+    _LT_DECL([], [LIPO], [1],
+      [Tool to manipulate fat objects and archives on Mac OS X])
+    _LT_DECL([], [OTOOL], [1],
+      [ldd/readelf like tool for Mach-O binaries on Mac OS X])
+    _LT_DECL([], [OTOOL64], [1],
+      [ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4])
+
+    AC_CACHE_CHECK([for -single_module linker flag],[lt_cv_apple_cc_single_mod],
+      [lt_cv_apple_cc_single_mod=no
+      if test -z "${LT_MULTI_MODULE}"; then
+	# By default we will add the -single_module flag. You can override
+	# by either setting the environment variable LT_MULTI_MODULE
+	# non-empty at configure time, or by adding -multi_module to the
+	# link flags.
+	rm -rf libconftest.dylib*
+	echo "int foo(void){return 1;}" > conftest.c
+	echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \
+-dynamiclib -Wl,-single_module conftest.c" >&AS_MESSAGE_LOG_FD
+	$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \
+	  -dynamiclib -Wl,-single_module conftest.c 2>conftest.err
+        _lt_result=$?
+	# If there is a non-empty error log, and "single_module"
+	# appears in it, assume the flag caused a linker warning
+        if test -s conftest.err && $GREP single_module conftest.err; then
+	  cat conftest.err >&AS_MESSAGE_LOG_FD
+	# Otherwise, if the output was created with a 0 exit code from
+	# the compiler, it worked.
+	elif test -f libconftest.dylib && test $_lt_result -eq 0; then
+	  lt_cv_apple_cc_single_mod=yes
+	else
+	  cat conftest.err >&AS_MESSAGE_LOG_FD
+	fi
+	rm -rf libconftest.dylib*
+	rm -f conftest.*
+      fi])
+
+    AC_CACHE_CHECK([for -exported_symbols_list linker flag],
+      [lt_cv_ld_exported_symbols_list],
+      [lt_cv_ld_exported_symbols_list=no
+      save_LDFLAGS=$LDFLAGS
+      echo "_main" > conftest.sym
+      LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym"
+      AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])],
+	[lt_cv_ld_exported_symbols_list=yes],
+	[lt_cv_ld_exported_symbols_list=no])
+	LDFLAGS="$save_LDFLAGS"
+    ])
+
+    AC_CACHE_CHECK([for -force_load linker flag],[lt_cv_ld_force_load],
+      [lt_cv_ld_force_load=no
+      cat > conftest.c << _LT_EOF
+int forced_loaded() { return 2;}
+_LT_EOF
+      echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&AS_MESSAGE_LOG_FD
+      $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&AS_MESSAGE_LOG_FD
+      echo "$AR cru libconftest.a conftest.o" >&AS_MESSAGE_LOG_FD
+      $AR cru libconftest.a conftest.o 2>&AS_MESSAGE_LOG_FD
+      echo "$RANLIB libconftest.a" >&AS_MESSAGE_LOG_FD
+      $RANLIB libconftest.a 2>&AS_MESSAGE_LOG_FD
+      cat > conftest.c << _LT_EOF
+int main() { return 0;}
+_LT_EOF
+      echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&AS_MESSAGE_LOG_FD
+      $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err
+      _lt_result=$?
+      if test -s conftest.err && $GREP force_load conftest.err; then
+	cat conftest.err >&AS_MESSAGE_LOG_FD
+      elif test -f conftest && test $_lt_result -eq 0 && $GREP forced_load conftest >/dev/null 2>&1 ; then
+	lt_cv_ld_force_load=yes
+      else
+	cat conftest.err >&AS_MESSAGE_LOG_FD
+      fi
+        rm -f conftest.err libconftest.a conftest conftest.c
+        rm -rf conftest.dSYM
+    ])
+    case $host_os in
+    rhapsody* | darwin1.[[012]])
+      _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;;
+    darwin1.*)
+      _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;;
+    darwin*) # darwin 5.x on
+      # if running on 10.5 or later, the deployment target defaults
+      # to the OS version, if on x86, and 10.4, the deployment
+      # target defaults to 10.4. Don't you love it?
+      case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in
+	10.0,*86*-darwin8*|10.0,*-darwin[[91]]*)
+	  _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;;
+	10.[[012]]*)
+	  _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;;
+	10.*)
+	  _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;;
+      esac
+    ;;
+  esac
+    if test "$lt_cv_apple_cc_single_mod" = "yes"; then
+      _lt_dar_single_mod='$single_module'
+    fi
+    if test "$lt_cv_ld_exported_symbols_list" = "yes"; then
+      _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym'
+    else
+      _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}'
+    fi
+    if test "$DSYMUTIL" != ":" && test "$lt_cv_ld_force_load" = "no"; then
+      _lt_dsymutil='~$DSYMUTIL $lib || :'
+    else
+      _lt_dsymutil=
+    fi
+    ;;
+  esac
+])
+
+
+# _LT_DARWIN_LINKER_FEATURES([TAG])
+# ---------------------------------
+# Checks for linker and compiler features on darwin
+m4_defun([_LT_DARWIN_LINKER_FEATURES],
+[
+  m4_require([_LT_REQUIRED_DARWIN_CHECKS])
+  _LT_TAGVAR(archive_cmds_need_lc, $1)=no
+  _LT_TAGVAR(hardcode_direct, $1)=no
+  _LT_TAGVAR(hardcode_automatic, $1)=yes
+  _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported
+  if test "$lt_cv_ld_force_load" = "yes"; then
+    _LT_TAGVAR(whole_archive_flag_spec, $1)='`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`'
+    m4_case([$1], [F77], [_LT_TAGVAR(compiler_needs_object, $1)=yes],
+                  [FC],  [_LT_TAGVAR(compiler_needs_object, $1)=yes])
+  else
+    _LT_TAGVAR(whole_archive_flag_spec, $1)=''
+  fi
+  _LT_TAGVAR(link_all_deplibs, $1)=yes
+  _LT_TAGVAR(allow_undefined_flag, $1)="$_lt_dar_allow_undefined"
+  case $cc_basename in
+     ifort*) _lt_dar_can_shared=yes ;;
+     *) _lt_dar_can_shared=$GCC ;;
+  esac
+  if test "$_lt_dar_can_shared" = "yes"; then
+    output_verbose_link_cmd=func_echo_all
+    _LT_TAGVAR(archive_cmds, $1)="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}"
+    _LT_TAGVAR(module_cmds, $1)="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}"
+    _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}"
+    _LT_TAGVAR(module_expsym_cmds, $1)="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}"
+    m4_if([$1], [CXX],
+[   if test "$lt_cv_apple_cc_single_mod" != "yes"; then
+      _LT_TAGVAR(archive_cmds, $1)="\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dsymutil}"
+      _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dar_export_syms}${_lt_dsymutil}"
+    fi
+],[])
+  else
+  _LT_TAGVAR(ld_shlibs, $1)=no
+  fi
+])
+
+# _LT_SYS_MODULE_PATH_AIX([TAGNAME])
+# ----------------------------------
+# Links a minimal program and checks the executable
+# for the system default hardcoded library path. In most cases,
+# this is /usr/lib:/lib, but when the MPI compilers are used
+# the location of the communication and MPI libs are included too.
+# If we don't find anything, use the default library path according
+# to the aix ld manual.
+# Store the results from the different compilers for each TAGNAME.
+# Allow to override them for all tags through lt_cv_aix_libpath.
+m4_defun([_LT_SYS_MODULE_PATH_AIX],
+[m4_require([_LT_DECL_SED])dnl
+if test "${lt_cv_aix_libpath+set}" = set; then
+  aix_libpath=$lt_cv_aix_libpath
+else
+  AC_CACHE_VAL([_LT_TAGVAR([lt_cv_aix_libpath_], [$1])],
+  [AC_LINK_IFELSE([AC_LANG_PROGRAM],[
+  lt_aix_libpath_sed='[
+      /Import File Strings/,/^$/ {
+	  /^0/ {
+	      s/^0  *\([^ ]*\) *$/\1/
+	      p
+	  }
+      }]'
+  _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+  # Check for a 64-bit object if we didn't find anything.
+  if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then
+    _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+  fi],[])
+  if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then
+    _LT_TAGVAR([lt_cv_aix_libpath_], [$1])="/usr/lib:/lib"
+  fi
+  ])
+  aix_libpath=$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])
+fi
+])# _LT_SYS_MODULE_PATH_AIX
+
+
+# _LT_SHELL_INIT(ARG)
+# -------------------
+m4_define([_LT_SHELL_INIT],
+[m4_divert_text([M4SH-INIT], [$1
+])])# _LT_SHELL_INIT
+
+
+
+# _LT_PROG_ECHO_BACKSLASH
+# -----------------------
+# Find how we can fake an echo command that does not interpret backslash.
+# In particular, with Autoconf 2.60 or later we add some code to the start
+# of the generated configure script which will find a shell with a builtin
+# printf (which we can use as an echo command).
+m4_defun([_LT_PROG_ECHO_BACKSLASH],
+[ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO
+ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO
+
+AC_MSG_CHECKING([how to print strings])
+# Test print first, because it will be a builtin if present.
+if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \
+   test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then
+  ECHO='print -r --'
+elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then
+  ECHO='printf %s\n'
+else
+  # Use this function as a fallback that always works.
+  func_fallback_echo ()
+  {
+    eval 'cat <<_LTECHO_EOF
+$[]1
+_LTECHO_EOF'
+  }
+  ECHO='func_fallback_echo'
+fi
+
+# func_echo_all arg...
+# Invoke $ECHO with all args, space-separated.
+func_echo_all ()
+{
+    $ECHO "$*" 
+}
+
+case "$ECHO" in
+  printf*) AC_MSG_RESULT([printf]) ;;
+  print*) AC_MSG_RESULT([print -r]) ;;
+  *) AC_MSG_RESULT([cat]) ;;
+esac
+
+m4_ifdef([_AS_DETECT_SUGGESTED],
+[_AS_DETECT_SUGGESTED([
+  test -n "${ZSH_VERSION+set}${BASH_VERSION+set}" || (
+    ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+    ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO
+    ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO
+    PATH=/empty FPATH=/empty; export PATH FPATH
+    test "X`printf %s $ECHO`" = "X$ECHO" \
+      || test "X`print -r -- $ECHO`" = "X$ECHO" )])])
+
+_LT_DECL([], [SHELL], [1], [Shell to use when invoking shell scripts])
+_LT_DECL([], [ECHO], [1], [An echo program that protects backslashes])
+])# _LT_PROG_ECHO_BACKSLASH
+
+
+# _LT_WITH_SYSROOT
+# ----------------
+AC_DEFUN([_LT_WITH_SYSROOT],
+[AC_MSG_CHECKING([for sysroot])
+AC_ARG_WITH([sysroot],
+[  --with-sysroot[=DIR] Search for dependent libraries within DIR
+                        (or the compiler's sysroot if not specified).],
+[], [with_sysroot=no])
+
+dnl lt_sysroot will always be passed unquoted.  We quote it here
+dnl in case the user passed a directory name.
+lt_sysroot=
+case ${with_sysroot} in #(
+ yes)
+   if test "$GCC" = yes; then
+     lt_sysroot=`$CC --print-sysroot 2>/dev/null`
+   fi
+   ;; #(
+ /*)
+   lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"`
+   ;; #(
+ no|'')
+   ;; #(
+ *)
+   AC_MSG_RESULT([${with_sysroot}])
+   AC_MSG_ERROR([The sysroot must be an absolute path.])
+   ;;
+esac
+
+ AC_MSG_RESULT([${lt_sysroot:-no}])
+_LT_DECL([], [lt_sysroot], [0], [The root where to search for ]dnl
+[dependent libraries, and in which our libraries should be installed.])])
+
+# _LT_ENABLE_LOCK
+# ---------------
+m4_defun([_LT_ENABLE_LOCK],
+[AC_ARG_ENABLE([libtool-lock],
+  [AS_HELP_STRING([--disable-libtool-lock],
+    [avoid locking (might break parallel builds)])])
+test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes
+
+# Some flags need to be propagated to the compiler or linker for good
+# libtool support.
+case $host in
+ia64-*-hpux*)
+  # Find out which ABI we are using.
+  echo 'int i;' > conftest.$ac_ext
+  if AC_TRY_EVAL(ac_compile); then
+    case `/usr/bin/file conftest.$ac_objext` in
+      *ELF-32*)
+	HPUX_IA64_MODE="32"
+	;;
+      *ELF-64*)
+	HPUX_IA64_MODE="64"
+	;;
+    esac
+  fi
+  rm -rf conftest*
+  ;;
+*-*-irix6*)
+  # Find out which ABI we are using.
+  echo '[#]line '$LINENO' "configure"' > conftest.$ac_ext
+  if AC_TRY_EVAL(ac_compile); then
+    if test "$lt_cv_prog_gnu_ld" = yes; then
+      case `/usr/bin/file conftest.$ac_objext` in
+	*32-bit*)
+	  LD="${LD-ld} -melf32bsmip"
+	  ;;
+	*N32*)
+	  LD="${LD-ld} -melf32bmipn32"
+	  ;;
+	*64-bit*)
+	  LD="${LD-ld} -melf64bmip"
+	;;
+      esac
+    else
+      case `/usr/bin/file conftest.$ac_objext` in
+	*32-bit*)
+	  LD="${LD-ld} -32"
+	  ;;
+	*N32*)
+	  LD="${LD-ld} -n32"
+	  ;;
+	*64-bit*)
+	  LD="${LD-ld} -64"
+	  ;;
+      esac
+    fi
+  fi
+  rm -rf conftest*
+  ;;
+
+x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \
+s390*-*linux*|s390*-*tpf*|sparc*-*linux*)
+  # Find out which ABI we are using.
+  echo 'int i;' > conftest.$ac_ext
+  if AC_TRY_EVAL(ac_compile); then
+    case `/usr/bin/file conftest.o` in
+      *32-bit*)
+	case $host in
+	  x86_64-*kfreebsd*-gnu)
+	    LD="${LD-ld} -m elf_i386_fbsd"
+	    ;;
+	  x86_64-*linux*)
+	    LD="${LD-ld} -m elf_i386"
+	    ;;
+	  ppc64-*linux*|powerpc64-*linux*)
+	    LD="${LD-ld} -m elf32ppclinux"
+	    ;;
+	  s390x-*linux*)
+	    LD="${LD-ld} -m elf_s390"
+	    ;;
+	  sparc64-*linux*)
+	    LD="${LD-ld} -m elf32_sparc"
+	    ;;
+	esac
+	;;
+      *64-bit*)
+	case $host in
+	  x86_64-*kfreebsd*-gnu)
+	    LD="${LD-ld} -m elf_x86_64_fbsd"
+	    ;;
+	  x86_64-*linux*)
+	    LD="${LD-ld} -m elf_x86_64"
+	    ;;
+	  ppc*-*linux*|powerpc*-*linux*)
+	    LD="${LD-ld} -m elf64ppc"
+	    ;;
+	  s390*-*linux*|s390*-*tpf*)
+	    LD="${LD-ld} -m elf64_s390"
+	    ;;
+	  sparc*-*linux*)
+	    LD="${LD-ld} -m elf64_sparc"
+	    ;;
+	esac
+	;;
+    esac
+  fi
+  rm -rf conftest*
+  ;;
+
+*-*-sco3.2v5*)
+  # On SCO OpenServer 5, we need -belf to get full-featured binaries.
+  SAVE_CFLAGS="$CFLAGS"
+  CFLAGS="$CFLAGS -belf"
+  AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf,
+    [AC_LANG_PUSH(C)
+     AC_LINK_IFELSE([AC_LANG_PROGRAM([[]],[[]])],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no])
+     AC_LANG_POP])
+  if test x"$lt_cv_cc_needs_belf" != x"yes"; then
+    # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf
+    CFLAGS="$SAVE_CFLAGS"
+  fi
+  ;;
+*-*solaris*)
+  # Find out which ABI we are using.
+  echo 'int i;' > conftest.$ac_ext
+  if AC_TRY_EVAL(ac_compile); then
+    case `/usr/bin/file conftest.o` in
+    *64-bit*)
+      case $lt_cv_prog_gnu_ld in
+      yes*)
+        case $host in
+        i?86-*-solaris*)
+          LD="${LD-ld} -m elf_x86_64"
+          ;;
+        sparc*-*-solaris*)
+          LD="${LD-ld} -m elf64_sparc"
+          ;;
+        esac
+        # GNU ld 2.21 introduced _sol2 emulations.  Use them if available.
+        if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then
+          LD="${LD-ld}_sol2"
+        fi
+        ;;
+      *)
+	if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then
+	  LD="${LD-ld} -64"
+	fi
+	;;
+      esac
+      ;;
+    esac
+  fi
+  rm -rf conftest*
+  ;;
+esac
+
+need_locks="$enable_libtool_lock"
+])# _LT_ENABLE_LOCK
+
+
+# _LT_PROG_AR
+# -----------
+m4_defun([_LT_PROG_AR],
+[AC_CHECK_TOOLS(AR, [ar], false)
+: ${AR=ar}
+: ${AR_FLAGS=cru}
+_LT_DECL([], [AR], [1], [The archiver])
+_LT_DECL([], [AR_FLAGS], [1], [Flags to create an archive])
+
+AC_CACHE_CHECK([for archiver @FILE support], [lt_cv_ar_at_file],
+  [lt_cv_ar_at_file=no
+   AC_COMPILE_IFELSE([AC_LANG_PROGRAM],
+     [echo conftest.$ac_objext > conftest.lst
+      lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&AS_MESSAGE_LOG_FD'
+      AC_TRY_EVAL([lt_ar_try])
+      if test "$ac_status" -eq 0; then
+	# Ensure the archiver fails upon bogus file names.
+	rm -f conftest.$ac_objext libconftest.a
+	AC_TRY_EVAL([lt_ar_try])
+	if test "$ac_status" -ne 0; then
+          lt_cv_ar_at_file=@
+        fi
+      fi
+      rm -f conftest.* libconftest.a
+     ])
+  ])
+
+if test "x$lt_cv_ar_at_file" = xno; then
+  archiver_list_spec=
+else
+  archiver_list_spec=$lt_cv_ar_at_file
+fi
+_LT_DECL([], [archiver_list_spec], [1],
+  [How to feed a file listing to the archiver])
+])# _LT_PROG_AR
+
+
+# _LT_CMD_OLD_ARCHIVE
+# -------------------
+m4_defun([_LT_CMD_OLD_ARCHIVE],
+[_LT_PROG_AR
+
+AC_CHECK_TOOL(STRIP, strip, :)
+test -z "$STRIP" && STRIP=:
+_LT_DECL([], [STRIP], [1], [A symbol stripping program])
+
+AC_CHECK_TOOL(RANLIB, ranlib, :)
+test -z "$RANLIB" && RANLIB=:
+_LT_DECL([], [RANLIB], [1],
+    [Commands used to install an old-style archive])
+
+# Determine commands to create old-style static archives.
+old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs'
+old_postinstall_cmds='chmod 644 $oldlib'
+old_postuninstall_cmds=
+
+if test -n "$RANLIB"; then
+  case $host_os in
+  openbsd*)
+    old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib"
+    ;;
+  *)
+    old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib"
+    ;;
+  esac
+  old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib"
+fi
+
+case $host_os in
+  darwin*)
+    lock_old_archive_extraction=yes ;;
+  *)
+    lock_old_archive_extraction=no ;;
+esac
+_LT_DECL([], [old_postinstall_cmds], [2])
+_LT_DECL([], [old_postuninstall_cmds], [2])
+_LT_TAGDECL([], [old_archive_cmds], [2],
+    [Commands used to build an old-style archive])
+_LT_DECL([], [lock_old_archive_extraction], [0],
+    [Whether to use a lock for old archive extraction])
+])# _LT_CMD_OLD_ARCHIVE
+
+
+# _LT_COMPILER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS,
+#		[OUTPUT-FILE], [ACTION-SUCCESS], [ACTION-FAILURE])
+# ----------------------------------------------------------------
+# Check whether the given compiler option works
+AC_DEFUN([_LT_COMPILER_OPTION],
+[m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+m4_require([_LT_DECL_SED])dnl
+AC_CACHE_CHECK([$1], [$2],
+  [$2=no
+   m4_if([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4])
+   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+   lt_compiler_flag="$3"
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   # The option is referenced via a variable to avoid confusing sed.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD)
+   (eval "$lt_compile" 2>conftest.err)
+   ac_status=$?
+   cat conftest.err >&AS_MESSAGE_LOG_FD
+   echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD
+   if (exit $ac_status) && test -s "$ac_outfile"; then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings other than the usual output.
+     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp
+     $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+     if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
+       $2=yes
+     fi
+   fi
+   $RM conftest*
+])
+
+if test x"[$]$2" = xyes; then
+    m4_if([$5], , :, [$5])
+else
+    m4_if([$6], , :, [$6])
+fi
+])# _LT_COMPILER_OPTION
+
+# Old name:
+AU_ALIAS([AC_LIBTOOL_COMPILER_OPTION], [_LT_COMPILER_OPTION])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LIBTOOL_COMPILER_OPTION], [])
+
+
+# _LT_LINKER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS,
+#                  [ACTION-SUCCESS], [ACTION-FAILURE])
+# ----------------------------------------------------
+# Check whether the given linker option works
+AC_DEFUN([_LT_LINKER_OPTION],
+[m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+m4_require([_LT_DECL_SED])dnl
+AC_CACHE_CHECK([$1], [$2],
+  [$2=no
+   save_LDFLAGS="$LDFLAGS"
+   LDFLAGS="$LDFLAGS $3"
+   echo "$lt_simple_link_test_code" > conftest.$ac_ext
+   if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
+     # The linker can only warn and ignore the option if not recognized
+     # So say no if there are warnings
+     if test -s conftest.err; then
+       # Append any errors to the config.log.
+       cat conftest.err 1>&AS_MESSAGE_LOG_FD
+       $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp
+       $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+       if diff conftest.exp conftest.er2 >/dev/null; then
+         $2=yes
+       fi
+     else
+       $2=yes
+     fi
+   fi
+   $RM -r conftest*
+   LDFLAGS="$save_LDFLAGS"
+])
+
+if test x"[$]$2" = xyes; then
+    m4_if([$4], , :, [$4])
+else
+    m4_if([$5], , :, [$5])
+fi
+])# _LT_LINKER_OPTION
+
+# Old name:
+AU_ALIAS([AC_LIBTOOL_LINKER_OPTION], [_LT_LINKER_OPTION])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LIBTOOL_LINKER_OPTION], [])
+
+
+# LT_CMD_MAX_LEN
+#---------------
+AC_DEFUN([LT_CMD_MAX_LEN],
+[AC_REQUIRE([AC_CANONICAL_HOST])dnl
+# find the maximum length of command line arguments
+AC_MSG_CHECKING([the maximum length of command line arguments])
+AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl
+  i=0
+  teststring="ABCD"
+
+  case $build_os in
+  msdosdjgpp*)
+    # On DJGPP, this test can blow up pretty badly due to problems in libc
+    # (any single argument exceeding 2000 bytes causes a buffer overrun
+    # during glob expansion).  Even if it were fixed, the result of this
+    # check would be larger than it should be.
+    lt_cv_sys_max_cmd_len=12288;    # 12K is about right
+    ;;
+
+  gnu*)
+    # Under GNU Hurd, this test is not required because there is
+    # no limit to the length of command line arguments.
+    # Libtool will interpret -1 as no limit whatsoever
+    lt_cv_sys_max_cmd_len=-1;
+    ;;
+
+  cygwin* | mingw* | cegcc*)
+    # On Win9x/ME, this test blows up -- it succeeds, but takes
+    # about 5 minutes as the teststring grows exponentially.
+    # Worse, since 9x/ME are not pre-emptively multitasking,
+    # you end up with a "frozen" computer, even though with patience
+    # the test eventually succeeds (with a max line length of 256k).
+    # Instead, let's just punt: use the minimum linelength reported by
+    # all of the supported platforms: 8192 (on NT/2K/XP).
+    lt_cv_sys_max_cmd_len=8192;
+    ;;
+
+  mint*)
+    # On MiNT this can take a long time and run out of memory.
+    lt_cv_sys_max_cmd_len=8192;
+    ;;
+
+  amigaos*)
+    # On AmigaOS with pdksh, this test takes hours, literally.
+    # So we just punt and use a minimum line length of 8192.
+    lt_cv_sys_max_cmd_len=8192;
+    ;;
+
+  netbsd* | freebsd* | openbsd* | darwin* | dragonfly*)
+    # This has been around since 386BSD, at least.  Likely further.
+    if test -x /sbin/sysctl; then
+      lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax`
+    elif test -x /usr/sbin/sysctl; then
+      lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax`
+    else
+      lt_cv_sys_max_cmd_len=65536	# usable default for all BSDs
+    fi
+    # And add a safety zone
+    lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
+    lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
+    ;;
+
+  interix*)
+    # We know the value 262144 and hardcode it with a safety zone (like BSD)
+    lt_cv_sys_max_cmd_len=196608
+    ;;
+
+  os2*)
+    # The test takes a long time on OS/2.
+    lt_cv_sys_max_cmd_len=8192
+    ;;
+
+  osf*)
+    # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure
+    # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not
+    # nice to cause kernel panics so lets avoid the loop below.
+    # First set a reasonable default.
+    lt_cv_sys_max_cmd_len=16384
+    #
+    if test -x /sbin/sysconfig; then
+      case `/sbin/sysconfig -q proc exec_disable_arg_limit` in
+        *1*) lt_cv_sys_max_cmd_len=-1 ;;
+      esac
+    fi
+    ;;
+  sco3.2v5*)
+    lt_cv_sys_max_cmd_len=102400
+    ;;
+  sysv5* | sco5v6* | sysv4.2uw2*)
+    kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null`
+    if test -n "$kargmax"; then
+      lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[[	 ]]//'`
+    else
+      lt_cv_sys_max_cmd_len=32768
+    fi
+    ;;
+  *)
+    lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null`
+    if test -n "$lt_cv_sys_max_cmd_len"; then
+      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
+      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
+    else
+      # Make teststring a little bigger before we do anything with it.
+      # a 1K string should be a reasonable start.
+      for i in 1 2 3 4 5 6 7 8 ; do
+        teststring=$teststring$teststring
+      done
+      SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}}
+      # If test is not a shell built-in, we'll probably end up computing a
+      # maximum length that is only half of the actual maximum length, but
+      # we can't tell.
+      while { test "X"`env echo "$teststring$teststring" 2>/dev/null` \
+	         = "X$teststring$teststring"; } >/dev/null 2>&1 &&
+	      test $i != 17 # 1/2 MB should be enough
+      do
+        i=`expr $i + 1`
+        teststring=$teststring$teststring
+      done
+      # Only check the string length outside the loop.
+      lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1`
+      teststring=
+      # Add a significant safety factor because C++ compilers can tack on
+      # massive amounts of additional arguments before passing them to the
+      # linker.  It appears as though 1/2 is a usable value.
+      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2`
+    fi
+    ;;
+  esac
+])
+if test -n $lt_cv_sys_max_cmd_len ; then
+  AC_MSG_RESULT($lt_cv_sys_max_cmd_len)
+else
+  AC_MSG_RESULT(none)
+fi
+max_cmd_len=$lt_cv_sys_max_cmd_len
+_LT_DECL([], [max_cmd_len], [0],
+    [What is the maximum length of a command?])
+])# LT_CMD_MAX_LEN
+
+# Old name:
+AU_ALIAS([AC_LIBTOOL_SYS_MAX_CMD_LEN], [LT_CMD_MAX_LEN])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN], [])
+
+
+# _LT_HEADER_DLFCN
+# ----------------
+m4_defun([_LT_HEADER_DLFCN],
+[AC_CHECK_HEADERS([dlfcn.h], [], [], [AC_INCLUDES_DEFAULT])dnl
+])# _LT_HEADER_DLFCN
+
+
+# _LT_TRY_DLOPEN_SELF (ACTION-IF-TRUE, ACTION-IF-TRUE-W-USCORE,
+#                      ACTION-IF-FALSE, ACTION-IF-CROSS-COMPILING)
+# ----------------------------------------------------------------
+m4_defun([_LT_TRY_DLOPEN_SELF],
+[m4_require([_LT_HEADER_DLFCN])dnl
+if test "$cross_compiling" = yes; then :
+  [$4]
+else
+  lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
+  lt_status=$lt_dlunknown
+  cat > conftest.$ac_ext <<_LT_EOF
+[#line $LINENO "configure"
+#include "confdefs.h"
+
+#if HAVE_DLFCN_H
+#include <dlfcn.h>
+#endif
+
+#include <stdio.h>
+
+#ifdef RTLD_GLOBAL
+#  define LT_DLGLOBAL		RTLD_GLOBAL
+#else
+#  ifdef DL_GLOBAL
+#    define LT_DLGLOBAL		DL_GLOBAL
+#  else
+#    define LT_DLGLOBAL		0
+#  endif
+#endif
+
+/* We may have to define LT_DLLAZY_OR_NOW in the command line if we
+   find out it does not work in some platform. */
+#ifndef LT_DLLAZY_OR_NOW
+#  ifdef RTLD_LAZY
+#    define LT_DLLAZY_OR_NOW		RTLD_LAZY
+#  else
+#    ifdef DL_LAZY
+#      define LT_DLLAZY_OR_NOW		DL_LAZY
+#    else
+#      ifdef RTLD_NOW
+#        define LT_DLLAZY_OR_NOW	RTLD_NOW
+#      else
+#        ifdef DL_NOW
+#          define LT_DLLAZY_OR_NOW	DL_NOW
+#        else
+#          define LT_DLLAZY_OR_NOW	0
+#        endif
+#      endif
+#    endif
+#  endif
+#endif
+
+/* When -fvisbility=hidden is used, assume the code has been annotated
+   correspondingly for the symbols needed.  */
+#if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3))
+int fnord () __attribute__((visibility("default")));
+#endif
+
+int fnord () { return 42; }
+int main ()
+{
+  void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);
+  int status = $lt_dlunknown;
+
+  if (self)
+    {
+      if (dlsym (self,"fnord"))       status = $lt_dlno_uscore;
+      else
+        {
+	  if (dlsym( self,"_fnord"))  status = $lt_dlneed_uscore;
+          else puts (dlerror ());
+	}
+      /* dlclose (self); */
+    }
+  else
+    puts (dlerror ());
+
+  return status;
+}]
+_LT_EOF
+  if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext} 2>/dev/null; then
+    (./conftest; exit; ) >&AS_MESSAGE_LOG_FD 2>/dev/null
+    lt_status=$?
+    case x$lt_status in
+      x$lt_dlno_uscore) $1 ;;
+      x$lt_dlneed_uscore) $2 ;;
+      x$lt_dlunknown|x*) $3 ;;
+    esac
+  else :
+    # compilation failed
+    $3
+  fi
+fi
+rm -fr conftest*
+])# _LT_TRY_DLOPEN_SELF
+
+
+# LT_SYS_DLOPEN_SELF
+# ------------------
+AC_DEFUN([LT_SYS_DLOPEN_SELF],
+[m4_require([_LT_HEADER_DLFCN])dnl
+if test "x$enable_dlopen" != xyes; then
+  enable_dlopen=unknown
+  enable_dlopen_self=unknown
+  enable_dlopen_self_static=unknown
+else
+  lt_cv_dlopen=no
+  lt_cv_dlopen_libs=
+
+  case $host_os in
+  beos*)
+    lt_cv_dlopen="load_add_on"
+    lt_cv_dlopen_libs=
+    lt_cv_dlopen_self=yes
+    ;;
+
+  mingw* | pw32* | cegcc*)
+    lt_cv_dlopen="LoadLibrary"
+    lt_cv_dlopen_libs=
+    ;;
+
+  cygwin*)
+    lt_cv_dlopen="dlopen"
+    lt_cv_dlopen_libs=
+    ;;
+
+  darwin*)
+  # if libdl is installed we need to link against it
+    AC_CHECK_LIB([dl], [dlopen],
+		[lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"],[
+    lt_cv_dlopen="dyld"
+    lt_cv_dlopen_libs=
+    lt_cv_dlopen_self=yes
+    ])
+    ;;
+
+  *)
+    AC_CHECK_FUNC([shl_load],
+	  [lt_cv_dlopen="shl_load"],
+      [AC_CHECK_LIB([dld], [shl_load],
+	    [lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld"],
+	[AC_CHECK_FUNC([dlopen],
+	      [lt_cv_dlopen="dlopen"],
+	  [AC_CHECK_LIB([dl], [dlopen],
+		[lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"],
+	    [AC_CHECK_LIB([svld], [dlopen],
+		  [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"],
+	      [AC_CHECK_LIB([dld], [dld_link],
+		    [lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld"])
+	      ])
+	    ])
+	  ])
+	])
+      ])
+    ;;
+  esac
+
+  if test "x$lt_cv_dlopen" != xno; then
+    enable_dlopen=yes
+  else
+    enable_dlopen=no
+  fi
+
+  case $lt_cv_dlopen in
+  dlopen)
+    save_CPPFLAGS="$CPPFLAGS"
+    test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H"
+
+    save_LDFLAGS="$LDFLAGS"
+    wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\"
+
+    save_LIBS="$LIBS"
+    LIBS="$lt_cv_dlopen_libs $LIBS"
+
+    AC_CACHE_CHECK([whether a program can dlopen itself],
+	  lt_cv_dlopen_self, [dnl
+	  _LT_TRY_DLOPEN_SELF(
+	    lt_cv_dlopen_self=yes, lt_cv_dlopen_self=yes,
+	    lt_cv_dlopen_self=no, lt_cv_dlopen_self=cross)
+    ])
+
+    if test "x$lt_cv_dlopen_self" = xyes; then
+      wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\"
+      AC_CACHE_CHECK([whether a statically linked program can dlopen itself],
+	  lt_cv_dlopen_self_static, [dnl
+	  _LT_TRY_DLOPEN_SELF(
+	    lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=yes,
+	    lt_cv_dlopen_self_static=no,  lt_cv_dlopen_self_static=cross)
+      ])
+    fi
+
+    CPPFLAGS="$save_CPPFLAGS"
+    LDFLAGS="$save_LDFLAGS"
+    LIBS="$save_LIBS"
+    ;;
+  esac
+
+  case $lt_cv_dlopen_self in
+  yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;;
+  *) enable_dlopen_self=unknown ;;
+  esac
+
+  case $lt_cv_dlopen_self_static in
+  yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;;
+  *) enable_dlopen_self_static=unknown ;;
+  esac
+fi
+_LT_DECL([dlopen_support], [enable_dlopen], [0],
+	 [Whether dlopen is supported])
+_LT_DECL([dlopen_self], [enable_dlopen_self], [0],
+	 [Whether dlopen of programs is supported])
+_LT_DECL([dlopen_self_static], [enable_dlopen_self_static], [0],
+	 [Whether dlopen of statically linked programs is supported])
+])# LT_SYS_DLOPEN_SELF
+
+# Old name:
+AU_ALIAS([AC_LIBTOOL_DLOPEN_SELF], [LT_SYS_DLOPEN_SELF])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF], [])
+
+
+# _LT_COMPILER_C_O([TAGNAME])
+# ---------------------------
+# Check to see if options -c and -o are simultaneously supported by compiler.
+# This macro does not hard code the compiler like AC_PROG_CC_C_O.
+m4_defun([_LT_COMPILER_C_O],
+[m4_require([_LT_DECL_SED])dnl
+m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+m4_require([_LT_TAG_COMPILER])dnl
+AC_CACHE_CHECK([if $compiler supports -c -o file.$ac_objext],
+  [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)],
+  [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=no
+   $RM -r conftest 2>/dev/null
+   mkdir conftest
+   cd conftest
+   mkdir out
+   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+   lt_compiler_flag="-o out/conftest2.$ac_objext"
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD)
+   (eval "$lt_compile" 2>out/conftest.err)
+   ac_status=$?
+   cat out/conftest.err >&AS_MESSAGE_LOG_FD
+   echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD
+   if (exit $ac_status) && test -s out/conftest2.$ac_objext
+   then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings
+     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp
+     $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
+     if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
+       _LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes
+     fi
+   fi
+   chmod u+w . 2>&AS_MESSAGE_LOG_FD
+   $RM conftest*
+   # SGI C++ compiler will create directory out/ii_files/ for
+   # template instantiation
+   test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files
+   $RM out/* && rmdir out
+   cd ..
+   $RM -r conftest
+   $RM conftest*
+])
+_LT_TAGDECL([compiler_c_o], [lt_cv_prog_compiler_c_o], [1],
+	[Does compiler simultaneously support -c and -o options?])
+])# _LT_COMPILER_C_O
+
+
+# _LT_COMPILER_FILE_LOCKS([TAGNAME])
+# ----------------------------------
+# Check to see if we can do hard links to lock some files if needed
+m4_defun([_LT_COMPILER_FILE_LOCKS],
+[m4_require([_LT_ENABLE_LOCK])dnl
+m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+_LT_COMPILER_C_O([$1])
+
+hard_links="nottested"
+if test "$_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)" = no && test "$need_locks" != no; then
+  # do not overwrite the value of need_locks provided by the user
+  AC_MSG_CHECKING([if we can lock with hard links])
+  hard_links=yes
+  $RM conftest*
+  ln conftest.a conftest.b 2>/dev/null && hard_links=no
+  touch conftest.a
+  ln conftest.a conftest.b 2>&5 || hard_links=no
+  ln conftest.a conftest.b 2>/dev/null && hard_links=no
+  AC_MSG_RESULT([$hard_links])
+  if test "$hard_links" = no; then
+    AC_MSG_WARN([`$CC' does not support `-c -o', so `make -j' may be unsafe])
+    need_locks=warn
+  fi
+else
+  need_locks=no
+fi
+_LT_DECL([], [need_locks], [1], [Must we lock files when doing compilation?])
+])# _LT_COMPILER_FILE_LOCKS
+
+
+# _LT_CHECK_OBJDIR
+# ----------------
+m4_defun([_LT_CHECK_OBJDIR],
+[AC_CACHE_CHECK([for objdir], [lt_cv_objdir],
+[rm -f .libs 2>/dev/null
+mkdir .libs 2>/dev/null
+if test -d .libs; then
+  lt_cv_objdir=.libs
+else
+  # MS-DOS does not allow filenames that begin with a dot.
+  lt_cv_objdir=_libs
+fi
+rmdir .libs 2>/dev/null])
+objdir=$lt_cv_objdir
+_LT_DECL([], [objdir], [0],
+         [The name of the directory that contains temporary libtool files])dnl
+m4_pattern_allow([LT_OBJDIR])dnl
+AC_DEFINE_UNQUOTED(LT_OBJDIR, "$lt_cv_objdir/",
+  [Define to the sub-directory in which libtool stores uninstalled libraries.])
+])# _LT_CHECK_OBJDIR
+
+
+# _LT_LINKER_HARDCODE_LIBPATH([TAGNAME])
+# --------------------------------------
+# Check hardcoding attributes.
+m4_defun([_LT_LINKER_HARDCODE_LIBPATH],
+[AC_MSG_CHECKING([how to hardcode library paths into programs])
+_LT_TAGVAR(hardcode_action, $1)=
+if test -n "$_LT_TAGVAR(hardcode_libdir_flag_spec, $1)" ||
+   test -n "$_LT_TAGVAR(runpath_var, $1)" ||
+   test "X$_LT_TAGVAR(hardcode_automatic, $1)" = "Xyes" ; then
+
+  # We can hardcode non-existent directories.
+  if test "$_LT_TAGVAR(hardcode_direct, $1)" != no &&
+     # If the only mechanism to avoid hardcoding is shlibpath_var, we
+     # have to relink, otherwise we might link with an installed library
+     # when we should be linking with a yet-to-be-installed one
+     ## test "$_LT_TAGVAR(hardcode_shlibpath_var, $1)" != no &&
+     test "$_LT_TAGVAR(hardcode_minus_L, $1)" != no; then
+    # Linking always hardcodes the temporary library directory.
+    _LT_TAGVAR(hardcode_action, $1)=relink
+  else
+    # We can link without hardcoding, and we can hardcode nonexisting dirs.
+    _LT_TAGVAR(hardcode_action, $1)=immediate
+  fi
+else
+  # We cannot hardcode anything, or else we can only hardcode existing
+  # directories.
+  _LT_TAGVAR(hardcode_action, $1)=unsupported
+fi
+AC_MSG_RESULT([$_LT_TAGVAR(hardcode_action, $1)])
+
+if test "$_LT_TAGVAR(hardcode_action, $1)" = relink ||
+   test "$_LT_TAGVAR(inherit_rpath, $1)" = yes; then
+  # Fast installation is not supported
+  enable_fast_install=no
+elif test "$shlibpath_overrides_runpath" = yes ||
+     test "$enable_shared" = no; then
+  # Fast installation is not necessary
+  enable_fast_install=needless
+fi
+_LT_TAGDECL([], [hardcode_action], [0],
+    [How to hardcode a shared library path into an executable])
+])# _LT_LINKER_HARDCODE_LIBPATH
+
+
+# _LT_CMD_STRIPLIB
+# ----------------
+m4_defun([_LT_CMD_STRIPLIB],
+[m4_require([_LT_DECL_EGREP])
+striplib=
+old_striplib=
+AC_MSG_CHECKING([whether stripping libraries is possible])
+if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then
+  test -z "$old_striplib" && old_striplib="$STRIP --strip-debug"
+  test -z "$striplib" && striplib="$STRIP --strip-unneeded"
+  AC_MSG_RESULT([yes])
+else
+# FIXME - insert some real tests, host_os isn't really good enough
+  case $host_os in
+  darwin*)
+    if test -n "$STRIP" ; then
+      striplib="$STRIP -x"
+      old_striplib="$STRIP -S"
+      AC_MSG_RESULT([yes])
+    else
+      AC_MSG_RESULT([no])
+    fi
+    ;;
+  *)
+    AC_MSG_RESULT([no])
+    ;;
+  esac
+fi
+_LT_DECL([], [old_striplib], [1], [Commands to strip libraries])
+_LT_DECL([], [striplib], [1])
+])# _LT_CMD_STRIPLIB
+
+
+# _LT_SYS_DYNAMIC_LINKER([TAG])
+# -----------------------------
+# PORTME Fill in your ld.so characteristics
+m4_defun([_LT_SYS_DYNAMIC_LINKER],
+[AC_REQUIRE([AC_CANONICAL_HOST])dnl
+m4_require([_LT_DECL_EGREP])dnl
+m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+m4_require([_LT_DECL_OBJDUMP])dnl
+m4_require([_LT_DECL_SED])dnl
+m4_require([_LT_CHECK_SHELL_FEATURES])dnl
+AC_MSG_CHECKING([dynamic linker characteristics])
+m4_if([$1],
+	[], [
+if test "$GCC" = yes; then
+  case $host_os in
+    darwin*) lt_awk_arg="/^libraries:/,/LR/" ;;
+    *) lt_awk_arg="/^libraries:/" ;;
+  esac
+  case $host_os in
+    mingw* | cegcc*) lt_sed_strip_eq="s,=\([[A-Za-z]]:\),\1,g" ;;
+    *) lt_sed_strip_eq="s,=/,/,g" ;;
+  esac
+  lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq`
+  case $lt_search_path_spec in
+  *\;*)
+    # if the path contains ";" then we assume it to be the separator
+    # otherwise default to the standard path separator (i.e. ":") - it is
+    # assumed that no part of a normal pathname contains ";" but that should
+    # okay in the real world where ";" in dirpaths is itself problematic.
+    lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'`
+    ;;
+  *)
+    lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"`
+    ;;
+  esac
+  # Ok, now we have the path, separated by spaces, we can step through it
+  # and add multilib dir if necessary.
+  lt_tmp_lt_search_path_spec=
+  lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null`
+  for lt_sys_path in $lt_search_path_spec; do
+    if test -d "$lt_sys_path/$lt_multi_os_dir"; then
+      lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir"
+    else
+      test -d "$lt_sys_path" && \
+	lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path"
+    fi
+  done
+  lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk '
+BEGIN {RS=" "; FS="/|\n";} {
+  lt_foo="";
+  lt_count=0;
+  for (lt_i = NF; lt_i > 0; lt_i--) {
+    if ($lt_i != "" && $lt_i != ".") {
+      if ($lt_i == "..") {
+        lt_count++;
+      } else {
+        if (lt_count == 0) {
+          lt_foo="/" $lt_i lt_foo;
+        } else {
+          lt_count--;
+        }
+      }
+    }
+  }
+  if (lt_foo != "") { lt_freq[[lt_foo]]++; }
+  if (lt_freq[[lt_foo]] == 1) { print lt_foo; }
+}'`
+  # AWK program above erroneously prepends '/' to C:/dos/paths
+  # for these hosts.
+  case $host_os in
+    mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\
+      $SED 's,/\([[A-Za-z]]:\),\1,g'` ;;
+  esac
+  sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP`
+else
+  sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
+fi])
+library_names_spec=
+libname_spec='lib$name'
+soname_spec=
+shrext_cmds=".so"
+postinstall_cmds=
+postuninstall_cmds=
+finish_cmds=
+finish_eval=
+shlibpath_var=
+shlibpath_overrides_runpath=unknown
+version_type=none
+dynamic_linker="$host_os ld.so"
+sys_lib_dlsearch_path_spec="/lib /usr/lib"
+need_lib_prefix=unknown
+hardcode_into_libs=no
+
+# when you set need_version to no, make sure it does not cause -set_version
+# flags to be left without arguments
+need_version=unknown
+
+case $host_os in
+aix3*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a'
+  shlibpath_var=LIBPATH
+
+  # AIX 3 has no versioning support, so we append a major version to the name.
+  soname_spec='${libname}${release}${shared_ext}$major'
+  ;;
+
+aix[[4-9]]*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  hardcode_into_libs=yes
+  if test "$host_cpu" = ia64; then
+    # AIX 5 supports IA64
+    library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}'
+    shlibpath_var=LD_LIBRARY_PATH
+  else
+    # With GCC up to 2.95.x, collect2 would create an import file
+    # for dependence libraries.  The import file would start with
+    # the line `#! .'.  This would cause the generated library to
+    # depend on `.', always an invalid library.  This was fixed in
+    # development snapshots of GCC prior to 3.0.
+    case $host_os in
+      aix4 | aix4.[[01]] | aix4.[[01]].*)
+      if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'
+	   echo ' yes '
+	   echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then
+	:
+      else
+	can_build_shared=no
+      fi
+      ;;
+    esac
+    # AIX (on Power*) has no versioning support, so currently we can not hardcode correct
+    # soname into executable. Probably we can add versioning support to
+    # collect2, so additional links can be useful in future.
+    if test "$aix_use_runtimelinking" = yes; then
+      # If using run time linking (on AIX 4.2 or later) use lib<name>.so
+      # instead of lib<name>.a to let people know that these are not
+      # typical AIX shared libraries.
+      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    else
+      # We preserve .a as extension for shared libraries through AIX4.2
+      # and later when we are not doing run time linking.
+      library_names_spec='${libname}${release}.a $libname.a'
+      soname_spec='${libname}${release}${shared_ext}$major'
+    fi
+    shlibpath_var=LIBPATH
+  fi
+  ;;
+
+amigaos*)
+  case $host_cpu in
+  powerpc)
+    # Since July 2007 AmigaOS4 officially supports .so libraries.
+    # When compiling the executable, add -use-dynld -Lsobjs: to the compileline.
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    ;;
+  m68k)
+    library_names_spec='$libname.ixlibrary $libname.a'
+    # Create ${libname}_ixlibrary.a entries in /sys/libs.
+    finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'
+    ;;
+  esac
+  ;;
+
+beos*)
+  library_names_spec='${libname}${shared_ext}'
+  dynamic_linker="$host_os ld.so"
+  shlibpath_var=LIBRARY_PATH
+  ;;
+
+bsdi[[45]]*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib"
+  sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib"
+  # the default ld.so.conf also contains /usr/contrib/lib and
+  # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow
+  # libtool to hard-code these into programs
+  ;;
+
+cygwin* | mingw* | pw32* | cegcc*)
+  version_type=windows
+  shrext_cmds=".dll"
+  need_version=no
+  need_lib_prefix=no
+
+  case $GCC,$cc_basename in
+  yes,*)
+    # gcc
+    library_names_spec='$libname.dll.a'
+    # DLL is installed to $(libdir)/../bin by postinstall_cmds
+    postinstall_cmds='base_file=`basename \${file}`~
+      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~
+      dldir=$destdir/`dirname \$dlpath`~
+      test -d \$dldir || mkdir -p \$dldir~
+      $install_prog $dir/$dlname \$dldir/$dlname~
+      chmod a+x \$dldir/$dlname~
+      if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then
+        eval '\''$striplib \$dldir/$dlname'\'' || exit \$?;
+      fi'
+    postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
+      dlpath=$dir/\$dldll~
+       $RM \$dlpath'
+    shlibpath_overrides_runpath=yes
+
+    case $host_os in
+    cygwin*)
+      # Cygwin DLLs use 'cyg' prefix rather than 'lib'
+      soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}'
+m4_if([$1], [],[
+      sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api"])
+      ;;
+    mingw* | cegcc*)
+      # MinGW DLLs use traditional 'lib' prefix
+      soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}'
+      ;;
+    pw32*)
+      # pw32 DLLs use 'pw' prefix rather than 'lib'
+      library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}'
+      ;;
+    esac
+    dynamic_linker='Win32 ld.exe'
+    ;;
+
+  *,cl*)
+    # Native MSVC
+    libname_spec='$name'
+    soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}'
+    library_names_spec='${libname}.dll.lib'
+
+    case $build_os in
+    mingw*)
+      sys_lib_search_path_spec=
+      lt_save_ifs=$IFS
+      IFS=';'
+      for lt_path in $LIB
+      do
+        IFS=$lt_save_ifs
+        # Let DOS variable expansion print the short 8.3 style file name.
+        lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"`
+        sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path"
+      done
+      IFS=$lt_save_ifs
+      # Convert to MSYS style.
+      sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([[a-zA-Z]]\\):| /\\1|g' -e 's|^ ||'`
+      ;;
+    cygwin*)
+      # Convert to unix form, then to dos form, then back to unix form
+      # but this time dos style (no spaces!) so that the unix form looks
+      # like /cygdrive/c/PROGRA~1:/cygdr...
+      sys_lib_search_path_spec=`cygpath --path --unix "$LIB"`
+      sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null`
+      sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
+      ;;
+    *)
+      sys_lib_search_path_spec="$LIB"
+      if $ECHO "$sys_lib_search_path_spec" | [$GREP ';[c-zC-Z]:/' >/dev/null]; then
+        # It is most probably a Windows format PATH.
+        sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
+      else
+        sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
+      fi
+      # FIXME: find the short name or the path components, as spaces are
+      # common. (e.g. "Program Files" -> "PROGRA~1")
+      ;;
+    esac
+
+    # DLL is installed to $(libdir)/../bin by postinstall_cmds
+    postinstall_cmds='base_file=`basename \${file}`~
+      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~
+      dldir=$destdir/`dirname \$dlpath`~
+      test -d \$dldir || mkdir -p \$dldir~
+      $install_prog $dir/$dlname \$dldir/$dlname'
+    postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
+      dlpath=$dir/\$dldll~
+       $RM \$dlpath'
+    shlibpath_overrides_runpath=yes
+    dynamic_linker='Win32 link.exe'
+    ;;
+
+  *)
+    # Assume MSVC wrapper
+    library_names_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext} $libname.lib'
+    dynamic_linker='Win32 ld.exe'
+    ;;
+  esac
+  # FIXME: first we should search . and the directory the executable is in
+  shlibpath_var=PATH
+  ;;
+
+darwin* | rhapsody*)
+  dynamic_linker="$host_os dyld"
+  version_type=darwin
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext'
+  soname_spec='${libname}${release}${major}$shared_ext'
+  shlibpath_overrides_runpath=yes
+  shlibpath_var=DYLD_LIBRARY_PATH
+  shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`'
+m4_if([$1], [],[
+  sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib"])
+  sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib'
+  ;;
+
+dgux*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  ;;
+
+freebsd* | dragonfly*)
+  # DragonFly does not have aout.  When/if they implement a new
+  # versioning mechanism, adjust this.
+  if test -x /usr/bin/objformat; then
+    objformat=`/usr/bin/objformat`
+  else
+    case $host_os in
+    freebsd[[23]].*) objformat=aout ;;
+    *) objformat=elf ;;
+    esac
+  fi
+  version_type=freebsd-$objformat
+  case $version_type in
+    freebsd-elf*)
+      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
+      need_version=no
+      need_lib_prefix=no
+      ;;
+    freebsd-*)
+      library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix'
+      need_version=yes
+      ;;
+  esac
+  shlibpath_var=LD_LIBRARY_PATH
+  case $host_os in
+  freebsd2.*)
+    shlibpath_overrides_runpath=yes
+    ;;
+  freebsd3.[[01]]* | freebsdelf3.[[01]]*)
+    shlibpath_overrides_runpath=yes
+    hardcode_into_libs=yes
+    ;;
+  freebsd3.[[2-9]]* | freebsdelf3.[[2-9]]* | \
+  freebsd4.[[0-5]] | freebsdelf4.[[0-5]] | freebsd4.1.1 | freebsdelf4.1.1)
+    shlibpath_overrides_runpath=no
+    hardcode_into_libs=yes
+    ;;
+  *) # from 4.6 on, and DragonFly
+    shlibpath_overrides_runpath=yes
+    hardcode_into_libs=yes
+    ;;
+  esac
+  ;;
+
+gnu*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  ;;
+
+haiku*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  dynamic_linker="$host_os runtime_loader"
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib'
+  hardcode_into_libs=yes
+  ;;
+
+hpux9* | hpux10* | hpux11*)
+  # Give a soname corresponding to the major version so that dld.sl refuses to
+  # link against other versions.
+  version_type=sunos
+  need_lib_prefix=no
+  need_version=no
+  case $host_cpu in
+  ia64*)
+    shrext_cmds='.so'
+    hardcode_into_libs=yes
+    dynamic_linker="$host_os dld.so"
+    shlibpath_var=LD_LIBRARY_PATH
+    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    if test "X$HPUX_IA64_MODE" = X32; then
+      sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib"
+    else
+      sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64"
+    fi
+    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+    ;;
+  hppa*64*)
+    shrext_cmds='.sl'
+    hardcode_into_libs=yes
+    dynamic_linker="$host_os dld.sl"
+    shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH
+    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64"
+    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+    ;;
+  *)
+    shrext_cmds='.sl'
+    dynamic_linker="$host_os dld.sl"
+    shlibpath_var=SHLIB_PATH
+    shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    ;;
+  esac
+  # HP-UX runs *really* slowly unless shared libraries are mode 555, ...
+  postinstall_cmds='chmod 555 $lib'
+  # or fails outright, so override atomically:
+  install_override_mode=555
+  ;;
+
+interix[[3-9]]*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  ;;
+
+irix5* | irix6* | nonstopux*)
+  case $host_os in
+    nonstopux*) version_type=nonstopux ;;
+    *)
+	if test "$lt_cv_prog_gnu_ld" = yes; then
+		version_type=linux # correct to gnu/linux during the next big refactor
+	else
+		version_type=irix
+	fi ;;
+  esac
+  need_lib_prefix=no
+  need_version=no
+  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}'
+  case $host_os in
+  irix5* | nonstopux*)
+    libsuff= shlibsuff=
+    ;;
+  *)
+    case $LD in # libtool.m4 will add one of these switches to LD
+    *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ")
+      libsuff= shlibsuff= libmagic=32-bit;;
+    *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ")
+      libsuff=32 shlibsuff=N32 libmagic=N32;;
+    *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ")
+      libsuff=64 shlibsuff=64 libmagic=64-bit;;
+    *) libsuff= shlibsuff= libmagic=never-match;;
+    esac
+    ;;
+  esac
+  shlibpath_var=LD_LIBRARY${shlibsuff}_PATH
+  shlibpath_overrides_runpath=no
+  sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}"
+  sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}"
+  hardcode_into_libs=yes
+  ;;
+
+# No shared lib support for Linux oldld, aout, or coff.
+linux*oldld* | linux*aout* | linux*coff*)
+  dynamic_linker=no
+  ;;
+
+# This must be glibc/ELF.
+linux* | k*bsd*-gnu | kopensolaris*-gnu)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+
+  # Some binutils ld are patched to set DT_RUNPATH
+  AC_CACHE_VAL([lt_cv_shlibpath_overrides_runpath],
+    [lt_cv_shlibpath_overrides_runpath=no
+    save_LDFLAGS=$LDFLAGS
+    save_libdir=$libdir
+    eval "libdir=/foo; wl=\"$_LT_TAGVAR(lt_prog_compiler_wl, $1)\"; \
+	 LDFLAGS=\"\$LDFLAGS $_LT_TAGVAR(hardcode_libdir_flag_spec, $1)\""
+    AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])],
+      [AS_IF([ ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null],
+	 [lt_cv_shlibpath_overrides_runpath=yes])])
+    LDFLAGS=$save_LDFLAGS
+    libdir=$save_libdir
+    ])
+  shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath
+
+  # This implies no fast_install, which is unacceptable.
+  # Some rework will be needed to allow for fast_install
+  # before this can be enabled.
+  hardcode_into_libs=yes
+
+  # Append ld.so.conf contents to the search path
+  if test -f /etc/ld.so.conf; then
+    lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \[$]2)); skip = 1; } { if (!skip) print \[$]0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[	 ]*hwcap[	 ]/d;s/[:,	]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '`
+    sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra"
+  fi
+
+  # We used to test for /lib/ld.so.1 and disable shared libraries on
+  # powerpc, because MkLinux only supported shared libraries with the
+  # GNU dynamic linker.  Since this was broken with cross compilers,
+  # most powerpc-linux boxes support dynamic linking these days and
+  # people can always --disable-shared, the test was removed, and we
+  # assume the GNU/Linux dynamic linker is in use.
+  dynamic_linker='GNU/Linux ld.so'
+  ;;
+
+netbsd*)
+  version_type=sunos
+  need_lib_prefix=no
+  need_version=no
+  if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+    finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+    dynamic_linker='NetBSD (a.out) ld.so'
+  else
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    dynamic_linker='NetBSD ld.elf_so'
+  fi
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  hardcode_into_libs=yes
+  ;;
+
+newsos6)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  ;;
+
+*nto* | *qnx*)
+  version_type=qnx
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  dynamic_linker='ldqnx.so'
+  ;;
+
+openbsd*)
+  version_type=sunos
+  sys_lib_dlsearch_path_spec="/usr/lib"
+  need_lib_prefix=no
+  # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs.
+  case $host_os in
+    openbsd3.3 | openbsd3.3.*)	need_version=yes ;;
+    *)				need_version=no  ;;
+  esac
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+    case $host_os in
+      openbsd2.[[89]] | openbsd2.[[89]].*)
+	shlibpath_overrides_runpath=no
+	;;
+      *)
+	shlibpath_overrides_runpath=yes
+	;;
+      esac
+  else
+    shlibpath_overrides_runpath=yes
+  fi
+  ;;
+
+os2*)
+  libname_spec='$name'
+  shrext_cmds=".dll"
+  need_lib_prefix=no
+  library_names_spec='$libname${shared_ext} $libname.a'
+  dynamic_linker='OS/2 ld.exe'
+  shlibpath_var=LIBPATH
+  ;;
+
+osf3* | osf4* | osf5*)
+  version_type=osf
+  need_lib_prefix=no
+  need_version=no
+  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  shlibpath_var=LD_LIBRARY_PATH
+  sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib"
+  sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec"
+  ;;
+
+rdos*)
+  dynamic_linker=no
+  ;;
+
+solaris*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  hardcode_into_libs=yes
+  # ldd complains unless libraries are executable
+  postinstall_cmds='chmod +x $lib'
+  ;;
+
+sunos4*)
+  version_type=sunos
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+  finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  if test "$with_gnu_ld" = yes; then
+    need_lib_prefix=no
+  fi
+  need_version=yes
+  ;;
+
+sysv4 | sysv4.3*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  case $host_vendor in
+    sni)
+      shlibpath_overrides_runpath=no
+      need_lib_prefix=no
+      runpath_var=LD_RUN_PATH
+      ;;
+    siemens)
+      need_lib_prefix=no
+      ;;
+    motorola)
+      need_lib_prefix=no
+      need_version=no
+      shlibpath_overrides_runpath=no
+      sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib'
+      ;;
+  esac
+  ;;
+
+sysv4*MP*)
+  if test -d /usr/nec ;then
+    version_type=linux # correct to gnu/linux during the next big refactor
+    library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}'
+    soname_spec='$libname${shared_ext}.$major'
+    shlibpath_var=LD_LIBRARY_PATH
+  fi
+  ;;
+
+sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
+  version_type=freebsd-elf
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  hardcode_into_libs=yes
+  if test "$with_gnu_ld" = yes; then
+    sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib'
+  else
+    sys_lib_search_path_spec='/usr/ccs/lib /usr/lib'
+    case $host_os in
+      sco3.2v5*)
+        sys_lib_search_path_spec="$sys_lib_search_path_spec /lib"
+	;;
+    esac
+  fi
+  sys_lib_dlsearch_path_spec='/usr/lib'
+  ;;
+
+tpf*)
+  # TPF is a cross-target only.  Preferred cross-host = GNU/Linux.
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  ;;
+
+uts4*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  ;;
+
+*)
+  dynamic_linker=no
+  ;;
+esac
+AC_MSG_RESULT([$dynamic_linker])
+test "$dynamic_linker" = no && can_build_shared=no
+
+variables_saved_for_relink="PATH $shlibpath_var $runpath_var"
+if test "$GCC" = yes; then
+  variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH"
+fi
+
+if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then
+  sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec"
+fi
+if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then
+  sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec"
+fi
+
+_LT_DECL([], [variables_saved_for_relink], [1],
+    [Variables whose values should be saved in libtool wrapper scripts and
+    restored at link time])
+_LT_DECL([], [need_lib_prefix], [0],
+    [Do we need the "lib" prefix for modules?])
+_LT_DECL([], [need_version], [0], [Do we need a version for libraries?])
+_LT_DECL([], [version_type], [0], [Library versioning type])
+_LT_DECL([], [runpath_var], [0],  [Shared library runtime path variable])
+_LT_DECL([], [shlibpath_var], [0],[Shared library path variable])
+_LT_DECL([], [shlibpath_overrides_runpath], [0],
+    [Is shlibpath searched before the hard-coded library search path?])
+_LT_DECL([], [libname_spec], [1], [Format of library name prefix])
+_LT_DECL([], [library_names_spec], [1],
+    [[List of archive names.  First name is the real one, the rest are links.
+    The last name is the one that the linker finds with -lNAME]])
+_LT_DECL([], [soname_spec], [1],
+    [[The coded name of the library, if different from the real name]])
+_LT_DECL([], [install_override_mode], [1],
+    [Permission mode override for installation of shared libraries])
+_LT_DECL([], [postinstall_cmds], [2],
+    [Command to use after installation of a shared archive])
+_LT_DECL([], [postuninstall_cmds], [2],
+    [Command to use after uninstallation of a shared archive])
+_LT_DECL([], [finish_cmds], [2],
+    [Commands used to finish a libtool library installation in a directory])
+_LT_DECL([], [finish_eval], [1],
+    [[As "finish_cmds", except a single script fragment to be evaled but
+    not shown]])
+_LT_DECL([], [hardcode_into_libs], [0],
+    [Whether we should hardcode library paths into libraries])
+_LT_DECL([], [sys_lib_search_path_spec], [2],
+    [Compile-time system search path for libraries])
+_LT_DECL([], [sys_lib_dlsearch_path_spec], [2],
+    [Run-time system search path for libraries])
+])# _LT_SYS_DYNAMIC_LINKER
+
+
+# _LT_PATH_TOOL_PREFIX(TOOL)
+# --------------------------
+# find a file program which can recognize shared library
+AC_DEFUN([_LT_PATH_TOOL_PREFIX],
+[m4_require([_LT_DECL_EGREP])dnl
+AC_MSG_CHECKING([for $1])
+AC_CACHE_VAL(lt_cv_path_MAGIC_CMD,
+[case $MAGIC_CMD in
+[[\\/*] |  ?:[\\/]*])
+  lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path.
+  ;;
+*)
+  lt_save_MAGIC_CMD="$MAGIC_CMD"
+  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+dnl $ac_dummy forces splitting on constant user-supplied paths.
+dnl POSIX.2 word splitting is done only on the output of word expansions,
+dnl not every word.  This closes a longstanding sh security hole.
+  ac_dummy="m4_if([$2], , $PATH, [$2])"
+  for ac_dir in $ac_dummy; do
+    IFS="$lt_save_ifs"
+    test -z "$ac_dir" && ac_dir=.
+    if test -f $ac_dir/$1; then
+      lt_cv_path_MAGIC_CMD="$ac_dir/$1"
+      if test -n "$file_magic_test_file"; then
+	case $deplibs_check_method in
+	"file_magic "*)
+	  file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"`
+	  MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
+	  if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null |
+	    $EGREP "$file_magic_regex" > /dev/null; then
+	    :
+	  else
+	    cat <<_LT_EOF 1>&2
+
+*** Warning: the command libtool uses to detect shared libraries,
+*** $file_magic_cmd, produces output that libtool cannot recognize.
+*** The result is that libtool may fail to recognize shared libraries
+*** as such.  This will affect the creation of libtool libraries that
+*** depend on shared libraries, but programs linked with such libtool
+*** libraries will work regardless of this problem.  Nevertheless, you
+*** may want to report the problem to your system manager and/or to
+*** bug-libtool at gnu.org
+
+_LT_EOF
+	  fi ;;
+	esac
+      fi
+      break
+    fi
+  done
+  IFS="$lt_save_ifs"
+  MAGIC_CMD="$lt_save_MAGIC_CMD"
+  ;;
+esac])
+MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
+if test -n "$MAGIC_CMD"; then
+  AC_MSG_RESULT($MAGIC_CMD)
+else
+  AC_MSG_RESULT(no)
+fi
+_LT_DECL([], [MAGIC_CMD], [0],
+	 [Used to examine libraries when file_magic_cmd begins with "file"])dnl
+])# _LT_PATH_TOOL_PREFIX
+
+# Old name:
+AU_ALIAS([AC_PATH_TOOL_PREFIX], [_LT_PATH_TOOL_PREFIX])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_PATH_TOOL_PREFIX], [])
+
+
+# _LT_PATH_MAGIC
+# --------------
+# find a file program which can recognize a shared library
+m4_defun([_LT_PATH_MAGIC],
+[_LT_PATH_TOOL_PREFIX(${ac_tool_prefix}file, /usr/bin$PATH_SEPARATOR$PATH)
+if test -z "$lt_cv_path_MAGIC_CMD"; then
+  if test -n "$ac_tool_prefix"; then
+    _LT_PATH_TOOL_PREFIX(file, /usr/bin$PATH_SEPARATOR$PATH)
+  else
+    MAGIC_CMD=:
+  fi
+fi
+])# _LT_PATH_MAGIC
+
+
+# LT_PATH_LD
+# ----------
+# find the pathname to the GNU or non-GNU linker
+AC_DEFUN([LT_PATH_LD],
+[AC_REQUIRE([AC_PROG_CC])dnl
+AC_REQUIRE([AC_CANONICAL_HOST])dnl
+AC_REQUIRE([AC_CANONICAL_BUILD])dnl
+m4_require([_LT_DECL_SED])dnl
+m4_require([_LT_DECL_EGREP])dnl
+m4_require([_LT_PROG_ECHO_BACKSLASH])dnl
+
+AC_ARG_WITH([gnu-ld],
+    [AS_HELP_STRING([--with-gnu-ld],
+	[assume the C compiler uses GNU ld @<:@default=no@:>@])],
+    [test "$withval" = no || with_gnu_ld=yes],
+    [with_gnu_ld=no])dnl
+
+ac_prog=ld
+if test "$GCC" = yes; then
+  # Check if gcc -print-prog-name=ld gives a path.
+  AC_MSG_CHECKING([for ld used by $CC])
+  case $host in
+  *-*-mingw*)
+    # gcc leaves a trailing carriage return which upsets mingw
+    ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
+  *)
+    ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
+  esac
+  case $ac_prog in
+    # Accept absolute paths.
+    [[\\/]]* | ?:[[\\/]]*)
+      re_direlt='/[[^/]][[^/]]*/\.\./'
+      # Canonicalize the pathname of ld
+      ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'`
+      while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do
+	ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"`
+      done
+      test -z "$LD" && LD="$ac_prog"
+      ;;
+  "")
+    # If it fails, then pretend we aren't using GCC.
+    ac_prog=ld
+    ;;
+  *)
+    # If it is relative, then search for the first ld in PATH.
+    with_gnu_ld=unknown
+    ;;
+  esac
+elif test "$with_gnu_ld" = yes; then
+  AC_MSG_CHECKING([for GNU ld])
+else
+  AC_MSG_CHECKING([for non-GNU ld])
+fi
+AC_CACHE_VAL(lt_cv_path_LD,
+[if test -z "$LD"; then
+  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+  for ac_dir in $PATH; do
+    IFS="$lt_save_ifs"
+    test -z "$ac_dir" && ac_dir=.
+    if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
+      lt_cv_path_LD="$ac_dir/$ac_prog"
+      # Check to see if the program is GNU ld.  I'd rather use --version,
+      # but apparently some variants of GNU ld only accept -v.
+      # Break only if it was the GNU/non-GNU ld that we prefer.
+      case `"$lt_cv_path_LD" -v 2>&1 </dev/null` in
+      *GNU* | *'with BFD'*)
+	test "$with_gnu_ld" != no && break
+	;;
+      *)
+	test "$with_gnu_ld" != yes && break
+	;;
+      esac
+    fi
+  done
+  IFS="$lt_save_ifs"
+else
+  lt_cv_path_LD="$LD" # Let the user override the test with a path.
+fi])
+LD="$lt_cv_path_LD"
+if test -n "$LD"; then
+  AC_MSG_RESULT($LD)
+else
+  AC_MSG_RESULT(no)
+fi
+test -z "$LD" && AC_MSG_ERROR([no acceptable ld found in \$PATH])
+_LT_PATH_LD_GNU
+AC_SUBST([LD])
+
+_LT_TAGDECL([], [LD], [1], [The linker used to build libraries])
+])# LT_PATH_LD
+
+# Old names:
+AU_ALIAS([AM_PROG_LD], [LT_PATH_LD])
+AU_ALIAS([AC_PROG_LD], [LT_PATH_LD])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AM_PROG_LD], [])
+dnl AC_DEFUN([AC_PROG_LD], [])
+
+
+# _LT_PATH_LD_GNU
+#- --------------
+m4_defun([_LT_PATH_LD_GNU],
+[AC_CACHE_CHECK([if the linker ($LD) is GNU ld], lt_cv_prog_gnu_ld,
+[# I'd rather use --version here, but apparently some GNU lds only accept -v.
+case `$LD -v 2>&1 </dev/null` in
+*GNU* | *'with BFD'*)
+  lt_cv_prog_gnu_ld=yes
+  ;;
+*)
+  lt_cv_prog_gnu_ld=no
+  ;;
+esac])
+with_gnu_ld=$lt_cv_prog_gnu_ld
+])# _LT_PATH_LD_GNU
+
+
+# _LT_CMD_RELOAD
+# --------------
+# find reload flag for linker
+#   -- PORTME Some linkers may need a different reload flag.
+m4_defun([_LT_CMD_RELOAD],
+[AC_CACHE_CHECK([for $LD option to reload object files],
+  lt_cv_ld_reload_flag,
+  [lt_cv_ld_reload_flag='-r'])
+reload_flag=$lt_cv_ld_reload_flag
+case $reload_flag in
+"" | " "*) ;;
+*) reload_flag=" $reload_flag" ;;
+esac
+reload_cmds='$LD$reload_flag -o $output$reload_objs'
+case $host_os in
+  cygwin* | mingw* | pw32* | cegcc*)
+    if test "$GCC" != yes; then
+      reload_cmds=false
+    fi
+    ;;
+  darwin*)
+    if test "$GCC" = yes; then
+      reload_cmds='$LTCC $LTCFLAGS -nostdlib ${wl}-r -o $output$reload_objs'
+    else
+      reload_cmds='$LD$reload_flag -o $output$reload_objs'
+    fi
+    ;;
+esac
+_LT_TAGDECL([], [reload_flag], [1], [How to create reloadable object files])dnl
+_LT_TAGDECL([], [reload_cmds], [2])dnl
+])# _LT_CMD_RELOAD
+
+
+# _LT_CHECK_MAGIC_METHOD
+# ----------------------
+# how to check for library dependencies
+#  -- PORTME fill in with the dynamic library characteristics
+m4_defun([_LT_CHECK_MAGIC_METHOD],
+[m4_require([_LT_DECL_EGREP])
+m4_require([_LT_DECL_OBJDUMP])
+AC_CACHE_CHECK([how to recognize dependent libraries],
+lt_cv_deplibs_check_method,
+[lt_cv_file_magic_cmd='$MAGIC_CMD'
+lt_cv_file_magic_test_file=
+lt_cv_deplibs_check_method='unknown'
+# Need to set the preceding variable on all platforms that support
+# interlibrary dependencies.
+# 'none' -- dependencies not supported.
+# `unknown' -- same as none, but documents that we really don't know.
+# 'pass_all' -- all dependencies passed with no checks.
+# 'test_compile' -- check by making test program.
+# 'file_magic [[regex]]' -- check by looking for files in library path
+# which responds to the $file_magic_cmd with a given extended regex.
+# If you have `file' or equivalent on your system and you're not sure
+# whether `pass_all' will *always* work, you probably want this one.
+
+case $host_os in
+aix[[4-9]]*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+beos*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+bsdi[[45]]*)
+  lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib)'
+  lt_cv_file_magic_cmd='/usr/bin/file -L'
+  lt_cv_file_magic_test_file=/shlib/libc.so
+  ;;
+
+cygwin*)
+  # func_win32_libid is a shell function defined in ltmain.sh
+  lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
+  lt_cv_file_magic_cmd='func_win32_libid'
+  ;;
+
+mingw* | pw32*)
+  # Base MSYS/MinGW do not provide the 'file' command needed by
+  # func_win32_libid shell function, so use a weaker test based on 'objdump',
+  # unless we find 'file', for example because we are cross-compiling.
+  # func_win32_libid assumes BSD nm, so disallow it if using MS dumpbin.
+  if ( test "$lt_cv_nm_interface" = "BSD nm" && file / ) >/dev/null 2>&1; then
+    lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
+    lt_cv_file_magic_cmd='func_win32_libid'
+  else
+    # Keep this pattern in sync with the one in func_win32_libid.
+    lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)'
+    lt_cv_file_magic_cmd='$OBJDUMP -f'
+  fi
+  ;;
+
+cegcc*)
+  # use the weaker test based on 'objdump'. See mingw*.
+  lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?'
+  lt_cv_file_magic_cmd='$OBJDUMP -f'
+  ;;
+
+darwin* | rhapsody*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+freebsd* | dragonfly*)
+  if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then
+    case $host_cpu in
+    i*86 )
+      # Not sure whether the presence of OpenBSD here was a mistake.
+      # Let's accept both of them until this is cleared up.
+      lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[[3-9]]86 (compact )?demand paged shared library'
+      lt_cv_file_magic_cmd=/usr/bin/file
+      lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*`
+      ;;
+    esac
+  else
+    lt_cv_deplibs_check_method=pass_all
+  fi
+  ;;
+
+gnu*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+haiku*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+hpux10.20* | hpux11*)
+  lt_cv_file_magic_cmd=/usr/bin/file
+  case $host_cpu in
+  ia64*)
+    lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|ELF-[[0-9]][[0-9]]) shared object file - IA64'
+    lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so
+    ;;
+  hppa*64*)
+    [lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]']
+    lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl
+    ;;
+  *)
+    lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|PA-RISC[[0-9]]\.[[0-9]]) shared library'
+    lt_cv_file_magic_test_file=/usr/lib/libc.sl
+    ;;
+  esac
+  ;;
+
+interix[[3-9]]*)
+  # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here
+  lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|\.a)$'
+  ;;
+
+irix5* | irix6* | nonstopux*)
+  case $LD in
+  *-32|*"-32 ") libmagic=32-bit;;
+  *-n32|*"-n32 ") libmagic=N32;;
+  *-64|*"-64 ") libmagic=64-bit;;
+  *) libmagic=never-match;;
+  esac
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+# This must be glibc/ELF.
+linux* | k*bsd*-gnu | kopensolaris*-gnu)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+netbsd*)
+  if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then
+    lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$'
+  else
+    lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|_pic\.a)$'
+  fi
+  ;;
+
+newos6*)
+  lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (executable|dynamic lib)'
+  lt_cv_file_magic_cmd=/usr/bin/file
+  lt_cv_file_magic_test_file=/usr/lib/libnls.so
+  ;;
+
+*nto* | *qnx*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+openbsd*)
+  if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+    lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|\.so|_pic\.a)$'
+  else
+    lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$'
+  fi
+  ;;
+
+osf3* | osf4* | osf5*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+rdos*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+solaris*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+sysv4 | sysv4.3*)
+  case $host_vendor in
+  motorola)
+    lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib) M[[0-9]][[0-9]]* Version [[0-9]]'
+    lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*`
+    ;;
+  ncr)
+    lt_cv_deplibs_check_method=pass_all
+    ;;
+  sequent)
+    lt_cv_file_magic_cmd='/bin/file'
+    lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )'
+    ;;
+  sni)
+    lt_cv_file_magic_cmd='/bin/file'
+    lt_cv_deplibs_check_method="file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB dynamic lib"
+    lt_cv_file_magic_test_file=/lib/libc.so
+    ;;
+  siemens)
+    lt_cv_deplibs_check_method=pass_all
+    ;;
+  pc)
+    lt_cv_deplibs_check_method=pass_all
+    ;;
+  esac
+  ;;
+
+tpf*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+esac
+])
+
+file_magic_glob=
+want_nocaseglob=no
+if test "$build" = "$host"; then
+  case $host_os in
+  mingw* | pw32*)
+    if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then
+      want_nocaseglob=yes
+    else
+      file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[[\1]]\/[[\1]]\/g;/g"`
+    fi
+    ;;
+  esac
+fi
+
+file_magic_cmd=$lt_cv_file_magic_cmd
+deplibs_check_method=$lt_cv_deplibs_check_method
+test -z "$deplibs_check_method" && deplibs_check_method=unknown
+
+_LT_DECL([], [deplibs_check_method], [1],
+    [Method to check whether dependent libraries are shared objects])
+_LT_DECL([], [file_magic_cmd], [1],
+    [Command to use when deplibs_check_method = "file_magic"])
+_LT_DECL([], [file_magic_glob], [1],
+    [How to find potential files when deplibs_check_method = "file_magic"])
+_LT_DECL([], [want_nocaseglob], [1],
+    [Find potential files using nocaseglob when deplibs_check_method = "file_magic"])
+])# _LT_CHECK_MAGIC_METHOD
+
+
+# LT_PATH_NM
+# ----------
+# find the pathname to a BSD- or MS-compatible name lister
+AC_DEFUN([LT_PATH_NM],
+[AC_REQUIRE([AC_PROG_CC])dnl
+AC_CACHE_CHECK([for BSD- or MS-compatible name lister (nm)], lt_cv_path_NM,
+[if test -n "$NM"; then
+  # Let the user override the test.
+  lt_cv_path_NM="$NM"
+else
+  lt_nm_to_check="${ac_tool_prefix}nm"
+  if test -n "$ac_tool_prefix" && test "$build" = "$host"; then
+    lt_nm_to_check="$lt_nm_to_check nm"
+  fi
+  for lt_tmp_nm in $lt_nm_to_check; do
+    lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+    for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do
+      IFS="$lt_save_ifs"
+      test -z "$ac_dir" && ac_dir=.
+      tmp_nm="$ac_dir/$lt_tmp_nm"
+      if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then
+	# Check to see if the nm accepts a BSD-compat flag.
+	# Adding the `sed 1q' prevents false positives on HP-UX, which says:
+	#   nm: unknown option "B" ignored
+	# Tru64's nm complains that /dev/null is an invalid object file
+	case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in
+	*/dev/null* | *'Invalid file or object type'*)
+	  lt_cv_path_NM="$tmp_nm -B"
+	  break
+	  ;;
+	*)
+	  case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in
+	  */dev/null*)
+	    lt_cv_path_NM="$tmp_nm -p"
+	    break
+	    ;;
+	  *)
+	    lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but
+	    continue # so that we can try to find one that supports BSD flags
+	    ;;
+	  esac
+	  ;;
+	esac
+      fi
+    done
+    IFS="$lt_save_ifs"
+  done
+  : ${lt_cv_path_NM=no}
+fi])
+if test "$lt_cv_path_NM" != "no"; then
+  NM="$lt_cv_path_NM"
+else
+  # Didn't find any BSD compatible name lister, look for dumpbin.
+  if test -n "$DUMPBIN"; then :
+    # Let the user override the test.
+  else
+    AC_CHECK_TOOLS(DUMPBIN, [dumpbin "link -dump"], :)
+    case `$DUMPBIN -symbols /dev/null 2>&1 | sed '1q'` in
+    *COFF*)
+      DUMPBIN="$DUMPBIN -symbols"
+      ;;
+    *)
+      DUMPBIN=:
+      ;;
+    esac
+  fi
+  AC_SUBST([DUMPBIN])
+  if test "$DUMPBIN" != ":"; then
+    NM="$DUMPBIN"
+  fi
+fi
+test -z "$NM" && NM=nm
+AC_SUBST([NM])
+_LT_DECL([], [NM], [1], [A BSD- or MS-compatible name lister])dnl
+
+AC_CACHE_CHECK([the name lister ($NM) interface], [lt_cv_nm_interface],
+  [lt_cv_nm_interface="BSD nm"
+  echo "int some_variable = 0;" > conftest.$ac_ext
+  (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&AS_MESSAGE_LOG_FD)
+  (eval "$ac_compile" 2>conftest.err)
+  cat conftest.err >&AS_MESSAGE_LOG_FD
+  (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&AS_MESSAGE_LOG_FD)
+  (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out)
+  cat conftest.err >&AS_MESSAGE_LOG_FD
+  (eval echo "\"\$as_me:$LINENO: output\"" >&AS_MESSAGE_LOG_FD)
+  cat conftest.out >&AS_MESSAGE_LOG_FD
+  if $GREP 'External.*some_variable' conftest.out > /dev/null; then
+    lt_cv_nm_interface="MS dumpbin"
+  fi
+  rm -f conftest*])
+])# LT_PATH_NM
+
+# Old names:
+AU_ALIAS([AM_PROG_NM], [LT_PATH_NM])
+AU_ALIAS([AC_PROG_NM], [LT_PATH_NM])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AM_PROG_NM], [])
+dnl AC_DEFUN([AC_PROG_NM], [])
+
+# _LT_CHECK_SHAREDLIB_FROM_LINKLIB
+# --------------------------------
+# how to determine the name of the shared library
+# associated with a specific link library.
+#  -- PORTME fill in with the dynamic library characteristics
+m4_defun([_LT_CHECK_SHAREDLIB_FROM_LINKLIB],
+[m4_require([_LT_DECL_EGREP])
+m4_require([_LT_DECL_OBJDUMP])
+m4_require([_LT_DECL_DLLTOOL])
+AC_CACHE_CHECK([how to associate runtime and link libraries],
+lt_cv_sharedlib_from_linklib_cmd,
+[lt_cv_sharedlib_from_linklib_cmd='unknown'
+
+case $host_os in
+cygwin* | mingw* | pw32* | cegcc*)
+  # two different shell functions defined in ltmain.sh
+  # decide which to use based on capabilities of $DLLTOOL
+  case `$DLLTOOL --help 2>&1` in
+  *--identify-strict*)
+    lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib
+    ;;
+  *)
+    lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback
+    ;;
+  esac
+  ;;
+*)
+  # fallback: assume linklib IS sharedlib
+  lt_cv_sharedlib_from_linklib_cmd="$ECHO"
+  ;;
+esac
+])
+sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd
+test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO
+
+_LT_DECL([], [sharedlib_from_linklib_cmd], [1],
+    [Command to associate shared and link libraries])
+])# _LT_CHECK_SHAREDLIB_FROM_LINKLIB
+
+
+# _LT_PATH_MANIFEST_TOOL
+# ----------------------
+# locate the manifest tool
+m4_defun([_LT_PATH_MANIFEST_TOOL],
+[AC_CHECK_TOOL(MANIFEST_TOOL, mt, :)
+test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt
+AC_CACHE_CHECK([if $MANIFEST_TOOL is a manifest tool], [lt_cv_path_mainfest_tool],
+  [lt_cv_path_mainfest_tool=no
+  echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&AS_MESSAGE_LOG_FD
+  $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out
+  cat conftest.err >&AS_MESSAGE_LOG_FD
+  if $GREP 'Manifest Tool' conftest.out > /dev/null; then
+    lt_cv_path_mainfest_tool=yes
+  fi
+  rm -f conftest*])
+if test "x$lt_cv_path_mainfest_tool" != xyes; then
+  MANIFEST_TOOL=:
+fi
+_LT_DECL([], [MANIFEST_TOOL], [1], [Manifest tool])dnl
+])# _LT_PATH_MANIFEST_TOOL
+
+
+# LT_LIB_M
+# --------
+# check for math library
+AC_DEFUN([LT_LIB_M],
+[AC_REQUIRE([AC_CANONICAL_HOST])dnl
+LIBM=
+case $host in
+*-*-beos* | *-*-cegcc* | *-*-cygwin* | *-*-haiku* | *-*-pw32* | *-*-darwin*)
+  # These system don't have libm, or don't need it
+  ;;
+*-ncr-sysv4.3*)
+  AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM="-lmw")
+  AC_CHECK_LIB(m, cos, LIBM="$LIBM -lm")
+  ;;
+*)
+  AC_CHECK_LIB(m, cos, LIBM="-lm")
+  ;;
+esac
+AC_SUBST([LIBM])
+])# LT_LIB_M
+
+# Old name:
+AU_ALIAS([AC_CHECK_LIBM], [LT_LIB_M])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_CHECK_LIBM], [])
+
+
+# _LT_COMPILER_NO_RTTI([TAGNAME])
+# -------------------------------
+m4_defun([_LT_COMPILER_NO_RTTI],
+[m4_require([_LT_TAG_COMPILER])dnl
+
+_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=
+
+if test "$GCC" = yes; then
+  case $cc_basename in
+  nvcc*)
+    _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -Xcompiler -fno-builtin' ;;
+  *)
+    _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' ;;
+  esac
+
+  _LT_COMPILER_OPTION([if $compiler supports -fno-rtti -fno-exceptions],
+    lt_cv_prog_compiler_rtti_exceptions,
+    [-fno-rtti -fno-exceptions], [],
+    [_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)="$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) -fno-rtti -fno-exceptions"])
+fi
+_LT_TAGDECL([no_builtin_flag], [lt_prog_compiler_no_builtin_flag], [1],
+	[Compiler flag to turn off builtin functions])
+])# _LT_COMPILER_NO_RTTI
+
+
+# _LT_CMD_GLOBAL_SYMBOLS
+# ----------------------
+m4_defun([_LT_CMD_GLOBAL_SYMBOLS],
+[AC_REQUIRE([AC_CANONICAL_HOST])dnl
+AC_REQUIRE([AC_PROG_CC])dnl
+AC_REQUIRE([AC_PROG_AWK])dnl
+AC_REQUIRE([LT_PATH_NM])dnl
+AC_REQUIRE([LT_PATH_LD])dnl
+m4_require([_LT_DECL_SED])dnl
+m4_require([_LT_DECL_EGREP])dnl
+m4_require([_LT_TAG_COMPILER])dnl
+
+# Check for command to grab the raw symbol name followed by C symbol from nm.
+AC_MSG_CHECKING([command to parse $NM output from $compiler object])
+AC_CACHE_VAL([lt_cv_sys_global_symbol_pipe],
+[
+# These are sane defaults that work on at least a few old systems.
+# [They come from Ultrix.  What could be older than Ultrix?!! ;)]
+
+# Character class describing NM global symbol codes.
+symcode='[[BCDEGRST]]'
+
+# Regexp to match symbols that can be accessed directly from C.
+sympat='\([[_A-Za-z]][[_A-Za-z0-9]]*\)'
+
+# Define system-specific variables.
+case $host_os in
+aix*)
+  symcode='[[BCDT]]'
+  ;;
+cygwin* | mingw* | pw32* | cegcc*)
+  symcode='[[ABCDGISTW]]'
+  ;;
+hpux*)
+  if test "$host_cpu" = ia64; then
+    symcode='[[ABCDEGRST]]'
+  fi
+  ;;
+irix* | nonstopux*)
+  symcode='[[BCDEGRST]]'
+  ;;
+osf*)
+  symcode='[[BCDEGQRST]]'
+  ;;
+solaris*)
+  symcode='[[BDRT]]'
+  ;;
+sco3.2v5*)
+  symcode='[[DT]]'
+  ;;
+sysv4.2uw2*)
+  symcode='[[DT]]'
+  ;;
+sysv5* | sco5v6* | unixware* | OpenUNIX*)
+  symcode='[[ABDT]]'
+  ;;
+sysv4)
+  symcode='[[DFNSTU]]'
+  ;;
+esac
+
+# If we're using GNU nm, then use its standard symbol codes.
+case `$NM -V 2>&1` in
+*GNU* | *'with BFD'*)
+  symcode='[[ABCDGIRSTW]]' ;;
+esac
+
+# Transform an extracted symbol line into a proper C declaration.
+# Some systems (esp. on ia64) link data and code symbols differently,
+# so use this general approach.
+lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'"
+
+# Transform an extracted symbol line into symbol name and symbol address
+lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\)[[ ]]*$/  {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/  {\"\2\", (void *) \&\2},/p'"
+lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([[^ ]]*\)[[ ]]*$/  {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \(lib[[^ ]]*\)$/  {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/  {\"lib\2\", (void *) \&\2},/p'"
+
+# Handle CRLF in mingw tool chain
+opt_cr=
+case $build_os in
+mingw*)
+  opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp
+  ;;
+esac
+
+# Try without a prefix underscore, then with it.
+for ac_symprfx in "" "_"; do
+
+  # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol.
+  symxfrm="\\1 $ac_symprfx\\2 \\2"
+
+  # Write the raw and C identifiers.
+  if test "$lt_cv_nm_interface" = "MS dumpbin"; then
+    # Fake it for dumpbin and say T for any non-static function
+    # and D for any global variable.
+    # Also find C++ and __fastcall symbols from MSVC++,
+    # which start with @ or ?.
+    lt_cv_sys_global_symbol_pipe="$AWK ['"\
+"     {last_section=section; section=\$ 3};"\
+"     /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\
+"     /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\
+"     \$ 0!~/External *\|/{next};"\
+"     / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\
+"     {if(hide[section]) next};"\
+"     {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\
+"     {split(\$ 0, a, /\||\r/); split(a[2], s)};"\
+"     s[1]~/^[@?]/{print s[1], s[1]; next};"\
+"     s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\
+"     ' prfx=^$ac_symprfx]"
+  else
+    lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[	 ]]\($symcode$symcode*\)[[	 ]][[	 ]]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'"
+  fi
+  lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'"
+
+  # Check to see that the pipe works correctly.
+  pipe_works=no
+
+  rm -f conftest*
+  cat > conftest.$ac_ext <<_LT_EOF
+#ifdef __cplusplus
+extern "C" {
+#endif
+char nm_test_var;
+void nm_test_func(void);
+void nm_test_func(void){}
+#ifdef __cplusplus
+}
+#endif
+int main(){nm_test_var='a';nm_test_func();return(0);}
+_LT_EOF
+
+  if AC_TRY_EVAL(ac_compile); then
+    # Now try to grab the symbols.
+    nlist=conftest.nm
+    if AC_TRY_EVAL(NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) && test -s "$nlist"; then
+      # Try sorting and uniquifying the output.
+      if sort "$nlist" | uniq > "$nlist"T; then
+	mv -f "$nlist"T "$nlist"
+      else
+	rm -f "$nlist"T
+      fi
+
+      # Make sure that we snagged all the symbols we need.
+      if $GREP ' nm_test_var$' "$nlist" >/dev/null; then
+	if $GREP ' nm_test_func$' "$nlist" >/dev/null; then
+	  cat <<_LT_EOF > conftest.$ac_ext
+/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests.  */
+#if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE)
+/* DATA imports from DLLs on WIN32 con't be const, because runtime
+   relocations are performed -- see ld's documentation on pseudo-relocs.  */
+# define LT@&t at _DLSYM_CONST
+#elif defined(__osf__)
+/* This system does not cope well with relocations in const data.  */
+# define LT@&t at _DLSYM_CONST
+#else
+# define LT@&t at _DLSYM_CONST const
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+_LT_EOF
+	  # Now generate the symbol file.
+	  eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext'
+
+	  cat <<_LT_EOF >> conftest.$ac_ext
+
+/* The mapping between symbol names and symbols.  */
+LT@&t at _DLSYM_CONST struct {
+  const char *name;
+  void       *address;
+}
+lt__PROGRAM__LTX_preloaded_symbols[[]] =
+{
+  { "@PROGRAM@", (void *) 0 },
+_LT_EOF
+	  $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/  {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext
+	  cat <<\_LT_EOF >> conftest.$ac_ext
+  {0, (void *) 0}
+};
+
+/* This works around a problem in FreeBSD linker */
+#ifdef FREEBSD_WORKAROUND
+static const void *lt_preloaded_setup() {
+  return lt__PROGRAM__LTX_preloaded_symbols;
+}
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+_LT_EOF
+	  # Now try linking the two files.
+	  mv conftest.$ac_objext conftstm.$ac_objext
+	  lt_globsym_save_LIBS=$LIBS
+	  lt_globsym_save_CFLAGS=$CFLAGS
+	  LIBS="conftstm.$ac_objext"
+	  CFLAGS="$CFLAGS$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)"
+	  if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext}; then
+	    pipe_works=yes
+	  fi
+	  LIBS=$lt_globsym_save_LIBS
+	  CFLAGS=$lt_globsym_save_CFLAGS
+	else
+	  echo "cannot find nm_test_func in $nlist" >&AS_MESSAGE_LOG_FD
+	fi
+      else
+	echo "cannot find nm_test_var in $nlist" >&AS_MESSAGE_LOG_FD
+      fi
+    else
+      echo "cannot run $lt_cv_sys_global_symbol_pipe" >&AS_MESSAGE_LOG_FD
+    fi
+  else
+    echo "$progname: failed program was:" >&AS_MESSAGE_LOG_FD
+    cat conftest.$ac_ext >&5
+  fi
+  rm -rf conftest* conftst*
+
+  # Do not use the global_symbol_pipe unless it works.
+  if test "$pipe_works" = yes; then
+    break
+  else
+    lt_cv_sys_global_symbol_pipe=
+  fi
+done
+])
+if test -z "$lt_cv_sys_global_symbol_pipe"; then
+  lt_cv_sys_global_symbol_to_cdecl=
+fi
+if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then
+  AC_MSG_RESULT(failed)
+else
+  AC_MSG_RESULT(ok)
+fi
+
+# Response file support.
+if test "$lt_cv_nm_interface" = "MS dumpbin"; then
+  nm_file_list_spec='@'
+elif $NM --help 2>/dev/null | grep '[[@]]FILE' >/dev/null; then
+  nm_file_list_spec='@'
+fi
+
+_LT_DECL([global_symbol_pipe], [lt_cv_sys_global_symbol_pipe], [1],
+    [Take the output of nm and produce a listing of raw symbols and C names])
+_LT_DECL([global_symbol_to_cdecl], [lt_cv_sys_global_symbol_to_cdecl], [1],
+    [Transform the output of nm in a proper C declaration])
+_LT_DECL([global_symbol_to_c_name_address],
+    [lt_cv_sys_global_symbol_to_c_name_address], [1],
+    [Transform the output of nm in a C name address pair])
+_LT_DECL([global_symbol_to_c_name_address_lib_prefix],
+    [lt_cv_sys_global_symbol_to_c_name_address_lib_prefix], [1],
+    [Transform the output of nm in a C name address pair when lib prefix is needed])
+_LT_DECL([], [nm_file_list_spec], [1],
+    [Specify filename containing input files for $NM])
+]) # _LT_CMD_GLOBAL_SYMBOLS
+
+
+# _LT_COMPILER_PIC([TAGNAME])
+# ---------------------------
+m4_defun([_LT_COMPILER_PIC],
+[m4_require([_LT_TAG_COMPILER])dnl
+_LT_TAGVAR(lt_prog_compiler_wl, $1)=
+_LT_TAGVAR(lt_prog_compiler_pic, $1)=
+_LT_TAGVAR(lt_prog_compiler_static, $1)=
+
+m4_if([$1], [CXX], [
+  # C++ specific cases for pic, static, wl, etc.
+  if test "$GXX" = yes; then
+    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+    _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
+
+    case $host_os in
+    aix*)
+      # All AIX code is PIC.
+      if test "$host_cpu" = ia64; then
+	# AIX 5 now supports IA64 processor
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      fi
+      ;;
+
+    amigaos*)
+      case $host_cpu in
+      powerpc)
+            # see comment about AmigaOS4 .so support
+            _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+        ;;
+      m68k)
+            # FIXME: we need at least 68020 code to build shared libraries, but
+            # adding the `-m68020' flag to GCC prevents building anything better,
+            # like `-m68040'.
+            _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4'
+        ;;
+      esac
+      ;;
+
+    beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
+      # PIC is the default for these OSes.
+      ;;
+    mingw* | cygwin* | os2* | pw32* | cegcc*)
+      # This hack is so that the source file can tell whether it is being
+      # built for inclusion in a dll (and should export symbols for example).
+      # Although the cygwin gcc ignores -fPIC, still need this for old-style
+      # (--disable-auto-import) libraries
+      m4_if([$1], [GCJ], [],
+	[_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'])
+      ;;
+    darwin* | rhapsody*)
+      # PIC is the default on this platform
+      # Common symbols not allowed in MH_DYLIB files
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common'
+      ;;
+    *djgpp*)
+      # DJGPP does not support shared libraries at all
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)=
+      ;;
+    haiku*)
+      # PIC is the default for Haiku.
+      # The "-static" flag exists, but is broken.
+      _LT_TAGVAR(lt_prog_compiler_static, $1)=
+      ;;
+    interix[[3-9]]*)
+      # Interix 3.x gcc -fpic/-fPIC options generate broken code.
+      # Instead, we relocate shared libraries at runtime.
+      ;;
+    sysv4*MP*)
+      if test -d /usr/nec; then
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic
+      fi
+      ;;
+    hpux*)
+      # PIC is the default for 64-bit PA HP-UX, but not for 32-bit
+      # PA HP-UX.  On IA64 HP-UX, PIC is the default but the pic flag
+      # sets the default TLS model and affects inlining.
+      case $host_cpu in
+      hppa*64*)
+	;;
+      *)
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+	;;
+      esac
+      ;;
+    *qnx* | *nto*)
+      # QNX uses GNU C++, but need to define -shared option too, otherwise
+      # it will coredump.
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared'
+      ;;
+    *)
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+      ;;
+    esac
+  else
+    case $host_os in
+      aix[[4-9]]*)
+	# All AIX code is PIC.
+	if test "$host_cpu" = ia64; then
+	  # AIX 5 now supports IA64 processor
+	  _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+	else
+	  _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp'
+	fi
+	;;
+      chorus*)
+	case $cc_basename in
+	cxch68*)
+	  # Green Hills C++ Compiler
+	  # _LT_TAGVAR(lt_prog_compiler_static, $1)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a"
+	  ;;
+	esac
+	;;
+      mingw* | cygwin* | os2* | pw32* | cegcc*)
+	# This hack is so that the source file can tell whether it is being
+	# built for inclusion in a dll (and should export symbols for example).
+	m4_if([$1], [GCJ], [],
+	  [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'])
+	;;
+      dgux*)
+	case $cc_basename in
+	  ec++*)
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+	    ;;
+	  ghcx*)
+	    # Green Hills C++ Compiler
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      freebsd* | dragonfly*)
+	# FreeBSD uses GNU C++
+	;;
+      hpux9* | hpux10* | hpux11*)
+	case $cc_basename in
+	  CC*)
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive'
+	    if test "$host_cpu" != ia64; then
+	      _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z'
+	    fi
+	    ;;
+	  aCC*)
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive'
+	    case $host_cpu in
+	    hppa*64*|ia64*)
+	      # +Z the default
+	      ;;
+	    *)
+	      _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z'
+	      ;;
+	    esac
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      interix*)
+	# This is c89, which is MS Visual C++ (no shared libs)
+	# Anyone wants to do a port?
+	;;
+      irix5* | irix6* | nonstopux*)
+	case $cc_basename in
+	  CC*)
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+	    # CC pic flag -KPIC is the default.
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      linux* | k*bsd*-gnu | kopensolaris*-gnu)
+	case $cc_basename in
+	  KCC*)
+	    # KAI C++ Compiler
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,'
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+	    ;;
+	  ecpc* )
+	    # old Intel C++ for x86_64 which still supported -KPIC.
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
+	    ;;
+	  icpc* )
+	    # Intel C++, used to be incompatible with GCC.
+	    # ICC 10 doesn't accept -KPIC any more.
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
+	    ;;
+	  pgCC* | pgcpp*)
+	    # Portland Group C++ compiler
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic'
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+	    ;;
+	  cxx*)
+	    # Compaq C++
+	    # Make sure the PIC flag is empty.  It appears that all Alpha
+	    # Linux and Compaq Tru64 Unix objects are PIC.
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)=
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+	    ;;
+	  xlc* | xlC* | bgxl[[cC]]* | mpixl[[cC]]*)
+	    # IBM XL 8.0, 9.0 on PPC and BlueGene
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic'
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink'
+	    ;;
+	  *)
+	    case `$CC -V 2>&1 | sed 5q` in
+	    *Sun\ C*)
+	      # Sun C++ 5.9
+	      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+	      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+	      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld '
+	      ;;
+	    esac
+	    ;;
+	esac
+	;;
+      lynxos*)
+	;;
+      m88k*)
+	;;
+      mvs*)
+	case $cc_basename in
+	  cxx*)
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-W c,exportall'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      netbsd*)
+	;;
+      *qnx* | *nto*)
+        # QNX uses GNU C++, but need to define -shared option too, otherwise
+        # it will coredump.
+        _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared'
+        ;;
+      osf3* | osf4* | osf5*)
+	case $cc_basename in
+	  KCC*)
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,'
+	    ;;
+	  RCC*)
+	    # Rational C++ 2.4.1
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
+	    ;;
+	  cxx*)
+	    # Digital/Compaq C++
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	    # Make sure the PIC flag is empty.  It appears that all Alpha
+	    # Linux and Compaq Tru64 Unix objects are PIC.
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)=
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      psos*)
+	;;
+      solaris*)
+	case $cc_basename in
+	  CC* | sunCC*)
+	    # Sun C++ 4.2, 5.x and Centerline C++
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld '
+	    ;;
+	  gcx*)
+	    # Green Hills C++ Compiler
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      sunos4*)
+	case $cc_basename in
+	  CC*)
+	    # Sun C++ 4.x
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+	    ;;
+	  lcc*)
+	    # Lucid
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
+	case $cc_basename in
+	  CC*)
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+	    ;;
+	esac
+	;;
+      tandem*)
+	case $cc_basename in
+	  NCC*)
+	    # NonStop-UX NCC 3.20
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      vxworks*)
+	;;
+      *)
+	_LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no
+	;;
+    esac
+  fi
+],
+[
+  if test "$GCC" = yes; then
+    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+    _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
+
+    case $host_os in
+      aix*)
+      # All AIX code is PIC.
+      if test "$host_cpu" = ia64; then
+	# AIX 5 now supports IA64 processor
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      fi
+      ;;
+
+    amigaos*)
+      case $host_cpu in
+      powerpc)
+            # see comment about AmigaOS4 .so support
+            _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+        ;;
+      m68k)
+            # FIXME: we need at least 68020 code to build shared libraries, but
+            # adding the `-m68020' flag to GCC prevents building anything better,
+            # like `-m68040'.
+            _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4'
+        ;;
+      esac
+      ;;
+
+    beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
+      # PIC is the default for these OSes.
+      ;;
+
+    mingw* | cygwin* | pw32* | os2* | cegcc*)
+      # This hack is so that the source file can tell whether it is being
+      # built for inclusion in a dll (and should export symbols for example).
+      # Although the cygwin gcc ignores -fPIC, still need this for old-style
+      # (--disable-auto-import) libraries
+      m4_if([$1], [GCJ], [],
+	[_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'])
+      ;;
+
+    darwin* | rhapsody*)
+      # PIC is the default on this platform
+      # Common symbols not allowed in MH_DYLIB files
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common'
+      ;;
+
+    haiku*)
+      # PIC is the default for Haiku.
+      # The "-static" flag exists, but is broken.
+      _LT_TAGVAR(lt_prog_compiler_static, $1)=
+      ;;
+
+    hpux*)
+      # PIC is the default for 64-bit PA HP-UX, but not for 32-bit
+      # PA HP-UX.  On IA64 HP-UX, PIC is the default but the pic flag
+      # sets the default TLS model and affects inlining.
+      case $host_cpu in
+      hppa*64*)
+	# +Z the default
+	;;
+      *)
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+	;;
+      esac
+      ;;
+
+    interix[[3-9]]*)
+      # Interix 3.x gcc -fpic/-fPIC options generate broken code.
+      # Instead, we relocate shared libraries at runtime.
+      ;;
+
+    msdosdjgpp*)
+      # Just because we use GCC doesn't mean we suddenly get shared libraries
+      # on systems that don't support them.
+      _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no
+      enable_shared=no
+      ;;
+
+    *nto* | *qnx*)
+      # QNX uses GNU C++, but need to define -shared option too, otherwise
+      # it will coredump.
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared'
+      ;;
+
+    sysv4*MP*)
+      if test -d /usr/nec; then
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic
+      fi
+      ;;
+
+    *)
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+      ;;
+    esac
+
+    case $cc_basename in
+    nvcc*) # Cuda Compiler Driver 2.2
+      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Xlinker '
+      if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then
+        _LT_TAGVAR(lt_prog_compiler_pic, $1)="-Xcompiler $_LT_TAGVAR(lt_prog_compiler_pic, $1)"
+      fi
+      ;;
+    esac
+  else
+    # PORTME Check for flag to pass linker flags through the system compiler.
+    case $host_os in
+    aix*)
+      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+      if test "$host_cpu" = ia64; then
+	# AIX 5 now supports IA64 processor
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      else
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp'
+      fi
+      ;;
+
+    mingw* | cygwin* | pw32* | os2* | cegcc*)
+      # This hack is so that the source file can tell whether it is being
+      # built for inclusion in a dll (and should export symbols for example).
+      m4_if([$1], [GCJ], [],
+	[_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'])
+      ;;
+
+    hpux9* | hpux10* | hpux11*)
+      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+      # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but
+      # not for PA HP-UX.
+      case $host_cpu in
+      hppa*64*|ia64*)
+	# +Z the default
+	;;
+      *)
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z'
+	;;
+      esac
+      # Is there a better lt_prog_compiler_static that works with the bundled CC?
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive'
+      ;;
+
+    irix5* | irix6* | nonstopux*)
+      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+      # PIC (with -KPIC) is the default.
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+      ;;
+
+    linux* | k*bsd*-gnu | kopensolaris*-gnu)
+      case $cc_basename in
+      # old Intel for x86_64 which still supported -KPIC.
+      ecc*)
+	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
+        ;;
+      # icc used to be incompatible with GCC.
+      # ICC 10 doesn't accept -KPIC any more.
+      icc* | ifort*)
+	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
+        ;;
+      # Lahey Fortran 8.1.
+      lf95*)
+	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)='--shared'
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='--static'
+	;;
+      nagfor*)
+	# NAG Fortran compiler
+	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,-Wl,,'
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC'
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+	;;
+      pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*)
+        # Portland Group compilers (*not* the Pentium gcc compiler,
+	# which looks to be a dead project)
+	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic'
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+        ;;
+      ccc*)
+        _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+        # All Alpha code is PIC.
+        _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+        ;;
+      xl* | bgxl* | bgf* | mpixl*)
+	# IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene
+	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic'
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink'
+	;;
+      *)
+	case `$CC -V 2>&1 | sed 5q` in
+	*Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [[1-7]].* | *Sun*Fortran*\ 8.[[0-3]]*)
+	  # Sun Fortran 8.3 passes all unrecognized flags to the linker
+	  _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+	  _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+	  _LT_TAGVAR(lt_prog_compiler_wl, $1)=''
+	  ;;
+	*Sun\ F* | *Sun*Fortran*)
+	  _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+	  _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+	  _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld '
+	  ;;
+	*Sun\ C*)
+	  # Sun C 5.9
+	  _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+	  _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+	  _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	  ;;
+        *Intel*\ [[CF]]*Compiler*)
+	  _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	  _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+	  _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
+	  ;;
+	*Portland\ Group*)
+	  _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	  _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic'
+	  _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+	  ;;
+	esac
+	;;
+      esac
+      ;;
+
+    newsos6)
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      ;;
+
+    *nto* | *qnx*)
+      # QNX uses GNU C++, but need to define -shared option too, otherwise
+      # it will coredump.
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared'
+      ;;
+
+    osf3* | osf4* | osf5*)
+      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+      # All OSF/1 code is PIC.
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+      ;;
+
+    rdos*)
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+      ;;
+
+    solaris*)
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      case $cc_basename in
+      f77* | f90* | f95* | sunf77* | sunf90* | sunf95*)
+	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ';;
+      *)
+	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,';;
+      esac
+      ;;
+
+    sunos4*)
+      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld '
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC'
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      ;;
+
+    sysv4 | sysv4.2uw2* | sysv4.3*)
+      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      ;;
+
+    sysv4*MP*)
+      if test -d /usr/nec ;then
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-Kconform_pic'
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      fi
+      ;;
+
+    sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
+      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      ;;
+
+    unicos*)
+      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+      _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no
+      ;;
+
+    uts4*)
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      ;;
+
+    *)
+      _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no
+      ;;
+    esac
+  fi
+])
+case $host_os in
+  # For platforms which do not support PIC, -DPIC is meaningless:
+  *djgpp*)
+    _LT_TAGVAR(lt_prog_compiler_pic, $1)=
+    ;;
+  *)
+    _LT_TAGVAR(lt_prog_compiler_pic, $1)="$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t at m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])"
+    ;;
+esac
+
+AC_CACHE_CHECK([for $compiler option to produce PIC],
+  [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)],
+  [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_prog_compiler_pic, $1)])
+_LT_TAGVAR(lt_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)
+
+#
+# Check to make sure the PIC flag actually works.
+#
+if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then
+  _LT_COMPILER_OPTION([if $compiler PIC flag $_LT_TAGVAR(lt_prog_compiler_pic, $1) works],
+    [_LT_TAGVAR(lt_cv_prog_compiler_pic_works, $1)],
+    [$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t at m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])], [],
+    [case $_LT_TAGVAR(lt_prog_compiler_pic, $1) in
+     "" | " "*) ;;
+     *) _LT_TAGVAR(lt_prog_compiler_pic, $1)=" $_LT_TAGVAR(lt_prog_compiler_pic, $1)" ;;
+     esac],
+    [_LT_TAGVAR(lt_prog_compiler_pic, $1)=
+     _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no])
+fi
+_LT_TAGDECL([pic_flag], [lt_prog_compiler_pic], [1],
+	[Additional compiler flags for building library objects])
+
+_LT_TAGDECL([wl], [lt_prog_compiler_wl], [1],
+	[How to pass a linker flag through the compiler])
+#
+# Check to make sure the static flag actually works.
+#
+wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) eval lt_tmp_static_flag=\"$_LT_TAGVAR(lt_prog_compiler_static, $1)\"
+_LT_LINKER_OPTION([if $compiler static flag $lt_tmp_static_flag works],
+  _LT_TAGVAR(lt_cv_prog_compiler_static_works, $1),
+  $lt_tmp_static_flag,
+  [],
+  [_LT_TAGVAR(lt_prog_compiler_static, $1)=])
+_LT_TAGDECL([link_static_flag], [lt_prog_compiler_static], [1],
+	[Compiler flag to prevent dynamic linking])
+])# _LT_COMPILER_PIC
+
+
+# _LT_LINKER_SHLIBS([TAGNAME])
+# ----------------------------
+# See if the linker supports building shared libraries.
+m4_defun([_LT_LINKER_SHLIBS],
+[AC_REQUIRE([LT_PATH_LD])dnl
+AC_REQUIRE([LT_PATH_NM])dnl
+m4_require([_LT_PATH_MANIFEST_TOOL])dnl
+m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+m4_require([_LT_DECL_EGREP])dnl
+m4_require([_LT_DECL_SED])dnl
+m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl
+m4_require([_LT_TAG_COMPILER])dnl
+AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries])
+m4_if([$1], [CXX], [
+  _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+  _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*']
+  case $host_os in
+  aix[[4-9]]*)
+    # If we're using GNU nm, then we don't want the "-C" option.
+    # -C means demangle to AIX nm, but means don't demangle with GNU nm
+    # Also, AIX nm treats weak defined symbols like other global defined
+    # symbols, whereas GNU nm marks them as "W".
+    if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then
+      _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
+    else
+      _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
+    fi
+    ;;
+  pw32*)
+    _LT_TAGVAR(export_symbols_cmds, $1)="$ltdll_cmds"
+    ;;
+  cygwin* | mingw* | cegcc*)
+    case $cc_basename in
+    cl*)
+      _LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*'
+      ;;
+    *)
+      _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols'
+      _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname']
+      ;;
+    esac
+    ;;
+  *)
+    _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+    ;;
+  esac
+], [
+  runpath_var=
+  _LT_TAGVAR(allow_undefined_flag, $1)=
+  _LT_TAGVAR(always_export_symbols, $1)=no
+  _LT_TAGVAR(archive_cmds, $1)=
+  _LT_TAGVAR(archive_expsym_cmds, $1)=
+  _LT_TAGVAR(compiler_needs_object, $1)=no
+  _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no
+  _LT_TAGVAR(export_dynamic_flag_spec, $1)=
+  _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+  _LT_TAGVAR(hardcode_automatic, $1)=no
+  _LT_TAGVAR(hardcode_direct, $1)=no
+  _LT_TAGVAR(hardcode_direct_absolute, $1)=no
+  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
+  _LT_TAGVAR(hardcode_libdir_separator, $1)=
+  _LT_TAGVAR(hardcode_minus_L, $1)=no
+  _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported
+  _LT_TAGVAR(inherit_rpath, $1)=no
+  _LT_TAGVAR(link_all_deplibs, $1)=unknown
+  _LT_TAGVAR(module_cmds, $1)=
+  _LT_TAGVAR(module_expsym_cmds, $1)=
+  _LT_TAGVAR(old_archive_from_new_cmds, $1)=
+  _LT_TAGVAR(old_archive_from_expsyms_cmds, $1)=
+  _LT_TAGVAR(thread_safe_flag_spec, $1)=
+  _LT_TAGVAR(whole_archive_flag_spec, $1)=
+  # include_expsyms should be a list of space-separated symbols to be *always*
+  # included in the symbol list
+  _LT_TAGVAR(include_expsyms, $1)=
+  # exclude_expsyms can be an extended regexp of symbols to exclude
+  # it will be wrapped by ` (' and `)$', so one must not match beginning or
+  # end of line.  Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc',
+  # as well as any symbol that contains `d'.
+  _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*']
+  # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out
+  # platforms (ab)use it in PIC code, but their linkers get confused if
+  # the symbol is explicitly referenced.  Since portable code cannot
+  # rely on this symbol name, it's probably fine to never include it in
+  # preloaded symbol tables.
+  # Exclude shared library initialization/finalization symbols.
+dnl Note also adjust exclude_expsyms for C++ above.
+  extract_expsyms_cmds=
+
+  case $host_os in
+  cygwin* | mingw* | pw32* | cegcc*)
+    # FIXME: the MSVC++ port hasn't been tested in a loooong time
+    # When not using gcc, we currently assume that we are using
+    # Microsoft Visual C++.
+    if test "$GCC" != yes; then
+      with_gnu_ld=no
+    fi
+    ;;
+  interix*)
+    # we just hope/assume this is gcc and not c89 (= MSVC++)
+    with_gnu_ld=yes
+    ;;
+  openbsd*)
+    with_gnu_ld=no
+    ;;
+  esac
+
+  _LT_TAGVAR(ld_shlibs, $1)=yes
+
+  # On some targets, GNU ld is compatible enough with the native linker
+  # that we're better off using the native interface for both.
+  lt_use_gnu_ld_interface=no
+  if test "$with_gnu_ld" = yes; then
+    case $host_os in
+      aix*)
+	# The AIX port of GNU ld has always aspired to compatibility
+	# with the native linker.  However, as the warning in the GNU ld
+	# block says, versions before 2.19.5* couldn't really create working
+	# shared libraries, regardless of the interface used.
+	case `$LD -v 2>&1` in
+	  *\ \(GNU\ Binutils\)\ 2.19.5*) ;;
+	  *\ \(GNU\ Binutils\)\ 2.[[2-9]]*) ;;
+	  *\ \(GNU\ Binutils\)\ [[3-9]]*) ;;
+	  *)
+	    lt_use_gnu_ld_interface=yes
+	    ;;
+	esac
+	;;
+      *)
+	lt_use_gnu_ld_interface=yes
+	;;
+    esac
+  fi
+
+  if test "$lt_use_gnu_ld_interface" = yes; then
+    # If archive_cmds runs LD, not CC, wlarc should be empty
+    wlarc='${wl}'
+
+    # Set some defaults for GNU ld with shared library support. These
+    # are reset later if shared libraries are not supported. Putting them
+    # here allows them to be overridden if necessary.
+    runpath_var=LD_RUN_PATH
+    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+    _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
+    # ancient GNU ld didn't support --whole-archive et. al.
+    if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then
+      _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
+    else
+      _LT_TAGVAR(whole_archive_flag_spec, $1)=
+    fi
+    supports_anon_versioning=no
+    case `$LD -v 2>&1` in
+      *GNU\ gold*) supports_anon_versioning=yes ;;
+      *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.10.*) ;; # catch versions < 2.11
+      *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ...
+      *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ...
+      *\ 2.11.*) ;; # other 2.11 versions
+      *) supports_anon_versioning=yes ;;
+    esac
+
+    # See if GNU ld supports shared libraries.
+    case $host_os in
+    aix[[3-9]]*)
+      # On AIX/PPC, the GNU linker is very broken
+      if test "$host_cpu" != ia64; then
+	_LT_TAGVAR(ld_shlibs, $1)=no
+	cat <<_LT_EOF 1>&2
+
+*** Warning: the GNU linker, at least up to release 2.19, is reported
+*** to be unable to reliably create shared libraries on AIX.
+*** Therefore, libtool is disabling shared libraries support.  If you
+*** really care for shared libraries, you may want to install binutils
+*** 2.20 or above, or modify your PATH so that a non-GNU linker is found.
+*** You will then need to restart the configuration process.
+
+_LT_EOF
+      fi
+      ;;
+
+    amigaos*)
+      case $host_cpu in
+      powerpc)
+            # see comment about AmigaOS4 .so support
+            _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+            _LT_TAGVAR(archive_expsym_cmds, $1)=''
+        ;;
+      m68k)
+            _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
+            _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+            _LT_TAGVAR(hardcode_minus_L, $1)=yes
+        ;;
+      esac
+      ;;
+
+    beos*)
+      if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+	_LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+	# Joseph Beckenbach <jrb3 at best.com> says some releases of gcc
+	# support --undefined.  This deserves some investigation.  FIXME
+	_LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+      else
+	_LT_TAGVAR(ld_shlibs, $1)=no
+      fi
+      ;;
+
+    cygwin* | mingw* | pw32* | cegcc*)
+      # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless,
+      # as there is no search path for DLLs.
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-all-symbols'
+      _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+      _LT_TAGVAR(always_export_symbols, $1)=no
+      _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
+      _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols'
+      _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname']
+
+      if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then
+        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+	# If the export-symbols file already is a .def file (1st line
+	# is EXPORTS), use it as is; otherwise, prepend...
+	_LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
+	  cp $export_symbols $output_objdir/$soname.def;
+	else
+	  echo EXPORTS > $output_objdir/$soname.def;
+	  cat $export_symbols >> $output_objdir/$soname.def;
+	fi~
+	$CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+      else
+	_LT_TAGVAR(ld_shlibs, $1)=no
+      fi
+      ;;
+
+    haiku*)
+      _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+      _LT_TAGVAR(link_all_deplibs, $1)=yes
+      ;;
+
+    interix[[3-9]]*)
+      _LT_TAGVAR(hardcode_direct, $1)=no
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+      # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
+      # Instead, shared libraries are loaded at an image base (0x10000000 by
+      # default) and relocated if they conflict, which is a slow very memory
+      # consuming and fragmenting process.  To avoid this, we pick a random,
+      # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
+      # time.  Moving up from 0x10000000 also allows more sbrk(2) space.
+      _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+      _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+      ;;
+
+    gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu)
+      tmp_diet=no
+      if test "$host_os" = linux-dietlibc; then
+	case $cc_basename in
+	  diet\ *) tmp_diet=yes;;	# linux-dietlibc with static linking (!diet-dyn)
+	esac
+      fi
+      if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \
+	 && test "$tmp_diet" = no
+      then
+	tmp_addflag=' $pic_flag'
+	tmp_sharedflag='-shared'
+	case $cc_basename,$host_cpu in
+        pgcc*)				# Portland Group C compiler
+	  _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+	  tmp_addflag=' $pic_flag'
+	  ;;
+	pgf77* | pgf90* | pgf95* | pgfortran*)
+					# Portland Group f77 and f90 compilers
+	  _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+	  tmp_addflag=' $pic_flag -Mnomain' ;;
+	ecc*,ia64* | icc*,ia64*)	# Intel C compiler on ia64
+	  tmp_addflag=' -i_dynamic' ;;
+	efc*,ia64* | ifort*,ia64*)	# Intel Fortran compiler on ia64
+	  tmp_addflag=' -i_dynamic -nofor_main' ;;
+	ifc* | ifort*)			# Intel Fortran compiler
+	  tmp_addflag=' -nofor_main' ;;
+	lf95*)				# Lahey Fortran 8.1
+	  _LT_TAGVAR(whole_archive_flag_spec, $1)=
+	  tmp_sharedflag='--shared' ;;
+	xl[[cC]]* | bgxl[[cC]]* | mpixl[[cC]]*) # IBM XL C 8.0 on PPC (deal with xlf below)
+	  tmp_sharedflag='-qmkshrobj'
+	  tmp_addflag= ;;
+	nvcc*)	# Cuda Compiler Driver 2.2
+	  _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+	  _LT_TAGVAR(compiler_needs_object, $1)=yes
+	  ;;
+	esac
+	case `$CC -V 2>&1 | sed 5q` in
+	*Sun\ C*)			# Sun C 5.9
+	  _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+	  _LT_TAGVAR(compiler_needs_object, $1)=yes
+	  tmp_sharedflag='-G' ;;
+	*Sun\ F*)			# Sun Fortran 8.3
+	  tmp_sharedflag='-G' ;;
+	esac
+	_LT_TAGVAR(archive_cmds, $1)='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+
+        if test "x$supports_anon_versioning" = xyes; then
+          _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~
+	    cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+	    echo "local: *; };" >> $output_objdir/$libname.ver~
+	    $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'
+        fi
+
+	case $cc_basename in
+	xlf* | bgf* | bgxlf* | mpixlf*)
+	  # IBM XL Fortran 10.1 on PPC cannot create shared libs itself
+	  _LT_TAGVAR(whole_archive_flag_spec, $1)='--whole-archive$convenience --no-whole-archive'
+	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+	  _LT_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib'
+	  if test "x$supports_anon_versioning" = xyes; then
+	    _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~
+	      cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+	      echo "local: *; };" >> $output_objdir/$libname.ver~
+	      $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib'
+	  fi
+	  ;;
+	esac
+      else
+        _LT_TAGVAR(ld_shlibs, $1)=no
+      fi
+      ;;
+
+    netbsd*)
+      if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+	_LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib'
+	wlarc=
+      else
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+      fi
+      ;;
+
+    solaris*)
+      if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then
+	_LT_TAGVAR(ld_shlibs, $1)=no
+	cat <<_LT_EOF 1>&2
+
+*** Warning: The releases 2.8.* of the GNU linker cannot reliably
+*** create shared libraries on Solaris systems.  Therefore, libtool
+*** is disabling shared libraries support.  We urge you to upgrade GNU
+*** binutils to release 2.9.1 or newer.  Another option is to modify
+*** your PATH or compiler configuration so that the native linker is
+*** used, and then restart.
+
+_LT_EOF
+      elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+      else
+	_LT_TAGVAR(ld_shlibs, $1)=no
+      fi
+      ;;
+
+    sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*)
+      case `$LD -v 2>&1` in
+        *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.1[[0-5]].*)
+	_LT_TAGVAR(ld_shlibs, $1)=no
+	cat <<_LT_EOF 1>&2
+
+*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not
+*** reliably create shared libraries on SCO systems.  Therefore, libtool
+*** is disabling shared libraries support.  We urge you to upgrade GNU
+*** binutils to release 2.16.91.0.3 or newer.  Another option is to modify
+*** your PATH or compiler configuration so that the native linker is
+*** used, and then restart.
+
+_LT_EOF
+	;;
+	*)
+	  # For security reasons, it is highly recommended that you always
+	  # use absolute paths for naming shared libraries, and exclude the
+	  # DT_RUNPATH tag from executables and libraries.  But doing so
+	  # requires that you compile everything twice, which is a pain.
+	  if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+	  else
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	  fi
+	;;
+      esac
+      ;;
+
+    sunos4*)
+      _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+      wlarc=
+      _LT_TAGVAR(hardcode_direct, $1)=yes
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    *)
+      if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+      else
+	_LT_TAGVAR(ld_shlibs, $1)=no
+      fi
+      ;;
+    esac
+
+    if test "$_LT_TAGVAR(ld_shlibs, $1)" = no; then
+      runpath_var=
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
+      _LT_TAGVAR(export_dynamic_flag_spec, $1)=
+      _LT_TAGVAR(whole_archive_flag_spec, $1)=
+    fi
+  else
+    # PORTME fill in a description of your system's linker (not GNU ld)
+    case $host_os in
+    aix3*)
+      _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+      _LT_TAGVAR(always_export_symbols, $1)=yes
+      _LT_TAGVAR(archive_expsym_cmds, $1)='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname'
+      # Note: this linker hardcodes the directories in LIBPATH if there
+      # are no directories specified by -L.
+      _LT_TAGVAR(hardcode_minus_L, $1)=yes
+      if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then
+	# Neither direct hardcoding nor static linking is supported with a
+	# broken collect2.
+	_LT_TAGVAR(hardcode_direct, $1)=unsupported
+      fi
+      ;;
+
+    aix[[4-9]]*)
+      if test "$host_cpu" = ia64; then
+	# On IA64, the linker does run time linking by default, so we don't
+	# have to do anything special.
+	aix_use_runtimelinking=no
+	exp_sym_flag='-Bexport'
+	no_entry_flag=""
+      else
+	# If we're using GNU nm, then we don't want the "-C" option.
+	# -C means demangle to AIX nm, but means don't demangle with GNU nm
+	# Also, AIX nm treats weak defined symbols like other global
+	# defined symbols, whereas GNU nm marks them as "W".
+	if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then
+	  _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
+	else
+	  _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
+	fi
+	aix_use_runtimelinking=no
+
+	# Test if we are trying to use run time linking or normal
+	# AIX style linking. If -brtl is somewhere in LDFLAGS, we
+	# need to do runtime linking.
+	case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*)
+	  for ld_flag in $LDFLAGS; do
+	  if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then
+	    aix_use_runtimelinking=yes
+	    break
+	  fi
+	  done
+	  ;;
+	esac
+
+	exp_sym_flag='-bexport'
+	no_entry_flag='-bnoentry'
+      fi
+
+      # When large executables or shared objects are built, AIX ld can
+      # have problems creating the table of contents.  If linking a library
+      # or program results in "error TOC overflow" add -mminimal-toc to
+      # CXXFLAGS/CFLAGS for g++/gcc.  In the cases where that is not
+      # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
+
+      _LT_TAGVAR(archive_cmds, $1)=''
+      _LT_TAGVAR(hardcode_direct, $1)=yes
+      _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
+      _LT_TAGVAR(hardcode_libdir_separator, $1)=':'
+      _LT_TAGVAR(link_all_deplibs, $1)=yes
+      _LT_TAGVAR(file_list_spec, $1)='${wl}-f,'
+
+      if test "$GCC" = yes; then
+	case $host_os in aix4.[[012]]|aix4.[[012]].*)
+	# We only want to do this on AIX 4.2 and lower, the check
+	# below for broken collect2 doesn't work under 4.3+
+	  collect2name=`${CC} -print-prog-name=collect2`
+	  if test -f "$collect2name" &&
+	   strings "$collect2name" | $GREP resolve_lib_name >/dev/null
+	  then
+	  # We have reworked collect2
+	  :
+	  else
+	  # We have old collect2
+	  _LT_TAGVAR(hardcode_direct, $1)=unsupported
+	  # It fails to find uninstalled libraries when the uninstalled
+	  # path is not listed in the libpath.  Setting hardcode_minus_L
+	  # to unsupported forces relinking
+	  _LT_TAGVAR(hardcode_minus_L, $1)=yes
+	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+	  _LT_TAGVAR(hardcode_libdir_separator, $1)=
+	  fi
+	  ;;
+	esac
+	shared_flag='-shared'
+	if test "$aix_use_runtimelinking" = yes; then
+	  shared_flag="$shared_flag "'${wl}-G'
+	fi
+      else
+	# not using gcc
+	if test "$host_cpu" = ia64; then
+	# VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
+	# chokes on -Wl,-G. The following line is correct:
+	  shared_flag='-G'
+	else
+	  if test "$aix_use_runtimelinking" = yes; then
+	    shared_flag='${wl}-G'
+	  else
+	    shared_flag='${wl}-bM:SRE'
+	  fi
+	fi
+      fi
+
+      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall'
+      # It seems that -bexpall does not export symbols beginning with
+      # underscore (_), so it is better to generate a list of symbols to export.
+      _LT_TAGVAR(always_export_symbols, $1)=yes
+      if test "$aix_use_runtimelinking" = yes; then
+	# Warning - without using the other runtime loading flags (-brtl),
+	# -berok will link without error, but may produce a broken library.
+	_LT_TAGVAR(allow_undefined_flag, $1)='-berok'
+        # Determine the default libpath from the value encoded in an
+        # empty executable.
+        _LT_SYS_MODULE_PATH_AIX([$1])
+        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath"
+        _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
+      else
+	if test "$host_cpu" = ia64; then
+	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib'
+	  _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs"
+	  _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols"
+	else
+	 # Determine the default libpath from the value encoded in an
+	 # empty executable.
+	 _LT_SYS_MODULE_PATH_AIX([$1])
+	 _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath"
+	  # Warning - without using the other run time loading flags,
+	  # -berok will link without error, but may produce a broken library.
+	  _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok'
+	  _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok'
+	  if test "$with_gnu_ld" = yes; then
+	    # We only use this code for GNU lds that support --whole-archive.
+	    _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive'
+	  else
+	    # Exported symbols can be pulled into shared objects from archives
+	    _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience'
+	  fi
+	  _LT_TAGVAR(archive_cmds_need_lc, $1)=yes
+	  # This is similar to how AIX traditionally builds its shared libraries.
+	  _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'
+	fi
+      fi
+      ;;
+
+    amigaos*)
+      case $host_cpu in
+      powerpc)
+            # see comment about AmigaOS4 .so support
+            _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+            _LT_TAGVAR(archive_expsym_cmds, $1)=''
+        ;;
+      m68k)
+            _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
+            _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+            _LT_TAGVAR(hardcode_minus_L, $1)=yes
+        ;;
+      esac
+      ;;
+
+    bsdi[[45]]*)
+      _LT_TAGVAR(export_dynamic_flag_spec, $1)=-rdynamic
+      ;;
+
+    cygwin* | mingw* | pw32* | cegcc*)
+      # When not using gcc, we currently assume that we are using
+      # Microsoft Visual C++.
+      # hardcode_libdir_flag_spec is actually meaningless, as there is
+      # no search path for DLLs.
+      case $cc_basename in
+      cl*)
+	# Native MSVC
+	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' '
+	_LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+	_LT_TAGVAR(always_export_symbols, $1)=yes
+	_LT_TAGVAR(file_list_spec, $1)='@'
+	# Tell ltmain to make .lib files, not .a files.
+	libext=lib
+	# Tell ltmain to make .dll files, not .so files.
+	shrext_cmds=".dll"
+	# FIXME: Setting linknames here is a bad hack.
+	_LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames='
+	_LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
+	    sed -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp;
+	  else
+	    sed -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp;
+	  fi~
+	  $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~
+	  linknames='
+	# The linker will not automatically build a static lib if we build a DLL.
+	# _LT_TAGVAR(old_archive_from_new_cmds, $1)='true'
+	_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
+	_LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*'
+	_LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1,DATA/'\'' | $SED -e '\''/^[[AITW]][[ ]]/s/.*[[ ]]//'\'' | sort | uniq > $export_symbols'
+	# Don't use ranlib
+	_LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib'
+	_LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~
+	  lt_tool_outputfile="@TOOL_OUTPUT@"~
+	  case $lt_outputfile in
+	    *.exe|*.EXE) ;;
+	    *)
+	      lt_outputfile="$lt_outputfile.exe"
+	      lt_tool_outputfile="$lt_tool_outputfile.exe"
+	      ;;
+	  esac~
+	  if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then
+	    $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1;
+	    $RM "$lt_outputfile.manifest";
+	  fi'
+	;;
+      *)
+	# Assume MSVC wrapper
+	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' '
+	_LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+	# Tell ltmain to make .lib files, not .a files.
+	libext=lib
+	# Tell ltmain to make .dll files, not .so files.
+	shrext_cmds=".dll"
+	# FIXME: Setting linknames here is a bad hack.
+	_LT_TAGVAR(archive_cmds, $1)='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames='
+	# The linker will automatically build a .lib file if we build a DLL.
+	_LT_TAGVAR(old_archive_from_new_cmds, $1)='true'
+	# FIXME: Should let the user specify the lib program.
+	_LT_TAGVAR(old_archive_cmds, $1)='lib -OUT:$oldlib$oldobjs$old_deplibs'
+	_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
+	;;
+      esac
+      ;;
+
+    darwin* | rhapsody*)
+      _LT_DARWIN_LINKER_FEATURES($1)
+      ;;
+
+    dgux*)
+      _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor
+    # support.  Future versions do this automatically, but an explicit c++rt0.o
+    # does not break anything, and helps significantly (at the cost of a little
+    # extra space).
+    freebsd2.2*)
+      _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o'
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+      _LT_TAGVAR(hardcode_direct, $1)=yes
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    # Unfortunately, older versions of FreeBSD 2 do not have this feature.
+    freebsd2.*)
+      _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+      _LT_TAGVAR(hardcode_direct, $1)=yes
+      _LT_TAGVAR(hardcode_minus_L, $1)=yes
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    # FreeBSD 3 and greater uses gcc -shared to do shared libraries.
+    freebsd* | dragonfly*)
+      _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+      _LT_TAGVAR(hardcode_direct, $1)=yes
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    hpux9*)
+      if test "$GCC" = yes; then
+	_LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+      else
+	_LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+      fi
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
+      _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+      _LT_TAGVAR(hardcode_direct, $1)=yes
+
+      # hardcode_minus_L: Not really in the search PATH,
+      # but as the default location of the library.
+      _LT_TAGVAR(hardcode_minus_L, $1)=yes
+      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+      ;;
+
+    hpux10*)
+      if test "$GCC" = yes && test "$with_gnu_ld" = no; then
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	_LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'
+      fi
+      if test "$with_gnu_ld" = no; then
+	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
+	_LT_TAGVAR(hardcode_libdir_separator, $1)=:
+	_LT_TAGVAR(hardcode_direct, $1)=yes
+	_LT_TAGVAR(hardcode_direct_absolute, $1)=yes
+	_LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+	# hardcode_minus_L: Not really in the search PATH,
+	# but as the default location of the library.
+	_LT_TAGVAR(hardcode_minus_L, $1)=yes
+      fi
+      ;;
+
+    hpux11*)
+      if test "$GCC" = yes && test "$with_gnu_ld" = no; then
+	case $host_cpu in
+	hppa*64*)
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	ia64*)
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	*)
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	esac
+      else
+	case $host_cpu in
+	hppa*64*)
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	ia64*)
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	*)
+	m4_if($1, [], [
+	  # Older versions of the 11.00 compiler do not understand -b yet
+	  # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does)
+	  _LT_LINKER_OPTION([if $CC understands -b],
+	    _LT_TAGVAR(lt_cv_prog_compiler__b, $1), [-b],
+	    [_LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'],
+	    [_LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'])],
+	  [_LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'])
+	  ;;
+	esac
+      fi
+      if test "$with_gnu_ld" = no; then
+	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
+	_LT_TAGVAR(hardcode_libdir_separator, $1)=:
+
+	case $host_cpu in
+	hppa*64*|ia64*)
+	  _LT_TAGVAR(hardcode_direct, $1)=no
+	  _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+	  ;;
+	*)
+	  _LT_TAGVAR(hardcode_direct, $1)=yes
+	  _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
+	  _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+
+	  # hardcode_minus_L: Not really in the search PATH,
+	  # but as the default location of the library.
+	  _LT_TAGVAR(hardcode_minus_L, $1)=yes
+	  ;;
+	esac
+      fi
+      ;;
+
+    irix5* | irix6* | nonstopux*)
+      if test "$GCC" = yes; then
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+	# Try to use the -exported_symbol ld option, if it does not
+	# work, assume that -exports_file does not work either and
+	# implicitly export all symbols.
+	# This should be the same for all languages, so no per-tag cache variable.
+	AC_CACHE_CHECK([whether the $host_os linker accepts -exported_symbol],
+	  [lt_cv_irix_exported_symbol],
+	  [save_LDFLAGS="$LDFLAGS"
+	   LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null"
+	   AC_LINK_IFELSE(
+	     [AC_LANG_SOURCE(
+	        [AC_LANG_CASE([C], [[int foo (void) { return 0; }]],
+			      [C++], [[int foo (void) { return 0; }]],
+			      [Fortran 77], [[
+      subroutine foo
+      end]],
+			      [Fortran], [[
+      subroutine foo
+      end]])])],
+	      [lt_cv_irix_exported_symbol=yes],
+	      [lt_cv_irix_exported_symbol=no])
+           LDFLAGS="$save_LDFLAGS"])
+	if test "$lt_cv_irix_exported_symbol" = yes; then
+          _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib'
+	fi
+      else
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib'
+      fi
+      _LT_TAGVAR(archive_cmds_need_lc, $1)='no'
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+      _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+      _LT_TAGVAR(inherit_rpath, $1)=yes
+      _LT_TAGVAR(link_all_deplibs, $1)=yes
+      ;;
+
+    netbsd*)
+      if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+	_LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'  # a.out
+      else
+	_LT_TAGVAR(archive_cmds, $1)='$LD -shared -o $lib $libobjs $deplibs $linker_flags'      # ELF
+      fi
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+      _LT_TAGVAR(hardcode_direct, $1)=yes
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    newsos6)
+      _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      _LT_TAGVAR(hardcode_direct, $1)=yes
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+      _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    *nto* | *qnx*)
+      ;;
+
+    openbsd*)
+      if test -f /usr/libexec/ld.so; then
+	_LT_TAGVAR(hardcode_direct, $1)=yes
+	_LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+	_LT_TAGVAR(hardcode_direct_absolute, $1)=yes
+	if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+	  _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols'
+	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+	  _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+	else
+	  case $host_os in
+	   openbsd[[01]].* | openbsd2.[[0-7]] | openbsd2.[[0-7]].*)
+	     _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+	     _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+	     ;;
+	   *)
+	     _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+	     _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+	     ;;
+	  esac
+	fi
+      else
+	_LT_TAGVAR(ld_shlibs, $1)=no
+      fi
+      ;;
+
+    os2*)
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+      _LT_TAGVAR(hardcode_minus_L, $1)=yes
+      _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+      _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~echo DATA >> $output_objdir/$libname.def~echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def'
+      _LT_TAGVAR(old_archive_from_new_cmds, $1)='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def'
+      ;;
+
+    osf3*)
+      if test "$GCC" = yes; then
+	_LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+      else
+	_LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*'
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
+      fi
+      _LT_TAGVAR(archive_cmds_need_lc, $1)='no'
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+      _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+      ;;
+
+    osf4* | osf5*)	# as osf3* with the addition of -msym flag
+      if test "$GCC" = yes; then
+	_LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $pic_flag $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+      else
+	_LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*'
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~
+	$CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp'
+
+	# Both c and cxx compiler support -rpath directly
+	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir'
+      fi
+      _LT_TAGVAR(archive_cmds_need_lc, $1)='no'
+      _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+      ;;
+
+    solaris*)
+      _LT_TAGVAR(no_undefined_flag, $1)=' -z defs'
+      if test "$GCC" = yes; then
+	wlarc='${wl}'
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+	  $CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
+      else
+	case `$CC -V 2>&1` in
+	*"Compilers 5.0"*)
+	  wlarc=''
+	  _LT_TAGVAR(archive_cmds, $1)='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	  _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+	  $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp'
+	  ;;
+	*)
+	  wlarc='${wl}'
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags'
+	  _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+	  $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
+	  ;;
+	esac
+      fi
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      case $host_os in
+      solaris2.[[0-5]] | solaris2.[[0-5]].*) ;;
+      *)
+	# The compiler driver will combine and reorder linker options,
+	# but understands `-z linker_flag'.  GCC discards it without `$wl',
+	# but is careful enough not to reorder.
+	# Supported since Solaris 2.6 (maybe 2.5.1?)
+	if test "$GCC" = yes; then
+	  _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract'
+	else
+	  _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract'
+	fi
+	;;
+      esac
+      _LT_TAGVAR(link_all_deplibs, $1)=yes
+      ;;
+
+    sunos4*)
+      if test "x$host_vendor" = xsequent; then
+	# Use $CC to link under sequent, because it throws in some extra .o
+	# files that make .init and .fini sections work.
+	_LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	_LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags'
+      fi
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+      _LT_TAGVAR(hardcode_direct, $1)=yes
+      _LT_TAGVAR(hardcode_minus_L, $1)=yes
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    sysv4)
+      case $host_vendor in
+	sni)
+	  _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	  _LT_TAGVAR(hardcode_direct, $1)=yes # is this really true???
+	;;
+	siemens)
+	  ## LD is ld it makes a PLAMLIB
+	  ## CC just makes a GrossModule.
+	  _LT_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags'
+	  _LT_TAGVAR(reload_cmds, $1)='$CC -r -o $output$reload_objs'
+	  _LT_TAGVAR(hardcode_direct, $1)=no
+        ;;
+	motorola)
+	  _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	  _LT_TAGVAR(hardcode_direct, $1)=no #Motorola manual says yes, but my tests say they lie
+	;;
+      esac
+      runpath_var='LD_RUN_PATH'
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    sysv4.3*)
+      _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      _LT_TAGVAR(export_dynamic_flag_spec, $1)='-Bexport'
+      ;;
+
+    sysv4*MP*)
+      if test -d /usr/nec; then
+	_LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	_LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+	runpath_var=LD_RUN_PATH
+	hardcode_runpath_var=yes
+	_LT_TAGVAR(ld_shlibs, $1)=yes
+      fi
+      ;;
+
+    sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*)
+      _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'
+      _LT_TAGVAR(archive_cmds_need_lc, $1)=no
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      runpath_var='LD_RUN_PATH'
+
+      if test "$GCC" = yes; then
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	_LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      fi
+      ;;
+
+    sysv5* | sco3.2v5* | sco5v6*)
+      # Note: We can NOT use -z defs as we might desire, because we do not
+      # link with -lc, and that would cause any symbols used from libc to
+      # always be unresolved, which means just about no library would
+      # ever link correctly.  If we're not using GNU ld we use -z text
+      # though, which does catch some bad symbols but isn't as heavy-handed
+      # as -z defs.
+      _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'
+      _LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs'
+      _LT_TAGVAR(archive_cmds_need_lc, $1)=no
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir'
+      _LT_TAGVAR(hardcode_libdir_separator, $1)=':'
+      _LT_TAGVAR(link_all_deplibs, $1)=yes
+      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport'
+      runpath_var='LD_RUN_PATH'
+
+      if test "$GCC" = yes; then
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	_LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      fi
+      ;;
+
+    uts4*)
+      _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    *)
+      _LT_TAGVAR(ld_shlibs, $1)=no
+      ;;
+    esac
+
+    if test x$host_vendor = xsni; then
+      case $host in
+      sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)
+	_LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Blargedynsym'
+	;;
+      esac
+    fi
+  fi
+])
+AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)])
+test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no
+
+_LT_TAGVAR(with_gnu_ld, $1)=$with_gnu_ld
+
+_LT_DECL([], [libext], [0], [Old archive suffix (normally "a")])dnl
+_LT_DECL([], [shrext_cmds], [1], [Shared library suffix (normally ".so")])dnl
+_LT_DECL([], [extract_expsyms_cmds], [2],
+    [The commands to extract the exported symbol list from a shared archive])
+
+#
+# Do we need to explicitly link libc?
+#
+case "x$_LT_TAGVAR(archive_cmds_need_lc, $1)" in
+x|xyes)
+  # Assume -lc should be added
+  _LT_TAGVAR(archive_cmds_need_lc, $1)=yes
+
+  if test "$enable_shared" = yes && test "$GCC" = yes; then
+    case $_LT_TAGVAR(archive_cmds, $1) in
+    *'~'*)
+      # FIXME: we may have to deal with multi-command sequences.
+      ;;
+    '$CC '*)
+      # Test whether the compiler implicitly links with -lc since on some
+      # systems, -lgcc has to come before -lc. If gcc already passes -lc
+      # to ld, don't add -lc before -lgcc.
+      AC_CACHE_CHECK([whether -lc should be explicitly linked in],
+	[lt_cv_]_LT_TAGVAR(archive_cmds_need_lc, $1),
+	[$RM conftest*
+	echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+	if AC_TRY_EVAL(ac_compile) 2>conftest.err; then
+	  soname=conftest
+	  lib=conftest
+	  libobjs=conftest.$ac_objext
+	  deplibs=
+	  wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1)
+	  pic_flag=$_LT_TAGVAR(lt_prog_compiler_pic, $1)
+	  compiler_flags=-v
+	  linker_flags=-v
+	  verstring=
+	  output_objdir=.
+	  libname=conftest
+	  lt_save_allow_undefined_flag=$_LT_TAGVAR(allow_undefined_flag, $1)
+	  _LT_TAGVAR(allow_undefined_flag, $1)=
+	  if AC_TRY_EVAL(_LT_TAGVAR(archive_cmds, $1) 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1)
+	  then
+	    lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=no
+	  else
+	    lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=yes
+	  fi
+	  _LT_TAGVAR(allow_undefined_flag, $1)=$lt_save_allow_undefined_flag
+	else
+	  cat conftest.err 1>&5
+	fi
+	$RM conftest*
+	])
+      _LT_TAGVAR(archive_cmds_need_lc, $1)=$lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)
+      ;;
+    esac
+  fi
+  ;;
+esac
+
+_LT_TAGDECL([build_libtool_need_lc], [archive_cmds_need_lc], [0],
+    [Whether or not to add -lc for building shared libraries])
+_LT_TAGDECL([allow_libtool_libs_with_static_runtimes],
+    [enable_shared_with_static_runtimes], [0],
+    [Whether or not to disallow shared libs when runtime libs are static])
+_LT_TAGDECL([], [export_dynamic_flag_spec], [1],
+    [Compiler flag to allow reflexive dlopens])
+_LT_TAGDECL([], [whole_archive_flag_spec], [1],
+    [Compiler flag to generate shared objects directly from archives])
+_LT_TAGDECL([], [compiler_needs_object], [1],
+    [Whether the compiler copes with passing no objects directly])
+_LT_TAGDECL([], [old_archive_from_new_cmds], [2],
+    [Create an old-style archive from a shared archive])
+_LT_TAGDECL([], [old_archive_from_expsyms_cmds], [2],
+    [Create a temporary old-style archive to link instead of a shared archive])
+_LT_TAGDECL([], [archive_cmds], [2], [Commands used to build a shared archive])
+_LT_TAGDECL([], [archive_expsym_cmds], [2])
+_LT_TAGDECL([], [module_cmds], [2],
+    [Commands used to build a loadable module if different from building
+    a shared archive.])
+_LT_TAGDECL([], [module_expsym_cmds], [2])
+_LT_TAGDECL([], [with_gnu_ld], [1],
+    [Whether we are building with GNU ld or not])
+_LT_TAGDECL([], [allow_undefined_flag], [1],
+    [Flag that allows shared libraries with undefined symbols to be built])
+_LT_TAGDECL([], [no_undefined_flag], [1],
+    [Flag that enforces no undefined symbols])
+_LT_TAGDECL([], [hardcode_libdir_flag_spec], [1],
+    [Flag to hardcode $libdir into a binary during linking.
+    This must work even if $libdir does not exist])
+_LT_TAGDECL([], [hardcode_libdir_separator], [1],
+    [Whether we need a single "-rpath" flag with a separated argument])
+_LT_TAGDECL([], [hardcode_direct], [0],
+    [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes
+    DIR into the resulting binary])
+_LT_TAGDECL([], [hardcode_direct_absolute], [0],
+    [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes
+    DIR into the resulting binary and the resulting library dependency is
+    "absolute", i.e impossible to change by setting ${shlibpath_var} if the
+    library is relocated])
+_LT_TAGDECL([], [hardcode_minus_L], [0],
+    [Set to "yes" if using the -LDIR flag during linking hardcodes DIR
+    into the resulting binary])
+_LT_TAGDECL([], [hardcode_shlibpath_var], [0],
+    [Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR
+    into the resulting binary])
+_LT_TAGDECL([], [hardcode_automatic], [0],
+    [Set to "yes" if building a shared library automatically hardcodes DIR
+    into the library and all subsequent libraries and executables linked
+    against it])
+_LT_TAGDECL([], [inherit_rpath], [0],
+    [Set to yes if linker adds runtime paths of dependent libraries
+    to runtime path list])
+_LT_TAGDECL([], [link_all_deplibs], [0],
+    [Whether libtool must link a program against all its dependency libraries])
+_LT_TAGDECL([], [always_export_symbols], [0],
+    [Set to "yes" if exported symbols are required])
+_LT_TAGDECL([], [export_symbols_cmds], [2],
+    [The commands to list exported symbols])
+_LT_TAGDECL([], [exclude_expsyms], [1],
+    [Symbols that should not be listed in the preloaded symbols])
+_LT_TAGDECL([], [include_expsyms], [1],
+    [Symbols that must always be exported])
+_LT_TAGDECL([], [prelink_cmds], [2],
+    [Commands necessary for linking programs (against libraries) with templates])
+_LT_TAGDECL([], [postlink_cmds], [2],
+    [Commands necessary for finishing linking programs])
+_LT_TAGDECL([], [file_list_spec], [1],
+    [Specify filename containing input files])
+dnl FIXME: Not yet implemented
+dnl _LT_TAGDECL([], [thread_safe_flag_spec], [1],
+dnl    [Compiler flag to generate thread safe objects])
+])# _LT_LINKER_SHLIBS
+
+
+# _LT_LANG_C_CONFIG([TAG])
+# ------------------------
+# Ensure that the configuration variables for a C compiler are suitably
+# defined.  These variables are subsequently used by _LT_CONFIG to write
+# the compiler configuration to `libtool'.
+m4_defun([_LT_LANG_C_CONFIG],
+[m4_require([_LT_DECL_EGREP])dnl
+lt_save_CC="$CC"
+AC_LANG_PUSH(C)
+
+# Source file extension for C test sources.
+ac_ext=c
+
+# Object file extension for compiled C test sources.
+objext=o
+_LT_TAGVAR(objext, $1)=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code="int some_variable = 0;"
+
+# Code to be used in simple link tests
+lt_simple_link_test_code='int main(){return(0);}'
+
+_LT_TAG_COMPILER
+# Save the default compiler, since it gets overwritten when the other
+# tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP.
+compiler_DEFAULT=$CC
+
+# save warnings/boilerplate of simple test code
+_LT_COMPILER_BOILERPLATE
+_LT_LINKER_BOILERPLATE
+
+## CAVEAT EMPTOR:
+## There is no encapsulation within the following macros, do not change
+## the running order or otherwise move them around unless you know exactly
+## what you are doing...
+if test -n "$compiler"; then
+  _LT_COMPILER_NO_RTTI($1)
+  _LT_COMPILER_PIC($1)
+  _LT_COMPILER_C_O($1)
+  _LT_COMPILER_FILE_LOCKS($1)
+  _LT_LINKER_SHLIBS($1)
+  _LT_SYS_DYNAMIC_LINKER($1)
+  _LT_LINKER_HARDCODE_LIBPATH($1)
+  LT_SYS_DLOPEN_SELF
+  _LT_CMD_STRIPLIB
+
+  # Report which library types will actually be built
+  AC_MSG_CHECKING([if libtool supports shared libraries])
+  AC_MSG_RESULT([$can_build_shared])
+
+  AC_MSG_CHECKING([whether to build shared libraries])
+  test "$can_build_shared" = "no" && enable_shared=no
+
+  # On AIX, shared libraries and static libraries use the same namespace, and
+  # are all built from PIC.
+  case $host_os in
+  aix3*)
+    test "$enable_shared" = yes && enable_static=no
+    if test -n "$RANLIB"; then
+      archive_cmds="$archive_cmds~\$RANLIB \$lib"
+      postinstall_cmds='$RANLIB $lib'
+    fi
+    ;;
+
+  aix[[4-9]]*)
+    if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then
+      test "$enable_shared" = yes && enable_static=no
+    fi
+    ;;
+  esac
+  AC_MSG_RESULT([$enable_shared])
+
+  AC_MSG_CHECKING([whether to build static libraries])
+  # Make sure either enable_shared or enable_static is yes.
+  test "$enable_shared" = yes || enable_static=yes
+  AC_MSG_RESULT([$enable_static])
+
+  _LT_CONFIG($1)
+fi
+AC_LANG_POP
+CC="$lt_save_CC"
+])# _LT_LANG_C_CONFIG
+
+
+# _LT_LANG_CXX_CONFIG([TAG])
+# --------------------------
+# Ensure that the configuration variables for a C++ compiler are suitably
+# defined.  These variables are subsequently used by _LT_CONFIG to write
+# the compiler configuration to `libtool'.
+m4_defun([_LT_LANG_CXX_CONFIG],
+[m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+m4_require([_LT_DECL_EGREP])dnl
+m4_require([_LT_PATH_MANIFEST_TOOL])dnl
+if test -n "$CXX" && ( test "X$CXX" != "Xno" &&
+    ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) ||
+    (test "X$CXX" != "Xg++"))) ; then
+  AC_PROG_CXXCPP
+else
+  _lt_caught_CXX_error=yes
+fi
+
+AC_LANG_PUSH(C++)
+_LT_TAGVAR(archive_cmds_need_lc, $1)=no
+_LT_TAGVAR(allow_undefined_flag, $1)=
+_LT_TAGVAR(always_export_symbols, $1)=no
+_LT_TAGVAR(archive_expsym_cmds, $1)=
+_LT_TAGVAR(compiler_needs_object, $1)=no
+_LT_TAGVAR(export_dynamic_flag_spec, $1)=
+_LT_TAGVAR(hardcode_direct, $1)=no
+_LT_TAGVAR(hardcode_direct_absolute, $1)=no
+_LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
+_LT_TAGVAR(hardcode_libdir_separator, $1)=
+_LT_TAGVAR(hardcode_minus_L, $1)=no
+_LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported
+_LT_TAGVAR(hardcode_automatic, $1)=no
+_LT_TAGVAR(inherit_rpath, $1)=no
+_LT_TAGVAR(module_cmds, $1)=
+_LT_TAGVAR(module_expsym_cmds, $1)=
+_LT_TAGVAR(link_all_deplibs, $1)=unknown
+_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
+_LT_TAGVAR(reload_flag, $1)=$reload_flag
+_LT_TAGVAR(reload_cmds, $1)=$reload_cmds
+_LT_TAGVAR(no_undefined_flag, $1)=
+_LT_TAGVAR(whole_archive_flag_spec, $1)=
+_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no
+
+# Source file extension for C++ test sources.
+ac_ext=cpp
+
+# Object file extension for compiled C++ test sources.
+objext=o
+_LT_TAGVAR(objext, $1)=$objext
+
+# No sense in running all these tests if we already determined that
+# the CXX compiler isn't working.  Some variables (like enable_shared)
+# are currently assumed to apply to all compilers on this platform,
+# and will be corrupted by setting them based on a non-working compiler.
+if test "$_lt_caught_CXX_error" != yes; then
+  # Code to be used in simple compile tests
+  lt_simple_compile_test_code="int some_variable = 0;"
+
+  # Code to be used in simple link tests
+  lt_simple_link_test_code='int main(int, char *[[]]) { return(0); }'
+
+  # ltmain only uses $CC for tagged configurations so make sure $CC is set.
+  _LT_TAG_COMPILER
+
+  # save warnings/boilerplate of simple test code
+  _LT_COMPILER_BOILERPLATE
+  _LT_LINKER_BOILERPLATE
+
+  # Allow CC to be a program name with arguments.
+  lt_save_CC=$CC
+  lt_save_CFLAGS=$CFLAGS
+  lt_save_LD=$LD
+  lt_save_GCC=$GCC
+  GCC=$GXX
+  lt_save_with_gnu_ld=$with_gnu_ld
+  lt_save_path_LD=$lt_cv_path_LD
+  if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then
+    lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx
+  else
+    $as_unset lt_cv_prog_gnu_ld
+  fi
+  if test -n "${lt_cv_path_LDCXX+set}"; then
+    lt_cv_path_LD=$lt_cv_path_LDCXX
+  else
+    $as_unset lt_cv_path_LD
+  fi
+  test -z "${LDCXX+set}" || LD=$LDCXX
+  CC=${CXX-"c++"}
+  CFLAGS=$CXXFLAGS
+  compiler=$CC
+  _LT_TAGVAR(compiler, $1)=$CC
+  _LT_CC_BASENAME([$compiler])
+
+  if test -n "$compiler"; then
+    # We don't want -fno-exception when compiling C++ code, so set the
+    # no_builtin_flag separately
+    if test "$GXX" = yes; then
+      _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin'
+    else
+      _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=
+    fi
+
+    if test "$GXX" = yes; then
+      # Set up default GNU C++ configuration
+
+      LT_PATH_LD
+
+      # Check if GNU C++ uses GNU ld as the underlying linker, since the
+      # archiving commands below assume that GNU ld is being used.
+      if test "$with_gnu_ld" = yes; then
+        _LT_TAGVAR(archive_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
+        _LT_TAGVAR(archive_expsym_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+
+        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+        _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
+
+        # If archive_cmds runs LD, not CC, wlarc should be empty
+        # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to
+        #     investigate it a little bit more. (MM)
+        wlarc='${wl}'
+
+        # ancient GNU ld didn't support --whole-archive et. al.
+        if eval "`$CC -print-prog-name=ld` --help 2>&1" |
+	  $GREP 'no-whole-archive' > /dev/null; then
+          _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
+        else
+          _LT_TAGVAR(whole_archive_flag_spec, $1)=
+        fi
+      else
+        with_gnu_ld=no
+        wlarc=
+
+        # A generic and very simple default shared library creation
+        # command for GNU C++ for the case where it uses the native
+        # linker, instead of GNU ld.  If possible, this setting should
+        # overridden to take advantage of the native linker features on
+        # the platform it is being used on.
+        _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib'
+      fi
+
+      # Commands to make compiler produce verbose output that lists
+      # what "hidden" libraries, object files and flags are used when
+      # linking a shared library.
+      output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
+
+    else
+      GXX=no
+      with_gnu_ld=no
+      wlarc=
+    fi
+
+    # PORTME: fill in a description of your system's C++ link characteristics
+    AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries])
+    _LT_TAGVAR(ld_shlibs, $1)=yes
+    case $host_os in
+      aix3*)
+        # FIXME: insert proper C++ library support
+        _LT_TAGVAR(ld_shlibs, $1)=no
+        ;;
+      aix[[4-9]]*)
+        if test "$host_cpu" = ia64; then
+          # On IA64, the linker does run time linking by default, so we don't
+          # have to do anything special.
+          aix_use_runtimelinking=no
+          exp_sym_flag='-Bexport'
+          no_entry_flag=""
+        else
+          aix_use_runtimelinking=no
+
+          # Test if we are trying to use run time linking or normal
+          # AIX style linking. If -brtl is somewhere in LDFLAGS, we
+          # need to do runtime linking.
+          case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*)
+	    for ld_flag in $LDFLAGS; do
+	      case $ld_flag in
+	      *-brtl*)
+	        aix_use_runtimelinking=yes
+	        break
+	        ;;
+	      esac
+	    done
+	    ;;
+          esac
+
+          exp_sym_flag='-bexport'
+          no_entry_flag='-bnoentry'
+        fi
+
+        # When large executables or shared objects are built, AIX ld can
+        # have problems creating the table of contents.  If linking a library
+        # or program results in "error TOC overflow" add -mminimal-toc to
+        # CXXFLAGS/CFLAGS for g++/gcc.  In the cases where that is not
+        # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
+
+        _LT_TAGVAR(archive_cmds, $1)=''
+        _LT_TAGVAR(hardcode_direct, $1)=yes
+        _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
+        _LT_TAGVAR(hardcode_libdir_separator, $1)=':'
+        _LT_TAGVAR(link_all_deplibs, $1)=yes
+        _LT_TAGVAR(file_list_spec, $1)='${wl}-f,'
+
+        if test "$GXX" = yes; then
+          case $host_os in aix4.[[012]]|aix4.[[012]].*)
+          # We only want to do this on AIX 4.2 and lower, the check
+          # below for broken collect2 doesn't work under 4.3+
+	  collect2name=`${CC} -print-prog-name=collect2`
+	  if test -f "$collect2name" &&
+	     strings "$collect2name" | $GREP resolve_lib_name >/dev/null
+	  then
+	    # We have reworked collect2
+	    :
+	  else
+	    # We have old collect2
+	    _LT_TAGVAR(hardcode_direct, $1)=unsupported
+	    # It fails to find uninstalled libraries when the uninstalled
+	    # path is not listed in the libpath.  Setting hardcode_minus_L
+	    # to unsupported forces relinking
+	    _LT_TAGVAR(hardcode_minus_L, $1)=yes
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+	    _LT_TAGVAR(hardcode_libdir_separator, $1)=
+	  fi
+          esac
+          shared_flag='-shared'
+	  if test "$aix_use_runtimelinking" = yes; then
+	    shared_flag="$shared_flag "'${wl}-G'
+	  fi
+        else
+          # not using gcc
+          if test "$host_cpu" = ia64; then
+	  # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
+	  # chokes on -Wl,-G. The following line is correct:
+	  shared_flag='-G'
+          else
+	    if test "$aix_use_runtimelinking" = yes; then
+	      shared_flag='${wl}-G'
+	    else
+	      shared_flag='${wl}-bM:SRE'
+	    fi
+          fi
+        fi
+
+        _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall'
+        # It seems that -bexpall does not export symbols beginning with
+        # underscore (_), so it is better to generate a list of symbols to
+	# export.
+        _LT_TAGVAR(always_export_symbols, $1)=yes
+        if test "$aix_use_runtimelinking" = yes; then
+          # Warning - without using the other runtime loading flags (-brtl),
+          # -berok will link without error, but may produce a broken library.
+          _LT_TAGVAR(allow_undefined_flag, $1)='-berok'
+          # Determine the default libpath from the value encoded in an empty
+          # executable.
+          _LT_SYS_MODULE_PATH_AIX([$1])
+          _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath"
+
+          _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
+        else
+          if test "$host_cpu" = ia64; then
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib'
+	    _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs"
+	    _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols"
+          else
+	    # Determine the default libpath from the value encoded in an
+	    # empty executable.
+	    _LT_SYS_MODULE_PATH_AIX([$1])
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath"
+	    # Warning - without using the other run time loading flags,
+	    # -berok will link without error, but may produce a broken library.
+	    _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok'
+	    _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok'
+	    if test "$with_gnu_ld" = yes; then
+	      # We only use this code for GNU lds that support --whole-archive.
+	      _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive'
+	    else
+	      # Exported symbols can be pulled into shared objects from archives
+	      _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience'
+	    fi
+	    _LT_TAGVAR(archive_cmds_need_lc, $1)=yes
+	    # This is similar to how AIX traditionally builds its shared
+	    # libraries.
+	    _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'
+          fi
+        fi
+        ;;
+
+      beos*)
+	if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+	  _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+	  # Joseph Beckenbach <jrb3 at best.com> says some releases of gcc
+	  # support --undefined.  This deserves some investigation.  FIXME
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	else
+	  _LT_TAGVAR(ld_shlibs, $1)=no
+	fi
+	;;
+
+      chorus*)
+        case $cc_basename in
+          *)
+	  # FIXME: insert proper C++ library support
+	  _LT_TAGVAR(ld_shlibs, $1)=no
+	  ;;
+        esac
+        ;;
+
+      cygwin* | mingw* | pw32* | cegcc*)
+	case $GXX,$cc_basename in
+	,cl* | no,cl*)
+	  # Native MSVC
+	  # hardcode_libdir_flag_spec is actually meaningless, as there is
+	  # no search path for DLLs.
+	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' '
+	  _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+	  _LT_TAGVAR(always_export_symbols, $1)=yes
+	  _LT_TAGVAR(file_list_spec, $1)='@'
+	  # Tell ltmain to make .lib files, not .a files.
+	  libext=lib
+	  # Tell ltmain to make .dll files, not .so files.
+	  shrext_cmds=".dll"
+	  # FIXME: Setting linknames here is a bad hack.
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames='
+	  _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
+	      $SED -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp;
+	    else
+	      $SED -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp;
+	    fi~
+	    $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~
+	    linknames='
+	  # The linker will not automatically build a static lib if we build a DLL.
+	  # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true'
+	  _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
+	  # Don't use ranlib
+	  _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib'
+	  _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~
+	    lt_tool_outputfile="@TOOL_OUTPUT@"~
+	    case $lt_outputfile in
+	      *.exe|*.EXE) ;;
+	      *)
+		lt_outputfile="$lt_outputfile.exe"
+		lt_tool_outputfile="$lt_tool_outputfile.exe"
+		;;
+	    esac~
+	    func_to_tool_file "$lt_outputfile"~
+	    if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then
+	      $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1;
+	      $RM "$lt_outputfile.manifest";
+	    fi'
+	  ;;
+	*)
+	  # g++
+	  # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless,
+	  # as there is no search path for DLLs.
+	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+	  _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-all-symbols'
+	  _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+	  _LT_TAGVAR(always_export_symbols, $1)=no
+	  _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
+
+	  if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then
+	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+	    # If the export-symbols file already is a .def file (1st line
+	    # is EXPORTS), use it as is; otherwise, prepend...
+	    _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
+	      cp $export_symbols $output_objdir/$soname.def;
+	    else
+	      echo EXPORTS > $output_objdir/$soname.def;
+	      cat $export_symbols >> $output_objdir/$soname.def;
+	    fi~
+	    $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+	  else
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	  fi
+	  ;;
+	esac
+	;;
+      darwin* | rhapsody*)
+        _LT_DARWIN_LINKER_FEATURES($1)
+	;;
+
+      dgux*)
+        case $cc_basename in
+          ec++*)
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+          ghcx*)
+	    # Green Hills C++ Compiler
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+          *)
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+        esac
+        ;;
+
+      freebsd2.*)
+        # C++ shared libraries reported to be fairly broken before
+	# switch to ELF
+        _LT_TAGVAR(ld_shlibs, $1)=no
+        ;;
+
+      freebsd-elf*)
+        _LT_TAGVAR(archive_cmds_need_lc, $1)=no
+        ;;
+
+      freebsd* | dragonfly*)
+        # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF
+        # conventions
+        _LT_TAGVAR(ld_shlibs, $1)=yes
+        ;;
+
+      gnu*)
+        ;;
+
+      haiku*)
+        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+        _LT_TAGVAR(link_all_deplibs, $1)=yes
+        ;;
+
+      hpux9*)
+        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
+        _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+        _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+        _LT_TAGVAR(hardcode_direct, $1)=yes
+        _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH,
+				             # but as the default
+				             # location of the library.
+
+        case $cc_basename in
+          CC*)
+            # FIXME: insert proper C++ library support
+            _LT_TAGVAR(ld_shlibs, $1)=no
+            ;;
+          aCC*)
+            _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+            # Commands to make compiler produce verbose output that lists
+            # what "hidden" libraries, object files and flags are used when
+            # linking a shared library.
+            #
+            # There doesn't appear to be a way to prevent this compiler from
+            # explicitly linking system object files so we need to strip them
+            # from the output so that they don't get included in the library
+            # dependencies.
+            output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
+            ;;
+          *)
+            if test "$GXX" = yes; then
+              _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+            else
+              # FIXME: insert proper C++ library support
+              _LT_TAGVAR(ld_shlibs, $1)=no
+            fi
+            ;;
+        esac
+        ;;
+
+      hpux10*|hpux11*)
+        if test $with_gnu_ld = no; then
+	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
+	  _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+
+          case $host_cpu in
+            hppa*64*|ia64*)
+              ;;
+            *)
+	      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+              ;;
+          esac
+        fi
+        case $host_cpu in
+          hppa*64*|ia64*)
+            _LT_TAGVAR(hardcode_direct, $1)=no
+            _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+            ;;
+          *)
+            _LT_TAGVAR(hardcode_direct, $1)=yes
+            _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
+            _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH,
+					         # but as the default
+					         # location of the library.
+            ;;
+        esac
+
+        case $cc_basename in
+          CC*)
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+          aCC*)
+	    case $host_cpu in
+	      hppa*64*)
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	        ;;
+	      ia64*)
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	        ;;
+	      *)
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	        ;;
+	    esac
+	    # Commands to make compiler produce verbose output that lists
+	    # what "hidden" libraries, object files and flags are used when
+	    # linking a shared library.
+	    #
+	    # There doesn't appear to be a way to prevent this compiler from
+	    # explicitly linking system object files so we need to strip them
+	    # from the output so that they don't get included in the library
+	    # dependencies.
+	    output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
+	    ;;
+          *)
+	    if test "$GXX" = yes; then
+	      if test $with_gnu_ld = no; then
+	        case $host_cpu in
+	          hppa*64*)
+	            _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	            ;;
+	          ia64*)
+	            _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	            ;;
+	          *)
+	            _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	            ;;
+	        esac
+	      fi
+	    else
+	      # FIXME: insert proper C++ library support
+	      _LT_TAGVAR(ld_shlibs, $1)=no
+	    fi
+	    ;;
+        esac
+        ;;
+
+      interix[[3-9]]*)
+	_LT_TAGVAR(hardcode_direct, $1)=no
+	_LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+	_LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+	# Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
+	# Instead, shared libraries are loaded at an image base (0x10000000 by
+	# default) and relocated if they conflict, which is a slow very memory
+	# consuming and fragmenting process.  To avoid this, we pick a random,
+	# 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
+	# time.  Moving up from 0x10000000 also allows more sbrk(2) space.
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+	;;
+      irix5* | irix6*)
+        case $cc_basename in
+          CC*)
+	    # SGI C++
+	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
+
+	    # Archives containing C++ object files must be created using
+	    # "CC -ar", where "CC" is the IRIX C++ compiler.  This is
+	    # necessary to make sure instantiated templates are included
+	    # in the archive.
+	    _LT_TAGVAR(old_archive_cmds, $1)='$CC -ar -WR,-u -o $oldlib $oldobjs'
+	    ;;
+          *)
+	    if test "$GXX" = yes; then
+	      if test "$with_gnu_ld" = no; then
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+	      else
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` -o $lib'
+	      fi
+	    fi
+	    _LT_TAGVAR(link_all_deplibs, $1)=yes
+	    ;;
+        esac
+        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+        _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+        _LT_TAGVAR(inherit_rpath, $1)=yes
+        ;;
+
+      linux* | k*bsd*-gnu | kopensolaris*-gnu)
+        case $cc_basename in
+          KCC*)
+	    # Kuck and Associates, Inc. (KAI) C++ Compiler
+
+	    # KCC will only create a shared library if the output file
+	    # ends with ".so" (or ".sl" for HP-UX), so rename the library
+	    # to its proper name (with version) after linking.
+	    _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
+	    _LT_TAGVAR(archive_expsym_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib'
+	    # Commands to make compiler produce verbose output that lists
+	    # what "hidden" libraries, object files and flags are used when
+	    # linking a shared library.
+	    #
+	    # There doesn't appear to be a way to prevent this compiler from
+	    # explicitly linking system object files so we need to strip them
+	    # from the output so that they don't get included in the library
+	    # dependencies.
+	    output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
+
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+	    _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
+
+	    # Archives containing C++ object files must be created using
+	    # "CC -Bstatic", where "CC" is the KAI C++ compiler.
+	    _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs'
+	    ;;
+	  icpc* | ecpc* )
+	    # Intel C++
+	    with_gnu_ld=yes
+	    # version 8.0 and above of icpc choke on multiply defined symbols
+	    # if we add $predep_objects and $postdep_objects, however 7.1 and
+	    # earlier do not add the objects themselves.
+	    case `$CC -V 2>&1` in
+	      *"Version 7."*)
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
+		_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+		;;
+	      *)  # Version 8.0 or newer
+	        tmp_idyn=
+	        case $host_cpu in
+		  ia64*) tmp_idyn=' -i_dynamic';;
+		esac
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+		_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+		;;
+	    esac
+	    _LT_TAGVAR(archive_cmds_need_lc, $1)=no
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+	    _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
+	    _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive'
+	    ;;
+          pgCC* | pgcpp*)
+            # Portland Group C++ compiler
+	    case `$CC -V` in
+	    *pgCC\ [[1-5]].* | *pgcpp\ [[1-5]].*)
+	      _LT_TAGVAR(prelink_cmds, $1)='tpldir=Template.dir~
+		rm -rf $tpldir~
+		$CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~
+		compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"'
+	      _LT_TAGVAR(old_archive_cmds, $1)='tpldir=Template.dir~
+		rm -rf $tpldir~
+		$CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~
+		$AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~
+		$RANLIB $oldlib'
+	      _LT_TAGVAR(archive_cmds, $1)='tpldir=Template.dir~
+		rm -rf $tpldir~
+		$CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~
+		$CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib'
+	      _LT_TAGVAR(archive_expsym_cmds, $1)='tpldir=Template.dir~
+		rm -rf $tpldir~
+		$CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~
+		$CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib'
+	      ;;
+	    *) # Version 6 and above use weak symbols
+	      _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib'
+	      _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib'
+	      ;;
+	    esac
+
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir'
+	    _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
+	    _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+            ;;
+	  cxx*)
+	    # Compaq C++
+	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname  -o $lib ${wl}-retain-symbols-file $wl$export_symbols'
+
+	    runpath_var=LD_RUN_PATH
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir'
+	    _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+
+	    # Commands to make compiler produce verbose output that lists
+	    # what "hidden" libraries, object files and flags are used when
+	    # linking a shared library.
+	    #
+	    # There doesn't appear to be a way to prevent this compiler from
+	    # explicitly linking system object files so we need to strip them
+	    # from the output so that they don't get included in the library
+	    # dependencies.
+	    output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed'
+	    ;;
+	  xl* | mpixl* | bgxl*)
+	    # IBM XL 8.0 on PPC, with GNU ld
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+	    _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
+	    _LT_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	    if test "x$supports_anon_versioning" = xyes; then
+	      _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~
+		cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+		echo "local: *; };" >> $output_objdir/$libname.ver~
+		$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'
+	    fi
+	    ;;
+	  *)
+	    case `$CC -V 2>&1 | sed 5q` in
+	    *Sun\ C*)
+	      # Sun C++ 5.9
+	      _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs'
+	      _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	      _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file ${wl}$export_symbols'
+	      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+	      _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+	      _LT_TAGVAR(compiler_needs_object, $1)=yes
+
+	      # Not sure whether something based on
+	      # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1
+	      # would be better.
+	      output_verbose_link_cmd='func_echo_all'
+
+	      # Archives containing C++ object files must be created using
+	      # "CC -xar", where "CC" is the Sun C++ compiler.  This is
+	      # necessary to make sure instantiated templates are included
+	      # in the archive.
+	      _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs'
+	      ;;
+	    esac
+	    ;;
+	esac
+	;;
+
+      lynxos*)
+        # FIXME: insert proper C++ library support
+	_LT_TAGVAR(ld_shlibs, $1)=no
+	;;
+
+      m88k*)
+        # FIXME: insert proper C++ library support
+        _LT_TAGVAR(ld_shlibs, $1)=no
+	;;
+
+      mvs*)
+        case $cc_basename in
+          cxx*)
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+	  *)
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+	esac
+	;;
+
+      netbsd*)
+        if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+	  _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable  -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags'
+	  wlarc=
+	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+	  _LT_TAGVAR(hardcode_direct, $1)=yes
+	  _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+	fi
+	# Workaround some broken pre-1.5 toolchains
+	output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"'
+	;;
+
+      *nto* | *qnx*)
+        _LT_TAGVAR(ld_shlibs, $1)=yes
+	;;
+
+      openbsd2*)
+        # C++ shared libraries are fairly broken
+	_LT_TAGVAR(ld_shlibs, $1)=no
+	;;
+
+      openbsd*)
+	if test -f /usr/libexec/ld.so; then
+	  _LT_TAGVAR(hardcode_direct, $1)=yes
+	  _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+	  _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib'
+	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+	  if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+	    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib'
+	    _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+	    _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
+	  fi
+	  output_verbose_link_cmd=func_echo_all
+	else
+	  _LT_TAGVAR(ld_shlibs, $1)=no
+	fi
+	;;
+
+      osf3* | osf4* | osf5*)
+        case $cc_basename in
+          KCC*)
+	    # Kuck and Associates, Inc. (KAI) C++ Compiler
+
+	    # KCC will only create a shared library if the output file
+	    # ends with ".so" (or ".sl" for HP-UX), so rename the library
+	    # to its proper name (with version) after linking.
+	    _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
+
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+	    _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+
+	    # Archives containing C++ object files must be created using
+	    # the KAI C++ compiler.
+	    case $host in
+	      osf3*) _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;;
+	      *) _LT_TAGVAR(old_archive_cmds, $1)='$CC -o $oldlib $oldobjs' ;;
+	    esac
+	    ;;
+          RCC*)
+	    # Rational C++ 2.4.1
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+          cxx*)
+	    case $host in
+	      osf3*)
+	        _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && func_echo_all "${wl}-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
+	        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+		;;
+	      *)
+	        _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*'
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
+	        _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~
+	          echo "-hidden">> $lib.exp~
+	          $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname ${wl}-input ${wl}$lib.exp  `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~
+	          $RM $lib.exp'
+	        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir'
+		;;
+	    esac
+
+	    _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+
+	    # Commands to make compiler produce verbose output that lists
+	    # what "hidden" libraries, object files and flags are used when
+	    # linking a shared library.
+	    #
+	    # There doesn't appear to be a way to prevent this compiler from
+	    # explicitly linking system object files so we need to strip them
+	    # from the output so that they don't get included in the library
+	    # dependencies.
+	    output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
+	    ;;
+	  *)
+	    if test "$GXX" = yes && test "$with_gnu_ld" = no; then
+	      _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
+	      case $host in
+	        osf3*)
+	          _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+		  ;;
+	        *)
+	          _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+		  ;;
+	      esac
+
+	      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+	      _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+
+	      # Commands to make compiler produce verbose output that lists
+	      # what "hidden" libraries, object files and flags are used when
+	      # linking a shared library.
+	      output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
+
+	    else
+	      # FIXME: insert proper C++ library support
+	      _LT_TAGVAR(ld_shlibs, $1)=no
+	    fi
+	    ;;
+        esac
+        ;;
+
+      psos*)
+        # FIXME: insert proper C++ library support
+        _LT_TAGVAR(ld_shlibs, $1)=no
+        ;;
+
+      sunos4*)
+        case $cc_basename in
+          CC*)
+	    # Sun C++ 4.x
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+          lcc*)
+	    # Lucid
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+          *)
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+        esac
+        ;;
+
+      solaris*)
+        case $cc_basename in
+          CC* | sunCC*)
+	    # Sun C++ 4.2, 5.x and Centerline C++
+            _LT_TAGVAR(archive_cmds_need_lc,$1)=yes
+	    _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs'
+	    _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag}  -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	    _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+	      $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
+
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+	    _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+	    case $host_os in
+	      solaris2.[[0-5]] | solaris2.[[0-5]].*) ;;
+	      *)
+		# The compiler driver will combine and reorder linker options,
+		# but understands `-z linker_flag'.
+	        # Supported since Solaris 2.6 (maybe 2.5.1?)
+		_LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract'
+	        ;;
+	    esac
+	    _LT_TAGVAR(link_all_deplibs, $1)=yes
+
+	    output_verbose_link_cmd='func_echo_all'
+
+	    # Archives containing C++ object files must be created using
+	    # "CC -xar", where "CC" is the Sun C++ compiler.  This is
+	    # necessary to make sure instantiated templates are included
+	    # in the archive.
+	    _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs'
+	    ;;
+          gcx*)
+	    # Green Hills C++ Compiler
+	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
+
+	    # The C++ compiler must be used to create the archive.
+	    _LT_TAGVAR(old_archive_cmds, $1)='$CC $LDFLAGS -archive -o $oldlib $oldobjs'
+	    ;;
+          *)
+	    # GNU C++ compiler with Solaris linker
+	    if test "$GXX" = yes && test "$with_gnu_ld" = no; then
+	      _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-z ${wl}defs'
+	      if $CC --version | $GREP -v '^2\.7' > /dev/null; then
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
+	        _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+		  $CC -shared $pic_flag -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
+
+	        # Commands to make compiler produce verbose output that lists
+	        # what "hidden" libraries, object files and flags are used when
+	        # linking a shared library.
+	        output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
+	      else
+	        # g++ 2.7 appears to require `-G' NOT `-shared' on this
+	        # platform.
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
+	        _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+		  $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
+
+	        # Commands to make compiler produce verbose output that lists
+	        # what "hidden" libraries, object files and flags are used when
+	        # linking a shared library.
+	        output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
+	      fi
+
+	      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $wl$libdir'
+	      case $host_os in
+		solaris2.[[0-5]] | solaris2.[[0-5]].*) ;;
+		*)
+		  _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract'
+		  ;;
+	      esac
+	    fi
+	    ;;
+        esac
+        ;;
+
+    sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*)
+      _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'
+      _LT_TAGVAR(archive_cmds_need_lc, $1)=no
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      runpath_var='LD_RUN_PATH'
+
+      case $cc_basename in
+        CC*)
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	*)
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+      esac
+      ;;
+
+      sysv5* | sco3.2v5* | sco5v6*)
+	# Note: We can NOT use -z defs as we might desire, because we do not
+	# link with -lc, and that would cause any symbols used from libc to
+	# always be unresolved, which means just about no library would
+	# ever link correctly.  If we're not using GNU ld we use -z text
+	# though, which does catch some bad symbols but isn't as heavy-handed
+	# as -z defs.
+	_LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'
+	_LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs'
+	_LT_TAGVAR(archive_cmds_need_lc, $1)=no
+	_LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir'
+	_LT_TAGVAR(hardcode_libdir_separator, $1)=':'
+	_LT_TAGVAR(link_all_deplibs, $1)=yes
+	_LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport'
+	runpath_var='LD_RUN_PATH'
+
+	case $cc_basename in
+          CC*)
+	    _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	    _LT_TAGVAR(old_archive_cmds, $1)='$CC -Tprelink_objects $oldobjs~
+	      '"$_LT_TAGVAR(old_archive_cmds, $1)"
+	    _LT_TAGVAR(reload_cmds, $1)='$CC -Tprelink_objects $reload_objs~
+	      '"$_LT_TAGVAR(reload_cmds, $1)"
+	    ;;
+	  *)
+	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	    ;;
+	esac
+      ;;
+
+      tandem*)
+        case $cc_basename in
+          NCC*)
+	    # NonStop-UX NCC 3.20
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+          *)
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+        esac
+        ;;
+
+      vxworks*)
+        # FIXME: insert proper C++ library support
+        _LT_TAGVAR(ld_shlibs, $1)=no
+        ;;
+
+      *)
+        # FIXME: insert proper C++ library support
+        _LT_TAGVAR(ld_shlibs, $1)=no
+        ;;
+    esac
+
+    AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)])
+    test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no
+
+    _LT_TAGVAR(GCC, $1)="$GXX"
+    _LT_TAGVAR(LD, $1)="$LD"
+
+    ## CAVEAT EMPTOR:
+    ## There is no encapsulation within the following macros, do not change
+    ## the running order or otherwise move them around unless you know exactly
+    ## what you are doing...
+    _LT_SYS_HIDDEN_LIBDEPS($1)
+    _LT_COMPILER_PIC($1)
+    _LT_COMPILER_C_O($1)
+    _LT_COMPILER_FILE_LOCKS($1)
+    _LT_LINKER_SHLIBS($1)
+    _LT_SYS_DYNAMIC_LINKER($1)
+    _LT_LINKER_HARDCODE_LIBPATH($1)
+
+    _LT_CONFIG($1)
+  fi # test -n "$compiler"
+
+  CC=$lt_save_CC
+  CFLAGS=$lt_save_CFLAGS
+  LDCXX=$LD
+  LD=$lt_save_LD
+  GCC=$lt_save_GCC
+  with_gnu_ld=$lt_save_with_gnu_ld
+  lt_cv_path_LDCXX=$lt_cv_path_LD
+  lt_cv_path_LD=$lt_save_path_LD
+  lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld
+  lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld
+fi # test "$_lt_caught_CXX_error" != yes
+
+AC_LANG_POP
+])# _LT_LANG_CXX_CONFIG
+
+
+# _LT_FUNC_STRIPNAME_CNF
+# ----------------------
+# func_stripname_cnf prefix suffix name
+# strip PREFIX and SUFFIX off of NAME.
+# PREFIX and SUFFIX must not contain globbing or regex special
+# characters, hashes, percent signs, but SUFFIX may contain a leading
+# dot (in which case that matches only a dot).
+#
+# This function is identical to the (non-XSI) version of func_stripname,
+# except this one can be used by m4 code that may be executed by configure,
+# rather than the libtool script.
+m4_defun([_LT_FUNC_STRIPNAME_CNF],[dnl
+AC_REQUIRE([_LT_DECL_SED])
+AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])
+func_stripname_cnf ()
+{
+  case ${2} in
+  .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;;
+  *)  func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;;
+  esac
+} # func_stripname_cnf
+])# _LT_FUNC_STRIPNAME_CNF
+
+# _LT_SYS_HIDDEN_LIBDEPS([TAGNAME])
+# ---------------------------------
+# Figure out "hidden" library dependencies from verbose
+# compiler output when linking a shared library.
+# Parse the compiler output and extract the necessary
+# objects, libraries and library flags.
+m4_defun([_LT_SYS_HIDDEN_LIBDEPS],
+[m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+AC_REQUIRE([_LT_FUNC_STRIPNAME_CNF])dnl
+# Dependencies to place before and after the object being linked:
+_LT_TAGVAR(predep_objects, $1)=
+_LT_TAGVAR(postdep_objects, $1)=
+_LT_TAGVAR(predeps, $1)=
+_LT_TAGVAR(postdeps, $1)=
+_LT_TAGVAR(compiler_lib_search_path, $1)=
+
+dnl we can't use the lt_simple_compile_test_code here,
+dnl because it contains code intended for an executable,
+dnl not a library.  It's possible we should let each
+dnl tag define a new lt_????_link_test_code variable,
+dnl but it's only used here...
+m4_if([$1], [], [cat > conftest.$ac_ext <<_LT_EOF
+int a;
+void foo (void) { a = 0; }
+_LT_EOF
+], [$1], [CXX], [cat > conftest.$ac_ext <<_LT_EOF
+class Foo
+{
+public:
+  Foo (void) { a = 0; }
+private:
+  int a;
+};
+_LT_EOF
+], [$1], [F77], [cat > conftest.$ac_ext <<_LT_EOF
+      subroutine foo
+      implicit none
+      integer*4 a
+      a=0
+      return
+      end
+_LT_EOF
+], [$1], [FC], [cat > conftest.$ac_ext <<_LT_EOF
+      subroutine foo
+      implicit none
+      integer a
+      a=0
+      return
+      end
+_LT_EOF
+], [$1], [GCJ], [cat > conftest.$ac_ext <<_LT_EOF
+public class foo {
+  private int a;
+  public void bar (void) {
+    a = 0;
+  }
+};
+_LT_EOF
+], [$1], [GO], [cat > conftest.$ac_ext <<_LT_EOF
+package foo
+func foo() {
+}
+_LT_EOF
+])
+
+_lt_libdeps_save_CFLAGS=$CFLAGS
+case "$CC $CFLAGS " in #(
+*\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;;
+*\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;;
+*\ -fuse-linker-plugin*\ *) CFLAGS="$CFLAGS -fno-use-linker-plugin" ;;
+esac
+
+dnl Parse the compiler output and extract the necessary
+dnl objects, libraries and library flags.
+if AC_TRY_EVAL(ac_compile); then
+  # Parse the compiler output and extract the necessary
+  # objects, libraries and library flags.
+
+  # Sentinel used to keep track of whether or not we are before
+  # the conftest object file.
+  pre_test_object_deps_done=no
+
+  for p in `eval "$output_verbose_link_cmd"`; do
+    case ${prev}${p} in
+
+    -L* | -R* | -l*)
+       # Some compilers place space between "-{L,R}" and the path.
+       # Remove the space.
+       if test $p = "-L" ||
+          test $p = "-R"; then
+	 prev=$p
+	 continue
+       fi
+
+       # Expand the sysroot to ease extracting the directories later.
+       if test -z "$prev"; then
+         case $p in
+         -L*) func_stripname_cnf '-L' '' "$p"; prev=-L; p=$func_stripname_result ;;
+         -R*) func_stripname_cnf '-R' '' "$p"; prev=-R; p=$func_stripname_result ;;
+         -l*) func_stripname_cnf '-l' '' "$p"; prev=-l; p=$func_stripname_result ;;
+         esac
+       fi
+       case $p in
+       =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;;
+       esac
+       if test "$pre_test_object_deps_done" = no; then
+	 case ${prev} in
+	 -L | -R)
+	   # Internal compiler library paths should come after those
+	   # provided the user.  The postdeps already come after the
+	   # user supplied libs so there is no need to process them.
+	   if test -z "$_LT_TAGVAR(compiler_lib_search_path, $1)"; then
+	     _LT_TAGVAR(compiler_lib_search_path, $1)="${prev}${p}"
+	   else
+	     _LT_TAGVAR(compiler_lib_search_path, $1)="${_LT_TAGVAR(compiler_lib_search_path, $1)} ${prev}${p}"
+	   fi
+	   ;;
+	 # The "-l" case would never come before the object being
+	 # linked, so don't bother handling this case.
+	 esac
+       else
+	 if test -z "$_LT_TAGVAR(postdeps, $1)"; then
+	   _LT_TAGVAR(postdeps, $1)="${prev}${p}"
+	 else
+	   _LT_TAGVAR(postdeps, $1)="${_LT_TAGVAR(postdeps, $1)} ${prev}${p}"
+	 fi
+       fi
+       prev=
+       ;;
+
+    *.lto.$objext) ;; # Ignore GCC LTO objects
+    *.$objext)
+       # This assumes that the test object file only shows up
+       # once in the compiler output.
+       if test "$p" = "conftest.$objext"; then
+	 pre_test_object_deps_done=yes
+	 continue
+       fi
+
+       if test "$pre_test_object_deps_done" = no; then
+	 if test -z "$_LT_TAGVAR(predep_objects, $1)"; then
+	   _LT_TAGVAR(predep_objects, $1)="$p"
+	 else
+	   _LT_TAGVAR(predep_objects, $1)="$_LT_TAGVAR(predep_objects, $1) $p"
+	 fi
+       else
+	 if test -z "$_LT_TAGVAR(postdep_objects, $1)"; then
+	   _LT_TAGVAR(postdep_objects, $1)="$p"
+	 else
+	   _LT_TAGVAR(postdep_objects, $1)="$_LT_TAGVAR(postdep_objects, $1) $p"
+	 fi
+       fi
+       ;;
+
+    *) ;; # Ignore the rest.
+
+    esac
+  done
+
+  # Clean up.
+  rm -f a.out a.exe
+else
+  echo "libtool.m4: error: problem compiling $1 test program"
+fi
+
+$RM -f confest.$objext
+CFLAGS=$_lt_libdeps_save_CFLAGS
+
+# PORTME: override above test on systems where it is broken
+m4_if([$1], [CXX],
+[case $host_os in
+interix[[3-9]]*)
+  # Interix 3.5 installs completely hosed .la files for C++, so rather than
+  # hack all around it, let's just trust "g++" to DTRT.
+  _LT_TAGVAR(predep_objects,$1)=
+  _LT_TAGVAR(postdep_objects,$1)=
+  _LT_TAGVAR(postdeps,$1)=
+  ;;
+
+linux*)
+  case `$CC -V 2>&1 | sed 5q` in
+  *Sun\ C*)
+    # Sun C++ 5.9
+
+    # The more standards-conforming stlport4 library is
+    # incompatible with the Cstd library. Avoid specifying
+    # it if it's in CXXFLAGS. Ignore libCrun as
+    # -library=stlport4 depends on it.
+    case " $CXX $CXXFLAGS " in
+    *" -library=stlport4 "*)
+      solaris_use_stlport4=yes
+      ;;
+    esac
+
+    if test "$solaris_use_stlport4" != yes; then
+      _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun'
+    fi
+    ;;
+  esac
+  ;;
+
+solaris*)
+  case $cc_basename in
+  CC* | sunCC*)
+    # The more standards-conforming stlport4 library is
+    # incompatible with the Cstd library. Avoid specifying
+    # it if it's in CXXFLAGS. Ignore libCrun as
+    # -library=stlport4 depends on it.
+    case " $CXX $CXXFLAGS " in
+    *" -library=stlport4 "*)
+      solaris_use_stlport4=yes
+      ;;
+    esac
+
+    # Adding this requires a known-good setup of shared libraries for
+    # Sun compiler versions before 5.6, else PIC objects from an old
+    # archive will be linked into the output, leading to subtle bugs.
+    if test "$solaris_use_stlport4" != yes; then
+      _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun'
+    fi
+    ;;
+  esac
+  ;;
+esac
+])
+
+case " $_LT_TAGVAR(postdeps, $1) " in
+*" -lc "*) _LT_TAGVAR(archive_cmds_need_lc, $1)=no ;;
+esac
+ _LT_TAGVAR(compiler_lib_search_dirs, $1)=
+if test -n "${_LT_TAGVAR(compiler_lib_search_path, $1)}"; then
+ _LT_TAGVAR(compiler_lib_search_dirs, $1)=`echo " ${_LT_TAGVAR(compiler_lib_search_path, $1)}" | ${SED} -e 's! -L! !g' -e 's!^ !!'`
+fi
+_LT_TAGDECL([], [compiler_lib_search_dirs], [1],
+    [The directories searched by this compiler when creating a shared library])
+_LT_TAGDECL([], [predep_objects], [1],
+    [Dependencies to place before and after the objects being linked to
+    create a shared library])
+_LT_TAGDECL([], [postdep_objects], [1])
+_LT_TAGDECL([], [predeps], [1])
+_LT_TAGDECL([], [postdeps], [1])
+_LT_TAGDECL([], [compiler_lib_search_path], [1],
+    [The library search path used internally by the compiler when linking
+    a shared library])
+])# _LT_SYS_HIDDEN_LIBDEPS
+
+
+# _LT_LANG_F77_CONFIG([TAG])
+# --------------------------
+# Ensure that the configuration variables for a Fortran 77 compiler are
+# suitably defined.  These variables are subsequently used by _LT_CONFIG
+# to write the compiler configuration to `libtool'.
+m4_defun([_LT_LANG_F77_CONFIG],
+[AC_LANG_PUSH(Fortran 77)
+if test -z "$F77" || test "X$F77" = "Xno"; then
+  _lt_disable_F77=yes
+fi
+
+_LT_TAGVAR(archive_cmds_need_lc, $1)=no
+_LT_TAGVAR(allow_undefined_flag, $1)=
+_LT_TAGVAR(always_export_symbols, $1)=no
+_LT_TAGVAR(archive_expsym_cmds, $1)=
+_LT_TAGVAR(export_dynamic_flag_spec, $1)=
+_LT_TAGVAR(hardcode_direct, $1)=no
+_LT_TAGVAR(hardcode_direct_absolute, $1)=no
+_LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
+_LT_TAGVAR(hardcode_libdir_separator, $1)=
+_LT_TAGVAR(hardcode_minus_L, $1)=no
+_LT_TAGVAR(hardcode_automatic, $1)=no
+_LT_TAGVAR(inherit_rpath, $1)=no
+_LT_TAGVAR(module_cmds, $1)=
+_LT_TAGVAR(module_expsym_cmds, $1)=
+_LT_TAGVAR(link_all_deplibs, $1)=unknown
+_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
+_LT_TAGVAR(reload_flag, $1)=$reload_flag
+_LT_TAGVAR(reload_cmds, $1)=$reload_cmds
+_LT_TAGVAR(no_undefined_flag, $1)=
+_LT_TAGVAR(whole_archive_flag_spec, $1)=
+_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no
+
+# Source file extension for f77 test sources.
+ac_ext=f
+
+# Object file extension for compiled f77 test sources.
+objext=o
+_LT_TAGVAR(objext, $1)=$objext
+
+# No sense in running all these tests if we already determined that
+# the F77 compiler isn't working.  Some variables (like enable_shared)
+# are currently assumed to apply to all compilers on this platform,
+# and will be corrupted by setting them based on a non-working compiler.
+if test "$_lt_disable_F77" != yes; then
+  # Code to be used in simple compile tests
+  lt_simple_compile_test_code="\
+      subroutine t
+      return
+      end
+"
+
+  # Code to be used in simple link tests
+  lt_simple_link_test_code="\
+      program t
+      end
+"
+
+  # ltmain only uses $CC for tagged configurations so make sure $CC is set.
+  _LT_TAG_COMPILER
+
+  # save warnings/boilerplate of simple test code
+  _LT_COMPILER_BOILERPLATE
+  _LT_LINKER_BOILERPLATE
+
+  # Allow CC to be a program name with arguments.
+  lt_save_CC="$CC"
+  lt_save_GCC=$GCC
+  lt_save_CFLAGS=$CFLAGS
+  CC=${F77-"f77"}
+  CFLAGS=$FFLAGS
+  compiler=$CC
+  _LT_TAGVAR(compiler, $1)=$CC
+  _LT_CC_BASENAME([$compiler])
+  GCC=$G77
+  if test -n "$compiler"; then
+    AC_MSG_CHECKING([if libtool supports shared libraries])
+    AC_MSG_RESULT([$can_build_shared])
+
+    AC_MSG_CHECKING([whether to build shared libraries])
+    test "$can_build_shared" = "no" && enable_shared=no
+
+    # On AIX, shared libraries and static libraries use the same namespace, and
+    # are all built from PIC.
+    case $host_os in
+      aix3*)
+        test "$enable_shared" = yes && enable_static=no
+        if test -n "$RANLIB"; then
+          archive_cmds="$archive_cmds~\$RANLIB \$lib"
+          postinstall_cmds='$RANLIB $lib'
+        fi
+        ;;
+      aix[[4-9]]*)
+	if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then
+	  test "$enable_shared" = yes && enable_static=no
+	fi
+        ;;
+    esac
+    AC_MSG_RESULT([$enable_shared])
+
+    AC_MSG_CHECKING([whether to build static libraries])
+    # Make sure either enable_shared or enable_static is yes.
+    test "$enable_shared" = yes || enable_static=yes
+    AC_MSG_RESULT([$enable_static])
+
+    _LT_TAGVAR(GCC, $1)="$G77"
+    _LT_TAGVAR(LD, $1)="$LD"
+
+    ## CAVEAT EMPTOR:
+    ## There is no encapsulation within the following macros, do not change
+    ## the running order or otherwise move them around unless you know exactly
+    ## what you are doing...
+    _LT_COMPILER_PIC($1)
+    _LT_COMPILER_C_O($1)
+    _LT_COMPILER_FILE_LOCKS($1)
+    _LT_LINKER_SHLIBS($1)
+    _LT_SYS_DYNAMIC_LINKER($1)
+    _LT_LINKER_HARDCODE_LIBPATH($1)
+
+    _LT_CONFIG($1)
+  fi # test -n "$compiler"
+
+  GCC=$lt_save_GCC
+  CC="$lt_save_CC"
+  CFLAGS="$lt_save_CFLAGS"
+fi # test "$_lt_disable_F77" != yes
+
+AC_LANG_POP
+])# _LT_LANG_F77_CONFIG
+
+
+# _LT_LANG_FC_CONFIG([TAG])
+# -------------------------
+# Ensure that the configuration variables for a Fortran compiler are
+# suitably defined.  These variables are subsequently used by _LT_CONFIG
+# to write the compiler configuration to `libtool'.
+m4_defun([_LT_LANG_FC_CONFIG],
+[AC_LANG_PUSH(Fortran)
+
+if test -z "$FC" || test "X$FC" = "Xno"; then
+  _lt_disable_FC=yes
+fi
+
+_LT_TAGVAR(archive_cmds_need_lc, $1)=no
+_LT_TAGVAR(allow_undefined_flag, $1)=
+_LT_TAGVAR(always_export_symbols, $1)=no
+_LT_TAGVAR(archive_expsym_cmds, $1)=
+_LT_TAGVAR(export_dynamic_flag_spec, $1)=
+_LT_TAGVAR(hardcode_direct, $1)=no
+_LT_TAGVAR(hardcode_direct_absolute, $1)=no
+_LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
+_LT_TAGVAR(hardcode_libdir_separator, $1)=
+_LT_TAGVAR(hardcode_minus_L, $1)=no
+_LT_TAGVAR(hardcode_automatic, $1)=no
+_LT_TAGVAR(inherit_rpath, $1)=no
+_LT_TAGVAR(module_cmds, $1)=
+_LT_TAGVAR(module_expsym_cmds, $1)=
+_LT_TAGVAR(link_all_deplibs, $1)=unknown
+_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
+_LT_TAGVAR(reload_flag, $1)=$reload_flag
+_LT_TAGVAR(reload_cmds, $1)=$reload_cmds
+_LT_TAGVAR(no_undefined_flag, $1)=
+_LT_TAGVAR(whole_archive_flag_spec, $1)=
+_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no
+
+# Source file extension for fc test sources.
+ac_ext=${ac_fc_srcext-f}
+
+# Object file extension for compiled fc test sources.
+objext=o
+_LT_TAGVAR(objext, $1)=$objext
+
+# No sense in running all these tests if we already determined that
+# the FC compiler isn't working.  Some variables (like enable_shared)
+# are currently assumed to apply to all compilers on this platform,
+# and will be corrupted by setting them based on a non-working compiler.
+if test "$_lt_disable_FC" != yes; then
+  # Code to be used in simple compile tests
+  lt_simple_compile_test_code="\
+      subroutine t
+      return
+      end
+"
+
+  # Code to be used in simple link tests
+  lt_simple_link_test_code="\
+      program t
+      end
+"
+
+  # ltmain only uses $CC for tagged configurations so make sure $CC is set.
+  _LT_TAG_COMPILER
+
+  # save warnings/boilerplate of simple test code
+  _LT_COMPILER_BOILERPLATE
+  _LT_LINKER_BOILERPLATE
+
+  # Allow CC to be a program name with arguments.
+  lt_save_CC="$CC"
+  lt_save_GCC=$GCC
+  lt_save_CFLAGS=$CFLAGS
+  CC=${FC-"f95"}
+  CFLAGS=$FCFLAGS
+  compiler=$CC
+  GCC=$ac_cv_fc_compiler_gnu
+
+  _LT_TAGVAR(compiler, $1)=$CC
+  _LT_CC_BASENAME([$compiler])
+
+  if test -n "$compiler"; then
+    AC_MSG_CHECKING([if libtool supports shared libraries])
+    AC_MSG_RESULT([$can_build_shared])
+
+    AC_MSG_CHECKING([whether to build shared libraries])
+    test "$can_build_shared" = "no" && enable_shared=no
+
+    # On AIX, shared libraries and static libraries use the same namespace, and
+    # are all built from PIC.
+    case $host_os in
+      aix3*)
+        test "$enable_shared" = yes && enable_static=no
+        if test -n "$RANLIB"; then
+          archive_cmds="$archive_cmds~\$RANLIB \$lib"
+          postinstall_cmds='$RANLIB $lib'
+        fi
+        ;;
+      aix[[4-9]]*)
+	if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then
+	  test "$enable_shared" = yes && enable_static=no
+	fi
+        ;;
+    esac
+    AC_MSG_RESULT([$enable_shared])
+
+    AC_MSG_CHECKING([whether to build static libraries])
+    # Make sure either enable_shared or enable_static is yes.
+    test "$enable_shared" = yes || enable_static=yes
+    AC_MSG_RESULT([$enable_static])
+
+    _LT_TAGVAR(GCC, $1)="$ac_cv_fc_compiler_gnu"
+    _LT_TAGVAR(LD, $1)="$LD"
+
+    ## CAVEAT EMPTOR:
+    ## There is no encapsulation within the following macros, do not change
+    ## the running order or otherwise move them around unless you know exactly
+    ## what you are doing...
+    _LT_SYS_HIDDEN_LIBDEPS($1)
+    _LT_COMPILER_PIC($1)
+    _LT_COMPILER_C_O($1)
+    _LT_COMPILER_FILE_LOCKS($1)
+    _LT_LINKER_SHLIBS($1)
+    _LT_SYS_DYNAMIC_LINKER($1)
+    _LT_LINKER_HARDCODE_LIBPATH($1)
+
+    _LT_CONFIG($1)
+  fi # test -n "$compiler"
+
+  GCC=$lt_save_GCC
+  CC=$lt_save_CC
+  CFLAGS=$lt_save_CFLAGS
+fi # test "$_lt_disable_FC" != yes
+
+AC_LANG_POP
+])# _LT_LANG_FC_CONFIG
+
+
+# _LT_LANG_GCJ_CONFIG([TAG])
+# --------------------------
+# Ensure that the configuration variables for the GNU Java Compiler compiler
+# are suitably defined.  These variables are subsequently used by _LT_CONFIG
+# to write the compiler configuration to `libtool'.
+m4_defun([_LT_LANG_GCJ_CONFIG],
+[AC_REQUIRE([LT_PROG_GCJ])dnl
+AC_LANG_SAVE
+
+# Source file extension for Java test sources.
+ac_ext=java
+
+# Object file extension for compiled Java test sources.
+objext=o
+_LT_TAGVAR(objext, $1)=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code="class foo {}"
+
+# Code to be used in simple link tests
+lt_simple_link_test_code='public class conftest { public static void main(String[[]] argv) {}; }'
+
+# ltmain only uses $CC for tagged configurations so make sure $CC is set.
+_LT_TAG_COMPILER
+
+# save warnings/boilerplate of simple test code
+_LT_COMPILER_BOILERPLATE
+_LT_LINKER_BOILERPLATE
+
+# Allow CC to be a program name with arguments.
+lt_save_CC=$CC
+lt_save_CFLAGS=$CFLAGS
+lt_save_GCC=$GCC
+GCC=yes
+CC=${GCJ-"gcj"}
+CFLAGS=$GCJFLAGS
+compiler=$CC
+_LT_TAGVAR(compiler, $1)=$CC
+_LT_TAGVAR(LD, $1)="$LD"
+_LT_CC_BASENAME([$compiler])
+
+# GCJ did not exist at the time GCC didn't implicitly link libc in.
+_LT_TAGVAR(archive_cmds_need_lc, $1)=no
+
+_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
+_LT_TAGVAR(reload_flag, $1)=$reload_flag
+_LT_TAGVAR(reload_cmds, $1)=$reload_cmds
+
+## CAVEAT EMPTOR:
+## There is no encapsulation within the following macros, do not change
+## the running order or otherwise move them around unless you know exactly
+## what you are doing...
+if test -n "$compiler"; then
+  _LT_COMPILER_NO_RTTI($1)
+  _LT_COMPILER_PIC($1)
+  _LT_COMPILER_C_O($1)
+  _LT_COMPILER_FILE_LOCKS($1)
+  _LT_LINKER_SHLIBS($1)
+  _LT_LINKER_HARDCODE_LIBPATH($1)
+
+  _LT_CONFIG($1)
+fi
+
+AC_LANG_RESTORE
+
+GCC=$lt_save_GCC
+CC=$lt_save_CC
+CFLAGS=$lt_save_CFLAGS
+])# _LT_LANG_GCJ_CONFIG
+
+
+# _LT_LANG_GO_CONFIG([TAG])
+# --------------------------
+# Ensure that the configuration variables for the GNU Go compiler
+# are suitably defined.  These variables are subsequently used by _LT_CONFIG
+# to write the compiler configuration to `libtool'.
+m4_defun([_LT_LANG_GO_CONFIG],
+[AC_REQUIRE([LT_PROG_GO])dnl
+AC_LANG_SAVE
+
+# Source file extension for Go test sources.
+ac_ext=go
+
+# Object file extension for compiled Go test sources.
+objext=o
+_LT_TAGVAR(objext, $1)=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code="package main; func main() { }"
+
+# Code to be used in simple link tests
+lt_simple_link_test_code='package main; func main() { }'
+
+# ltmain only uses $CC for tagged configurations so make sure $CC is set.
+_LT_TAG_COMPILER
+
+# save warnings/boilerplate of simple test code
+_LT_COMPILER_BOILERPLATE
+_LT_LINKER_BOILERPLATE
+
+# Allow CC to be a program name with arguments.
+lt_save_CC=$CC
+lt_save_CFLAGS=$CFLAGS
+lt_save_GCC=$GCC
+GCC=yes
+CC=${GOC-"gccgo"}
+CFLAGS=$GOFLAGS
+compiler=$CC
+_LT_TAGVAR(compiler, $1)=$CC
+_LT_TAGVAR(LD, $1)="$LD"
+_LT_CC_BASENAME([$compiler])
+
+# Go did not exist at the time GCC didn't implicitly link libc in.
+_LT_TAGVAR(archive_cmds_need_lc, $1)=no
+
+_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
+_LT_TAGVAR(reload_flag, $1)=$reload_flag
+_LT_TAGVAR(reload_cmds, $1)=$reload_cmds
+
+## CAVEAT EMPTOR:
+## There is no encapsulation within the following macros, do not change
+## the running order or otherwise move them around unless you know exactly
+## what you are doing...
+if test -n "$compiler"; then
+  _LT_COMPILER_NO_RTTI($1)
+  _LT_COMPILER_PIC($1)
+  _LT_COMPILER_C_O($1)
+  _LT_COMPILER_FILE_LOCKS($1)
+  _LT_LINKER_SHLIBS($1)
+  _LT_LINKER_HARDCODE_LIBPATH($1)
+
+  _LT_CONFIG($1)
+fi
+
+AC_LANG_RESTORE
+
+GCC=$lt_save_GCC
+CC=$lt_save_CC
+CFLAGS=$lt_save_CFLAGS
+])# _LT_LANG_GO_CONFIG
+
+
+# _LT_LANG_RC_CONFIG([TAG])
+# -------------------------
+# Ensure that the configuration variables for the Windows resource compiler
+# are suitably defined.  These variables are subsequently used by _LT_CONFIG
+# to write the compiler configuration to `libtool'.
+m4_defun([_LT_LANG_RC_CONFIG],
+[AC_REQUIRE([LT_PROG_RC])dnl
+AC_LANG_SAVE
+
+# Source file extension for RC test sources.
+ac_ext=rc
+
+# Object file extension for compiled RC test sources.
+objext=o
+_LT_TAGVAR(objext, $1)=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }'
+
+# Code to be used in simple link tests
+lt_simple_link_test_code="$lt_simple_compile_test_code"
+
+# ltmain only uses $CC for tagged configurations so make sure $CC is set.
+_LT_TAG_COMPILER
+
+# save warnings/boilerplate of simple test code
+_LT_COMPILER_BOILERPLATE
+_LT_LINKER_BOILERPLATE
+
+# Allow CC to be a program name with arguments.
+lt_save_CC="$CC"
+lt_save_CFLAGS=$CFLAGS
+lt_save_GCC=$GCC
+GCC=
+CC=${RC-"windres"}
+CFLAGS=
+compiler=$CC
+_LT_TAGVAR(compiler, $1)=$CC
+_LT_CC_BASENAME([$compiler])
+_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes
+
+if test -n "$compiler"; then
+  :
+  _LT_CONFIG($1)
+fi
+
+GCC=$lt_save_GCC
+AC_LANG_RESTORE
+CC=$lt_save_CC
+CFLAGS=$lt_save_CFLAGS
+])# _LT_LANG_RC_CONFIG
+
+
+# LT_PROG_GCJ
+# -----------
+AC_DEFUN([LT_PROG_GCJ],
+[m4_ifdef([AC_PROG_GCJ], [AC_PROG_GCJ],
+  [m4_ifdef([A][M_PROG_GCJ], [A][M_PROG_GCJ],
+    [AC_CHECK_TOOL(GCJ, gcj,)
+      test "x${GCJFLAGS+set}" = xset || GCJFLAGS="-g -O2"
+      AC_SUBST(GCJFLAGS)])])[]dnl
+])
+
+# Old name:
+AU_ALIAS([LT_AC_PROG_GCJ], [LT_PROG_GCJ])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([LT_AC_PROG_GCJ], [])
+
+
+# LT_PROG_GO
+# ----------
+AC_DEFUN([LT_PROG_GO],
+[AC_CHECK_TOOL(GOC, gccgo,)
+])
+
+
+# LT_PROG_RC
+# ----------
+AC_DEFUN([LT_PROG_RC],
+[AC_CHECK_TOOL(RC, windres,)
+])
+
+# Old name:
+AU_ALIAS([LT_AC_PROG_RC], [LT_PROG_RC])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([LT_AC_PROG_RC], [])
+
+
+# _LT_DECL_EGREP
+# --------------
+# If we don't have a new enough Autoconf to choose the best grep
+# available, choose the one first in the user's PATH.
+m4_defun([_LT_DECL_EGREP],
+[AC_REQUIRE([AC_PROG_EGREP])dnl
+AC_REQUIRE([AC_PROG_FGREP])dnl
+test -z "$GREP" && GREP=grep
+_LT_DECL([], [GREP], [1], [A grep program that handles long lines])
+_LT_DECL([], [EGREP], [1], [An ERE matcher])
+_LT_DECL([], [FGREP], [1], [A literal string matcher])
+dnl Non-bleeding-edge autoconf doesn't subst GREP, so do it here too
+AC_SUBST([GREP])
+])
+
+
+# _LT_DECL_OBJDUMP
+# --------------
+# If we don't have a new enough Autoconf to choose the best objdump
+# available, choose the one first in the user's PATH.
+m4_defun([_LT_DECL_OBJDUMP],
+[AC_CHECK_TOOL(OBJDUMP, objdump, false)
+test -z "$OBJDUMP" && OBJDUMP=objdump
+_LT_DECL([], [OBJDUMP], [1], [An object symbol dumper])
+AC_SUBST([OBJDUMP])
+])
+
+# _LT_DECL_DLLTOOL
+# ----------------
+# Ensure DLLTOOL variable is set.
+m4_defun([_LT_DECL_DLLTOOL],
+[AC_CHECK_TOOL(DLLTOOL, dlltool, false)
+test -z "$DLLTOOL" && DLLTOOL=dlltool
+_LT_DECL([], [DLLTOOL], [1], [DLL creation program])
+AC_SUBST([DLLTOOL])
+])
+
+# _LT_DECL_SED
+# ------------
+# Check for a fully-functional sed program, that truncates
+# as few characters as possible.  Prefer GNU sed if found.
+m4_defun([_LT_DECL_SED],
+[AC_PROG_SED
+test -z "$SED" && SED=sed
+Xsed="$SED -e 1s/^X//"
+_LT_DECL([], [SED], [1], [A sed program that does not truncate output])
+_LT_DECL([], [Xsed], ["\$SED -e 1s/^X//"],
+    [Sed that helps us avoid accidentally triggering echo(1) options like -n])
+])# _LT_DECL_SED
+
+m4_ifndef([AC_PROG_SED], [
+############################################################
+# NOTE: This macro has been submitted for inclusion into   #
+#  GNU Autoconf as AC_PROG_SED.  When it is available in   #
+#  a released version of Autoconf we should remove this    #
+#  macro and use it instead.                               #
+############################################################
+
+m4_defun([AC_PROG_SED],
+[AC_MSG_CHECKING([for a sed that does not truncate output])
+AC_CACHE_VAL(lt_cv_path_SED,
+[# Loop through the user's path and test for sed and gsed.
+# Then use that list of sed's as ones to test for truncation.
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for lt_ac_prog in sed gsed; do
+    for ac_exec_ext in '' $ac_executable_extensions; do
+      if $as_executable_p "$as_dir/$lt_ac_prog$ac_exec_ext"; then
+        lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext"
+      fi
+    done
+  done
+done
+IFS=$as_save_IFS
+lt_ac_max=0
+lt_ac_count=0
+# Add /usr/xpg4/bin/sed as it is typically found on Solaris
+# along with /bin/sed that truncates output.
+for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do
+  test ! -f $lt_ac_sed && continue
+  cat /dev/null > conftest.in
+  lt_ac_count=0
+  echo $ECHO_N "0123456789$ECHO_C" >conftest.in
+  # Check for GNU sed and select it if it is found.
+  if "$lt_ac_sed" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then
+    lt_cv_path_SED=$lt_ac_sed
+    break
+  fi
+  while true; do
+    cat conftest.in conftest.in >conftest.tmp
+    mv conftest.tmp conftest.in
+    cp conftest.in conftest.nl
+    echo >>conftest.nl
+    $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break
+    cmp -s conftest.out conftest.nl || break
+    # 10000 chars as input seems more than enough
+    test $lt_ac_count -gt 10 && break
+    lt_ac_count=`expr $lt_ac_count + 1`
+    if test $lt_ac_count -gt $lt_ac_max; then
+      lt_ac_max=$lt_ac_count
+      lt_cv_path_SED=$lt_ac_sed
+    fi
+  done
+done
+])
+SED=$lt_cv_path_SED
+AC_SUBST([SED])
+AC_MSG_RESULT([$SED])
+])#AC_PROG_SED
+])#m4_ifndef
+
+# Old name:
+AU_ALIAS([LT_AC_PROG_SED], [AC_PROG_SED])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([LT_AC_PROG_SED], [])
+
+
+# _LT_CHECK_SHELL_FEATURES
+# ------------------------
+# Find out whether the shell is Bourne or XSI compatible,
+# or has some other useful features.
+m4_defun([_LT_CHECK_SHELL_FEATURES],
+[AC_MSG_CHECKING([whether the shell understands some XSI constructs])
+# Try some XSI features
+xsi_shell=no
+( _lt_dummy="a/b/c"
+  test "${_lt_dummy##*/},${_lt_dummy%/*},${_lt_dummy#??}"${_lt_dummy%"$_lt_dummy"}, \
+      = c,a/b,b/c, \
+    && eval 'test $(( 1 + 1 )) -eq 2 \
+    && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \
+  && xsi_shell=yes
+AC_MSG_RESULT([$xsi_shell])
+_LT_CONFIG_LIBTOOL_INIT([xsi_shell='$xsi_shell'])
+
+AC_MSG_CHECKING([whether the shell understands "+="])
+lt_shell_append=no
+( foo=bar; set foo baz; eval "$[1]+=\$[2]" && test "$foo" = barbaz ) \
+    >/dev/null 2>&1 \
+  && lt_shell_append=yes
+AC_MSG_RESULT([$lt_shell_append])
+_LT_CONFIG_LIBTOOL_INIT([lt_shell_append='$lt_shell_append'])
+
+if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
+  lt_unset=unset
+else
+  lt_unset=false
+fi
+_LT_DECL([], [lt_unset], [0], [whether the shell understands "unset"])dnl
+
+# test EBCDIC or ASCII
+case `echo X|tr X '\101'` in
+ A) # ASCII based system
+    # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr
+  lt_SP2NL='tr \040 \012'
+  lt_NL2SP='tr \015\012 \040\040'
+  ;;
+ *) # EBCDIC based system
+  lt_SP2NL='tr \100 \n'
+  lt_NL2SP='tr \r\n \100\100'
+  ;;
+esac
+_LT_DECL([SP2NL], [lt_SP2NL], [1], [turn spaces into newlines])dnl
+_LT_DECL([NL2SP], [lt_NL2SP], [1], [turn newlines into spaces])dnl
+])# _LT_CHECK_SHELL_FEATURES
+
+
+# _LT_PROG_FUNCTION_REPLACE (FUNCNAME, REPLACEMENT-BODY)
+# ------------------------------------------------------
+# In `$cfgfile', look for function FUNCNAME delimited by `^FUNCNAME ()$' and
+# '^} FUNCNAME ', and replace its body with REPLACEMENT-BODY.
+m4_defun([_LT_PROG_FUNCTION_REPLACE],
+[dnl {
+sed -e '/^$1 ()$/,/^} # $1 /c\
+$1 ()\
+{\
+m4_bpatsubsts([$2], [$], [\\], [^\([	 ]\)], [\\\1])
+} # Extended-shell $1 implementation' "$cfgfile" > $cfgfile.tmp \
+  && mv -f "$cfgfile.tmp" "$cfgfile" \
+    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+test 0 -eq $? || _lt_function_replace_fail=:
+])
+
+
+# _LT_PROG_REPLACE_SHELLFNS
+# -------------------------
+# Replace existing portable implementations of several shell functions with
+# equivalent extended shell implementations where those features are available..
+m4_defun([_LT_PROG_REPLACE_SHELLFNS],
+[if test x"$xsi_shell" = xyes; then
+  _LT_PROG_FUNCTION_REPLACE([func_dirname], [dnl
+    case ${1} in
+      */*) func_dirname_result="${1%/*}${2}" ;;
+      *  ) func_dirname_result="${3}" ;;
+    esac])
+
+  _LT_PROG_FUNCTION_REPLACE([func_basename], [dnl
+    func_basename_result="${1##*/}"])
+
+  _LT_PROG_FUNCTION_REPLACE([func_dirname_and_basename], [dnl
+    case ${1} in
+      */*) func_dirname_result="${1%/*}${2}" ;;
+      *  ) func_dirname_result="${3}" ;;
+    esac
+    func_basename_result="${1##*/}"])
+
+  _LT_PROG_FUNCTION_REPLACE([func_stripname], [dnl
+    # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are
+    # positional parameters, so assign one to ordinary parameter first.
+    func_stripname_result=${3}
+    func_stripname_result=${func_stripname_result#"${1}"}
+    func_stripname_result=${func_stripname_result%"${2}"}])
+
+  _LT_PROG_FUNCTION_REPLACE([func_split_long_opt], [dnl
+    func_split_long_opt_name=${1%%=*}
+    func_split_long_opt_arg=${1#*=}])
+
+  _LT_PROG_FUNCTION_REPLACE([func_split_short_opt], [dnl
+    func_split_short_opt_arg=${1#??}
+    func_split_short_opt_name=${1%"$func_split_short_opt_arg"}])
+
+  _LT_PROG_FUNCTION_REPLACE([func_lo2o], [dnl
+    case ${1} in
+      *.lo) func_lo2o_result=${1%.lo}.${objext} ;;
+      *)    func_lo2o_result=${1} ;;
+    esac])
+
+  _LT_PROG_FUNCTION_REPLACE([func_xform], [    func_xform_result=${1%.*}.lo])
+
+  _LT_PROG_FUNCTION_REPLACE([func_arith], [    func_arith_result=$(( $[*] ))])
+
+  _LT_PROG_FUNCTION_REPLACE([func_len], [    func_len_result=${#1}])
+fi
+
+if test x"$lt_shell_append" = xyes; then
+  _LT_PROG_FUNCTION_REPLACE([func_append], [    eval "${1}+=\\${2}"])
+
+  _LT_PROG_FUNCTION_REPLACE([func_append_quoted], [dnl
+    func_quote_for_eval "${2}"
+dnl m4 expansion turns \\\\ into \\, and then the shell eval turns that into \
+    eval "${1}+=\\\\ \\$func_quote_for_eval_result"])
+
+  # Save a `func_append' function call where possible by direct use of '+='
+  sed -e 's%func_append \([[a-zA-Z_]]\{1,\}\) "%\1+="%g' $cfgfile > $cfgfile.tmp \
+    && mv -f "$cfgfile.tmp" "$cfgfile" \
+      || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+  test 0 -eq $? || _lt_function_replace_fail=:
+else
+  # Save a `func_append' function call even when '+=' is not available
+  sed -e 's%func_append \([[a-zA-Z_]]\{1,\}\) "%\1="$\1%g' $cfgfile > $cfgfile.tmp \
+    && mv -f "$cfgfile.tmp" "$cfgfile" \
+      || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+  test 0 -eq $? || _lt_function_replace_fail=:
+fi
+
+if test x"$_lt_function_replace_fail" = x":"; then
+  AC_MSG_WARN([Unable to substitute extended shell functions in $ofile])
+fi
+])
+
+# _LT_PATH_CONVERSION_FUNCTIONS
+# -----------------------------
+# Determine which file name conversion functions should be used by
+# func_to_host_file (and, implicitly, by func_to_host_path).  These are needed
+# for certain cross-compile configurations and native mingw.
+m4_defun([_LT_PATH_CONVERSION_FUNCTIONS],
+[AC_REQUIRE([AC_CANONICAL_HOST])dnl
+AC_REQUIRE([AC_CANONICAL_BUILD])dnl
+AC_MSG_CHECKING([how to convert $build file names to $host format])
+AC_CACHE_VAL(lt_cv_to_host_file_cmd,
+[case $host in
+  *-*-mingw* )
+    case $build in
+      *-*-mingw* ) # actually msys
+        lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32
+        ;;
+      *-*-cygwin* )
+        lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32
+        ;;
+      * ) # otherwise, assume *nix
+        lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32
+        ;;
+    esac
+    ;;
+  *-*-cygwin* )
+    case $build in
+      *-*-mingw* ) # actually msys
+        lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin
+        ;;
+      *-*-cygwin* )
+        lt_cv_to_host_file_cmd=func_convert_file_noop
+        ;;
+      * ) # otherwise, assume *nix
+        lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin
+        ;;
+    esac
+    ;;
+  * ) # unhandled hosts (and "normal" native builds)
+    lt_cv_to_host_file_cmd=func_convert_file_noop
+    ;;
+esac
+])
+to_host_file_cmd=$lt_cv_to_host_file_cmd
+AC_MSG_RESULT([$lt_cv_to_host_file_cmd])
+_LT_DECL([to_host_file_cmd], [lt_cv_to_host_file_cmd],
+         [0], [convert $build file names to $host format])dnl
+
+AC_MSG_CHECKING([how to convert $build file names to toolchain format])
+AC_CACHE_VAL(lt_cv_to_tool_file_cmd,
+[#assume ordinary cross tools, or native build.
+lt_cv_to_tool_file_cmd=func_convert_file_noop
+case $host in
+  *-*-mingw* )
+    case $build in
+      *-*-mingw* ) # actually msys
+        lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32
+        ;;
+    esac
+    ;;
+esac
+])
+to_tool_file_cmd=$lt_cv_to_tool_file_cmd
+AC_MSG_RESULT([$lt_cv_to_tool_file_cmd])
+_LT_DECL([to_tool_file_cmd], [lt_cv_to_tool_file_cmd],
+         [0], [convert $build files to toolchain format])dnl
+])# _LT_PATH_CONVERSION_FUNCTIONS
diff --git a/m4/ltoptions.m4 b/m4/ltoptions.m4
new file mode 100644
index 0000000..5d9acd8
--- /dev/null
+++ b/m4/ltoptions.m4
@@ -0,0 +1,384 @@
+# Helper functions for option handling.                    -*- Autoconf -*-
+#
+#   Copyright (C) 2004, 2005, 2007, 2008, 2009 Free Software Foundation,
+#   Inc.
+#   Written by Gary V. Vaughan, 2004
+#
+# This file is free software; the Free Software Foundation gives
+# unlimited permission to copy and/or distribute it, with or without
+# modifications, as long as this notice is preserved.
+
+# serial 7 ltoptions.m4
+
+# This is to help aclocal find these macros, as it can't see m4_define.
+AC_DEFUN([LTOPTIONS_VERSION], [m4_if([1])])
+
+
+# _LT_MANGLE_OPTION(MACRO-NAME, OPTION-NAME)
+# ------------------------------------------
+m4_define([_LT_MANGLE_OPTION],
+[[_LT_OPTION_]m4_bpatsubst($1__$2, [[^a-zA-Z0-9_]], [_])])
+
+
+# _LT_SET_OPTION(MACRO-NAME, OPTION-NAME)
+# ---------------------------------------
+# Set option OPTION-NAME for macro MACRO-NAME, and if there is a
+# matching handler defined, dispatch to it.  Other OPTION-NAMEs are
+# saved as a flag.
+m4_define([_LT_SET_OPTION],
+[m4_define(_LT_MANGLE_OPTION([$1], [$2]))dnl
+m4_ifdef(_LT_MANGLE_DEFUN([$1], [$2]),
+        _LT_MANGLE_DEFUN([$1], [$2]),
+    [m4_warning([Unknown $1 option `$2'])])[]dnl
+])
+
+
+# _LT_IF_OPTION(MACRO-NAME, OPTION-NAME, IF-SET, [IF-NOT-SET])
+# ------------------------------------------------------------
+# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise.
+m4_define([_LT_IF_OPTION],
+[m4_ifdef(_LT_MANGLE_OPTION([$1], [$2]), [$3], [$4])])
+
+
+# _LT_UNLESS_OPTIONS(MACRO-NAME, OPTION-LIST, IF-NOT-SET)
+# -------------------------------------------------------
+# Execute IF-NOT-SET unless all options in OPTION-LIST for MACRO-NAME
+# are set.
+m4_define([_LT_UNLESS_OPTIONS],
+[m4_foreach([_LT_Option], m4_split(m4_normalize([$2])),
+	    [m4_ifdef(_LT_MANGLE_OPTION([$1], _LT_Option),
+		      [m4_define([$0_found])])])[]dnl
+m4_ifdef([$0_found], [m4_undefine([$0_found])], [$3
+])[]dnl
+])
+
+
+# _LT_SET_OPTIONS(MACRO-NAME, OPTION-LIST)
+# ----------------------------------------
+# OPTION-LIST is a space-separated list of Libtool options associated
+# with MACRO-NAME.  If any OPTION has a matching handler declared with
+# LT_OPTION_DEFINE, dispatch to that macro; otherwise complain about
+# the unknown option and exit.
+m4_defun([_LT_SET_OPTIONS],
+[# Set options
+m4_foreach([_LT_Option], m4_split(m4_normalize([$2])),
+    [_LT_SET_OPTION([$1], _LT_Option)])
+
+m4_if([$1],[LT_INIT],[
+  dnl
+  dnl Simply set some default values (i.e off) if boolean options were not
+  dnl specified:
+  _LT_UNLESS_OPTIONS([LT_INIT], [dlopen], [enable_dlopen=no
+  ])
+  _LT_UNLESS_OPTIONS([LT_INIT], [win32-dll], [enable_win32_dll=no
+  ])
+  dnl
+  dnl If no reference was made to various pairs of opposing options, then
+  dnl we run the default mode handler for the pair.  For example, if neither
+  dnl `shared' nor `disable-shared' was passed, we enable building of shared
+  dnl archives by default:
+  _LT_UNLESS_OPTIONS([LT_INIT], [shared disable-shared], [_LT_ENABLE_SHARED])
+  _LT_UNLESS_OPTIONS([LT_INIT], [static disable-static], [_LT_ENABLE_STATIC])
+  _LT_UNLESS_OPTIONS([LT_INIT], [pic-only no-pic], [_LT_WITH_PIC])
+  _LT_UNLESS_OPTIONS([LT_INIT], [fast-install disable-fast-install],
+  		   [_LT_ENABLE_FAST_INSTALL])
+  ])
+])# _LT_SET_OPTIONS
+
+
+## --------------------------------- ##
+## Macros to handle LT_INIT options. ##
+## --------------------------------- ##
+
+# _LT_MANGLE_DEFUN(MACRO-NAME, OPTION-NAME)
+# -----------------------------------------
+m4_define([_LT_MANGLE_DEFUN],
+[[_LT_OPTION_DEFUN_]m4_bpatsubst(m4_toupper([$1__$2]), [[^A-Z0-9_]], [_])])
+
+
+# LT_OPTION_DEFINE(MACRO-NAME, OPTION-NAME, CODE)
+# -----------------------------------------------
+m4_define([LT_OPTION_DEFINE],
+[m4_define(_LT_MANGLE_DEFUN([$1], [$2]), [$3])[]dnl
+])# LT_OPTION_DEFINE
+
+
+# dlopen
+# ------
+LT_OPTION_DEFINE([LT_INIT], [dlopen], [enable_dlopen=yes
+])
+
+AU_DEFUN([AC_LIBTOOL_DLOPEN],
+[_LT_SET_OPTION([LT_INIT], [dlopen])
+AC_DIAGNOSE([obsolete],
+[$0: Remove this warning and the call to _LT_SET_OPTION when you
+put the `dlopen' option into LT_INIT's first parameter.])
+])
+
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LIBTOOL_DLOPEN], [])
+
+
+# win32-dll
+# ---------
+# Declare package support for building win32 dll's.
+LT_OPTION_DEFINE([LT_INIT], [win32-dll],
+[enable_win32_dll=yes
+
+case $host in
+*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-cegcc*)
+  AC_CHECK_TOOL(AS, as, false)
+  AC_CHECK_TOOL(DLLTOOL, dlltool, false)
+  AC_CHECK_TOOL(OBJDUMP, objdump, false)
+  ;;
+esac
+
+test -z "$AS" && AS=as
+_LT_DECL([], [AS],      [1], [Assembler program])dnl
+
+test -z "$DLLTOOL" && DLLTOOL=dlltool
+_LT_DECL([], [DLLTOOL], [1], [DLL creation program])dnl
+
+test -z "$OBJDUMP" && OBJDUMP=objdump
+_LT_DECL([], [OBJDUMP], [1], [Object dumper program])dnl
+])# win32-dll
+
+AU_DEFUN([AC_LIBTOOL_WIN32_DLL],
+[AC_REQUIRE([AC_CANONICAL_HOST])dnl
+_LT_SET_OPTION([LT_INIT], [win32-dll])
+AC_DIAGNOSE([obsolete],
+[$0: Remove this warning and the call to _LT_SET_OPTION when you
+put the `win32-dll' option into LT_INIT's first parameter.])
+])
+
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LIBTOOL_WIN32_DLL], [])
+
+
+# _LT_ENABLE_SHARED([DEFAULT])
+# ----------------------------
+# implement the --enable-shared flag, and supports the `shared' and
+# `disable-shared' LT_INIT options.
+# DEFAULT is either `yes' or `no'.  If omitted, it defaults to `yes'.
+m4_define([_LT_ENABLE_SHARED],
+[m4_define([_LT_ENABLE_SHARED_DEFAULT], [m4_if($1, no, no, yes)])dnl
+AC_ARG_ENABLE([shared],
+    [AS_HELP_STRING([--enable-shared@<:@=PKGS@:>@],
+	[build shared libraries @<:@default=]_LT_ENABLE_SHARED_DEFAULT[@:>@])],
+    [p=${PACKAGE-default}
+    case $enableval in
+    yes) enable_shared=yes ;;
+    no) enable_shared=no ;;
+    *)
+      enable_shared=no
+      # Look at the argument we got.  We use all the common list separators.
+      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+      for pkg in $enableval; do
+	IFS="$lt_save_ifs"
+	if test "X$pkg" = "X$p"; then
+	  enable_shared=yes
+	fi
+      done
+      IFS="$lt_save_ifs"
+      ;;
+    esac],
+    [enable_shared=]_LT_ENABLE_SHARED_DEFAULT)
+
+    _LT_DECL([build_libtool_libs], [enable_shared], [0],
+	[Whether or not to build shared libraries])
+])# _LT_ENABLE_SHARED
+
+LT_OPTION_DEFINE([LT_INIT], [shared], [_LT_ENABLE_SHARED([yes])])
+LT_OPTION_DEFINE([LT_INIT], [disable-shared], [_LT_ENABLE_SHARED([no])])
+
+# Old names:
+AC_DEFUN([AC_ENABLE_SHARED],
+[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[shared])
+])
+
+AC_DEFUN([AC_DISABLE_SHARED],
+[_LT_SET_OPTION([LT_INIT], [disable-shared])
+])
+
+AU_DEFUN([AM_ENABLE_SHARED], [AC_ENABLE_SHARED($@)])
+AU_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)])
+
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AM_ENABLE_SHARED], [])
+dnl AC_DEFUN([AM_DISABLE_SHARED], [])
+
+
+
+# _LT_ENABLE_STATIC([DEFAULT])
+# ----------------------------
+# implement the --enable-static flag, and support the `static' and
+# `disable-static' LT_INIT options.
+# DEFAULT is either `yes' or `no'.  If omitted, it defaults to `yes'.
+m4_define([_LT_ENABLE_STATIC],
+[m4_define([_LT_ENABLE_STATIC_DEFAULT], [m4_if($1, no, no, yes)])dnl
+AC_ARG_ENABLE([static],
+    [AS_HELP_STRING([--enable-static@<:@=PKGS@:>@],
+	[build static libraries @<:@default=]_LT_ENABLE_STATIC_DEFAULT[@:>@])],
+    [p=${PACKAGE-default}
+    case $enableval in
+    yes) enable_static=yes ;;
+    no) enable_static=no ;;
+    *)
+     enable_static=no
+      # Look at the argument we got.  We use all the common list separators.
+      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+      for pkg in $enableval; do
+	IFS="$lt_save_ifs"
+	if test "X$pkg" = "X$p"; then
+	  enable_static=yes
+	fi
+      done
+      IFS="$lt_save_ifs"
+      ;;
+    esac],
+    [enable_static=]_LT_ENABLE_STATIC_DEFAULT)
+
+    _LT_DECL([build_old_libs], [enable_static], [0],
+	[Whether or not to build static libraries])
+])# _LT_ENABLE_STATIC
+
+LT_OPTION_DEFINE([LT_INIT], [static], [_LT_ENABLE_STATIC([yes])])
+LT_OPTION_DEFINE([LT_INIT], [disable-static], [_LT_ENABLE_STATIC([no])])
+
+# Old names:
+AC_DEFUN([AC_ENABLE_STATIC],
+[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[static])
+])
+
+AC_DEFUN([AC_DISABLE_STATIC],
+[_LT_SET_OPTION([LT_INIT], [disable-static])
+])
+
+AU_DEFUN([AM_ENABLE_STATIC], [AC_ENABLE_STATIC($@)])
+AU_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)])
+
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AM_ENABLE_STATIC], [])
+dnl AC_DEFUN([AM_DISABLE_STATIC], [])
+
+
+
+# _LT_ENABLE_FAST_INSTALL([DEFAULT])
+# ----------------------------------
+# implement the --enable-fast-install flag, and support the `fast-install'
+# and `disable-fast-install' LT_INIT options.
+# DEFAULT is either `yes' or `no'.  If omitted, it defaults to `yes'.
+m4_define([_LT_ENABLE_FAST_INSTALL],
+[m4_define([_LT_ENABLE_FAST_INSTALL_DEFAULT], [m4_if($1, no, no, yes)])dnl
+AC_ARG_ENABLE([fast-install],
+    [AS_HELP_STRING([--enable-fast-install@<:@=PKGS@:>@],
+    [optimize for fast installation @<:@default=]_LT_ENABLE_FAST_INSTALL_DEFAULT[@:>@])],
+    [p=${PACKAGE-default}
+    case $enableval in
+    yes) enable_fast_install=yes ;;
+    no) enable_fast_install=no ;;
+    *)
+      enable_fast_install=no
+      # Look at the argument we got.  We use all the common list separators.
+      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+      for pkg in $enableval; do
+	IFS="$lt_save_ifs"
+	if test "X$pkg" = "X$p"; then
+	  enable_fast_install=yes
+	fi
+      done
+      IFS="$lt_save_ifs"
+      ;;
+    esac],
+    [enable_fast_install=]_LT_ENABLE_FAST_INSTALL_DEFAULT)
+
+_LT_DECL([fast_install], [enable_fast_install], [0],
+	 [Whether or not to optimize for fast installation])dnl
+])# _LT_ENABLE_FAST_INSTALL
+
+LT_OPTION_DEFINE([LT_INIT], [fast-install], [_LT_ENABLE_FAST_INSTALL([yes])])
+LT_OPTION_DEFINE([LT_INIT], [disable-fast-install], [_LT_ENABLE_FAST_INSTALL([no])])
+
+# Old names:
+AU_DEFUN([AC_ENABLE_FAST_INSTALL],
+[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[fast-install])
+AC_DIAGNOSE([obsolete],
+[$0: Remove this warning and the call to _LT_SET_OPTION when you put
+the `fast-install' option into LT_INIT's first parameter.])
+])
+
+AU_DEFUN([AC_DISABLE_FAST_INSTALL],
+[_LT_SET_OPTION([LT_INIT], [disable-fast-install])
+AC_DIAGNOSE([obsolete],
+[$0: Remove this warning and the call to _LT_SET_OPTION when you put
+the `disable-fast-install' option into LT_INIT's first parameter.])
+])
+
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_ENABLE_FAST_INSTALL], [])
+dnl AC_DEFUN([AM_DISABLE_FAST_INSTALL], [])
+
+
+# _LT_WITH_PIC([MODE])
+# --------------------
+# implement the --with-pic flag, and support the `pic-only' and `no-pic'
+# LT_INIT options.
+# MODE is either `yes' or `no'.  If omitted, it defaults to `both'.
+m4_define([_LT_WITH_PIC],
+[AC_ARG_WITH([pic],
+    [AS_HELP_STRING([--with-pic@<:@=PKGS@:>@],
+	[try to use only PIC/non-PIC objects @<:@default=use both@:>@])],
+    [lt_p=${PACKAGE-default}
+    case $withval in
+    yes|no) pic_mode=$withval ;;
+    *)
+      pic_mode=default
+      # Look at the argument we got.  We use all the common list separators.
+      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+      for lt_pkg in $withval; do
+	IFS="$lt_save_ifs"
+	if test "X$lt_pkg" = "X$lt_p"; then
+	  pic_mode=yes
+	fi
+      done
+      IFS="$lt_save_ifs"
+      ;;
+    esac],
+    [pic_mode=default])
+
+test -z "$pic_mode" && pic_mode=m4_default([$1], [default])
+
+_LT_DECL([], [pic_mode], [0], [What type of objects to build])dnl
+])# _LT_WITH_PIC
+
+LT_OPTION_DEFINE([LT_INIT], [pic-only], [_LT_WITH_PIC([yes])])
+LT_OPTION_DEFINE([LT_INIT], [no-pic], [_LT_WITH_PIC([no])])
+
+# Old name:
+AU_DEFUN([AC_LIBTOOL_PICMODE],
+[_LT_SET_OPTION([LT_INIT], [pic-only])
+AC_DIAGNOSE([obsolete],
+[$0: Remove this warning and the call to _LT_SET_OPTION when you
+put the `pic-only' option into LT_INIT's first parameter.])
+])
+
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LIBTOOL_PICMODE], [])
+
+## ----------------- ##
+## LTDL_INIT Options ##
+## ----------------- ##
+
+m4_define([_LTDL_MODE], [])
+LT_OPTION_DEFINE([LTDL_INIT], [nonrecursive],
+		 [m4_define([_LTDL_MODE], [nonrecursive])])
+LT_OPTION_DEFINE([LTDL_INIT], [recursive],
+		 [m4_define([_LTDL_MODE], [recursive])])
+LT_OPTION_DEFINE([LTDL_INIT], [subproject],
+		 [m4_define([_LTDL_MODE], [subproject])])
+
+m4_define([_LTDL_TYPE], [])
+LT_OPTION_DEFINE([LTDL_INIT], [installable],
+		 [m4_define([_LTDL_TYPE], [installable])])
+LT_OPTION_DEFINE([LTDL_INIT], [convenience],
+		 [m4_define([_LTDL_TYPE], [convenience])])
diff --git a/m4/ltsugar.m4 b/m4/ltsugar.m4
new file mode 100644
index 0000000..9000a05
--- /dev/null
+++ b/m4/ltsugar.m4
@@ -0,0 +1,123 @@
+# ltsugar.m4 -- libtool m4 base layer.                         -*-Autoconf-*-
+#
+# Copyright (C) 2004, 2005, 2007, 2008 Free Software Foundation, Inc.
+# Written by Gary V. Vaughan, 2004
+#
+# This file is free software; the Free Software Foundation gives
+# unlimited permission to copy and/or distribute it, with or without
+# modifications, as long as this notice is preserved.
+
+# serial 6 ltsugar.m4
+
+# This is to help aclocal find these macros, as it can't see m4_define.
+AC_DEFUN([LTSUGAR_VERSION], [m4_if([0.1])])
+
+
+# lt_join(SEP, ARG1, [ARG2...])
+# -----------------------------
+# Produce ARG1SEPARG2...SEPARGn, omitting [] arguments and their
+# associated separator.
+# Needed until we can rely on m4_join from Autoconf 2.62, since all earlier
+# versions in m4sugar had bugs.
+m4_define([lt_join],
+[m4_if([$#], [1], [],
+       [$#], [2], [[$2]],
+       [m4_if([$2], [], [], [[$2]_])$0([$1], m4_shift(m4_shift($@)))])])
+m4_define([_lt_join],
+[m4_if([$#$2], [2], [],
+       [m4_if([$2], [], [], [[$1$2]])$0([$1], m4_shift(m4_shift($@)))])])
+
+
+# lt_car(LIST)
+# lt_cdr(LIST)
+# ------------
+# Manipulate m4 lists.
+# These macros are necessary as long as will still need to support
+# Autoconf-2.59 which quotes differently.
+m4_define([lt_car], [[$1]])
+m4_define([lt_cdr],
+[m4_if([$#], 0, [m4_fatal([$0: cannot be called without arguments])],
+       [$#], 1, [],
+       [m4_dquote(m4_shift($@))])])
+m4_define([lt_unquote], $1)
+
+
+# lt_append(MACRO-NAME, STRING, [SEPARATOR])
+# ------------------------------------------
+# Redefine MACRO-NAME to hold its former content plus `SEPARATOR'`STRING'.
+# Note that neither SEPARATOR nor STRING are expanded; they are appended
+# to MACRO-NAME as is (leaving the expansion for when MACRO-NAME is invoked).
+# No SEPARATOR is output if MACRO-NAME was previously undefined (different
+# than defined and empty).
+#
+# This macro is needed until we can rely on Autoconf 2.62, since earlier
+# versions of m4sugar mistakenly expanded SEPARATOR but not STRING.
+m4_define([lt_append],
+[m4_define([$1],
+	   m4_ifdef([$1], [m4_defn([$1])[$3]])[$2])])
+
+
+
+# lt_combine(SEP, PREFIX-LIST, INFIX, SUFFIX1, [SUFFIX2...])
+# ----------------------------------------------------------
+# Produce a SEP delimited list of all paired combinations of elements of
+# PREFIX-LIST with SUFFIX1 through SUFFIXn.  Each element of the list
+# has the form PREFIXmINFIXSUFFIXn.
+# Needed until we can rely on m4_combine added in Autoconf 2.62.
+m4_define([lt_combine],
+[m4_if(m4_eval([$# > 3]), [1],
+       [m4_pushdef([_Lt_sep], [m4_define([_Lt_sep], m4_defn([lt_car]))])]]dnl
+[[m4_foreach([_Lt_prefix], [$2],
+	     [m4_foreach([_Lt_suffix],
+		]m4_dquote(m4_dquote(m4_shift(m4_shift(m4_shift($@)))))[,
+	[_Lt_sep([$1])[]m4_defn([_Lt_prefix])[$3]m4_defn([_Lt_suffix])])])])])
+
+
+# lt_if_append_uniq(MACRO-NAME, VARNAME, [SEPARATOR], [UNIQ], [NOT-UNIQ])
+# -----------------------------------------------------------------------
+# Iff MACRO-NAME does not yet contain VARNAME, then append it (delimited
+# by SEPARATOR if supplied) and expand UNIQ, else NOT-UNIQ.
+m4_define([lt_if_append_uniq],
+[m4_ifdef([$1],
+	  [m4_if(m4_index([$3]m4_defn([$1])[$3], [$3$2$3]), [-1],
+		 [lt_append([$1], [$2], [$3])$4],
+		 [$5])],
+	  [lt_append([$1], [$2], [$3])$4])])
+
+
+# lt_dict_add(DICT, KEY, VALUE)
+# -----------------------------
+m4_define([lt_dict_add],
+[m4_define([$1($2)], [$3])])
+
+
+# lt_dict_add_subkey(DICT, KEY, SUBKEY, VALUE)
+# --------------------------------------------
+m4_define([lt_dict_add_subkey],
+[m4_define([$1($2:$3)], [$4])])
+
+
+# lt_dict_fetch(DICT, KEY, [SUBKEY])
+# ----------------------------------
+m4_define([lt_dict_fetch],
+[m4_ifval([$3],
+	m4_ifdef([$1($2:$3)], [m4_defn([$1($2:$3)])]),
+    m4_ifdef([$1($2)], [m4_defn([$1($2)])]))])
+
+
+# lt_if_dict_fetch(DICT, KEY, [SUBKEY], VALUE, IF-TRUE, [IF-FALSE])
+# -----------------------------------------------------------------
+m4_define([lt_if_dict_fetch],
+[m4_if(lt_dict_fetch([$1], [$2], [$3]), [$4],
+	[$5],
+    [$6])])
+
+
+# lt_dict_filter(DICT, [SUBKEY], VALUE, [SEPARATOR], KEY, [...])
+# --------------------------------------------------------------
+m4_define([lt_dict_filter],
+[m4_if([$5], [], [],
+  [lt_join(m4_quote(m4_default([$4], [[, ]])),
+           lt_unquote(m4_split(m4_normalize(m4_foreach(_Lt_key, lt_car([m4_shiftn(4, $@)]),
+		      [lt_if_dict_fetch([$1], _Lt_key, [$2], [$3], [_Lt_key ])])))))])[]dnl
+])
diff --git a/m4/ltversion.m4 b/m4/ltversion.m4
new file mode 100644
index 0000000..07a8602
--- /dev/null
+++ b/m4/ltversion.m4
@@ -0,0 +1,23 @@
+# ltversion.m4 -- version numbers			-*- Autoconf -*-
+#
+#   Copyright (C) 2004 Free Software Foundation, Inc.
+#   Written by Scott James Remnant, 2004
+#
+# This file is free software; the Free Software Foundation gives
+# unlimited permission to copy and/or distribute it, with or without
+# modifications, as long as this notice is preserved.
+
+# @configure_input@
+
+# serial 3337 ltversion.m4
+# This file is part of GNU Libtool
+
+m4_define([LT_PACKAGE_VERSION], [2.4.2])
+m4_define([LT_PACKAGE_REVISION], [1.3337])
+
+AC_DEFUN([LTVERSION_VERSION],
+[macro_version='2.4.2'
+macro_revision='1.3337'
+_LT_DECL(, macro_version, 0, [Which release of libtool.m4 was used?])
+_LT_DECL(, macro_revision, 0)
+])
diff --git a/m4/lt~obsolete.m4 b/m4/lt~obsolete.m4
new file mode 100644
index 0000000..c573da9
--- /dev/null
+++ b/m4/lt~obsolete.m4
@@ -0,0 +1,98 @@
+# lt~obsolete.m4 -- aclocal satisfying obsolete definitions.    -*-Autoconf-*-
+#
+#   Copyright (C) 2004, 2005, 2007, 2009 Free Software Foundation, Inc.
+#   Written by Scott James Remnant, 2004.
+#
+# This file is free software; the Free Software Foundation gives
+# unlimited permission to copy and/or distribute it, with or without
+# modifications, as long as this notice is preserved.
+
+# serial 5 lt~obsolete.m4
+
+# These exist entirely to fool aclocal when bootstrapping libtool.
+#
+# In the past libtool.m4 has provided macros via AC_DEFUN (or AU_DEFUN)
+# which have later been changed to m4_define as they aren't part of the
+# exported API, or moved to Autoconf or Automake where they belong.
+#
+# The trouble is, aclocal is a bit thick.  It'll see the old AC_DEFUN
+# in /usr/share/aclocal/libtool.m4 and remember it, then when it sees us
+# using a macro with the same name in our local m4/libtool.m4 it'll
+# pull the old libtool.m4 in (it doesn't see our shiny new m4_define
+# and doesn't know about Autoconf macros at all.)
+#
+# So we provide this file, which has a silly filename so it's always
+# included after everything else.  This provides aclocal with the
+# AC_DEFUNs it wants, but when m4 processes it, it doesn't do anything
+# because those macros already exist, or will be overwritten later.
+# We use AC_DEFUN over AU_DEFUN for compatibility with aclocal-1.6. 
+#
+# Anytime we withdraw an AC_DEFUN or AU_DEFUN, remember to add it here.
+# Yes, that means every name once taken will need to remain here until
+# we give up compatibility with versions before 1.7, at which point
+# we need to keep only those names which we still refer to.
+
+# This is to help aclocal find these macros, as it can't see m4_define.
+AC_DEFUN([LTOBSOLETE_VERSION], [m4_if([1])])
+
+m4_ifndef([AC_LIBTOOL_LINKER_OPTION],	[AC_DEFUN([AC_LIBTOOL_LINKER_OPTION])])
+m4_ifndef([AC_PROG_EGREP],		[AC_DEFUN([AC_PROG_EGREP])])
+m4_ifndef([_LT_AC_PROG_ECHO_BACKSLASH],	[AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH])])
+m4_ifndef([_LT_AC_SHELL_INIT],		[AC_DEFUN([_LT_AC_SHELL_INIT])])
+m4_ifndef([_LT_AC_SYS_LIBPATH_AIX],	[AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX])])
+m4_ifndef([_LT_PROG_LTMAIN],		[AC_DEFUN([_LT_PROG_LTMAIN])])
+m4_ifndef([_LT_AC_TAGVAR],		[AC_DEFUN([_LT_AC_TAGVAR])])
+m4_ifndef([AC_LTDL_ENABLE_INSTALL],	[AC_DEFUN([AC_LTDL_ENABLE_INSTALL])])
+m4_ifndef([AC_LTDL_PREOPEN],		[AC_DEFUN([AC_LTDL_PREOPEN])])
+m4_ifndef([_LT_AC_SYS_COMPILER],	[AC_DEFUN([_LT_AC_SYS_COMPILER])])
+m4_ifndef([_LT_AC_LOCK],		[AC_DEFUN([_LT_AC_LOCK])])
+m4_ifndef([AC_LIBTOOL_SYS_OLD_ARCHIVE],	[AC_DEFUN([AC_LIBTOOL_SYS_OLD_ARCHIVE])])
+m4_ifndef([_LT_AC_TRY_DLOPEN_SELF],	[AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF])])
+m4_ifndef([AC_LIBTOOL_PROG_CC_C_O],	[AC_DEFUN([AC_LIBTOOL_PROG_CC_C_O])])
+m4_ifndef([AC_LIBTOOL_SYS_HARD_LINK_LOCKS], [AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS])])
+m4_ifndef([AC_LIBTOOL_OBJDIR],		[AC_DEFUN([AC_LIBTOOL_OBJDIR])])
+m4_ifndef([AC_LTDL_OBJDIR],		[AC_DEFUN([AC_LTDL_OBJDIR])])
+m4_ifndef([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH], [AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH])])
+m4_ifndef([AC_LIBTOOL_SYS_LIB_STRIP],	[AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP])])
+m4_ifndef([AC_PATH_MAGIC],		[AC_DEFUN([AC_PATH_MAGIC])])
+m4_ifndef([AC_PROG_LD_GNU],		[AC_DEFUN([AC_PROG_LD_GNU])])
+m4_ifndef([AC_PROG_LD_RELOAD_FLAG],	[AC_DEFUN([AC_PROG_LD_RELOAD_FLAG])])
+m4_ifndef([AC_DEPLIBS_CHECK_METHOD],	[AC_DEFUN([AC_DEPLIBS_CHECK_METHOD])])
+m4_ifndef([AC_LIBTOOL_PROG_COMPILER_NO_RTTI], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI])])
+m4_ifndef([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE], [AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE])])
+m4_ifndef([AC_LIBTOOL_PROG_COMPILER_PIC], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_PIC])])
+m4_ifndef([AC_LIBTOOL_PROG_LD_SHLIBS],	[AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS])])
+m4_ifndef([AC_LIBTOOL_POSTDEP_PREDEP],	[AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP])])
+m4_ifndef([LT_AC_PROG_EGREP],		[AC_DEFUN([LT_AC_PROG_EGREP])])
+m4_ifndef([LT_AC_PROG_SED],		[AC_DEFUN([LT_AC_PROG_SED])])
+m4_ifndef([_LT_CC_BASENAME],		[AC_DEFUN([_LT_CC_BASENAME])])
+m4_ifndef([_LT_COMPILER_BOILERPLATE],	[AC_DEFUN([_LT_COMPILER_BOILERPLATE])])
+m4_ifndef([_LT_LINKER_BOILERPLATE],	[AC_DEFUN([_LT_LINKER_BOILERPLATE])])
+m4_ifndef([_AC_PROG_LIBTOOL],		[AC_DEFUN([_AC_PROG_LIBTOOL])])
+m4_ifndef([AC_LIBTOOL_SETUP],		[AC_DEFUN([AC_LIBTOOL_SETUP])])
+m4_ifndef([_LT_AC_CHECK_DLFCN],		[AC_DEFUN([_LT_AC_CHECK_DLFCN])])
+m4_ifndef([AC_LIBTOOL_SYS_DYNAMIC_LINKER],	[AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER])])
+m4_ifndef([_LT_AC_TAGCONFIG],		[AC_DEFUN([_LT_AC_TAGCONFIG])])
+m4_ifndef([AC_DISABLE_FAST_INSTALL],	[AC_DEFUN([AC_DISABLE_FAST_INSTALL])])
+m4_ifndef([_LT_AC_LANG_CXX],		[AC_DEFUN([_LT_AC_LANG_CXX])])
+m4_ifndef([_LT_AC_LANG_F77],		[AC_DEFUN([_LT_AC_LANG_F77])])
+m4_ifndef([_LT_AC_LANG_GCJ],		[AC_DEFUN([_LT_AC_LANG_GCJ])])
+m4_ifndef([AC_LIBTOOL_LANG_C_CONFIG],	[AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG])])
+m4_ifndef([_LT_AC_LANG_C_CONFIG],	[AC_DEFUN([_LT_AC_LANG_C_CONFIG])])
+m4_ifndef([AC_LIBTOOL_LANG_CXX_CONFIG],	[AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG])])
+m4_ifndef([_LT_AC_LANG_CXX_CONFIG],	[AC_DEFUN([_LT_AC_LANG_CXX_CONFIG])])
+m4_ifndef([AC_LIBTOOL_LANG_F77_CONFIG],	[AC_DEFUN([AC_LIBTOOL_LANG_F77_CONFIG])])
+m4_ifndef([_LT_AC_LANG_F77_CONFIG],	[AC_DEFUN([_LT_AC_LANG_F77_CONFIG])])
+m4_ifndef([AC_LIBTOOL_LANG_GCJ_CONFIG],	[AC_DEFUN([AC_LIBTOOL_LANG_GCJ_CONFIG])])
+m4_ifndef([_LT_AC_LANG_GCJ_CONFIG],	[AC_DEFUN([_LT_AC_LANG_GCJ_CONFIG])])
+m4_ifndef([AC_LIBTOOL_LANG_RC_CONFIG],	[AC_DEFUN([AC_LIBTOOL_LANG_RC_CONFIG])])
+m4_ifndef([_LT_AC_LANG_RC_CONFIG],	[AC_DEFUN([_LT_AC_LANG_RC_CONFIG])])
+m4_ifndef([AC_LIBTOOL_CONFIG],		[AC_DEFUN([AC_LIBTOOL_CONFIG])])
+m4_ifndef([_LT_AC_FILE_LTDLL_C],	[AC_DEFUN([_LT_AC_FILE_LTDLL_C])])
+m4_ifndef([_LT_REQUIRED_DARWIN_CHECKS],	[AC_DEFUN([_LT_REQUIRED_DARWIN_CHECKS])])
+m4_ifndef([_LT_AC_PROG_CXXCPP],		[AC_DEFUN([_LT_AC_PROG_CXXCPP])])
+m4_ifndef([_LT_PREPARE_SED_QUOTE_VARS],	[AC_DEFUN([_LT_PREPARE_SED_QUOTE_VARS])])
+m4_ifndef([_LT_PROG_ECHO_BACKSLASH],	[AC_DEFUN([_LT_PROG_ECHO_BACKSLASH])])
+m4_ifndef([_LT_PROG_F77],		[AC_DEFUN([_LT_PROG_F77])])
+m4_ifndef([_LT_PROG_FC],		[AC_DEFUN([_LT_PROG_FC])])
+m4_ifndef([_LT_PROG_CXX],		[AC_DEFUN([_LT_PROG_CXX])])
diff --git a/missing b/missing
new file mode 100755
index 0000000..db98974
--- /dev/null
+++ b/missing
@@ -0,0 +1,215 @@
+#! /bin/sh
+# Common wrapper for a few potentially missing GNU programs.
+
+scriptversion=2013-10-28.13; # UTC
+
+# Copyright (C) 1996-2013 Free Software Foundation, Inc.
+# Originally written by Fran,cois Pinard <pinard at iro.umontreal.ca>, 1996.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+if test $# -eq 0; then
+  echo 1>&2 "Try '$0 --help' for more information"
+  exit 1
+fi
+
+case $1 in
+
+  --is-lightweight)
+    # Used by our autoconf macros to check whether the available missing
+    # script is modern enough.
+    exit 0
+    ;;
+
+  --run)
+    # Back-compat with the calling convention used by older automake.
+    shift
+    ;;
+
+  -h|--h|--he|--hel|--help)
+    echo "\
+$0 [OPTION]... PROGRAM [ARGUMENT]...
+
+Run 'PROGRAM [ARGUMENT]...', returning a proper advice when this fails due
+to PROGRAM being missing or too old.
+
+Options:
+  -h, --help      display this help and exit
+  -v, --version   output version information and exit
+
+Supported PROGRAM values:
+  aclocal   autoconf  autoheader   autom4te  automake  makeinfo
+  bison     yacc      flex         lex       help2man
+
+Version suffixes to PROGRAM as well as the prefixes 'gnu-', 'gnu', and
+'g' are ignored when checking the name.
+
+Send bug reports to <bug-automake at gnu.org>."
+    exit $?
+    ;;
+
+  -v|--v|--ve|--ver|--vers|--versi|--versio|--version)
+    echo "missing $scriptversion (GNU Automake)"
+    exit $?
+    ;;
+
+  -*)
+    echo 1>&2 "$0: unknown '$1' option"
+    echo 1>&2 "Try '$0 --help' for more information"
+    exit 1
+    ;;
+
+esac
+
+# Run the given program, remember its exit status.
+"$@"; st=$?
+
+# If it succeeded, we are done.
+test $st -eq 0 && exit 0
+
+# Also exit now if we it failed (or wasn't found), and '--version' was
+# passed; such an option is passed most likely to detect whether the
+# program is present and works.
+case $2 in --version|--help) exit $st;; esac
+
+# Exit code 63 means version mismatch.  This often happens when the user
+# tries to use an ancient version of a tool on a file that requires a
+# minimum version.
+if test $st -eq 63; then
+  msg="probably too old"
+elif test $st -eq 127; then
+  # Program was missing.
+  msg="missing on your system"
+else
+  # Program was found and executed, but failed.  Give up.
+  exit $st
+fi
+
+perl_URL=http://www.perl.org/
+flex_URL=http://flex.sourceforge.net/
+gnu_software_URL=http://www.gnu.org/software
+
+program_details ()
+{
+  case $1 in
+    aclocal|automake)
+      echo "The '$1' program is part of the GNU Automake package:"
+      echo "<$gnu_software_URL/automake>"
+      echo "It also requires GNU Autoconf, GNU m4 and Perl in order to run:"
+      echo "<$gnu_software_URL/autoconf>"
+      echo "<$gnu_software_URL/m4/>"
+      echo "<$perl_URL>"
+      ;;
+    autoconf|autom4te|autoheader)
+      echo "The '$1' program is part of the GNU Autoconf package:"
+      echo "<$gnu_software_URL/autoconf/>"
+      echo "It also requires GNU m4 and Perl in order to run:"
+      echo "<$gnu_software_URL/m4/>"
+      echo "<$perl_URL>"
+      ;;
+  esac
+}
+
+give_advice ()
+{
+  # Normalize program name to check for.
+  normalized_program=`echo "$1" | sed '
+    s/^gnu-//; t
+    s/^gnu//; t
+    s/^g//; t'`
+
+  printf '%s\n' "'$1' is $msg."
+
+  configure_deps="'configure.ac' or m4 files included by 'configure.ac'"
+  case $normalized_program in
+    autoconf*)
+      echo "You should only need it if you modified 'configure.ac',"
+      echo "or m4 files included by it."
+      program_details 'autoconf'
+      ;;
+    autoheader*)
+      echo "You should only need it if you modified 'acconfig.h' or"
+      echo "$configure_deps."
+      program_details 'autoheader'
+      ;;
+    automake*)
+      echo "You should only need it if you modified 'Makefile.am' or"
+      echo "$configure_deps."
+      program_details 'automake'
+      ;;
+    aclocal*)
+      echo "You should only need it if you modified 'acinclude.m4' or"
+      echo "$configure_deps."
+      program_details 'aclocal'
+      ;;
+   autom4te*)
+      echo "You might have modified some maintainer files that require"
+      echo "the 'autom4te' program to be rebuilt."
+      program_details 'autom4te'
+      ;;
+    bison*|yacc*)
+      echo "You should only need it if you modified a '.y' file."
+      echo "You may want to install the GNU Bison package:"
+      echo "<$gnu_software_URL/bison/>"
+      ;;
+    lex*|flex*)
+      echo "You should only need it if you modified a '.l' file."
+      echo "You may want to install the Fast Lexical Analyzer package:"
+      echo "<$flex_URL>"
+      ;;
+    help2man*)
+      echo "You should only need it if you modified a dependency" \
+           "of a man page."
+      echo "You may want to install the GNU Help2man package:"
+      echo "<$gnu_software_URL/help2man/>"
+    ;;
+    makeinfo*)
+      echo "You should only need it if you modified a '.texi' file, or"
+      echo "any other file indirectly affecting the aspect of the manual."
+      echo "You might want to install the Texinfo package:"
+      echo "<$gnu_software_URL/texinfo/>"
+      echo "The spurious makeinfo call might also be the consequence of"
+      echo "using a buggy 'make' (AIX, DU, IRIX), in which case you might"
+      echo "want to install GNU make:"
+      echo "<$gnu_software_URL/make/>"
+      ;;
+    *)
+      echo "You might have modified some files without having the proper"
+      echo "tools for further handling them.  Check the 'README' file, it"
+      echo "often tells you about the needed prerequisites for installing"
+      echo "this package.  You may also peek at any GNU archive site, in"
+      echo "case some other package contains this missing '$1' program."
+      ;;
+  esac
+}
+
+give_advice "$1" | sed -e '1s/^/WARNING: /' \
+                       -e '2,$s/^/         /' >&2
+
+# Propagate the correct exit status (expected to be 127 for a program
+# not found, 63 for a program that failed due to version mismatch).
+exit $st
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-time-zone: "UTC"
+# time-stamp-end: "; # UTC"
+# End:
diff --git a/netcdf-fortran.pc.in b/netcdf-fortran.pc.in
new file mode 100644
index 0000000..fb48a42
--- /dev/null
+++ b/netcdf-fortran.pc.in
@@ -0,0 +1,15 @@
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+libdir=@libdir@
+includedir=@includedir@
+ccompiler=@CC@
+fcompiler=@FC@
+
+Name: @PACKAGE@
+Description: NetCDF Client Library for Fortran
+URL: http://www.unidata.ucar.edu/netcdf
+Version: @PACKAGE_VERSION@
+Requires.private: netcdf > 4.1.1
+Libs: -L${libdir} -lnetcdff
+Libs.private: -L${libdir} -lnetcdff -lnetcdf
+Cflags: -I${includedir}
diff --git a/nf-config.cmake.in b/nf-config.cmake.in
new file mode 100644
index 0000000..8755fe7
--- /dev/null
+++ b/nf-config.cmake.in
@@ -0,0 +1,162 @@
+#! /bin/sh
+#
+# This forms the basis for the nf-config utility, which tells you
+# various things about the netCDF Fortran installation.
+
+echo "nf-config not yet implemented for cmake builds"
+exit 1
+
+# prefix=@CMAKE_INSTALL_PREFIX@
+# exec_prefix=@CMAKE_INSTALL_PREFIX@
+# libdir=@CMAKE_INSTALL_PREFIX@/lib
+# includedir=@CMAKE_INSTALL_PREFIX@/include
+# 
+# cc="@CMAKE_C_COMPILER@"
+# fc="@CMAKE_FORTRAN_COMPILER@"
+# cflags="-I at CMAKE_INSTALL_PREFIX@/include @CMAKE_C_FLAGS@ @CMAKE_CPP_FLAGS@"
+# fflags="@MOD_FLAG@${includedir}"
+# 
+# has_dap="@HAS_DAP@"
+# has_nc2="@HAS_NC2@"
+# has_nc4="@HAS_NC4@"
+# has_f90="@HAS_F90@"
+# has_f03="@HAS_F03@"
+# flibs="-L${libdir} @NC_FLIBS@"
+# version="@PACKAGE_NAME@ @PACKAGE_VERSION@"
+# 
+# usage()
+# {
+#     cat <<EOF
+# Usage: nf-config [OPTION]
+# 
+# Available values for OPTION include:
+# 
+#   --help        display this help message and exit
+#   --all         display all options
+#   --cc          C compiler
+#   --fc          Fortran compiler
+#   --cflags      pre-processor and compiler flags
+#   --fflags      flags needed to compile a Fortran program
+#   --has-dap     whether OPeNDAP is enabled in this build
+#   --has-nc2     whether NetCDF-2 API is enabled
+#   --has-nc4     whether NetCDF-4/HDF-5 is enabled in this build
+#   --has-f90     whether Fortran 90 API is enabled in this build
+#   --has-f03     whether Fortran 2003 API is enabled in this build
+#   --flibs       libraries needed to link a Fortran program
+#   --prefix      Install prefix
+#   --includedir  Include directory
+#   --version     Library version
+# 
+# EOF
+# 
+#     exit $1
+# }
+# 
+# all()
+# {
+#         echo
+#         echo "This $version has been built with the following features: "
+#         echo
+#         echo "  --cc        -> $cc"
+#         echo "  --cflags    -> $cflags"
+#         echo
+#         echo "  --fc        -> $fc"
+#         echo "  --fflags    -> $fflags"
+#         echo "  --flibs     -> $flibs"
+#         echo "  --has-f90   -> $has_f90"
+#         echo "  --has-f03   -> $has_f03"
+#         echo
+#         echo "  --has-nc2   -> $has_nc2"
+#         echo "  --has-nc4   -> $has_nc4"
+# 	echo
+#         echo "  --prefix    -> $prefix"
+#         echo "  --includedir-> $includedir"
+#         echo "  --version   -> $version"
+#         echo
+# }
+# 
+# if test $# -eq 0; then
+#     usage 1
+# fi
+# 
+# while test $# -gt 0; do
+#     case "$1" in
+#     # this deals with options in the style
+#     # --option=value and extracts the value part
+#     # [not currently used]
+#     -*=*) value=`echo "$1" | sed 's/[-_a-zA-Z0-9]*=//'` ;;
+#     *) value= ;;
+#     esac
+# 
+#     case "$1" in
+# 
+#     --help)
+# 	usage 0
+# 	;;
+# 
+#     --all)
+# 	all
+# 	;;
+# 
+#     --cc)
+# 	echo $cc
+# 	;;
+# 
+#     --fc)
+# 	echo $fc
+# 	;;
+# 
+#     --cflags)
+# 	echo $cflags
+# 	;;
+# 
+#     --fflags)
+# 	echo $fflags
+# 	;;
+# 
+#     --has-dap)
+#        	echo $has_dap
+#        	;;
+# 
+#     --has-nc2)
+#        	echo $has_nc2
+#        	;;
+# 
+#     --has-nc4)
+#        	echo $has_nc4
+#        	;;
+# 
+#     --has-f90)
+#        	echo $has_f90
+#        	;;
+# 
+#     --has-f03)
+#        	echo $has_f03
+#        	;;
+# 
+#     --flibs)
+#        	echo $flibs
+#        	;;
+# 
+#     --prefix)
+#        	echo "${CMAKE_INSTALL_PREFIX}"
+#        	;;
+# 
+#     --includedir)
+#        	echo "${includedir}"
+#        	;;
+# 
+#     --version)
+# 	echo $version
+# 	;;
+# 
+#     *)
+#         echo "unknown option: $1"
+# 	usage
+# 	exit 1
+# 	;;
+#     esac
+#     shift
+# done
+# 
+# exit 0
diff --git a/nf-config.in b/nf-config.in
new file mode 100644
index 0000000..b9df2c9
--- /dev/null
+++ b/nf-config.in
@@ -0,0 +1,158 @@
+#! /bin/sh
+#
+# This forms the basis for the nf-config utility, which tells you
+# various things about the netCDF fortran installation.
+
+prefix=@prefix@
+exec_prefix=${prefix}
+libdir=${exec_prefix}/lib
+includedir=${prefix}/include
+
+cc="@CC@"
+fc="@FC@"
+cflags=" -I${includedir} @CPPFLAGS@" 
+fflags="@MOD_FLAG@${includedir}"
+has_dap="@HAS_DAP@"
+has_nc2="@HAS_NC2@"
+has_nc4="@HAS_NC4@"
+has_f90="@HAS_F90@"
+has_f03="@HAS_F03@"
+flibs="-L${libdir} @NC_FLIBS@"
+version="@PACKAGE_NAME@ @PACKAGE_VERSION@"
+
+usage()
+{
+    cat <<EOF
+Usage: nf-config [OPTION]
+
+Available values for OPTION include:
+
+  --help        display this help message and exit
+  --all         display all options
+  --cc          C compiler
+  --fc          Fortran compiler
+  --cflags      pre-processor and compiler flags
+  --fflags      flags needed to compile a Fortran program
+  --has-dap     whether OPeNDAP is enabled in this build
+  --has-nc2     whether NetCDF-2 API is enabled
+  --has-nc4     whether NetCDF-4/HDF-5 is enabled in this build
+  --has-f90     whether Fortran 90 API is enabled in this build
+  --has-f03     whether Fortran 2003 API is enabled in this build
+  --flibs       libraries needed to link a Fortran program
+  --prefix      Install prefix
+  --includedir  Include directory
+  --version     Library version
+
+EOF
+
+    exit $1
+}
+
+all()
+{
+        echo
+        echo "This $version has been built with the following features: "
+        echo
+        echo "  --cc        -> $cc"
+        echo "  --cflags    -> $cflags"
+        echo
+        echo "  --fc        -> $fc"
+        echo "  --fflags    -> $fflags"
+        echo "  --flibs     -> $flibs"
+        echo "  --has-f90   -> $has_f90"
+        echo "  --has-f03   -> $has_f03"
+        echo
+        echo "  --has-nc2   -> $has_nc2"
+        echo "  --has-nc4   -> $has_nc4"
+	echo
+        echo "  --prefix    -> $prefix"
+        echo "  --includedir-> $includedir"
+        echo "  --version   -> $version"
+        echo
+}
+
+if test $# -eq 0; then
+    usage 1
+fi
+
+while test $# -gt 0; do
+    case "$1" in
+    # this deals with options in the style
+    # --option=value and extracts the value part
+    # [not currently used]
+    -*=*) value=`echo "$1" | sed 's/[-_a-zA-Z0-9]*=//'` ;;
+    *) value= ;;
+    esac
+
+    case "$1" in
+
+    --help)
+	usage 0
+	;;
+
+    --all)
+	all
+	;;
+
+    --cc)
+	echo $cc
+	;;
+
+    --fc)
+	echo $fc
+	;;
+
+    --cflags)
+	echo $cflags
+	;;
+
+    --fflags)
+	echo $fflags
+	;;
+
+    --has-dap)
+       	echo $has_dap
+       	;;
+
+    --has-nc2)
+       	echo $has_nc2
+       	;;
+
+    --has-nc4)
+       	echo $has_nc4
+       	;;
+
+    --has-f90)
+       	echo $has_f90
+       	;;
+
+    --has-f03)
+       	echo $has_f03
+       	;;
+
+    --flibs)
+       	echo $flibs
+       	;;
+
+    --prefix)
+       	echo "${prefix}"
+       	;;
+
+    --includedir)
+       	echo "${includedir}"
+       	;;
+
+    --version)
+	echo $version
+	;;
+
+    *)
+        echo "unknown option: $1"
+	usage
+	exit 1
+	;;
+    esac
+    shift
+done
+
+exit 0
diff --git a/nf03_test/CMakeLists.txt b/nf03_test/CMakeLists.txt
new file mode 100644
index 0000000..339df96
--- /dev/null
+++ b/nf03_test/CMakeLists.txt
@@ -0,0 +1,103 @@
+SET(CMAKE_VERBOSE_MAKEFILE ON)
+SET(CMAKE_BUILD_TYPE "RelWithDebInfo")
+SET(CMAKE_INCLUDE_CURRENT_DIR ON)
+
+SET(TESTS)
+
+# Need some stuff from ../nf_test
+INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/nf_test ${NC4F_BINARY_DIR}/libsrc
+   ${NC4F_BINARY_DIR}/fortran)
+# All tests need to link to fortran and C libraries.
+LINK_DIRECTORIES(${CMAKE_SOURCE_DIR}/fortran)
+#FIND_LIBRARY(NETCDF_C_LIBRARY NAMES netcdf libnetcdf)
+#IF(NOT NETCDF_C_LIBRARY)
+#  MESSAGE(FATAL_ERROR "Cannot find netCDF C library, needed for netCDF Fortran tests.")
+#ENDIF()
+#FIND_PATH(NETCDF_C_INCLUDE_DIR netcdf.h)
+
+# nf03_test is the main test program.
+SET(check_PROGRAMS nf03_test)
+LIST(APPEND TESTS nf03_test)
+SET(nf03_test_SOURCES module_tests.F90 f03lib_f_interfaces.f90 test03_get.F test03_put.F nf03_error.F
+  nf03_test.F test03_read.F test03_write.F util03.F f03lib.c)
+
+IF(USE_NETCDF4)
+  LIST(APPEND check_PROGRAMS f03tst_vars f03tst_vars2 f03tst_vars3 f03tst_vars4 f03tst_vars5
+    f03tst_vars6 f03tst_types f03tst_types2 f03tst_types3 f03tst_groups)
+  SET(f03tst_types_SOURCES module_tests.F90 f03tst_types.F f03lib_f_interfaces.f90 f03lib.c handle_err.F)
+  SET(f03tst_types2_SOURCES module_tests.F90 f03tst_types2.F f03lib_f_interfaces.f90 f03lib.c handle_err.F)
+  SET(f03tst_types3_SOURCES module_tests.F90 f03tst_types3.F f03lib_f_interfaces.f90 f03lib.c handle_err.F)
+  SET(f03tst_vars_SOURCES module_tests.F90 f03tst_vars.F f03lib_f_interfaces.f90 f03lib.c handle_err.F)
+  SET(f03tst_vars2_SOURCES module_tests.F90 f03tst_vars2.F f03lib_f_interfaces.f90 f03lib.c handle_err.F)
+  SET(f03tst_vars3_SOURCES module_tests.F90 f03tst_vars3.F f03lib_f_interfaces.f90 f03lib.c handle_err.F)
+  SET(f03tst_vars4_SOURCES module_tests.F90 f03tst_vars4.F f03lib_f_interfaces.f90 f03lib.c handle_err.F)
+  SET(f03tst_vars5_SOURCES module_tests.F90 f03tst_vars5.F f03lib_f_interfaces.f90 f03lib.c handle_err.F)
+  SET(f03tst_vars6_SOURCES module_tests.F90 f03tst_vars6.F f03lib_f_interfaces.f90 f03lib.c handle_err.F)
+  SET(f03tst_groups_SOURCES module_tests.F90 f03tst_groups.F f03lib_f_interfaces.f90 f03lib.c handle_err.F)
+  LIST(APPEND TESTS f03tst_vars f03tst_vars2 f03tst_vars3 f03tst_vars4 f03tst_vars5
+    f03tst_vars6 f03tst_types f03tst_types2 f03tst_types3 f03tst_groups)
+  LIST(APPEND CLEANFILES ftst_vars.nc ftst_vars2.nc ftst_vars3.nc ftst_vars4.nc
+    ftst_vars5.nc ftst_vars6.nc ftst_types.nc ftst_types2.nc ftst_types3.nc ftst_groups.nc)
+
+  # This is a netCDF-4 V2 test program.
+  IF(BUILD_V2)
+    LIST(APPEND check_PROGRAMS f03tst_v2)
+    LIST(APPEND TESTS f03tst_v2)
+    LIST(APPEND CLEANFILES ftst_v2.nc)
+    SET(f03tst_v2_SOURCES f03tst_v2.F)
+  ENDIF(BUILD_V2)
+
+  # Test parallel I/O
+  IF(TEST_PARALLEL)
+    LIST(APPEND check_PROGRAMS f03tst_parallel)
+    LIST(APPEND CLEANFILES ftst_parallel.nc)
+    SET(f03tst_parallel_SOURCES f03tst_parallel.F)
+  ENDIF(TEST_PARALLEL)
+ENDIF(USE_NETCDF4)
+
+# This is the fortran v2 test. It depends on the utilities being built
+# to generate it's input file.
+IF(BUILD_V2)
+  LIST(APPEND check_PROGRAMS f03test)
+  LIST(APPEND TESTS f03test)
+  LIST(APPEND CLEANFILES test.nc)
+  SET(f03test_SOURCES module_tests.F90 f03test.F f03lib.c)
+ENDIF(BUILD_V2)
+
+LIST(APPEND CLEANFILES tests.mod)
+
+# test03_get.F and test03_put.f need to be distributed, so that the user
+# need not have m4.
+SET(EXTRA_DIST test03_get.F test03_put.F fills.cdl create_fills.sh run_f77_par_test.sh)
+
+# Did the user build the V2 F77 API? If so, run this test.
+# This fails with pgifortran, but works with gfortran.
+IF(NOT USING_PGI)
+  IF(BUILD_V2)
+    LIST(APPEND check_PROGRAMS tst03_f77_v2)
+    LIST(APPEND TESTS tst03_f77_v2)
+    LIST(APPEND CLEANFILES tst_f77_v2.nc)
+    SET(tst03_f77_v2_SOURCES tst03_f77_v2.F)
+  ENDIF(BUILD_V2)
+ENDIF(NOT USING_PGI)
+
+# Need a copy of ref_fills.nc for ftest
+execute_process(COMMAND cp ${CMAKE_SOURCE_DIR}/nf_test/ref_fills.nc ${CMAKE_CURRENT_BINARY_DIR}/fills.nc)
+
+INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/fortran ${CMAKE_SOURCE_DIR}/libsrc ${CMAKE_SOURCE_DIR}
+  ${CMAKE_CPP_FLAGS} ${NETCDF_C_INCLUDE_DIR})
+LINK_DIRECTORIES(${CMAKE_SOURCE_DIR}/fortran ${CMAKE_SOURCE_DIR}/libsrc)
+FOREACH(t ${TESTS})
+  ADD_EXECUTABLE(${t} ${${t}_SOURCES})
+  TARGET_LINK_LIBRARIES(${t} netcdff)
+  ADD_TEST(${t} ${t})
+ENDFOREACH()
+
+# FILE(GLOB COPY_FILES ${CMAKE_CURRENT_SOURCE_DIR}/*.sh ${CMAKE_CURRENT_SOURCE_DIR}/*.cdl)
+# FILE(COPY ${COPY_FILES} DESTINATION ${CMAKE_CURRENT_BINARY_DIR} FILE_PERMISSIONS OWNER_WRITE OWNER_READ OWNER_EXECUTE)
+
+# FOREACH(F ${CDL_EXAMPLE_TESTS})
+# 	add_sh_test(cdl ${F})
+# ENDFOREACH()
+
+# SET_DIRECTORY_PROPERTIES(PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES "${CLEANFILES}")
diff --git a/nf03_test/Makefile.am b/nf03_test/Makefile.am
new file mode 100755
index 0000000..7bd074f
--- /dev/null
+++ b/nf03_test/Makefile.am
@@ -0,0 +1,121 @@
+## This is a automake file, part of Unidata's netCDF package.
+# Copyright 2005-2006, see the COPYRIGHT file for more information.
+
+# Modified versions of nf_test routines used to test the use of
+# F03 interface netcdf modules instead of netcdf include files
+
+# This file builds and runs the following:
+
+# The nf_test program, which tests the netCDF fortran 77 interface.
+
+# The ftest program, which tests the netCDF fortran 77 V2
+# interface. (Unless V2 is disabled).
+
+# Test programs ftst_vars, ftst_vars2, ftst_vars3, ftst_vars4,
+# ftst_vars5, ftst_types, ftst_types2, and ftst_groups, if netCDF-4 is
+# enabled.
+
+
+AM_FCFLAGS = -I$(top_srcdir)/fortran ${AM_CPPFLAGS}
+
+# Some fortran compilers think your files should not have an .f90
+# extension! The value of FCFLAGS_f90 is set in the configure script,
+# based on the fortran compiler.
+AM_FCFLAGS += $(FCFLAGS_f90) @MOD_FLAG@$(top_builddir)/fortran
+
+# Need some stuff from ../nf_test
+AM_FCFLAGS += -I$(top_srcdir)/nf_test
+
+AM_FFLAGS = ${AM_FCFLAGS}
+
+TESTS =
+
+# All tests need to link to fortran and C libraries.
+LDADD = ${top_builddir}/fortran/libnetcdff.la
+
+# The create_fills shell creates the file fills.nc, needed by later
+# tests.
+TESTS += create_fills.sh
+# Need access to top_srcdir
+TESTS_ENVIRONMENT=TOPSRCDIR=${abs_top_srcdir}
+
+# nf03_test is the main test program.
+check_PROGRAMS = nf03_test
+TESTS += nf03_test
+nf03_test_SOURCES = module_tests.F90 f03lib_f_interfaces.f90 test03_get.F test03_put.F nf03_error.F nf03_test.F	\
+test03_read.F test03_write.F util03.F f03lib.c
+
+# programs that "use tests" from the tests.mod module depend on it being built first, needed for make -j
+nf03_error.o nf03_test.o test03_get.o test03_put.o test03_read.o test03_write.o tst03_f77_v2.o util03.o: \
+module_tests.o
+
+# Cleaning up files created during the process.
+CLEANFILES = scratch.nc test.nc copy.nc fills.nc
+
+# Is the user building netCDF-4?
+if USE_NETCDF4
+
+# Add these netCDF-4 f77 test programs.
+check_PROGRAMS += f03tst_vars f03tst_vars2 f03tst_vars3 f03tst_vars4 f03tst_vars5	\
+f03tst_vars6 f03tst_types f03tst_types2 f03tst_types3 f03tst_groups
+f03tst_types_SOURCES = module_tests.F90 f03tst_types.F f03lib_f_interfaces.f90 f03lib.c handle_err.F
+f03tst_types2_SOURCES = module_tests.F90 f03tst_types2.F f03lib_f_interfaces.f90 f03lib.c handle_err.F
+f03tst_types3_SOURCES = module_tests.F90 f03tst_types3.F f03lib_f_interfaces.f90 f03lib.c handle_err.F
+f03tst_vars_SOURCES = module_tests.F90 f03tst_vars.F f03lib_f_interfaces.f90 f03lib.c handle_err.F
+f03tst_vars2_SOURCES = module_tests.F90 f03tst_vars2.F f03lib_f_interfaces.f90 f03lib.c handle_err.F
+f03tst_vars3_SOURCES = module_tests.F90 f03tst_vars3.F f03lib_f_interfaces.f90 f03lib.c handle_err.F
+f03tst_vars4_SOURCES = module_tests.F90 f03tst_vars4.F f03lib_f_interfaces.f90 f03lib.c handle_err.F
+f03tst_vars5_SOURCES = module_tests.F90 f03tst_vars5.F f03lib_f_interfaces.f90 f03lib.c handle_err.F
+f03tst_vars6_SOURCES = module_tests.F90 f03tst_vars6.F f03lib_f_interfaces.f90 f03lib.c handle_err.F
+f03tst_groups_SOURCES = module_tests.F90 f03tst_groups.F f03lib_f_interfaces.f90 f03lib.c handle_err.F
+TESTS += f03tst_vars f03tst_vars2 f03tst_vars3 f03tst_vars4 f03tst_vars5 \
+         f03tst_vars6 f03tst_types f03tst_types2 f03tst_types3 f03tst_groups
+CLEANFILES += ftst_vars.nc ftst_vars2.nc ftst_vars3.nc ftst_vars4.nc	\
+              ftst_vars5.nc ftst_vars6.nc ftst_types.nc ftst_types2.nc \
+              ftst_types3.nc ftst_groups.nc
+
+# This is a netCDF-4 V2 test program.
+if BUILD_V2
+check_PROGRAMS += f03tst_v2
+TESTS += f03tst_v2
+CLEANFILES += ftst_v2.nc
+f03tst_v2_SOURCES = f03tst_v2.F
+endif # BUILD_V2
+
+# Test parallel I/O
+if TEST_PARALLEL
+check_PROGRAMS += f03tst_parallel
+CLEANFILES += ftst_parallel.nc
+f03tst_parallel_SOURCES = f03tst_parallel.F
+endif # TEST_PARALLEL
+endif # USE_NETCDF4
+
+
+# This is the fortran v2 test. It depends on the utilities being built
+# to generate it's input file.
+if BUILD_V2
+check_PROGRAMS += f03test
+TESTS += f03test
+CLEANFILES += test.nc
+f03test_SOURCES = module_tests.F90 f03test.F f03lib.c
+endif # BUILD_V2
+
+CLEANFILES += tests.mod
+
+# test03_get.F and test03_put.f need to be distributed, so that the user
+# need not have m4.
+EXTRA_DIST = test03_get.F test03_put.F fills.cdl create_fills.sh	\
+run_f77_par_test.sh CMakeLists.txt
+
+test: check
+
+# Did the user build the V2 F77 API? If so, run this test.
+# This fails with pgifortran, but works with gfortran.
+if !USING_PGI
+if BUILD_V2
+check_PROGRAMS += tst03_f77_v2
+TESTS += tst03_f77_v2
+CLEANFILES += tst_f77_v2.nc temp.tmp
+tst03_f77_v2_SOURCES = tst03_f77_v2.F
+endif # BUILD_V2
+endif !USING_PGI
diff --git a/nf03_test/Makefile.in b/nf03_test/Makefile.in
new file mode 100644
index 0000000..6523af5
--- /dev/null
+++ b/nf03_test/Makefile.in
@@ -0,0 +1,1446 @@
+# Makefile.in generated by automake 1.14.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2013 Free Software Foundation, Inc.
+
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+ at SET_MAKE@
+
+# Copyright 2005-2006, see the COPYRIGHT file for more information.
+
+# Modified versions of nf_test routines used to test the use of
+# F03 interface netcdf modules instead of netcdf include files
+
+# This file builds and runs the following:
+
+# The nf_test program, which tests the netCDF fortran 77 interface.
+
+# The ftest program, which tests the netCDF fortran 77 V2
+# interface. (Unless V2 is disabled).
+
+# Test programs ftst_vars, ftst_vars2, ftst_vars3, ftst_vars4,
+# ftst_vars5, ftst_types, ftst_types2, and ftst_groups, if netCDF-4 is
+# enabled.
+VPATH = @srcdir@
+am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
+am__make_running_with_option = \
+  case $${target_option-} in \
+      ?) ;; \
+      *) echo "am__make_running_with_option: internal error: invalid" \
+              "target option '$${target_option-}' specified" >&2; \
+         exit 1;; \
+  esac; \
+  has_opt=no; \
+  sane_makeflags=$$MAKEFLAGS; \
+  if $(am__is_gnu_make); then \
+    sane_makeflags=$$MFLAGS; \
+  else \
+    case $$MAKEFLAGS in \
+      *\\[\ \	]*) \
+        bs=\\; \
+        sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+          | sed "s/$$bs$$bs[$$bs $$bs	]*//g"`;; \
+    esac; \
+  fi; \
+  skip_next=no; \
+  strip_trailopt () \
+  { \
+    flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+  }; \
+  for flg in $$sane_makeflags; do \
+    test $$skip_next = yes && { skip_next=no; continue; }; \
+    case $$flg in \
+      *=*|--*) continue;; \
+        -*I) strip_trailopt 'I'; skip_next=yes;; \
+      -*I?*) strip_trailopt 'I';; \
+        -*O) strip_trailopt 'O'; skip_next=yes;; \
+      -*O?*) strip_trailopt 'O';; \
+        -*l) strip_trailopt 'l'; skip_next=yes;; \
+      -*l?*) strip_trailopt 'l';; \
+      -[dEDm]) skip_next=yes;; \
+      -[JT]) skip_next=yes;; \
+    esac; \
+    case $$flg in \
+      *$$target_option*) has_opt=yes; break;; \
+    esac; \
+  done; \
+  test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+target_triplet = @target@
+TESTS = create_fills.sh nf03_test$(EXEEXT) $(am__EXEEXT_1) \
+	$(am__EXEEXT_2) $(am__EXEEXT_4) $(am__EXEEXT_5)
+check_PROGRAMS = nf03_test$(EXEEXT) $(am__EXEEXT_1) $(am__EXEEXT_2) \
+	$(am__EXEEXT_3) $(am__EXEEXT_4) $(am__EXEEXT_5)
+
+# Is the user building netCDF-4?
+
+# Add these netCDF-4 f77 test programs.
+ at USE_NETCDF4_TRUE@am__append_1 = f03tst_vars f03tst_vars2 f03tst_vars3 f03tst_vars4 f03tst_vars5	\
+ at USE_NETCDF4_TRUE@f03tst_vars6 f03tst_types f03tst_types2 f03tst_types3 f03tst_groups
+
+ at USE_NETCDF4_TRUE@am__append_2 = f03tst_vars f03tst_vars2 f03tst_vars3 f03tst_vars4 f03tst_vars5 \
+ at USE_NETCDF4_TRUE@         f03tst_vars6 f03tst_types f03tst_types2 f03tst_types3 f03tst_groups
+
+ at USE_NETCDF4_TRUE@am__append_3 = ftst_vars.nc ftst_vars2.nc ftst_vars3.nc ftst_vars4.nc	\
+ at USE_NETCDF4_TRUE@              ftst_vars5.nc ftst_vars6.nc ftst_types.nc ftst_types2.nc \
+ at USE_NETCDF4_TRUE@              ftst_types3.nc ftst_groups.nc
+
+
+# This is a netCDF-4 V2 test program.
+ at BUILD_V2_TRUE@@USE_NETCDF4_TRUE at am__append_4 = f03tst_v2
+ at BUILD_V2_TRUE@@USE_NETCDF4_TRUE at am__append_5 = f03tst_v2
+ at BUILD_V2_TRUE@@USE_NETCDF4_TRUE at am__append_6 = ftst_v2.nc
+
+# Test parallel I/O
+ at TEST_PARALLEL_TRUE@@USE_NETCDF4_TRUE at am__append_7 = f03tst_parallel
+ at TEST_PARALLEL_TRUE@@USE_NETCDF4_TRUE at am__append_8 = ftst_parallel.nc
+
+# This is the fortran v2 test. It depends on the utilities being built
+# to generate it's input file.
+ at BUILD_V2_TRUE@am__append_9 = f03test
+ at BUILD_V2_TRUE@am__append_10 = f03test
+ at BUILD_V2_TRUE@am__append_11 = test.nc
+
+# Did the user build the V2 F77 API? If so, run this test.
+# This fails with pgifortran, but works with gfortran.
+ at BUILD_V2_TRUE@@USING_PGI_FALSE at am__append_12 = tst03_f77_v2
+ at BUILD_V2_TRUE@@USING_PGI_FALSE at am__append_13 = tst03_f77_v2
+ at BUILD_V2_TRUE@@USING_PGI_FALSE at am__append_14 = tst_f77_v2.nc temp.tmp
+subdir = nf03_test
+DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \
+	$(top_srcdir)/depcomp $(top_srcdir)/test-driver
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \
+	$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+	$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+	$(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/config.h \
+	$(top_builddir)/libsrc/nfconfig1.inc
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+ at USE_NETCDF4_TRUE@am__EXEEXT_1 = f03tst_vars$(EXEEXT) \
+ at USE_NETCDF4_TRUE@	f03tst_vars2$(EXEEXT) f03tst_vars3$(EXEEXT) \
+ at USE_NETCDF4_TRUE@	f03tst_vars4$(EXEEXT) f03tst_vars5$(EXEEXT) \
+ at USE_NETCDF4_TRUE@	f03tst_vars6$(EXEEXT) f03tst_types$(EXEEXT) \
+ at USE_NETCDF4_TRUE@	f03tst_types2$(EXEEXT) \
+ at USE_NETCDF4_TRUE@	f03tst_types3$(EXEEXT) \
+ at USE_NETCDF4_TRUE@	f03tst_groups$(EXEEXT)
+ at BUILD_V2_TRUE@@USE_NETCDF4_TRUE at am__EXEEXT_2 = f03tst_v2$(EXEEXT)
+ at TEST_PARALLEL_TRUE@@USE_NETCDF4_TRUE at am__EXEEXT_3 = f03tst_parallel$(EXEEXT)
+ at BUILD_V2_TRUE@am__EXEEXT_4 = f03test$(EXEEXT)
+ at BUILD_V2_TRUE@@USING_PGI_FALSE at am__EXEEXT_5 = tst03_f77_v2$(EXEEXT)
+am__f03test_SOURCES_DIST = module_tests.F90 f03test.F f03lib.c
+ at BUILD_V2_TRUE@am_f03test_OBJECTS = module_tests.$(OBJEXT) \
+ at BUILD_V2_TRUE@	f03test.$(OBJEXT) f03lib.$(OBJEXT)
+f03test_OBJECTS = $(am_f03test_OBJECTS)
+f03test_LDADD = $(LDADD)
+f03test_DEPENDENCIES = ${top_builddir}/fortran/libnetcdff.la
+AM_V_lt = $(am__v_lt_ at AM_V@)
+am__v_lt_ = $(am__v_lt_ at AM_DEFAULT_V@)
+am__v_lt_0 = --silent
+am__v_lt_1 = 
+am__f03tst_groups_SOURCES_DIST = module_tests.F90 f03tst_groups.F \
+	f03lib_f_interfaces.f90 f03lib.c handle_err.F
+ at USE_NETCDF4_TRUE@am_f03tst_groups_OBJECTS = module_tests.$(OBJEXT) \
+ at USE_NETCDF4_TRUE@	f03tst_groups.$(OBJEXT) \
+ at USE_NETCDF4_TRUE@	f03lib_f_interfaces.$(OBJEXT) \
+ at USE_NETCDF4_TRUE@	f03lib.$(OBJEXT) handle_err.$(OBJEXT)
+f03tst_groups_OBJECTS = $(am_f03tst_groups_OBJECTS)
+f03tst_groups_LDADD = $(LDADD)
+f03tst_groups_DEPENDENCIES = ${top_builddir}/fortran/libnetcdff.la
+am__f03tst_parallel_SOURCES_DIST = f03tst_parallel.F
+ at TEST_PARALLEL_TRUE@@USE_NETCDF4_TRUE at am_f03tst_parallel_OBJECTS = f03tst_parallel.$(OBJEXT)
+f03tst_parallel_OBJECTS = $(am_f03tst_parallel_OBJECTS)
+f03tst_parallel_LDADD = $(LDADD)
+f03tst_parallel_DEPENDENCIES = ${top_builddir}/fortran/libnetcdff.la
+am__f03tst_types_SOURCES_DIST = module_tests.F90 f03tst_types.F \
+	f03lib_f_interfaces.f90 f03lib.c handle_err.F
+ at USE_NETCDF4_TRUE@am_f03tst_types_OBJECTS = module_tests.$(OBJEXT) \
+ at USE_NETCDF4_TRUE@	f03tst_types.$(OBJEXT) \
+ at USE_NETCDF4_TRUE@	f03lib_f_interfaces.$(OBJEXT) \
+ at USE_NETCDF4_TRUE@	f03lib.$(OBJEXT) handle_err.$(OBJEXT)
+f03tst_types_OBJECTS = $(am_f03tst_types_OBJECTS)
+f03tst_types_LDADD = $(LDADD)
+f03tst_types_DEPENDENCIES = ${top_builddir}/fortran/libnetcdff.la
+am__f03tst_types2_SOURCES_DIST = module_tests.F90 f03tst_types2.F \
+	f03lib_f_interfaces.f90 f03lib.c handle_err.F
+ at USE_NETCDF4_TRUE@am_f03tst_types2_OBJECTS = module_tests.$(OBJEXT) \
+ at USE_NETCDF4_TRUE@	f03tst_types2.$(OBJEXT) \
+ at USE_NETCDF4_TRUE@	f03lib_f_interfaces.$(OBJEXT) \
+ at USE_NETCDF4_TRUE@	f03lib.$(OBJEXT) handle_err.$(OBJEXT)
+f03tst_types2_OBJECTS = $(am_f03tst_types2_OBJECTS)
+f03tst_types2_LDADD = $(LDADD)
+f03tst_types2_DEPENDENCIES = ${top_builddir}/fortran/libnetcdff.la
+am__f03tst_types3_SOURCES_DIST = module_tests.F90 f03tst_types3.F \
+	f03lib_f_interfaces.f90 f03lib.c handle_err.F
+ at USE_NETCDF4_TRUE@am_f03tst_types3_OBJECTS = module_tests.$(OBJEXT) \
+ at USE_NETCDF4_TRUE@	f03tst_types3.$(OBJEXT) \
+ at USE_NETCDF4_TRUE@	f03lib_f_interfaces.$(OBJEXT) \
+ at USE_NETCDF4_TRUE@	f03lib.$(OBJEXT) handle_err.$(OBJEXT)
+f03tst_types3_OBJECTS = $(am_f03tst_types3_OBJECTS)
+f03tst_types3_LDADD = $(LDADD)
+f03tst_types3_DEPENDENCIES = ${top_builddir}/fortran/libnetcdff.la
+am__f03tst_v2_SOURCES_DIST = f03tst_v2.F
+ at BUILD_V2_TRUE@@USE_NETCDF4_TRUE at am_f03tst_v2_OBJECTS =  \
+ at BUILD_V2_TRUE@@USE_NETCDF4_TRUE@	f03tst_v2.$(OBJEXT)
+f03tst_v2_OBJECTS = $(am_f03tst_v2_OBJECTS)
+f03tst_v2_LDADD = $(LDADD)
+f03tst_v2_DEPENDENCIES = ${top_builddir}/fortran/libnetcdff.la
+am__f03tst_vars_SOURCES_DIST = module_tests.F90 f03tst_vars.F \
+	f03lib_f_interfaces.f90 f03lib.c handle_err.F
+ at USE_NETCDF4_TRUE@am_f03tst_vars_OBJECTS = module_tests.$(OBJEXT) \
+ at USE_NETCDF4_TRUE@	f03tst_vars.$(OBJEXT) \
+ at USE_NETCDF4_TRUE@	f03lib_f_interfaces.$(OBJEXT) \
+ at USE_NETCDF4_TRUE@	f03lib.$(OBJEXT) handle_err.$(OBJEXT)
+f03tst_vars_OBJECTS = $(am_f03tst_vars_OBJECTS)
+f03tst_vars_LDADD = $(LDADD)
+f03tst_vars_DEPENDENCIES = ${top_builddir}/fortran/libnetcdff.la
+am__f03tst_vars2_SOURCES_DIST = module_tests.F90 f03tst_vars2.F \
+	f03lib_f_interfaces.f90 f03lib.c handle_err.F
+ at USE_NETCDF4_TRUE@am_f03tst_vars2_OBJECTS = module_tests.$(OBJEXT) \
+ at USE_NETCDF4_TRUE@	f03tst_vars2.$(OBJEXT) \
+ at USE_NETCDF4_TRUE@	f03lib_f_interfaces.$(OBJEXT) \
+ at USE_NETCDF4_TRUE@	f03lib.$(OBJEXT) handle_err.$(OBJEXT)
+f03tst_vars2_OBJECTS = $(am_f03tst_vars2_OBJECTS)
+f03tst_vars2_LDADD = $(LDADD)
+f03tst_vars2_DEPENDENCIES = ${top_builddir}/fortran/libnetcdff.la
+am__f03tst_vars3_SOURCES_DIST = module_tests.F90 f03tst_vars3.F \
+	f03lib_f_interfaces.f90 f03lib.c handle_err.F
+ at USE_NETCDF4_TRUE@am_f03tst_vars3_OBJECTS = module_tests.$(OBJEXT) \
+ at USE_NETCDF4_TRUE@	f03tst_vars3.$(OBJEXT) \
+ at USE_NETCDF4_TRUE@	f03lib_f_interfaces.$(OBJEXT) \
+ at USE_NETCDF4_TRUE@	f03lib.$(OBJEXT) handle_err.$(OBJEXT)
+f03tst_vars3_OBJECTS = $(am_f03tst_vars3_OBJECTS)
+f03tst_vars3_LDADD = $(LDADD)
+f03tst_vars3_DEPENDENCIES = ${top_builddir}/fortran/libnetcdff.la
+am__f03tst_vars4_SOURCES_DIST = module_tests.F90 f03tst_vars4.F \
+	f03lib_f_interfaces.f90 f03lib.c handle_err.F
+ at USE_NETCDF4_TRUE@am_f03tst_vars4_OBJECTS = module_tests.$(OBJEXT) \
+ at USE_NETCDF4_TRUE@	f03tst_vars4.$(OBJEXT) \
+ at USE_NETCDF4_TRUE@	f03lib_f_interfaces.$(OBJEXT) \
+ at USE_NETCDF4_TRUE@	f03lib.$(OBJEXT) handle_err.$(OBJEXT)
+f03tst_vars4_OBJECTS = $(am_f03tst_vars4_OBJECTS)
+f03tst_vars4_LDADD = $(LDADD)
+f03tst_vars4_DEPENDENCIES = ${top_builddir}/fortran/libnetcdff.la
+am__f03tst_vars5_SOURCES_DIST = module_tests.F90 f03tst_vars5.F \
+	f03lib_f_interfaces.f90 f03lib.c handle_err.F
+ at USE_NETCDF4_TRUE@am_f03tst_vars5_OBJECTS = module_tests.$(OBJEXT) \
+ at USE_NETCDF4_TRUE@	f03tst_vars5.$(OBJEXT) \
+ at USE_NETCDF4_TRUE@	f03lib_f_interfaces.$(OBJEXT) \
+ at USE_NETCDF4_TRUE@	f03lib.$(OBJEXT) handle_err.$(OBJEXT)
+f03tst_vars5_OBJECTS = $(am_f03tst_vars5_OBJECTS)
+f03tst_vars5_LDADD = $(LDADD)
+f03tst_vars5_DEPENDENCIES = ${top_builddir}/fortran/libnetcdff.la
+am__f03tst_vars6_SOURCES_DIST = module_tests.F90 f03tst_vars6.F \
+	f03lib_f_interfaces.f90 f03lib.c handle_err.F
+ at USE_NETCDF4_TRUE@am_f03tst_vars6_OBJECTS = module_tests.$(OBJEXT) \
+ at USE_NETCDF4_TRUE@	f03tst_vars6.$(OBJEXT) \
+ at USE_NETCDF4_TRUE@	f03lib_f_interfaces.$(OBJEXT) \
+ at USE_NETCDF4_TRUE@	f03lib.$(OBJEXT) handle_err.$(OBJEXT)
+f03tst_vars6_OBJECTS = $(am_f03tst_vars6_OBJECTS)
+f03tst_vars6_LDADD = $(LDADD)
+f03tst_vars6_DEPENDENCIES = ${top_builddir}/fortran/libnetcdff.la
+am_nf03_test_OBJECTS = module_tests.$(OBJEXT) \
+	f03lib_f_interfaces.$(OBJEXT) test03_get.$(OBJEXT) \
+	test03_put.$(OBJEXT) nf03_error.$(OBJEXT) nf03_test.$(OBJEXT) \
+	test03_read.$(OBJEXT) test03_write.$(OBJEXT) util03.$(OBJEXT) \
+	f03lib.$(OBJEXT)
+nf03_test_OBJECTS = $(am_nf03_test_OBJECTS)
+nf03_test_LDADD = $(LDADD)
+nf03_test_DEPENDENCIES = ${top_builddir}/fortran/libnetcdff.la
+am__tst03_f77_v2_SOURCES_DIST = tst03_f77_v2.F
+ at BUILD_V2_TRUE@@USING_PGI_FALSE at am_tst03_f77_v2_OBJECTS =  \
+ at BUILD_V2_TRUE@@USING_PGI_FALSE@	tst03_f77_v2.$(OBJEXT)
+tst03_f77_v2_OBJECTS = $(am_tst03_f77_v2_OBJECTS)
+tst03_f77_v2_LDADD = $(LDADD)
+tst03_f77_v2_DEPENDENCIES = ${top_builddir}/fortran/libnetcdff.la
+AM_V_P = $(am__v_P_ at AM_V@)
+am__v_P_ = $(am__v_P_ at AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_ at AM_V@)
+am__v_GEN_ = $(am__v_GEN_ at AM_DEFAULT_V@)
+am__v_GEN_0 = @echo "  GEN     " $@;
+am__v_GEN_1 = 
+AM_V_at = $(am__v_at_ at AM_V@)
+am__v_at_ = $(am__v_at_ at AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 = 
+DEFAULT_INCLUDES = -I. at am__isrc@ -I$(top_builddir) -I$(top_builddir)/libsrc
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__depfiles_maybe = depfiles
+am__mv = mv -f
+PPF77COMPILE = $(F77) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_FFLAGS) $(FFLAGS)
+LTPPF77COMPILE = $(LIBTOOL) $(AM_V_lt) --tag=F77 $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=compile $(F77) $(DEFS) \
+	$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+	$(AM_FFLAGS) $(FFLAGS)
+AM_V_PPF77 = $(am__v_PPF77_ at AM_V@)
+am__v_PPF77_ = $(am__v_PPF77_ at AM_DEFAULT_V@)
+am__v_PPF77_0 = @echo "  PPF77   " $@;
+am__v_PPF77_1 = 
+F77LD = $(F77)
+F77LINK = $(LIBTOOL) $(AM_V_lt) --tag=F77 $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(F77LD) $(AM_FFLAGS) $(FFLAGS) \
+	$(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_F77LD = $(am__v_F77LD_ at AM_V@)
+am__v_F77LD_ = $(am__v_F77LD_ at AM_DEFAULT_V@)
+am__v_F77LD_0 = @echo "  F77LD   " $@;
+am__v_F77LD_1 = 
+PPFCCOMPILE = $(FC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_FCFLAGS) $(FCFLAGS)
+LTPPFCCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=FC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=compile $(FC) $(DEFS) \
+	$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+	$(AM_FCFLAGS) $(FCFLAGS)
+AM_V_PPFC = $(am__v_PPFC_ at AM_V@)
+am__v_PPFC_ = $(am__v_PPFC_ at AM_DEFAULT_V@)
+am__v_PPFC_0 = @echo "  PPFC    " $@;
+am__v_PPFC_1 = 
+FCLD = $(FC)
+FCLINK = $(LIBTOOL) $(AM_V_lt) --tag=FC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(FCLD) $(AM_FCFLAGS) $(FCFLAGS) \
+	$(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_FCLD = $(am__v_FCLD_ at AM_V@)
+am__v_FCLD_ = $(am__v_FCLD_ at AM_DEFAULT_V@)
+am__v_FCLD_0 = @echo "  FCLD    " $@;
+am__v_FCLD_1 = 
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+	$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \
+	$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+	$(AM_CFLAGS) $(CFLAGS)
+AM_V_CC = $(am__v_CC_ at AM_V@)
+am__v_CC_ = $(am__v_CC_ at AM_DEFAULT_V@)
+am__v_CC_0 = @echo "  CC      " $@;
+am__v_CC_1 = 
+CCLD = $(CC)
+LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+	$(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CCLD = $(am__v_CCLD_ at AM_V@)
+am__v_CCLD_ = $(am__v_CCLD_ at AM_DEFAULT_V@)
+am__v_CCLD_0 = @echo "  CCLD    " $@;
+am__v_CCLD_1 = 
+FCCOMPILE = $(FC) $(AM_FCFLAGS) $(FCFLAGS)
+LTFCCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=FC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=compile $(FC) $(AM_FCFLAGS) $(FCFLAGS)
+AM_V_FC = $(am__v_FC_ at AM_V@)
+am__v_FC_ = $(am__v_FC_ at AM_DEFAULT_V@)
+am__v_FC_0 = @echo "  FC      " $@;
+am__v_FC_1 = 
+SOURCES = $(f03test_SOURCES) $(f03tst_groups_SOURCES) \
+	$(f03tst_parallel_SOURCES) $(f03tst_types_SOURCES) \
+	$(f03tst_types2_SOURCES) $(f03tst_types3_SOURCES) \
+	$(f03tst_v2_SOURCES) $(f03tst_vars_SOURCES) \
+	$(f03tst_vars2_SOURCES) $(f03tst_vars3_SOURCES) \
+	$(f03tst_vars4_SOURCES) $(f03tst_vars5_SOURCES) \
+	$(f03tst_vars6_SOURCES) $(nf03_test_SOURCES) \
+	$(tst03_f77_v2_SOURCES)
+DIST_SOURCES = $(am__f03test_SOURCES_DIST) \
+	$(am__f03tst_groups_SOURCES_DIST) \
+	$(am__f03tst_parallel_SOURCES_DIST) \
+	$(am__f03tst_types_SOURCES_DIST) \
+	$(am__f03tst_types2_SOURCES_DIST) \
+	$(am__f03tst_types3_SOURCES_DIST) \
+	$(am__f03tst_v2_SOURCES_DIST) $(am__f03tst_vars_SOURCES_DIST) \
+	$(am__f03tst_vars2_SOURCES_DIST) \
+	$(am__f03tst_vars3_SOURCES_DIST) \
+	$(am__f03tst_vars4_SOURCES_DIST) \
+	$(am__f03tst_vars5_SOURCES_DIST) \
+	$(am__f03tst_vars6_SOURCES_DIST) $(nf03_test_SOURCES) \
+	$(am__tst03_f77_v2_SOURCES_DIST)
+am__can_run_installinfo = \
+  case $$AM_UPDATE_INFO_DIR in \
+    n|no|NO) false;; \
+    *) (install-info --version) >/dev/null 2>&1;; \
+  esac
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates.  Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+  BEGIN { nonempty = 0; } \
+  { items[$$0] = 1; nonempty = 1; } \
+  END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique.  This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+  list='$(am__tagged_files)'; \
+  unique=`for i in $$list; do \
+    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+  done | $(am__uniquify_input)`
+ETAGS = etags
+CTAGS = ctags
+am__tty_colors_dummy = \
+  mgn= red= grn= lgn= blu= brg= std=; \
+  am__color_tests=no
+am__tty_colors = { \
+  $(am__tty_colors_dummy); \
+  if test "X$(AM_COLOR_TESTS)" = Xno; then \
+    am__color_tests=no; \
+  elif test "X$(AM_COLOR_TESTS)" = Xalways; then \
+    am__color_tests=yes; \
+  elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \
+    am__color_tests=yes; \
+  fi; \
+  if test $$am__color_tests = yes; then \
+    red=''; \
+    grn=''; \
+    lgn=''; \
+    blu=''; \
+    mgn=''; \
+    brg=''; \
+    std=''; \
+  fi; \
+}
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+  for p in $$list; do echo "$$p $$p"; done | \
+  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+    if (++n[$$2] == $(am__install_max)) \
+      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+    END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__uninstall_files_from_dir = { \
+  test -z "$$files" \
+    || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+    || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+         $(am__cd) "$$dir" && rm -f $$files; }; \
+  }
+am__recheck_rx = ^[ 	]*:recheck:[ 	]*
+am__global_test_result_rx = ^[ 	]*:global-test-result:[ 	]*
+am__copy_in_global_log_rx = ^[ 	]*:copy-in-global-log:[ 	]*
+# A command that, given a newline-separated list of test names on the
+# standard input, print the name of the tests that are to be re-run
+# upon "make recheck".
+am__list_recheck_tests = $(AWK) '{ \
+  recheck = 1; \
+  while ((rc = (getline line < ($$0 ".trs"))) != 0) \
+    { \
+      if (rc < 0) \
+        { \
+          if ((getline line2 < ($$0 ".log")) < 0) \
+	    recheck = 0; \
+          break; \
+        } \
+      else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \
+        { \
+          recheck = 0; \
+          break; \
+        } \
+      else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \
+        { \
+          break; \
+        } \
+    }; \
+  if (recheck) \
+    print $$0; \
+  close ($$0 ".trs"); \
+  close ($$0 ".log"); \
+}'
+# A command that, given a newline-separated list of test names on the
+# standard input, create the global log from their .trs and .log files.
+am__create_global_log = $(AWK) ' \
+function fatal(msg) \
+{ \
+  print "fatal: making $@: " msg | "cat >&2"; \
+  exit 1; \
+} \
+function rst_section(header) \
+{ \
+  print header; \
+  len = length(header); \
+  for (i = 1; i <= len; i = i + 1) \
+    printf "="; \
+  printf "\n\n"; \
+} \
+{ \
+  copy_in_global_log = 1; \
+  global_test_result = "RUN"; \
+  while ((rc = (getline line < ($$0 ".trs"))) != 0) \
+    { \
+      if (rc < 0) \
+         fatal("failed to read from " $$0 ".trs"); \
+      if (line ~ /$(am__global_test_result_rx)/) \
+        { \
+          sub("$(am__global_test_result_rx)", "", line); \
+          sub("[ 	]*$$", "", line); \
+          global_test_result = line; \
+        } \
+      else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \
+        copy_in_global_log = 0; \
+    }; \
+  if (copy_in_global_log) \
+    { \
+      rst_section(global_test_result ": " $$0); \
+      while ((rc = (getline line < ($$0 ".log"))) != 0) \
+      { \
+        if (rc < 0) \
+          fatal("failed to read from " $$0 ".log"); \
+        print line; \
+      }; \
+      printf "\n"; \
+    }; \
+  close ($$0 ".trs"); \
+  close ($$0 ".log"); \
+}'
+# Restructured Text title.
+am__rst_title = { sed 's/.*/   &   /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; }
+# Solaris 10 'make', and several other traditional 'make' implementations,
+# pass "-e" to $(SHELL), and POSIX 2008 even requires this.  Work around it
+# by disabling -e (using the XSI extension "set +e") if it's set.
+am__sh_e_setup = case $$- in *e*) set +e;; esac
+# Default flags passed to test drivers.
+am__common_driver_flags = \
+  --color-tests "$$am__color_tests" \
+  --enable-hard-errors "$$am__enable_hard_errors" \
+  --expect-failure "$$am__expect_failure"
+# To be inserted before the command running the test.  Creates the
+# directory for the log if needed.  Stores in $dir the directory
+# containing $f, in $tst the test, in $log the log.  Executes the
+# developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and
+# passes TESTS_ENVIRONMENT.  Set up options for the wrapper that
+# will run the test scripts (or their associated LOG_COMPILER, if
+# thy have one).
+am__check_pre = \
+$(am__sh_e_setup);					\
+$(am__vpath_adj_setup) $(am__vpath_adj)			\
+$(am__tty_colors);					\
+srcdir=$(srcdir); export srcdir;			\
+case "$@" in						\
+  */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;;	\
+    *) am__odir=.;; 					\
+esac;							\
+test "x$$am__odir" = x"." || test -d "$$am__odir" 	\
+  || $(MKDIR_P) "$$am__odir" || exit $$?;		\
+if test -f "./$$f"; then dir=./;			\
+elif test -f "$$f"; then dir=;				\
+else dir="$(srcdir)/"; fi;				\
+tst=$$dir$$f; log='$@'; 				\
+if test -n '$(DISABLE_HARD_ERRORS)'; then		\
+  am__enable_hard_errors=no; 				\
+else							\
+  am__enable_hard_errors=yes; 				\
+fi; 							\
+case " $(XFAIL_TESTS) " in				\
+  *[\ \	]$$f[\ \	]* | *[\ \	]$$dir$$f[\ \	]*) \
+    am__expect_failure=yes;;				\
+  *)							\
+    am__expect_failure=no;;				\
+esac; 							\
+$(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT)
+# A shell command to get the names of the tests scripts with any registered
+# extension removed (i.e., equivalently, the names of the test logs, with
+# the '.log' extension removed).  The result is saved in the shell variable
+# '$bases'.  This honors runtime overriding of TESTS and TEST_LOGS.  Sadly,
+# we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)",
+# since that might cause problem with VPATH rewrites for suffix-less tests.
+# See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'.
+am__set_TESTS_bases = \
+  bases='$(TEST_LOGS)'; \
+  bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \
+  bases=`echo $$bases`
+RECHECK_LOGS = $(TEST_LOGS)
+AM_RECURSIVE_TARGETS = check recheck
+TEST_SUITE_LOG = test-suite.log
+TEST_EXTENSIONS = @EXEEXT@ .test
+LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver
+LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS)
+am__set_b = \
+  case '$@' in \
+    */*) \
+      case '$*' in \
+        */*) b='$*';; \
+          *) b=`echo '$@' | sed 's/\.log$$//'`; \
+       esac;; \
+    *) \
+      b='$*';; \
+  esac
+am__test_logs1 = $(TESTS:=.log)
+am__test_logs2 = $(am__test_logs1:@EXEEXT at .log=.log)
+TEST_LOGS = $(am__test_logs2:.test.log=.log)
+TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver
+TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \
+	$(TEST_LOG_FLAGS)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+ALLOCA = @ALLOCA@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BUILD_INTERNAL_DOCS = @BUILD_INTERNAL_DOCS@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+DOT = @DOT@
+DOXYGEN = @DOXYGEN@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+F77 = @F77@
+FC = @FC@
+FCFLAGS = @FCFLAGS@
+FCFLAGS_f90 = @FCFLAGS_f90@
+FFLAGS = @FFLAGS@
+FGREP = @FGREP@
+GREP = @GREP@
+HAS_DAP = @HAS_DAP@
+HAS_F03 = @HAS_F03@
+HAS_F90 = @HAS_F90@
+HAS_NC2 = @HAS_NC2@
+HAS_NC4 = @HAS_NC4@
+HAVE_DOT = @HAVE_DOT@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MKDIR_P = @MKDIR_P@
+MOD_FLAG = @MOD_FLAG@
+NC_FLIBS = @NC_FLIBS@
+NC_LIBS = @NC_LIBS@
+NM = @NM@
+NMEDIT = @NMEDIT@
+NMFLAGS = @NMFLAGS@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+VERSION = @VERSION@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+ac_ct_F77 = @ac_ct_F77@
+ac_ct_FC = @ac_ct_FC@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target = @target@
+target_alias = @target_alias@
+target_cpu = @target_cpu@
+target_os = @target_os@
+target_vendor = @target_vendor@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+
+# Some fortran compilers think your files should not have an .f90
+# extension! The value of FCFLAGS_f90 is set in the configure script,
+# based on the fortran compiler.
+
+# Need some stuff from ../nf_test
+AM_FCFLAGS = -I$(top_srcdir)/fortran ${AM_CPPFLAGS} $(FCFLAGS_f90) \
+	@MOD_FLAG@$(top_builddir)/fortran -I$(top_srcdir)/nf_test
+AM_FFLAGS = ${AM_FCFLAGS}
+
+# All tests need to link to fortran and C libraries.
+LDADD = ${top_builddir}/fortran/libnetcdff.la
+# Need access to top_srcdir
+TESTS_ENVIRONMENT = TOPSRCDIR=${abs_top_srcdir}
+nf03_test_SOURCES = module_tests.F90 f03lib_f_interfaces.f90 test03_get.F test03_put.F nf03_error.F nf03_test.F	\
+test03_read.F test03_write.F util03.F f03lib.c
+
+
+# Cleaning up files created during the process.
+CLEANFILES = scratch.nc test.nc copy.nc fills.nc $(am__append_3) \
+	$(am__append_6) $(am__append_8) $(am__append_11) tests.mod \
+	$(am__append_14)
+ at USE_NETCDF4_TRUE@f03tst_types_SOURCES = module_tests.F90 f03tst_types.F f03lib_f_interfaces.f90 f03lib.c handle_err.F
+ at USE_NETCDF4_TRUE@f03tst_types2_SOURCES = module_tests.F90 f03tst_types2.F f03lib_f_interfaces.f90 f03lib.c handle_err.F
+ at USE_NETCDF4_TRUE@f03tst_types3_SOURCES = module_tests.F90 f03tst_types3.F f03lib_f_interfaces.f90 f03lib.c handle_err.F
+ at USE_NETCDF4_TRUE@f03tst_vars_SOURCES = module_tests.F90 f03tst_vars.F f03lib_f_interfaces.f90 f03lib.c handle_err.F
+ at USE_NETCDF4_TRUE@f03tst_vars2_SOURCES = module_tests.F90 f03tst_vars2.F f03lib_f_interfaces.f90 f03lib.c handle_err.F
+ at USE_NETCDF4_TRUE@f03tst_vars3_SOURCES = module_tests.F90 f03tst_vars3.F f03lib_f_interfaces.f90 f03lib.c handle_err.F
+ at USE_NETCDF4_TRUE@f03tst_vars4_SOURCES = module_tests.F90 f03tst_vars4.F f03lib_f_interfaces.f90 f03lib.c handle_err.F
+ at USE_NETCDF4_TRUE@f03tst_vars5_SOURCES = module_tests.F90 f03tst_vars5.F f03lib_f_interfaces.f90 f03lib.c handle_err.F
+ at USE_NETCDF4_TRUE@f03tst_vars6_SOURCES = module_tests.F90 f03tst_vars6.F f03lib_f_interfaces.f90 f03lib.c handle_err.F
+ at USE_NETCDF4_TRUE@f03tst_groups_SOURCES = module_tests.F90 f03tst_groups.F f03lib_f_interfaces.f90 f03lib.c handle_err.F
+ at BUILD_V2_TRUE@@USE_NETCDF4_TRUE at f03tst_v2_SOURCES = f03tst_v2.F
+ at TEST_PARALLEL_TRUE@@USE_NETCDF4_TRUE at f03tst_parallel_SOURCES = f03tst_parallel.F
+ at BUILD_V2_TRUE@f03test_SOURCES = module_tests.F90 f03test.F f03lib.c
+
+# test03_get.F and test03_put.f need to be distributed, so that the user
+# need not have m4.
+EXTRA_DIST = test03_get.F test03_put.F fills.cdl create_fills.sh	\
+run_f77_par_test.sh CMakeLists.txt
+
+ at BUILD_V2_TRUE@@USING_PGI_FALSE at tst03_f77_v2_SOURCES = tst03_f77_v2.F
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .F .F90 .c .f .f90 .lo .log .o .obj .test .test$(EXEEXT) .trs
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign nf03_test/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign nf03_test/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+
+clean-checkPROGRAMS:
+	@list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \
+	echo " rm -f" $$list; \
+	rm -f $$list || exit $$?; \
+	test -n "$(EXEEXT)" || exit 0; \
+	list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
+	echo " rm -f" $$list; \
+	rm -f $$list
+
+f03test$(EXEEXT): $(f03test_OBJECTS) $(f03test_DEPENDENCIES) $(EXTRA_f03test_DEPENDENCIES) 
+	@rm -f f03test$(EXEEXT)
+	$(AM_V_F77LD)$(F77LINK) $(f03test_OBJECTS) $(f03test_LDADD) $(LIBS)
+
+f03tst_groups$(EXEEXT): $(f03tst_groups_OBJECTS) $(f03tst_groups_DEPENDENCIES) $(EXTRA_f03tst_groups_DEPENDENCIES) 
+	@rm -f f03tst_groups$(EXEEXT)
+	$(AM_V_F77LD)$(F77LINK) $(f03tst_groups_OBJECTS) $(f03tst_groups_LDADD) $(LIBS)
+
+f03tst_parallel$(EXEEXT): $(f03tst_parallel_OBJECTS) $(f03tst_parallel_DEPENDENCIES) $(EXTRA_f03tst_parallel_DEPENDENCIES) 
+	@rm -f f03tst_parallel$(EXEEXT)
+	$(AM_V_F77LD)$(F77LINK) $(f03tst_parallel_OBJECTS) $(f03tst_parallel_LDADD) $(LIBS)
+
+f03tst_types$(EXEEXT): $(f03tst_types_OBJECTS) $(f03tst_types_DEPENDENCIES) $(EXTRA_f03tst_types_DEPENDENCIES) 
+	@rm -f f03tst_types$(EXEEXT)
+	$(AM_V_F77LD)$(F77LINK) $(f03tst_types_OBJECTS) $(f03tst_types_LDADD) $(LIBS)
+
+f03tst_types2$(EXEEXT): $(f03tst_types2_OBJECTS) $(f03tst_types2_DEPENDENCIES) $(EXTRA_f03tst_types2_DEPENDENCIES) 
+	@rm -f f03tst_types2$(EXEEXT)
+	$(AM_V_F77LD)$(F77LINK) $(f03tst_types2_OBJECTS) $(f03tst_types2_LDADD) $(LIBS)
+
+f03tst_types3$(EXEEXT): $(f03tst_types3_OBJECTS) $(f03tst_types3_DEPENDENCIES) $(EXTRA_f03tst_types3_DEPENDENCIES) 
+	@rm -f f03tst_types3$(EXEEXT)
+	$(AM_V_F77LD)$(F77LINK) $(f03tst_types3_OBJECTS) $(f03tst_types3_LDADD) $(LIBS)
+
+f03tst_v2$(EXEEXT): $(f03tst_v2_OBJECTS) $(f03tst_v2_DEPENDENCIES) $(EXTRA_f03tst_v2_DEPENDENCIES) 
+	@rm -f f03tst_v2$(EXEEXT)
+	$(AM_V_F77LD)$(F77LINK) $(f03tst_v2_OBJECTS) $(f03tst_v2_LDADD) $(LIBS)
+
+f03tst_vars$(EXEEXT): $(f03tst_vars_OBJECTS) $(f03tst_vars_DEPENDENCIES) $(EXTRA_f03tst_vars_DEPENDENCIES) 
+	@rm -f f03tst_vars$(EXEEXT)
+	$(AM_V_F77LD)$(F77LINK) $(f03tst_vars_OBJECTS) $(f03tst_vars_LDADD) $(LIBS)
+
+f03tst_vars2$(EXEEXT): $(f03tst_vars2_OBJECTS) $(f03tst_vars2_DEPENDENCIES) $(EXTRA_f03tst_vars2_DEPENDENCIES) 
+	@rm -f f03tst_vars2$(EXEEXT)
+	$(AM_V_F77LD)$(F77LINK) $(f03tst_vars2_OBJECTS) $(f03tst_vars2_LDADD) $(LIBS)
+
+f03tst_vars3$(EXEEXT): $(f03tst_vars3_OBJECTS) $(f03tst_vars3_DEPENDENCIES) $(EXTRA_f03tst_vars3_DEPENDENCIES) 
+	@rm -f f03tst_vars3$(EXEEXT)
+	$(AM_V_F77LD)$(F77LINK) $(f03tst_vars3_OBJECTS) $(f03tst_vars3_LDADD) $(LIBS)
+
+f03tst_vars4$(EXEEXT): $(f03tst_vars4_OBJECTS) $(f03tst_vars4_DEPENDENCIES) $(EXTRA_f03tst_vars4_DEPENDENCIES) 
+	@rm -f f03tst_vars4$(EXEEXT)
+	$(AM_V_F77LD)$(F77LINK) $(f03tst_vars4_OBJECTS) $(f03tst_vars4_LDADD) $(LIBS)
+
+f03tst_vars5$(EXEEXT): $(f03tst_vars5_OBJECTS) $(f03tst_vars5_DEPENDENCIES) $(EXTRA_f03tst_vars5_DEPENDENCIES) 
+	@rm -f f03tst_vars5$(EXEEXT)
+	$(AM_V_F77LD)$(F77LINK) $(f03tst_vars5_OBJECTS) $(f03tst_vars5_LDADD) $(LIBS)
+
+f03tst_vars6$(EXEEXT): $(f03tst_vars6_OBJECTS) $(f03tst_vars6_DEPENDENCIES) $(EXTRA_f03tst_vars6_DEPENDENCIES) 
+	@rm -f f03tst_vars6$(EXEEXT)
+	$(AM_V_F77LD)$(F77LINK) $(f03tst_vars6_OBJECTS) $(f03tst_vars6_LDADD) $(LIBS)
+
+nf03_test$(EXEEXT): $(nf03_test_OBJECTS) $(nf03_test_DEPENDENCIES) $(EXTRA_nf03_test_DEPENDENCIES) 
+	@rm -f nf03_test$(EXEEXT)
+	$(AM_V_F77LD)$(F77LINK) $(nf03_test_OBJECTS) $(nf03_test_LDADD) $(LIBS)
+
+tst03_f77_v2$(EXEEXT): $(tst03_f77_v2_OBJECTS) $(tst03_f77_v2_DEPENDENCIES) $(EXTRA_tst03_f77_v2_DEPENDENCIES) 
+	@rm -f tst03_f77_v2$(EXEEXT)
+	$(AM_V_F77LD)$(F77LINK) $(tst03_f77_v2_OBJECTS) $(tst03_f77_v2_LDADD) $(LIBS)
+
+mostlyclean-compile:
+	-rm -f *.$(OBJEXT)
+
+distclean-compile:
+	-rm -f *.tab.c
+
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/f03lib.Po at am__quote@
+
+.F.o:
+	$(AM_V_PPF77)$(PPF77COMPILE) -c -o $@ $<
+
+.F.obj:
+	$(AM_V_PPF77)$(PPF77COMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.F.lo:
+	$(AM_V_PPF77)$(LTPPF77COMPILE) -c -o $@ $<
+.F.f:
+	$(F77COMPILE) -F $<
+
+.F90.o:
+	$(AM_V_PPFC)$(PPFCCOMPILE) -c -o $@ $<
+
+.F90.obj:
+	$(AM_V_PPFC)$(PPFCCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.F90.lo:
+	$(AM_V_PPFC)$(LTPPFCCOMPILE) -c -o $@ $<
+
+.c.o:
+ at am__fastdepCC_TRUE@	$(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\
+ at am__fastdepCC_TRUE@	$(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+ at am__fastdepCC_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.Po
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(COMPILE) -c -o $@ $<
+
+.c.obj:
+ at am__fastdepCC_TRUE@	$(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\
+ at am__fastdepCC_TRUE@	$(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\
+ at am__fastdepCC_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.Po
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.c.lo:
+ at am__fastdepCC_TRUE@	$(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\
+ at am__fastdepCC_TRUE@	$(LTCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+ at am__fastdepCC_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LTCOMPILE) -c -o $@ $<
+
+.f90.o:
+	$(AM_V_FC)$(FCCOMPILE) -c -o $@ $(FCFLAGS_f90) $<
+
+.f90.obj:
+	$(AM_V_FC)$(FCCOMPILE) -c -o $@ $(FCFLAGS_f90) `$(CYGPATH_W) '$<'`
+
+.f90.lo:
+	$(AM_V_FC)$(LTFCCOMPILE) -c -o $@ $(FCFLAGS_f90) $<
+
+mostlyclean-libtool:
+	-rm -f *.lo
+
+clean-libtool:
+	-rm -rf .libs _libs
+
+ID: $(am__tagged_files)
+	$(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-am
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+	set x; \
+	here=`pwd`; \
+	$(am__define_uniq_tagged_files); \
+	shift; \
+	if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+	  test -n "$$unique" || unique=$$empty_fix; \
+	  if test $$# -gt 0; then \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      "$$@" $$unique; \
+	  else \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      $$unique; \
+	  fi; \
+	fi
+ctags: ctags-am
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+	$(am__define_uniq_tagged_files); \
+	test -z "$(CTAGS_ARGS)$$unique" \
+	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+	     $$unique
+
+GTAGS:
+	here=`$(am__cd) $(top_builddir) && pwd` \
+	  && $(am__cd) $(top_srcdir) \
+	  && gtags -i $(GTAGS_ARGS) "$$here"
+cscopelist: cscopelist-am
+
+cscopelist-am: $(am__tagged_files)
+	list='$(am__tagged_files)'; \
+	case "$(srcdir)" in \
+	  [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+	  *) sdir=$(subdir)/$(srcdir) ;; \
+	esac; \
+	for i in $$list; do \
+	  if test -f "$$i"; then \
+	    echo "$(subdir)/$$i"; \
+	  else \
+	    echo "$$sdir/$$i"; \
+	  fi; \
+	done >> $(top_builddir)/cscope.files
+
+distclean-tags:
+	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+# Recover from deleted '.trs' file; this should ensure that
+# "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create
+# both 'foo.log' and 'foo.trs'.  Break the recipe in two subshells
+# to avoid problems with "make -n".
+.log.trs:
+	rm -f $< $@
+	$(MAKE) $(AM_MAKEFLAGS) $<
+
+# Leading 'am--fnord' is there to ensure the list of targets does not
+# expand to empty, as could happen e.g. with make check TESTS=''.
+am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck)
+am--force-recheck:
+	@:
+
+$(TEST_SUITE_LOG): $(TEST_LOGS)
+	@$(am__set_TESTS_bases); \
+	am__f_ok () { test -f "$$1" && test -r "$$1"; }; \
+	redo_bases=`for i in $$bases; do \
+	              am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \
+	            done`; \
+	if test -n "$$redo_bases"; then \
+	  redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \
+	  redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \
+	  if $(am__make_dryrun); then :; else \
+	    rm -f $$redo_logs && rm -f $$redo_results || exit 1; \
+	  fi; \
+	fi; \
+	if test -n "$$am__remaking_logs"; then \
+	  echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \
+	       "recursion detected" >&2; \
+	else \
+	  am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \
+	fi; \
+	if $(am__make_dryrun); then :; else \
+	  st=0;  \
+	  errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \
+	  for i in $$redo_bases; do \
+	    test -f $$i.trs && test -r $$i.trs \
+	      || { echo "$$errmsg $$i.trs" >&2; st=1; }; \
+	    test -f $$i.log && test -r $$i.log \
+	      || { echo "$$errmsg $$i.log" >&2; st=1; }; \
+	  done; \
+	  test $$st -eq 0 || exit 1; \
+	fi
+	@$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \
+	ws='[ 	]'; \
+	results=`for b in $$bases; do echo $$b.trs; done`; \
+	test -n "$$results" || results=/dev/null; \
+	all=`  grep "^$$ws*:test-result:"           $$results | wc -l`; \
+	pass=` grep "^$$ws*:test-result:$$ws*PASS"  $$results | wc -l`; \
+	fail=` grep "^$$ws*:test-result:$$ws*FAIL"  $$results | wc -l`; \
+	skip=` grep "^$$ws*:test-result:$$ws*SKIP"  $$results | wc -l`; \
+	xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \
+	xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \
+	error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \
+	if test `expr $$fail + $$xpass + $$error` -eq 0; then \
+	  success=true; \
+	else \
+	  success=false; \
+	fi; \
+	br='==================='; br=$$br$$br$$br$$br; \
+	result_count () \
+	{ \
+	    if test x"$$1" = x"--maybe-color"; then \
+	      maybe_colorize=yes; \
+	    elif test x"$$1" = x"--no-color"; then \
+	      maybe_colorize=no; \
+	    else \
+	      echo "$@: invalid 'result_count' usage" >&2; exit 4; \
+	    fi; \
+	    shift; \
+	    desc=$$1 count=$$2; \
+	    if test $$maybe_colorize = yes && test $$count -gt 0; then \
+	      color_start=$$3 color_end=$$std; \
+	    else \
+	      color_start= color_end=; \
+	    fi; \
+	    echo "$${color_start}# $$desc $$count$${color_end}"; \
+	}; \
+	create_testsuite_report () \
+	{ \
+	  result_count $$1 "TOTAL:" $$all   "$$brg"; \
+	  result_count $$1 "PASS: " $$pass  "$$grn"; \
+	  result_count $$1 "SKIP: " $$skip  "$$blu"; \
+	  result_count $$1 "XFAIL:" $$xfail "$$lgn"; \
+	  result_count $$1 "FAIL: " $$fail  "$$red"; \
+	  result_count $$1 "XPASS:" $$xpass "$$red"; \
+	  result_count $$1 "ERROR:" $$error "$$mgn"; \
+	}; \
+	{								\
+	  echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" |	\
+	    $(am__rst_title);						\
+	  create_testsuite_report --no-color;				\
+	  echo;								\
+	  echo ".. contents:: :depth: 2";				\
+	  echo;								\
+	  for b in $$bases; do echo $$b; done				\
+	    | $(am__create_global_log);					\
+	} >$(TEST_SUITE_LOG).tmp || exit 1;				\
+	mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG);			\
+	if $$success; then						\
+	  col="$$grn";							\
+	 else								\
+	  col="$$red";							\
+	  test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG);		\
+	fi;								\
+	echo "$${col}$$br$${std}"; 					\
+	echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}";	\
+	echo "$${col}$$br$${std}"; 					\
+	create_testsuite_report --maybe-color;				\
+	echo "$$col$$br$$std";						\
+	if $$success; then :; else					\
+	  echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}";		\
+	  if test -n "$(PACKAGE_BUGREPORT)"; then			\
+	    echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}";	\
+	  fi;								\
+	  echo "$$col$$br$$std";					\
+	fi;								\
+	$$success || exit 1
+
+check-TESTS:
+	@list='$(RECHECK_LOGS)';           test -z "$$list" || rm -f $$list
+	@list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list
+	@test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+	@set +e; $(am__set_TESTS_bases); \
+	log_list=`for i in $$bases; do echo $$i.log; done`; \
+	trs_list=`for i in $$bases; do echo $$i.trs; done`; \
+	log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \
+	$(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \
+	exit $$?;
+recheck: all $(check_PROGRAMS)
+	@test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+	@set +e; $(am__set_TESTS_bases); \
+	bases=`for i in $$bases; do echo $$i; done \
+	         | $(am__list_recheck_tests)` || exit 1; \
+	log_list=`for i in $$bases; do echo $$i.log; done`; \
+	log_list=`echo $$log_list`; \
+	$(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \
+	        am__force_recheck=am--force-recheck \
+	        TEST_LOGS="$$log_list"; \
+	exit $$?
+create_fills.sh.log: create_fills.sh
+	@p='create_fills.sh'; \
+	b='create_fills.sh'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+nf03_test.log: nf03_test$(EXEEXT)
+	@p='nf03_test$(EXEEXT)'; \
+	b='nf03_test'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+f03tst_vars.log: f03tst_vars$(EXEEXT)
+	@p='f03tst_vars$(EXEEXT)'; \
+	b='f03tst_vars'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+f03tst_vars2.log: f03tst_vars2$(EXEEXT)
+	@p='f03tst_vars2$(EXEEXT)'; \
+	b='f03tst_vars2'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+f03tst_vars3.log: f03tst_vars3$(EXEEXT)
+	@p='f03tst_vars3$(EXEEXT)'; \
+	b='f03tst_vars3'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+f03tst_vars4.log: f03tst_vars4$(EXEEXT)
+	@p='f03tst_vars4$(EXEEXT)'; \
+	b='f03tst_vars4'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+f03tst_vars5.log: f03tst_vars5$(EXEEXT)
+	@p='f03tst_vars5$(EXEEXT)'; \
+	b='f03tst_vars5'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+f03tst_vars6.log: f03tst_vars6$(EXEEXT)
+	@p='f03tst_vars6$(EXEEXT)'; \
+	b='f03tst_vars6'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+f03tst_types.log: f03tst_types$(EXEEXT)
+	@p='f03tst_types$(EXEEXT)'; \
+	b='f03tst_types'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+f03tst_types2.log: f03tst_types2$(EXEEXT)
+	@p='f03tst_types2$(EXEEXT)'; \
+	b='f03tst_types2'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+f03tst_types3.log: f03tst_types3$(EXEEXT)
+	@p='f03tst_types3$(EXEEXT)'; \
+	b='f03tst_types3'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+f03tst_groups.log: f03tst_groups$(EXEEXT)
+	@p='f03tst_groups$(EXEEXT)'; \
+	b='f03tst_groups'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+f03tst_v2.log: f03tst_v2$(EXEEXT)
+	@p='f03tst_v2$(EXEEXT)'; \
+	b='f03tst_v2'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+f03test.log: f03test$(EXEEXT)
+	@p='f03test$(EXEEXT)'; \
+	b='f03test'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+tst03_f77_v2.log: tst03_f77_v2$(EXEEXT)
+	@p='tst03_f77_v2$(EXEEXT)'; \
+	b='tst03_f77_v2'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+.test.log:
+	@p='$<'; \
+	$(am__set_b); \
+	$(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+ at am__EXEEXT_TRUE@.test$(EXEEXT).log:
+ at am__EXEEXT_TRUE@	@p='$<'; \
+ at am__EXEEXT_TRUE@	$(am__set_b); \
+ at am__EXEEXT_TRUE@	$(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \
+ at am__EXEEXT_TRUE@	--log-file $$b.log --trs-file $$b.trs \
+ at am__EXEEXT_TRUE@	$(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \
+ at am__EXEEXT_TRUE@	"$$tst" $(AM_TESTS_FD_REDIRECT)
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+	  else \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
+	    || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+	$(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS)
+	$(MAKE) $(AM_MAKEFLAGS) check-TESTS
+check: check-am
+all-am: Makefile
+installdirs:
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	if test -z '$(STRIP)'; then \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	      install; \
+	else \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	    "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+	fi
+mostlyclean-generic:
+	-test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS)
+	-test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs)
+	-test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+
+clean-generic:
+	-test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-checkPROGRAMS clean-generic clean-libtool \
+	mostlyclean-am
+
+distclean: distclean-am
+	-rm -rf ./$(DEPDIR)
+	-rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+	distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+	-rm -rf ./$(DEPDIR)
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+	mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am:
+
+.MAKE: check-am install-am install-strip
+
+.PHONY: CTAGS GTAGS TAGS all all-am check check-TESTS check-am clean \
+	clean-checkPROGRAMS clean-generic clean-libtool cscopelist-am \
+	ctags ctags-am distclean distclean-compile distclean-generic \
+	distclean-libtool distclean-tags distdir dvi dvi-am html \
+	html-am info info-am install install-am install-data \
+	install-data-am install-dvi install-dvi-am install-exec \
+	install-exec-am install-html install-html-am install-info \
+	install-info-am install-man install-pdf install-pdf-am \
+	install-ps install-ps-am install-strip installcheck \
+	installcheck-am installdirs maintainer-clean \
+	maintainer-clean-generic mostlyclean mostlyclean-compile \
+	mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+	recheck tags tags-am uninstall uninstall-am
+
+
+# programs that "use tests" from the tests.mod module depend on it being built first, needed for make -j
+nf03_error.o nf03_test.o test03_get.o test03_put.o test03_read.o test03_write.o tst03_f77_v2.o util03.o: \
+module_tests.o
+
+test: check
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/nf03_test/create_fills.sh b/nf03_test/create_fills.sh
new file mode 100755
index 0000000..b1ba43c
--- /dev/null
+++ b/nf03_test/create_fills.sh
@@ -0,0 +1,11 @@
+#!/bin/sh
+# This shell script which creates the fill.nc file from fill.cdl.
+# $Id: create_fills.sh,v 1.2 2009/01/25 14:33:45 ed Exp $
+
+echo
+echo "*** Testing creating file with fill values."
+set -e
+#../ncgen/ncgen -b $srcdir/fills.cdl
+cp ${TOPSRCDIR}/nf_test/ref_fills.nc ./fills.nc
+echo "*** SUCCESS!"
+exit 0
diff --git a/nf03_test/f03lib.c b/nf03_test/f03lib.c
new file mode 100755
index 0000000..d7c5d37
--- /dev/null
+++ b/nf03_test/f03lib.c
@@ -0,0 +1,116 @@
+/*
+ * $Id: fort03.c,v 1.9 2007/07/28 13:14:00 rick Exp $
+ *
+ * This file contains support functions for FORTRAN code.  For example,
+ * under HP-UX A.09.05, the U77 library doesn't contain the exit()
+ * routine -- so we create one here.
+ */
+
+/*
+   Modified fortlib.c - We remove all cfortran.h stuff to make 
+   compiling easier. Also functions are modified to be extern
+   and not static so FORTRAN can see them
+
+   Version 1. July  2007 first vesion 
+   Version 2. April 2009 - modified for netCDF 4.0.1
+      
+   Modified by: Richard Weed, Ph.D
+   Center for Advanced Vehicular Systems
+   Misssissippi State University
+   rweed at .cavs.msstate.edu
+*/
+
+#include <stdlib.h>
+#include <limits.h>
+#include <float.h>
+
+
+extern double
+myrand(int iflag)
+{
+    if (iflag != 0)
+	srand(iflag);
+
+    /*
+     * Return a pseudo-random value between 0.0 and 1.0.
+     *
+     * We don't use RAND_MAX here because not all compilation
+     * environments define it (e.g. gcc(1) under SunOS 4.1.3).
+     */
+    return (rand() % 32768) / 32767.0;
+}
+
+
+extern int
+myshift(int value, int amount)
+{
+    if (amount < 0)
+	value >>= -amount;
+    else
+    if (amount > 0)
+	value <<= amount;
+    return value;
+}
+
+#include <signal.h>
+extern void
+nc_ignorefpe(int doit)
+{
+	if(doit)
+		(void) signal(SIGFPE, SIG_IGN);
+}
+
+extern double cmax_uchar()
+{
+    return UCHAR_MAX;
+}
+
+extern double cmin_schar()
+{
+    return SCHAR_MIN;
+}
+
+extern double cmax_schar()
+{
+    return SCHAR_MAX;
+}
+
+extern double cmin_short()
+{
+    return SHRT_MIN;
+}
+
+extern double cmax_short()
+{
+    return SHRT_MAX;
+}
+
+extern double cmin_int()
+{
+    return INT_MIN;
+}
+
+extern double cmax_int()
+{
+    return INT_MAX;
+}
+
+extern double cmin_long()
+{
+    return LONG_MIN;
+}
+
+extern double cmax_long()
+{
+    return LONG_MAX;
+}
+
+extern double cmax_float()
+{
+    return FLT_MAX;
+}
+
+extern double cmax_double()
+{
+    return DBL_MAX;
+}
diff --git a/nf03_test/f03lib_f_interfaces.f90 b/nf03_test/f03lib_f_interfaces.f90
new file mode 100755
index 0000000..fad5c68
--- /dev/null
+++ b/nf03_test/f03lib_f_interfaces.f90
@@ -0,0 +1,349 @@
+! FORTRAN interfaces to the C utilties defined in fortlib.c
+!
+! Written by: Richard Weed, Ph.D
+!             Center for Advanced Vehicular Systems
+!             Mississippi State University
+!             rweed at cavs.msstate.edu
+
+
+
+
+! License (and other Lawyer Language)
+ 
+! This software is released under the Apache 2.0 Open Source License. The
+! full text of the License can be viewed at :
+!
+!   http:www.apache.org/licenses/LICENSE-2.0.html
+!
+! The author grants to the University Corporation for Atmospheric Research
+! (UCAR), Boulder, CO, USA the right to revise and extend the software
+! without restriction. However, the author retains all copyrights and
+! intellectual property rights explicitly stated in or implied by the
+! Apache license
+
+! Version 1.  June 2006
+!             Unchanged for netCDF 4.1.1
+
+!-------------------------------  udexit --------------------------------------
+ Subroutine udexit(status)
+!
+ USE ISO_C_BINDING, ONLY: C_INT
+ Implicit NONE
+
+ 
+ Integer, Intent(IN) :: status
+ Integer(KIND=C_INT) :: cstatus
+ Interface
+  Subroutine exit(status) BIND(C)
+  USE ISO_C_BINDING, ONLY: C_INT
+  Integer(KIND=C_INT), VALUE :: status  
+  End Subroutine exit
+ End Interface
+
+ cstatus = status
+ Call exit(cstatus)
+
+ End Subroutine udexit
+!-------------------------------  udabort --------------------------------------
+ Subroutine udabort()
+ USE ISO_C_BINDING
+ Implicit NONE
+ Interface
+  Subroutine abort() BIND(C)
+  End Subroutine abort
+ End Interface
+
+ Call abort()
+
+ End Subroutine udabort
+!-------------------------------  udrand -------------------------------------
+ Function udrand(iflag) RESULT(rannum)
+
+ USE ISO_C_BINDING
+
+ Implicit NONE
+ Integer, Parameter :: RK8=SELECTED_REAL_KIND(P=13, R=307)  ! double
+ Integer, Intent(IN) :: iflag
+ Real(RK8) :: rannum
+ Integer(KIND=C_INT) :: ciflag
+ Real(KIND=C_DOUBLE) :: crannum
+ Interface
+  Function myrand(iflag) BIND(C)
+   USE ISO_C_BINDING, ONLY: C_INT, C_DOUBLE
+   Integer(KIND=C_INT), VALUE :: iflag
+   Real(KIND=C_DOUBLE) :: myrand
+  End Function myrand
+ End Interface
+
+ ciflag = iflag
+  
+ crannum = myrand(ciflag)
+ rannum = crannum
+
+ End Function udrand
+!-------------------------------  udshift -------------------------------------
+ Function udshift(ivalue, amount) RESULT(shiftval)
+
+ USE ISO_C_BINDING
+
+ Implicit NONE
+
+ Integer, Intent(IN) :: ivalue, amount
+ Integer(KIND=C_INT) :: cvalue, camount 
+ Integer :: shiftval 
+ Integer(KIND=C_INT) :: cshiftval
+ Interface
+  Function myshift(cvalue, camount) BIND(C)
+   USE ISO_C_BINDING, ONLY: C_INT
+   Integer(KIND=C_INT), VALUE :: cvalue, camount 
+   Integer(KIND=C_INT) :: myshift
+  End Function myshift
+ End Interface
+
+ cvalue = ivalue
+ camount = amount
+  
+ cshiftval = myshift(cvalue, camount)
+ shiftval = cshiftval
+
+ End Function udshift
+!-------------------------------  ignorefpe  ----------------------------------
+ Subroutine ignorefpe(idoit)
+
+ USE ISO_C_BINDING
+
+ Implicit NONE
+
+ Integer, Intent(IN) :: idoit 
+ Integer(KIND=C_INT) :: cdoit 
+ Interface
+  Subroutine nc_ignorefpe(cdoit) BIND(C)
+   USE ISO_C_BINDING, ONLY: C_INT
+   Integer(KIND=C_INT), VALUE :: cdoit 
+  End Subroutine nc_ignorefpe 
+ End Interface
+
+ cdoit = idoit
+ Call nc_ignorefpe(cdoit)
+
+ End Subroutine ignorefpe
+!-------------------------------  max_uchar  ----------------------------------
+ Function max_uchar() RESULT(cmax)
+
+ USE ISO_C_BINDING
+
+ Implicit NONE
+ Integer, Parameter :: RK8=SELECTED_REAL_KIND(P=13, R=307)  ! double
+ Real(RK8) :: cmax
+ Real(KIND=C_DOUBLE) :: ccmax
+ Interface
+  Function cmax_uchar() BIND(C)
+   USE ISO_C_BINDING, ONLY: C_DOUBLE
+   Real(KIND=C_DOUBLE) :: cmax_uchar
+  End Function cmax_uchar
+ End Interface
+
+ ccmax = cmax_uchar()
+ cmax = ccmax
+
+ End Function max_uchar
+!-------------------------------  min_schar  ----------------------------------
+ Function min_schar() RESULT(cmin)
+
+ USE ISO_C_BINDING
+
+ Implicit NONE
+ Integer, Parameter :: RK8=SELECTED_REAL_KIND(P=13, R=307)  ! double
+ Real(RK8) :: cmin
+ Real(KIND=C_DOUBLE) :: ccmin
+ Interface
+  Function cmin_schar() BIND(C)
+   USE ISO_C_BINDING, ONLY: C_DOUBLE
+   Real(KIND=C_DOUBLE) :: cmin_schar
+  End Function cmin_schar
+ End Interface
+
+ ccmin = cmin_schar()
+ cmin = ccmin
+
+ End Function min_schar
+!-------------------------------  max_schar  ----------------------------------
+ Function max_schar() RESULT(cmax)
+
+ USE ISO_C_BINDING
+
+ Implicit NONE
+ Integer, Parameter :: RK8=SELECTED_REAL_KIND(P=13, R=307)  ! double
+ Real(RK8) :: cmax
+ Real(KIND=C_DOUBLE) :: ccmax
+ Interface
+  Function cmax_schar() BIND(C)
+   USE ISO_C_BINDING, ONLY: C_DOUBLE
+   Real(KIND=C_DOUBLE) :: cmax_schar
+  End Function cmax_schar
+ End Interface
+
+ ccmax = cmax_schar()
+ cmax = ccmax
+
+ End Function max_schar
+!-------------------------------  min_short  ----------------------------------
+ Function min_short() RESULT(cmin)
+
+ USE ISO_C_BINDING
+
+ Implicit NONE
+ Integer, Parameter :: RK8=SELECTED_REAL_KIND(P=13, R=307)  ! double
+ Real(RK8) :: cmin
+ Real(KIND=C_DOUBLE) :: ccmin
+ Interface
+  Function cmin_short() BIND(C)
+   USE ISO_C_BINDING, ONLY: C_DOUBLE
+   Real(KIND=C_DOUBLE) :: cmin_short
+  End Function cmin_short
+ End Interface
+
+ ccmin = cmin_short()
+ cmin = ccmin
+
+ End Function min_short
+!-------------------------------  max_short  ----------------------------------
+ Function max_short() RESULT(cmax)
+
+ USE ISO_C_BINDING
+
+ Implicit NONE
+ Integer, Parameter :: RK8=SELECTED_REAL_KIND(P=13, R=307)  ! double
+ Real(RK8) :: cmax
+ Real(KIND=C_DOUBLE) :: ccmax
+ Interface
+  Function cmax_short() BIND(C)
+   USE ISO_C_BINDING, ONLY: C_DOUBLE
+   Real(KIND=C_DOUBLE) :: cmax_short
+  End Function cmax_short
+ End Interface
+
+ ccmax = cmax_short()
+ cmax = ccmax
+
+ End Function max_short
+!-------------------------------  min_int  ----------------------------------
+ Function min_int() RESULT(cmin)
+
+ USE ISO_C_BINDING
+
+ Implicit NONE
+ Integer, Parameter :: RK8=SELECTED_REAL_KIND(P=13, R=307)  ! double
+ Real(RK8) :: cmin
+ Real(KIND=C_DOUBLE) :: ccmin
+ Interface
+  Function cmin_int() BIND(C)
+   USE ISO_C_BINDING, ONLY: C_DOUBLE
+   Real(KIND=C_DOUBLE) :: cmin_int
+  End Function cmin_int
+ End Interface
+
+ ccmin = cmin_int()
+ cmin = ccmin
+
+ End Function min_int
+!-------------------------------  max_int  ----------------------------------
+ Function max_int() RESULT(cmax)
+
+ USE ISO_C_BINDING
+
+ Implicit NONE
+ Integer, Parameter :: RK8=SELECTED_REAL_KIND(P=13, R=307)  ! double
+ Real(RK8) :: cmax
+ Real(KIND=C_DOUBLE) :: ccmax
+ Interface
+  Function cmax_int() BIND(C)
+   USE ISO_C_BINDING, ONLY: C_DOUBLE
+   Real(KIND=C_DOUBLE) :: cmax_int
+  End Function cmax_int
+ End Interface
+
+ ccmax = cmax_int()
+ cmax = ccmax
+
+ End Function max_int
+!-------------------------------  min_long  ----------------------------------
+ Function min_long() RESULT(cmin)
+
+ USE ISO_C_BINDING
+
+ Implicit NONE
+ Integer, Parameter :: RK8=SELECTED_REAL_KIND(P=13, R=307)  ! double
+ Real(RK8) :: cmin
+ Real(KIND=C_DOUBLE) :: ccmin
+ Interface
+  Function cmin_long() BIND(C)
+   USE ISO_C_BINDING, ONLY: C_DOUBLE
+   Real(KIND=C_DOUBLE) :: cmin_long
+  End Function cmin_long
+ End Interface
+
+ ccmin = cmin_long()
+ cmin = ccmin
+
+ End Function min_long
+!-------------------------------  max_long  ----------------------------------
+ Function max_long() RESULT(cmax)
+
+ USE ISO_C_BINDING
+
+ Implicit NONE
+ Integer, Parameter :: RK8=SELECTED_REAL_KIND(P=13, R=307)  ! double
+ Real(RK8) :: cmax
+ Real(KIND=C_DOUBLE) :: ccmax
+ Interface
+  Function cmax_long() BIND(C)
+   USE ISO_C_BINDING, ONLY: C_DOUBLE
+   Real(KIND=C_DOUBLE) :: cmax_long
+  End Function cmax_long
+ End Interface
+
+ ccmax = cmax_long()
+ cmax = ccmax
+
+ End Function max_long
+!-------------------------------  max_float  ----------------------------------
+ Function max_float() RESULT(cmax)
+
+ USE ISO_C_BINDING
+
+ Implicit NONE
+ Integer, Parameter :: RK8=SELECTED_REAL_KIND(P=13, R=307)  ! double
+ Real(RK8) :: cmax
+ Real(KIND=C_DOUBLE) :: ccmax
+ Interface
+  Function cmax_float() BIND(C)
+   USE ISO_C_BINDING, ONLY: C_DOUBLE
+   Real(KIND=C_DOUBLE) :: cmax_float
+  End Function cmax_float
+ End Interface
+
+ ccmax = cmax_float()
+ cmax = ccmax
+
+ End Function max_float
+!-------------------------------  max_double  ----------------------------------
+ Function max_double() RESULT(cmax)
+
+ USE ISO_C_BINDING
+
+ Implicit NONE
+ Integer, Parameter :: RK8=SELECTED_REAL_KIND(P=13, R=307)  ! double
+ Real(RK8) :: cmax
+ Real(KIND=C_DOUBLE) :: ccmax
+ Interface
+  Function cmax_double() BIND(C)
+   USE ISO_C_BINDING, ONLY: C_DOUBLE
+   Real(KIND=C_DOUBLE) :: cmax_double
+  End Function cmax_double
+ End Interface
+
+ ccmax = cmax_double()
+ cmax = ccmax
+
+ End Function max_double
diff --git a/nf03_test/f03test.F b/nf03_test/f03test.F
new file mode 100755
index 0000000..cfb0191
--- /dev/null
+++ b/nf03_test/f03test.F
@@ -0,0 +1,1458 @@
+!********************************************************************
+!   Copyright 1993, UCAR/Unidata
+!   See netcdf/COPYRIGHT file for copying and redistribution conditions.
+!   $Id: ftest.F,v 1.11 2009/01/25 14:33:45 ed Exp $
+!********************************************************************
+
+#include "nfconfig.inc"
+
+!
+!     program to test the netCDF-2 Fortran API
+!
+      program ftest
+
+      use netcdf_f03
+
+!     name of first test cdf
+      character*31 name
+!     name of second test cdf
+      character*31 name2
+      
+!     Returned error code.
+      integer iret 
+!     netCDF ID
+      integer ncid
+!     ID of dimension lat
+      integer  latdim
+!     ID of dimension lon
+      integer londim
+!     ID of dimension level
+      integer leveldim
+!     ID of dimension time
+      integer timedim
+!     ID of dimension len
+      integer lendim
+
+!     Count the errors.
+      integer nfails
+
+!     variable used to control error-handling behavior
+      integer ncopts
+      integer dimsiz(MAXNCDIM)
+!      allowable roundoff 
+      common /dims/timedim, latdim, londim, leveldim, lendim,
+     + dimsiz
+      data name/'test.nc'/
+      data name2/'copy.nc'/
+
+      print *, ''
+      print *,'*** Testing netCDF-2 Fortran 77 API.'
+
+100   format(' *** testing ', a, ' ...')
+!     set error-handling to verbose and non-fatal
+      ncopts = NCVERBOS
+      call ncpopt(ncopts)
+
+!     This will be a count of how many failures we experience.
+      nfails = 0
+
+!     create a netCDF named 'test.nc'
+      write(*,100) 'nccre'
+      ncid = nccre(name, NCCLOB, iret)
+      if (ncid .eq. -1) then nfails = nfails + 1
+
+!     test ncddef
+      write(*,100) 'ncddef'
+      call tncddef(ncid, nfails)
+
+!     test ncvdef
+      write(*,100) 'ncvdef'
+      call tncvdef(ncid, nfails)
+
+!     test ncapt
+      write(*, 100) 'ncapt, ncaptc'
+      call tncapt(ncid, nfails)
+
+!     close 'test.nc'
+      write(*, 100) 'ncclos'
+      call ncclos(ncid, iret)
+      if (ncid .eq. -1) then nfails = nfails + 1
+
+!     test ncvpt1
+      write(*, 100) 'ncvpt1'
+      call tncvpt1(name, nfails)
+
+!     test ncvgt1
+      write(*, 100) 'ncvgt1'
+      call tncvgt1(name, nfails)
+
+!     test ncvpt
+      write(*, 100) 'ncvpt'
+      call tncvpt(name, nfails)
+
+!     test ncinq
+      write(*, 100) 'ncopn, ncinq, ncdinq, ncvinq, ncanam, ncainq'
+      call tncinq(name, nfails)
+
+!     test ncvgt
+      write(*, 100) 'ncvgt, ncvgtc'
+      call tncvgt(name, nfails)
+
+!     test ncagt
+      write(*, 100) 'ncagt, ncagtc'
+      call tncagt(name, nfails)
+
+!     test ncredf
+      write(*, 100) 'ncredf, ncdren, ncvren, ncaren, ncendf'
+      call tncredf(name, nfails)
+
+      call tncinq(name, nfails)
+
+!     test ncacpy
+      write(*, 100) 'ncacpy'
+      call tncacpy(name, name2, nfails)
+
+!     test ncadel
+      write(*, 100) 'ncadel'
+      call tncadel(name2, nfails)
+
+!     test fill values
+      write(*, 100) 'fill values'
+      call tfills(nfails)
+
+      print *,'Total number of failures: ', nfails
+      if (nfails .ne. 0) stop 2
+
+      print *,'*** SUCCESS!'
+
+      end
+!
+!     subroutine to test ncacpy
+!
+      subroutine tncacpy(iname, oname, nfails)
+      use netcdf_f03
+      character*31 iname, oname
+      integer ndims, nvars, natts, recdim, iret
+      character*31 vname, attnam
+      integer attype, attlen
+      integer vartyp, nvdims, vdims(MAXVDIMS), nvatts
+      integer lenstr
+!     existing netCDF id
+      integer incdf
+!     netCDF id of the output netCDF file to which the attribute
+!     will be copied
+      integer outcdf
+
+      integer mattlen
+      parameter (mattlen = 80)
+      character*80 charval
+      doubleprecision doubval(2)
+      real flval(2)
+      integer lngval(2)
+      NCSHORT_T shval(2)
+      integer i, j, k
+      character*31 varnam, attname(2,7), gattnam(2)
+      NCBYTE_T bytval(2)
+      common /atts/attname, gattnam
+      NCSHORT_T svalidrg(2)
+      real rvalidrg(2)
+      integer lvalidrg(2)
+      doubleprecision dvalidrg(2)
+      NCBYTE_T bvalidrg(2)
+      character*31 gavalue(2), cavalue(2)
+      real epsilon
+
+      data bvalidrg/-127,127/
+      data svalidrg/-100,100/
+      data lvalidrg/0,360/
+      data rvalidrg/0.0, 5000.0/
+      data dvalidrg/0D0,500D0/
+      data gavalue/'NWS', '88/10/25 12:00:00'/
+      data cavalue/'test string', 'a'/
+      data lenstr/80/   
+      data epsilon /.000001/
+
+      incdf = ncopn(iname, NCNOWRIT, iret)
+      if (iret .ne. 0) nfails = nfails + 1
+
+      outcdf = nccre(oname, NCCLOB, iret)
+      if (iret .ne. 0) nfails = nfails + 1
+
+      call tncddef(outcdf, nfails)
+      call tncvdef(outcdf, nfails)
+      call ncinq (incdf, ndims, nvars, natts, recdim, iret)
+      if (iret .ne. 0) nfails = nfails + 1
+      do 5 j = 1, natts
+         call ncanam (incdf, NCGLOBAL, j, attnam, iret)
+         if (iret .ne. 0) nfails = nfails + 1
+         call ncacpy (incdf, NCGLOBAL, attnam, outcdf, NCGLOBAL, iret)
+         if (iret .ne. 0) nfails = nfails + 1
+ 5    continue
+      do 10 i = 1, nvars
+         call ncvinq (incdf, i, vname, vartyp, nvdims,
+     +        vdims, nvatts, iret)
+         if (iret .ne. 0) nfails = nfails + 1
+         do 20 k = 1, nvatts
+            call ncanam (incdf, i, k, attnam, iret)
+            if (iret .ne. 0) nfails = nfails + 1
+            call ncacpy (incdf, i, attnam, outcdf, i, iret)
+            if (iret .ne. 0) nfails = nfails + 1
+ 20      continue
+ 10   continue
+!     
+!     get global attributes first
+!     
+      do 100 i = 1, natts
+         call ncanam (outcdf, NCGLOBAL, i, attnam, iret)
+         if (iret .ne. 0) nfails = nfails + 1
+         call ncainq (outcdf, NCGLOBAL, attnam, attype, attlen,
+     +        iret)
+         if (iret .ne. 0) nfails = nfails + 1
+         if (attlen .gt. mattlen) then
+            write (*,*) 'global attribute too big!', attlen, mattlen
+            stop 2
+         else if (attype .eq. NCBYTE) then
+            call ncagt (outcdf, NCBYTE, attnam, bytval, iret)
+            if (iret .ne. 0) nfails = nfails + 1
+         else if (attype .eq. NCCHAR) then
+            call ncagtc (outcdf, NCGLOBAL, attnam, charval, 
+     +           lenstr, iret)
+            if (iret .ne. 0) nfails = nfails + 1
+            if (attnam .ne. gattnam(i)) write(*,*) 'error in ncagt G'
+            if (charval .ne. gavalue(i))
+     + write(*,*) 'error in ncagt G2', lenstr, charval, gavalue(i)
+                  charval = ' '
+         else if (attype .eq. NCSHORT) then
+            call ncagt (outcdf, NCGLOBAL, attnam, shval, iret)
+            if (iret .ne. 0) nfails = nfails + 1
+         else if (attype .eq. NCLONG) then
+            call ncagt (outcdf, NCGLOBAL, attnam, lngval, iret)            
+            if (iret .ne. 0) nfails = nfails + 1
+         else if (attype .eq. NCFLOAT) then
+            call ncagt (outcdf, NCGLOBAL, attnam, flval, iret)
+            if (iret .ne. 0) nfails = nfails + 1
+         else 
+            call ncagt (outcdf, NCGLOBAL, attnam, doubval,iret)          
+            if (iret .ne. 0) nfails = nfails + 1
+         end if
+ 100   continue
+!
+!     get variable attributes
+!
+      do 200 i = 1, nvars
+         call ncvinq (outcdf, i, varnam, vartyp, nvdims, vdims,
+     +                nvatts, iret)
+         if (iret .ne. 0) nfails = nfails + 1
+         do 250 j = 1, nvatts
+            call ncanam (outcdf, i, j, attnam, iret)
+            if (iret .ne. 0) nfails = nfails + 1
+            call ncainq (outcdf, i, attnam, attype, attlen,
+     +                   iret)
+            if (iret .ne. 0) nfails = nfails + 1
+            if (attlen .gt. mattlen) then
+               write (*,*) 'variable ', i,  'attribute too big !'
+               stop 2
+            else 
+               if (attype .eq. NCBYTE) then
+                  call ncagt (outcdf, i, attnam, bytval, 
+     +                 iret)
+                  if (iret .ne. 0) nfails = nfails + 1
+                  if (attnam .ne. attname(j,i))
+     +               write(*,*) 'error in ncagt BYTE N'
+                  if (bytval(j) .ne. bvalidrg(j)) write(*,*)
+     + 'ncacpy: byte ', bytval(j), ' .ne. ', bvalidrg(j)
+               else if (attype .eq. NCCHAR) then
+                  call ncagtc (outcdf, i, attnam, charval, 
+     +                 lenstr, iret)
+                  if (iret .ne. 0) nfails = nfails + 1
+                  if (attnam .ne. attname(j,i)) 
+     +               write(*,*) 'error in ncagt CHAR N'
+                  if (charval .ne. cavalue(j)) 
+     +               write(*,*) 'error in ncagt'
+                  charval = ' '
+               else if (attype .eq. NCSHORT) then
+                  call ncagt (outcdf, i, attnam, shval, 
+     +                 iret)  
+                  if (iret .ne. 0) nfails = nfails + 1
+                  if (attnam .ne. attname(j,i)) 
+     +               write(*,*) 'error in ncagt SHORT N'
+                  if (shval(j) .ne. svalidrg(j)) then
+                     write(*,*) 'error in ncagt SHORT'
+                  end if
+               else if (attype .eq. NCLONG) then
+                  call ncagt (outcdf, i, attnam, lngval, 
+     +                 iret)
+                  if (iret .ne. 0) nfails = nfails + 1
+                  if (attnam .ne. attname(j,i)) 
+     +               write(*,*) 'error in ncagt LONG N'
+                  if (lngval(j) .ne. lvalidrg(j)) 
+     +               write(*,*) 'error in ncagt LONG'
+               else if (attype .eq. NCFLOAT) then
+                  call ncagt (outcdf, i, attnam, flval, 
+     +                 iret)            
+                  if (iret .ne. 0) nfails = nfails + 1
+                  if (attnam .ne. attname(j,i)) 
+     +               write(*,*) 'error in ncagt FLOAT N'
+                  if (flval(j) .ne. rvalidrg(j)) 
+     +               write(*,*) 'error in ncagt FLOAT'
+               else if (attype .eq. NCDOUBLE) then
+                  call ncagt (outcdf, i, attnam, doubval,
+     +                 iret)          
+                  if (iret .ne. 0) nfails = nfails + 1
+                  if (attnam .ne. attname(j,i)) 
+     +               write(*,*) 'error in ncagt DOUBLE N'
+                  if ( abs(doubval(j) - dvalidrg(j)) .gt. epsilon)
+     + write(*,*) 'error in ncagt DOUBLE'
+               end if
+            end if
+ 250     continue
+ 200   continue
+      call ncclos(incdf, iret)
+      if (iret .ne. 0) nfails = nfails + 1
+      call ncclos(outcdf, iret)
+      if (iret .ne. 0) nfails = nfails + 1
+      return
+      end
+
+
+      
+!     
+!     subroutine to test ncadel
+!
+      subroutine tncadel (cdfname, nfails)
+      use netcdf_f03
+      character*31 cdfname
+      
+      integer  bid, sid, lid, fid, did, cid, chid
+      common /vars/bid, sid, lid, fid, did, cid, chid
+      integer ncid, iret, i, j
+      integer ndims, nvars, natts, recdim
+      integer vartyp, nvdims, vdims(MAXVDIMS), nvatts
+      character*31 varnam, attnam
+
+      ncid = ncopn(cdfname, NCWRITE, iret)
+      if (iret .ne. 0) nfails = nfails + 1
+!     put cdf in define mode
+      call ncredf (ncid,iret)
+      if (iret .ne. 0) nfails = nfails + 1
+!     get number of global attributes
+      call ncinq (ncid, ndims, nvars, natts, recdim, iret)
+      if (iret .ne. 0) nfails = nfails + 1
+      do 10 i = natts, 1, -1
+!     get name of global attribute
+         call ncanam (ncid, NCGLOBAL, i, attnam, iret)
+         if (iret .ne. 0) nfails = nfails + 1
+!     delete global attribute
+         call ncadel (ncid, NCGLOBAL, attnam, iret)
+         if (iret .ne. 0) nfails = nfails + 1
+ 10   continue
+
+      do 100 i = 1, nvars
+!     get number of variable attributes
+         call ncvinq (ncid, i, varnam, vartyp, nvdims, vdims,
+     +        nvatts, iret)
+         if (iret .ne. 0) nfails = nfails + 1
+         do 200 j = nvatts, 1, -1
+            call ncanam (ncid, i, j, attnam, iret)
+            if (iret .ne. 0) nfails = nfails + 1
+            call ncadel (ncid, i, attnam, iret)
+            if (iret .ne. 0) nfails = nfails + 1
+ 200     continue
+ 100  continue
+      call ncinq (ncid, ndims, nvars, natts, recdim, iret)
+      if (iret .ne. 0) nfails = nfails + 1
+      if (natts .ne. 0) write(*,*) 'error in ncadel'
+!     put netCDF into data mode
+      call ncendf (ncid, iret)
+      if (iret .ne. 0) nfails = nfails + 1
+      call ncclos (ncid, iret)
+      if (iret .ne. 0) nfails = nfails + 1
+      return
+      end
+
+!
+!     subroutine to test ncagt and ncagtc
+
+      subroutine tncagt(cdfname, nfails)
+      use netcdf_f03
+      character*31 cdfname
+            
+!     maximum length of an attribute
+      integer mattlen
+      parameter (mattlen = 80)
+      integer ncid, ndims, nvars, natts, recdim
+      integer bid, sid, lid, fid, did, cid, chid
+      common /vars/bid, sid, lid, fid, did, cid, chid
+      integer i, j
+      integer attype, attlen, lenstr, iret
+      character*31 attnam
+      character*80 charval
+      doubleprecision doubval(2)
+      real flval(2)
+      integer lngval(2)
+      NCSHORT_T shval(2)
+      NCBYTE_T bytval(2)
+      integer vartyp, nvdims, vdims(MAXVDIMS), nvatts
+
+      character*31 varnam, attname(2,7), gattnam(2)
+      common /atts/attname, gattnam
+      NCSHORT_T svalidrg(2)
+      real rvalidrg(2)
+      integer lvalidrg(2)
+      doubleprecision dvalidrg(2)
+      NCBYTE_T bvalidrg(2)
+      character*31 gavalue(2), cavalue(2)
+      real epsilon
+
+      data bvalidrg/-127,127/
+      data svalidrg/-100,100/
+      data lvalidrg/0,360/
+      data rvalidrg/0.0, 5000.0/
+      data dvalidrg/0D0,500D0/
+      data gavalue/'NWS', '88/10/25 12:00:00'/
+      data cavalue/'test string', 'a'/
+      data lenstr/80/   
+      data epsilon /.000001/
+      
+      ncid = ncopn (cdfname, NCNOWRIT, iret)
+      if (iret .ne. 0) nfails = nfails + 1
+      call ncinq (ncid, ndims, nvars, natts, recdim, iret)
+      if (iret .ne. 0) nfails = nfails + 1
+!     
+!     get global attributes first
+!     
+      do 10 i = 1, natts
+!     get name of attribute
+         call ncanam (ncid, NCGLOBAL, i, attnam, iret)
+         if (iret .ne. 0) nfails = nfails + 1
+!     get attribute type and length
+         call ncainq (ncid, NCGLOBAL, attnam, attype, attlen,
+     +        iret)
+         if (iret .ne. 0) nfails = nfails + 1
+         if (attlen .gt. mattlen) then
+            write (*,*) 'global attribute too big!'
+            stop 2
+         else if (attype .eq. NCBYTE) then
+            call ncagt (ncid, NCBYTE, attnam, bytval, iret)
+            if (iret .ne. 0) nfails = nfails + 1
+         else if (attype .eq. NCCHAR) then
+            call ncagtc (ncid, NCGLOBAL, attnam, charval, 
+     +           lenstr, iret)
+            if (iret .ne. 0) nfails = nfails + 1
+            if (attnam .ne. gattnam(i)) write(*,*) 'error in ncagt'
+            if (charval .ne. gavalue(i)) write(*,*) 'error in ncagt'
+            charval = '                                        '
+         else if (attype .eq. NCSHORT) then
+            call ncagt (ncid, NCGLOBAL, attnam, shval, iret) 
+            if (iret .ne. 0) nfails = nfails + 1
+         else if (attype .eq. NCLONG) then
+            call ncagt (ncid, NCGLOBAL, attnam, lngval, iret)            
+            if (iret .ne. 0) nfails = nfails + 1
+         else if (attype .eq. NCFLOAT) then
+            call ncagt (ncid, NCGLOBAL, attnam, flval, iret)
+            if (iret .ne. 0) nfails = nfails + 1
+         else 
+            call ncagt (ncid, NCGLOBAL, attnam, doubval,iret)          
+            if (iret .ne. 0) nfails = nfails + 1
+         end if
+ 10   continue
+
+!
+!     get variable attributes
+!
+      do 20 i = 1, nvars
+         call ncvinq (ncid, i, varnam, vartyp, nvdims, vdims,
+     +                nvatts, iret)
+         if (iret .ne. 0) nfails = nfails + 1
+         do 25 j = 1, nvatts
+            call ncanam (ncid, i, j, attnam, iret)
+            if (iret .ne. 0) nfails = nfails + 1
+            call ncainq (ncid, i, attnam, attype, attlen,
+     +                   iret)
+            if (iret .ne. 0) nfails = nfails + 1
+            if (attlen .gt. mattlen) then
+               write (*,*) 'variable ', i,  'attribute too big !'
+               stop 2
+            else 
+               if (attype .eq. NCBYTE) then
+                  call ncagt (ncid, i, attnam, bytval, 
+     +                 iret)
+                  if (iret .ne. 0) nfails = nfails + 1
+                  if (attnam .ne. attname(j,i)) 
+     +               write(*,*) 'error in ncagt BYTE name'
+                  if (bytval(j) .ne. bvalidrg(j)) write(*,*)
+     + 'ncacpy: byte ', bytval(j), ' .ne. ', bvalidrg(j)
+               else if (attype .eq. NCCHAR) then
+                  call ncagtc (ncid, i, attnam, charval, 
+     +                 lenstr, iret)
+                  if (iret .ne. 0) nfails = nfails + 1
+                  if (attnam .ne. attname(j,i)) 
+     +               write(*,*) 'error in ncagt CHAR name'
+                  if (charval .ne. cavalue(j)) 
+     +               write(*,*) 'error in ncagt CHAR name'
+                 charval = '                                        '
+               else if (attype .eq. NCSHORT) then
+                  call ncagt (ncid, i, attnam, shval, 
+     +                 iret)  
+                  if (iret .ne. 0) nfails = nfails + 1
+                  if (attnam .ne. attname(j,i)) 
+     +               write(*,*) 'error in ncagt SHORT name'
+                  if (shval(j) .ne. svalidrg(j)) then
+                     write(*,*) 'error in ncagt SHORT'
+                  end if
+               else if (attype .eq. NCLONG) then
+                  call ncagt (ncid, i, attnam, lngval, 
+     +                 iret)
+                  if (iret .ne. 0) nfails = nfails + 1
+                  if (attnam .ne. attname(j,i)) 
+     +               write(*,*) 'error in ncagt LONG name'
+                  if (lngval(j) .ne. lvalidrg(j)) 
+     +               write(*,*) 'error in ncagt LONG'
+               else if (attype .eq. NCFLOAT) then
+                  call ncagt (ncid, i, attnam, flval, 
+     +                 iret)            
+                  if (iret .ne. 0) nfails = nfails + 1
+                  if (attnam .ne. attname(j,i)) 
+     +               write(*,*) 'error in ncagt FLOAT name'
+                  if (flval(j) .ne. rvalidrg(j)) 
+     +               write(*,*) 'error in ncagt FLOAT'
+               else if (attype .eq. NCDOUBLE) then
+                  call ncagt (ncid, i, attnam, doubval,
+     +                 iret)          
+                  if (iret .ne. 0) nfails = nfails + 1
+                  if (attnam .ne. attname(j,i)) 
+     +               write(*,*) 'error in ncagt DOUBLE name'
+                  if ( abs(doubval(j) - dvalidrg(j)) .gt. epsilon)
+     + write(*,*) 'error in ncagt DOUBLE'
+               end if
+            end if
+ 25      continue
+ 20   continue
+      call ncclos(ncid, iret)
+      if (iret .ne. 0) nfails = nfails + 1
+      return
+      end
+!
+!     subroutine to test ncapt
+!
+      subroutine tncapt (ncid, nfails)
+      use netcdf_f03
+      integer ncid, iret
+
+! attribute vectors
+      NCSHORT_T svalidrg(2)
+      real rvalidrg(2)
+      integer lvalidrg(2)
+      doubleprecision dvalidrg(2)
+      NCBYTE_T bvalidrg(2)
+
+!     variable ids
+      integer  bid, sid, lid, fid, did, cid, chid
+      common /vars/bid, sid, lid, fid, did, cid, chid
+
+! assign attributes
+      
+!
+!     byte
+!
+      
+      bvalidrg(1) = -127
+      bvalidrg(2) =  127
+      call ncapt (ncid, bid, 'validrange', NCBYTE, 2,
+     +bvalidrg, iret)
+      if (iret .ne. 0) nfails = nfails + 1
+
+!
+!     short
+!
+
+      svalidrg(1) = -100
+      svalidrg(2) = 100
+      call ncapt (ncid, sid, 'validrange', NCSHORT, 2, 
+     +svalidrg, iret)
+      if (iret .ne. 0) nfails = nfails + 1
+
+!
+!     long
+!
+
+      lvalidrg(1) = 0
+      lvalidrg(2) = 360
+      call ncapt (ncid, lid, 'validrange', NCLONG, 2,
+     +lvalidrg, iret)
+      if (iret .ne. 0) nfails = nfails + 1
+      
+!
+!     float
+!
+
+      rvalidrg(1) = 0.0
+      rvalidrg(2) = 5000.0
+      call ncapt (ncid, fid, 'validrange', NCFLOAT, 2,
+     +rvalidrg, iret)
+      if (iret .ne. 0) nfails = nfails + 1
+
+!
+!     double
+!
+
+      dvalidrg(1) = 0D0
+      dvalidrg(2) = 500D0
+      call ncapt (ncid, did, 'validrange', NCDOUBLE, 2,
+     +dvalidrg, iret)
+      if (iret .ne. 0) nfails = nfails + 1
+
+!
+!     global
+!
+
+      call ncaptc (ncid, NCGLOBAL, 'source', NCCHAR, 3, 
+     +'NWS', iret)
+      if (iret .ne. 0) nfails = nfails + 1
+      call ncaptc (ncid, NCGLOBAL, 'basetime', NCCHAR, 17, 
+     +'88/10/25 12:00:00', iret)
+      if (iret .ne. 0) nfails = nfails + 1
+
+!
+!     char
+!
+
+      call ncaptc (ncid, chid, 'longname', NCCHAR, 11,
+     +'test string', iret)
+      if (iret .ne. 0) nfails = nfails + 1
+
+      call ncaptc (ncid, chid, 'id', NCCHAR, 1,
+     +'a', iret)
+      if (iret .ne. 0) nfails = nfails + 1
+
+      return
+      end
+
+!
+!     initialize variables in labelled common blocks
+!
+      block data
+      common /cdims/ dimnam
+      common /dims/timedim, latdim, londim, leveldim, lendim,
+     + dimsiz
+      common /varn/varnam
+      common /atts/attname, gattnam
+      integer  latdim, londim, leveldim, timedim, lendim
+
+!     should include 'netcdf.inc' for MAXNCDIM, but it has EXTERNAL
+!     declaration, which is not permitted in a BLOCK DATA unit.
+
+      integer dimsiz(1024)
+      character*31 dimnam(1024)
+      character*31 varnam(7)
+      character*31 attname(2,7)
+      character*31 gattnam(2)
+
+      data dimnam /'time', 'lat', 'lon', 'level',
+     + 'length', 1019*'0'/
+      data dimsiz /4, 5, 5, 4, 80, 1019*0/
+      data varnam/'bytev', 'shortv', 'longv', 'floatv', 'doublev', 
+     + 'chv', 'cv'/
+      
+      data attname/'validrange', '0', 'validrange', '0', 'validrange',
+     + '0', 'validrange', '0', 'validrange', '0', 'longname', 'id',
+     + '0', '0'/
+      data gattnam/'source','basetime'/
+      end
+
+
+!
+!     subroutine to test ncddef
+!
+
+      subroutine tncddef(ncid, nfails)
+      use netcdf_f03
+      integer ncid
+
+!     sizes of dimensions of 'test.nc' and 'copy.nc'
+      integer  ndims
+      parameter(ndims=5)
+! dimension ids
+      integer  latdim, londim, leveldim, timedim, lendim
+      integer iret
+!     function to define a netCDF dimension
+      integer dimsiz(MAXNCDIM)
+      character*31 dimnam(MAXNCDIM)
+      
+      common /dims/timedim, latdim, londim, leveldim, lendim,
+     + dimsiz
+      common /cdims/ dimnam
+
+! define dimensions
+      timedim = ncddef(ncid, dimnam(1), NCUNLIM, iret)
+      if (iret .ne. 0) nfails = nfails + 1
+      latdim = ncddef(ncid, dimnam(2), dimsiz(2), iret)
+      if (iret .ne. 0) nfails = nfails + 1
+      londim = ncddef(ncid, dimnam(3), dimsiz(3), iret)
+      if (iret .ne. 0) nfails = nfails + 1
+      leveldim = ncddef(ncid, dimnam(4), dimsiz(4), iret)
+      if (iret .ne. 0) nfails = nfails + 1
+      lendim = ncddef(ncid, dimnam(5), dimsiz(5), iret)
+      if (iret .ne. 0) nfails = nfails + 1
+      return
+      end
+!
+!     subroutine to test ncinq, ncdinq, ncdid, ncvinq, ncanam
+!     and ncainq
+!
+      subroutine tncinq(cdfname, nfails)
+      use netcdf_f03
+      character*31 cdfname
+
+!     netCDF id
+      integer ncid
+!     returned number of dimensions
+      integer ndims
+!     returned number of variables
+      integer nvars
+!     returned number of global attributes
+      integer natts
+!     returned id of the unlimited dimension
+      integer recdim
+!     returned error code
+      integer iret
+!     returned name of record dimension
+      character*31 recnam
+!     returned size of record dimension
+      integer recsiz
+!     loop control variables
+      integer i, j, k
+!     returned size of dimension
+      integer dsize
+!     returned dimension ID
+      integer dimid
+!     returned dimension name
+      character*31 dname
+!     returned variable name
+      character*31 vname
+!     returned attribute name
+      character*31 attnam
+!     returned netCDF datatype of variable
+      integer vartyp
+!     returned number of variable dimensions
+      integer nvdims
+!     returned number of variable attributes
+      integer nvatts
+!     returned vector of nvdims dimension IDS corresponding to the
+!     variable dimensions
+      integer vdims(MAXNCDIM)
+!     returned attribute length
+      integer attlen
+!     returned attribute type
+      integer attype
+      character*31 dimnam(MAXNCDIM)
+      character*31 varnam(7)
+      character*31 attname(2,7)
+      character*31 gattnam(2)
+      integer vdlist(5,7), vtyp(7), vndims(7), vnatts(7)
+      integer attyp(2,7),atlen(2,7),gattyp(2),gatlen(2)
+      integer timedim,latdim,londim,leveldim,lendim
+      integer dimsiz(MAXNCDIM)
+      common /dims/timedim, latdim, londim, leveldim, lendim,
+     + dimsiz
+      common /varn/varnam
+      common /atts/attname, gattnam
+      common /cdims/ dimnam
+
+      data vdlist/1,0,0,0,0,1,0,0,0,0,2,0,0,0,0,4,3,2,1,0,4,3,2,1,0,
+     + 5,1,0,0,0,1,0,0,0,0/
+      data vtyp/NCBYTE, NCSHORT, NCLONG, NCFLOAT, NCDOUBLE, NCCHAR,
+     + NCCHAR/
+      data vndims/1,1,1,4,4,2,1/
+      data vnatts/1,1,1,1,1,2,0/
+      data attyp/NCBYTE, 0, NCSHORT, 0, NCLONG, 0, NCFLOAT, 0,
+     + NCDOUBLE, 0, NCCHAR, NCCHAR, 0, 0/
+      data atlen/2,0,2,0,2,0,2,0,2,0,11,1, 0, 0/
+      data gattyp/NCCHAR,NCCHAR/
+      data gatlen/3,17/
+
+      ncid = ncopn (cdfname, NCNOWRIT, iret)
+      call ncinq (ncid, ndims, nvars, natts, recdim, iret)
+      if (iret .ne. 0) nfails = nfails + 1
+      if (ndims .ne. 5) write(*,*) 'error in ncinq or ncddef'
+      if (nvars .ne. 7) write(*,*) 'error in ncinq or ncvdef'
+      if (natts .ne. 2) write(*,*) 'error in ncinq or ncapt'
+      call ncdinq (ncid, recdim, recnam, recsiz, iret)
+      if (iret .ne. 0) nfails = nfails + 1
+      if (recnam .ne. 'time') write(*,*) 'error: bad recdim from ncinq'
+!
+!     dimensions
+!
+      do 10 i = 1, ndims
+         call ncdinq (ncid, i, dname, dsize, iret)
+         if (iret .ne. 0) nfails = nfails + 1
+         if (dname .ne. dimnam(i)) 
+     +      write(*,*) 'error in ncdinq or ncddef, dname=', dname
+         if (dsize .ne. dimsiz(i)) 
+     +      write(*,*) 'error in ncdinq or ncddef, dsize=',dsize
+         dimid = ncdid (ncid, dname, iret)
+         if (dimid .ne. i) write(*,*)
+     +      'error in ncdinq or ncddef, dimid=', dimid
+ 10   continue
+!
+!     variables
+!
+      do 30 i = 1, nvars
+         call ncvinq (ncid, i, vname, vartyp, nvdims,
+     +        vdims, nvatts, iret)
+         if (iret .ne. 0) nfails = nfails + 1
+         if (vname .ne. varnam(i)) 
+     +      write(*,*) 'error: from ncvinq, wrong name returned: ', 
+     +         vname, ' .ne. ', varnam(i)
+         if (vartyp .ne. vtyp(i)) 
+     +      write(*,*) 'error: from ncvinq, wrong type returned: ', 
+     +         vartyp, ' .ne. ', vtyp(i)
+         if (nvdims .ne. vndims(i)) 
+     +      write(*,*) 'error: from ncvinq, wrong num dims returned: ', 
+     +         vdims, ' .ne. ', vndims(i)
+         do 35 j = 1, nvdims
+            if (vdims(j) .ne. vdlist(j,i)) 
+     +         write(*,*) 'error: from ncvinq wrong dimids: ',
+     +            vdims(j), ' .ne. ', vdlist(j,i)
+ 35      continue
+         if (nvatts .ne. vnatts(i)) 
+     +      write(*,*) 'error in ncvinq or ncvdef'
+!
+!     attributes
+!
+         do 45 k = 1, nvatts
+            call ncanam (ncid, i, k, attnam, iret)
+            if (iret .ne. 0) nfails = nfails + 1
+            call ncainq (ncid, i, attnam, attype, attlen, iret)
+            if (iret .ne. 0) nfails = nfails + 1
+            if (attnam .ne. attname(k,i)) 
+     +         write(*,*) 'error in ncanam or ncapt'
+            if (attype .ne. attyp(k,i)) 
+     +         write(*,*) 'error in ncainq or ncapt'
+            if (attlen .ne. atlen(k,i)) 
+     +         write(*,*) 'error in ncainq or ncapt'
+ 45      continue
+ 30   continue
+      do 40 i = 1, natts
+         call ncanam (ncid, NCGLOBAL, i, attnam, iret)
+         if (iret .ne. 0) nfails = nfails + 1
+         call ncainq (ncid, NCGLOBAL, attnam, attype, attlen, iret)
+         if (iret .ne. 0) nfails = nfails + 1
+         if (attnam .ne. gattnam(i)) 
+     +      write(*,*) 'error in ncanam or ncapt'
+         if (attype .ne. gattyp(i)) 
+     +      write(*,*) 'error in ncainq or ncapt'
+         if (attlen .ne. gatlen(i)) 
+     +      write(*,*) 'error in ncainq or ncapt'
+ 40   continue
+      call ncclos(ncid, iret)
+      if (iret .ne. 0) nfails = nfails + 1
+      return
+      end
+      
+      
+      
+!     subroutine to test ncredf, ncdren, ncvren, ncaren, and 
+!     ncendf
+
+      subroutine tncredf(cdfname, nfails)
+      use netcdf_f03
+      character*31 cdfname
+      character*31 attname(2,7)
+      character*31 gattnam(2)
+      common /atts/attname, gattnam
+      common /cdims/ dimnam
+      character*31 dimnam(MAXNCDIM)
+      character*31 varnam(7)
+      common /varn/varnam
+      integer ncid, iret, latid, varid
+
+      dimnam(2) = 'latitude'
+      varnam(4) = 'realv'
+      attname(1,6) = 'stringname'
+      gattnam(1) = 'agency'
+      ncid = ncopn(cdfname, NCWRITE, iret)
+      if (iret .ne. 0) nfails = nfails + 1
+      call ncredf(ncid, iret)
+      if (iret .ne. 0) nfails = nfails + 1
+      latid = ncdid(ncid, 'lat', iret)
+      call ncdren(ncid, latid, 'latitude', iret)
+      if (iret .ne. 0) nfails = nfails + 1
+      varid = ncvid(ncid, 'floatv', iret)
+      call ncvren(ncid, varid, 'realv', iret)
+      if (iret .ne. 0) nfails = nfails + 1
+      varid = ncvid(ncid, 'chv', iret)
+      if (iret .ne. 0) nfails = nfails + 1
+      call ncaren(ncid, varid, 'longname', 'stringname', iret)
+      if (iret .ne. 0) nfails = nfails + 1
+      call ncaren(ncid, NCGLOBAL, 'source', 'agency', iret)
+      if (iret .ne. 0) nfails = nfails + 1
+      call ncendf(ncid, iret)
+      if (iret .ne. 0) nfails = nfails + 1
+      call ncclos(ncid, iret)
+      if (iret .ne. 0) nfails = nfails + 1
+      return
+      end
+!     
+!     subroutine to test ncvdef
+!
+
+      subroutine tncvdef(ncid, nfails)
+      use netcdf_f03
+      integer ncid
+
+!     function to define a netCDF variable
+      integer dimsiz(MAXNCDIM)
+      integer  latdim, londim, leveldim, timedim, lendim
+      common /dims/timedim, latdim, londim, leveldim, lendim, 
+     + dimsiz
+
+! variable ids
+      integer  bid, sid, lid, fid, did, cid, chid
+      common /vars/bid, sid, lid, fid, did, cid, chid
+
+! variable shapes
+      integer  bdims(1), fdims(4), ddims(4), ldims(1), sdims(1) 
+      integer chdims(2), cdims(1)
+
+      integer iret
+!
+! define variables
+!
+!     byte
+! 
+      bdims(1) = timedim
+      bid = ncvdef(ncid, 'bytev', NCBYTE, 1, bdims, iret)
+      if (iret .ne. 0) nfails = nfails + 1
+!
+!     short
+!
+      sdims(1) = timedim
+      sid = ncvdef (ncid, 'shortv', NCSHORT, 1, sdims, iret)
+      if (iret .ne. 0) nfails = nfails + 1
+!
+!     long
+!
+      ldims(1) = latdim
+      lid = ncvdef (ncid, 'longv', NCLONG, 1, ldims, iret)
+      if (iret .ne. 0) nfails = nfails + 1
+!
+!     float
+!
+      fdims(4) = timedim
+      fdims(1) = leveldim
+      fdims(2) = londim
+      fdims(3) = latdim
+      fid = ncvdef (ncid, 'floatv', NCFLOAT, 4, fdims, iret)
+      if (iret .ne. 0) nfails = nfails + 1
+!
+!     double
+!
+      ddims(4) = timedim
+      ddims(1) = leveldim
+      ddims(2) = londim
+      ddims(3) = latdim
+      did = ncvdef (ncid, 'doublev', NCDOUBLE, 4, ddims, iret)
+      if (iret .ne. 0) nfails = nfails + 1
+!
+!     char
+!
+      chdims(2) = timedim
+      chdims(1) = lendim
+      chid = ncvdef (ncid, 'chv', NCCHAR, 2, chdims, iret)
+      if (iret .ne. 0) nfails = nfails + 1
+
+      cdims(1) = timedim
+      cid = ncvdef (ncid, 'cv', NCCHAR, 1, cdims, iret)
+      if (iret .ne. 0) nfails = nfails + 1
+
+
+      return
+      end
+
+
+!    
+!     subroutine to test ncvgt and ncvgtc
+!
+      subroutine tncvgt(cdfname, nfails)
+      use netcdf_f03
+      character*31 cdfname
+
+      integer ndims, times, lats, lons, levels, lenstr
+      parameter (times=4, lats=5, lons=5, levels=4)
+
+      integer start(4), count(4)
+      integer ncid, iret, i, m
+      integer  latdim, londim, leveldim, timedim, lendim
+      integer dimsiz(MAXNCDIM)
+      common /dims/timedim, latdim, londim, leveldim, lendim,
+     + dimsiz
+
+      integer bid, sid, lid, fid, did, cid, chid
+      common /vars/bid, sid, lid, fid, did, cid, chid
+      integer itime, ilev, ilat, ilon
+
+!     arrays of data values to be read
+      NCBYTE_T barray(times), byval(times)
+      NCSHORT_T sarray(times), shval(times)
+      integer larray(lats)
+      real farray(levels, lats, lons, times)
+      doubleprecision darray(levels, lats, lons, times)
+!     character array of data values to be read
+      character*31 string
+      character*31 varnam
+      integer nvars, natts, recdim
+      integer vartyp, nvdims, vdims(MAXVDIMS), nvatts
+
+      data start/1,1,1,1/
+      data count/levels, lats, lons, times/
+      data byval /97, 98, 99, 100/
+      data shval /10, 11, 12, 13/
+
+      ncid = ncopn (cdfname, NCWRITE, iret)
+      if (iret .ne. 0) nfails = nfails + 1
+!     get number of variables in netCDF
+      call ncinq (ncid, ndims, nvars, natts, recdim, iret)
+      if (iret .ne. 0) nfails = nfails + 1
+      do 5 m = 1, nvars-1
+!     get variable name, datatype, number of dimensions
+!     vector of dimension ids, and number of variable attributes
+         call ncvinq (ncid, m, varnam, vartyp, nvdims, vdims,
+     +                nvatts, iret)
+         if (iret .ne. 0) nfails = nfails + 1
+         if (vartyp .eq. NCBYTE) then
+!
+!     byte
+!
+            count(1) = times
+            call ncvgt (ncid, m, start, count, barray, iret)
+            if (iret .ne. 0) nfails = nfails + 1
+            do 10 i = 1, times
+               if (barray(i) .ne. byval(i)) then 
+                  write(*,*) 'ncvgt of bytes, got ', barray(i), ' .ne. '
+     +                       , byval(i)
+               end if
+ 10         continue
+         else if (vartyp .eq. NCSHORT) then
+!
+!     short
+!
+            count(1) = times
+            call ncvgt (ncid, m, start, count, sarray, iret)
+            if (iret .ne. 0) nfails = nfails + 1
+            do 20 i = 1, times
+               if (sarray(i) .ne. shval(i)) then 
+                  write(*,*) 'ncvgt of short, got ', sarray(i), ' .ne. '
+     +                       , shval(i)
+               end if
+ 20         continue
+         else if (vartyp .eq. NCLONG) then
+!     
+!     long
+!
+            count(1) = lats
+            call ncvgt (ncid, m, start, count, larray, iret)
+            if (iret .ne. 0) nfails = nfails + 1
+            do 30 i = 1, lats
+               if (larray(i) .ne. 1000) then 
+                  write(*,*) 'long error in ncvgt'
+               end if
+ 30         continue
+         else if (vartyp .eq. NCFLOAT) then
+!     
+!     float
+!
+            count(1) = levels
+            call ncvgt (ncid, m, start, count, farray, iret)
+            if (iret .ne. 0) nfails = nfails + 1
+            i = 0
+            do 40 itime = 1,times
+               do 41 ilon = 1, lons
+                  do 42 ilat = 1, lats
+                     do 43 ilev = 1, levels
+                        i = i + 1
+                        if (farray(ilev, ilat, ilon, itime) .ne.
+     + real(i)) then
+                           write (*,*) 'float error in ncvgt'
+                        end if
+ 43         continue
+ 42         continue
+ 41         continue
+ 40         continue
+         else if (vartyp .eq. NCDOUBLE) then
+!
+!     double
+!
+            count(1) = levels
+            call ncvgt (ncid, m, start, count, darray, iret)
+            if (iret .ne. 0) nfails = nfails + 1
+            i = 0
+            do 50 itime = 1, times
+               do 51 ilon = 1, lons
+                  do 52 ilat = 1, lats
+                     do 53 ilev = 1, levels
+                        i = i + 1
+                        if (darray(ilev, ilat, ilon, itime) .ne.
+     +                       real (i)) then
+                           write(*,*) 'double error in ncvgt:', i,
+     +              darray(ilev, ilat, ilon, itime), '.ne.', 
+     +              real (i)
+                        end if
+ 53         continue
+ 52         continue
+ 51         continue
+ 50         continue
+         else 
+!     
+!     char
+!
+            count(1) = 3
+            count(2) = 4
+            lenstr = 31
+            call ncvgtc (ncid, m, start, count, string, lenstr, iret)
+            if (iret .ne. 0) nfails = nfails + 1
+            if (string .ne. 'testhikin of') then 
+               write(*,*) 'error in ncvgt, returned string =', string
+            end if
+         end if
+ 5    continue
+      call ncclos(ncid, iret)
+      if (iret .ne. 0) nfails = nfails + 1
+      return
+      end
+
+      
+      subroutine tncvgt1(cdfname, nfails)
+      use netcdf_f03
+      character*31 cdfname
+
+      integer ncid, iret
+      integer  latdim, londim, leveldim, timedim, lendim
+      integer dimsiz(MAXNCDIM)
+      common /dims/timedim, latdim, londim, leveldim, lendim,
+     + dimsiz
+
+      integer bindx(1), sindx(1), lindx(1), findx(4), dindx(4), cindx(1)
+
+      integer bid, sid, lid, fid, did, cid, chid
+      common /vars/bid, sid, lid, fid, did, cid, chid
+
+      NCBYTE_T bvalue
+      NCSHORT_T svalue
+      integer lvalue
+      real fvalue
+      doubleprecision dvalue
+      character*1 c
+      real epsilon
+      doubleprecision onethird
+
+      data epsilon /.000001/
+      data lindx/1/, bindx/1/, sindx/1/, findx/1,1,1,1/
+     +dindx/1,1,1,1/, cindx/1/
+      data onethird/0.3333333333D0/
+      
+      ncid = ncopn (cdfname, NCNOWRIT, iret)
+      if (iret .ne. 0) nfails = nfails + 1
+!
+!     test ncvgt1 for byte
+!
+      call ncvgt1 (ncid, bid, bindx, bvalue, iret)
+      if (iret .ne. 0) nfails = nfails + 1
+      if (bvalue .ne. ichar('z')) write(*,*) 'error in ncvgt1 byte:',
+     + bvalue, ' .ne.', ichar('z')
+!
+!     test ncvgt1 for short
+!
+      call ncvgt1 (ncid, sid, sindx, svalue, iret)
+      if (iret .ne. 0) nfails = nfails + 1
+      if (svalue .ne. 10) write(*,*) 'error in ncvgt1 short:',
+     + svalue, ' .ne.', 10
+!     
+!     test ncvgt1 for long
+!
+      call ncvgt1 (ncid, lid, lindx, lvalue, iret)
+      if (iret .ne. 0) nfails = nfails + 1
+      if (lvalue .ne. 1000) write(*,*) 'error in ncvgt1 long:',
+     + lvalue,  ' .ne.', 1000
+!
+!     test ncvgt1 for float
+!
+      call ncvgt1 (ncid, fid, findx, fvalue, iret)
+      if (iret .ne. 0) nfails = nfails + 1
+      if (abs(fvalue - 3.14159) .gt. epsilon) 
+     +   write(*,*) 'error in ncvgt 1 float:', fvalue, 
+     +      ' not close to', 3.14159
+!
+!     test ncvgt1 for double
+!
+      call ncvgt1 (ncid, did, dindx, dvalue, iret)
+      if (iret .ne. 0) nfails = nfails + 1
+      if (abs(dvalue - onethird) .gt. epsilon) write(*,*)
+     + 'error in ncvgt1 double:', dvalue, ' not close to',
+     +     onethird
+!
+!     test ncvg1c for char
+!
+      call ncvg1c (ncid, cid, cindx, c, iret)
+      if (iret .ne. 0) nfails = nfails + 1
+      if (c .ne. 'a') write(*,*) 'error in ncvg1c'
+      call ncclos(ncid, iret)
+      if (iret .ne. 0) nfails = nfails + 1
+      return
+      end
+
+      
+      
+!
+!     subroutine to test ncvpt and ncvptc
+!
+      subroutine tncvpt(cdfname, nfails)
+      use netcdf_f03
+      character*31 cdfname
+
+!     size of dimensions
+      integer times, lats, lons, levels
+      parameter (times=4, lats=5, lons=5, levels=4)
+
+      integer ncid, iret
+!     loop control variables
+      integer itime, ilev, ilon, ilat, i
+      integer  latdim, londim, leveldim, timedim, lendim
+      integer dimsiz(MAXNCDIM)
+      common /dims/timedim, latdim, londim, leveldim, lendim,
+     + dimsiz
+      integer lenstr
+      integer bid, sid, lid, fid, did, cid, chid
+      common /vars/bid, sid, lid, fid, did, cid, chid
+
+!     vector of integers specifying the corner of the  hypercube
+!     where the first of the data values will be written
+      integer start(4)
+!     vector of integers specifying the edge lengths from the
+!     corner of the hypercube where the first of the data values
+!     will be written
+      integer count(4)
+
+!     arrays of data values to be written
+      NCBYTE_T barray(times)
+      NCSHORT_T sarray(times)
+      integer larray(lats)
+      real farray(levels, lats, lons, times)
+      doubleprecision darray(levels, lats, lons, times)
+      character*31 string
+
+      data start/1,1,1,1/
+      data count/levels, lats, lons, times/
+      data barray /97, 98, 99, 100/
+      data sarray /10, 11, 12, 13/
+
+      ncid = ncopn (cdfname, NCWRITE, iret)
+      if (iret .ne. 0) nfails = nfails + 1
+
+!
+!     byte
+!
+      count(1) = times
+      call ncvpt (ncid, bid, start, count, barray, iret)
+      if (iret .ne. 0) nfails = nfails + 1
+!
+!     short
+!
+      count(1) = times
+      call ncvpt (ncid, sid, start, count, sarray, iret)
+      if (iret .ne. 0) nfails = nfails + 1
+!
+!     long
+!
+      do 30 i = 1,lats
+         larray(i) = 1000
+ 30   continue
+      count(1) = lats
+      call ncvpt (ncid, lid, start, count, larray, iret)
+      if (iret .ne. 0) nfails = nfails + 1
+
+!
+!     float
+!
+      i = 0
+      do 40 itime = 1,times
+         do 41 ilon = 1, lons
+            do 42 ilat = 1, lats
+               do 43 ilev = 1, levels
+                  i = i + 1
+                  farray(ilev, ilat, ilon, itime) = real (i)
+ 43   continue
+ 42   continue
+ 41   continue
+ 40   continue
+      count(1) = levels
+      call ncvpt (ncid, fid, start, count, farray, iret)
+      if (iret .ne. 0) nfails = nfails + 1
+
+!
+!     double
+!
+      i = 0
+      do 50 itime = 1, times
+         do 51 ilon = 1, lons
+            do 52 ilat = 1, lats
+               do 53 ilev = 1, levels
+                  i = i + 1
+                  darray(ilev, ilat, ilon, itime) = real (i)
+ 53   continue
+ 52   continue
+ 51   continue
+ 50   continue
+      count(1) = levels
+      call ncvpt (ncid, did, start, count, darray, iret)
+      if (iret .ne. 0) nfails = nfails + 1
+
+!
+!     char
+!
+      start(1) = 1
+      start(2) = 1
+      count(1) = 4
+      count(2) = 4
+      lenstr = 31       
+      string = 'testthiskind of '
+      call ncvptc (ncid, chid,start, count, string, lenstr, iret)
+      if (iret .ne. 0) nfails = nfails + 1
+
+      call ncclos(ncid, iret)
+      if (iret .ne. 0) nfails = nfails + 1
+
+      return
+      end
+
+
+      subroutine tncvpt1(cdfname, nfails)
+      use netcdf_f03
+      character*31 cdfname
+
+
+      integer iret, ncid
+      integer  latdim, londim, leveldim, timedim, lendim
+      integer dimsiz(MAXNCDIM)
+      common /dims/timedim, latdim, londim, leveldim, lendim, 
+     + dimsiz
+
+      integer bindx(1), sindx(1), lindx(1), findx(4), dindx(4), cindx(1)
+
+      integer lvalue
+      NCSHORT_T svalue
+      NCBYTE_T bvalue
+      doubleprecision onethird
+      integer bid, sid, lid, fid, did, cid, chid
+      common /vars/bid, sid, lid, fid, did, cid, chid
+      data lindx/1/, bindx/1/, sindx/1/, findx/1,1,1,1/
+     +dindx/1,1,1,1/, cindx/1/
+      data lvalue /1000/
+      data svalue/10/
+      data onethird/0.3333333333D0/
+
+      bvalue = ichar('z')
+      
+      ncid = ncopn (cdfname, NCWRITE, iret)
+      if (iret .ne. 0) nfails = nfails + 1
+
+!
+!     test ncvpt1 for byte
+!
+      call ncvpt1 (ncid, bid, bindx, bvalue, iret)
+      if (iret .ne. 0) nfails = nfails + 1
+
+!
+!     test ncvpt1 for short
+!
+      call ncvpt1 (ncid, sid, sindx, svalue, iret)
+      if (iret .ne. 0) nfails = nfails + 1
+
+!     
+!     test ncvpt1 for long
+!
+      call ncvpt1 (ncid, lid, lindx, lvalue, iret)
+      if (iret .ne. 0) nfails = nfails + 1
+
+!
+!     test ncvpt1 for float
+!
+      call ncvpt1 (ncid, fid, findx, 3.14159, iret)
+      if (iret .ne. 0) nfails = nfails + 1
+
+!
+!     test ncvpt1 for double
+!
+      call ncvpt1 (ncid, did, dindx, onethird, iret)
+      if (iret .ne. 0) nfails = nfails + 1
+
+!
+!     test ncvp1c for char
+!
+      call ncvp1c (ncid, cid, cindx, 'a', iret)
+      if (iret .ne. 0) nfails = nfails + 1
+
+      call ncclos (ncid, iret)
+      if (iret .ne. 0) nfails = nfails + 1
+
+      return
+      end
+
+!
+! subroutine to test default fill values
+!
+      subroutine tfills(nfails)
+      use netcdf_f03
+      integer ncid
+      integer bid, sid, lid, fid, did
+      integer ix(1)
+      integer l
+      NCSHORT_T s
+      doubleprecision d
+      real f
+      NCBYTE_T b
+
+      ncid = NCOPN('fills.nc', NCNOWRIT, iret)
+      if (iret .ne. 0) nfails = nfails + 1
+
+      bid = ncvid(ncid, 'b', iret)
+      if (iret .ne. 0) nfails = nfails + 1
+
+      sid = ncvid(ncid, 's', iret)
+      if (iret .ne. 0) nfails = nfails + 1
+
+      lid = ncvid(ncid, 'l', iret)
+      if (iret .ne. 0) nfails = nfails + 1
+
+      fid = ncvid(ncid, 'f', iret)
+      if (iret .ne. 0) nfails = nfails + 1
+
+      did = ncvid(ncid, 'd', iret)
+      if (iret .ne. 0) nfails = nfails + 1
+
+
+      ix(1) = 2
+      call ncvgt1(ncid, bid, ix, b, iret)
+      if (iret .ne. 0) nfails = nfails + 1
+
+      call ncvgt1(ncid, sid, ix, s, iret)
+      if (iret .ne. 0) nfails = nfails + 1
+
+      call ncvgt1(ncid, lid, ix, l, iret)
+      if (iret .ne. 0) nfails = nfails + 1
+
+      call ncvgt1(ncid, fid, ix, f, iret)
+      if (iret .ne. 0) nfails = nfails + 1
+
+      call ncvgt1(ncid, did, ix, d, iret)
+      if (iret .ne. 0) nfails = nfails + 1
+
+
+      if (b .ne. FILBYTE) write(*,*) 'error in byte fill value'
+      if (d .ne. FILDOUB) write(*,*) 'error in double fill value'
+      if (f .ne. FILFLOAT) write(*,*) 'error in float fill value'
+      if (l .ne. FILLONG) write(*,*) 'error in long fill value'
+      if (s .ne. FILSHORT) write(*,*) 'error in short fill value'
+
+      return
+      end
diff --git a/nf03_test/f03tst_groups.F b/nf03_test/f03tst_groups.F
new file mode 100755
index 0000000..f522e8b
--- /dev/null
+++ b/nf03_test/f03tst_groups.F
@@ -0,0 +1,152 @@
+C     This is part of the netCDF package.
+C     Copyright 2006 University Corporation for Atmospheric Research/Unidata.
+C     See COPYRIGHT file for conditions of use.
+
+C     This program tests netCDF-4 variable functions from fortran.
+
+C     $Id: ftst_groups.F,v 1.5 2009/01/25 14:33:44 ed Exp $
+
+      program ftst_groups
+      USE netcdf4_f03
+      implicit none
+
+C     This is the name of the data file we will create.
+      character*(*) file_name
+      parameter (file_name='ftst_groups.nc')
+
+C     Info about the groups we'll create.
+      character*(*) group_name, sub_group_name
+      parameter (group_name = 'grp', sub_group_name = 'sub')
+      character*80 name_in, name_in2
+      integer ngroups_in
+      integer full_name_len
+
+C     Dimensions and variables.
+      character*(*) dim1_name, dim2_name
+      parameter (dim1_name = 'd1', dim2_name = 'd2')
+      character*(*) var1_name, var2_name
+      parameter (var1_name = 'v1', var2_name = 'v2')
+      integer nvars, ndims
+
+C     NetCDF IDs.
+      integer ncid, grpid, sub_grpid, subgrp_in
+      integer grpids(1), grpid_in, dimids(2), varids(2)
+      integer varids_in(2), dimids_in(2)
+
+C     Error handling.
+      integer retval
+
+      print *, ''
+      print *,'*** Testing netCDF-4 groups from F77.'
+
+C     Create the netCDF file.
+      retval = nf_create(file_name, NF_NETCDF4, ncid)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+
+C     Create a group and a subgroup.
+      retval = nf_def_grp(ncid, group_name, grpid)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      retval = nf_def_grp(grpid, sub_group_name, sub_grpid)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+
+C     Create a two dims and two vars.
+      retval = nf_def_dim(sub_grpid, dim1_name, 0, dimids(1))
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      retval = nf_def_dim(sub_grpid, dim2_name, 0, dimids(2))
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      retval = nf_def_var(sub_grpid, var1_name, NF_UINT64, 2, dimids, 
+     &     varids(1))
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      retval = nf_def_var(sub_grpid, var2_name, NF_UINT64, 2, dimids, 
+     &     varids(2))
+      if (retval .ne. nf_noerr) call handle_err(retval)
+
+C     Close the file. 
+      retval = nf_close(ncid)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+
+C     Reopen the file.
+      retval = nf_open(file_name, NF_NOWRITE, ncid)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      
+C     Check the name of the root group.
+      retval = nf_inq_grpname(ncid, name_in)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      if (name_in(1:1) .ne. '/') stop 2
+
+C     Check the full name of the root group (also "/").
+      retval = nf_inq_grpname_full(ncid, full_name_len, name_in)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      if (full_name_len .ne. 1 .or. name_in(1:1) .ne. '/') stop 2
+
+C     What groups are there from the root group?
+      retval = nf_inq_grps(ncid, ngroups_in, grpids)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      if (ngroups_in .ne. 1) stop 2
+
+C     Check the name of this group.
+      retval = nf_inq_grpname(grpids(1), name_in)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      if (name_in(1:len(group_name)) .ne. group_name) stop 2
+
+C     Check the length of the full name.
+      retval = nf_inq_grpname_len(grpids(1), full_name_len)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      if (full_name_len .ne. len(group_name) + 1) stop 2
+
+C     Check the full name.
+      retval = nf_inq_grpname_full(grpids(1), full_name_len, name_in2)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      if (name_in2(1:1) .ne. '/' .or. 
+     &     name_in2(2:len(group_name)+1) .ne. group_name .or.
+     &     full_name_len .ne. len(group_name) + 1) stop 2
+
+C     Check getting the grpid by full name
+      retval = nf_inq_grp_full_ncid(ncid, name_in, grpid_in)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      if (grpid_in .ne. grpids(1)) stop 2
+
+C     Check the parent ncid.
+      retval = nf_inq_grp_parent(grpids(1), grpid_in)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      if (grpid_in .ne. ncid) stop 2
+
+C     Check getting the group by name
+      retval = nf_inq_ncid(ncid, group_name, grpid_in)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      if (grpid_in .ne. grpids(1)) stop 2
+
+C     Check getting the group by name
+      retval = nf_inq_ncid(ncid, group_name, grpid_in)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      if (grpid_in .ne. grpids(1)) stop 2
+
+C     Get the sub group id, using its name.
+      retval = nf_inq_ncid(grpid_in, sub_group_name, subgrp_in)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+
+C     Check varids in subgroup.
+      retval = nf_inq_varids(subgrp_in, nvars, varids_in)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      if (nvars .ne. 2 .or. varids_in(1) .ne. varids(1) .or.
+     &     varids_in(2) .ne. varids(2)) stop 2
+
+C     Check dimids in subgroup.
+      retval = nf_inq_dimids(subgrp_in, ndims, dimids_in, 0)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      if (ndims .ne. 2 .or. dimids_in(1) .ne. dimids(1) .or.
+     &     dimids_in(2) .ne. dimids(2)) stop 2
+
+C     Check dimids including parents (will get same answers, since there
+C     are no dims in parent group.
+      retval = nf_inq_dimids(subgrp_in, ndims, dimids_in, 1)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      if (ndims .ne. 2 .or. dimids_in(1) .ne. dimids(1) .or.
+     &     dimids_in(2) .ne. dimids(2)) stop 2
+
+C     Close the file. 
+      retval = nf_close(ncid)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+
+      print *,'*** SUCCESS!'
+      end
diff --git a/nf03_test/f03tst_parallel.F b/nf03_test/f03tst_parallel.F
new file mode 100755
index 0000000..0dbea53
--- /dev/null
+++ b/nf03_test/f03tst_parallel.F
@@ -0,0 +1,135 @@
+!     This is part of the netCDF package.
+!     Copyright 2006 University Corporation for Atmospheric Research/Unidata.
+!     See COPYRIGHT file for conditions of use.
+
+!     This program tests netCDF-4 variable functions from fortran.
+
+!     $Id: ftst_parallel.F,v 1.3 2009/01/25 15:47:47 ed Exp $
+
+      program ftst_parallel
+      USE netcdf4_f03
+      implicit none
+      include 'mpif.h'
+      
+      character*(*) FILE_NAME
+      parameter (FILE_NAME = 'ftst_parallel.nc')
+
+      integer MAX_DIMS
+      parameter (MAX_DIMS = 2)
+      integer NX, NY
+      parameter (NX = 16)
+      parameter (NY = 16)
+      integer NUM_PROC
+      parameter (NUM_PROC = 4)
+      integer ncid, varid, dimids(MAX_DIMS)
+      integer x_dimid, y_dimid, contig
+      integer data_out(NY / 2, NX / 2), data_in(NY / 2, NX / 2)
+      integer mode_flag
+      integer nvars, ngatts, ndims, unlimdimid, file_format
+      integer x, y, retval
+      integer p, my_rank, ierr
+      integer start(MAX_DIMS), count(MAX_DIMS)
+
+      call MPI_Init(ierr)
+      call MPI_Comm_rank(MPI_COMM_WORLD, my_rank, ierr)
+      call MPI_Comm_size(MPI_COMM_WORLD, p, ierr)
+
+      if (my_rank .eq. 0) then
+         print *," "
+         print *, '*** Testing netCDF-4 parallel I/O from Fortran 77.'
+      endif
+
+!     There must be 4 procs for this test.
+      if (p .ne. 4) then
+         print *, 'This test program must be run on 4 processors.'
+         stop 2 
+      endif
+
+!     Create some pretend data.
+      do x = 1, NX / 2
+         do y = 1, NY / 2
+            data_out(y, x) = my_rank
+         end do
+      end do
+
+!     Create the netCDF file. 
+      mode_flag = IOR(nf_netcdf4, nf_classic_model) 
+      retval = nf_create_par(FILE_NAME, mode_flag, MPI_COMM_WORLD, 
+     $     MPI_INFO_NULL, ncid)
+      if (retval .ne. nf_noerr) stop 2
+
+!     Define the dimensions.
+      retval = nf_def_dim(ncid, "x", NX, x_dimid)
+      if (retval .ne. nf_noerr) stop 2
+      retval = nf_def_dim(ncid, "y", NY, y_dimid)
+      if (retval .ne. nf_noerr) stop 2
+      dimids(1) = y_dimid
+      dimids(2) = x_dimid
+
+!     Define the variable. 
+      retval = nf_def_var(ncid, "data", NF_INT, MAX_DIMS, dimids, varid)
+      if (retval .ne. nf_noerr) stop 2
+
+!     With classic model netCDF-4 file, enddef must be called.
+      retval = nf_enddef(ncid)
+      if (retval .ne. nf_noerr) stop 2
+
+!     Determine what part of the variable will be written for this
+!     processor. It's a checkerboard decomposition.
+      count(1) = NX / 2
+      count(2) = NY / 2
+      if (my_rank .eq. 0) then
+         start(1) = 1
+         start(2) = 1
+      else if (my_rank .eq. 1) then
+         start(1) = NX / 2 + 1
+         start(2) = 1
+      else if (my_rank .eq. 2) then
+         start(1) = 1
+         start(2) = NY / 2 + 1
+      else if (my_rank .eq. 3) then
+         start(1) = NX / 2 + 1
+         start(2) = NY / 2 + 1
+      endif
+
+!     Write this processor's data.
+      retval = nf_put_vara_int(ncid, varid, start, count, data_out)
+      if (retval .ne. nf_noerr) stop 2
+
+!     Close the file. 
+      retval = nf_close(ncid)
+      if (retval .ne. nf_noerr) stop 2
+
+!     Reopen the file.
+      retval = nf_open_par(FILE_NAME, nf_nowrite, MPI_COMM_WORLD, 
+     $     MPI_INFO_NULL, ncid)
+      if (retval .ne. nf_noerr) stop 2
+
+!     Set collective access on this variable. This will cause all
+!     reads/writes to happen together on every processor. Fairly
+!     pointless, in this contexct, but I want to at least call this
+!     function once in my testing.
+      retval = nf_var_par_access(ncid, varid, nf_collective)
+      if (retval .ne. nf_noerr) stop 2
+      
+!     Read this processor's data.
+      retval = nf_get_vara_int(ncid, varid, start, count, data_in)
+      if (retval .ne. nf_noerr) stop 2
+
+!     Check the data.
+      do x = 1, NX / 2
+         do y = 1, NY / 2
+            if (data_in(y, x) .ne. my_rank) stop 3
+         end do
+      end do
+
+!     Close the file. 
+      retval = nf_close(ncid)
+      if (retval .ne. nf_noerr) stop 2
+
+      call MPI_Finalize(ierr)
+
+      if (my_rank .eq. 0) print *,'*** SUCCESS!'
+
+      end program ftst_parallel
+
diff --git a/nf03_test/f03tst_types.F b/nf03_test/f03tst_types.F
new file mode 100755
index 0000000..b584a47
--- /dev/null
+++ b/nf03_test/f03tst_types.F
@@ -0,0 +1,178 @@
+C     This is part of the netCDF package.
+C     Copyright 2007 University Corporation for Atmospheric Research/Unidata.
+C     See COPYRIGHT file for conditions of use.
+
+C     This program tests netCDF-4 user defined types from fortran.
+
+C     $Id: ftst_types.F,v 1.6 2009/01/25 14:33:44 ed Exp $
+
+      program ftst_types
+      USE netcdf4_f03
+      implicit none
+
+C     This is the name of the data file we will create.
+      character*(*) FILE_NAME
+      parameter (FILE_NAME='ftst_types.nc')
+
+C     We are writing 2D data, a 6 x 12 grid. 
+      integer NDIMS
+      parameter (NDIMS=2)
+      integer NX, NY
+      parameter (NX = 6, NY = 12)
+
+C     NetCDF IDs.
+      integer ncid, varid, dimids(NDIMS)
+      integer wind_typeid
+      integer x_dimid, y_dimid
+      integer typeids(1)
+
+C     Info about the type we'll create.
+      integer size_in, base_type_in, nfields_in, class_in
+      character*80 name_in
+      character*(*) type_name, u_name, v_name
+      parameter (type_name = 'wind_t', u_name = 'U', v_name = 'V')
+      integer ntypes
+      integer WIND_T_SIZE
+      parameter (WIND_T_SIZE = 8)
+      integer offset_in, field_typeid_in, ndims_in, dim_sizes_in(1)
+
+C     This is the data array we will write, and a place to store it when
+C     we read it back in.
+      integer data_out(NY, NX), data_in(NY, NX)
+
+C     Loop indexes, and error handling.
+      integer x, y, retval
+
+C     Create some pretend data.
+      do x = 1, NX
+         do y = 1, NY
+            data_out(y, x) = (x - 1) * NY + (y - 1)
+         end do
+      end do
+
+      print *, ''
+      print *,'*** Testing netCDF-4 compound type from F77.'
+
+C     Create the netCDF file.
+      retval = nf_create(FILE_NAME, NF_NETCDF4, ncid)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+
+C     Define the dimensions.
+      retval = nf_def_dim(ncid, "x", NX, x_dimid)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      retval = nf_def_dim(ncid, "y", NY, y_dimid)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+
+C     Define a compound type.
+      retval = nf_def_compound(ncid, WIND_T_SIZE, type_name, 
+     &     wind_typeid)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      retval = nf_insert_compound(ncid, wind_typeid, u_name, 0, NF_INT)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      retval = nf_insert_compound(ncid, wind_typeid, v_name, 4, NF_INT)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+
+C     Check out my new type.
+      retval = nf_inq_typeids(ncid, ntypes, typeids)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      if (ntypes .ne. 1) stop 2
+      if (typeids(1) .ne. wind_typeid) stop 2
+
+C     Define the variable. 
+      dimids(2) = x_dimid
+      dimids(1) = y_dimid
+      retval = nf_def_var(ncid, "data", NF_INT, NDIMS, dimids, varid)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+
+C     Write the pretend data to the file.
+      retval = nf_put_var_int(ncid, varid, data_out)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+
+C     Close the file. 
+      retval = nf_close(ncid)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+
+C     Reopen the file and check again.
+      retval = nf_open(FILE_NAME, NF_NOWRITE, ncid)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+
+C     Find the type.
+      retval = nf_inq_typeids(ncid, ntypes, typeids)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      if (ntypes .ne. 1 .or. typeids(1) .ne. wind_typeid) stop 2
+      
+C     Check the type.
+      retval = nf_inq_user_type(ncid, typeids(1), name_in, size_in, 
+     &     base_type_in, nfields_in, class_in)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      if (name_in(1:len(type_name)) .ne. type_name .or. 
+     &     size_in .ne. WIND_T_SIZE .or. nfields_in .ne. 2 .or.
+     &     class_in .ne. NF_COMPOUND) stop 2
+
+C     Check it differently.
+      retval = nf_inq_compound(ncid, typeids(1), name_in, size_in, 
+     &     nfields_in)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      if (name_in(1:len(type_name)) .ne. type_name .or. 
+     &     size_in .ne. WIND_T_SIZE .or. nfields_in .ne. 2) stop 2
+
+C     Check it one piece at a time.
+      retval = nf_inq_compound_nfields(ncid, typeids(1), nfields_in)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      if (nfields_in .ne. 2) stop 2
+      retval = nf_inq_compound_size(ncid, typeids(1), size_in)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      if (size_in .ne. WIND_T_SIZE) stop 2
+      retval = nf_inq_compound_name(ncid, typeids(1), name_in)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      if (name_in(1:len(type_name)) .ne. type_name) stop 2
+
+C     Check the first field of the compound type.
+      retval = nf_inq_compound_field(ncid, typeids(1), 1, name_in, 
+     &     offset_in, field_typeid_in, ndims_in, dim_sizes_in)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      if (name_in(1:len(u_name)) .ne. u_name .or. offset_in .ne. 0 .or.
+     &     field_typeid_in .ne. NF_INT .or. ndims_in .ne. 0) stop 2
+      retval = nf_inq_compound_fieldname(ncid, typeids(1), 1, name_in)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      if (name_in(1:len(u_name)) .ne. u_name) stop 2
+      retval = nf_inq_compound_fieldoffset(ncid, typeids(1), 1, 
+     &     offset_in)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      if (offset_in .ne. 0) stop 2
+      retval = nf_inq_compound_fieldtype(ncid, typeids(1), 1, 
+     &     field_typeid_in)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      if (field_typeid_in .ne. NF_INT) stop 2
+      retval = nf_inq_compound_fieldndims(ncid, typeids(1), 1, 
+     &     ndims_in)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      if (ndims_in .ne. 0) stop 2
+      
+C     Check the second field of the compound type.
+      retval = nf_inq_compound_field(ncid, typeids(1), 2, name_in, 
+     &     offset_in, field_typeid_in, ndims_in, dim_sizes_in)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      if (name_in(1:len(v_name)) .ne. v_name .or. offset_in .ne. 4 .or.
+     &     field_typeid_in .ne. NF_INT .or. ndims_in .ne. 0) stop 2
+      
+C     Find our variable.
+      retval = nf_inq_varid(ncid, "data", varid)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      if (varid .ne. 1) stop 2
+
+C     Read the data and check it.
+      retval = nf_get_var_int(ncid, varid, data_in)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      do x = 1, NX
+         do y = 1, NY
+            if (data_in(y, x) .ne. data_out(y, x)) stop 2
+         end do
+      end do
+
+C     Close the file. 
+      retval = nf_close(ncid)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+
+      print *,'*** SUCCESS!'
+      end
diff --git a/nf03_test/f03tst_types2.F b/nf03_test/f03tst_types2.F
new file mode 100755
index 0000000..9be1ec7
--- /dev/null
+++ b/nf03_test/f03tst_types2.F
@@ -0,0 +1,98 @@
+C     This is part of the netCDF package.
+C     Copyright 2007 University Corporation for Atmospheric Research/Unidata.
+C     See COPYRIGHT file for conditions of use.
+
+C     This program tests netCDF-4 user defined types from fortran.
+
+C     $Id: ftst_types2.F,v 1.5 2009/09/25 19:23:37 ed Exp $
+
+      program ftst_types2
+      USE netcdf4_f03
+      implicit none
+
+C     This is the name of the data file we will create.
+      character*(*) FILE_NAME
+      parameter (FILE_NAME='ftst_types2.nc')
+
+C     We are writing 2D data, a 3 x 2 grid. 
+      integer NDIMS
+      parameter (NDIMS = 2)
+      integer dim_sizes(NDIMS)
+      integer NX, NY
+      parameter (NX = 3, NY = 2)
+
+C     NetCDF IDs.
+      integer ncid, varid, dimids(NDIMS)
+      integer cmp_typeid
+      integer x_dimid, y_dimid
+      integer typeids(1)
+
+C     Info about the type we'll create.
+      integer size_in, base_type_in, nfields_in, class_in
+      character*80 name_in
+      character*(*) type_name, ary_name
+      parameter (type_name = 'cmp_w_ary', ary_name = 'A')
+      integer ntypes
+      integer cmp_size
+      parameter (cmp_size = 24)
+      integer offset_in, field_typeid_in, ndims_in, dim_sizes_in(NDIMS)
+
+C     Loop indexes, and error handling.
+      integer x, y, retval
+
+      print *, ''
+      print *,'*** Testing netCDF-4 compound types from F77 some more.'
+
+C     Create the netCDF file.
+      retval = nf_create(FILE_NAME, NF_NETCDF4, ncid)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+
+C     Define a compound type.
+      retval = nf_def_compound(ncid, cmp_size, type_name, 
+     &     cmp_typeid)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+
+C     Include an array.
+      dim_sizes(1) = NX
+      dim_sizes(2) = NY
+      retval = nf_insert_array_compound(ncid, cmp_typeid, ary_name, 0, 
+     &     NF_INT, NDIMS, dim_sizes)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+
+C     Close the file. 
+      retval = nf_close(ncid)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+
+C     Reopen the file and check again.
+      retval = nf_open(FILE_NAME, NF_NOWRITE, ncid)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+
+C     Find the type.
+      retval = nf_inq_typeids(ncid, ntypes, typeids)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      if (ntypes .ne. 1 .or. typeids(1) .ne. cmp_typeid) stop 2
+      
+C     Check the type.
+      retval = nf_inq_user_type(ncid, typeids(1), name_in, size_in, 
+     &     base_type_in, nfields_in, class_in)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      if (name_in(1:len(type_name)) .ne. type_name .or. 
+     &     size_in .ne. cmp_size .or. nfields_in .ne. 1 .or. 
+     &     class_in .ne. NF_COMPOUND) stop 2
+
+C     Check the first field of the compound type.
+      retval = nf_inq_compound_field(ncid, typeids(1), 1, name_in, 
+     &     offset_in, field_typeid_in, ndims_in, dim_sizes_in)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      if (name_in(1:len(ary_name)) .ne. ary_name .or. 
+     &     offset_in .ne. 0 .or. field_typeid_in .ne. NF_INT .or. 
+     &     ndims_in .ne. NDIMS .or. 
+     &     dim_sizes_in(1) .ne. dim_sizes(1) .or. 
+     &     dim_sizes_in(2) .ne. dim_sizes(2)) stop 2
+
+C     Close the file. 
+      retval = nf_close(ncid)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+
+      print *,'*** SUCCESS!'
+      end
diff --git a/nf03_test/f03tst_types3.F b/nf03_test/f03tst_types3.F
new file mode 100755
index 0000000..871292b
--- /dev/null
+++ b/nf03_test/f03tst_types3.F
@@ -0,0 +1,121 @@
+C     This is part of the netCDF package.
+C     Copyright 2007 University Corporation for Atmospheric Research/Unidata.
+C     See COPYRIGHT file for conditions of use.
+
+C     This program tests netCDF-4 user defined types from fortran.
+
+C     $Id: ftst_types3.F,v 1.2 2009/09/25 19:23:37 ed Exp $
+
+      program ftst_types3
+      USE netcdf4_f03
+      implicit none
+
+C     This is the name of the data file we will create.
+      character*(*) FILE_NAME
+      parameter (FILE_NAME='ftst_types3.nc')
+
+C     We are writing 2D data, a 3 x 2 grid. 
+      integer NDIMS
+      parameter (NDIMS = 2)
+      integer dim_sizes(NDIMS)
+      integer NX, NY
+      parameter (NX = 3, NY = 2)
+
+C     NetCDF IDs.
+      integer ncid, varid, dimids(NDIMS)
+      integer cmp_typeid, typeid_in
+      integer x_dimid, y_dimid
+      integer typeids(1)
+      integer grpid, sub_grpid
+
+C     Info about the groups we'll create.
+      character*(*) group_name, sub_group_name
+      parameter (group_name = 'you_drive_me_crazy')
+      parameter (sub_group_name = 'baby_Im_so_into_you')
+
+C     Info about the type we'll create.
+      integer size_in, base_type_in, nfields_in, class_in
+      character*80 name_in
+      character*(*) type_name, field_name
+      parameter (type_name = 'I_just_want_to_have_some_fun')
+      parameter (field_name = 'Ill_tell_it_to_the_world')
+      integer ntypes
+      integer cmp_size
+      parameter (cmp_size = 4)
+      integer offset_in, field_typeid_in, ndims_in, dim_sizes_in(NDIMS)
+
+C     Loop indexes, and error handling.
+      integer x, y, retval
+
+      print *, ''
+      print *,'*** Testing netCDF-4 user-defined types and groups.'
+
+C     Create the netCDF file.
+      retval = nf_create(FILE_NAME, NF_NETCDF4, ncid)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+
+C     Create a group and a subgroup.
+      retval = nf_def_grp(ncid, group_name, grpid)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      retval = nf_def_grp(grpid, sub_group_name, sub_grpid)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+
+C     Define a compound type in the root group.
+      retval = nf_def_compound(ncid, cmp_size, type_name, 
+     &     cmp_typeid)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+
+C     Include a float.
+      retval = nf_insert_compound(ncid, cmp_typeid, field_name, 0, 
+     &     NF_FLOAT)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+
+C     Close the file. 
+      retval = nf_close(ncid)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+
+C     Reopen the file and check again.
+      retval = nf_open(FILE_NAME, NF_NOWRITE, ncid)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+
+C     Find the type.
+      retval = nf_inq_typeids(ncid, ntypes, typeids)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      if (ntypes .ne. 1 .or. typeids(1) .ne. cmp_typeid) stop 2
+      
+C     Check the type.
+      retval = nf_inq_user_type(ncid, typeids(1), name_in, size_in, 
+     &     base_type_in, nfields_in, class_in)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      if (name_in(1:len(type_name)) .ne. type_name .or. 
+     &     size_in .ne. cmp_size .or. nfields_in .ne. 1 .or. 
+     &     class_in .ne. NF_COMPOUND) stop 31
+
+C     Check the first field of the compound type.
+      retval = nf_inq_compound_field(ncid, typeids(1), 1, name_in, 
+     &     offset_in, field_typeid_in, ndims_in, dim_sizes_in)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      if (name_in(1:len(field_name)) .ne. field_name .or. 
+     &     offset_in .ne. 0 .or. field_typeid_in .ne. NF_FLOAT .or. 
+     &     ndims_in .ne. 0) stop 19
+
+C     Go to a child group and find the id of our type.
+      retval = nf_inq_grp_ncid(ncid, group_name, sub_grpid)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      retval = nf_inq_typeid(sub_grpid, type_name, typeid_in)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      retval = nf_inq_user_type(sub_grpid, typeid_in, name_in, size_in, 
+     &     base_type_in, nfields_in, class_in)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      if (name_in(1:len(type_name)) .ne. type_name .or. 
+     &     size_in .ne. cmp_size .or. nfields_in .ne. 1 .or. 
+     &     class_in .ne. NF_COMPOUND) stop 22
+      
+
+
+C     Close the file. 
+      retval = nf_close(ncid)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+
+      print *,'*** SUCCESS!'
+      end
diff --git a/nf03_test/f03tst_v2.F b/nf03_test/f03tst_v2.F
new file mode 100755
index 0000000..de35a02
--- /dev/null
+++ b/nf03_test/f03tst_v2.F
@@ -0,0 +1,94 @@
+C     This is part of the netCDF package.
+C     Copyright 2009 University Corporation for Atmospheric Research/Unidata.
+C     See COPYRIGHT file for conditions of use.
+
+C     This program tests the fortran V2 API with netCDF-4.
+
+C     $Id: ftst_v2.F,v 1.1 2009/01/27 19:49:11 ed Exp $
+
+      program ftst_v2
+      use netcdf4_f03
+      implicit none
+
+C     This is the name of the data file we will create.
+      character*(*) FILE_NAME
+      parameter (FILE_NAME='ftst_v2.nc')
+
+      integer ncid, timedim, londim, latdim, lonid, latid
+      character*(3) lat_name
+      parameter (lat_name = 'lat')
+      character*(3) lon_name
+      parameter (lon_name = 'lon')
+      character*(4) time_name
+      parameter (time_name = 'time')
+      integer LON_LEN, LAT_LEN
+      parameter (LON_LEN = 3, LAT_LEN = 5)
+      integer NDIMS, NVARS
+      parameter (NDIMS = 3, NVARS = 2)
+      integer ndims_in, nvars_in, ngatts_in, recdim_in
+      integer dimsize_in, natts_in
+      integer xtype_in, dimids_in(NDIMS)
+      character*(128) name_in
+      integer rc
+
+      print *, ''
+      print *,'*** Testing v2 fortran API with netCDF-4.'
+
+C     Create the file.
+      ncid = nccre(FILE_NAME, NF_NETCDF4, rc)
+      timedim = ncddef(ncid, time_name, NCUNLIM, rc)
+      londim = ncddef(ncid, lon_name, LON_LEN, rc)
+      latdim = ncddef(ncid, lat_name, LAT_LEN, rc)
+      lonid = ncvdef(ncid, lon_name, NCFLOAT, 1, londim, rc)
+      latid = ncvdef(ncid, lat_name, NCFLOAT, 1, latdim, rc)
+
+C     Check the file.
+      call ncinq(ncid, ndims_in, nvars_in, ngatts_in, recdim_in, rc)
+      if (ndims_in .ne. NDIMS) stop 2
+      if (ndims_in .ne. NDIMS .or. nvars_in .ne. NVARS .or.
+     $     ngatts_in .ne. 0 .or. recdim_in .ne. timedim) stop 2
+      call ncdinq(ncid, timedim, name_in, dimsize_in, rc)
+      if (name_in .ne. time_name .or. dimsize_in .ne. 0) stop 2
+      call ncdinq(ncid, londim, name_in, dimsize_in, rc)
+      if (name_in .ne. lon_name .or. dimsize_in .ne. LON_LEN) stop 2
+      call ncdinq(ncid, latdim, name_in, dimsize_in, rc)
+      if (name_in .ne. lat_name .or. dimsize_in .ne. LAT_LEN) stop 2
+      call ncvinq(ncid, lonid, name_in, xtype_in, ndims_in, dimids_in, 
+     $     natts_in, rc)
+      if (name_in .ne. lon_name .or. xtype_in .ne. NCFLOAT .or.
+     $     ndims_in .ne. 1 .or. dimids_in(1) .ne. londim) stop 2
+      call ncvinq(ncid, latid, name_in, xtype_in, ndims_in, dimids_in, 
+     $     natts_in, rc)
+      if (name_in .ne. lat_name .or. xtype_in .ne. NCFLOAT .or.
+     $     ndims_in .ne. 1 .or. dimids_in(1) .ne. latdim) stop 2
+
+C     Close the file.
+      call ncclos(ncid, rc)
+
+C     Reopen, and check again.
+      ncid = ncopn(FILE_NAME, NCNOWRIT, rc)
+C     Check the file.
+      call ncinq(ncid, ndims_in, nvars_in, ngatts_in, recdim_in, rc)
+      if (ndims_in .ne. NDIMS) stop 2
+      if (ndims_in .ne. NDIMS .or. nvars_in .ne. NVARS .or.
+     $     ngatts_in .ne. 0 .or. recdim_in .ne. timedim) stop 2
+      call ncdinq(ncid, timedim, name_in, dimsize_in, rc)
+      if (name_in .ne. time_name .or. dimsize_in .ne. 0) stop 2
+      call ncdinq(ncid, londim, name_in, dimsize_in, rc)
+      if (name_in .ne. lon_name .or. dimsize_in .ne. LON_LEN) stop 2
+      call ncdinq(ncid, latdim, name_in, dimsize_in, rc)
+      if (name_in .ne. lat_name .or. dimsize_in .ne. LAT_LEN) stop 2
+      call ncvinq(ncid, lonid, name_in, xtype_in, ndims_in, dimids_in, 
+     $     natts_in, rc)
+      if (name_in .ne. lon_name .or. xtype_in .ne. NCFLOAT .or.
+     $     ndims_in .ne. 1 .or. dimids_in(1) .ne. londim) stop 2
+      call ncvinq(ncid, latid, name_in, xtype_in, ndims_in, dimids_in, 
+     $     natts_in, rc)
+      if (name_in .ne. lat_name .or. xtype_in .ne. NCFLOAT .or.
+     $     ndims_in .ne. 1 .or. dimids_in(1) .ne. latdim) stop 2
+
+      call ncclos(ncid, rc)
+
+      print *,'*** SUCCESS!'
+      end
+
diff --git a/nf03_test/f03tst_vars.F b/nf03_test/f03tst_vars.F
new file mode 100755
index 0000000..ff5bb46
--- /dev/null
+++ b/nf03_test/f03tst_vars.F
@@ -0,0 +1,172 @@
+C     This is part of the netCDF package.
+C     Copyright 2006 University Corporation for Atmospheric Research/Unidata.
+C     See COPYRIGHT file for conditions of use.
+
+C     This program tests netCDF-4 variable functions from fortran.
+
+C     $Id: ftst_vars.F,v 1.19 2009/09/27 21:25:23 ed Exp $
+
+      program ftst_vars
+      USE netcdf4_f03
+      implicit none
+
+C     This is the name of the data file we will create.
+      character*(*) FILE_NAME
+      parameter (FILE_NAME='ftst_vars.nc')
+
+C     We are writing 2D data, a 6 x 12 grid. 
+      integer NDIMS
+      parameter (NDIMS=2)
+      integer NX, NY
+      parameter (NX = 6, NY = 12)
+
+C     NetCDF IDs.
+      integer ncid, varid, dimids(NDIMS)
+      integer x_dimid, y_dimid
+
+C     This is the data array we will write, and a place to store it when
+C     we read it back in.
+      integer data_out(NY, NX), data_in(NY, NX)
+
+C     For checking our data file to make sure it's correct.
+      integer chunks(NDIMS), chunks_in(NDIMS)
+      integer shuffle, deflate, deflate_level, checksum, contiguous
+      integer endianness
+
+C     Cache size stuff.
+      integer CACHE_SIZE, CACHE_NELEMS, CACHE_PREEMPTION
+      parameter (CACHE_SIZE = 8000, CACHE_NELEMS = 500)
+      parameter (CACHE_PREEMPTION = 50)
+      integer cache_size_in, cache_nelems_in, cache_preemption_in
+
+C     Loop indexes, and error handling.
+      integer x, y, retval
+
+C     Create some pretend data.
+      do x = 1, NX
+         do y = 1, NY
+            data_out(y, x) = 2147483646 + x * y
+         end do
+      end do
+
+      print *, ''
+      print *,'*** Testing definition of netCDF-4 vars from Fortran 77.'
+
+C     Change the cache size for the files created/opened in this program.
+      retval = nf_set_chunk_cache(CACHE_SIZE, CACHE_NELEMS, 
+     &     CACHE_PREEMPTION)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+
+C     Check chunk cache sizes.
+      retval = nf_get_chunk_cache(cache_size_in, cache_nelems_in, 
+     &     cache_preemption_in)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      if (cache_size_in .ne. CACHE_SIZE .or. 
+     &     cache_nelems_in .ne. CACHE_NELEMS .or. 
+     &     cache_preemption_in .ne. CACHE_PREEMPTION) stop 4
+
+C     Create the netCDF file.
+      retval = nf_create(FILE_NAME, NF_NETCDF4, ncid)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+
+C     Define the dimensions.
+      retval = nf_def_dim(ncid, "x", NX, x_dimid)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      retval = nf_def_dim(ncid, "y", NY, y_dimid)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+
+C     Define the variable. 
+      dimids(1) = y_dimid
+      dimids(2) = x_dimid
+      retval = nf_def_var(ncid, "data", NF_INT64, NDIMS, dimids, varid)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+
+C     Turn on chunking.
+      chunks(1) = NY
+      chunks(2) = NX
+      retval = nf_def_var_chunking(ncid, varid, 0, chunks)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+
+C     Set variable to big-endian (default is whatever is native to
+C     writing machine).
+      retval = nf_def_var_endian(ncid, varid, NF_ENDIAN_BIG)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+
+C     Turn on deflate, fletcher32.
+      retval = nf_def_var_deflate(ncid, varid, 0, 1, 4)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      retval = nf_def_var_fletcher32(ncid, varid, NF_FLETCHER32)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+
+C     Is everything set that is supposed to be?
+      retval = nf_inq_var_deflate(ncid, varid, shuffle, deflate, 
+     +     deflate_level)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      if (shuffle .ne. 0 .or. deflate .ne. 1 .or. 
+     +     deflate_level .ne. 4) stop 2
+      retval = nf_inq_var_fletcher32(ncid, varid, checksum)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      if (checksum .ne. NF_FLETCHER32) stop 2
+      retval = nf_inq_var_chunking(ncid, varid, contiguous, chunks_in)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      if (contiguous .ne. 0) stop 2
+      if (chunks(1) .ne. chunks_in(1) .or.
+     +     chunks(2) .ne. chunks_in(2)) stop 2
+      retval = nf_inq_var_endian(ncid, varid, endianness)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      if (endianness .ne. NF_ENDIAN_BIG) stop 2
+
+C     Since this is a classic model file, we must call enddef
+      retval = nf_enddef(ncid)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+
+C     Write the pretend data to the file.
+      retval = nf_put_var_int(ncid, varid, data_out)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+
+C     Close the file. 
+      retval = nf_close(ncid)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+
+C     Reopen the file and check again.
+      retval = nf_open(FILE_NAME, NF_NOWRITE, ncid)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+
+C     Find our variable.
+      retval = nf_inq_varid(ncid, "data", varid)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      if (varid .ne. 1) stop 2
+
+C     Check the deflate, fletcher32, chunking, and endianness.
+      retval = nf_inq_var_deflate(ncid, varid, shuffle, deflate, 
+     +     deflate_level)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      if (shuffle .ne. 0 .or. deflate .ne. 1 .or. 
+     +     deflate_level .ne. 4) stop 2
+      retval = nf_inq_var_fletcher32(ncid, varid, checksum)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      if (checksum .ne. NF_FLETCHER32) stop 2
+      retval = nf_inq_var_chunking(ncid, varid, contiguous, chunks_in)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      if (contiguous .ne. 0) stop 2
+      if (chunks(1) .ne. chunks_in(1) .or.
+     +     chunks(2) .ne. chunks_in(2)) stop 2
+      retval = nf_inq_var_endian(ncid, varid, endianness)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      if (endianness .ne. NF_ENDIAN_BIG) stop 2
+
+C     Read the data and check it.
+      retval = nf_get_var_int(ncid, varid, data_in)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      do x = 1, NX
+         do y = 1, NY
+            if (data_in(y, x) .ne. data_out(y, x)) stop 2
+         end do
+      end do
+
+C     Close the file. 
+      retval = nf_close(ncid)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+
+      print *,'*** SUCCESS!'
+      end
diff --git a/nf03_test/f03tst_vars2.F b/nf03_test/f03tst_vars2.F
new file mode 100755
index 0000000..f6bd9ba
--- /dev/null
+++ b/nf03_test/f03tst_vars2.F
@@ -0,0 +1,137 @@
+C     This is part of the netCDF package.
+C     Copyright 2008 University Corporation for Atmospheric Research/Unidata.
+C     See COPYRIGHT file for conditions of use.
+
+C     This program tests netCDF-4 variable functions from fortran, even
+C     more.
+
+C     $Id: ftst_vars2.F,v 1.6 2010/01/20 15:21:46 ed Exp $
+
+      program ftst_vars2
+      USE netcdf4_f03
+      implicit none
+
+C     This is the name of the data file we will create.
+      character*(*) FILE_NAME
+      parameter (FILE_NAME='ftst_vars2.nc')
+
+C     We are writing 3D data, a 3 x 5 x 2 grid. Why do I use "x, y, z,"
+C     and then do everything in order "z, y, x?" Because I am a C
+C     programmer, and everything in Fortran seems backwards!
+      integer NDIMS, NTYPES
+      parameter (NDIMS = 3, NTYPES = 5)
+      integer NX, NY, NZ
+      parameter (NX = 3, NY = 5, NZ = 2)
+
+C     These will be used to set the per-variable chunk cache.
+      integer CACHE_SIZE, CACHE_NELEMS, CACHE_PREEMPTION
+      parameter (CACHE_SIZE = 8, CACHE_NELEMS = 571)
+      parameter (CACHE_PREEMPTION = 42)
+
+C     These will be used to check the setting of the per-variable chunk
+C     cache.
+      integer cache_size_in, cache_nelems_in, cache_preemption_in
+
+C     NetCDF IDs.
+      integer ncid, varid(NTYPES), dimids(NDIMS), typeid(NTYPES)
+
+C     Name of the variable is stored here.
+      character*80 var_name
+
+C     This is the data array we will write, and a place to store it when
+C     we read it back in. Z is the fastest varying dimension.
+      integer data_out(NZ, NY, NX), data_in(NZ, NY, NX)
+
+C     Loop indexes, and error handling.
+      integer i, x, y, z, retval
+
+C     Create some pretend data.
+      do x = 1, NX
+         do y = 1, NY
+            do z = 1, NZ
+               data_out(z, y, x) = (x-1) * NY * NZ + (y-1) * NZ + (z-1)
+            end do
+         end do
+      end do
+
+      print *, ''
+      print *,'*** Testing netCDF-4 vars from F77 with new types.'
+
+C     Create the netCDF file.
+      retval = nf_create(FILE_NAME, NF_NETCDF4, ncid)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+
+C     Define the dimensions.
+      retval = nf_def_dim(ncid, "z", NZ, dimids(3))
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      retval = nf_def_dim(ncid, "y", NY, dimids(2))
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      retval = nf_def_dim(ncid, "x", NX, dimids(1))
+      if (retval .ne. nf_noerr) call handle_err(retval)
+
+C     These are the types of vars that will be written.
+      typeid(1) = NF_UBYTE
+      typeid(2) = NF_USHORT
+      typeid(3) = NF_UINT
+      typeid(4) = NF_INT64
+      typeid(5) = NF_UINT64
+
+C     Define the variables. 
+      do i = 1, NTYPES
+         write(var_name, 1001) i
+ 1001    format('var', I1)
+         retval = nf_def_var(ncid, var_name, typeid(i), NDIMS, 
+     &        dimids, varid(i))
+         if (retval .ne. nf_noerr) call handle_err(retval)
+
+C        Set variable caches.
+         retval = nf_set_var_chunk_cache(ncid, varid(i), CACHE_SIZE, 
+     &        CACHE_NELEMS, CACHE_PREEMPTION)
+         if (retval .ne. nf_noerr) call handle_err(retval)
+      end do
+
+C     Check the per-variable cache to make sure it is what we think it
+C     is.
+      do i = 1, NTYPES
+         retval = nf_get_var_chunk_cache(ncid, varid(i), cache_size_in, 
+     &        cache_nelems_in, cache_preemption_in)
+         if (retval .ne. nf_noerr) call handle_err(retval)
+         if (cache_size_in .ne. CACHE_SIZE .or. cache_nelems_in .ne. 
+     &        CACHE_NELEMS .or. cache_preemption .ne. CACHE_PREEMPTION)
+     &        stop 8
+         
+      end do
+
+C     Write the pretend data to the file.
+      do i = 1, NTYPES
+         retval = nf_put_var_int(ncid, varid(i), data_out)
+         if (retval .ne. nf_noerr) call handle_err(retval)
+      end do
+
+C     Close the file. 
+      retval = nf_close(ncid)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+
+C     Reopen the file and check again.
+      retval = nf_open(FILE_NAME, NF_NOWRITE, ncid)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+
+C     Read the data and check it.
+      do i = 1, NTYPES
+         retval = nf_get_var_int(ncid, varid(i), data_in)
+         if (retval .ne. nf_noerr) call handle_err(retval)
+         do x = 1, NX
+            do y = 1, NY
+               do z = 1, NZ
+                  if (data_in(z, y, x) .ne. data_out(z, y, x)) stop 2
+               end do
+            end do
+         end do
+      end do
+
+C     Close the file. 
+      retval = nf_close(ncid)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+
+      print *,'*** SUCCESS!'
+      end
diff --git a/nf03_test/f03tst_vars3.F b/nf03_test/f03tst_vars3.F
new file mode 100755
index 0000000..3bc98b7
--- /dev/null
+++ b/nf03_test/f03tst_vars3.F
@@ -0,0 +1,189 @@
+C     This is part of the netCDF package.
+C     Copyright 2008 University Corporation for Atmospheric Research/Unidata.
+C     See COPYRIGHT file for conditions of use.
+
+C     This program tests netCDF-4 variable functions from fortran, even
+C     more, even more.
+
+C     $Id: ftst_vars3.F,v 1.11 2009/01/25 14:33:44 ed Exp $
+
+      program ftst_vars3
+      use netcdf4_f03
+      implicit none
+
+C     This is the name of the data file we will create.
+      character*(*) FILE_NAME
+      parameter (FILE_NAME='ftst_vars3.nc')
+
+C     We are writing an attribute, of length 3.
+      integer NDIMS
+      parameter (NDIMS = 1)
+      integer NX
+      parameter (NX = 3)
+
+C     NetCDF IDs.
+      integer ncid, varid, dimids(1)
+      integer enum_typeid, opaque_typeid
+
+C     This is the data array we will write as an enum attribute, and a
+C     place to store it when we read it back in. Z is the fastest
+C     varying dimension.
+      integer data_out(NX), data_in(NX)
+
+      integer max_types
+      parameter (max_types = 2)
+
+C     Need these to read type information.
+      integer num_types, typeids(max_types)
+      integer base_type, base_size, num_members, member_value
+      character*80 type_name, member_name
+      integer type_size, nfields, class
+
+C     Information for the enum type we will define.
+      character*(*) enum_type_name, one_name, zero_name
+      parameter (enum_type_name = 'enum_type')
+      parameter (zero_name = 'zero', one_name = 'one')
+      integer one, zero
+
+C     Information for the opaque type we will define.
+      character*(*) opaque_type_name
+      parameter (opaque_type_name = 'opaque_type')
+      integer opaque_size
+      parameter (opaque_size = 16)
+      character*(opaque_size) opaque_data, opaque_data_in
+      parameter (opaque_data = '0123456789012345')
+
+C     Loop indexes, and error handling.
+      integer x, retval, index(1)
+
+C     Create some pretend data.
+      do x = 1, NX
+         data_out(x) = 0
+      end do
+      data_out(1) = 1
+
+      print *, ''
+      print *,'*** Testing enum and opaque types.'
+
+C     Create the netCDF file.
+      retval = nf_create(FILE_NAME, NF_NETCDF4, ncid)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+
+C     Create the enum type.
+      retval = nf_def_enum(ncid, NF_INT, enum_type_name, enum_typeid)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      one = 1
+      zero = 0
+      retval = nf_insert_enum(ncid, enum_typeid, zero_name, zero)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      retval = nf_insert_enum(ncid, enum_typeid, one_name, one)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+
+C     Create the opaque type.
+      retval = nf_def_opaque(ncid, opaque_size, opaque_type_name, 
+     &     opaque_typeid)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+
+C     Create a dimension.
+      retval = nf_def_dim(ncid, 'dim', 1, dimids(1))
+      if (retval .ne. nf_noerr) call handle_err(retval)
+
+C     Create an opaque variable.
+      retval = nf_def_var(ncid, 'var', opaque_typeid, 1, dimids, varid)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+
+C     Write the opaque scalar var. (Could also use nf_put_var).
+      index(1) = 1
+      retval = nf_put_var1(ncid, varid, index, opaque_data)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+
+C     Attach an enum attribute to the variable.
+      retval = nf_put_att(ncid, varid, 'att', enum_typeid, NX, 
+     &     data_out)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+
+C     Close the file. 
+      retval = nf_close(ncid)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+
+C     Reopen the file.
+      retval = nf_open(FILE_NAME, NF_NOWRITE, ncid)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+
+C     Get the typeids of all user defined types.
+      retval = nf_inq_typeids(ncid, num_types, typeids)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      if (num_types .ne. max_types) stop 2
+
+C     Use nf_inq_user_type to confirm this is an enum type.
+      retval = nf_inq_user_type(ncid, typeids(1), type_name, type_size, 
+     &     base_type, nfields, class)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      if (type_name(1:len(enum_type_name)) .ne. enum_type_name .or.
+     &     type_size .ne. 4 .or. base_type .ne. NF_INT .or. 
+     &     nfields .ne. 2 .or. class .ne. nf_enum) stop 2
+
+C     Use nf_inq_enum and make sure we get the same answers as we did
+C     with nf_inq_user_type.
+      retval = nf_inq_enum(ncid, typeids(1), type_name, base_type, 
+     &     base_size, num_members)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      if (type_name(1:len(enum_type_name)) .ne. enum_type_name .or.
+     &     base_type .ne. NF_INT .or. num_members .ne. 2) stop 2
+
+C     Check the members of the enum type.
+      retval = nf_inq_enum_member(ncid, typeids(1), 1, member_name, 
+     &     member_value)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      if (member_name(1:len(zero_name)) .ne. zero_name .or.
+     &     member_value .ne. 0) stop 2
+      retval = nf_inq_enum_member(ncid, typeids(1), 2, member_name, 
+     &     member_value)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      if (member_name(1:len(one_name)) .ne. one_name .or.
+     &     member_value .ne. 1) stop 2
+      retval = nf_inq_enum_ident(ncid, typeids(1), 0, member_name)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      if (member_name(1:len(zero_name)) .ne. zero_name) stop 2
+      retval = nf_inq_enum_ident(ncid, typeids(1), 1, member_name)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      if (member_name(1:len(one_name)) .ne. one_name) stop 2
+
+C     Use nf_inq_user_type to confirm that the second typeid is an
+C     opaque type.
+      retval = nf_inq_user_type(ncid, typeids(2), type_name, type_size, 
+     &     base_type, nfields, class)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      if (type_name(1:len(opaque_type_name)) .ne. opaque_type_name .or.
+     &     type_size .ne. opaque_size .or. base_type .ne. 0 .or. 
+     &     nfields .ne. 0 .or. class .ne. nf_opaque) stop 2
+
+C     Use nf_inq_opaque and make sure we get the same answers as we did
+C     with nf_inq_user_type.
+      retval = nf_inq_opaque(ncid, typeids(2), type_name, base_size)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      if (base_size .ne. opaque_size .or. 
+     &     type_name(1:len(opaque_type_name)) .ne. opaque_type_name) 
+     &     stop 2
+
+C     Read the variable.
+      index(1) = 1
+      retval = nf_get_var1(ncid, varid, index, opaque_data_in)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      if (opaque_data_in .ne. opaque_data) stop 2
+
+C     Read the attribute.
+      retval = nf_get_att(ncid, varid, 'att', data_in)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+
+C     Check the values.
+      do x = 1, NX
+         if (data_in(x) .ne. data_out(x)) stop 2
+      end do
+
+C     Close the file. 
+      retval = nf_close(ncid)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+
+      print *,'*** SUCCESS!'
+      end
diff --git a/nf03_test/f03tst_vars4.F b/nf03_test/f03tst_vars4.F
new file mode 100755
index 0000000..9001427
--- /dev/null
+++ b/nf03_test/f03tst_vars4.F
@@ -0,0 +1,120 @@
+C     This is part of the netCDF package.
+C     Copyright 2008 University Corporation for Atmospheric Research/Unidata.
+C     See COPYRIGHT file for conditions of use.
+
+C     This program tests netCDF-4 variable functions from fortran, even
+C     more, even more.
+
+C     $Id: ftst_vars4.F,v 1.11 2009/10/24 10:03:39 ed Exp $
+
+      program ftst_vars4
+      USE netcdf4_f03
+      implicit none
+
+C     This is the name of the data file we will create.
+      character*(*) FILE_NAME
+      parameter (FILE_NAME='ftst_vars4.nc')
+
+C     NetCDF IDs.
+      integer ncid, vlen_typeid
+
+      integer max_types
+      parameter (max_types = 1)
+
+C     Need these to read type information.
+      integer num_types, typeids(max_types)
+      integer base_type, base_size, num_members, member_value
+      character*80 type_name, member_name
+      integer type_size, nfields, class
+
+C     Information for the vlen type we will define.
+      character*(*) vlen_type_name
+      parameter (vlen_type_name = 'vlen_type')
+
+C     Some data about and for the vlen.
+      integer vlen_len, vlen_len_in
+      parameter (vlen_len = 5)
+      integer data1(vlen_len), data1_in(vlen_len)
+
+C     These must be big enough to hold the stuct nc_vlen in netcdf.h.
+      integer vlen(10), vlen_in(10)
+
+C     Loop indexes, and error handling.
+      integer x, retval, index(1)
+
+      print *, ''
+      print *,'*** Testing VLEN types.'
+
+      do x = 1, vlen_len
+         data1(x) = x
+      end do
+
+C     Create the netCDF file.
+      retval = nf_create(FILE_NAME, NF_NETCDF4, ncid)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+
+C     Create the vlen type.
+      retval = nf_def_vlen(ncid, vlen_type_name, nf_int, vlen_typeid)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+
+C     Set up the vlen with this helper function, since F77 can't deal
+C     with pointers.
+      retval = nf_put_vlen_element(ncid, vlen_typeid, vlen, 
+     &     vlen_len, data1)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+
+C     Write the vlen attribute.
+      retval = nf_put_att(ncid, NF_GLOBAL, 'att1', vlen_typeid, 1, vlen)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+
+C     Close the file. 
+      retval = nf_close(ncid)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+
+C     Reopen the file.
+      retval = nf_open(FILE_NAME, NF_NOWRITE, ncid)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+
+C     Get the typeids of all user defined types.
+      retval = nf_inq_typeids(ncid, num_types, typeids)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      if (num_types .ne. max_types) stop 2
+
+C     Use nf_inq_user_type to confirm this is an vlen type, with base
+C     type NF_INT.
+      retval = nf_inq_user_type(ncid, typeids(1), type_name, type_size, 
+     &     base_type, nfields, class)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      if (type_name(1:len(vlen_type_name)) .ne. vlen_type_name .or.
+     &     base_type .ne. nf_int .or.
+     &     nfields .ne. 0 .or. class .ne. nf_vlen) stop 2
+
+C     Use nf_inq_vlen and make sure we get the same answers as we did
+C     with nf_inq_user_type.
+      retval = nf_inq_vlen(ncid, typeids(1), type_name, base_size, 
+     &     base_type)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      if (type_name(1:len(vlen_type_name)) .ne. vlen_type_name .or.
+     &     base_type .ne. nf_int) stop 2
+
+C     Read the vlen attribute.
+      retval = nf_get_att(ncid, NF_GLOBAL, 'att1', vlen_in)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+
+C     Get the data from the vlen we just read.
+      retval = nf_get_vlen_element(ncid, vlen_typeid, vlen_in, 
+     &     vlen_len_in, data1_in)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      if (vlen_len_in .ne. vlen_len) stop 2
+
+C     Check the data
+      do x = 1, vlen_len
+         if (data1(x) .ne. data1_in(x)) stop 2
+      end do
+
+C     Close the file. 
+      retval = nf_close(ncid)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+
+      print *,'*** SUCCESS!'
+      end
diff --git a/nf03_test/f03tst_vars5.F b/nf03_test/f03tst_vars5.F
new file mode 100755
index 0000000..a8669a3
--- /dev/null
+++ b/nf03_test/f03tst_vars5.F
@@ -0,0 +1,117 @@
+C     This is part of the netCDF package.
+C     Copyright 2008 University Corporation for Atmospheric Research/Unidata.
+C     See COPYRIGHT file for conditions of use.
+
+C     This program tests netCDF-4 variable functions from fortran, even
+C     more, even more.
+
+C     $Id: ftst_vars5.F,v 1.4 2009/01/25 14:33:44 ed Exp $
+
+      program ftst_vars5
+      USE netcdf4_f03
+      implicit none
+
+C     This is the name of the data file we will create.
+      character*(*) FILE_NAME
+      parameter (FILE_NAME='ftst_vars5.nc')
+
+C     NetCDF IDs.
+      integer ncid, cmp_typeid
+
+      integer max_types
+      parameter (max_types = 1)
+
+C     Need these to read type information.
+      integer num_types, typeids(max_types)
+      integer base_type, type_size, num_members, member_value
+      character*80 type_name, member_name
+      integer nfields, class
+
+C     Information for the compound type we will define.
+      character*(*) cmp_type_name, int1_name, int2_name
+      parameter (cmp_type_name = 'compound_type')
+      parameter (int1_name = 'int1', int2_name = 'int2')
+      integer compound_len, compound_len_in
+      parameter (compound_len = 2)
+      integer data1(compound_len), data1_in(compound_len)
+      character*(4) att_name
+      parameter (att_name = 'att1')
+
+C     Loop indexes, and error handling.
+      integer x, retval, index(1)
+
+      print *, ''
+      print *,'*** Testing compound types.'
+
+C     Prepare some data to write.
+      do x = 1, compound_len
+         data1(x) = x
+      end do
+
+C     Create the netCDF file.
+      retval = nf_create(FILE_NAME, NF_NETCDF4, ncid)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+
+C     Create the compound type.
+      retval = nf_def_compound(ncid, 8, cmp_type_name, 
+     &     cmp_typeid)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+
+C     Insert two integers.
+      retval = nf_insert_compound(ncid, cmp_typeid, int1_name, 
+     &     0, NF_INT)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      retval = nf_insert_compound(ncid, cmp_typeid, int2_name, 
+     &     4, NF_INT)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+
+C     Write the compound attribute.
+      retval = nf_put_att(ncid, NF_GLOBAL, att_name, cmp_typeid, 
+     &     1, data1)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+
+C     Close the file. 
+      retval = nf_close(ncid)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+
+C     Reopen the file.
+      retval = nf_open(FILE_NAME, NF_NOWRITE, ncid)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+
+C     Get the typeids of all user defined types.
+      retval = nf_inq_typeids(ncid, num_types, typeids)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      if (num_types .ne. max_types) stop 2
+
+C     Use nf_inq_user_type to confirm this is an compound type
+      retval = nf_inq_user_type(ncid, typeids(1), type_name, type_size, 
+     &     base_type, nfields, class)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      if (type_name(1:len(cmp_type_name)) .ne. cmp_type_name .or.
+     &     type_size .ne. 8 .or. base_type .ne. 0 .or.
+     &     nfields .ne. 2 .or. class .ne. nf_compound) stop 2
+
+C     Use nf_inq_compound and make sure we get the same answers as we did
+C     with nf_inq_user_type.
+      retval = nf_inq_compound(ncid, typeids(1), type_name, type_size, 
+     &     nfields)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      if (type_name(1:len(cmp_type_name)) .ne. cmp_type_name .or.
+     &     base_type .ne. 0 .or. type_size .ne. 8 .or.
+     &     nfields .ne. 2) stop 2
+
+C     Read the compound attribute.
+      retval = nf_get_att(ncid, NF_GLOBAL, att_name, data1_in)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+
+C     Check the data
+      do x = 1, compound_len
+         if (data1(x) .ne. data1_in(x)) stop 2
+      end do
+
+C     Close the file. 
+      retval = nf_close(ncid)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+
+      print *,'*** SUCCESS!'
+      end
diff --git a/nf03_test/f03tst_vars6.F b/nf03_test/f03tst_vars6.F
new file mode 100755
index 0000000..064abda
--- /dev/null
+++ b/nf03_test/f03tst_vars6.F
@@ -0,0 +1,204 @@
+C     This is part of the netCDF package.
+C     Copyright 2008 University Corporation for Atmospheric Research/Unidata.
+C     See COPYRIGHT file for conditions of use.
+
+C     This program tests netCDF-4 variable functions from fortran, even
+C     more, even more.
+
+C     $Id: ftst_vars6.F,v 1.7 2009/02/11 16:53:46 ed Exp $
+
+      program ftst_vars6
+      use netcdf4_f03
+      implicit none
+
+C     This is the name of the data file we will create.
+      character*(*) FILE_NAME
+      parameter (FILE_NAME='ftst_vars6.nc')
+      integer NDIMS
+      parameter (NDIMS = 1)
+      integer DIM_LEN
+      parameter (DIM_LEN = 22)
+      integer NVARS
+      parameter (NVARS = 3)
+      integer DATA_LEN
+      parameter (DATA_LEN = 2)
+      integer check_file
+
+      integer ncid, varid(NVARS), dimids(NDIMS)
+      integer data_len_in, offset
+      parameter (offset = 20)
+      integer data1(data_len), data1_in(data_len)
+      character*(4) var_name(NVARS)
+      character*(4) dim_name
+      parameter (dim_name = 'dim1')
+      integer NO_FILL, MY_FILL_VALUE
+      parameter (NO_FILL = 1)
+      parameter (MY_FILL_VALUE = 42)
+
+C     Loop index and error handling.
+      integer x, retval
+
+      print *, ''
+      print *,'*** Testing fill values.'
+
+C     Prepare some data to write.
+      do x = 1, data_len
+         data1(x) = x
+      end do
+
+C     Set up var names.
+      var_name(1) = 'var1'
+      var_name(2) = 'var2'
+      var_name(3) = 'var3'
+
+C     Create the netCDF file.
+      retval = nf_create(FILE_NAME, NF_NETCDF4, ncid)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+
+C     Create a dimension.
+      retval = nf_def_dim(ncid, dim_name, DIM_LEN, dimids(1))
+      if (retval .ne. nf_noerr) call handle_err(retval)
+
+C     Create a few integer variables.
+      do x = 1, NVARS      
+         retval = nf_def_var(ncid, var_name(x), NF_INT, NDIMS, dimids,
+     $        varid(x))
+         if (retval .ne. nf_noerr) call handle_err(retval)
+      end do
+
+C     Set no fill mode for the second variable.
+      retval = nf_def_var_fill(ncid, varid(2), NO_FILL, 88)
+      if (retval .ne. 0) stop 2
+
+C     Set an alternative fill value for the third variable.
+      retval = nf_def_var_fill(ncid, varid(3), 0, MY_FILL_VALUE)
+      if (retval .ne. 0) stop 3
+
+C     Check it out. 
+c      retval = check_file(ncid, var_name, dim_name)
+c      if (retval .ne. 0) stop 2
+
+C     Close the file. 
+      retval = nf_close(ncid)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+
+C     Reopen the file.
+      retval = nf_open(FILE_NAME, NF_NOWRITE, ncid)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+
+C     Check it out. 
+      retval = check_file(ncid, var_name, dim_name)
+      if (retval .ne. 0) stop 4
+
+C     Close the file. 
+      retval = nf_close(ncid)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+
+      print *,'*** SUCCESS!'
+      end
+
+C     This function check the file to make sure everything is OK.
+      integer function check_file(ncid, var_name, dim_name)
+      use netcdf4_f03
+      implicit none
+
+C     I need these in both here and the main program.
+      integer NDIMS
+      parameter (NDIMS = 1)
+      integer DIM_LEN
+      parameter (DIM_LEN = 22)
+      integer NVARS
+      parameter (NVARS = 3)
+      integer DATA_LEN
+      parameter (DATA_LEN = 2)
+      integer MY_FILL_VALUE
+      parameter (MY_FILL_VALUE = 42)
+
+C     Parameters
+      integer ncid
+      character*(4) var_name(NVARS)
+      character*(4) dim_name
+
+C     Values that are read in, to check the file.
+      integer ndims_in, nvars_in, ngatts_in, unlimdimid_in
+      integer xtype_in, dimids_in(NDIMS), natts_in
+      integer varid_in(NVARS), dimid_in, no_fill_in, fill_value_in
+      character*(4) var_name_in
+      integer int_data_in(DIM_LEN)
+
+      integer x, retval
+
+C     Check it out.
+      retval = nf_inq(ncid, ndims_in, nvars_in, ngatts_in,
+     $     unlimdimid_in)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      if (ndims_in .ne. 1 .or. nvars_in .ne. NVARS .or. ngatts_in .ne. 0
+     $     .or. unlimdimid_in .ne. -1) stop 5
+
+C     Get the varids and the dimid.
+      do x = 1, NVARS      
+         retval = nf_inq_varid(ncid, var_name(x), varid_in(x))
+         if (retval .ne. nf_noerr) call handle_err(retval)
+         if (varid_in(x) .ne. x) stop 6
+      end do
+      retval = nf_inq_dimid(ncid, dim_name, dimid_in)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      if (dimid_in .ne. 1) stop 7
+
+C     These things are the same for all three variables, except
+C     natts_in..
+      do x = 1, NVARS      
+         retval = nf_inq_var(ncid, varid_in(x), var_name_in, xtype_in,
+     $        ndims_in, dimids_in, natts_in)
+         if (retval .ne. nf_noerr) call handle_err(retval)
+         if (ndims_in .ne. 1 .or. xtype_in .ne. NF_INT .or. dimids_in(1)
+     $        .ne. dimid_in) stop 8
+         if (x .eq. 3 .and. natts_in .ne. 1) stop 9
+         if (x .lt. 3 .and. natts_in .ne. 0) stop 10
+      end do
+
+C     Check the fill value for the first var. Nothing was set, so
+C     no_fill should be off, and fill_value should be the default fill
+C     value for this type.
+      retval = nf_inq_var_fill(ncid, varid_in(1), no_fill_in,
+     $     fill_value_in)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      if (no_fill_in .ne. 0 .or. fill_value_in .ne. nf_fill_int) stop 11
+
+C     Check that no_fill mode is on for the second variable.
+      retval = nf_inq_var_fill(ncid, varid_in(2), no_fill_in,
+     $     fill_value_in)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      if (no_fill_in .ne. 1 .or. fill_value_in .ne. nf_fill_int) stop 12
+
+C     Check that a non-default fill value is in use for the third variable.
+      retval = nf_inq_var_fill(ncid, varid_in(3), no_fill_in,
+     $     fill_value_in)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      if (no_fill_in .ne. 0 .or. fill_value_in .ne. MY_FILL_VALUE) stop
+     $     2
+
+C     Get the data in var1. It will be all the default fill value.
+      retval = nf_get_var_int(ncid, varid_in(1), int_data_in)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      do x = 1, DIM_LEN
+         if (int_data_in(x) .ne. nf_fill_int) stop 13
+      end do
+
+C     Get the data in var2. What will it be?
+      retval = nf_get_var_int(ncid, varid_in(2), int_data_in)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+C$$$      do x = 1, DIM_LEN
+C$$$         print *, int_data_in(x)
+C$$$      end do
+
+C     Get the data in var3. It will be all the default fill value.
+      retval = nf_get_var_int(ncid, varid_in(3), int_data_in)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      do x = 1, DIM_LEN
+C         print *, int_data_in(x)
+         if (int_data_in(x) .ne. MY_FILL_VALUE) stop 14
+      end do
+
+      check_file = 0
+      end 
diff --git a/nf03_test/fills.cdl b/nf03_test/fills.cdl
new file mode 100755
index 0000000..cb25a3d
--- /dev/null
+++ b/nf03_test/fills.cdl
@@ -0,0 +1,21 @@
+netcdf fills {
+dimensions:
+	n = 2 ;
+variables:
+	double d(n) ;
+	float f(n) ;
+	int l(n) ;
+	short s(n) ;
+	byte b(n) ;
+data:
+
+ d = 1, _ ;
+
+ f = 1, _ ;
+
+ l = 1, _ ;
+
+ s = 1, _ ;
+
+ b = 1, -127 ;
+}
diff --git a/nf03_test/handle_err.F b/nf03_test/handle_err.F
new file mode 100755
index 0000000..4477c50
--- /dev/null
+++ b/nf03_test/handle_err.F
@@ -0,0 +1,20 @@
+C     This is part of the netCDF package.
+C     Copyright 2005 University Corporation for Atmospheric Research/Unidata.
+C     See COPYRIGHT file for conditions of use.
+
+C     This is the error handling function for some of the F77
+C     tests. This error handler comes from the netcdf tutorial.
+
+C     $Id: handle_err.F,v 1.1 2009/06/07 13:17:26 ed Exp $
+
+C     This subroutine handles errors by printing an error message and
+C     exiting with a non-zero status.
+      subroutine handle_err(errcode)
+      USE netcdf_f03
+      implicit none
+      integer errcode
+
+      print *, 'Error: ', nf_strerror(errcode)
+      stop 2
+      end
+
diff --git a/nf03_test/module_tests.F90 b/nf03_test/module_tests.F90
new file mode 100755
index 0000000..9624eb2
--- /dev/null
+++ b/nf03_test/module_tests.F90
@@ -0,0 +1,255 @@
+      Module tests
+!/*********************************************************************
+! *   Copyright 1996, UCAR/Unidata
+! *   See netcdf/COPYRIGHT file for copying and redistribution conditions.
+! *   $Id: tests.inc,v 1.15 2007/01/19 16:08:47 ed Exp $
+! *********************************************************************/
+
+! Implementation of test.inc in a module
+! Modified by: Richard Weed,Ph.D
+!              Center for Advanced Vehicular Systems
+!              Mississippi State University
+!              rweed at cavs.msstate.edu
+
+!!!!
+! Do not tabify this unless you like hitting the 72 char limit !!!
+!!!
+#ifndef UD_TESTS_INC
+#define UD_TESTS_INC
+
+
+!/* The following prevents non-FORTRAN code from appearing in the output. */
+#if defined(__osf__)
+#   undef _POSIX_SOURCE
+#   define _POSIX_SOURCE
+#endif
+
+#if defined(NO_NETCDF_2)
+#  undef NO_NETCDF_2
+#  define NO_NETCDF_2 1
+#else
+#define NO_NETCDF_2 1
+#endif
+
+#include "nfconfig.inc"
+#ifdef USE_NETCDF4
+       USE netcdf4_f03
+#else
+       USE netcdf_f03
+#endif
+ 
+       Implicit NONE
+
+       SAVE
+!/* Parameters of test data */
+
+#ifdef  NF_INT1_T
+#   define NF_B 1
+#else
+#   define NF_B 0
+#endif
+#ifdef  NF_INT2_T
+#   define NF_S 1
+#else
+#   define NF_S 0
+#endif
+! Total number of FORTRAN types:
+       Integer, Parameter :: NUM_FORTRAN_TYPES = (3 + NF_S + NF_B)
+#undef NF_B
+#undef NF_S
+
+      Integer, Parameter :: NTYPES=6
+      Integer, Parameter :: NDIMS=5
+      Integer, Parameter :: NVARS=136
+      Integer, Parameter :: NRECS=2
+      Integer, Parameter :: NGATTS=NTYPES
+      Integer, Parameter :: RECDIM=1
+      Integer, Parameter :: MAX_RANK=3
+      Integer, Parameter :: MAX_NELS=64
+      Integer, Parameter :: MAX_DIM_LEN=4
+      Integer, Parameter :: MAX_NATTS=3
+
+
+!/*
+! * Limits of external types (based on those in ncx.h):
+! */
+      Integer, Parameter :: X_CHAR_MIN=0
+      Integer, Parameter :: X_CHAR_MAX=127
+      Integer, Parameter :: X_INT1_MIN=(-128)
+      Integer, Parameter :: X_INT1_MAX=127
+      Integer, Parameter :: X_INT2_MIN=(-32768)
+      Integer, Parameter :: X_INT2_MAX=32767
+      Integer, Parameter :: X_INT_MIN=(-2147483647-1)
+      Integer, Parameter :: X_INT_MAX=2147483647
+#if 0
+      Real(RK4), Parameter :: X_REAL_MAX=3.4028234663852886e+38
+#else
+      Real(RK4), Parameter :: X_REAL_MAX=3.4028234663852886e+37
+#endif
+      Real(RK4), Parameter :: X_REAL_MIN=(-X_REAL_MAX)
+#if 0
+      Real(RK8), Parameter :: X_DOUBLE_MAX=1.7976931348623157E+308
+#else
+      Real(RK8), Parameter :: X_DOUBLE_MAX=1.7976931348623157D+200
+#endif
+      Real(RK8), Parameter :: X_DOUBLE_MIN=(-X_DOUBLE_MAX)
+
+      Integer, Parameter :: X_BYTE_MIN=X_INT1_MIN
+      Integer, Parameter :: X_BYTE_MAX=X_INT1_MAX
+      Integer, Parameter :: X_SHORT_MIN=X_INT2_MIN
+      Integer, Parameter :: X_SHORT_MAX=X_INT2_MAX
+      Real(RK4), Parameter :: X_FLOAT_MIN=X_REAL_MIN
+      Real(RK4), Parameter :: X_FLOAT_MAX=X_REAL_MAX
+
+
+!/*
+! * Examples of invalid argument values:
+! */
+      Integer, Parameter :: BAD_ID=-1
+      Integer, Parameter :: BAD_DIMID=-1
+      Integer, Parameter :: BAD_VARID=-2
+      Integer, Parameter :: BAD_ATTNUM=-1
+      Integer, Parameter :: BAD_TYPE=0
+      Integer, Parameter :: BAD_FILLMODE=-1
+      Character*3, Parameter :: BAD_NAME='a/b'
+
+
+!/*
+! * Internal data types:
+! */
+      Integer, Parameter :: NFT_UNSPECIFIED=0
+      Integer, Parameter :: NFT_TEXT=16
+      Integer, Parameter :: NFT_CHAR=NFT_TEXT
+      Integer, Parameter :: NFT_INT1=17
+      Integer, Parameter :: NFT_INT2=18
+      Integer, Parameter :: NFT_INT=20
+      Integer, Parameter :: NFT_REAL=36
+      Integer, Parameter :: NFT_DOUBLE=40
+
+
+!/*
+! * Define a macro for trimming trailing blanks from character variables.
+! */
+#define TRIM(string) string(1:len_trim(string))
+
+
+!
+! FORTRAN GETARG() subroutine:
+!
+#ifdef __hpux
+#   define      getarg  getarg_
+#endif
+
+
+#endif /* UD_TESTS_INC */
+
+
+! #include "../fortran/netcdf.inc"
+
+
+!    /* Global variables - filenames */
+
+      CHARACTER(LEN=80) ::   testfile   !/* netCDF read-only test data */
+      CHARACTER(LEN=80) ::   scratch    !/* netCDF test file for writing */
+
+!    /* Global variables - command-line arguments */
+
+      LOGICAL :: CREATE_FILE
+      LOGICAL :: READONLY
+      LOGICAL :: VERBOSE
+      INTEGER :: NFAILS
+      INTEGER :: MAX_NMPT        !/* max num messages per test */
+
+!    /* Global variables - test data */
+
+      CHARACTER(LEN=2)            :: DIM_NAME(NDIMS)
+      INTEGER                     :: DIM_LEN(NDIMS)
+      CHARACTER(LEN=(2+MAX_RANK)) :: VAR_NAME(NVARS)
+      INTEGER                     :: VAR_TYPE(NVARS)
+      INTEGER                     :: VAR_RANK(NVARS)
+      INTEGER                     :: VAR_DIMID(MAX_RANK,NVARS)
+      INTEGER                     :: VAR_SHAPE(MAX_RANK,NVARS)
+      INTEGER                     :: VAR_NELS(NVARS)
+      INTEGER                     :: VAR_NATTS(NVARS)
+      CHARACTER(LEN=2)            :: ATTNAME(MAX_NATTS,NVARS)
+      CHARACTER(LEN=2)            :: GATT_NAME(NGATTS)
+      INTEGER                     :: ATTTYPE(NGATTS,NVARS)
+      INTEGER                     :: GATT_TYPE(NGATTS)
+      INTEGER                     :: ATTLEN(MAX_NATTS,NVARS)
+      INTEGER                     :: GATT_LEN(NGATTS)
+
+!    /* Miscellaneous global variables: */
+      CHARACTER(LEN=80) :: PROGNAME        !/* name of the program */
+      INTEGER           :: NFAILSTOTAL
+
+!    /* Common blocks for global variables: */
+
+!     COMMON    /LOGCOM/        CREATE_FILE,                            &
+!    &                          READONLY,                               & 
+!    &                          VERBOSE        
+
+!     COMMON    /TXTCOM/        TESTFILE,                               &
+!    &                          SCRATCH,                                &
+!    &                          DIM_NAME,                               &
+!    &                          VAR_NAME,                               &
+!    &                          ATTNAME,                                &
+!    &                          GATT_NAME,                              &
+!    &                          PROGNAME
+
+!     COMMON    /INTCOM/        NFAILS,                                 &  
+!    &                          DIM_LEN,                                &
+!    &                          VAR_TYPE,                               &
+!    &                          VAR_RANK,                               &
+!    &                          VAR_DIMID,                              &
+!    &                          VAR_SHAPE,                              &
+!    &                          VAR_NELS,                               &
+!    &                          VAR_NATTS,                              &
+!    &                          ATTTYPE,                                &
+!    &                          GATT_TYPE,                              &
+!    &                          ATTLEN,                                 &
+!    &                          GATT_LEN,                               &
+!    &                          MAX_NMPT,                               &
+!    &                          NFAILSTOTAL
+
+
+!    /* Functions for accessing attribute test data */
+!    /* varid is -1 for NC_GLOBAL so can do global atts in same loop */
+
+!/*      EXTERNAL       ATT_NAME */
+
+      INTEGER, EXTERNAL           :: VARID
+      INTEGER, EXTERNAL           :: NATTS
+      CHARACTER(LEN=2), EXTERNAL  :: ATT_NAME
+      INTEGER, EXTERNAL           :: ATT_TYPE
+      INTEGER, EXTERNAL           :: ATT_LEN
+
+
+      LOGICAL, EXTERNAL   :: INRANGE
+      LOGICAL, EXTERNAL   :: INRANGE_UCHAR
+      LOGICAL, EXTERNAL   :: INRANGE_FLOAT
+      LOGICAL, EXTERNAL   :: INRANGE3
+      LOGICAL, EXTERNAL   :: IN_INTERNAL_RANGE
+      LOGICAL, EXTERNAL   :: EQUAL
+      LOGICAL, EXTERNAL   :: INT_VEC_EQ
+
+      INTEGER, EXTERNAL   :: ROLL
+      INTEGER, EXTERNAL   :: INDEX2INDEXES
+      INTEGER, EXTERNAL   :: INDEX2NCINDEXES
+      INTEGER, EXTERNAL   :: INDEXES2INDEX
+      INTEGER, EXTERNAL   :: NC2DBL
+      INTEGER, EXTERNAL   :: DBL2NC
+!      INTEGER, EXTERNAL   :: LEN_TRIM
+      REAL(RK8), EXTERNAL :: HASH
+      REAL(RK8), EXTERNAL :: HASH4
+      REAL(RK8), EXTERNAL :: HASH_TEXT
+      REAL(RK8), EXTERNAL :: HASH_INT1
+      REAL(RK8), EXTERNAL :: HASH_INT2
+      REAL(RK8), EXTERNAL :: HASH_INT
+      REAL(RK8), EXTERNAL :: HASH_REAL
+      REAL(RK8), EXTERNAL :: HASH_DOUBLE
+      REAL(RK8), EXTERNAL :: INTERNAL_MIN
+      REAL(RK8), EXTERNAL :: INTERNAL_MAX
+      REAL(RK8), EXTERNAL :: EXTERNAL_MIN
+      REAL(RK8), EXTERNAL :: EXTERNAL_MAX
+
+      End Module tests
diff --git a/nf03_test/nf03_error.F b/nf03_test/nf03_error.F
new file mode 100755
index 0000000..e76bfde
--- /dev/null
+++ b/nf03_test/nf03_error.F
@@ -0,0 +1,75 @@
+#if 0
+    Copyright 1996, UCAR/Unidata
+    See netcdf/COPYRIGHT file for copying and redistribution conditions.
+    $Id: nf_error.F,v 1.4 1997/06/03 22:26:09 steve Exp $
+#endif
+
+
+C
+C Use for logging error messages
+C
+        subroutine error(msg)
+        use tests
+        implicit        none
+        character*(*)   msg
+
+        nfails = nfails + 1
+        if (nfails .le. max_nmpt) print *, msg
+        end
+
+
+C
+C Use for logging error conditions
+C
+        subroutine errori(msg, i)
+        use tests
+        implicit        none
+        character*(*)   msg
+        integer         i
+
+        nfails = nfails + 1
+        if (nfails .le. max_nmpt) print *, msg, i
+        end
+
+
+C
+C Use for logging error conditions
+C
+        subroutine errord(msg, d)
+        use tests
+        implicit        none
+        character*(*)   msg
+        doubleprecision d
+
+        nfails = nfails + 1
+        if (nfails .le. max_nmpt) print *, msg, d
+        end
+
+
+C
+C Use for logging error conditions
+C
+        subroutine errorc(msg, string)
+        use tests
+        implicit        none
+        character*(*)   msg
+        character*(*)   string
+
+        nfails = nfails + 1
+        if (nfails .le. max_nmpt) print *, msg, 
+     +      string(1:len_trim(string))
+        end
+
+
+C
+C Use for logging error conditions
+C
+        subroutine errore(msg, err)
+        use tests
+        implicit        none
+        character*(*)   msg
+        integer         err
+
+        nfails = nfails + 1
+        call errorc(msg, nf_strerror(err))
+        end
diff --git a/nf03_test/nf03_test.F b/nf03_test/nf03_test.F
new file mode 100755
index 0000000..15feb4f
--- /dev/null
+++ b/nf03_test/nf03_test.F
@@ -0,0 +1,388 @@
+#include "nfconfig.inc"
+
+C Copyright 1996-2006, UCAR/Unidata
+C See COPYRIGHT file for copying and redistribution conditions.
+
+C Test driver for netCDF-3 interface.  This program performs tests against
+C the netCDF-3 specification for all user-level functions in an
+C implementation of the netCDF library.
+
+C $Id: nf_test.F,v 1.28 2009/01/25 14:33:44 ed Exp $
+
+        subroutine test(name, func)
+        use tests
+        implicit        none
+        character*(*)   name
+        external        func
+
+        write(*, 1) name
+1       format(' *** testing ', a, ' ... ')
+        nfails = 0
+        call func()
+        nfailsTotal = nfailsTotal + nfails
+        if ( nfails .ne. 0) then
+            print *, ' '
+            print *, '  ### ', nfails, ' FAILURES TESTING ', name, 
+     +               '! ###'
+        end if
+        end
+
+        program nf_test
+        use tests
+        implicit        none
+
+
+        integer         status
+
+        external        test_nf_strerror
+        external        test_nf_open
+        external        test_nf_close
+        external        test_nf_inq
+        external        test_nf_inq_dimid
+        external        test_nf_inq_dim
+        external        test_nf_inq_dimlen
+        external        test_nf_inq_dimname
+        external        test_nf_inq_varid
+        external        test_nf_inq_var
+        external        test_nf_inq_natts
+        external        test_nf_inq_ndims
+        external        test_nf_inq_nvars
+        external        test_nf_inq_unlimdim
+        external        test_nf_inq_format
+        external        test_nf_inq_vardimid
+        external        test_nf_inq_varname
+        external        test_nf_inq_varnatts
+        external        test_nf_inq_varndims
+        external        test_nf_inq_vartype
+        external        test_nf_get_var1_text
+#if defined(NF_INT1_T)
+        external        test_nf_get_var1_int1
+#endif
+#if defined(NF_INT2_T)
+        external        test_nf_get_var1_int2
+#endif
+        external        test_nf_get_var1_int
+        external        test_nf_get_var1_real
+        external        test_nf_get_var1_double
+        external        test_nf_get_var_text
+#if defined(NF_INT1_T)
+        external        test_nf_get_var_int1
+#endif
+#if defined(NF_INT2_T)
+        external        test_nf_get_var_int2
+#endif
+        external        test_nf_get_var_int
+        external        test_nf_get_var_real
+        external        test_nf_get_var_double
+        external        test_nf_get_vara_text
+#if defined(NF_INT1_T)
+        external        test_nf_get_vara_int1
+#endif
+#if defined(NF_INT2_T)
+        external        test_nf_get_vara_int2
+#endif
+        external        test_nf_get_vara_int
+        external        test_nf_get_vara_real
+        external        test_nf_get_vara_double
+        external        test_nf_get_vars_text
+#if defined(NF_INT1_T)
+        external        test_nf_get_vars_int1
+#endif
+#if defined(NF_INT2_T)
+        external        test_nf_get_vars_int2
+#endif
+        external        test_nf_get_vars_int
+        external        test_nf_get_vars_real
+        external        test_nf_get_vars_double
+        external        test_nf_get_varm_text
+#if defined(NF_INT1_T)
+        external        test_nf_get_varm_int1
+#endif
+#if defined(NF_INT2_T)
+        external        test_nf_get_varm_int2
+#endif
+        external        test_nf_get_varm_int
+        external        test_nf_get_varm_real
+        external        test_nf_get_varm_double
+        external        test_nf_get_att_text
+#if defined(NF_INT1_T)
+        external        test_nf_get_att_int1
+#endif
+#if defined(NF_INT2_T)
+        external        test_nf_get_att_int2
+#endif
+        external        test_nf_get_att_int
+        external        test_nf_get_att_real
+        external        test_nf_get_att_double
+        external        test_nf_inq_att
+        external        test_nf_inq_attname
+        external        test_nf_inq_attid
+        external        test_nf_inq_attlen
+        external        test_nf_inq_atttype
+        external        test_nf_create
+        external        test_nf_redef
+        external        test_nf_enddef
+        external        test_nf_sync
+        external        test_nf_abort
+        external        test_nf_def_dim
+        external        test_nf_rename_dim
+        external        test_nf_def_var
+        external        test_nf_put_var1_text
+#if defined(NF_INT1_T)
+        external        test_nf_put_var1_int1
+#endif
+#if defined(NF_INT2_T)
+        external        test_nf_put_var1_int2
+#endif
+        external        test_nf_put_var1_int
+        external        test_nf_put_var1_real
+        external        test_nf_put_var1_double
+        external        test_nf_put_var_text
+#if defined(NF_INT1_T)
+        external        test_nf_put_var_int1
+#endif
+#if defined(NF_INT2_T)
+        external        test_nf_put_var_int2
+#endif
+        external        test_nf_put_var_int
+        external        test_nf_put_var_real
+        external        test_nf_put_var_double
+        external        test_nf_put_vara_text
+#if defined(NF_INT1_T)
+        external        test_nf_put_vara_int1
+#endif
+#if defined(NF_INT2_T)
+        external        test_nf_put_vara_int2
+#endif
+        external        test_nf_put_vara_int
+        external        test_nf_put_vara_real
+        external        test_nf_put_vara_double
+        external        test_nf_put_vars_text
+#if defined(NF_INT1_T)
+        external        test_nf_put_vars_int1
+#endif
+#if defined(NF_INT2_T)
+        external        test_nf_put_vars_int2
+#endif
+        external        test_nf_put_vars_int
+        external        test_nf_put_vars_real
+        external        test_nf_put_vars_double
+        external        test_nf_put_varm_text
+#if defined(NF_INT1_T)
+        external        test_nf_put_varm_int1
+#endif
+#if defined(NF_INT2_T)
+        external        test_nf_put_varm_int2
+#endif
+        external        test_nf_put_varm_int
+        external        test_nf_put_varm_real
+        external        test_nf_put_varm_double
+        external        test_nf_rename_var
+        external        test_nf_put_att_text
+#if defined(NF_INT1_T)
+        external        test_nf_put_att_int1
+#endif
+#if defined(NF_INT2_T)
+        external        test_nf_put_att_int2
+#endif
+        external        test_nf_put_att_int
+        external        test_nf_put_att_real
+        external        test_nf_put_att_double
+        external        test_nf_copy_att
+        external        test_nf_rename_att
+        external        test_nf_del_att
+        external        test_nf_set_fill
+        external        test_nf_set_default_format
+        external        ignorefpe
+
+        print *, ''
+        print *, '*** Testing netCDF-3 Fortran 77 API.'
+        call ignorefpe(1)
+
+        testfile = 'test.nc'
+        scratch = 'scratch.nc'
+
+        nfailsTotal = 0
+        progname = 'nf_test'
+        max_nmpt = 8
+
+        write(*, *) 'NetCDF version: ', nf_inq_libvers()
+
+C       /* Initialize global variables defining test file */
+        call init_gvars
+
+        call write_file(testfile)
+        if (nfailsTotal .gt. 0) call udexit(1)
+
+C       /* delete any existing scratch netCDF file */
+        status = nf_delete(scratch)
+
+C       /* Test read-only functions, using pregenerated test-file */
+        call test('nf_strerror', test_nf_strerror)
+        call test('nf_open', test_nf_open)
+        call test('nf_close', test_nf_close)
+        call test('nf_inq', test_nf_inq)
+        call test('nf_inq_dimid', test_nf_inq_dimid)
+        call test('nf_inq_dim', test_nf_inq_dim)
+        call test('nf_inq_dimlen', test_nf_inq_dimlen)
+        call test('nf_inq_dimname', test_nf_inq_dimname)
+        call test('nf_inq_varid', test_nf_inq_varid)
+        call test('nf_inq_var', test_nf_inq_var)
+        call test('nf_inq_natts', test_nf_inq_natts)
+        call test('nf_inq_ndims', test_nf_inq_ndims)
+        call test('nf_inq_nvars', test_nf_inq_nvars)
+        call test('nf_inq_unlimdim', test_nf_inq_unlimdim)
+        call test('nf_inq_format', test_nf_inq_format)
+        call test('nf_inq_vardimid', test_nf_inq_vardimid)
+        call test('nf_inq_varname', test_nf_inq_varname)
+        call test('nf_inq_varnatts', test_nf_inq_varnatts)
+        call test('nf_inq_varndims', test_nf_inq_varndims)
+        call test('nf_inq_vartype', test_nf_inq_vartype)
+        call test('nf_get_var1_text', test_nf_get_var1_text)
+#if defined(NF_INT1_T)
+        call test('nf_get_var1_int1', test_nf_get_var1_int1)
+#endif
+#if defined(NF_INT2_T)
+        call test('nf_get_var1_int2', test_nf_get_var1_int2)
+#endif
+        call test('nf_get_var1_int', test_nf_get_var1_int)
+        call test('nf_get_var1_real', test_nf_get_var1_real)
+        call test('nf_get_var1_double', test_nf_get_var1_double)
+        call test('nf_get_var_text', test_nf_get_var_text)
+#if defined(NF_INT1_T)
+        call test('nf_get_var_int1', test_nf_get_var_int1)
+#endif
+#if defined(NF_INT2_T)
+        call test('nf_get_var_int2', test_nf_get_var_int2)
+#endif
+        call test('nf_get_var_int', test_nf_get_var_int)
+        call test('nf_get_var_real', test_nf_get_var_real)
+        call test('nf_get_var_double', test_nf_get_var_double)
+        call test('nf_get_vara_text', test_nf_get_vara_text)
+#if defined(NF_INT1_T)
+        call test('nf_get_vara_int1', test_nf_get_vara_int1)
+#endif
+#if defined(NF_INT2_T)
+        call test('nf_get_vara_int2', test_nf_get_vara_int2)
+#endif
+        call test('nf_get_vara_int', test_nf_get_vara_int)
+        call test('nf_get_vara_real', test_nf_get_vara_real)
+        call test('nf_get_vara_double', test_nf_get_vara_double)
+        call test('nf_get_vars_text', test_nf_get_vars_text)
+#if defined(NF_INT1_T)
+        call test('nf_get_vars_int1', test_nf_get_vars_int1)
+#endif
+#if defined(NF_INT2_T)
+        call test('nf_get_vars_int2', test_nf_get_vars_int2)
+#endif
+        call test('nf_get_vars_int', test_nf_get_vars_int)
+        call test('nf_get_vars_real', test_nf_get_vars_real)
+        call test('nf_get_vars_double', test_nf_get_vars_double)
+        call test('nf_get_varm_text', test_nf_get_varm_text)
+#if defined(NF_INT1_T)
+        call test('nf_get_varm_int1', test_nf_get_varm_int1)
+#endif
+#if defined(NF_INT2_T)
+        call test('nf_get_varm_int2', test_nf_get_varm_int2)
+#endif
+        call test('nf_get_varm_int', test_nf_get_varm_int)
+        call test('nf_get_varm_real', test_nf_get_varm_real)
+        call test('nf_get_varm_double', test_nf_get_varm_double)
+        call test('nf_get_att_text', test_nf_get_att_text)
+#if defined(NF_INT1_T)
+        call test('nf_get_att_int1', test_nf_get_att_int1)
+#endif
+#if defined(NF_INT2_T)
+        call test('nf_get_att_int2', test_nf_get_att_int2)
+#endif
+        call test('nf_get_att_int', test_nf_get_att_int)
+        call test('nf_get_att_real', test_nf_get_att_real)
+        call test('nf_get_att_double', test_nf_get_att_double)
+        call test('nf_inq_att', test_nf_inq_att)
+        call test('nf_inq_attname', test_nf_inq_attname)
+        call test('nf_inq_attid', test_nf_inq_attid)
+        call test('nf_inq_attlen', test_nf_inq_attlen)
+        call test('nf_inq_atttype', test_nf_inq_atttype)
+
+C           /* Test write functions */
+        call test('nf_create', test_nf_create)
+        call test('nf_redef', test_nf_redef)
+        call test('nf_enddef', test_nf_enddef)
+        call test('nf_sync', test_nf_sync)
+        call test('nf_abort', test_nf_abort)
+        call test('nf_def_dim', test_nf_def_dim)
+        call test('nf_rename_dim', test_nf_rename_dim)
+        call test('nf_def_var', test_nf_def_var)
+        call test('nf_put_var1_text', test_nf_put_var1_text)
+#if defined(NF_INT1_T)
+        call test('nf_put_var1_int1', test_nf_put_var1_int1)
+#endif
+#if defined(NF_INT2_T)
+        call test('nf_put_var1_int2', test_nf_put_var1_int2)
+#endif
+        call test('nf_put_var1_int', test_nf_put_var1_int)
+        call test('nf_put_var1_real', test_nf_put_var1_real)
+        call test('nf_put_var1_double', test_nf_put_var1_double)
+        call test('nf_put_var_text', test_nf_put_var_text)
+#if defined(NF_INT1_T)
+        call test('nf_put_var_int1', test_nf_put_var_int1)
+#endif
+#if defined(NF_INT2_T)
+        call test('nf_put_var_int2', test_nf_put_var_int2)
+#endif
+        call test('nf_put_var_int', test_nf_put_var_int)
+        call test('nf_put_var_real', test_nf_put_var_real)
+        call test('nf_put_var_double', test_nf_put_var_double)
+        call test('nf_put_vara_text', test_nf_put_vara_text)
+#if defined(NF_INT1_T)
+        call test('nf_put_vara_int1', test_nf_put_vara_int1)
+#endif
+#if defined(NF_INT2_T)
+        call test('nf_put_vara_int2', test_nf_put_vara_int2)
+#endif
+        call test('nf_put_vara_int', test_nf_put_vara_int)
+        call test('nf_put_vara_real', test_nf_put_vara_real)
+        call test('nf_put_vara_double', test_nf_put_vara_double)
+        call test('nf_put_vars_text', test_nf_put_vars_text)
+#if defined(NF_INT1_T)
+        call test('nf_put_vars_int1', test_nf_put_vars_int1)
+#endif
+#if defined(NF_INT2_T)
+        call test('nf_put_vars_int2', test_nf_put_vars_int2)
+#endif
+        call test('nf_put_vars_int', test_nf_put_vars_int)
+        call test('nf_put_vars_real', test_nf_put_vars_real)
+        call test('nf_put_vars_double', test_nf_put_vars_double)
+        call test('nf_put_varm_text', test_nf_put_varm_text)
+#if defined(NF_INT1_T)
+        call test('nf_put_varm_int1', test_nf_put_varm_int1)
+#endif
+#if defined(NF_INT2_T)
+        call test('nf_put_varm_int2', test_nf_put_varm_int2)
+#endif
+        call test('nf_put_varm_int', test_nf_put_varm_int)
+        call test('nf_put_varm_real', test_nf_put_varm_real)
+        call test('nf_put_varm_double', test_nf_put_varm_double)
+        call test('nf_rename_var', test_nf_rename_var)
+        call test('nf_put_att_text', test_nf_put_att_text)
+#if defined(NF_INT1_T)
+        call test('nf_put_att_int1', test_nf_put_att_int1)
+#endif
+#if defined(NF_INT2_T)
+        call test('nf_put_att_int2', test_nf_put_att_int2)
+#endif
+        call test('nf_put_att_int', test_nf_put_att_int)
+        call test('nf_put_att_real', test_nf_put_att_real)
+        call test('nf_put_att_double', test_nf_put_att_double)
+        call test('nf_copy_att', test_nf_copy_att)
+        call test('nf_rename_att', test_nf_rename_att)
+        call test('nf_del_att', test_nf_del_att)
+        call test('nf_set_fill', test_nf_set_fill)
+        call test('nf_set_default_format', 
+     +       test_nf_set_default_format)
+
+        print *,'Total number of failures: ', nfailsTotal
+        if (nfailsTotal .ne. 0) stop 2
+        print *,'*** SUCCESS!'        
+
+        end
diff --git a/nf03_test/run_f77_par_test.sh b/nf03_test/run_f77_par_test.sh
new file mode 100755
index 0000000..54bcdc4
--- /dev/null
+++ b/nf03_test/run_f77_par_test.sh
@@ -0,0 +1,2 @@
+#mpd&
+mpiexec -n 4 ./f03tst_parallel
diff --git a/nf03_test/test03_get.F b/nf03_test/test03_get.F
new file mode 100755
index 0000000..715326f
--- /dev/null
+++ b/nf03_test/test03_get.F
@@ -0,0 +1,5600 @@
+#include "nfconfig.inc"
+C Do not edit this file. It is produced from the corresponding .m4 source */
+
+C*********************************************************************
+C   Copyright 1996, UCAR/Unidata
+C   See netcdf/COPYRIGHT file for copying and redistribution conditions.
+C   $Id: test_get.m4,v 1.11 2008/04/30 16:50:46 ed Exp $
+C*********************************************************************
+
+        subroutine test_nf_get_var1_text()
+        use tests
+        implicit        none
+        integer ncid
+        integer i
+        integer j
+        integer err
+        integer nok      
+        integer index(MAX_RANK)
+        doubleprecision expect
+        logical canConvert     
+        character    value
+        doubleprecision val
+
+        nok = 0
+
+        err = nf_open(testfile, NF_NOWRITE, ncid)
+        if (err .ne. 0)
+     +      call errore('nf_open: ', err)
+        do 1, i = 1, NVARS
+            canConvert = (var_type(i) .eq. NF_CHAR) .eqv.
+     +                   (NFT_TEXT .eq. NFT_TEXT)
+            do 2, j = 1, var_rank(i)
+                index(j) = 1
+2           continue
+            err = nf_get_var1_text(BAD_ID, i, index, value)
+            if (err .ne. NF_EBADID)
+     +          call errore('bad ncid: ', err)
+            err = nf_get_var1_text(ncid, BAD_VARID,
+     +                  index, value)
+            if (err .ne. NF_ENOTVAR)
+     +          call errore('bad var id: ', err)
+            do 3, j = 1, var_rank(i)
+                index(j) = var_shape(j,i) + 1
+                err = nf_get_var1_text(ncid, i, index, value)
+                if (.not. canConvert) then
+                    if (err .ne. NF_ECHAR)
+     +                  call errore('conversion: ', err)
+                else
+                    if (err .ne. NF_EINVALCOORDS)
+     +                  call errore('bad index: ', err)
+                endif
+                index(j) = 1
+3           continue
+            do 4, j = 1, var_nels(i)
+                err = index2indexes(j, var_rank(i), var_shape(1,i), 
+     +                              index)
+                if (err .ne. 0)
+     +              call error('error in index2indexes 1')
+                expect = hash4( var_type(i), var_rank(i), index, 
+     +                          NFT_TEXT )
+                err = nf_get_var1_text(ncid, i, index,
+     +                          value)
+                if (canConvert) then
+                    if (inRange3(expect,var_type(i), 
+     +                           NFT_TEXT)) then
+                        if (in_internal_range(NFT_TEXT,
+     +                                        expect)) then
+                            if (err .ne. 0) then
+                                call errore('nf_get_var: ', err)
+                            else
+                                val = ichar(value)
+                                if (.not. equal(val, expect, 
+     +                                          var_type(i), 
+     +                                          NFT_TEXT)) then
+                                    call errord('unexpected: ', val)
+                                else
+                                    nok = nok + 1
+                                end if
+                            end if
+                        else
+                            if (err .ne. NF_ERANGE)
+     +                          call errore('Range error: ', err)
+                        end if
+                    else
+                        if (err .ne. 0  .and. err .ne. NF_ERANGE)
+     +                      call errore('OK or Range error: ', err)
+                    end if
+                else
+                    if (err .ne. NF_ECHAR)
+     +                  call errore('wrong type: ', err)
+                end if
+4           continue
+1       continue
+        err = nf_close(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_close: ',  err)
+        call print_nok(nok)
+        end
+
+#ifdef NF_INT1_T
+        subroutine test_nf_get_var1_int1()
+        use tests
+        implicit        none
+        integer ncid
+        integer i
+        integer j
+        integer err
+        integer nok      
+        integer index(MAX_RANK)
+        doubleprecision expect
+        logical canConvert     
+        NF_INT1_T    value
+        doubleprecision val
+
+        nok = 0
+
+        err = nf_open(testfile, NF_NOWRITE, ncid)
+        if (err .ne. 0)
+     +      call errore('nf_open: ', err)
+        do 1, i = 1, NVARS
+            canConvert = (var_type(i) .eq. NF_CHAR) .eqv.
+     +                   (NFT_INT1 .eq. NFT_TEXT)
+            do 2, j = 1, var_rank(i)
+                index(j) = 1
+2           continue
+            err = nf_get_var1_int1(BAD_ID, i, index, value)
+            if (err .ne. NF_EBADID)
+     +          call errore('bad ncid: ', err)
+            err = nf_get_var1_int1(ncid, BAD_VARID,
+     +                  index, value)
+            if (err .ne. NF_ENOTVAR)
+     +          call errore('bad var id: ', err)
+            do 3, j = 1, var_rank(i)
+                index(j) = var_shape(j,i) + 1
+                err = nf_get_var1_int1(ncid, i, index, value)
+                if (.not. canConvert) then
+                    if (err .ne. NF_ECHAR)
+     +                  call errore('conversion: ', err)
+                else
+                    if (err .ne. NF_EINVALCOORDS)
+     +                  call errore('bad index: ', err)
+                endif
+                index(j) = 1
+3           continue
+            do 4, j = 1, var_nels(i)
+                err = index2indexes(j, var_rank(i), var_shape(1,i), 
+     +                              index)
+                if (err .ne. 0)
+     +              call error('error in index2indexes 1')
+                expect = hash4( var_type(i), var_rank(i), index, 
+     +                          NFT_INT1 )
+                err = nf_get_var1_int1(ncid, i, index,
+     +                          value)
+                if (canConvert) then
+                    if (inRange3(expect,var_type(i), 
+     +                           NFT_INT1)) then
+                        if (in_internal_range(NFT_INT1,
+     +                                        expect)) then
+                            if (err .ne. 0) then
+                                call errore('nf_get_var: ', err)
+                            else
+                                val = value
+                                if (.not. equal(val, expect, 
+     +                                          var_type(i), 
+     +                                          NFT_INT1)) then
+                                    call errord('unexpected: ', val)
+                                else
+                                    nok = nok + 1
+                                end if
+                            end if
+                        else
+                            if (err .ne. NF_ERANGE)
+     +                          call errore('Range error: ', err)
+                        end if
+                    else
+                        if (err .ne. 0  .and. err .ne. NF_ERANGE)
+     +                      call errore('OK or Range error: ', err)
+                    end if
+                else
+                    if (err .ne. NF_ECHAR)
+     +                  call errore('wrong type: ', err)
+                end if
+4           continue
+1       continue
+        err = nf_close(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_close: ',  err)
+        call print_nok(nok)
+        end
+
+#endif
+#ifdef NF_INT2_T
+        subroutine test_nf_get_var1_int2()
+        use tests
+        implicit        none
+        integer ncid
+        integer i
+        integer j
+        integer err
+        integer nok      
+        integer index(MAX_RANK)
+        doubleprecision expect
+        logical canConvert     
+        NF_INT2_T    value
+        doubleprecision val
+
+        nok = 0
+
+        err = nf_open(testfile, NF_NOWRITE, ncid)
+        if (err .ne. 0)
+     +      call errore('nf_open: ', err)
+        do 1, i = 1, NVARS
+            canConvert = (var_type(i) .eq. NF_CHAR) .eqv.
+     +                   (NFT_INT2 .eq. NFT_TEXT)
+            do 2, j = 1, var_rank(i)
+                index(j) = 1
+2           continue
+            err = nf_get_var1_int2(BAD_ID, i, index, value)
+            if (err .ne. NF_EBADID)
+     +          call errore('bad ncid: ', err)
+            err = nf_get_var1_int2(ncid, BAD_VARID,
+     +                  index, value)
+            if (err .ne. NF_ENOTVAR)
+     +          call errore('bad var id: ', err)
+            do 3, j = 1, var_rank(i)
+                index(j) = var_shape(j,i) + 1
+                err = nf_get_var1_int2(ncid, i, index, value)
+                if (.not. canConvert) then
+                    if (err .ne. NF_ECHAR)
+     +                  call errore('conversion: ', err)
+                else
+                    if (err .ne. NF_EINVALCOORDS)
+     +                  call errore('bad index: ', err)
+                endif
+                index(j) = 1
+3           continue
+            do 4, j = 1, var_nels(i)
+                err = index2indexes(j, var_rank(i), var_shape(1,i), 
+     +                              index)
+                if (err .ne. 0)
+     +              call error('error in index2indexes 1')
+                expect = hash4( var_type(i), var_rank(i), index, 
+     +                          NFT_INT2 )
+                err = nf_get_var1_int2(ncid, i, index,
+     +                          value)
+                if (canConvert) then
+                    if (inRange3(expect,var_type(i), 
+     +                           NFT_INT2)) then
+                        if (in_internal_range(NFT_INT2,
+     +                                        expect)) then
+                            if (err .ne. 0) then
+                                call errore('nf_get_var: ', err)
+                            else
+                                val = value
+                                if (.not. equal(val, expect, 
+     +                                          var_type(i), 
+     +                                          NFT_INT2)) then
+                                    call errord('unexpected: ', val)
+                                else
+                                    nok = nok + 1
+                                end if
+                            end if
+                        else
+                            if (err .ne. NF_ERANGE)
+     +                          call errore('Range error: ', err)
+                        end if
+                    else
+                        if (err .ne. 0  .and. err .ne. NF_ERANGE)
+     +                      call errore('OK or Range error: ', err)
+                    end if
+                else
+                    if (err .ne. NF_ECHAR)
+     +                  call errore('wrong type: ', err)
+                end if
+4           continue
+1       continue
+        err = nf_close(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_close: ',  err)
+        call print_nok(nok)
+        end
+
+#endif
+        subroutine test_nf_get_var1_int()
+        use tests
+        implicit        none
+        integer ncid
+        integer i
+        integer j
+        integer err
+        integer nok      
+        integer index(MAX_RANK)
+        doubleprecision expect
+        logical canConvert     
+        integer    value
+        doubleprecision val
+
+        nok = 0
+
+        err = nf_open(testfile, NF_NOWRITE, ncid)
+        if (err .ne. 0)
+     +      call errore('nf_open: ', err)
+        do 1, i = 1, NVARS
+            canConvert = (var_type(i) .eq. NF_CHAR) .eqv.
+     +                   (NFT_INT .eq. NFT_TEXT)
+            do 2, j = 1, var_rank(i)
+                index(j) = 1
+2           continue
+            err = nf_get_var1_int(BAD_ID, i, index, value)
+            if (err .ne. NF_EBADID)
+     +          call errore('bad ncid: ', err)
+            err = nf_get_var1_int(ncid, BAD_VARID,
+     +                  index, value)
+            if (err .ne. NF_ENOTVAR)
+     +          call errore('bad var id: ', err)
+            do 3, j = 1, var_rank(i)
+                index(j) = var_shape(j,i) + 1
+                err = nf_get_var1_int(ncid, i, index, value)
+                if (.not. canConvert) then
+                    if (err .ne. NF_ECHAR)
+     +                  call errore('conversion: ', err)
+                else
+                    if (err .ne. NF_EINVALCOORDS)
+     +                  call errore('bad index: ', err)
+                endif
+                index(j) = 1
+3           continue
+            do 4, j = 1, var_nels(i)
+                err = index2indexes(j, var_rank(i), var_shape(1,i), 
+     +                              index)
+                if (err .ne. 0)
+     +              call error('error in index2indexes 1')
+                expect = hash4( var_type(i), var_rank(i), index, 
+     +                          NFT_INT )
+                err = nf_get_var1_int(ncid, i, index,
+     +                          value)
+                if (canConvert) then
+                    if (inRange3(expect,var_type(i), 
+     +                           NFT_INT)) then
+                        if (in_internal_range(NFT_INT,
+     +                                        expect)) then
+                            if (err .ne. 0) then
+                                call errore('nf_get_var: ', err)
+                            else
+                                val = value
+                                if (.not. equal(val, expect, 
+     +                                          var_type(i), 
+     +                                          NFT_INT)) then
+                                    call errord('unexpected: ', val)
+                                else
+                                    nok = nok + 1
+                                end if
+                            end if
+                        else
+                            if (err .ne. NF_ERANGE)
+     +                          call errore('Range error: ', err)
+                        end if
+                    else
+                        if (err .ne. 0  .and. err .ne. NF_ERANGE)
+     +                      call errore('OK or Range error: ', err)
+                    end if
+                else
+                    if (err .ne. NF_ECHAR)
+     +                  call errore('wrong type: ', err)
+                end if
+4           continue
+1       continue
+        err = nf_close(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_close: ',  err)
+        call print_nok(nok)
+        end
+
+        subroutine test_nf_get_var1_real()
+        use tests
+        implicit        none
+        integer ncid
+        integer i
+        integer j
+        integer err
+        integer nok      
+        integer index(MAX_RANK)
+        doubleprecision expect
+        logical canConvert     
+        real    value
+        doubleprecision val
+
+        nok = 0
+
+        err = nf_open(testfile, NF_NOWRITE, ncid)
+        if (err .ne. 0)
+     +      call errore('nf_open: ', err)
+        do 1, i = 1, NVARS
+            canConvert = (var_type(i) .eq. NF_CHAR) .eqv.
+     +                   (NFT_REAL .eq. NFT_TEXT)
+            do 2, j = 1, var_rank(i)
+                index(j) = 1
+2           continue
+            err = nf_get_var1_real(BAD_ID, i, index, value)
+            if (err .ne. NF_EBADID)
+     +          call errore('bad ncid: ', err)
+            err = nf_get_var1_real(ncid, BAD_VARID,
+     +                  index, value)
+            if (err .ne. NF_ENOTVAR)
+     +          call errore('bad var id: ', err)
+            do 3, j = 1, var_rank(i)
+                index(j) = var_shape(j,i) + 1
+                err = nf_get_var1_real(ncid, i, index, value)
+                if (.not. canConvert) then
+                    if (err .ne. NF_ECHAR)
+     +                  call errore('conversion: ', err)
+                else
+                    if (err .ne. NF_EINVALCOORDS)
+     +                  call errore('bad index: ', err)
+                endif
+                index(j) = 1
+3           continue
+            do 4, j = 1, var_nels(i)
+                err = index2indexes(j, var_rank(i), var_shape(1,i), 
+     +                              index)
+                if (err .ne. 0)
+     +              call error('error in index2indexes 1')
+                expect = hash4( var_type(i), var_rank(i), index, 
+     +                          NFT_REAL )
+                err = nf_get_var1_real(ncid, i, index,
+     +                          value)
+                if (canConvert) then
+                    if (inRange3(expect,var_type(i), 
+     +                           NFT_REAL)) then
+                        if (in_internal_range(NFT_REAL,
+     +                                        expect)) then
+                            if (err .ne. 0) then
+                                call errore('nf_get_var: ', err)
+                            else
+                                val = value
+                                if (.not. equal(val, expect, 
+     +                                          var_type(i), 
+     +                                          NFT_REAL)) then
+                                    call errord('unexpected: ', val)
+                                else
+                                    nok = nok + 1
+                                end if
+                            end if
+                        else
+                            if (err .ne. NF_ERANGE)
+     +                          call errore('Range error: ', err)
+                        end if
+                    else
+                        if (err .ne. 0  .and. err .ne. NF_ERANGE)
+     +                      call errore('OK or Range error: ', err)
+                    end if
+                else
+                    if (err .ne. NF_ECHAR)
+     +                  call errore('wrong type: ', err)
+                end if
+4           continue
+1       continue
+        err = nf_close(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_close: ',  err)
+        call print_nok(nok)
+        end
+
+        subroutine test_nf_get_var1_double()
+        use tests
+        implicit        none
+        integer ncid
+        integer i
+        integer j
+        integer err
+        integer nok      
+        integer index(MAX_RANK)
+        doubleprecision expect
+        logical canConvert     
+        doubleprecision    value
+        doubleprecision val
+
+        nok = 0
+
+        err = nf_open(testfile, NF_NOWRITE, ncid)
+        if (err .ne. 0)
+     +      call errore('nf_open: ', err)
+        do 1, i = 1, NVARS
+            canConvert = (var_type(i) .eq. NF_CHAR) .eqv.
+     +                   (NFT_DOUBLE .eq. NFT_TEXT)
+            do 2, j = 1, var_rank(i)
+                index(j) = 1
+2           continue
+            err = nf_get_var1_double(BAD_ID, i, index, value)
+            if (err .ne. NF_EBADID)
+     +          call errore('bad ncid: ', err)
+            err = nf_get_var1_double(ncid, BAD_VARID,
+     +                  index, value)
+            if (err .ne. NF_ENOTVAR)
+     +          call errore('bad var id: ', err)
+            do 3, j = 1, var_rank(i)
+                index(j) = var_shape(j,i) + 1
+                err = nf_get_var1_double(ncid, i, index, value)
+                if (.not. canConvert) then
+                    if (err .ne. NF_ECHAR)
+     +                  call errore('conversion: ', err)
+                else
+                    if (err .ne. NF_EINVALCOORDS)
+     +                  call errore('bad index: ', err)
+                endif
+                index(j) = 1
+3           continue
+            do 4, j = 1, var_nels(i)
+                err = index2indexes(j, var_rank(i), var_shape(1,i), 
+     +                              index)
+                if (err .ne. 0)
+     +              call error('error in index2indexes 1')
+                expect = hash4( var_type(i), var_rank(i), index, 
+     +                          NFT_DOUBLE )
+                err = nf_get_var1_double(ncid, i, index,
+     +                          value)
+                if (canConvert) then
+                    if (inRange3(expect,var_type(i), 
+     +                           NFT_DOUBLE)) then
+                        if (in_internal_range(NFT_DOUBLE,
+     +                                        expect)) then
+                            if (err .ne. 0) then
+                                call errore('nf_get_var: ', err)
+                            else
+                                val = value
+                                if (.not. equal(val, expect, 
+     +                                          var_type(i), 
+     +                                          NFT_DOUBLE)) then
+                                    call errord('unexpected: ', val)
+                                else
+                                    nok = nok + 1
+                                end if
+                            end if
+                        else
+                            if (err .ne. NF_ERANGE)
+     +                          call errore('Range error: ', err)
+                        end if
+                    else
+                        if (err .ne. 0  .and. err .ne. NF_ERANGE)
+     +                      call errore('OK or Range error: ', err)
+                    end if
+                else
+                    if (err .ne. NF_ECHAR)
+     +                  call errore('wrong type: ', err)
+                end if
+4           continue
+1       continue
+        err = nf_close(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_close: ',  err)
+        call print_nok(nok)
+        end
+
+
+        subroutine test_nf_get_var_text()
+        use tests
+        implicit        none
+        integer ncid
+        integer i
+        integer j
+        integer err
+        logical allInExtRange   
+        logical allInIntRange   
+        integer nels
+        integer nok      
+        integer index(MAX_RANK)
+        doubleprecision expect(MAX_NELS)
+        logical canConvert     
+        character    value(MAX_NELS)
+        doubleprecision val
+
+        nok = 0
+
+        err = nf_open(testfile, NF_NOWRITE, ncid)
+        if (err .ne. 0)
+     +      call errore('nf_open: ', err)
+        do 1, i = 1, NVARS
+            canConvert = (var_type(i) .eq. NF_CHAR) .eqv.
+     +                   (NFT_TEXT .eq. NFT_TEXT)
+            err = nf_get_var_text(BAD_ID, i, value)
+            if (err .ne. NF_EBADID)
+     +          call errore('bad ncid: ', err)
+            err = nf_get_var_text(ncid, BAD_VARID, value)
+            if (err .ne. NF_ENOTVAR)
+     +          call errore('bad var id: ', err)
+            nels = 1
+            do 3, j = 1, var_rank(i)
+                nels = nels * var_shape(j,i)
+3           continue
+            allInExtRange = .true.
+            allInIntRange = .true.
+            do 4, j = 1, var_nels(i)
+                err = index2indexes(j, var_rank(i), var_shape(1,i), 
+     +                              index)
+                if (err .ne. 0)
+     +              call error('error in index2indexes 1')
+                expect(j) = hash4( var_type(i), var_rank(i), index, 
+     +                          NFT_TEXT )
+                if (inRange3(expect(j),var_type(i), NFT_TEXT)) then
+                    allInIntRange = allInIntRange .and.
+     +                  in_internal_range(NFT_TEXT, expect(j))
+                else
+                    allInExtRange = .false.
+                end if
+4           continue
+            err = nf_get_var_text(ncid, i, value)
+            if (canConvert) then
+                if (allInExtRange) then
+                    if (allInIntRange) then
+                        if (err .ne. 0) 
+     +                      call errore('nf_get_var: ', err)
+                    else
+                        if (err .ne. NF_ERANGE)
+     +                      call errore('Range error: ', err)
+                    endif
+                else
+                    if (err .ne. 0  .and. err .ne. NF_ERANGE)
+     +                  call errore('Range error: ', err)
+                endif
+                do 5, j = 1, var_nels(i)
+                    if (inRange3(expect(j),var_type(i),
+     +                           NFT_TEXT) .and.
+     +                  in_internal_range(NFT_TEXT,
+     +                                          expect(j))) then
+                        val = ichar(value(j))
+                        if (.not. equal(val, expect(j), 
+     +                                  var_type(i), 
+     +                                  NFT_TEXT)) then
+                            call errord('unexpected: ', val)
+                        else
+                            nok = nok + 1
+                        end if
+                    endif
+5               continue
+            else
+                if (err .ne. NF_ECHAR)
+     +                  call errore('wrong type: ', err)
+            end if
+1       continue
+        err = nf_close(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_close: ',  err)
+        call print_nok(nok)
+        end
+
+#ifdef NF_INT1_T
+        subroutine test_nf_get_var_int1()
+        use tests
+        implicit        none
+        integer ncid
+        integer i
+        integer j
+        integer err
+        logical allInExtRange   
+        logical allInIntRange   
+        integer nels
+        integer nok      
+        integer index(MAX_RANK)
+        doubleprecision expect(MAX_NELS)
+        logical canConvert     
+        NF_INT1_T    value(MAX_NELS)
+        doubleprecision val
+
+        nok = 0
+
+        err = nf_open(testfile, NF_NOWRITE, ncid)
+        if (err .ne. 0)
+     +      call errore('nf_open: ', err)
+        do 1, i = 1, NVARS
+            canConvert = (var_type(i) .eq. NF_CHAR) .eqv.
+     +                   (NFT_INT1 .eq. NFT_TEXT)
+            err = nf_get_var_int1(BAD_ID, i, value)
+            if (err .ne. NF_EBADID)
+     +          call errore('bad ncid: ', err)
+            err = nf_get_var_int1(ncid, BAD_VARID, value)
+            if (err .ne. NF_ENOTVAR)
+     +          call errore('bad var id: ', err)
+            nels = 1
+            do 3, j = 1, var_rank(i)
+                nels = nels * var_shape(j,i)
+3           continue
+            allInExtRange = .true.
+            allInIntRange = .true.
+            do 4, j = 1, var_nels(i)
+                err = index2indexes(j, var_rank(i), var_shape(1,i), 
+     +                              index)
+                if (err .ne. 0)
+     +              call error('error in index2indexes 1')
+                expect(j) = hash4( var_type(i), var_rank(i), index, 
+     +                          NFT_INT1 )
+                if (inRange3(expect(j),var_type(i), NFT_INT1)) then
+                    allInIntRange = allInIntRange .and.
+     +                  in_internal_range(NFT_INT1, expect(j))
+                else
+                    allInExtRange = .false.
+                end if
+4           continue
+            err = nf_get_var_int1(ncid, i, value)
+            if (canConvert) then
+                if (allInExtRange) then
+                    if (allInIntRange) then
+                        if (err .ne. 0) 
+     +                      call errore('nf_get_var: ', err)
+                    else
+                        if (err .ne. NF_ERANGE)
+     +                      call errore('Range error: ', err)
+                    endif
+                else
+                    if (err .ne. 0  .and. err .ne. NF_ERANGE)
+     +                  call errore('Range error: ', err)
+                endif
+                do 5, j = 1, var_nels(i)
+                    if (inRange3(expect(j),var_type(i),
+     +                           NFT_INT1) .and.
+     +                  in_internal_range(NFT_INT1,
+     +                                          expect(j))) then
+                        val = value(j)
+                        if (.not. equal(val, expect(j), 
+     +                                  var_type(i), 
+     +                                  NFT_INT1)) then
+                            call errord('unexpected: ', val)
+                        else
+                            nok = nok + 1
+                        end if
+                    endif
+5               continue
+            else
+                if (err .ne. NF_ECHAR)
+     +                  call errore('wrong type: ', err)
+            end if
+1       continue
+        err = nf_close(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_close: ',  err)
+        call print_nok(nok)
+        end
+
+#endif
+#ifdef NF_INT2_T
+        subroutine test_nf_get_var_int2()
+        use tests
+        implicit        none
+        integer ncid
+        integer i
+        integer j
+        integer err
+        logical allInExtRange   
+        logical allInIntRange   
+        integer nels
+        integer nok      
+        integer index(MAX_RANK)
+        doubleprecision expect(MAX_NELS)
+        logical canConvert     
+        NF_INT2_T    value(MAX_NELS)
+        doubleprecision val
+
+        nok = 0
+
+        err = nf_open(testfile, NF_NOWRITE, ncid)
+        if (err .ne. 0)
+     +      call errore('nf_open: ', err)
+        do 1, i = 1, NVARS
+            canConvert = (var_type(i) .eq. NF_CHAR) .eqv.
+     +                   (NFT_INT2 .eq. NFT_TEXT)
+            err = nf_get_var_int2(BAD_ID, i, value)
+            if (err .ne. NF_EBADID)
+     +          call errore('bad ncid: ', err)
+            err = nf_get_var_int2(ncid, BAD_VARID, value)
+            if (err .ne. NF_ENOTVAR)
+     +          call errore('bad var id: ', err)
+            nels = 1
+            do 3, j = 1, var_rank(i)
+                nels = nels * var_shape(j,i)
+3           continue
+            allInExtRange = .true.
+            allInIntRange = .true.
+            do 4, j = 1, var_nels(i)
+                err = index2indexes(j, var_rank(i), var_shape(1,i), 
+     +                              index)
+                if (err .ne. 0)
+     +              call error('error in index2indexes 1')
+                expect(j) = hash4( var_type(i), var_rank(i), index, 
+     +                          NFT_INT2 )
+                if (inRange3(expect(j),var_type(i), NFT_INT2)) then
+                    allInIntRange = allInIntRange .and.
+     +                  in_internal_range(NFT_INT2, expect(j))
+                else
+                    allInExtRange = .false.
+                end if
+4           continue
+            err = nf_get_var_int2(ncid, i, value)
+            if (canConvert) then
+                if (allInExtRange) then
+                    if (allInIntRange) then
+                        if (err .ne. 0) 
+     +                      call errore('nf_get_var: ', err)
+                    else
+                        if (err .ne. NF_ERANGE)
+     +                      call errore('Range error: ', err)
+                    endif
+                else
+                    if (err .ne. 0  .and. err .ne. NF_ERANGE)
+     +                  call errore('Range error: ', err)
+                endif
+                do 5, j = 1, var_nels(i)
+                    if (inRange3(expect(j),var_type(i),
+     +                           NFT_INT2) .and.
+     +                  in_internal_range(NFT_INT2,
+     +                                          expect(j))) then
+                        val = value(j)
+                        if (.not. equal(val, expect(j), 
+     +                                  var_type(i), 
+     +                                  NFT_INT2)) then
+                            call errord('unexpected: ', val)
+                        else
+                            nok = nok + 1
+                        end if
+                    endif
+5               continue
+            else
+                if (err .ne. NF_ECHAR)
+     +                  call errore('wrong type: ', err)
+            end if
+1       continue
+        err = nf_close(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_close: ',  err)
+        call print_nok(nok)
+        end
+
+#endif
+        subroutine test_nf_get_var_int()
+        use tests
+        implicit        none
+        integer ncid
+        integer i
+        integer j
+        integer err
+        logical allInExtRange   
+        logical allInIntRange   
+        integer nels
+        integer nok      
+        integer index(MAX_RANK)
+        doubleprecision expect(MAX_NELS)
+        logical canConvert     
+        integer    value(MAX_NELS)
+        doubleprecision val
+
+        nok = 0
+
+        err = nf_open(testfile, NF_NOWRITE, ncid)
+        if (err .ne. 0)
+     +      call errore('nf_open: ', err)
+        do 1, i = 1, NVARS
+            canConvert = (var_type(i) .eq. NF_CHAR) .eqv.
+     +                   (NFT_INT .eq. NFT_TEXT)
+            err = nf_get_var_int(BAD_ID, i, value)
+            if (err .ne. NF_EBADID)
+     +          call errore('bad ncid: ', err)
+            err = nf_get_var_int(ncid, BAD_VARID, value)
+            if (err .ne. NF_ENOTVAR)
+     +          call errore('bad var id: ', err)
+            nels = 1
+            do 3, j = 1, var_rank(i)
+                nels = nels * var_shape(j,i)
+3           continue
+            allInExtRange = .true.
+            allInIntRange = .true.
+            do 4, j = 1, var_nels(i)
+                err = index2indexes(j, var_rank(i), var_shape(1,i), 
+     +                              index)
+                if (err .ne. 0)
+     +              call error('error in index2indexes 1')
+                expect(j) = hash4( var_type(i), var_rank(i), index, 
+     +                          NFT_INT )
+                if (inRange3(expect(j),var_type(i), NFT_INT)) then
+                    allInIntRange = allInIntRange .and.
+     +                  in_internal_range(NFT_INT, expect(j))
+                else
+                    allInExtRange = .false.
+                end if
+4           continue
+            err = nf_get_var_int(ncid, i, value)
+            if (canConvert) then
+                if (allInExtRange) then
+                    if (allInIntRange) then
+                        if (err .ne. 0) 
+     +                      call errore('nf_get_var: ', err)
+                    else
+                        if (err .ne. NF_ERANGE)
+     +                      call errore('Range error: ', err)
+                    endif
+                else
+                    if (err .ne. 0  .and. err .ne. NF_ERANGE)
+     +                  call errore('Range error: ', err)
+                endif
+                do 5, j = 1, var_nels(i)
+                    if (inRange3(expect(j),var_type(i),
+     +                           NFT_INT) .and.
+     +                  in_internal_range(NFT_INT,
+     +                                          expect(j))) then
+                        val = value(j)
+                        if (.not. equal(val, expect(j), 
+     +                                  var_type(i), 
+     +                                  NFT_INT)) then
+                            call errord('unexpected: ', val)
+                        else
+                            nok = nok + 1
+                        end if
+                    endif
+5               continue
+            else
+                if (err .ne. NF_ECHAR)
+     +                  call errore('wrong type: ', err)
+            end if
+1       continue
+        err = nf_close(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_close: ',  err)
+        call print_nok(nok)
+        end
+
+        subroutine test_nf_get_var_real()
+        use tests
+        implicit        none
+        integer ncid
+        integer i
+        integer j
+        integer err
+        logical allInExtRange   
+        logical allInIntRange   
+        integer nels
+        integer nok      
+        integer index(MAX_RANK)
+        doubleprecision expect(MAX_NELS)
+        logical canConvert     
+        real    value(MAX_NELS)
+        doubleprecision val
+
+        nok = 0
+
+        err = nf_open(testfile, NF_NOWRITE, ncid)
+        if (err .ne. 0)
+     +      call errore('nf_open: ', err)
+        do 1, i = 1, NVARS
+            canConvert = (var_type(i) .eq. NF_CHAR) .eqv.
+     +                   (NFT_REAL .eq. NFT_TEXT)
+            err = nf_get_var_real(BAD_ID, i, value)
+            if (err .ne. NF_EBADID)
+     +          call errore('bad ncid: ', err)
+            err = nf_get_var_real(ncid, BAD_VARID, value)
+            if (err .ne. NF_ENOTVAR)
+     +          call errore('bad var id: ', err)
+            nels = 1
+            do 3, j = 1, var_rank(i)
+                nels = nels * var_shape(j,i)
+3           continue
+            allInExtRange = .true.
+            allInIntRange = .true.
+            do 4, j = 1, var_nels(i)
+                err = index2indexes(j, var_rank(i), var_shape(1,i), 
+     +                              index)
+                if (err .ne. 0)
+     +              call error('error in index2indexes 1')
+                expect(j) = hash4( var_type(i), var_rank(i), index, 
+     +                          NFT_REAL )
+                if (inRange3(expect(j),var_type(i), NFT_REAL)) then
+                    allInIntRange = allInIntRange .and.
+     +                  in_internal_range(NFT_REAL, expect(j))
+                else
+                    allInExtRange = .false.
+                end if
+4           continue
+            err = nf_get_var_real(ncid, i, value)
+            if (canConvert) then
+                if (allInExtRange) then
+                    if (allInIntRange) then
+                        if (err .ne. 0) 
+     +                      call errore('nf_get_var: ', err)
+                    else
+                        if (err .ne. NF_ERANGE)
+     +                      call errore('Range error: ', err)
+                    endif
+                else
+                    if (err .ne. 0  .and. err .ne. NF_ERANGE)
+     +                  call errore('Range error: ', err)
+                endif
+                do 5, j = 1, var_nels(i)
+                    if (inRange3(expect(j),var_type(i),
+     +                           NFT_REAL) .and.
+     +                  in_internal_range(NFT_REAL,
+     +                                          expect(j))) then
+                        val = value(j)
+                        if (.not. equal(val, expect(j), 
+     +                                  var_type(i), 
+     +                                  NFT_REAL)) then
+                            call errord('unexpected: ', val)
+                        else
+                            nok = nok + 1
+                        end if
+                    endif
+5               continue
+            else
+                if (err .ne. NF_ECHAR)
+     +                  call errore('wrong type: ', err)
+            end if
+1       continue
+        err = nf_close(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_close: ',  err)
+        call print_nok(nok)
+        end
+
+        subroutine test_nf_get_var_double()
+        use tests
+        implicit        none
+        integer ncid
+        integer i
+        integer j
+        integer err
+        logical allInExtRange   
+        logical allInIntRange   
+        integer nels
+        integer nok      
+        integer index(MAX_RANK)
+        doubleprecision expect(MAX_NELS)
+        logical canConvert     
+        doubleprecision    value(MAX_NELS)
+        doubleprecision val
+
+        nok = 0
+
+        err = nf_open(testfile, NF_NOWRITE, ncid)
+        if (err .ne. 0)
+     +      call errore('nf_open: ', err)
+        do 1, i = 1, NVARS
+            canConvert = (var_type(i) .eq. NF_CHAR) .eqv.
+     +                   (NFT_DOUBLE .eq. NFT_TEXT)
+            err = nf_get_var_double(BAD_ID, i, value)
+            if (err .ne. NF_EBADID)
+     +          call errore('bad ncid: ', err)
+            err = nf_get_var_double(ncid, BAD_VARID, value)
+            if (err .ne. NF_ENOTVAR)
+     +          call errore('bad var id: ', err)
+            nels = 1
+            do 3, j = 1, var_rank(i)
+                nels = nels * var_shape(j,i)
+3           continue
+            allInExtRange = .true.
+            allInIntRange = .true.
+            do 4, j = 1, var_nels(i)
+                err = index2indexes(j, var_rank(i), var_shape(1,i), 
+     +                              index)
+                if (err .ne. 0)
+     +              call error('error in index2indexes 1')
+                expect(j) = hash4( var_type(i), var_rank(i), index, 
+     +                          NFT_DOUBLE )
+                if (inRange3(expect(j),var_type(i), NFT_DOUBLE)) then
+                    allInIntRange = allInIntRange .and.
+     +                  in_internal_range(NFT_DOUBLE, expect(j))
+                else
+                    allInExtRange = .false.
+                end if
+4           continue
+            err = nf_get_var_double(ncid, i, value)
+            if (canConvert) then
+                if (allInExtRange) then
+                    if (allInIntRange) then
+                        if (err .ne. 0) 
+     +                      call errore('nf_get_var: ', err)
+                    else
+                        if (err .ne. NF_ERANGE)
+     +                      call errore('Range error: ', err)
+                    endif
+                else
+                    if (err .ne. 0  .and. err .ne. NF_ERANGE)
+     +                  call errore('Range error: ', err)
+                endif
+                do 5, j = 1, var_nels(i)
+                    if (inRange3(expect(j),var_type(i),
+     +                           NFT_DOUBLE) .and.
+     +                  in_internal_range(NFT_DOUBLE,
+     +                                          expect(j))) then
+                        val = value(j)
+                        if (.not. equal(val, expect(j), 
+     +                                  var_type(i), 
+     +                                  NFT_DOUBLE)) then
+                            call errord('unexpected: ', val)
+                        else
+                            nok = nok + 1
+                        end if
+                    endif
+5               continue
+            else
+                if (err .ne. NF_ECHAR)
+     +                  call errore('wrong type: ', err)
+            end if
+1       continue
+        err = nf_close(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_close: ',  err)
+        call print_nok(nok)
+        end
+
+
+        subroutine test_nf_get_vara_text()
+        use tests
+        implicit        none
+        integer ncid
+        integer d
+        integer i
+        integer j
+        integer k
+        integer err
+        logical allInExtRange   
+        logical allInIntRange   
+        integer nels
+        integer nslabs
+        integer nok      
+        integer start(MAX_RANK)
+        integer edge(MAX_RANK)
+        integer index(MAX_RANK)
+        integer mid(MAX_RANK)
+        logical canConvert     
+        character    value(MAX_NELS)
+        doubleprecision expect(MAX_NELS)
+        doubleprecision val
+        integer udshift
+
+        nok = 0
+
+        err = nf_open(testfile, NF_NOWRITE, ncid)
+        if (err .ne. 0)
+     +      call errore('nf_open: ', err)
+        do 1, i = 1, NVARS
+            canConvert = (var_type(i) .eq. NF_CHAR) .eqv. 
+     +                   (NFT_TEXT .eq. NFT_TEXT)
+            if (.not.(var_rank(i) .le. MAX_RANK)) stop 2
+            if (.not.(var_nels(i) .le. MAX_NELS)) stop 2
+            do 2, j = 1, var_rank(i)
+                start(j) = 1
+                edge(j) = 1
+2           continue
+            err = nf_get_vara_text(BAD_ID, i, start,
+     +                  edge, value)
+            if (err .ne. NF_EBADID)
+     +          call errore('bad ncid: ', err)
+            err = nf_get_vara_text(ncid, BAD_VARID, start, 
+     +                           edge, value)
+            if (err .ne. NF_ENOTVAR)
+     +          call errore('bad var id: ', err)
+            do 3, j = 1, var_rank(i)
+                start(j) = var_shape(j,i) + 1
+                err = nf_get_vara_text(ncid, i, start,
+     +                               edge, value)
+                if (canConvert .and. err .ne. NF_EINVALCOORDS)
+     +              call errore('bad index: ', err)
+                start(j) = 1
+                edge(j) = var_shape(j,i) + 1
+                err = nf_get_vara_text(ncid, i, start,
+     +                               edge, value)
+                if (canConvert .and. err .ne. NF_EEDGE)
+     +              call errore('bad edge: ', err)
+                edge(j) = 1
+3           continue
+
+C           /* Check non-scalars for correct error returned even when */
+C           /* there is nothing to get (edge(j).eq.0) */
+            if (var_rank(i) .gt. 0) then
+                do 10, j = 1, var_rank(i)
+                    edge(j) = 0
+10              continue
+                err = nf_get_vara_text(BAD_ID, i, start,
+     +                  edge, value)
+                if (err .ne. NF_EBADID) 
+     +              call errore('bad ncid: ', err)
+                err = nf_get_vara_text(ncid, BAD_VARID,
+     +                  start, edge, value)
+                if (err .ne. NF_ENOTVAR) 
+     +              call errore('bad var id: ', err)
+                do 11, j = 1, var_rank(i)
+                    if (var_dimid(j,i) .gt. 1) then     !/* skip record dim */
+                        start(j) = var_shape(j,i) + 1
+                        err = nf_get_vara_text(ncid, i,
+     +                          start, edge, value)
+                        if (canConvert .and. err .ne. NF_EINVALCOORDS)
+     +                      call errore('bad start: ', err)
+                        start(j) = 1
+                    endif
+11              continue
+                err = nf_get_vara_text(ncid, i, start,
+     +                          edge, value)
+                if (canConvert) then
+                    if (err .ne. 0) 
+     +                  call error(nf_strerror(err))
+                else
+                    if (err .ne. NF_ECHAR)
+     +                  call errore('wrong type: ', err)
+                endif
+                do 12, j = 1, var_rank(i)
+                    edge(j) = 1
+12              continue
+            endif
+
+C           Choose a random point dividing each dim into 2 parts
+C           get 2^rank (nslabs) slabs so defined
+            nslabs = 1
+            do 4, j = 1, var_rank(i)
+                mid(j) = roll( var_shape(j,i) )
+                nslabs = nslabs * 2
+4           continue
+C           bits of k determine whether to get lower or upper part of dim 
+            do 5, k = 1, nslabs
+                nels = 1
+                do 6, j = 1, var_rank(i)
+                    if (mod(udshift((k-1), -(j-1)), 2) .eq. 1) then
+                        start(j) = 1
+                        edge(j) = mid(j)
+                    else
+                        start(j) = 1 + mid(j)
+                        edge(j) = var_shape(j,i) - mid(j)
+                    end if
+                    nels = nels * edge(j)
+6               continue
+                allInIntRange = .true.
+                allInExtRange = .true.
+                do 7, j = 1, nels
+                    err = index2indexes(j, var_rank(i), edge, index)
+                    if (err .ne. 0)
+     +                  call error('error in index2indexes 1')
+                    do 8, d = 1, var_rank(i)
+                        index(d) = index(d) + start(d) - 1
+8                   continue
+                    expect(j) = hash4(var_type(i), var_rank(i), index, 
+     +                                NFT_TEXT)
+                    if (inRange3(expect(j),var_type(i), 
+     +                           NFT_TEXT)) then
+                        allInIntRange = 
+     +                      allInIntRange .and.
+     +                      in_internal_range(NFT_TEXT, expect(j))
+                    else
+                        allInExtRange = .false.
+                    end if
+7               continue
+                err = nf_get_vara_text(ncid, i, start,
+     +                          edge, value)
+                if (canConvert) then
+                    if (allInExtRange) then
+                        if (allInIntRange) then
+                            if (err .ne. 0)
+     +                          call errore('nf_get_vara_text:', err)
+                        else
+                            if (err .ne. NF_ERANGE)
+     +                          call errore('Range error: ', err)
+                        end if
+                    else
+                        if (err .ne. 0 .and. err .ne. NF_ERANGE)
+     +                      call errore('OK or Range error: ', err)
+                    end if
+                    do 9, j = 1, nels
+                        if (inRange3(expect(j),var_type(i),
+     +                               NFT_TEXT) .and.
+     +                      in_internal_range(NFT_TEXT, expect(j)))
+     +                          then
+                            val = ichar(value(j))
+                            if (.not.equal(val,expect(j),
+     +                                     var_type(i),NFT_TEXT)) 
+     +                              then
+                                call error(
+     +                              'value read not that expected')
+                                if (verbose) then
+                                    call error(' ')
+                                    call errori('varid: ', i)
+                                    call errorc('var_name: ',
+     +                                  var_name(i))
+                                    call errori('element number: %d ', 
+     +                                          j)
+                                    call errord('expect: ', expect(j))
+                                    call errord('got: ', val)
+                                end if
+                            else
+                                nok = nok + 1
+                            end if
+                        end if
+9                   continue
+                else
+                    if (nels .gt. 0  .and. err .ne. NF_ECHAR)
+     +                  call errore('wrong type: ', err)
+                end if
+5           continue
+1       continue
+        err = nf_close(ncid)
+        if (err .ne. 0)
+     +      call errorc('nf_close: ', nf_strerror(err))
+        call print_nok(nok)
+        end
+
+#ifdef NF_INT1_T
+        subroutine test_nf_get_vara_int1()
+        use tests
+        implicit        none
+        integer ncid
+        integer d
+        integer i
+        integer j
+        integer k
+        integer err
+        logical allInExtRange   
+        logical allInIntRange   
+        integer nels
+        integer nslabs
+        integer nok      
+        integer start(MAX_RANK)
+        integer edge(MAX_RANK)
+        integer index(MAX_RANK)
+        integer mid(MAX_RANK)
+        logical canConvert     
+        NF_INT1_T    value(MAX_NELS)
+        doubleprecision expect(MAX_NELS)
+        doubleprecision val
+        integer udshift
+
+        nok = 0
+
+        err = nf_open(testfile, NF_NOWRITE, ncid)
+        if (err .ne. 0)
+     +      call errore('nf_open: ', err)
+        do 1, i = 1, NVARS
+            canConvert = (var_type(i) .eq. NF_CHAR) .eqv. 
+     +                   (NFT_INT1 .eq. NFT_TEXT)
+            if (.not.(var_rank(i) .le. MAX_RANK)) stop 2
+            if (.not.(var_nels(i) .le. MAX_NELS)) stop 2
+            do 2, j = 1, var_rank(i)
+                start(j) = 1
+                edge(j) = 1
+2           continue
+            err = nf_get_vara_int1(BAD_ID, i, start,
+     +                  edge, value)
+            if (err .ne. NF_EBADID)
+     +          call errore('bad ncid: ', err)
+            err = nf_get_vara_int1(ncid, BAD_VARID, start, 
+     +                           edge, value)
+            if (err .ne. NF_ENOTVAR)
+     +          call errore('bad var id: ', err)
+            do 3, j = 1, var_rank(i)
+                start(j) = var_shape(j,i) + 1
+                err = nf_get_vara_int1(ncid, i, start,
+     +                               edge, value)
+                if (canConvert .and. err .ne. NF_EINVALCOORDS)
+     +              call errore('bad index: ', err)
+                start(j) = 1
+                edge(j) = var_shape(j,i) + 1
+                err = nf_get_vara_int1(ncid, i, start,
+     +                               edge, value)
+                if (canConvert .and. err .ne. NF_EEDGE)
+     +              call errore('bad edge: ', err)
+                edge(j) = 1
+3           continue
+
+C           /* Check non-scalars for correct error returned even when */
+C           /* there is nothing to get (edge(j).eq.0) */
+            if (var_rank(i) .gt. 0) then
+                do 10, j = 1, var_rank(i)
+                    edge(j) = 0
+10              continue
+                err = nf_get_vara_int1(BAD_ID, i, start,
+     +                  edge, value)
+                if (err .ne. NF_EBADID) 
+     +              call errore('bad ncid: ', err)
+                err = nf_get_vara_int1(ncid, BAD_VARID,
+     +                  start, edge, value)
+                if (err .ne. NF_ENOTVAR) 
+     +              call errore('bad var id: ', err)
+                do 11, j = 1, var_rank(i)
+                    if (var_dimid(j,i) .gt. 1) then     !/* skip record dim */
+                        start(j) = var_shape(j,i) + 1
+                        err = nf_get_vara_int1(ncid, i,
+     +                          start, edge, value)
+                        if (canConvert .and. err .ne. NF_EINVALCOORDS)
+     +                      call errore('bad start: ', err)
+                        start(j) = 1
+                    endif
+11              continue
+                err = nf_get_vara_int1(ncid, i, start,
+     +                          edge, value)
+                if (canConvert) then
+                    if (err .ne. 0) 
+     +                  call error(nf_strerror(err))
+                else
+                    if (err .ne. NF_ECHAR)
+     +                  call errore('wrong type: ', err)
+                endif
+                do 12, j = 1, var_rank(i)
+                    edge(j) = 1
+12              continue
+            endif
+
+C           Choose a random point dividing each dim into 2 parts
+C           get 2^rank (nslabs) slabs so defined
+            nslabs = 1
+            do 4, j = 1, var_rank(i)
+                mid(j) = roll( var_shape(j,i) )
+                nslabs = nslabs * 2
+4           continue
+C           bits of k determine whether to get lower or upper part of dim 
+            do 5, k = 1, nslabs
+                nels = 1
+                do 6, j = 1, var_rank(i)
+                    if (mod(udshift((k-1), -(j-1)), 2) .eq. 1) then
+                        start(j) = 1
+                        edge(j) = mid(j)
+                    else
+                        start(j) = 1 + mid(j)
+                        edge(j) = var_shape(j,i) - mid(j)
+                    end if
+                    nels = nels * edge(j)
+6               continue
+                allInIntRange = .true.
+                allInExtRange = .true.
+                do 7, j = 1, nels
+                    err = index2indexes(j, var_rank(i), edge, index)
+                    if (err .ne. 0)
+     +                  call error('error in index2indexes 1')
+                    do 8, d = 1, var_rank(i)
+                        index(d) = index(d) + start(d) - 1
+8                   continue
+                    expect(j) = hash4(var_type(i), var_rank(i), index, 
+     +                                NFT_INT1)
+                    if (inRange3(expect(j),var_type(i), 
+     +                           NFT_INT1)) then
+                        allInIntRange = 
+     +                      allInIntRange .and.
+     +                      in_internal_range(NFT_INT1, expect(j))
+                    else
+                        allInExtRange = .false.
+                    end if
+7               continue
+                err = nf_get_vara_int1(ncid, i, start,
+     +                          edge, value)
+                if (canConvert) then
+                    if (allInExtRange) then
+                        if (allInIntRange) then
+                            if (err .ne. 0)
+     +                          call errore('nf_get_vara_int1:', err)
+                        else
+                            if (err .ne. NF_ERANGE)
+     +                          call errore('Range error: ', err)
+                        end if
+                    else
+                        if (err .ne. 0 .and. err .ne. NF_ERANGE)
+     +                      call errore('OK or Range error: ', err)
+                    end if
+                    do 9, j = 1, nels
+                        if (inRange3(expect(j),var_type(i),
+     +                               NFT_INT1) .and.
+     +                      in_internal_range(NFT_INT1, expect(j)))
+     +                          then
+                            val = value(j)
+                            if (.not.equal(val,expect(j),
+     +                                     var_type(i),NFT_INT1)) 
+     +                              then
+                                call error(
+     +                              'value read not that expected')
+                                if (verbose) then
+                                    call error(' ')
+                                    call errori('varid: ', i)
+                                    call errorc('var_name: ',
+     +                                  var_name(i))
+                                    call errori('element number: %d ', 
+     +                                          j)
+                                    call errord('expect: ', expect(j))
+                                    call errord('got: ', val)
+                                end if
+                            else
+                                nok = nok + 1
+                            end if
+                        end if
+9                   continue
+                else
+                    if (nels .gt. 0  .and. err .ne. NF_ECHAR)
+     +                  call errore('wrong type: ', err)
+                end if
+5           continue
+1       continue
+        err = nf_close(ncid)
+        if (err .ne. 0)
+     +      call errorc('nf_close: ', nf_strerror(err))
+        call print_nok(nok)
+        end
+
+#endif
+#ifdef NF_INT2_T
+        subroutine test_nf_get_vara_int2()
+        use tests
+        implicit        none
+        integer ncid
+        integer d
+        integer i
+        integer j
+        integer k
+        integer err
+        logical allInExtRange   
+        logical allInIntRange   
+        integer nels
+        integer nslabs
+        integer nok      
+        integer start(MAX_RANK)
+        integer edge(MAX_RANK)
+        integer index(MAX_RANK)
+        integer mid(MAX_RANK)
+        logical canConvert     
+        NF_INT2_T    value(MAX_NELS)
+        doubleprecision expect(MAX_NELS)
+        doubleprecision val
+        integer udshift
+
+        nok = 0
+
+        err = nf_open(testfile, NF_NOWRITE, ncid)
+        if (err .ne. 0)
+     +      call errore('nf_open: ', err)
+        do 1, i = 1, NVARS
+            canConvert = (var_type(i) .eq. NF_CHAR) .eqv. 
+     +                   (NFT_INT2 .eq. NFT_TEXT)
+            if (.not.(var_rank(i) .le. MAX_RANK)) stop 2
+            if (.not.(var_nels(i) .le. MAX_NELS)) stop 2
+            do 2, j = 1, var_rank(i)
+                start(j) = 1
+                edge(j) = 1
+2           continue
+            err = nf_get_vara_int2(BAD_ID, i, start,
+     +                  edge, value)
+            if (err .ne. NF_EBADID)
+     +          call errore('bad ncid: ', err)
+            err = nf_get_vara_int2(ncid, BAD_VARID, start, 
+     +                           edge, value)
+            if (err .ne. NF_ENOTVAR)
+     +          call errore('bad var id: ', err)
+            do 3, j = 1, var_rank(i)
+                start(j) = var_shape(j,i) + 1
+                err = nf_get_vara_int2(ncid, i, start,
+     +                               edge, value)
+                if (canConvert .and. err .ne. NF_EINVALCOORDS)
+     +              call errore('bad index: ', err)
+                start(j) = 1
+                edge(j) = var_shape(j,i) + 1
+                err = nf_get_vara_int2(ncid, i, start,
+     +                               edge, value)
+                if (canConvert .and. err .ne. NF_EEDGE)
+     +              call errore('bad edge: ', err)
+                edge(j) = 1
+3           continue
+
+C           /* Check non-scalars for correct error returned even when */
+C           /* there is nothing to get (edge(j).eq.0) */
+            if (var_rank(i) .gt. 0) then
+                do 10, j = 1, var_rank(i)
+                    edge(j) = 0
+10              continue
+                err = nf_get_vara_int2(BAD_ID, i, start,
+     +                  edge, value)
+                if (err .ne. NF_EBADID) 
+     +              call errore('bad ncid: ', err)
+                err = nf_get_vara_int2(ncid, BAD_VARID,
+     +                  start, edge, value)
+                if (err .ne. NF_ENOTVAR) 
+     +              call errore('bad var id: ', err)
+                do 11, j = 1, var_rank(i)
+                    if (var_dimid(j,i) .gt. 1) then     !/* skip record dim */
+                        start(j) = var_shape(j,i) + 1
+                        err = nf_get_vara_int2(ncid, i,
+     +                          start, edge, value)
+                        if (canConvert .and. err .ne. NF_EINVALCOORDS)
+     +                      call errore('bad start: ', err)
+                        start(j) = 1
+                    endif
+11              continue
+                err = nf_get_vara_int2(ncid, i, start,
+     +                          edge, value)
+                if (canConvert) then
+                    if (err .ne. 0) 
+     +                  call error(nf_strerror(err))
+                else
+                    if (err .ne. NF_ECHAR)
+     +                  call errore('wrong type: ', err)
+                endif
+                do 12, j = 1, var_rank(i)
+                    edge(j) = 1
+12              continue
+            endif
+
+C           Choose a random point dividing each dim into 2 parts
+C           get 2^rank (nslabs) slabs so defined
+            nslabs = 1
+            do 4, j = 1, var_rank(i)
+                mid(j) = roll( var_shape(j,i) )
+                nslabs = nslabs * 2
+4           continue
+C           bits of k determine whether to get lower or upper part of dim 
+            do 5, k = 1, nslabs
+                nels = 1
+                do 6, j = 1, var_rank(i)
+                    if (mod(udshift((k-1), -(j-1)), 2) .eq. 1) then
+                        start(j) = 1
+                        edge(j) = mid(j)
+                    else
+                        start(j) = 1 + mid(j)
+                        edge(j) = var_shape(j,i) - mid(j)
+                    end if
+                    nels = nels * edge(j)
+6               continue
+                allInIntRange = .true.
+                allInExtRange = .true.
+                do 7, j = 1, nels
+                    err = index2indexes(j, var_rank(i), edge, index)
+                    if (err .ne. 0)
+     +                  call error('error in index2indexes 1')
+                    do 8, d = 1, var_rank(i)
+                        index(d) = index(d) + start(d) - 1
+8                   continue
+                    expect(j) = hash4(var_type(i), var_rank(i), index, 
+     +                                NFT_INT2)
+                    if (inRange3(expect(j),var_type(i), 
+     +                           NFT_INT2)) then
+                        allInIntRange = 
+     +                      allInIntRange .and.
+     +                      in_internal_range(NFT_INT2, expect(j))
+                    else
+                        allInExtRange = .false.
+                    end if
+7               continue
+                err = nf_get_vara_int2(ncid, i, start,
+     +                          edge, value)
+                if (canConvert) then
+                    if (allInExtRange) then
+                        if (allInIntRange) then
+                            if (err .ne. 0)
+     +                          call errore('nf_get_vara_int2:', err)
+                        else
+                            if (err .ne. NF_ERANGE)
+     +                          call errore('Range error: ', err)
+                        end if
+                    else
+                        if (err .ne. 0 .and. err .ne. NF_ERANGE)
+     +                      call errore('OK or Range error: ', err)
+                    end if
+                    do 9, j = 1, nels
+                        if (inRange3(expect(j),var_type(i),
+     +                               NFT_INT2) .and.
+     +                      in_internal_range(NFT_INT2, expect(j)))
+     +                          then
+                            val = value(j)
+                            if (.not.equal(val,expect(j),
+     +                                     var_type(i),NFT_INT2)) 
+     +                              then
+                                call error(
+     +                              'value read not that expected')
+                                if (verbose) then
+                                    call error(' ')
+                                    call errori('varid: ', i)
+                                    call errorc('var_name: ',
+     +                                  var_name(i))
+                                    call errori('element number: %d ', 
+     +                                          j)
+                                    call errord('expect: ', expect(j))
+                                    call errord('got: ', val)
+                                end if
+                            else
+                                nok = nok + 1
+                            end if
+                        end if
+9                   continue
+                else
+                    if (nels .gt. 0  .and. err .ne. NF_ECHAR)
+     +                  call errore('wrong type: ', err)
+                end if
+5           continue
+1       continue
+        err = nf_close(ncid)
+        if (err .ne. 0)
+     +      call errorc('nf_close: ', nf_strerror(err))
+        call print_nok(nok)
+        end
+
+#endif
+        subroutine test_nf_get_vara_int()
+        use tests
+        implicit        none
+        integer ncid
+        integer d
+        integer i
+        integer j
+        integer k
+        integer err
+        logical allInExtRange   
+        logical allInIntRange   
+        integer nels
+        integer nslabs
+        integer nok      
+        integer start(MAX_RANK)
+        integer edge(MAX_RANK)
+        integer index(MAX_RANK)
+        integer mid(MAX_RANK)
+        logical canConvert     
+        integer    value(MAX_NELS)
+        doubleprecision expect(MAX_NELS)
+        doubleprecision val
+        integer udshift
+
+        nok = 0
+
+        err = nf_open(testfile, NF_NOWRITE, ncid)
+        if (err .ne. 0)
+     +      call errore('nf_open: ', err)
+        do 1, i = 1, NVARS
+            canConvert = (var_type(i) .eq. NF_CHAR) .eqv. 
+     +                   (NFT_INT .eq. NFT_TEXT)
+            if (.not.(var_rank(i) .le. MAX_RANK)) stop 2
+            if (.not.(var_nels(i) .le. MAX_NELS)) stop 2
+            do 2, j = 1, var_rank(i)
+                start(j) = 1
+                edge(j) = 1
+2           continue
+            err = nf_get_vara_int(BAD_ID, i, start,
+     +                  edge, value)
+            if (err .ne. NF_EBADID)
+     +          call errore('bad ncid: ', err)
+            err = nf_get_vara_int(ncid, BAD_VARID, start, 
+     +                           edge, value)
+            if (err .ne. NF_ENOTVAR)
+     +          call errore('bad var id: ', err)
+            do 3, j = 1, var_rank(i)
+                start(j) = var_shape(j,i) + 1
+                err = nf_get_vara_int(ncid, i, start,
+     +                               edge, value)
+                if (canConvert .and. err .ne. NF_EINVALCOORDS)
+     +              call errore('bad index: ', err)
+                start(j) = 1
+                edge(j) = var_shape(j,i) + 1
+                err = nf_get_vara_int(ncid, i, start,
+     +                               edge, value)
+                if (canConvert .and. err .ne. NF_EEDGE)
+     +              call errore('bad edge: ', err)
+                edge(j) = 1
+3           continue
+
+C           /* Check non-scalars for correct error returned even when */
+C           /* there is nothing to get (edge(j).eq.0) */
+            if (var_rank(i) .gt. 0) then
+                do 10, j = 1, var_rank(i)
+                    edge(j) = 0
+10              continue
+                err = nf_get_vara_int(BAD_ID, i, start,
+     +                  edge, value)
+                if (err .ne. NF_EBADID) 
+     +              call errore('bad ncid: ', err)
+                err = nf_get_vara_int(ncid, BAD_VARID,
+     +                  start, edge, value)
+                if (err .ne. NF_ENOTVAR) 
+     +              call errore('bad var id: ', err)
+                do 11, j = 1, var_rank(i)
+                    if (var_dimid(j,i) .gt. 1) then     !/* skip record dim */
+                        start(j) = var_shape(j,i) + 1
+                        err = nf_get_vara_int(ncid, i,
+     +                          start, edge, value)
+                        if (canConvert .and. err .ne. NF_EINVALCOORDS)
+     +                      call errore('bad start: ', err)
+                        start(j) = 1
+                    endif
+11              continue
+                err = nf_get_vara_int(ncid, i, start,
+     +                          edge, value)
+                if (canConvert) then
+                    if (err .ne. 0) 
+     +                  call error(nf_strerror(err))
+                else
+                    if (err .ne. NF_ECHAR)
+     +                  call errore('wrong type: ', err)
+                endif
+                do 12, j = 1, var_rank(i)
+                    edge(j) = 1
+12              continue
+            endif
+
+C           Choose a random point dividing each dim into 2 parts
+C           get 2^rank (nslabs) slabs so defined
+            nslabs = 1
+            do 4, j = 1, var_rank(i)
+                mid(j) = roll( var_shape(j,i) )
+                nslabs = nslabs * 2
+4           continue
+C           bits of k determine whether to get lower or upper part of dim 
+            do 5, k = 1, nslabs
+                nels = 1
+                do 6, j = 1, var_rank(i)
+                    if (mod(udshift((k-1), -(j-1)), 2) .eq. 1) then
+                        start(j) = 1
+                        edge(j) = mid(j)
+                    else
+                        start(j) = 1 + mid(j)
+                        edge(j) = var_shape(j,i) - mid(j)
+                    end if
+                    nels = nels * edge(j)
+6               continue
+                allInIntRange = .true.
+                allInExtRange = .true.
+                do 7, j = 1, nels
+                    err = index2indexes(j, var_rank(i), edge, index)
+                    if (err .ne. 0)
+     +                  call error('error in index2indexes 1')
+                    do 8, d = 1, var_rank(i)
+                        index(d) = index(d) + start(d) - 1
+8                   continue
+                    expect(j) = hash4(var_type(i), var_rank(i), index, 
+     +                                NFT_INT)
+                    if (inRange3(expect(j),var_type(i), 
+     +                           NFT_INT)) then
+                        allInIntRange = 
+     +                      allInIntRange .and.
+     +                      in_internal_range(NFT_INT, expect(j))
+                    else
+                        allInExtRange = .false.
+                    end if
+7               continue
+                err = nf_get_vara_int(ncid, i, start,
+     +                          edge, value)
+                if (canConvert) then
+                    if (allInExtRange) then
+                        if (allInIntRange) then
+                            if (err .ne. 0)
+     +                          call errore('nf_get_vara_int:', err)
+                        else
+                            if (err .ne. NF_ERANGE)
+     +                          call errore('Range error: ', err)
+                        end if
+                    else
+                        if (err .ne. 0 .and. err .ne. NF_ERANGE)
+     +                      call errore('OK or Range error: ', err)
+                    end if
+                    do 9, j = 1, nels
+                        if (inRange3(expect(j),var_type(i),
+     +                               NFT_INT) .and.
+     +                      in_internal_range(NFT_INT, expect(j)))
+     +                          then
+                            val = value(j)
+                            if (.not.equal(val,expect(j),
+     +                                     var_type(i),NFT_INT)) 
+     +                              then
+                                call error(
+     +                              'value read not that expected')
+                                if (verbose) then
+                                    call error(' ')
+                                    call errori('varid: ', i)
+                                    call errorc('var_name: ',
+     +                                  var_name(i))
+                                    call errori('element number: %d ', 
+     +                                          j)
+                                    call errord('expect: ', expect(j))
+                                    call errord('got: ', val)
+                                end if
+                            else
+                                nok = nok + 1
+                            end if
+                        end if
+9                   continue
+                else
+                    if (nels .gt. 0  .and. err .ne. NF_ECHAR)
+     +                  call errore('wrong type: ', err)
+                end if
+5           continue
+1       continue
+        err = nf_close(ncid)
+        if (err .ne. 0)
+     +      call errorc('nf_close: ', nf_strerror(err))
+        call print_nok(nok)
+        end
+
+        subroutine test_nf_get_vara_real()
+        use tests
+        implicit        none
+        integer ncid
+        integer d
+        integer i
+        integer j
+        integer k
+        integer err
+        logical allInExtRange   
+        logical allInIntRange   
+        integer nels
+        integer nslabs
+        integer nok      
+        integer start(MAX_RANK)
+        integer edge(MAX_RANK)
+        integer index(MAX_RANK)
+        integer mid(MAX_RANK)
+        logical canConvert     
+        real    value(MAX_NELS)
+        doubleprecision expect(MAX_NELS)
+        doubleprecision val
+        integer udshift
+
+        nok = 0
+
+        err = nf_open(testfile, NF_NOWRITE, ncid)
+        if (err .ne. 0)
+     +      call errore('nf_open: ', err)
+        do 1, i = 1, NVARS
+            canConvert = (var_type(i) .eq. NF_CHAR) .eqv. 
+     +                   (NFT_REAL .eq. NFT_TEXT)
+            if (.not.(var_rank(i) .le. MAX_RANK)) stop 2
+            if (.not.(var_nels(i) .le. MAX_NELS)) stop 2
+            do 2, j = 1, var_rank(i)
+                start(j) = 1
+                edge(j) = 1
+2           continue
+            err = nf_get_vara_real(BAD_ID, i, start,
+     +                  edge, value)
+            if (err .ne. NF_EBADID)
+     +          call errore('bad ncid: ', err)
+            err = nf_get_vara_real(ncid, BAD_VARID, start, 
+     +                           edge, value)
+            if (err .ne. NF_ENOTVAR)
+     +          call errore('bad var id: ', err)
+            do 3, j = 1, var_rank(i)
+                start(j) = var_shape(j,i) + 1
+                err = nf_get_vara_real(ncid, i, start,
+     +                               edge, value)
+                if (canConvert .and. err .ne. NF_EINVALCOORDS)
+     +              call errore('bad index: ', err)
+                start(j) = 1
+                edge(j) = var_shape(j,i) + 1
+                err = nf_get_vara_real(ncid, i, start,
+     +                               edge, value)
+                if (canConvert .and. err .ne. NF_EEDGE)
+     +              call errore('bad edge: ', err)
+                edge(j) = 1
+3           continue
+
+C           /* Check non-scalars for correct error returned even when */
+C           /* there is nothing to get (edge(j).eq.0) */
+            if (var_rank(i) .gt. 0) then
+                do 10, j = 1, var_rank(i)
+                    edge(j) = 0
+10              continue
+                err = nf_get_vara_real(BAD_ID, i, start,
+     +                  edge, value)
+                if (err .ne. NF_EBADID) 
+     +              call errore('bad ncid: ', err)
+                err = nf_get_vara_real(ncid, BAD_VARID,
+     +                  start, edge, value)
+                if (err .ne. NF_ENOTVAR) 
+     +              call errore('bad var id: ', err)
+                do 11, j = 1, var_rank(i)
+                    if (var_dimid(j,i) .gt. 1) then     !/* skip record dim */
+                        start(j) = var_shape(j,i) + 1
+                        err = nf_get_vara_real(ncid, i,
+     +                          start, edge, value)
+                        if (canConvert .and. err .ne. NF_EINVALCOORDS)
+     +                      call errore('bad start: ', err)
+                        start(j) = 1
+                    endif
+11              continue
+                err = nf_get_vara_real(ncid, i, start,
+     +                          edge, value)
+                if (canConvert) then
+                    if (err .ne. 0) 
+     +                  call error(nf_strerror(err))
+                else
+                    if (err .ne. NF_ECHAR)
+     +                  call errore('wrong type: ', err)
+                endif
+                do 12, j = 1, var_rank(i)
+                    edge(j) = 1
+12              continue
+            endif
+
+C           Choose a random point dividing each dim into 2 parts
+C           get 2^rank (nslabs) slabs so defined
+            nslabs = 1
+            do 4, j = 1, var_rank(i)
+                mid(j) = roll( var_shape(j,i) )
+                nslabs = nslabs * 2
+4           continue
+C           bits of k determine whether to get lower or upper part of dim 
+            do 5, k = 1, nslabs
+                nels = 1
+                do 6, j = 1, var_rank(i)
+                    if (mod(udshift((k-1), -(j-1)), 2) .eq. 1) then
+                        start(j) = 1
+                        edge(j) = mid(j)
+                    else
+                        start(j) = 1 + mid(j)
+                        edge(j) = var_shape(j,i) - mid(j)
+                    end if
+                    nels = nels * edge(j)
+6               continue
+                allInIntRange = .true.
+                allInExtRange = .true.
+                do 7, j = 1, nels
+                    err = index2indexes(j, var_rank(i), edge, index)
+                    if (err .ne. 0)
+     +                  call error('error in index2indexes 1')
+                    do 8, d = 1, var_rank(i)
+                        index(d) = index(d) + start(d) - 1
+8                   continue
+                    expect(j) = hash4(var_type(i), var_rank(i), index, 
+     +                                NFT_REAL)
+                    if (inRange3(expect(j),var_type(i), 
+     +                           NFT_REAL)) then
+                        allInIntRange = 
+     +                      allInIntRange .and.
+     +                      in_internal_range(NFT_REAL, expect(j))
+                    else
+                        allInExtRange = .false.
+                    end if
+7               continue
+                err = nf_get_vara_real(ncid, i, start,
+     +                          edge, value)
+                if (canConvert) then
+                    if (allInExtRange) then
+                        if (allInIntRange) then
+                            if (err .ne. 0)
+     +                          call errore('nf_get_vara_real:', err)
+                        else
+                            if (err .ne. NF_ERANGE)
+     +                          call errore('Range error: ', err)
+                        end if
+                    else
+                        if (err .ne. 0 .and. err .ne. NF_ERANGE)
+     +                      call errore('OK or Range error: ', err)
+                    end if
+                    do 9, j = 1, nels
+                        if (inRange3(expect(j),var_type(i),
+     +                               NFT_REAL) .and.
+     +                      in_internal_range(NFT_REAL, expect(j)))
+     +                          then
+                            val = value(j)
+                            if (.not.equal(val,expect(j),
+     +                                     var_type(i),NFT_REAL)) 
+     +                              then
+                                call error(
+     +                              'value read not that expected')
+                                if (verbose) then
+                                    call error(' ')
+                                    call errori('varid: ', i)
+                                    call errorc('var_name: ',
+     +                                  var_name(i))
+                                    call errori('element number: %d ', 
+     +                                          j)
+                                    call errord('expect: ', expect(j))
+                                    call errord('got: ', val)
+                                end if
+                            else
+                                nok = nok + 1
+                            end if
+                        end if
+9                   continue
+                else
+                    if (nels .gt. 0  .and. err .ne. NF_ECHAR)
+     +                  call errore('wrong type: ', err)
+                end if
+5           continue
+1       continue
+        err = nf_close(ncid)
+        if (err .ne. 0)
+     +      call errorc('nf_close: ', nf_strerror(err))
+        call print_nok(nok)
+        end
+
+        subroutine test_nf_get_vara_double()
+        use tests
+        implicit        none
+        integer ncid
+        integer d
+        integer i
+        integer j
+        integer k
+        integer err
+        logical allInExtRange   
+        logical allInIntRange   
+        integer nels
+        integer nslabs
+        integer nok      
+        integer start(MAX_RANK)
+        integer edge(MAX_RANK)
+        integer index(MAX_RANK)
+        integer mid(MAX_RANK)
+        logical canConvert     
+        doubleprecision    value(MAX_NELS)
+        doubleprecision expect(MAX_NELS)
+        doubleprecision val
+        integer udshift
+
+        nok = 0
+
+        err = nf_open(testfile, NF_NOWRITE, ncid)
+        if (err .ne. 0)
+     +      call errore('nf_open: ', err)
+        do 1, i = 1, NVARS
+            canConvert = (var_type(i) .eq. NF_CHAR) .eqv. 
+     +                   (NFT_DOUBLE .eq. NFT_TEXT)
+            if (.not.(var_rank(i) .le. MAX_RANK)) stop 2
+            if (.not.(var_nels(i) .le. MAX_NELS)) stop 2
+            do 2, j = 1, var_rank(i)
+                start(j) = 1
+                edge(j) = 1
+2           continue
+            err = nf_get_vara_double(BAD_ID, i, start,
+     +                  edge, value)
+            if (err .ne. NF_EBADID)
+     +          call errore('bad ncid: ', err)
+            err = nf_get_vara_double(ncid, BAD_VARID, start, 
+     +                           edge, value)
+            if (err .ne. NF_ENOTVAR)
+     +          call errore('bad var id: ', err)
+            do 3, j = 1, var_rank(i)
+                start(j) = var_shape(j,i) + 1
+                err = nf_get_vara_double(ncid, i, start,
+     +                               edge, value)
+                if (canConvert .and. err .ne. NF_EINVALCOORDS)
+     +              call errore('bad index: ', err)
+                start(j) = 1
+                edge(j) = var_shape(j,i) + 1
+                err = nf_get_vara_double(ncid, i, start,
+     +                               edge, value)
+                if (canConvert .and. err .ne. NF_EEDGE)
+     +              call errore('bad edge: ', err)
+                edge(j) = 1
+3           continue
+
+C           /* Check non-scalars for correct error returned even when */
+C           /* there is nothing to get (edge(j).eq.0) */
+            if (var_rank(i) .gt. 0) then
+                do 10, j = 1, var_rank(i)
+                    edge(j) = 0
+10              continue
+                err = nf_get_vara_double(BAD_ID, i, start,
+     +                  edge, value)
+                if (err .ne. NF_EBADID) 
+     +              call errore('bad ncid: ', err)
+                err = nf_get_vara_double(ncid, BAD_VARID,
+     +                  start, edge, value)
+                if (err .ne. NF_ENOTVAR) 
+     +              call errore('bad var id: ', err)
+                do 11, j = 1, var_rank(i)
+                    if (var_dimid(j,i) .gt. 1) then     !/* skip record dim */
+                        start(j) = var_shape(j,i) + 1
+                        err = nf_get_vara_double(ncid, i,
+     +                          start, edge, value)
+                        if (canConvert .and. err .ne. NF_EINVALCOORDS)
+     +                      call errore('bad start: ', err)
+                        start(j) = 1
+                    endif
+11              continue
+                err = nf_get_vara_double(ncid, i, start,
+     +                          edge, value)
+                if (canConvert) then
+                    if (err .ne. 0) 
+     +                  call error(nf_strerror(err))
+                else
+                    if (err .ne. NF_ECHAR)
+     +                  call errore('wrong type: ', err)
+                endif
+                do 12, j = 1, var_rank(i)
+                    edge(j) = 1
+12              continue
+            endif
+
+C           Choose a random point dividing each dim into 2 parts
+C           get 2^rank (nslabs) slabs so defined
+            nslabs = 1
+            do 4, j = 1, var_rank(i)
+                mid(j) = roll( var_shape(j,i) )
+                nslabs = nslabs * 2
+4           continue
+C           bits of k determine whether to get lower or upper part of dim 
+            do 5, k = 1, nslabs
+                nels = 1
+                do 6, j = 1, var_rank(i)
+                    if (mod(udshift((k-1), -(j-1)), 2) .eq. 1) then
+                        start(j) = 1
+                        edge(j) = mid(j)
+                    else
+                        start(j) = 1 + mid(j)
+                        edge(j) = var_shape(j,i) - mid(j)
+                    end if
+                    nels = nels * edge(j)
+6               continue
+                allInIntRange = .true.
+                allInExtRange = .true.
+                do 7, j = 1, nels
+                    err = index2indexes(j, var_rank(i), edge, index)
+                    if (err .ne. 0)
+     +                  call error('error in index2indexes 1')
+                    do 8, d = 1, var_rank(i)
+                        index(d) = index(d) + start(d) - 1
+8                   continue
+                    expect(j) = hash4(var_type(i), var_rank(i), index, 
+     +                                NFT_DOUBLE)
+                    if (inRange3(expect(j),var_type(i), 
+     +                           NFT_DOUBLE)) then
+                        allInIntRange = 
+     +                      allInIntRange .and.
+     +                      in_internal_range(NFT_DOUBLE, expect(j))
+                    else
+                        allInExtRange = .false.
+                    end if
+7               continue
+                err = nf_get_vara_double(ncid, i, start,
+     +                          edge, value)
+                if (canConvert) then
+                    if (allInExtRange) then
+                        if (allInIntRange) then
+                            if (err .ne. 0)
+     +                          call errore('nf_get_vara_double:', err)
+                        else
+                            if (err .ne. NF_ERANGE)
+     +                          call errore('Range error: ', err)
+                        end if
+                    else
+                        if (err .ne. 0 .and. err .ne. NF_ERANGE)
+     +                      call errore('OK or Range error: ', err)
+                    end if
+                    do 9, j = 1, nels
+                        if (inRange3(expect(j),var_type(i),
+     +                               NFT_DOUBLE) .and.
+     +                      in_internal_range(NFT_DOUBLE, expect(j)))
+     +                          then
+                            val = value(j)
+                            if (.not.equal(val,expect(j),
+     +                                     var_type(i),NFT_DOUBLE)) 
+     +                              then
+                                call error(
+     +                              'value read not that expected')
+                                if (verbose) then
+                                    call error(' ')
+                                    call errori('varid: ', i)
+                                    call errorc('var_name: ',
+     +                                  var_name(i))
+                                    call errori('element number: %d ', 
+     +                                          j)
+                                    call errord('expect: ', expect(j))
+                                    call errord('got: ', val)
+                                end if
+                            else
+                                nok = nok + 1
+                            end if
+                        end if
+9                   continue
+                else
+                    if (nels .gt. 0  .and. err .ne. NF_ECHAR)
+     +                  call errore('wrong type: ', err)
+                end if
+5           continue
+1       continue
+        err = nf_close(ncid)
+        if (err .ne. 0)
+     +      call errorc('nf_close: ', nf_strerror(err))
+        call print_nok(nok)
+        end
+
+
+        subroutine test_nf_get_vars_text()
+        use tests
+        implicit        none
+        integer ncid
+        integer d
+        integer i
+        integer j
+        integer k
+        integer m
+        integer err
+        logical allInExtRange   
+        logical allInIntRange   
+        integer nels
+        integer nslabs
+        integer nstarts         
+        integer nok             
+        integer start(MAX_RANK)
+        integer edge(MAX_RANK)
+        integer index(MAX_RANK)
+        integer index2(MAX_RANK)
+        integer mid(MAX_RANK)
+        integer count(MAX_RANK)
+        integer sstride(MAX_RANK)
+        integer stride(MAX_RANK)
+        logical canConvert     
+        character    value(MAX_NELS)
+        doubleprecision expect(MAX_NELS)
+        doubleprecision val
+        integer udshift
+
+        nok = 0
+
+        err = nf_open(testfile, NF_NOWRITE, ncid)
+        if (err .ne. 0)
+     +      call errore('nf_open: ', err)
+        do 1, i = 1, NVARS
+            canConvert = (var_type(i) .eq. NF_CHAR) .eqv. 
+     +                   (NFT_TEXT .eq. NFT_TEXT)
+            if (.not.(var_rank(i) .le. MAX_RANK)) stop 2
+            if (.not.(var_nels(i) .le. MAX_NELS)) stop 2
+            do 2, j = 1, var_rank(i)
+                start(j) = 1
+                edge(j) = 1
+                stride(j) = 1
+2           continue
+            err = nf_get_vars_text(BAD_ID, i, start,
+     +                  edge, stride, value)
+            if (err .ne. NF_EBADID)
+     +          call errore('bad ncid: ', err)
+            err = nf_get_vars_text(ncid, BAD_VARID,
+     +                  start, edge, stride, 
+     +                           value)
+            if (err .ne. NF_ENOTVAR)
+     +          call errore('bad var id: ', err)
+            do 3, j = 1, var_rank(i)
+                start(j) = var_shape(j,i) + 1
+                err = nf_get_vars_text(ncid, i, start,
+     +                               edge, stride, 
+     +                               value)
+                if (.not. canConvert) then
+                    if (err .ne. NF_ECHAR)
+     +                  call errore('conversion: ', err)
+                else
+                    if (err .ne. NF_EINVALCOORDS)
+     +                  call errore('bad index: ', err)
+                endif
+                start(j) = 1
+                edge(j) = var_shape(j,i) + 1
+                err = nf_get_vars_text(ncid, i, start,
+     +                               edge, stride, 
+     +                               value)
+                if (.not. canConvert) then
+                    if (err .ne. NF_ECHAR)
+     +                  call errore('conversion: ', err)
+                else
+                    if (err .ne. NF_EEDGE)
+     +                  call errore('bad edge: ', err)
+                endif
+                edge(j) = 1
+                stride(j) = 0
+                err = nf_get_vars_text(ncid, i, start,
+     +                               edge, stride, 
+     +                               value)
+                if (.not. canConvert) then
+                    if (err .ne. NF_ECHAR)
+     +                  call errore('conversion: ', err)
+                else
+                    if (err .ne. NF_ESTRIDE)
+     +                  call errore('bad stride: ', err)
+                endif
+                stride(j) = 1
+3           continue
+C               Choose a random point dividing each dim into 2 parts
+C               get 2^rank (nslabs) slabs so defined
+            nslabs = 1
+            do 4, j = 1, var_rank(i)
+                mid(j) = roll( var_shape(j,i) )
+                nslabs = nslabs * 2
+4           continue
+C               bits of k determine whether to get lower or upper part of dim
+C               choose random stride from 1 to edge
+            do 5, k = 1, nslabs
+                nstarts = 1
+                do 6, j = 1, var_rank(i)
+                    if (mod(udshift(k-1, j-1), 2) .eq. 1) then
+                        start(j) = 1
+                        edge(j) = mid(j)
+                    else
+                        start(j) = 1 + mid(j)
+                        edge(j) = var_shape(j,i) - mid(j)
+                    end if
+                    if (edge(j) .gt. 0) then
+                        sstride(j) = 1 + roll(edge(j))
+                    else
+                        sstride(j) = 1
+                    end if
+                    nstarts = nstarts * stride(j)
+6               continue
+                do 7, m = 1, nstarts
+                    err = index2indexes(m, var_rank(i), sstride, 
+     +                                  index)
+                    if (err .ne. 0)
+     +                  call error('error in index2indexes')
+                    nels = 1
+                    do 8, j = 1, var_rank(i)
+                        count(j) = 1 + (edge(j) - index(j)) / 
+     +                                  stride(j)
+                        nels = nels * count(j)
+                        index(j) = index(j) + start(j) - 1
+8                   continue
+C                           Random choice of forward or backward 
+C    /* TODO
+C                   if ( roll(2) ) then
+C                       for (j = 0 j < var_rank(i) j++) {
+C                           index(j) += (count(j) - 1) * stride(j)
+C                           stride(j) = -stride(j)
+C                       }
+C                   end if
+C    */
+                    allInIntRange = .true.
+                    allInExtRange = .true.
+                    do 9, j = 1, nels
+                        err = index2indexes(j, var_rank(i), count, 
+     +                                      index2)
+                        if (err .ne. 0)
+     +                      call error('error in index2indexes() 1')
+                        do 10, d = 1, var_rank(i)
+                            index2(d) = index(d) + (index2(d)-1) * 
+     +                                  stride(d)
+10                      continue
+                        expect(j) = hash4(var_type(i), var_rank(i), 
+     +                                    index2, NFT_TEXT)
+                        if (inRange3(expect(j),var_type(i),
+     +                               NFT_TEXT)) then
+                            allInIntRange = 
+     +                          allInIntRange .and.
+     +                          in_internal_range(NFT_TEXT, 
+     +                                            expect(j))
+                        else
+                            allInExtRange = .false.
+                        end if
+9                   continue
+                    err = nf_get_vars_text(ncid, i, index,
+     +                                   count, stride,
+     +                                   value)
+                    if (canConvert) then
+                        if (allInExtRange) then
+                            if (allInIntRange) then
+                                if (err .ne. 0)
+     +                              call error(nf_strerror(err))
+                            else
+                                if (err .ne. NF_ERANGE)
+     +                              call errore('Range error: ', err)
+                            end if
+                        else
+                            if (err .ne. 0 .and. err .ne. NF_ERANGE)
+     +                          call errore('OK or Range error: ', err)
+                        end if
+                        do 11, j = 1, nels
+                            if (inRange3(expect(j),var_type(i),
+     +                          NFT_TEXT) .and.
+     +                          in_internal_range(NFT_TEXT, 
+     +                                            expect(j))) then
+                                val = ichar(value(j))
+                                if (.not.equal(val, expect(j),
+     +                              var_type(i), NFT_TEXT)) then
+                                    call error(
+     +                                  'value read not that expected')
+                                    if (verbose) then
+                                        call error(' ')
+                                        call errori('varid: ', i)
+                                        call errorc('var_name: ', 
+     +                                              var_name(i))
+                                        call errori('element number: ',
+     +                                              j)
+                                        call errord('expect: ', 
+     +                                              expect(j))
+                                        call errord('got: ', val)
+                                    end if
+                                else
+                                    nok = nok + 1
+                                end if
+                            end if
+11                      continue
+                    else
+                        if (nels .gt. 0 .and. err .ne. NF_ECHAR)
+     +                      call errore('wrong type: ', err)
+                    end if
+7               continue
+5           continue
+
+1       continue
+        err = nf_close(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_close: ', err)
+        call print_nok(nok)
+        end
+
+#ifdef NF_INT1_T
+        subroutine test_nf_get_vars_int1()
+        use tests
+        implicit        none
+        integer ncid
+        integer d
+        integer i
+        integer j
+        integer k
+        integer m
+        integer err
+        logical allInExtRange   
+        logical allInIntRange   
+        integer nels
+        integer nslabs
+        integer nstarts         
+        integer nok             
+        integer start(MAX_RANK)
+        integer edge(MAX_RANK)
+        integer index(MAX_RANK)
+        integer index2(MAX_RANK)
+        integer mid(MAX_RANK)
+        integer count(MAX_RANK)
+        integer sstride(MAX_RANK)
+        integer stride(MAX_RANK)
+        logical canConvert     
+        NF_INT1_T    value(MAX_NELS)
+        doubleprecision expect(MAX_NELS)
+        doubleprecision val
+        integer udshift
+
+        nok = 0
+
+        err = nf_open(testfile, NF_NOWRITE, ncid)
+        if (err .ne. 0)
+     +      call errore('nf_open: ', err)
+        do 1, i = 1, NVARS
+            canConvert = (var_type(i) .eq. NF_CHAR) .eqv. 
+     +                   (NFT_INT1 .eq. NFT_TEXT)
+            if (.not.(var_rank(i) .le. MAX_RANK)) stop 2
+            if (.not.(var_nels(i) .le. MAX_NELS)) stop 2
+            do 2, j = 1, var_rank(i)
+                start(j) = 1
+                edge(j) = 1
+                stride(j) = 1
+2           continue
+            err = nf_get_vars_int1(BAD_ID, i, start,
+     +                  edge, stride, value)
+            if (err .ne. NF_EBADID)
+     +          call errore('bad ncid: ', err)
+            err = nf_get_vars_int1(ncid, BAD_VARID,
+     +                  start, edge, stride, 
+     +                           value)
+            if (err .ne. NF_ENOTVAR)
+     +          call errore('bad var id: ', err)
+            do 3, j = 1, var_rank(i)
+                start(j) = var_shape(j,i) + 1
+                err = nf_get_vars_int1(ncid, i, start,
+     +                               edge, stride, 
+     +                               value)
+                if (.not. canConvert) then
+                    if (err .ne. NF_ECHAR)
+     +                  call errore('conversion: ', err)
+                else
+                    if (err .ne. NF_EINVALCOORDS)
+     +                  call errore('bad index: ', err)
+                endif
+                start(j) = 1
+                edge(j) = var_shape(j,i) + 1
+                err = nf_get_vars_int1(ncid, i, start,
+     +                               edge, stride, 
+     +                               value)
+                if (.not. canConvert) then
+                    if (err .ne. NF_ECHAR)
+     +                  call errore('conversion: ', err)
+                else
+                    if (err .ne. NF_EEDGE)
+     +                  call errore('bad edge: ', err)
+                endif
+                edge(j) = 1
+                stride(j) = 0
+                err = nf_get_vars_int1(ncid, i, start,
+     +                               edge, stride, 
+     +                               value)
+                if (.not. canConvert) then
+                    if (err .ne. NF_ECHAR)
+     +                  call errore('conversion: ', err)
+                else
+                    if (err .ne. NF_ESTRIDE)
+     +                  call errore('bad stride: ', err)
+                endif
+                stride(j) = 1
+3           continue
+C               Choose a random point dividing each dim into 2 parts
+C               get 2^rank (nslabs) slabs so defined
+            nslabs = 1
+            do 4, j = 1, var_rank(i)
+                mid(j) = roll( var_shape(j,i) )
+                nslabs = nslabs * 2
+4           continue
+C               bits of k determine whether to get lower or upper part of dim
+C               choose random stride from 1 to edge
+            do 5, k = 1, nslabs
+                nstarts = 1
+                do 6, j = 1, var_rank(i)
+                    if (mod(udshift(k-1, j-1), 2) .eq. 1) then
+                        start(j) = 1
+                        edge(j) = mid(j)
+                    else
+                        start(j) = 1 + mid(j)
+                        edge(j) = var_shape(j,i) - mid(j)
+                    end if
+                    if (edge(j) .gt. 0) then
+                        sstride(j) = 1 + roll(edge(j))
+                    else
+                        sstride(j) = 1
+                    end if
+                    nstarts = nstarts * stride(j)
+6               continue
+                do 7, m = 1, nstarts
+                    err = index2indexes(m, var_rank(i), sstride, 
+     +                                  index)
+                    if (err .ne. 0)
+     +                  call error('error in index2indexes')
+                    nels = 1
+                    do 8, j = 1, var_rank(i)
+                        count(j) = 1 + (edge(j) - index(j)) / 
+     +                                  stride(j)
+                        nels = nels * count(j)
+                        index(j) = index(j) + start(j) - 1
+8                   continue
+C                           Random choice of forward or backward 
+C    /* TODO
+C                   if ( roll(2) ) then
+C                       for (j = 0 j < var_rank(i) j++) {
+C                           index(j) += (count(j) - 1) * stride(j)
+C                           stride(j) = -stride(j)
+C                       }
+C                   end if
+C    */
+                    allInIntRange = .true.
+                    allInExtRange = .true.
+                    do 9, j = 1, nels
+                        err = index2indexes(j, var_rank(i), count, 
+     +                                      index2)
+                        if (err .ne. 0)
+     +                      call error('error in index2indexes() 1')
+                        do 10, d = 1, var_rank(i)
+                            index2(d) = index(d) + (index2(d)-1) * 
+     +                                  stride(d)
+10                      continue
+                        expect(j) = hash4(var_type(i), var_rank(i), 
+     +                                    index2, NFT_INT1)
+                        if (inRange3(expect(j),var_type(i),
+     +                               NFT_INT1)) then
+                            allInIntRange = 
+     +                          allInIntRange .and.
+     +                          in_internal_range(NFT_INT1, 
+     +                                            expect(j))
+                        else
+                            allInExtRange = .false.
+                        end if
+9                   continue
+                    err = nf_get_vars_int1(ncid, i, index,
+     +                                   count, stride,
+     +                                   value)
+                    if (canConvert) then
+                        if (allInExtRange) then
+                            if (allInIntRange) then
+                                if (err .ne. 0)
+     +                              call error(nf_strerror(err))
+                            else
+                                if (err .ne. NF_ERANGE)
+     +                              call errore('Range error: ', err)
+                            end if
+                        else
+                            if (err .ne. 0 .and. err .ne. NF_ERANGE)
+     +                          call errore('OK or Range error: ', err)
+                        end if
+                        do 11, j = 1, nels
+                            if (inRange3(expect(j),var_type(i),
+     +                          NFT_INT1) .and.
+     +                          in_internal_range(NFT_INT1, 
+     +                                            expect(j))) then
+                                val = value(j)
+                                if (.not.equal(val, expect(j),
+     +                              var_type(i), NFT_INT1)) then
+                                    call error(
+     +                                  'value read not that expected')
+                                    if (verbose) then
+                                        call error(' ')
+                                        call errori('varid: ', i)
+                                        call errorc('var_name: ', 
+     +                                              var_name(i))
+                                        call errori('element number: ',
+     +                                              j)
+                                        call errord('expect: ', 
+     +                                              expect(j))
+                                        call errord('got: ', val)
+                                    end if
+                                else
+                                    nok = nok + 1
+                                end if
+                            end if
+11                      continue
+                    else
+                        if (nels .gt. 0 .and. err .ne. NF_ECHAR)
+     +                      call errore('wrong type: ', err)
+                    end if
+7               continue
+5           continue
+
+1       continue
+        err = nf_close(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_close: ', err)
+        call print_nok(nok)
+        end
+
+#endif
+#ifdef NF_INT2_T
+        subroutine test_nf_get_vars_int2()
+        use tests
+        implicit        none
+        integer ncid
+        integer d
+        integer i
+        integer j
+        integer k
+        integer m
+        integer err
+        logical allInExtRange   
+        logical allInIntRange   
+        integer nels
+        integer nslabs
+        integer nstarts         
+        integer nok             
+        integer start(MAX_RANK)
+        integer edge(MAX_RANK)
+        integer index(MAX_RANK)
+        integer index2(MAX_RANK)
+        integer mid(MAX_RANK)
+        integer count(MAX_RANK)
+        integer sstride(MAX_RANK)
+        integer stride(MAX_RANK)
+        logical canConvert     
+        NF_INT2_T    value(MAX_NELS)
+        doubleprecision expect(MAX_NELS)
+        doubleprecision val
+        integer udshift
+
+        nok = 0
+
+        err = nf_open(testfile, NF_NOWRITE, ncid)
+        if (err .ne. 0)
+     +      call errore('nf_open: ', err)
+        do 1, i = 1, NVARS
+            canConvert = (var_type(i) .eq. NF_CHAR) .eqv. 
+     +                   (NFT_INT2 .eq. NFT_TEXT)
+            if (.not.(var_rank(i) .le. MAX_RANK)) stop 2
+            if (.not.(var_nels(i) .le. MAX_NELS)) stop 2
+            do 2, j = 1, var_rank(i)
+                start(j) = 1
+                edge(j) = 1
+                stride(j) = 1
+2           continue
+            err = nf_get_vars_int2(BAD_ID, i, start,
+     +                  edge, stride, value)
+            if (err .ne. NF_EBADID)
+     +          call errore('bad ncid: ', err)
+            err = nf_get_vars_int2(ncid, BAD_VARID,
+     +                  start, edge, stride, 
+     +                           value)
+            if (err .ne. NF_ENOTVAR)
+     +          call errore('bad var id: ', err)
+            do 3, j = 1, var_rank(i)
+                start(j) = var_shape(j,i) + 1
+                err = nf_get_vars_int2(ncid, i, start,
+     +                               edge, stride, 
+     +                               value)
+                if (.not. canConvert) then
+                    if (err .ne. NF_ECHAR)
+     +                  call errore('conversion: ', err)
+                else
+                    if (err .ne. NF_EINVALCOORDS)
+     +                  call errore('bad index: ', err)
+                endif
+                start(j) = 1
+                edge(j) = var_shape(j,i) + 1
+                err = nf_get_vars_int2(ncid, i, start,
+     +                               edge, stride, 
+     +                               value)
+                if (.not. canConvert) then
+                    if (err .ne. NF_ECHAR)
+     +                  call errore('conversion: ', err)
+                else
+                    if (err .ne. NF_EEDGE)
+     +                  call errore('bad edge: ', err)
+                endif
+                edge(j) = 1
+                stride(j) = 0
+                err = nf_get_vars_int2(ncid, i, start,
+     +                               edge, stride, 
+     +                               value)
+                if (.not. canConvert) then
+                    if (err .ne. NF_ECHAR)
+     +                  call errore('conversion: ', err)
+                else
+                    if (err .ne. NF_ESTRIDE)
+     +                  call errore('bad stride: ', err)
+                endif
+                stride(j) = 1
+3           continue
+C               Choose a random point dividing each dim into 2 parts
+C               get 2^rank (nslabs) slabs so defined
+            nslabs = 1
+            do 4, j = 1, var_rank(i)
+                mid(j) = roll( var_shape(j,i) )
+                nslabs = nslabs * 2
+4           continue
+C               bits of k determine whether to get lower or upper part of dim
+C               choose random stride from 1 to edge
+            do 5, k = 1, nslabs
+                nstarts = 1
+                do 6, j = 1, var_rank(i)
+                    if (mod(udshift(k-1, j-1), 2) .eq. 1) then
+                        start(j) = 1
+                        edge(j) = mid(j)
+                    else
+                        start(j) = 1 + mid(j)
+                        edge(j) = var_shape(j,i) - mid(j)
+                    end if
+                    if (edge(j) .gt. 0) then
+                        sstride(j) = 1 + roll(edge(j))
+                    else
+                        sstride(j) = 1
+                    end if
+                    nstarts = nstarts * stride(j)
+6               continue
+                do 7, m = 1, nstarts
+                    err = index2indexes(m, var_rank(i), sstride, 
+     +                                  index)
+                    if (err .ne. 0)
+     +                  call error('error in index2indexes')
+                    nels = 1
+                    do 8, j = 1, var_rank(i)
+                        count(j) = 1 + (edge(j) - index(j)) / 
+     +                                  stride(j)
+                        nels = nels * count(j)
+                        index(j) = index(j) + start(j) - 1
+8                   continue
+C                           Random choice of forward or backward 
+C    /* TODO
+C                   if ( roll(2) ) then
+C                       for (j = 0 j < var_rank(i) j++) {
+C                           index(j) += (count(j) - 1) * stride(j)
+C                           stride(j) = -stride(j)
+C                       }
+C                   end if
+C    */
+                    allInIntRange = .true.
+                    allInExtRange = .true.
+                    do 9, j = 1, nels
+                        err = index2indexes(j, var_rank(i), count, 
+     +                                      index2)
+                        if (err .ne. 0)
+     +                      call error('error in index2indexes() 1')
+                        do 10, d = 1, var_rank(i)
+                            index2(d) = index(d) + (index2(d)-1) * 
+     +                                  stride(d)
+10                      continue
+                        expect(j) = hash4(var_type(i), var_rank(i), 
+     +                                    index2, NFT_INT2)
+                        if (inRange3(expect(j),var_type(i),
+     +                               NFT_INT2)) then
+                            allInIntRange = 
+     +                          allInIntRange .and.
+     +                          in_internal_range(NFT_INT2, 
+     +                                            expect(j))
+                        else
+                            allInExtRange = .false.
+                        end if
+9                   continue
+                    err = nf_get_vars_int2(ncid, i, index,
+     +                                   count, stride,
+     +                                   value)
+                    if (canConvert) then
+                        if (allInExtRange) then
+                            if (allInIntRange) then
+                                if (err .ne. 0)
+     +                              call error(nf_strerror(err))
+                            else
+                                if (err .ne. NF_ERANGE)
+     +                              call errore('Range error: ', err)
+                            end if
+                        else
+                            if (err .ne. 0 .and. err .ne. NF_ERANGE)
+     +                          call errore('OK or Range error: ', err)
+                        end if
+                        do 11, j = 1, nels
+                            if (inRange3(expect(j),var_type(i),
+     +                          NFT_INT2) .and.
+     +                          in_internal_range(NFT_INT2, 
+     +                                            expect(j))) then
+                                val = value(j)
+                                if (.not.equal(val, expect(j),
+     +                              var_type(i), NFT_INT2)) then
+                                    call error(
+     +                                  'value read not that expected')
+                                    if (verbose) then
+                                        call error(' ')
+                                        call errori('varid: ', i)
+                                        call errorc('var_name: ', 
+     +                                              var_name(i))
+                                        call errori('element number: ',
+     +                                              j)
+                                        call errord('expect: ', 
+     +                                              expect(j))
+                                        call errord('got: ', val)
+                                    end if
+                                else
+                                    nok = nok + 1
+                                end if
+                            end if
+11                      continue
+                    else
+                        if (nels .gt. 0 .and. err .ne. NF_ECHAR)
+     +                      call errore('wrong type: ', err)
+                    end if
+7               continue
+5           continue
+
+1       continue
+        err = nf_close(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_close: ', err)
+        call print_nok(nok)
+        end
+
+#endif
+        subroutine test_nf_get_vars_int()
+        use tests
+        implicit        none
+        integer ncid
+        integer d
+        integer i
+        integer j
+        integer k
+        integer m
+        integer err
+        logical allInExtRange   
+        logical allInIntRange   
+        integer nels
+        integer nslabs
+        integer nstarts         
+        integer nok             
+        integer start(MAX_RANK)
+        integer edge(MAX_RANK)
+        integer index(MAX_RANK)
+        integer index2(MAX_RANK)
+        integer mid(MAX_RANK)
+        integer count(MAX_RANK)
+        integer sstride(MAX_RANK)
+        integer stride(MAX_RANK)
+        logical canConvert     
+        integer    value(MAX_NELS)
+        doubleprecision expect(MAX_NELS)
+        doubleprecision val
+        integer udshift
+
+        nok = 0
+
+        err = nf_open(testfile, NF_NOWRITE, ncid)
+        if (err .ne. 0)
+     +      call errore('nf_open: ', err)
+        do 1, i = 1, NVARS
+            canConvert = (var_type(i) .eq. NF_CHAR) .eqv. 
+     +                   (NFT_INT .eq. NFT_TEXT)
+            if (.not.(var_rank(i) .le. MAX_RANK)) stop 2
+            if (.not.(var_nels(i) .le. MAX_NELS)) stop 2
+            do 2, j = 1, var_rank(i)
+                start(j) = 1
+                edge(j) = 1
+                stride(j) = 1
+2           continue
+            err = nf_get_vars_int(BAD_ID, i, start,
+     +                  edge, stride, value)
+            if (err .ne. NF_EBADID)
+     +          call errore('bad ncid: ', err)
+            err = nf_get_vars_int(ncid, BAD_VARID,
+     +                  start, edge, stride, 
+     +                           value)
+            if (err .ne. NF_ENOTVAR)
+     +          call errore('bad var id: ', err)
+            do 3, j = 1, var_rank(i)
+                start(j) = var_shape(j,i) + 1
+                err = nf_get_vars_int(ncid, i, start,
+     +                               edge, stride, 
+     +                               value)
+                if (.not. canConvert) then
+                    if (err .ne. NF_ECHAR)
+     +                  call errore('conversion: ', err)
+                else
+                    if (err .ne. NF_EINVALCOORDS)
+     +                  call errore('bad index: ', err)
+                endif
+                start(j) = 1
+                edge(j) = var_shape(j,i) + 1
+                err = nf_get_vars_int(ncid, i, start,
+     +                               edge, stride, 
+     +                               value)
+                if (.not. canConvert) then
+                    if (err .ne. NF_ECHAR)
+     +                  call errore('conversion: ', err)
+                else
+                    if (err .ne. NF_EEDGE)
+     +                  call errore('bad edge: ', err)
+                endif
+                edge(j) = 1
+                stride(j) = 0
+                err = nf_get_vars_int(ncid, i, start,
+     +                               edge, stride, 
+     +                               value)
+                if (.not. canConvert) then
+                    if (err .ne. NF_ECHAR)
+     +                  call errore('conversion: ', err)
+                else
+                    if (err .ne. NF_ESTRIDE)
+     +                  call errore('bad stride: ', err)
+                endif
+                stride(j) = 1
+3           continue
+C               Choose a random point dividing each dim into 2 parts
+C               get 2^rank (nslabs) slabs so defined
+            nslabs = 1
+            do 4, j = 1, var_rank(i)
+                mid(j) = roll( var_shape(j,i) )
+                nslabs = nslabs * 2
+4           continue
+C               bits of k determine whether to get lower or upper part of dim
+C               choose random stride from 1 to edge
+            do 5, k = 1, nslabs
+                nstarts = 1
+                do 6, j = 1, var_rank(i)
+                    if (mod(udshift(k-1, j-1), 2) .eq. 1) then
+                        start(j) = 1
+                        edge(j) = mid(j)
+                    else
+                        start(j) = 1 + mid(j)
+                        edge(j) = var_shape(j,i) - mid(j)
+                    end if
+                    if (edge(j) .gt. 0) then
+                        sstride(j) = 1 + roll(edge(j))
+                    else
+                        sstride(j) = 1
+                    end if
+                    nstarts = nstarts * stride(j)
+6               continue
+                do 7, m = 1, nstarts
+                    err = index2indexes(m, var_rank(i), sstride, 
+     +                                  index)
+                    if (err .ne. 0)
+     +                  call error('error in index2indexes')
+                    nels = 1
+                    do 8, j = 1, var_rank(i)
+                        count(j) = 1 + (edge(j) - index(j)) / 
+     +                                  stride(j)
+                        nels = nels * count(j)
+                        index(j) = index(j) + start(j) - 1
+8                   continue
+C                           Random choice of forward or backward 
+C    /* TODO
+C                   if ( roll(2) ) then
+C                       for (j = 0 j < var_rank(i) j++) {
+C                           index(j) += (count(j) - 1) * stride(j)
+C                           stride(j) = -stride(j)
+C                       }
+C                   end if
+C    */
+                    allInIntRange = .true.
+                    allInExtRange = .true.
+                    do 9, j = 1, nels
+                        err = index2indexes(j, var_rank(i), count, 
+     +                                      index2)
+                        if (err .ne. 0)
+     +                      call error('error in index2indexes() 1')
+                        do 10, d = 1, var_rank(i)
+                            index2(d) = index(d) + (index2(d)-1) * 
+     +                                  stride(d)
+10                      continue
+                        expect(j) = hash4(var_type(i), var_rank(i), 
+     +                                    index2, NFT_INT)
+                        if (inRange3(expect(j),var_type(i),
+     +                               NFT_INT)) then
+                            allInIntRange = 
+     +                          allInIntRange .and.
+     +                          in_internal_range(NFT_INT, 
+     +                                            expect(j))
+                        else
+                            allInExtRange = .false.
+                        end if
+9                   continue
+                    err = nf_get_vars_int(ncid, i, index,
+     +                                   count, stride,
+     +                                   value)
+                    if (canConvert) then
+                        if (allInExtRange) then
+                            if (allInIntRange) then
+                                if (err .ne. 0)
+     +                              call error(nf_strerror(err))
+                            else
+                                if (err .ne. NF_ERANGE)
+     +                              call errore('Range error: ', err)
+                            end if
+                        else
+                            if (err .ne. 0 .and. err .ne. NF_ERANGE)
+     +                          call errore('OK or Range error: ', err)
+                        end if
+                        do 11, j = 1, nels
+                            if (inRange3(expect(j),var_type(i),
+     +                          NFT_INT) .and.
+     +                          in_internal_range(NFT_INT, 
+     +                                            expect(j))) then
+                                val = value(j)
+                                if (.not.equal(val, expect(j),
+     +                              var_type(i), NFT_INT)) then
+                                    call error(
+     +                                  'value read not that expected')
+                                    if (verbose) then
+                                        call error(' ')
+                                        call errori('varid: ', i)
+                                        call errorc('var_name: ', 
+     +                                              var_name(i))
+                                        call errori('element number: ',
+     +                                              j)
+                                        call errord('expect: ', 
+     +                                              expect(j))
+                                        call errord('got: ', val)
+                                    end if
+                                else
+                                    nok = nok + 1
+                                end if
+                            end if
+11                      continue
+                    else
+                        if (nels .gt. 0 .and. err .ne. NF_ECHAR)
+     +                      call errore('wrong type: ', err)
+                    end if
+7               continue
+5           continue
+
+1       continue
+        err = nf_close(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_close: ', err)
+        call print_nok(nok)
+        end
+
+        subroutine test_nf_get_vars_real()
+        use tests
+        implicit        none
+        integer ncid
+        integer d
+        integer i
+        integer j
+        integer k
+        integer m
+        integer err
+        logical allInExtRange   
+        logical allInIntRange   
+        integer nels
+        integer nslabs
+        integer nstarts         
+        integer nok             
+        integer start(MAX_RANK)
+        integer edge(MAX_RANK)
+        integer index(MAX_RANK)
+        integer index2(MAX_RANK)
+        integer mid(MAX_RANK)
+        integer count(MAX_RANK)
+        integer sstride(MAX_RANK)
+        integer stride(MAX_RANK)
+        logical canConvert     
+        real    value(MAX_NELS)
+        doubleprecision expect(MAX_NELS)
+        doubleprecision val
+        integer udshift
+
+        nok = 0
+
+        err = nf_open(testfile, NF_NOWRITE, ncid)
+        if (err .ne. 0)
+     +      call errore('nf_open: ', err)
+        do 1, i = 1, NVARS
+            canConvert = (var_type(i) .eq. NF_CHAR) .eqv. 
+     +                   (NFT_REAL .eq. NFT_TEXT)
+            if (.not.(var_rank(i) .le. MAX_RANK)) stop 2
+            if (.not.(var_nels(i) .le. MAX_NELS)) stop 2
+            do 2, j = 1, var_rank(i)
+                start(j) = 1
+                edge(j) = 1
+                stride(j) = 1
+2           continue
+            err = nf_get_vars_real(BAD_ID, i, start,
+     +                  edge, stride, value)
+            if (err .ne. NF_EBADID)
+     +          call errore('bad ncid: ', err)
+            err = nf_get_vars_real(ncid, BAD_VARID,
+     +                  start, edge, stride, 
+     +                           value)
+            if (err .ne. NF_ENOTVAR)
+     +          call errore('bad var id: ', err)
+            do 3, j = 1, var_rank(i)
+                start(j) = var_shape(j,i) + 1
+                err = nf_get_vars_real(ncid, i, start,
+     +                               edge, stride, 
+     +                               value)
+                if (.not. canConvert) then
+                    if (err .ne. NF_ECHAR)
+     +                  call errore('conversion: ', err)
+                else
+                    if (err .ne. NF_EINVALCOORDS)
+     +                  call errore('bad index: ', err)
+                endif
+                start(j) = 1
+                edge(j) = var_shape(j,i) + 1
+                err = nf_get_vars_real(ncid, i, start,
+     +                               edge, stride, 
+     +                               value)
+                if (.not. canConvert) then
+                    if (err .ne. NF_ECHAR)
+     +                  call errore('conversion: ', err)
+                else
+                    if (err .ne. NF_EEDGE)
+     +                  call errore('bad edge: ', err)
+                endif
+                edge(j) = 1
+                stride(j) = 0
+                err = nf_get_vars_real(ncid, i, start,
+     +                               edge, stride, 
+     +                               value)
+                if (.not. canConvert) then
+                    if (err .ne. NF_ECHAR)
+     +                  call errore('conversion: ', err)
+                else
+                    if (err .ne. NF_ESTRIDE)
+     +                  call errore('bad stride: ', err)
+                endif
+                stride(j) = 1
+3           continue
+C               Choose a random point dividing each dim into 2 parts
+C               get 2^rank (nslabs) slabs so defined
+            nslabs = 1
+            do 4, j = 1, var_rank(i)
+                mid(j) = roll( var_shape(j,i) )
+                nslabs = nslabs * 2
+4           continue
+C               bits of k determine whether to get lower or upper part of dim
+C               choose random stride from 1 to edge
+            do 5, k = 1, nslabs
+                nstarts = 1
+                do 6, j = 1, var_rank(i)
+                    if (mod(udshift(k-1, j-1), 2) .eq. 1) then
+                        start(j) = 1
+                        edge(j) = mid(j)
+                    else
+                        start(j) = 1 + mid(j)
+                        edge(j) = var_shape(j,i) - mid(j)
+                    end if
+                    if (edge(j) .gt. 0) then
+                        sstride(j) = 1 + roll(edge(j))
+                    else
+                        sstride(j) = 1
+                    end if
+                    nstarts = nstarts * stride(j)
+6               continue
+                do 7, m = 1, nstarts
+                    err = index2indexes(m, var_rank(i), sstride, 
+     +                                  index)
+                    if (err .ne. 0)
+     +                  call error('error in index2indexes')
+                    nels = 1
+                    do 8, j = 1, var_rank(i)
+                        count(j) = 1 + (edge(j) - index(j)) / 
+     +                                  stride(j)
+                        nels = nels * count(j)
+                        index(j) = index(j) + start(j) - 1
+8                   continue
+C                           Random choice of forward or backward 
+C    /* TODO
+C                   if ( roll(2) ) then
+C                       for (j = 0 j < var_rank(i) j++) {
+C                           index(j) += (count(j) - 1) * stride(j)
+C                           stride(j) = -stride(j)
+C                       }
+C                   end if
+C    */
+                    allInIntRange = .true.
+                    allInExtRange = .true.
+                    do 9, j = 1, nels
+                        err = index2indexes(j, var_rank(i), count, 
+     +                                      index2)
+                        if (err .ne. 0)
+     +                      call error('error in index2indexes() 1')
+                        do 10, d = 1, var_rank(i)
+                            index2(d) = index(d) + (index2(d)-1) * 
+     +                                  stride(d)
+10                      continue
+                        expect(j) = hash4(var_type(i), var_rank(i), 
+     +                                    index2, NFT_REAL)
+                        if (inRange3(expect(j),var_type(i),
+     +                               NFT_REAL)) then
+                            allInIntRange = 
+     +                          allInIntRange .and.
+     +                          in_internal_range(NFT_REAL, 
+     +                                            expect(j))
+                        else
+                            allInExtRange = .false.
+                        end if
+9                   continue
+                    err = nf_get_vars_real(ncid, i, index,
+     +                                   count, stride,
+     +                                   value)
+                    if (canConvert) then
+                        if (allInExtRange) then
+                            if (allInIntRange) then
+                                if (err .ne. 0)
+     +                              call error(nf_strerror(err))
+                            else
+                                if (err .ne. NF_ERANGE)
+     +                              call errore('Range error: ', err)
+                            end if
+                        else
+                            if (err .ne. 0 .and. err .ne. NF_ERANGE)
+     +                          call errore('OK or Range error: ', err)
+                        end if
+                        do 11, j = 1, nels
+                            if (inRange3(expect(j),var_type(i),
+     +                          NFT_REAL) .and.
+     +                          in_internal_range(NFT_REAL, 
+     +                                            expect(j))) then
+                                val = value(j)
+                                if (.not.equal(val, expect(j),
+     +                              var_type(i), NFT_REAL)) then
+                                    call error(
+     +                                  'value read not that expected')
+                                    if (verbose) then
+                                        call error(' ')
+                                        call errori('varid: ', i)
+                                        call errorc('var_name: ', 
+     +                                              var_name(i))
+                                        call errori('element number: ',
+     +                                              j)
+                                        call errord('expect: ', 
+     +                                              expect(j))
+                                        call errord('got: ', val)
+                                    end if
+                                else
+                                    nok = nok + 1
+                                end if
+                            end if
+11                      continue
+                    else
+                        if (nels .gt. 0 .and. err .ne. NF_ECHAR)
+     +                      call errore('wrong type: ', err)
+                    end if
+7               continue
+5           continue
+
+1       continue
+        err = nf_close(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_close: ', err)
+        call print_nok(nok)
+        end
+
+        subroutine test_nf_get_vars_double()
+        use tests
+        implicit        none
+        integer ncid
+        integer d
+        integer i
+        integer j
+        integer k
+        integer m
+        integer err
+        logical allInExtRange   
+        logical allInIntRange   
+        integer nels
+        integer nslabs
+        integer nstarts         
+        integer nok             
+        integer start(MAX_RANK)
+        integer edge(MAX_RANK)
+        integer index(MAX_RANK)
+        integer index2(MAX_RANK)
+        integer mid(MAX_RANK)
+        integer count(MAX_RANK)
+        integer sstride(MAX_RANK)
+        integer stride(MAX_RANK)
+        logical canConvert     
+        doubleprecision    value(MAX_NELS)
+        doubleprecision expect(MAX_NELS)
+        doubleprecision val
+        integer udshift
+
+        nok = 0
+
+        err = nf_open(testfile, NF_NOWRITE, ncid)
+        if (err .ne. 0)
+     +      call errore('nf_open: ', err)
+        do 1, i = 1, NVARS
+            canConvert = (var_type(i) .eq. NF_CHAR) .eqv. 
+     +                   (NFT_DOUBLE .eq. NFT_TEXT)
+            if (.not.(var_rank(i) .le. MAX_RANK)) stop 2
+            if (.not.(var_nels(i) .le. MAX_NELS)) stop 2
+            do 2, j = 1, var_rank(i)
+                start(j) = 1
+                edge(j) = 1
+                stride(j) = 1
+2           continue
+            err = nf_get_vars_double(BAD_ID, i, start,
+     +                  edge, stride, value)
+            if (err .ne. NF_EBADID)
+     +          call errore('bad ncid: ', err)
+            err = nf_get_vars_double(ncid, BAD_VARID,
+     +                  start, edge, stride, 
+     +                           value)
+            if (err .ne. NF_ENOTVAR)
+     +          call errore('bad var id: ', err)
+            do 3, j = 1, var_rank(i)
+                start(j) = var_shape(j,i) + 1
+                err = nf_get_vars_double(ncid, i, start,
+     +                               edge, stride, 
+     +                               value)
+                if (.not. canConvert) then
+                    if (err .ne. NF_ECHAR)
+     +                  call errore('conversion: ', err)
+                else
+                    if (err .ne. NF_EINVALCOORDS)
+     +                  call errore('bad index: ', err)
+                endif
+                start(j) = 1
+                edge(j) = var_shape(j,i) + 1
+                err = nf_get_vars_double(ncid, i, start,
+     +                               edge, stride, 
+     +                               value)
+                if (.not. canConvert) then
+                    if (err .ne. NF_ECHAR)
+     +                  call errore('conversion: ', err)
+                else
+                    if (err .ne. NF_EEDGE)
+     +                  call errore('bad edge: ', err)
+                endif
+                edge(j) = 1
+                stride(j) = 0
+                err = nf_get_vars_double(ncid, i, start,
+     +                               edge, stride, 
+     +                               value)
+                if (.not. canConvert) then
+                    if (err .ne. NF_ECHAR)
+     +                  call errore('conversion: ', err)
+                else
+                    if (err .ne. NF_ESTRIDE)
+     +                  call errore('bad stride: ', err)
+                endif
+                stride(j) = 1
+3           continue
+C               Choose a random point dividing each dim into 2 parts
+C               get 2^rank (nslabs) slabs so defined
+            nslabs = 1
+            do 4, j = 1, var_rank(i)
+                mid(j) = roll( var_shape(j,i) )
+                nslabs = nslabs * 2
+4           continue
+C               bits of k determine whether to get lower or upper part of dim
+C               choose random stride from 1 to edge
+            do 5, k = 1, nslabs
+                nstarts = 1
+                do 6, j = 1, var_rank(i)
+                    if (mod(udshift(k-1, j-1), 2) .eq. 1) then
+                        start(j) = 1
+                        edge(j) = mid(j)
+                    else
+                        start(j) = 1 + mid(j)
+                        edge(j) = var_shape(j,i) - mid(j)
+                    end if
+                    if (edge(j) .gt. 0) then
+                        sstride(j) = 1 + roll(edge(j))
+                    else
+                        sstride(j) = 1
+                    end if
+                    nstarts = nstarts * stride(j)
+6               continue
+                do 7, m = 1, nstarts
+                    err = index2indexes(m, var_rank(i), sstride, 
+     +                                  index)
+                    if (err .ne. 0)
+     +                  call error('error in index2indexes')
+                    nels = 1
+                    do 8, j = 1, var_rank(i)
+                        count(j) = 1 + (edge(j) - index(j)) / 
+     +                                  stride(j)
+                        nels = nels * count(j)
+                        index(j) = index(j) + start(j) - 1
+8                   continue
+C                           Random choice of forward or backward 
+C    /* TODO
+C                   if ( roll(2) ) then
+C                       for (j = 0 j < var_rank(i) j++) {
+C                           index(j) += (count(j) - 1) * stride(j)
+C                           stride(j) = -stride(j)
+C                       }
+C                   end if
+C    */
+                    allInIntRange = .true.
+                    allInExtRange = .true.
+                    do 9, j = 1, nels
+                        err = index2indexes(j, var_rank(i), count, 
+     +                                      index2)
+                        if (err .ne. 0)
+     +                      call error('error in index2indexes() 1')
+                        do 10, d = 1, var_rank(i)
+                            index2(d) = index(d) + (index2(d)-1) * 
+     +                                  stride(d)
+10                      continue
+                        expect(j) = hash4(var_type(i), var_rank(i), 
+     +                                    index2, NFT_DOUBLE)
+                        if (inRange3(expect(j),var_type(i),
+     +                               NFT_DOUBLE)) then
+                            allInIntRange = 
+     +                          allInIntRange .and.
+     +                          in_internal_range(NFT_DOUBLE, 
+     +                                            expect(j))
+                        else
+                            allInExtRange = .false.
+                        end if
+9                   continue
+                    err = nf_get_vars_double(ncid, i, index,
+     +                                   count, stride,
+     +                                   value)
+                    if (canConvert) then
+                        if (allInExtRange) then
+                            if (allInIntRange) then
+                                if (err .ne. 0)
+     +                              call error(nf_strerror(err))
+                            else
+                                if (err .ne. NF_ERANGE)
+     +                              call errore('Range error: ', err)
+                            end if
+                        else
+                            if (err .ne. 0 .and. err .ne. NF_ERANGE)
+     +                          call errore('OK or Range error: ', err)
+                        end if
+                        do 11, j = 1, nels
+                            if (inRange3(expect(j),var_type(i),
+     +                          NFT_DOUBLE) .and.
+     +                          in_internal_range(NFT_DOUBLE, 
+     +                                            expect(j))) then
+                                val = value(j)
+                                if (.not.equal(val, expect(j),
+     +                              var_type(i), NFT_DOUBLE)) then
+                                    call error(
+     +                                  'value read not that expected')
+                                    if (verbose) then
+                                        call error(' ')
+                                        call errori('varid: ', i)
+                                        call errorc('var_name: ', 
+     +                                              var_name(i))
+                                        call errori('element number: ',
+     +                                              j)
+                                        call errord('expect: ', 
+     +                                              expect(j))
+                                        call errord('got: ', val)
+                                    end if
+                                else
+                                    nok = nok + 1
+                                end if
+                            end if
+11                      continue
+                    else
+                        if (nels .gt. 0 .and. err .ne. NF_ECHAR)
+     +                      call errore('wrong type: ', err)
+                    end if
+7               continue
+5           continue
+
+1       continue
+        err = nf_close(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_close: ', err)
+        call print_nok(nok)
+        end
+
+
+        subroutine test_nf_get_varm_text()
+        use tests
+        implicit        none
+        integer ncid
+        integer d
+        integer i
+        integer j
+        integer k
+        integer m
+        integer err
+        logical allInExtRange   
+        logical allInIntRange   
+        integer nels
+        integer nslabs
+        integer nstarts         
+        integer nok             
+        integer start(MAX_RANK)
+        integer edge(MAX_RANK)
+        integer index(MAX_RANK)
+        integer index2(MAX_RANK)
+        integer mid(MAX_RANK)
+        integer count(MAX_RANK)
+        integer sstride(MAX_RANK)
+        integer stride(MAX_RANK)
+        integer imap(MAX_RANK)
+        logical canConvert     
+        character    value(MAX_NELS)
+        doubleprecision expect(MAX_NELS)
+        doubleprecision val
+        integer udshift
+
+        nok = 0
+
+        err = nf_open(testfile, NF_NOWRITE, ncid)
+        if (err .ne. 0)
+     +      call errore('nf_open: ', err)
+        do 1, i = 1, NVARS
+            canConvert = (var_type(i) .eq. NF_CHAR) .eqv. 
+     +                   (NFT_TEXT .eq. NFT_TEXT)
+            if (.not.(var_rank(i) .le. MAX_RANK)) stop 2
+            if (.not.(var_nels(i) .le. MAX_NELS)) stop 2
+            do 2, j = 1, var_rank(i)
+                start(j) = 1
+                edge(j) = 1
+                stride(j) = 1
+                imap(j) = 1
+2           continue
+            err = nf_get_varm_text(BAD_ID, i, start, edge,
+     +                           stride, imap, 
+     +                           value)
+            if (err .ne. NF_EBADID)
+     +          call errore('bad ncid: ', err)
+            err = nf_get_varm_text(ncid, BAD_VARID, start,
+     +                           edge, stride, 
+     +                           imap, value)
+            if (err .ne. NF_ENOTVAR)
+     +          call errore('bad var id: ', err)
+            do 3, j = 1, var_rank(i)
+                start(j) = var_shape(j,i) + 1
+                err = nf_get_varm_text(ncid, i, start,
+     +                               edge, stride, 
+     +                               imap, value)
+                if (.not. canConvert) then
+                    if (err .ne. NF_ECHAR)
+     +                  call errore('conversion: ', err)
+                else
+                    if (err .ne. NF_EINVALCOORDS)
+     +                  call errore('bad index: ', err)
+                endif
+                start(j) = 1
+                edge(j) = var_shape(j,i) + 1
+                err = nf_get_varm_text(ncid, i, start,
+     +                               edge, stride, 
+     +                               imap, value)
+                if (.not. canConvert) then
+                    if (err .ne. NF_ECHAR)
+     +                  call errore('conversion: ', err)
+                else
+                    if (err .ne. NF_EEDGE)
+     +                  call errore('bad edge: ', err)
+                endif
+                edge(j) = 1
+                stride(j) = 0
+                err = nf_get_varm_text(ncid, i, start,
+     +                               edge, stride, 
+     +                               imap, value)
+                if (.not. canConvert) then
+                    if (err .ne. NF_ECHAR)
+     +                  call errore('conversion: ', err)
+                else
+                    if (err .ne. NF_ESTRIDE)
+     +                  call errore('bad stride: ', err)
+                endif
+                stride(j) = 1
+3           continue
+C               Choose a random point dividing each dim into 2 parts 
+C               get 2^rank (nslabs) slabs so defined 
+            nslabs = 1
+            do 4, j = 1, var_rank(i)
+                mid(j) = roll( var_shape(j,i) )
+                nslabs = nslabs * 2
+4           continue
+C               /* bits of k determine whether to get lower or upper part 
+C                * of dim
+C                * choose random stride from 1 to edge */
+            do 5, k = 1, nslabs
+                nstarts = 1
+                do 6, j = 1, var_rank(i)
+                    if (mod(udshift((k-1), -(j-1)), 2) .ne. 0) then
+                        start(j) = 1
+                        edge(j) = mid(j)
+                    else
+                        start(j) = 1 + mid(j)
+                        edge(j) = var_shape(j,i) - mid(j)
+                    end if
+                    if (edge(j) .gt. 0) then
+                        stride(j) = 1+roll(edge(j))
+                    else
+                        stride(j) = 1
+                    end if
+                    sstride(j) = stride(j)
+                    nstarts = nstarts * stride(j)
+6               continue
+                do 7, m = 1, nstarts
+                    err = index2indexes(m, var_rank(i), sstride, index)
+                    if (err .ne. 0)
+     +                  call error('error in index2indexes')
+                    nels = 1
+                    do 8, j = 1, var_rank(i)
+                        count(j) = 1 + (edge(j) - index(j)) / 
+     +                                  stride(j)
+                        nels = nels * count(j)
+                        index(j) = index(j) + start(j) - 1
+8                   continue
+C                       Random choice of forward or backward 
+C    /* TODO
+C                   if ( roll(2) ) then
+C                       for (j = 0 j < var_rank(i) j++) {
+C                           index(j) += (count(j) - 1) * stride(j)
+C                           stride(j) = -stride(j)
+C                       }
+C                   end if
+C     */
+                    if (var_rank(i) .gt. 0) then
+                        imap(1) = 1
+                        do 9, j = 2, var_rank(i)
+                            imap(j) = imap(j-1) * count(j-1)
+9                       continue
+                    end if
+                    allInIntRange = .true.
+                    allInExtRange = .true.
+                    do 10, j = 1, nels
+                        err = index2indexes(j, var_rank(i), count, 
+     +                                      index2)
+                        if (err .ne. 0)
+     +                      call error('error in index2indexes 1')
+                        do 11, d = 1, var_rank(i)
+                            index2(d) = index(d) + (index2(d)-1) * 
+     +                                  stride(d)
+11                      continue
+                        expect(j) = hash4(var_type(i), var_rank(i), 
+     +                                    index2, NFT_TEXT)
+                        if (inRange3(expect(j),var_type(i),
+     +                               NFT_TEXT)) then
+                            allInIntRange = 
+     +                          allInIntRange .and.
+     +                          in_internal_range(NFT_TEXT,
+     +                                            expect(j))
+                        else
+                            allInExtRange = .false.
+                        end if
+10                  continue
+                    err = nf_get_varm_text(ncid,i,index,count,
+     +                                   stride,imap,
+     +                                   value)
+                    if (canConvert) then
+                        if (allInExtRange) then
+                            if (allInIntRange) then
+                                if (err .ne. 0)
+     +                              call error(nf_strerror(err))
+                            else
+                                if (err .ne. NF_ERANGE)
+     +                              call errore('Range error: ', err)
+                            end if
+                        else
+                            if (err .ne. 0 .and. err .ne. NF_ERANGE)
+     +                          call errore('OK or Range error: ', err)
+                        end if
+                        do 12, j = 1, nels
+                            if (inRange3(expect(j),var_type(i),
+     +                                   NFT_TEXT) .and.
+     +                          in_internal_range(NFT_TEXT,
+     +                                            expect(j))) then
+                                val = ichar(value(j))
+                                if (.not.equal(val, expect(j),
+     +                                         var_type(i), 
+     +                                         NFT_TEXT)) then
+                                    call error(
+     +                                  'value read not that expected')
+                                    if (verbose) then
+                                        call error(' ')
+                                        call errori('varid: ', i)
+                                        call errorc('var_name: ', 
+     +                                          var_name(i))
+                                        call errori('element number: ',
+     +                                              j)
+                                        call errord('expect: ', 
+     +                                              expect(j))
+                                        call errord('got: ', val)
+                                    end if
+                                else
+                                    nok = nok + 1
+                                end if
+                            end if
+12                      continue
+                    else
+                        if (nels .gt. 0 .and. err .ne. NF_ECHAR)
+     +                      call errore('wrong type: ', err)
+                    end if
+7               continue
+5           continue
+1       continue
+        err = nf_close(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_close: ',  err)
+        call print_nok(nok)
+        end
+
+#ifdef NF_INT1_T
+        subroutine test_nf_get_varm_int1()
+        use tests
+        implicit        none
+        integer ncid
+        integer d
+        integer i
+        integer j
+        integer k
+        integer m
+        integer err
+        logical allInExtRange   
+        logical allInIntRange   
+        integer nels
+        integer nslabs
+        integer nstarts         
+        integer nok             
+        integer start(MAX_RANK)
+        integer edge(MAX_RANK)
+        integer index(MAX_RANK)
+        integer index2(MAX_RANK)
+        integer mid(MAX_RANK)
+        integer count(MAX_RANK)
+        integer sstride(MAX_RANK)
+        integer stride(MAX_RANK)
+        integer imap(MAX_RANK)
+        logical canConvert     
+        NF_INT1_T    value(MAX_NELS)
+        doubleprecision expect(MAX_NELS)
+        doubleprecision val
+        integer udshift
+
+        nok = 0
+
+        err = nf_open(testfile, NF_NOWRITE, ncid)
+        if (err .ne. 0)
+     +      call errore('nf_open: ', err)
+        do 1, i = 1, NVARS
+            canConvert = (var_type(i) .eq. NF_CHAR) .eqv. 
+     +                   (NFT_INT1 .eq. NFT_TEXT)
+            if (.not.(var_rank(i) .le. MAX_RANK)) stop 2
+            if (.not.(var_nels(i) .le. MAX_NELS)) stop 2
+            do 2, j = 1, var_rank(i)
+                start(j) = 1
+                edge(j) = 1
+                stride(j) = 1
+                imap(j) = 1
+2           continue
+            err = nf_get_varm_int1(BAD_ID, i, start, edge,
+     +                           stride, imap, 
+     +                           value)
+            if (err .ne. NF_EBADID)
+     +          call errore('bad ncid: ', err)
+            err = nf_get_varm_int1(ncid, BAD_VARID, start,
+     +                           edge, stride, 
+     +                           imap, value)
+            if (err .ne. NF_ENOTVAR)
+     +          call errore('bad var id: ', err)
+            do 3, j = 1, var_rank(i)
+                start(j) = var_shape(j,i) + 1
+                err = nf_get_varm_int1(ncid, i, start,
+     +                               edge, stride, 
+     +                               imap, value)
+                if (.not. canConvert) then
+                    if (err .ne. NF_ECHAR)
+     +                  call errore('conversion: ', err)
+                else
+                    if (err .ne. NF_EINVALCOORDS)
+     +                  call errore('bad index: ', err)
+                endif
+                start(j) = 1
+                edge(j) = var_shape(j,i) + 1
+                err = nf_get_varm_int1(ncid, i, start,
+     +                               edge, stride, 
+     +                               imap, value)
+                if (.not. canConvert) then
+                    if (err .ne. NF_ECHAR)
+     +                  call errore('conversion: ', err)
+                else
+                    if (err .ne. NF_EEDGE)
+     +                  call errore('bad edge: ', err)
+                endif
+                edge(j) = 1
+                stride(j) = 0
+                err = nf_get_varm_int1(ncid, i, start,
+     +                               edge, stride, 
+     +                               imap, value)
+                if (.not. canConvert) then
+                    if (err .ne. NF_ECHAR)
+     +                  call errore('conversion: ', err)
+                else
+                    if (err .ne. NF_ESTRIDE)
+     +                  call errore('bad stride: ', err)
+                endif
+                stride(j) = 1
+3           continue
+C               Choose a random point dividing each dim into 2 parts 
+C               get 2^rank (nslabs) slabs so defined 
+            nslabs = 1
+            do 4, j = 1, var_rank(i)
+                mid(j) = roll( var_shape(j,i) )
+                nslabs = nslabs * 2
+4           continue
+C               /* bits of k determine whether to get lower or upper part 
+C                * of dim
+C                * choose random stride from 1 to edge */
+            do 5, k = 1, nslabs
+                nstarts = 1
+                do 6, j = 1, var_rank(i)
+                    if (mod(udshift((k-1), -(j-1)), 2) .ne. 0) then
+                        start(j) = 1
+                        edge(j) = mid(j)
+                    else
+                        start(j) = 1 + mid(j)
+                        edge(j) = var_shape(j,i) - mid(j)
+                    end if
+                    if (edge(j) .gt. 0) then
+                        stride(j) = 1+roll(edge(j))
+                    else
+                        stride(j) = 1
+                    end if
+                    sstride(j) = stride(j)
+                    nstarts = nstarts * stride(j)
+6               continue
+                do 7, m = 1, nstarts
+                    err = index2indexes(m, var_rank(i), sstride, index)
+                    if (err .ne. 0)
+     +                  call error('error in index2indexes')
+                    nels = 1
+                    do 8, j = 1, var_rank(i)
+                        count(j) = 1 + (edge(j) - index(j)) / 
+     +                                  stride(j)
+                        nels = nels * count(j)
+                        index(j) = index(j) + start(j) - 1
+8                   continue
+C                       Random choice of forward or backward 
+C    /* TODO
+C                   if ( roll(2) ) then
+C                       for (j = 0 j < var_rank(i) j++) {
+C                           index(j) += (count(j) - 1) * stride(j)
+C                           stride(j) = -stride(j)
+C                       }
+C                   end if
+C     */
+                    if (var_rank(i) .gt. 0) then
+                        imap(1) = 1
+                        do 9, j = 2, var_rank(i)
+                            imap(j) = imap(j-1) * count(j-1)
+9                       continue
+                    end if
+                    allInIntRange = .true.
+                    allInExtRange = .true.
+                    do 10, j = 1, nels
+                        err = index2indexes(j, var_rank(i), count, 
+     +                                      index2)
+                        if (err .ne. 0)
+     +                      call error('error in index2indexes 1')
+                        do 11, d = 1, var_rank(i)
+                            index2(d) = index(d) + (index2(d)-1) * 
+     +                                  stride(d)
+11                      continue
+                        expect(j) = hash4(var_type(i), var_rank(i), 
+     +                                    index2, NFT_INT1)
+                        if (inRange3(expect(j),var_type(i),
+     +                               NFT_INT1)) then
+                            allInIntRange = 
+     +                          allInIntRange .and.
+     +                          in_internal_range(NFT_INT1,
+     +                                            expect(j))
+                        else
+                            allInExtRange = .false.
+                        end if
+10                  continue
+                    err = nf_get_varm_int1(ncid,i,index,count,
+     +                                   stride,imap,
+     +                                   value)
+                    if (canConvert) then
+                        if (allInExtRange) then
+                            if (allInIntRange) then
+                                if (err .ne. 0)
+     +                              call error(nf_strerror(err))
+                            else
+                                if (err .ne. NF_ERANGE)
+     +                              call errore('Range error: ', err)
+                            end if
+                        else
+                            if (err .ne. 0 .and. err .ne. NF_ERANGE)
+     +                          call errore('OK or Range error: ', err)
+                        end if
+                        do 12, j = 1, nels
+                            if (inRange3(expect(j),var_type(i),
+     +                                   NFT_INT1) .and.
+     +                          in_internal_range(NFT_INT1,
+     +                                            expect(j))) then
+                                val = value(j)
+                                if (.not.equal(val, expect(j),
+     +                                         var_type(i), 
+     +                                         NFT_INT1)) then
+                                    call error(
+     +                                  'value read not that expected')
+                                    if (verbose) then
+                                        call error(' ')
+                                        call errori('varid: ', i)
+                                        call errorc('var_name: ', 
+     +                                          var_name(i))
+                                        call errori('element number: ',
+     +                                              j)
+                                        call errord('expect: ', 
+     +                                              expect(j))
+                                        call errord('got: ', val)
+                                    end if
+                                else
+                                    nok = nok + 1
+                                end if
+                            end if
+12                      continue
+                    else
+                        if (nels .gt. 0 .and. err .ne. NF_ECHAR)
+     +                      call errore('wrong type: ', err)
+                    end if
+7               continue
+5           continue
+1       continue
+        err = nf_close(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_close: ',  err)
+        call print_nok(nok)
+        end
+
+#endif
+#ifdef NF_INT2_T
+        subroutine test_nf_get_varm_int2()
+        use tests
+        implicit        none
+        integer ncid
+        integer d
+        integer i
+        integer j
+        integer k
+        integer m
+        integer err
+        logical allInExtRange   
+        logical allInIntRange   
+        integer nels
+        integer nslabs
+        integer nstarts         
+        integer nok             
+        integer start(MAX_RANK)
+        integer edge(MAX_RANK)
+        integer index(MAX_RANK)
+        integer index2(MAX_RANK)
+        integer mid(MAX_RANK)
+        integer count(MAX_RANK)
+        integer sstride(MAX_RANK)
+        integer stride(MAX_RANK)
+        integer imap(MAX_RANK)
+        logical canConvert     
+        NF_INT2_T    value(MAX_NELS)
+        doubleprecision expect(MAX_NELS)
+        doubleprecision val
+        integer udshift
+
+        nok = 0
+
+        err = nf_open(testfile, NF_NOWRITE, ncid)
+        if (err .ne. 0)
+     +      call errore('nf_open: ', err)
+        do 1, i = 1, NVARS
+            canConvert = (var_type(i) .eq. NF_CHAR) .eqv. 
+     +                   (NFT_INT2 .eq. NFT_TEXT)
+            if (.not.(var_rank(i) .le. MAX_RANK)) stop 2
+            if (.not.(var_nels(i) .le. MAX_NELS)) stop 2
+            do 2, j = 1, var_rank(i)
+                start(j) = 1
+                edge(j) = 1
+                stride(j) = 1
+                imap(j) = 1
+2           continue
+            err = nf_get_varm_int2(BAD_ID, i, start, edge,
+     +                           stride, imap, 
+     +                           value)
+            if (err .ne. NF_EBADID)
+     +          call errore('bad ncid: ', err)
+            err = nf_get_varm_int2(ncid, BAD_VARID, start,
+     +                           edge, stride, 
+     +                           imap, value)
+            if (err .ne. NF_ENOTVAR)
+     +          call errore('bad var id: ', err)
+            do 3, j = 1, var_rank(i)
+                start(j) = var_shape(j,i) + 1
+                err = nf_get_varm_int2(ncid, i, start,
+     +                               edge, stride, 
+     +                               imap, value)
+                if (.not. canConvert) then
+                    if (err .ne. NF_ECHAR)
+     +                  call errore('conversion: ', err)
+                else
+                    if (err .ne. NF_EINVALCOORDS)
+     +                  call errore('bad index: ', err)
+                endif
+                start(j) = 1
+                edge(j) = var_shape(j,i) + 1
+                err = nf_get_varm_int2(ncid, i, start,
+     +                               edge, stride, 
+     +                               imap, value)
+                if (.not. canConvert) then
+                    if (err .ne. NF_ECHAR)
+     +                  call errore('conversion: ', err)
+                else
+                    if (err .ne. NF_EEDGE)
+     +                  call errore('bad edge: ', err)
+                endif
+                edge(j) = 1
+                stride(j) = 0
+                err = nf_get_varm_int2(ncid, i, start,
+     +                               edge, stride, 
+     +                               imap, value)
+                if (.not. canConvert) then
+                    if (err .ne. NF_ECHAR)
+     +                  call errore('conversion: ', err)
+                else
+                    if (err .ne. NF_ESTRIDE)
+     +                  call errore('bad stride: ', err)
+                endif
+                stride(j) = 1
+3           continue
+C               Choose a random point dividing each dim into 2 parts 
+C               get 2^rank (nslabs) slabs so defined 
+            nslabs = 1
+            do 4, j = 1, var_rank(i)
+                mid(j) = roll( var_shape(j,i) )
+                nslabs = nslabs * 2
+4           continue
+C               /* bits of k determine whether to get lower or upper part 
+C                * of dim
+C                * choose random stride from 1 to edge */
+            do 5, k = 1, nslabs
+                nstarts = 1
+                do 6, j = 1, var_rank(i)
+                    if (mod(udshift((k-1), -(j-1)), 2) .ne. 0) then
+                        start(j) = 1
+                        edge(j) = mid(j)
+                    else
+                        start(j) = 1 + mid(j)
+                        edge(j) = var_shape(j,i) - mid(j)
+                    end if
+                    if (edge(j) .gt. 0) then
+                        stride(j) = 1+roll(edge(j))
+                    else
+                        stride(j) = 1
+                    end if
+                    sstride(j) = stride(j)
+                    nstarts = nstarts * stride(j)
+6               continue
+                do 7, m = 1, nstarts
+                    err = index2indexes(m, var_rank(i), sstride, index)
+                    if (err .ne. 0)
+     +                  call error('error in index2indexes')
+                    nels = 1
+                    do 8, j = 1, var_rank(i)
+                        count(j) = 1 + (edge(j) - index(j)) / 
+     +                                  stride(j)
+                        nels = nels * count(j)
+                        index(j) = index(j) + start(j) - 1
+8                   continue
+C                       Random choice of forward or backward 
+C    /* TODO
+C                   if ( roll(2) ) then
+C                       for (j = 0 j < var_rank(i) j++) {
+C                           index(j) += (count(j) - 1) * stride(j)
+C                           stride(j) = -stride(j)
+C                       }
+C                   end if
+C     */
+                    if (var_rank(i) .gt. 0) then
+                        imap(1) = 1
+                        do 9, j = 2, var_rank(i)
+                            imap(j) = imap(j-1) * count(j-1)
+9                       continue
+                    end if
+                    allInIntRange = .true.
+                    allInExtRange = .true.
+                    do 10, j = 1, nels
+                        err = index2indexes(j, var_rank(i), count, 
+     +                                      index2)
+                        if (err .ne. 0)
+     +                      call error('error in index2indexes 1')
+                        do 11, d = 1, var_rank(i)
+                            index2(d) = index(d) + (index2(d)-1) * 
+     +                                  stride(d)
+11                      continue
+                        expect(j) = hash4(var_type(i), var_rank(i), 
+     +                                    index2, NFT_INT2)
+                        if (inRange3(expect(j),var_type(i),
+     +                               NFT_INT2)) then
+                            allInIntRange = 
+     +                          allInIntRange .and.
+     +                          in_internal_range(NFT_INT2,
+     +                                            expect(j))
+                        else
+                            allInExtRange = .false.
+                        end if
+10                  continue
+                    err = nf_get_varm_int2(ncid,i,index,count,
+     +                                   stride,imap,
+     +                                   value)
+                    if (canConvert) then
+                        if (allInExtRange) then
+                            if (allInIntRange) then
+                                if (err .ne. 0)
+     +                              call error(nf_strerror(err))
+                            else
+                                if (err .ne. NF_ERANGE)
+     +                              call errore('Range error: ', err)
+                            end if
+                        else
+                            if (err .ne. 0 .and. err .ne. NF_ERANGE)
+     +                          call errore('OK or Range error: ', err)
+                        end if
+                        do 12, j = 1, nels
+                            if (inRange3(expect(j),var_type(i),
+     +                                   NFT_INT2) .and.
+     +                          in_internal_range(NFT_INT2,
+     +                                            expect(j))) then
+                                val = value(j)
+                                if (.not.equal(val, expect(j),
+     +                                         var_type(i), 
+     +                                         NFT_INT2)) then
+                                    call error(
+     +                                  'value read not that expected')
+                                    if (verbose) then
+                                        call error(' ')
+                                        call errori('varid: ', i)
+                                        call errorc('var_name: ', 
+     +                                          var_name(i))
+                                        call errori('element number: ',
+     +                                              j)
+                                        call errord('expect: ', 
+     +                                              expect(j))
+                                        call errord('got: ', val)
+                                    end if
+                                else
+                                    nok = nok + 1
+                                end if
+                            end if
+12                      continue
+                    else
+                        if (nels .gt. 0 .and. err .ne. NF_ECHAR)
+     +                      call errore('wrong type: ', err)
+                    end if
+7               continue
+5           continue
+1       continue
+        err = nf_close(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_close: ',  err)
+        call print_nok(nok)
+        end
+
+#endif
+        subroutine test_nf_get_varm_int()
+        use tests
+        implicit        none
+        integer ncid
+        integer d
+        integer i
+        integer j
+        integer k
+        integer m
+        integer err
+        logical allInExtRange   
+        logical allInIntRange   
+        integer nels
+        integer nslabs
+        integer nstarts         
+        integer nok             
+        integer start(MAX_RANK)
+        integer edge(MAX_RANK)
+        integer index(MAX_RANK)
+        integer index2(MAX_RANK)
+        integer mid(MAX_RANK)
+        integer count(MAX_RANK)
+        integer sstride(MAX_RANK)
+        integer stride(MAX_RANK)
+        integer imap(MAX_RANK)
+        logical canConvert     
+        integer    value(MAX_NELS)
+        doubleprecision expect(MAX_NELS)
+        doubleprecision val
+        integer udshift
+
+        nok = 0
+
+        err = nf_open(testfile, NF_NOWRITE, ncid)
+        if (err .ne. 0)
+     +      call errore('nf_open: ', err)
+        do 1, i = 1, NVARS
+            canConvert = (var_type(i) .eq. NF_CHAR) .eqv. 
+     +                   (NFT_INT .eq. NFT_TEXT)
+            if (.not.(var_rank(i) .le. MAX_RANK)) stop 2
+            if (.not.(var_nels(i) .le. MAX_NELS)) stop 2
+            do 2, j = 1, var_rank(i)
+                start(j) = 1
+                edge(j) = 1
+                stride(j) = 1
+                imap(j) = 1
+2           continue
+            err = nf_get_varm_int(BAD_ID, i, start, edge,
+     +                           stride, imap, 
+     +                           value)
+            if (err .ne. NF_EBADID)
+     +          call errore('bad ncid: ', err)
+            err = nf_get_varm_int(ncid, BAD_VARID, start,
+     +                           edge, stride, 
+     +                           imap, value)
+            if (err .ne. NF_ENOTVAR)
+     +          call errore('bad var id: ', err)
+            do 3, j = 1, var_rank(i)
+                start(j) = var_shape(j,i) + 1
+                err = nf_get_varm_int(ncid, i, start,
+     +                               edge, stride, 
+     +                               imap, value)
+                if (.not. canConvert) then
+                    if (err .ne. NF_ECHAR)
+     +                  call errore('conversion: ', err)
+                else
+                    if (err .ne. NF_EINVALCOORDS)
+     +                  call errore('bad index: ', err)
+                endif
+                start(j) = 1
+                edge(j) = var_shape(j,i) + 1
+                err = nf_get_varm_int(ncid, i, start,
+     +                               edge, stride, 
+     +                               imap, value)
+                if (.not. canConvert) then
+                    if (err .ne. NF_ECHAR)
+     +                  call errore('conversion: ', err)
+                else
+                    if (err .ne. NF_EEDGE)
+     +                  call errore('bad edge: ', err)
+                endif
+                edge(j) = 1
+                stride(j) = 0
+                err = nf_get_varm_int(ncid, i, start,
+     +                               edge, stride, 
+     +                               imap, value)
+                if (.not. canConvert) then
+                    if (err .ne. NF_ECHAR)
+     +                  call errore('conversion: ', err)
+                else
+                    if (err .ne. NF_ESTRIDE)
+     +                  call errore('bad stride: ', err)
+                endif
+                stride(j) = 1
+3           continue
+C               Choose a random point dividing each dim into 2 parts 
+C               get 2^rank (nslabs) slabs so defined 
+            nslabs = 1
+            do 4, j = 1, var_rank(i)
+                mid(j) = roll( var_shape(j,i) )
+                nslabs = nslabs * 2
+4           continue
+C               /* bits of k determine whether to get lower or upper part 
+C                * of dim
+C                * choose random stride from 1 to edge */
+            do 5, k = 1, nslabs
+                nstarts = 1
+                do 6, j = 1, var_rank(i)
+                    if (mod(udshift((k-1), -(j-1)), 2) .ne. 0) then
+                        start(j) = 1
+                        edge(j) = mid(j)
+                    else
+                        start(j) = 1 + mid(j)
+                        edge(j) = var_shape(j,i) - mid(j)
+                    end if
+                    if (edge(j) .gt. 0) then
+                        stride(j) = 1+roll(edge(j))
+                    else
+                        stride(j) = 1
+                    end if
+                    sstride(j) = stride(j)
+                    nstarts = nstarts * stride(j)
+6               continue
+                do 7, m = 1, nstarts
+                    err = index2indexes(m, var_rank(i), sstride, index)
+                    if (err .ne. 0)
+     +                  call error('error in index2indexes')
+                    nels = 1
+                    do 8, j = 1, var_rank(i)
+                        count(j) = 1 + (edge(j) - index(j)) / 
+     +                                  stride(j)
+                        nels = nels * count(j)
+                        index(j) = index(j) + start(j) - 1
+8                   continue
+C                       Random choice of forward or backward 
+C    /* TODO
+C                   if ( roll(2) ) then
+C                       for (j = 0 j < var_rank(i) j++) {
+C                           index(j) += (count(j) - 1) * stride(j)
+C                           stride(j) = -stride(j)
+C                       }
+C                   end if
+C     */
+                    if (var_rank(i) .gt. 0) then
+                        imap(1) = 1
+                        do 9, j = 2, var_rank(i)
+                            imap(j) = imap(j-1) * count(j-1)
+9                       continue
+                    end if
+                    allInIntRange = .true.
+                    allInExtRange = .true.
+                    do 10, j = 1, nels
+                        err = index2indexes(j, var_rank(i), count, 
+     +                                      index2)
+                        if (err .ne. 0)
+     +                      call error('error in index2indexes 1')
+                        do 11, d = 1, var_rank(i)
+                            index2(d) = index(d) + (index2(d)-1) * 
+     +                                  stride(d)
+11                      continue
+                        expect(j) = hash4(var_type(i), var_rank(i), 
+     +                                    index2, NFT_INT)
+                        if (inRange3(expect(j),var_type(i),
+     +                               NFT_INT)) then
+                            allInIntRange = 
+     +                          allInIntRange .and.
+     +                          in_internal_range(NFT_INT,
+     +                                            expect(j))
+                        else
+                            allInExtRange = .false.
+                        end if
+10                  continue
+                    err = nf_get_varm_int(ncid,i,index,count,
+     +                                   stride,imap,
+     +                                   value)
+                    if (canConvert) then
+                        if (allInExtRange) then
+                            if (allInIntRange) then
+                                if (err .ne. 0)
+     +                              call error(nf_strerror(err))
+                            else
+                                if (err .ne. NF_ERANGE)
+     +                              call errore('Range error: ', err)
+                            end if
+                        else
+                            if (err .ne. 0 .and. err .ne. NF_ERANGE)
+     +                          call errore('OK or Range error: ', err)
+                        end if
+                        do 12, j = 1, nels
+                            if (inRange3(expect(j),var_type(i),
+     +                                   NFT_INT) .and.
+     +                          in_internal_range(NFT_INT,
+     +                                            expect(j))) then
+                                val = value(j)
+                                if (.not.equal(val, expect(j),
+     +                                         var_type(i), 
+     +                                         NFT_INT)) then
+                                    call error(
+     +                                  'value read not that expected')
+                                    if (verbose) then
+                                        call error(' ')
+                                        call errori('varid: ', i)
+                                        call errorc('var_name: ', 
+     +                                          var_name(i))
+                                        call errori('element number: ',
+     +                                              j)
+                                        call errord('expect: ', 
+     +                                              expect(j))
+                                        call errord('got: ', val)
+                                    end if
+                                else
+                                    nok = nok + 1
+                                end if
+                            end if
+12                      continue
+                    else
+                        if (nels .gt. 0 .and. err .ne. NF_ECHAR)
+     +                      call errore('wrong type: ', err)
+                    end if
+7               continue
+5           continue
+1       continue
+        err = nf_close(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_close: ',  err)
+        call print_nok(nok)
+        end
+
+        subroutine test_nf_get_varm_real()
+        use tests
+        implicit        none
+        integer ncid
+        integer d
+        integer i
+        integer j
+        integer k
+        integer m
+        integer err
+        logical allInExtRange   
+        logical allInIntRange   
+        integer nels
+        integer nslabs
+        integer nstarts         
+        integer nok             
+        integer start(MAX_RANK)
+        integer edge(MAX_RANK)
+        integer index(MAX_RANK)
+        integer index2(MAX_RANK)
+        integer mid(MAX_RANK)
+        integer count(MAX_RANK)
+        integer sstride(MAX_RANK)
+        integer stride(MAX_RANK)
+        integer imap(MAX_RANK)
+        logical canConvert     
+        real    value(MAX_NELS)
+        doubleprecision expect(MAX_NELS)
+        doubleprecision val
+        integer udshift
+
+        nok = 0
+
+        err = nf_open(testfile, NF_NOWRITE, ncid)
+        if (err .ne. 0)
+     +      call errore('nf_open: ', err)
+        do 1, i = 1, NVARS
+            canConvert = (var_type(i) .eq. NF_CHAR) .eqv. 
+     +                   (NFT_REAL .eq. NFT_TEXT)
+            if (.not.(var_rank(i) .le. MAX_RANK)) stop 2
+            if (.not.(var_nels(i) .le. MAX_NELS)) stop 2
+            do 2, j = 1, var_rank(i)
+                start(j) = 1
+                edge(j) = 1
+                stride(j) = 1
+                imap(j) = 1
+2           continue
+            err = nf_get_varm_real(BAD_ID, i, start, edge,
+     +                           stride, imap, 
+     +                           value)
+            if (err .ne. NF_EBADID)
+     +          call errore('bad ncid: ', err)
+            err = nf_get_varm_real(ncid, BAD_VARID, start,
+     +                           edge, stride, 
+     +                           imap, value)
+            if (err .ne. NF_ENOTVAR)
+     +          call errore('bad var id: ', err)
+            do 3, j = 1, var_rank(i)
+                start(j) = var_shape(j,i) + 1
+                err = nf_get_varm_real(ncid, i, start,
+     +                               edge, stride, 
+     +                               imap, value)
+                if (.not. canConvert) then
+                    if (err .ne. NF_ECHAR)
+     +                  call errore('conversion: ', err)
+                else
+                    if (err .ne. NF_EINVALCOORDS)
+     +                  call errore('bad index: ', err)
+                endif
+                start(j) = 1
+                edge(j) = var_shape(j,i) + 1
+                err = nf_get_varm_real(ncid, i, start,
+     +                               edge, stride, 
+     +                               imap, value)
+                if (.not. canConvert) then
+                    if (err .ne. NF_ECHAR)
+     +                  call errore('conversion: ', err)
+                else
+                    if (err .ne. NF_EEDGE)
+     +                  call errore('bad edge: ', err)
+                endif
+                edge(j) = 1
+                stride(j) = 0
+                err = nf_get_varm_real(ncid, i, start,
+     +                               edge, stride, 
+     +                               imap, value)
+                if (.not. canConvert) then
+                    if (err .ne. NF_ECHAR)
+     +                  call errore('conversion: ', err)
+                else
+                    if (err .ne. NF_ESTRIDE)
+     +                  call errore('bad stride: ', err)
+                endif
+                stride(j) = 1
+3           continue
+C               Choose a random point dividing each dim into 2 parts 
+C               get 2^rank (nslabs) slabs so defined 
+            nslabs = 1
+            do 4, j = 1, var_rank(i)
+                mid(j) = roll( var_shape(j,i) )
+                nslabs = nslabs * 2
+4           continue
+C               /* bits of k determine whether to get lower or upper part 
+C                * of dim
+C                * choose random stride from 1 to edge */
+            do 5, k = 1, nslabs
+                nstarts = 1
+                do 6, j = 1, var_rank(i)
+                    if (mod(udshift((k-1), -(j-1)), 2) .ne. 0) then
+                        start(j) = 1
+                        edge(j) = mid(j)
+                    else
+                        start(j) = 1 + mid(j)
+                        edge(j) = var_shape(j,i) - mid(j)
+                    end if
+                    if (edge(j) .gt. 0) then
+                        stride(j) = 1+roll(edge(j))
+                    else
+                        stride(j) = 1
+                    end if
+                    sstride(j) = stride(j)
+                    nstarts = nstarts * stride(j)
+6               continue
+                do 7, m = 1, nstarts
+                    err = index2indexes(m, var_rank(i), sstride, index)
+                    if (err .ne. 0)
+     +                  call error('error in index2indexes')
+                    nels = 1
+                    do 8, j = 1, var_rank(i)
+                        count(j) = 1 + (edge(j) - index(j)) / 
+     +                                  stride(j)
+                        nels = nels * count(j)
+                        index(j) = index(j) + start(j) - 1
+8                   continue
+C                       Random choice of forward or backward 
+C    /* TODO
+C                   if ( roll(2) ) then
+C                       for (j = 0 j < var_rank(i) j++) {
+C                           index(j) += (count(j) - 1) * stride(j)
+C                           stride(j) = -stride(j)
+C                       }
+C                   end if
+C     */
+                    if (var_rank(i) .gt. 0) then
+                        imap(1) = 1
+                        do 9, j = 2, var_rank(i)
+                            imap(j) = imap(j-1) * count(j-1)
+9                       continue
+                    end if
+                    allInIntRange = .true.
+                    allInExtRange = .true.
+                    do 10, j = 1, nels
+                        err = index2indexes(j, var_rank(i), count, 
+     +                                      index2)
+                        if (err .ne. 0)
+     +                      call error('error in index2indexes 1')
+                        do 11, d = 1, var_rank(i)
+                            index2(d) = index(d) + (index2(d)-1) * 
+     +                                  stride(d)
+11                      continue
+                        expect(j) = hash4(var_type(i), var_rank(i), 
+     +                                    index2, NFT_REAL)
+                        if (inRange3(expect(j),var_type(i),
+     +                               NFT_REAL)) then
+                            allInIntRange = 
+     +                          allInIntRange .and.
+     +                          in_internal_range(NFT_REAL,
+     +                                            expect(j))
+                        else
+                            allInExtRange = .false.
+                        end if
+10                  continue
+                    err = nf_get_varm_real(ncid,i,index,count,
+     +                                   stride,imap,
+     +                                   value)
+                    if (canConvert) then
+                        if (allInExtRange) then
+                            if (allInIntRange) then
+                                if (err .ne. 0)
+     +                              call error(nf_strerror(err))
+                            else
+                                if (err .ne. NF_ERANGE)
+     +                              call errore('Range error: ', err)
+                            end if
+                        else
+                            if (err .ne. 0 .and. err .ne. NF_ERANGE)
+     +                          call errore('OK or Range error: ', err)
+                        end if
+                        do 12, j = 1, nels
+                            if (inRange3(expect(j),var_type(i),
+     +                                   NFT_REAL) .and.
+     +                          in_internal_range(NFT_REAL,
+     +                                            expect(j))) then
+                                val = value(j)
+                                if (.not.equal(val, expect(j),
+     +                                         var_type(i), 
+     +                                         NFT_REAL)) then
+                                    call error(
+     +                                  'value read not that expected')
+                                    if (verbose) then
+                                        call error(' ')
+                                        call errori('varid: ', i)
+                                        call errorc('var_name: ', 
+     +                                          var_name(i))
+                                        call errori('element number: ',
+     +                                              j)
+                                        call errord('expect: ', 
+     +                                              expect(j))
+                                        call errord('got: ', val)
+                                    end if
+                                else
+                                    nok = nok + 1
+                                end if
+                            end if
+12                      continue
+                    else
+                        if (nels .gt. 0 .and. err .ne. NF_ECHAR)
+     +                      call errore('wrong type: ', err)
+                    end if
+7               continue
+5           continue
+1       continue
+        err = nf_close(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_close: ',  err)
+        call print_nok(nok)
+        end
+
+        subroutine test_nf_get_varm_double()
+        use tests
+        implicit        none
+        integer ncid
+        integer d
+        integer i
+        integer j
+        integer k
+        integer m
+        integer err
+        logical allInExtRange   
+        logical allInIntRange   
+        integer nels
+        integer nslabs
+        integer nstarts         
+        integer nok             
+        integer start(MAX_RANK)
+        integer edge(MAX_RANK)
+        integer index(MAX_RANK)
+        integer index2(MAX_RANK)
+        integer mid(MAX_RANK)
+        integer count(MAX_RANK)
+        integer sstride(MAX_RANK)
+        integer stride(MAX_RANK)
+        integer imap(MAX_RANK)
+        logical canConvert     
+        doubleprecision    value(MAX_NELS)
+        doubleprecision expect(MAX_NELS)
+        doubleprecision val
+        integer udshift
+
+        nok = 0
+
+        err = nf_open(testfile, NF_NOWRITE, ncid)
+        if (err .ne. 0)
+     +      call errore('nf_open: ', err)
+        do 1, i = 1, NVARS
+            canConvert = (var_type(i) .eq. NF_CHAR) .eqv. 
+     +                   (NFT_DOUBLE .eq. NFT_TEXT)
+            if (.not.(var_rank(i) .le. MAX_RANK)) stop 2
+            if (.not.(var_nels(i) .le. MAX_NELS)) stop 2
+            do 2, j = 1, var_rank(i)
+                start(j) = 1
+                edge(j) = 1
+                stride(j) = 1
+                imap(j) = 1
+2           continue
+            err = nf_get_varm_double(BAD_ID, i, start, edge,
+     +                           stride, imap, 
+     +                           value)
+            if (err .ne. NF_EBADID)
+     +          call errore('bad ncid: ', err)
+            err = nf_get_varm_double(ncid, BAD_VARID, start,
+     +                           edge, stride, 
+     +                           imap, value)
+            if (err .ne. NF_ENOTVAR)
+     +          call errore('bad var id: ', err)
+            do 3, j = 1, var_rank(i)
+                start(j) = var_shape(j,i) + 1
+                err = nf_get_varm_double(ncid, i, start,
+     +                               edge, stride, 
+     +                               imap, value)
+                if (.not. canConvert) then
+                    if (err .ne. NF_ECHAR)
+     +                  call errore('conversion: ', err)
+                else
+                    if (err .ne. NF_EINVALCOORDS)
+     +                  call errore('bad index: ', err)
+                endif
+                start(j) = 1
+                edge(j) = var_shape(j,i) + 1
+                err = nf_get_varm_double(ncid, i, start,
+     +                               edge, stride, 
+     +                               imap, value)
+                if (.not. canConvert) then
+                    if (err .ne. NF_ECHAR)
+     +                  call errore('conversion: ', err)
+                else
+                    if (err .ne. NF_EEDGE)
+     +                  call errore('bad edge: ', err)
+                endif
+                edge(j) = 1
+                stride(j) = 0
+                err = nf_get_varm_double(ncid, i, start,
+     +                               edge, stride, 
+     +                               imap, value)
+                if (.not. canConvert) then
+                    if (err .ne. NF_ECHAR)
+     +                  call errore('conversion: ', err)
+                else
+                    if (err .ne. NF_ESTRIDE)
+     +                  call errore('bad stride: ', err)
+                endif
+                stride(j) = 1
+3           continue
+C               Choose a random point dividing each dim into 2 parts 
+C               get 2^rank (nslabs) slabs so defined 
+            nslabs = 1
+            do 4, j = 1, var_rank(i)
+                mid(j) = roll( var_shape(j,i) )
+                nslabs = nslabs * 2
+4           continue
+C               /* bits of k determine whether to get lower or upper part 
+C                * of dim
+C                * choose random stride from 1 to edge */
+            do 5, k = 1, nslabs
+                nstarts = 1
+                do 6, j = 1, var_rank(i)
+                    if (mod(udshift((k-1), -(j-1)), 2) .ne. 0) then
+                        start(j) = 1
+                        edge(j) = mid(j)
+                    else
+                        start(j) = 1 + mid(j)
+                        edge(j) = var_shape(j,i) - mid(j)
+                    end if
+                    if (edge(j) .gt. 0) then
+                        stride(j) = 1+roll(edge(j))
+                    else
+                        stride(j) = 1
+                    end if
+                    sstride(j) = stride(j)
+                    nstarts = nstarts * stride(j)
+6               continue
+                do 7, m = 1, nstarts
+                    err = index2indexes(m, var_rank(i), sstride, index)
+                    if (err .ne. 0)
+     +                  call error('error in index2indexes')
+                    nels = 1
+                    do 8, j = 1, var_rank(i)
+                        count(j) = 1 + (edge(j) - index(j)) / 
+     +                                  stride(j)
+                        nels = nels * count(j)
+                        index(j) = index(j) + start(j) - 1
+8                   continue
+C                       Random choice of forward or backward 
+C    /* TODO
+C                   if ( roll(2) ) then
+C                       for (j = 0 j < var_rank(i) j++) {
+C                           index(j) += (count(j) - 1) * stride(j)
+C                           stride(j) = -stride(j)
+C                       }
+C                   end if
+C     */
+                    if (var_rank(i) .gt. 0) then
+                        imap(1) = 1
+                        do 9, j = 2, var_rank(i)
+                            imap(j) = imap(j-1) * count(j-1)
+9                       continue
+                    end if
+                    allInIntRange = .true.
+                    allInExtRange = .true.
+                    do 10, j = 1, nels
+                        err = index2indexes(j, var_rank(i), count, 
+     +                                      index2)
+                        if (err .ne. 0)
+     +                      call error('error in index2indexes 1')
+                        do 11, d = 1, var_rank(i)
+                            index2(d) = index(d) + (index2(d)-1) * 
+     +                                  stride(d)
+11                      continue
+                        expect(j) = hash4(var_type(i), var_rank(i), 
+     +                                    index2, NFT_DOUBLE)
+                        if (inRange3(expect(j),var_type(i),
+     +                               NFT_DOUBLE)) then
+                            allInIntRange = 
+     +                          allInIntRange .and.
+     +                          in_internal_range(NFT_DOUBLE,
+     +                                            expect(j))
+                        else
+                            allInExtRange = .false.
+                        end if
+10                  continue
+                    err = nf_get_varm_double(ncid,i,index,count,
+     +                                   stride,imap,
+     +                                   value)
+                    if (canConvert) then
+                        if (allInExtRange) then
+                            if (allInIntRange) then
+                                if (err .ne. 0)
+     +                              call error(nf_strerror(err))
+                            else
+                                if (err .ne. NF_ERANGE)
+     +                              call errore('Range error: ', err)
+                            end if
+                        else
+                            if (err .ne. 0 .and. err .ne. NF_ERANGE)
+     +                          call errore('OK or Range error: ', err)
+                        end if
+                        do 12, j = 1, nels
+                            if (inRange3(expect(j),var_type(i),
+     +                                   NFT_DOUBLE) .and.
+     +                          in_internal_range(NFT_DOUBLE,
+     +                                            expect(j))) then
+                                val = value(j)
+                                if (.not.equal(val, expect(j),
+     +                                         var_type(i), 
+     +                                         NFT_DOUBLE)) then
+                                    call error(
+     +                                  'value read not that expected')
+                                    if (verbose) then
+                                        call error(' ')
+                                        call errori('varid: ', i)
+                                        call errorc('var_name: ', 
+     +                                          var_name(i))
+                                        call errori('element number: ',
+     +                                              j)
+                                        call errord('expect: ', 
+     +                                              expect(j))
+                                        call errord('got: ', val)
+                                    end if
+                                else
+                                    nok = nok + 1
+                                end if
+                            end if
+12                      continue
+                    else
+                        if (nels .gt. 0 .and. err .ne. NF_ECHAR)
+     +                      call errore('wrong type: ', err)
+                    end if
+7               continue
+5           continue
+1       continue
+        err = nf_close(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_close: ',  err)
+        call print_nok(nok)
+        end
+
+
+        subroutine test_nf_get_att_text()
+        use tests
+        implicit        none
+        integer ncid
+        integer i
+        integer j
+        integer k
+        integer err
+        integer ndx(1)
+        logical allInExtRange
+        logical allInIntRange
+        logical canConvert     
+        character    value(MAX_NELS)
+        doubleprecision expect(MAX_NELS)
+        integer nok             
+        doubleprecision val
+
+        nok = 0
+
+        err = nf_open(testfile, NF_NOWRITE, ncid)
+        if (err .ne. 0) 
+     +      call errore('nf_open: ', err)
+
+        do 1, i = 0, NVARS
+            do 2, j = 1, NATTS(i)
+                canConvert = (ATT_TYPE(j,i) .eq. NF_CHAR) .eqv.
+     +                       (NFT_TEXT .eq. NFT_TEXT)
+                err = nf_get_att_text(BAD_ID, i,
+     +                  ATT_NAME(j,i), 
+     +                  value)
+                if (err .ne. NF_EBADID) 
+     +              call errore('bad ncid: ', err)
+                err = nf_get_att_text(ncid, BAD_VARID, 
+     +                              ATT_NAME(j,i), 
+     +                              value)
+                if (err .ne. NF_ENOTVAR) 
+     +              call errore('bad var id: ', err)
+                err = nf_get_att_text(ncid, i, 'noSuch', value)
+                if (err .ne. NF_ENOTATT) 
+     +              call errore('Bad attribute name: ', err)
+                allInIntRange = .true.
+                allInExtRange = .true.
+                do 3, k = 1, ATT_LEN(j,i)
+                    ndx(1) = k
+                    expect(k) = hash4(ATT_TYPE(j,i), -1, ndx, 
+     +                                NFT_TEXT)
+                    if (inRange3(expect(k),ATT_TYPE(j,i),
+     +                           NFT_TEXT)) then
+                        allInIntRange = 
+     +                      allInIntRange .and.
+     +                      in_internal_range(NFT_TEXT, expect(k))
+                    else
+                        allInExtRange = .false.
+                    end if
+3               continue
+                err = nf_get_att_text(ncid, i, ATT_NAME(j,i), value)
+                if (canConvert .or. ATT_LEN(j,i) .eq. 0) then
+                    if (allInExtRange) then
+                        if (allInIntRange) then
+                            if (err .ne. 0)
+     +                          call errore('nf_get_att_text: ', err)
+                        else
+                            if (err .ne. NF_ERANGE)
+     +                          call errore('Range error: ', err)
+                        end if
+                    else
+                        if (err .ne. 0 .and. err .ne. NF_ERANGE)
+     +                      call errore('OK or Range error: ',
+     +                                  err)
+                    end if
+                    do 4, k = 1, ATT_LEN(j,i)
+                        if (inRange3(expect(k),ATT_TYPE(j,i),
+     +                               NFT_TEXT) .and.
+     +                      in_internal_range(NFT_TEXT,
+     +                                        expect(k))) then
+                            val = ichar(value(k))
+                            if (.not.equal(val, expect(k),
+     +                                     ATT_TYPE(j,i), 
+     +                                     NFT_TEXT))then
+                                call error(
+     +                              'value read not that expected')
+                                if (verbose) then
+                                    call error(' ')
+                                    call errori('varid: ', i)
+                                    call errorc('att_name: ', 
+     +                                  ATT_NAME(j,i))
+                                    call errori('element number: ', k)
+                                    call errord('expect: ', expect(k))
+                                    call errord('got: ', val)
+                                end if
+                            else
+                                nok = nok + 1
+                            end if
+                        end if
+4                   continue
+                else
+                    if (err .ne. NF_ECHAR)
+     +                  call errore('wrong type: ', err)
+                end if
+2           continue
+1       continue
+
+        err = nf_close(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_close: ', err)
+        call print_nok(nok)
+        end
+
+#ifdef NF_INT1_T
+        subroutine test_nf_get_att_int1()
+        use tests
+        implicit        none
+        integer ncid
+        integer i
+        integer j
+        integer k
+        integer err
+        integer ndx(1)
+        logical allInExtRange
+        logical allInIntRange
+        logical canConvert     
+        NF_INT1_T    value(MAX_NELS)
+        doubleprecision expect(MAX_NELS)
+        integer nok             
+        doubleprecision val
+
+        nok = 0
+
+        err = nf_open(testfile, NF_NOWRITE, ncid)
+        if (err .ne. 0) 
+     +      call errore('nf_open: ', err)
+
+        do 1, i = 0, NVARS
+            do 2, j = 1, NATTS(i)
+                canConvert = (ATT_TYPE(j,i) .eq. NF_CHAR) .eqv.
+     +                       (NFT_INT1 .eq. NFT_TEXT)
+                err = nf_get_att_int1(BAD_ID, i,
+     +                  ATT_NAME(j,i), 
+     +                  value)
+                if (err .ne. NF_EBADID) 
+     +              call errore('bad ncid: ', err)
+                err = nf_get_att_int1(ncid, BAD_VARID, 
+     +                              ATT_NAME(j,i), 
+     +                              value)
+                if (err .ne. NF_ENOTVAR) 
+     +              call errore('bad var id: ', err)
+                err = nf_get_att_int1(ncid, i, 'noSuch', value)
+                if (err .ne. NF_ENOTATT) 
+     +              call errore('Bad attribute name: ', err)
+                allInIntRange = .true.
+                allInExtRange = .true.
+                do 3, k = 1, ATT_LEN(j,i)
+                    ndx(1) = k
+                    expect(k) = hash4(ATT_TYPE(j,i), -1, ndx, 
+     +                                NFT_INT1)
+                    if (inRange3(expect(k),ATT_TYPE(j,i),
+     +                           NFT_INT1)) then
+                        allInIntRange = 
+     +                      allInIntRange .and.
+     +                      in_internal_range(NFT_INT1, expect(k))
+                    else
+                        allInExtRange = .false.
+                    end if
+3               continue
+                err = nf_get_att_int1(ncid, i, ATT_NAME(j,i), value)
+                if (canConvert .or. ATT_LEN(j,i) .eq. 0) then
+                    if (allInExtRange) then
+                        if (allInIntRange) then
+                            if (err .ne. 0)
+     +                          call errore('nf_get_att_int1: ', err)
+                        else
+                            if (err .ne. NF_ERANGE)
+     +                          call errore('Range error: ', err)
+                        end if
+                    else
+                        if (err .ne. 0 .and. err .ne. NF_ERANGE)
+     +                      call errore('OK or Range error: ',
+     +                                  err)
+                    end if
+                    do 4, k = 1, ATT_LEN(j,i)
+                        if (inRange3(expect(k),ATT_TYPE(j,i),
+     +                               NFT_INT1) .and.
+     +                      in_internal_range(NFT_INT1,
+     +                                        expect(k))) then
+                            val = value(k)
+                            if (.not.equal(val, expect(k),
+     +                                     ATT_TYPE(j,i), 
+     +                                     NFT_INT1))then
+                                call error(
+     +                              'value read not that expected')
+                                if (verbose) then
+                                    call error(' ')
+                                    call errori('varid: ', i)
+                                    call errorc('att_name: ', 
+     +                                  ATT_NAME(j,i))
+                                    call errori('element number: ', k)
+                                    call errord('expect: ', expect(k))
+                                    call errord('got: ', val)
+                                end if
+                            else
+                                nok = nok + 1
+                            end if
+                        end if
+4                   continue
+                else
+                    if (err .ne. NF_ECHAR)
+     +                  call errore('wrong type: ', err)
+                end if
+2           continue
+1       continue
+
+        err = nf_close(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_close: ', err)
+        call print_nok(nok)
+        end
+
+#endif
+#ifdef NF_INT2_T
+        subroutine test_nf_get_att_int2()
+        use tests
+        implicit        none
+        integer ncid
+        integer i
+        integer j
+        integer k
+        integer err
+        integer ndx(1)
+        logical allInExtRange
+        logical allInIntRange
+        logical canConvert     
+        NF_INT2_T    value(MAX_NELS)
+        doubleprecision expect(MAX_NELS)
+        integer nok             
+        doubleprecision val
+
+        nok = 0
+
+        err = nf_open(testfile, NF_NOWRITE, ncid)
+        if (err .ne. 0) 
+     +      call errore('nf_open: ', err)
+
+        do 1, i = 0, NVARS
+            do 2, j = 1, NATTS(i)
+                canConvert = (ATT_TYPE(j,i) .eq. NF_CHAR) .eqv.
+     +                       (NFT_INT2 .eq. NFT_TEXT)
+                err = nf_get_att_int2(BAD_ID, i,
+     +                  ATT_NAME(j,i), 
+     +                  value)
+                if (err .ne. NF_EBADID) 
+     +              call errore('bad ncid: ', err)
+                err = nf_get_att_int2(ncid, BAD_VARID, 
+     +                              ATT_NAME(j,i), 
+     +                              value)
+                if (err .ne. NF_ENOTVAR) 
+     +              call errore('bad var id: ', err)
+                err = nf_get_att_int2(ncid, i, 'noSuch', value)
+                if (err .ne. NF_ENOTATT) 
+     +              call errore('Bad attribute name: ', err)
+                allInIntRange = .true.
+                allInExtRange = .true.
+                do 3, k = 1, ATT_LEN(j,i)
+                    ndx(1) = k
+                    expect(k) = hash4(ATT_TYPE(j,i), -1, ndx, 
+     +                                NFT_INT2)
+                    if (inRange3(expect(k),ATT_TYPE(j,i),
+     +                           NFT_INT2)) then
+                        allInIntRange = 
+     +                      allInIntRange .and.
+     +                      in_internal_range(NFT_INT2, expect(k))
+                    else
+                        allInExtRange = .false.
+                    end if
+3               continue
+                err = nf_get_att_int2(ncid, i, ATT_NAME(j,i), value)
+                if (canConvert .or. ATT_LEN(j,i) .eq. 0) then
+                    if (allInExtRange) then
+                        if (allInIntRange) then
+                            if (err .ne. 0)
+     +                          call errore('nf_get_att_int2: ', err)
+                        else
+                            if (err .ne. NF_ERANGE)
+     +                          call errore('Range error: ', err)
+                        end if
+                    else
+                        if (err .ne. 0 .and. err .ne. NF_ERANGE)
+     +                      call errore('OK or Range error: ',
+     +                                  err)
+                    end if
+                    do 4, k = 1, ATT_LEN(j,i)
+                        if (inRange3(expect(k),ATT_TYPE(j,i),
+     +                               NFT_INT2) .and.
+     +                      in_internal_range(NFT_INT2,
+     +                                        expect(k))) then
+                            val = value(k)
+                            if (.not.equal(val, expect(k),
+     +                                     ATT_TYPE(j,i), 
+     +                                     NFT_INT2))then
+                                call error(
+     +                              'value read not that expected')
+                                if (verbose) then
+                                    call error(' ')
+                                    call errori('varid: ', i)
+                                    call errorc('att_name: ', 
+     +                                  ATT_NAME(j,i))
+                                    call errori('element number: ', k)
+                                    call errord('expect: ', expect(k))
+                                    call errord('got: ', val)
+                                end if
+                            else
+                                nok = nok + 1
+                            end if
+                        end if
+4                   continue
+                else
+                    if (err .ne. NF_ECHAR)
+     +                  call errore('wrong type: ', err)
+                end if
+2           continue
+1       continue
+
+        err = nf_close(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_close: ', err)
+        call print_nok(nok)
+        end
+
+#endif
+        subroutine test_nf_get_att_int()
+        use tests
+        implicit        none
+        integer ncid
+        integer i
+        integer j
+        integer k
+        integer err
+        integer ndx(1)
+        logical allInExtRange
+        logical allInIntRange
+        logical canConvert     
+        integer    value(MAX_NELS)
+        doubleprecision expect(MAX_NELS)
+        integer nok             
+        doubleprecision val
+
+        nok = 0
+
+        err = nf_open(testfile, NF_NOWRITE, ncid)
+        if (err .ne. 0) 
+     +      call errore('nf_open: ', err)
+
+        do 1, i = 0, NVARS
+            do 2, j = 1, NATTS(i)
+                canConvert = (ATT_TYPE(j,i) .eq. NF_CHAR) .eqv.
+     +                       (NFT_INT .eq. NFT_TEXT)
+                err = nf_get_att_int(BAD_ID, i,
+     +                  ATT_NAME(j,i), 
+     +                  value)
+                if (err .ne. NF_EBADID) 
+     +              call errore('bad ncid: ', err)
+                err = nf_get_att_int(ncid, BAD_VARID, 
+     +                              ATT_NAME(j,i), 
+     +                              value)
+                if (err .ne. NF_ENOTVAR) 
+     +              call errore('bad var id: ', err)
+                err = nf_get_att_int(ncid, i, 'noSuch', value)
+                if (err .ne. NF_ENOTATT) 
+     +              call errore('Bad attribute name: ', err)
+                allInIntRange = .true.
+                allInExtRange = .true.
+                do 3, k = 1, ATT_LEN(j,i)
+                    ndx(1) = k
+                    expect(k) = hash4(ATT_TYPE(j,i), -1, ndx, 
+     +                                NFT_INT)
+                    if (inRange3(expect(k),ATT_TYPE(j,i),
+     +                           NFT_INT)) then
+                        allInIntRange = 
+     +                      allInIntRange .and.
+     +                      in_internal_range(NFT_INT, expect(k))
+                    else
+                        allInExtRange = .false.
+                    end if
+3               continue
+                err = nf_get_att_int(ncid, i, ATT_NAME(j,i), value)
+                if (canConvert .or. ATT_LEN(j,i) .eq. 0) then
+                    if (allInExtRange) then
+                        if (allInIntRange) then
+                            if (err .ne. 0)
+     +                          call errore('nf_get_att_int: ', err)
+                        else
+                            if (err .ne. NF_ERANGE)
+     +                          call errore('Range error: ', err)
+                        end if
+                    else
+                        if (err .ne. 0 .and. err .ne. NF_ERANGE)
+     +                      call errore('OK or Range error: ',
+     +                                  err)
+                    end if
+                    do 4, k = 1, ATT_LEN(j,i)
+                        if (inRange3(expect(k),ATT_TYPE(j,i),
+     +                               NFT_INT) .and.
+     +                      in_internal_range(NFT_INT,
+     +                                        expect(k))) then
+                            val = value(k)
+                            if (.not.equal(val, expect(k),
+     +                                     ATT_TYPE(j,i), 
+     +                                     NFT_INT))then
+                                call error(
+     +                              'value read not that expected')
+                                if (verbose) then
+                                    call error(' ')
+                                    call errori('varid: ', i)
+                                    call errorc('att_name: ', 
+     +                                  ATT_NAME(j,i))
+                                    call errori('element number: ', k)
+                                    call errord('expect: ', expect(k))
+                                    call errord('got: ', val)
+                                end if
+                            else
+                                nok = nok + 1
+                            end if
+                        end if
+4                   continue
+                else
+                    if (err .ne. NF_ECHAR)
+     +                  call errore('wrong type: ', err)
+                end if
+2           continue
+1       continue
+
+        err = nf_close(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_close: ', err)
+        call print_nok(nok)
+        end
+
+        subroutine test_nf_get_att_real()
+        use tests
+        implicit        none
+        integer ncid
+        integer i
+        integer j
+        integer k
+        integer err
+        integer ndx(1)
+        logical allInExtRange
+        logical allInIntRange
+        logical canConvert     
+        real    value(MAX_NELS)
+        doubleprecision expect(MAX_NELS)
+        integer nok             
+        doubleprecision val
+
+        nok = 0
+
+        err = nf_open(testfile, NF_NOWRITE, ncid)
+        if (err .ne. 0) 
+     +      call errore('nf_open: ', err)
+
+        do 1, i = 0, NVARS
+            do 2, j = 1, NATTS(i)
+                canConvert = (ATT_TYPE(j,i) .eq. NF_CHAR) .eqv.
+     +                       (NFT_REAL .eq. NFT_TEXT)
+                err = nf_get_att_real(BAD_ID, i,
+     +                  ATT_NAME(j,i), 
+     +                  value)
+                if (err .ne. NF_EBADID) 
+     +              call errore('bad ncid: ', err)
+                err = nf_get_att_real(ncid, BAD_VARID, 
+     +                              ATT_NAME(j,i), 
+     +                              value)
+                if (err .ne. NF_ENOTVAR) 
+     +              call errore('bad var id: ', err)
+                err = nf_get_att_real(ncid, i, 'noSuch', value)
+                if (err .ne. NF_ENOTATT) 
+     +              call errore('Bad attribute name: ', err)
+                allInIntRange = .true.
+                allInExtRange = .true.
+                do 3, k = 1, ATT_LEN(j,i)
+                    ndx(1) = k
+                    expect(k) = hash4(ATT_TYPE(j,i), -1, ndx, 
+     +                                NFT_REAL)
+                    if (inRange3(expect(k),ATT_TYPE(j,i),
+     +                           NFT_REAL)) then
+                        allInIntRange = 
+     +                      allInIntRange .and.
+     +                      in_internal_range(NFT_REAL, expect(k))
+                    else
+                        allInExtRange = .false.
+                    end if
+3               continue
+                err = nf_get_att_real(ncid, i, ATT_NAME(j,i), value)
+                if (canConvert .or. ATT_LEN(j,i) .eq. 0) then
+                    if (allInExtRange) then
+                        if (allInIntRange) then
+                            if (err .ne. 0)
+     +                          call errore('nf_get_att_real: ', err)
+                        else
+                            if (err .ne. NF_ERANGE)
+     +                          call errore('Range error: ', err)
+                        end if
+                    else
+                        if (err .ne. 0 .and. err .ne. NF_ERANGE)
+     +                      call errore('OK or Range error: ',
+     +                                  err)
+                    end if
+                    do 4, k = 1, ATT_LEN(j,i)
+                        if (inRange3(expect(k),ATT_TYPE(j,i),
+     +                               NFT_REAL) .and.
+     +                      in_internal_range(NFT_REAL,
+     +                                        expect(k))) then
+                            val = value(k)
+                            if (.not.equal(val, expect(k),
+     +                                     ATT_TYPE(j,i), 
+     +                                     NFT_REAL))then
+                                call error(
+     +                              'value read not that expected')
+                                if (verbose) then
+                                    call error(' ')
+                                    call errori('varid: ', i)
+                                    call errorc('att_name: ', 
+     +                                  ATT_NAME(j,i))
+                                    call errori('element number: ', k)
+                                    call errord('expect: ', expect(k))
+                                    call errord('got: ', val)
+                                end if
+                            else
+                                nok = nok + 1
+                            end if
+                        end if
+4                   continue
+                else
+                    if (err .ne. NF_ECHAR)
+     +                  call errore('wrong type: ', err)
+                end if
+2           continue
+1       continue
+
+        err = nf_close(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_close: ', err)
+        call print_nok(nok)
+        end
+
+        subroutine test_nf_get_att_double()
+        use tests
+        implicit        none
+        integer ncid
+        integer i
+        integer j
+        integer k
+        integer err
+        integer ndx(1)
+        logical allInExtRange
+        logical allInIntRange
+        logical canConvert     
+        doubleprecision    value(MAX_NELS)
+        doubleprecision expect(MAX_NELS)
+        integer nok             
+        doubleprecision val
+
+        nok = 0
+
+        err = nf_open(testfile, NF_NOWRITE, ncid)
+        if (err .ne. 0) 
+     +      call errore('nf_open: ', err)
+
+        do 1, i = 0, NVARS
+            do 2, j = 1, NATTS(i)
+                canConvert = (ATT_TYPE(j,i) .eq. NF_CHAR) .eqv.
+     +                       (NFT_DOUBLE .eq. NFT_TEXT)
+                err = nf_get_att_double(BAD_ID, i,
+     +                  ATT_NAME(j,i), 
+     +                  value)
+                if (err .ne. NF_EBADID) 
+     +              call errore('bad ncid: ', err)
+                err = nf_get_att_double(ncid, BAD_VARID, 
+     +                              ATT_NAME(j,i), 
+     +                              value)
+                if (err .ne. NF_ENOTVAR) 
+     +              call errore('bad var id: ', err)
+                err = nf_get_att_double(ncid, i, 'noSuch', value)
+                if (err .ne. NF_ENOTATT) 
+     +              call errore('Bad attribute name: ', err)
+                allInIntRange = .true.
+                allInExtRange = .true.
+                do 3, k = 1, ATT_LEN(j,i)
+                    ndx(1) = k
+                    expect(k) = hash4(ATT_TYPE(j,i), -1, ndx, 
+     +                                NFT_DOUBLE)
+                    if (inRange3(expect(k),ATT_TYPE(j,i),
+     +                           NFT_DOUBLE)) then
+                        allInIntRange = 
+     +                      allInIntRange .and.
+     +                      in_internal_range(NFT_DOUBLE, expect(k))
+                    else
+                        allInExtRange = .false.
+                    end if
+3               continue
+                err = nf_get_att_double(ncid, i, ATT_NAME(j,i), value)
+                if (canConvert .or. ATT_LEN(j,i) .eq. 0) then
+                    if (allInExtRange) then
+                        if (allInIntRange) then
+                            if (err .ne. 0)
+     +                          call errore('nf_get_att_double: ', err)
+                        else
+                            if (err .ne. NF_ERANGE)
+     +                          call errore('Range error: ', err)
+                        end if
+                    else
+                        if (err .ne. 0 .and. err .ne. NF_ERANGE)
+     +                      call errore('OK or Range error: ',
+     +                                  err)
+                    end if
+                    do 4, k = 1, ATT_LEN(j,i)
+                        if (inRange3(expect(k),ATT_TYPE(j,i),
+     +                               NFT_DOUBLE) .and.
+     +                      in_internal_range(NFT_DOUBLE,
+     +                                        expect(k))) then
+                            val = value(k)
+                            if (.not.equal(val, expect(k),
+     +                                     ATT_TYPE(j,i), 
+     +                                     NFT_DOUBLE))then
+                                call error(
+     +                              'value read not that expected')
+                                if (verbose) then
+                                    call error(' ')
+                                    call errori('varid: ', i)
+                                    call errorc('att_name: ', 
+     +                                  ATT_NAME(j,i))
+                                    call errori('element number: ', k)
+                                    call errord('expect: ', expect(k))
+                                    call errord('got: ', val)
+                                end if
+                            else
+                                nok = nok + 1
+                            end if
+                        end if
+4                   continue
+                else
+                    if (err .ne. NF_ECHAR)
+     +                  call errore('wrong type: ', err)
+                end if
+2           continue
+1       continue
+
+        err = nf_close(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_close: ', err)
+        call print_nok(nok)
+        end
+
diff --git a/nf03_test/test03_put.F b/nf03_test/test03_put.F
new file mode 100755
index 0000000..50d3eaf
--- /dev/null
+++ b/nf03_test/test03_put.F
@@ -0,0 +1,6647 @@
+#include "nfconfig.inc"
+C Do not edit this file. It is produced from the corresponding .m4 source */
+
+C********************************************************************
+C   Copyright 1996, UCAR/Unidata
+C   See netcdf/COPYRIGHT file for copying and redistribution conditions.
+C   $Id: test_put.m4,v 1.16 2008/04/30 16:50:45 ed Exp $
+C********************************************************************
+
+C
+C ensure hash value within range for internal TYPE
+C
+        function hash_text(type, rank, index, itype)
+        use tests, ONLY: internal_min, internal_max, RK8, hash4
+        implicit        none
+        integer type
+        integer rank
+        integer index(1)
+        integer itype
+        doubleprecision minimum
+        doubleprecision maximum
+        real(RK8) hash_text
+        minimum = internal_min(itype)
+        maximum = internal_max(itype)
+
+        hash_text = max(minimum, min(maximum, hash4( type, rank,
+     +      index, itype)))
+        end
+
+#ifdef NF_INT1_T
+C
+C ensure hash value within range for internal TYPE
+C
+        function hash_int1(type, rank, index, itype)
+        use tests, ONLY: internal_min, internal_max, RK8, hash4
+        implicit        none
+        integer type
+        integer rank
+        integer index(1)
+        integer itype
+        real(RK8) hash_int1
+        doubleprecision minimum
+        doubleprecision maximum
+
+        minimum = internal_min(itype)
+        maximum = internal_max(itype)
+
+        hash_int1 = max(minimum, min(maximum, hash4( type, rank,
+     +      index, itype)))
+        end
+
+#endif
+#ifdef NF_INT2_T
+C
+C ensure hash value within range for internal TYPE
+C
+        function hash_int2(type, rank, index, itype)
+        use tests, ONLY: internal_min, internal_max, RK8, hash4
+        implicit        none
+        integer type
+        integer rank
+        integer index(1)
+        integer itype
+        doubleprecision minimum
+        doubleprecision maximum
+        real(RK8) hash_int2
+        minimum = internal_min(itype)
+        maximum = internal_max(itype)
+
+        hash_int2 = max(minimum, min(maximum, hash4( type, rank,
+     +      index, itype)))
+        end
+
+#endif
+C
+C ensure hash value within range for internal TYPE
+C
+        function hash_int(type, rank, index, itype)
+        use tests, ONLY: internal_min, internal_max, RK8, hash4
+        implicit        none
+        integer type
+        integer rank
+        integer index(1)
+        integer itype
+        real(RK8) hash_int
+        doubleprecision minimum
+        doubleprecision maximum
+
+        minimum = internal_min(itype)
+        maximum = internal_max(itype)
+
+        hash_int = max(minimum, min(maximum, hash4( type, rank,
+     +      index, itype)))
+        end
+
+C
+C ensure hash value within range for internal TYPE
+C
+        function hash_real(type, rank, index, itype)
+        use tests, ONLY: internal_min, internal_max, RK8, hash4
+        implicit        none
+        integer type
+        integer rank
+        integer index(1)
+        integer itype
+        real(RK8) hash_real
+        doubleprecision minimum
+        doubleprecision maximum
+
+        minimum = internal_min(itype)
+        maximum = internal_max(itype)
+
+        hash_real = max(minimum, min(maximum, hash4( type, rank,
+     +      index, itype)))
+        end
+
+C
+C ensure hash value within range for internal TYPE
+C
+        function hash_double(type, rank, index, itype)
+        use tests, ONLY: internal_min, internal_max, RK8, hash4
+        implicit        none
+        integer type
+        integer rank
+        integer index(1)
+        integer itype
+        real(RK8) hash_double
+        doubleprecision minimum
+        doubleprecision maximum
+
+        minimum = internal_min(itype)
+        maximum = internal_max(itype)
+
+        hash_double = max(minimum, min(maximum, hash4( type, rank,
+     +      index, itype)))
+        end
+
+
+C
+C check all vars in file which are (text/numeric) compatible with TYPE
+C
+        subroutine check_vars_text(filename)
+        use tests, NDIMSG=>NDIMS, NGATTSG=>NGATTS
+        implicit        none
+        character*(*)   filename
+        integer  ncid          !/* netCDF id */
+        integer index(MAX_RANK)
+        integer  err           !/* status */
+        integer  d
+        integer  i
+        integer  j
+        character    value
+        integer datatype
+        integer ndims
+        integer dimids(MAX_RANK)
+        integer ngatts
+        doubleprecision expect
+        character*(NF_MAX_NAME) name
+        integer length
+        logical canConvert      !/* Both text or both numeric */
+        integer nok             !/* count of valid comparisons */
+        doubleprecision val
+
+        nok = 0
+
+        err = nf_open(filename, NF_NOWRITE, ncid)
+        if (err .ne. 0)
+     +      call errore('nf_open: ', err)
+
+        do 1, i = 1, NVARS
+            canConvert = (var_type(i) .eq. NF_CHAR) .eqv.
+     +                   (NFT_TEXT .eq. NFT_TEXT)
+            if (canConvert)  then
+                err = nf_inq_var(ncid, i, name, datatype, ndims, dimids,
+     +                           ngatts)
+                if (err .ne. 0)
+     +              call errore('nf_inq_var: ', err)
+                if (name .ne. var_name(i))
+     +              call error('Unexpected var_name')
+                if (datatype .ne. var_type(i))
+     +              call error('Unexpected type')
+                if (ndims .ne. var_rank(i))
+     +              call error('Unexpected rank')
+                do 2, j = 1, ndims
+                    err = nf_inq_dim(ncid, dimids(j), name, length)
+                    if (err .ne. 0)
+     +                  call errore('nf_inq_dim: ', err)
+                    if (length .ne. var_shape(j,i))
+     +                  call error('Unexpected shape')
+2               continue
+                do 3, j = 1, var_nels(i)
+                    err = index2indexes(j, var_rank(i), var_shape(1,i), 
+     +                                  index)
+                    if (err .ne. 0)
+     +                  call error('error in index2indexes()')
+                    expect = hash4( var_type(i), var_rank(i), index, 
+     +                             NFT_TEXT)
+                    err = nf_get_var1_text(ncid, i, index, value)
+                    if (inRange3(expect,datatype,NFT_TEXT))  then
+                        if (in_internal_range(NFT_TEXT, 
+     +                                        expect)) then
+                            if (err .ne. 0)  then
+                                call errore('nf_get_var1_text: ', err)
+                            else
+                                val = ichar(value)
+                                if (.not.equal(
+     +                              val,
+     +                              expect,var_type(i),
+     +                              NFT_TEXT))  then
+                                    call error(
+     +                          'Var value read not that expected')
+                                    if (verbose)  then
+                                        call error(' ')
+                                        call errori('varid: %d', i)
+                                        call errorc('var_name: ', 
+     +                                          var_name(i))
+                                        call error('index:')
+                                        do 4, d = 1, var_rank(i)
+                                            call errori(' ', index(d))
+4                                       continue
+                                        call errord('expect: ', expect)
+                                        call errord('got: ',  val)
+                                    end if
+                                else
+                                    nok = nok + 1
+                                end if
+                            end if
+                        end if
+                    end if
+3               continue
+            end if
+1       continue
+        err = nf_close (ncid)
+        if (err .ne. 0)
+     +      call errore('nf_close: ', err)
+        call print_nok(nok)
+        end
+
+#ifdef NF_INT1_T
+C
+C check all vars in file which are (text/numeric) compatible with TYPE
+C
+        subroutine check_vars_int1(filename)
+        use tests, NDIMSG=>NDIMS, NGATTSG=>NGATTS
+        implicit        none
+        character*(*)   filename
+        integer  ncid          !/* netCDF id */
+        integer index(MAX_RANK)
+        integer  err           !/* status */
+        integer  d
+        integer  i
+        integer  j
+        NF_INT1_T    value
+        integer datatype
+        integer ndims
+        integer dimids(MAX_RANK)
+        integer ngatts
+        doubleprecision expect
+        character*(NF_MAX_NAME) name
+        integer length
+        logical canConvert      !/* Both text or both numeric */
+        integer nok             !/* count of valid comparisons */
+        doubleprecision val
+
+        nok = 0
+
+        err = nf_open(filename, NF_NOWRITE, ncid)
+        if (err .ne. 0)
+     +      call errore('nf_open: ', err)
+
+        do 1, i = 1, NVARS
+            canConvert = (var_type(i) .eq. NF_CHAR) .eqv.
+     +                   (NFT_INT1 .eq. NFT_TEXT)
+            if (canConvert)  then
+                err = nf_inq_var(ncid, i, name, datatype, ndims, dimids,
+     +                           ngatts)
+                if (err .ne. 0)
+     +              call errore('nf_inq_var: ', err)
+                if (name .ne. var_name(i))
+     +              call error('Unexpected var_name')
+                if (datatype .ne. var_type(i))
+     +              call error('Unexpected type')
+                if (ndims .ne. var_rank(i))
+     +              call error('Unexpected rank')
+                do 2, j = 1, ndims
+                    err = nf_inq_dim(ncid, dimids(j), name, length)
+                    if (err .ne. 0)
+     +                  call errore('nf_inq_dim: ', err)
+                    if (length .ne. var_shape(j,i))
+     +                  call error('Unexpected shape')
+2               continue
+                do 3, j = 1, var_nels(i)
+                    err = index2indexes(j, var_rank(i), var_shape(1,i), 
+     +                                  index)
+                    if (err .ne. 0)
+     +                  call error('error in index2indexes()')
+                    expect = hash4( var_type(i), var_rank(i), index, 
+     +                             NFT_INT1)
+                    err = nf_get_var1_int1(ncid, i, index, value)
+                    if (inRange3(expect,datatype,NFT_INT1))  then
+                        if (in_internal_range(NFT_INT1, 
+     +                                        expect)) then
+                            if (err .ne. 0)  then
+                                call errore('nf_get_var1_int1: ', err)
+                            else
+                                val = value
+                                if (.not.equal(
+     +                              val,
+     +                              expect,var_type(i),
+     +                              NFT_INT1))  then
+                                    call error(
+     +                          'Var value read not that expected')
+                                    if (verbose)  then
+                                        call error(' ')
+                                        call errori('varid: %d', i)
+                                        call errorc('var_name: ', 
+     +                                          var_name(i))
+                                        call error('index:')
+                                        do 4, d = 1, var_rank(i)
+                                            call errori(' ', index(d))
+4                                       continue
+                                        call errord('expect: ', expect)
+                                        call errord('got: ',  val)
+                                    end if
+                                else
+                                    nok = nok + 1
+                                end if
+                            end if
+                        end if
+                    end if
+3               continue
+            end if
+1       continue
+        err = nf_close (ncid)
+        if (err .ne. 0)
+     +      call errore('nf_close: ', err)
+        call print_nok(nok)
+        end
+
+#endif
+#ifdef NF_INT2_T
+C
+C check all vars in file which are (text/numeric) compatible with TYPE
+C
+        subroutine check_vars_int2(filename)
+        use tests, NDIMSG=>NDIMS, NGATTSG=>NGATTS
+        implicit        none
+        character*(*)   filename
+        integer  ncid          !/* netCDF id */
+        integer index(MAX_RANK)
+        integer  err           !/* status */
+        integer  d
+        integer  i
+        integer  j
+        NF_INT2_T    value
+        integer datatype
+        integer ndims
+        integer dimids(MAX_RANK)
+        integer ngatts
+        doubleprecision expect
+        character*(NF_MAX_NAME) name
+        integer length
+        logical canConvert      !/* Both text or both numeric */
+        integer nok             !/* count of valid comparisons */
+        doubleprecision val
+
+        nok = 0
+
+        err = nf_open(filename, NF_NOWRITE, ncid)
+        if (err .ne. 0)
+     +      call errore('nf_open: ', err)
+
+        do 1, i = 1, NVARS
+            canConvert = (var_type(i) .eq. NF_CHAR) .eqv.
+     +                   (NFT_INT2 .eq. NFT_TEXT)
+            if (canConvert)  then
+                err = nf_inq_var(ncid, i, name, datatype, ndims, dimids,
+     +                           ngatts)
+                if (err .ne. 0)
+     +              call errore('nf_inq_var: ', err)
+                if (name .ne. var_name(i))
+     +              call error('Unexpected var_name')
+                if (datatype .ne. var_type(i))
+     +              call error('Unexpected type')
+                if (ndims .ne. var_rank(i))
+     +              call error('Unexpected rank')
+                do 2, j = 1, ndims
+                    err = nf_inq_dim(ncid, dimids(j), name, length)
+                    if (err .ne. 0)
+     +                  call errore('nf_inq_dim: ', err)
+                    if (length .ne. var_shape(j,i))
+     +                  call error('Unexpected shape')
+2               continue
+                do 3, j = 1, var_nels(i)
+                    err = index2indexes(j, var_rank(i), var_shape(1,i), 
+     +                                  index)
+                    if (err .ne. 0)
+     +                  call error('error in index2indexes()')
+                    expect = hash4( var_type(i), var_rank(i), index, 
+     +                             NFT_INT2)
+                    err = nf_get_var1_int2(ncid, i, index, value)
+                    if (inRange3(expect,datatype,NFT_INT2))  then
+                        if (in_internal_range(NFT_INT2, 
+     +                                        expect)) then
+                            if (err .ne. 0)  then
+                                call errore('nf_get_var1_int2: ', err)
+                            else
+                                val = value
+                                if (.not.equal(
+     +                              val,
+     +                              expect,var_type(i),
+     +                              NFT_INT2))  then
+                                    call error(
+     +                          'Var value read not that expected')
+                                    if (verbose)  then
+                                        call error(' ')
+                                        call errori('varid: %d', i)
+                                        call errorc('var_name: ', 
+     +                                          var_name(i))
+                                        call error('index:')
+                                        do 4, d = 1, var_rank(i)
+                                            call errori(' ', index(d))
+4                                       continue
+                                        call errord('expect: ', expect)
+                                        call errord('got: ',  val)
+                                    end if
+                                else
+                                    nok = nok + 1
+                                end if
+                            end if
+                        end if
+                    end if
+3               continue
+            end if
+1       continue
+        err = nf_close (ncid)
+        if (err .ne. 0)
+     +      call errore('nf_close: ', err)
+        call print_nok(nok)
+        end
+
+#endif
+C
+C check all vars in file which are (text/numeric) compatible with TYPE
+C
+        subroutine check_vars_int(filename)
+        use tests, NDIMSG=>NDIMS, NGATTSG=>NGATTS
+        implicit        none
+        character*(*)   filename
+        integer  ncid          !/* netCDF id */
+        integer index(MAX_RANK)
+        integer  err           !/* status */
+        integer  d
+        integer  i
+        integer  j
+        integer    value
+        integer datatype
+        integer ndims
+        integer dimids(MAX_RANK)
+        integer ngatts
+        doubleprecision expect
+        character*(NF_MAX_NAME) name
+        integer length
+        logical canConvert      !/* Both text or both numeric */
+        integer nok             !/* count of valid comparisons */
+        doubleprecision val
+
+        nok = 0
+
+        err = nf_open(filename, NF_NOWRITE, ncid)
+        if (err .ne. 0)
+     +      call errore('nf_open: ', err)
+
+        do 1, i = 1, NVARS
+            canConvert = (var_type(i) .eq. NF_CHAR) .eqv.
+     +                   (NFT_INT .eq. NFT_TEXT)
+            if (canConvert)  then
+                err = nf_inq_var(ncid, i, name, datatype, ndims, dimids,
+     +                           ngatts)
+                if (err .ne. 0)
+     +              call errore('nf_inq_var: ', err)
+                if (name .ne. var_name(i))
+     +              call error('Unexpected var_name')
+                if (datatype .ne. var_type(i))
+     +              call error('Unexpected type')
+                if (ndims .ne. var_rank(i))
+     +              call error('Unexpected rank')
+                do 2, j = 1, ndims
+                    err = nf_inq_dim(ncid, dimids(j), name, length)
+                    if (err .ne. 0)
+     +                  call errore('nf_inq_dim: ', err)
+                    if (length .ne. var_shape(j,i))
+     +                  call error('Unexpected shape')
+2               continue
+                do 3, j = 1, var_nels(i)
+                    err = index2indexes(j, var_rank(i), var_shape(1,i), 
+     +                                  index)
+                    if (err .ne. 0)
+     +                  call error('error in index2indexes()')
+                    expect = hash4( var_type(i), var_rank(i), index, 
+     +                             NFT_INT)
+                    err = nf_get_var1_int(ncid, i, index, value)
+                    if (inRange3(expect,datatype,NFT_INT))  then
+                        if (in_internal_range(NFT_INT, 
+     +                                        expect)) then
+                            if (err .ne. 0)  then
+                                call errore('nf_get_var1_int: ', err)
+                            else
+                                val = value
+                                if (.not.equal(
+     +                              val,
+     +                              expect,var_type(i),
+     +                              NFT_INT))  then
+                                    call error(
+     +                          'Var value read not that expected')
+                                    if (verbose)  then
+                                        call error(' ')
+                                        call errori('varid: %d', i)
+                                        call errorc('var_name: ', 
+     +                                          var_name(i))
+                                        call error('index:')
+                                        do 4, d = 1, var_rank(i)
+                                            call errori(' ', index(d))
+4                                       continue
+                                        call errord('expect: ', expect)
+                                        call errord('got: ',  val)
+                                    end if
+                                else
+                                    nok = nok + 1
+                                end if
+                            end if
+                        end if
+                    end if
+3               continue
+            end if
+1       continue
+        err = nf_close (ncid)
+        if (err .ne. 0)
+     +      call errore('nf_close: ', err)
+        call print_nok(nok)
+        end
+
+C
+C check all vars in file which are (text/numeric) compatible with TYPE
+C
+        subroutine check_vars_real(filename)
+        use tests, NDIMSG=>NDIMS, NGATTSG=>NGATTS
+        use tests
+        implicit        none
+        character*(*)   filename
+        integer  ncid          !/* netCDF id */
+        integer index(MAX_RANK)
+        integer  err           !/* status */
+        integer  d
+        integer  i
+        integer  j
+        real    value
+        integer datatype
+        integer ndims
+        integer dimids(MAX_RANK)
+        integer ngatts
+        doubleprecision expect
+        character*(NF_MAX_NAME) name
+        integer length
+        logical canConvert      !/* Both text or both numeric */
+        integer nok             !/* count of valid comparisons */
+        doubleprecision val
+
+        nok = 0
+
+        err = nf_open(filename, NF_NOWRITE, ncid)
+        if (err .ne. 0)
+     +      call errore('nf_open: ', err)
+
+        do 1, i = 1, NVARS
+            canConvert = (var_type(i) .eq. NF_CHAR) .eqv.
+     +                   (NFT_REAL .eq. NFT_TEXT)
+            if (canConvert)  then
+                err = nf_inq_var(ncid, i, name, datatype, ndims, dimids,
+     +                           ngatts)
+                if (err .ne. 0)
+     +              call errore('nf_inq_var: ', err)
+                if (name .ne. var_name(i))
+     +              call error('Unexpected var_name')
+                if (datatype .ne. var_type(i))
+     +              call error('Unexpected type')
+                if (ndims .ne. var_rank(i))
+     +              call error('Unexpected rank')
+                do 2, j = 1, ndims
+                    err = nf_inq_dim(ncid, dimids(j), name, length)
+                    if (err .ne. 0)
+     +                  call errore('nf_inq_dim: ', err)
+                    if (length .ne. var_shape(j,i))
+     +                  call error('Unexpected shape')
+2               continue
+                do 3, j = 1, var_nels(i)
+                    err = index2indexes(j, var_rank(i), var_shape(1,i), 
+     +                                  index)
+                    if (err .ne. 0)
+     +                  call error('error in index2indexes()')
+                    expect = hash4( var_type(i), var_rank(i), index, 
+     +                             NFT_REAL)
+                    err = nf_get_var1_real(ncid, i, index, value)
+                    if (inRange3(expect,datatype,NFT_REAL))  then
+                        if (in_internal_range(NFT_REAL, 
+     +                                        expect)) then
+                            if (err .ne. 0)  then
+                                call errore('nf_get_var1_real: ', err)
+                            else
+                                val = value
+                                if (.not.equal(
+     +                              val,
+     +                              expect,var_type(i),
+     +                              NFT_REAL))  then
+                                    call error(
+     +                          'Var value read not that expected')
+                                    if (verbose)  then
+                                        call error(' ')
+                                        call errori('varid: %d', i)
+                                        call errorc('var_name: ', 
+     +                                          var_name(i))
+                                        call error('index:')
+                                        do 4, d = 1, var_rank(i)
+                                            call errori(' ', index(d))
+4                                       continue
+                                        call errord('expect: ', expect)
+                                        call errord('got: ',  val)
+                                    end if
+                                else
+                                    nok = nok + 1
+                                end if
+                            end if
+                        end if
+                    end if
+3               continue
+            end if
+1       continue
+        err = nf_close (ncid)
+        if (err .ne. 0)
+     +      call errore('nf_close: ', err)
+        call print_nok(nok)
+        end
+
+C
+C check all vars in file which are (text/numeric) compatible with TYPE
+C
+        subroutine check_vars_double(filename)
+        use tests, NDIMSG=>NDIMS, NGATTSG=>NGATTS
+        implicit        none
+        character*(*)   filename
+        integer  ncid          !/* netCDF id */
+        integer index(MAX_RANK)
+        integer  err           !/* status */
+        integer  d
+        integer  i
+        integer  j
+        doubleprecision    value
+        integer datatype
+        integer ndims
+        integer dimids(MAX_RANK)
+        integer ngatts
+        doubleprecision expect
+        character*(NF_MAX_NAME) name
+        integer length
+        logical canConvert      !/* Both text or both numeric */
+        integer nok             !/* count of valid comparisons */
+        doubleprecision val
+
+        nok = 0
+
+        err = nf_open(filename, NF_NOWRITE, ncid)
+        if (err .ne. 0)
+     +      call errore('nf_open: ', err)
+
+        do 1, i = 1, NVARS
+            canConvert = (var_type(i) .eq. NF_CHAR) .eqv.
+     +                   (NFT_DOUBLE .eq. NFT_TEXT)
+            if (canConvert)  then
+                err = nf_inq_var(ncid, i, name, datatype, ndims, dimids,
+     +                           ngatts)
+                if (err .ne. 0)
+     +              call errore('nf_inq_var: ', err)
+                if (name .ne. var_name(i))
+     +              call error('Unexpected var_name')
+                if (datatype .ne. var_type(i))
+     +              call error('Unexpected type')
+                if (ndims .ne. var_rank(i))
+     +              call error('Unexpected rank')
+                do 2, j = 1, ndims
+                    err = nf_inq_dim(ncid, dimids(j), name, length)
+                    if (err .ne. 0)
+     +                  call errore('nf_inq_dim: ', err)
+                    if (length .ne. var_shape(j,i))
+     +                  call error('Unexpected shape')
+2               continue
+                do 3, j = 1, var_nels(i)
+                    err = index2indexes(j, var_rank(i), var_shape(1,i), 
+     +                                  index)
+                    if (err .ne. 0)
+     +                  call error('error in index2indexes()')
+                    expect = hash4( var_type(i), var_rank(i), index, 
+     +                             NFT_DOUBLE)
+                    err = nf_get_var1_double(ncid, i, index, value)
+                    if (inRange3(expect,datatype,NFT_DOUBLE))  then
+                        if (in_internal_range(NFT_DOUBLE, 
+     +                                        expect)) then
+                            if (err .ne. 0)  then
+                                call errore('nf_get_var1_double: ', err)
+                            else
+                                val = value
+                                if (.not.equal(
+     +                              val,
+     +                              expect,var_type(i),
+     +                              NFT_DOUBLE))  then
+                                    call error(
+     +                          'Var value read not that expected')
+                                    if (verbose)  then
+                                        call error(' ')
+                                        call errori('varid: %d', i)
+                                        call errorc('var_name: ', 
+     +                                          var_name(i))
+                                        call error('index:')
+                                        do 4, d = 1, var_rank(i)
+                                            call errori(' ', index(d))
+4                                       continue
+                                        call errord('expect: ', expect)
+                                        call errord('got: ',  val)
+                                    end if
+                                else
+                                    nok = nok + 1
+                                end if
+                            end if
+                        end if
+                    end if
+3               continue
+            end if
+1       continue
+        err = nf_close (ncid)
+        if (err .ne. 0)
+     +      call errore('nf_close: ', err)
+        call print_nok(nok)
+        end
+
+
+C/* 
+C *  check all attributes in file which are (text/numeric) compatible with TYPE
+C *  ignore any attributes containing values outside range of TYPE
+C */
+        subroutine check_atts_text(ncid)
+        use tests
+        implicit        none
+        integer ncid
+        integer  err           !/* status */
+        integer  i
+        integer  j
+        integer  k
+        integer ndx(1)
+        character    value(MAX_NELS)
+        integer datatype
+        doubleprecision expect(MAX_NELS)
+        integer length
+        integer nInExtRange     !/* number values within external range */
+        integer nInIntRange     !/* number values within internal range */
+        logical canConvert      !/* Both text or both numeric */
+        integer nok             !/* count of valid comparisons */
+        doubleprecision val
+
+        nok = 0
+
+        do 1, i = 0, NVARS
+            do 2, j = 1, NATTS(i)
+                canConvert = (ATT_TYPE(j,i) .eq. NF_CHAR) .eqv.
+     +                       (NFT_TEXT .eq. NFT_TEXT)
+                if (canConvert) then
+                    err = nf_inq_att(ncid, i, ATT_NAME(j,i), datatype, 
+     +                               length)
+                    if (err .ne. 0)
+     +                  call errore('nf_inq_att: ', err)
+                    if (datatype .ne. ATT_TYPE(j,i))
+     +                  call error('nf_inq_att: unexpected type')
+                    if (length .ne. ATT_LEN(j,i))
+     +                  call error('nf_inq_att: unexpected length')
+                    if (.not.(length .le. MAX_NELS))
+     +                  stop 2
+                    nInIntRange = 0
+                    nInExtRange = 0
+                    do 4, k = 1, length
+                        ndx(1) = k
+                        expect(k) = hash4( datatype, -1, ndx, 
+     +                                    NFT_TEXT)
+                        if (inRange3(expect(k), datatype, 
+     +                               NFT_TEXT)) then
+                            nInExtRange = nInExtRange + 1
+                            if (in_internal_range(NFT_TEXT,
+     +                                            expect(k)))
+     +                          nInIntRange = nInIntRange + 1
+                        end if
+4                   continue
+                    err = nf_get_att_text(ncid, i, 
+     +                                  ATT_NAME(j,i), value)
+                    if (nInExtRange .eq. length .and. 
+     +                  nInIntRange .eq. length) then
+                        if (err .ne. 0)
+     +                      call error(nf_strerror(err))
+                    else
+                        if (err .ne. 0 .and. err .ne. NF_ERANGE)
+     +                      call errore('OK or Range error: ', err)
+                    end if
+                    do 3, k = 1, length
+                        if (inRange3(expect(k),datatype,NFT_TEXT)
+     +                          .and. 
+     +                          in_internal_range(NFT_TEXT, 
+     +                                            expect(k))) then
+                            val = ichar(value(k))
+                            if (.not.equal(
+     +                          val,
+     +                          expect(k),datatype,
+     +                          NFT_TEXT)) then
+                                call error(
+     +                              'att. value read not that expected')
+                                if (verbose) then
+                                    call error(' ')
+                                    call errori('varid: ', i)
+                                    call errorc('att_name: ', 
+     +                                  ATT_NAME(j,i))
+                                    call errori('element number: ', k)
+                                    call errord('expect: ', expect(k))
+                                    call errord('got: ',  val)
+                                end if
+                            else
+                                nok = nok + 1
+                            end if
+                        end if
+3                   continue
+                end if                                               
+2           continue
+1       continue
+
+        call print_nok(nok)
+        end
+
+#ifdef NF_INT1_T
+C/* 
+C *  check all attributes in file which are (text/numeric) compatible with TYPE
+C *  ignore any attributes containing values outside range of TYPE
+C */
+        subroutine check_atts_int1(ncid)
+        use tests
+        implicit        none
+        integer ncid
+        integer  err           !/* status */
+        integer  i
+        integer  j
+        integer  k
+        integer ndx(1)
+        NF_INT1_T    value(MAX_NELS)
+        integer datatype
+        doubleprecision expect(MAX_NELS)
+        integer length
+        integer nInExtRange     !/* number values within external range */
+        integer nInIntRange     !/* number values within internal range */
+        logical canConvert      !/* Both text or both numeric */
+        integer nok             !/* count of valid comparisons */
+        doubleprecision val
+
+        nok = 0
+
+        do 1, i = 0, NVARS
+            do 2, j = 1, NATTS(i)
+                canConvert = (ATT_TYPE(j,i) .eq. NF_CHAR) .eqv.
+     +                       (NFT_INT1 .eq. NFT_TEXT)
+                if (canConvert) then
+                    err = nf_inq_att(ncid, i, ATT_NAME(j,i), datatype, 
+     +                               length)
+                    if (err .ne. 0)
+     +                  call errore('nf_inq_att: ', err)
+                    if (datatype .ne. ATT_TYPE(j,i))
+     +                  call error('nf_inq_att: unexpected type')
+                    if (length .ne. ATT_LEN(j,i))
+     +                  call error('nf_inq_att: unexpected length')
+                    if (.not.(length .le. MAX_NELS))
+     +                  stop 2
+                    nInIntRange = 0
+                    nInExtRange = 0
+                    do 4, k = 1, length
+                        ndx(1) = k
+                        expect(k) = hash4( datatype, -1, ndx, 
+     +                                    NFT_INT1)
+                        if (inRange3(expect(k), datatype, 
+     +                               NFT_INT1)) then
+                            nInExtRange = nInExtRange + 1
+                            if (in_internal_range(NFT_INT1,
+     +                                            expect(k)))
+     +                          nInIntRange = nInIntRange + 1
+                        end if
+4                   continue
+                    err = nf_get_att_int1(ncid, i, 
+     +                                  ATT_NAME(j,i), value)
+                    if (nInExtRange .eq. length .and. 
+     +                  nInIntRange .eq. length) then
+                        if (err .ne. 0)
+     +                      call error(nf_strerror(err))
+                    else
+                        if (err .ne. 0 .and. err .ne. NF_ERANGE)
+     +                      call errore('OK or Range error: ', err)
+                    end if
+                    do 3, k = 1, length
+                        if (inRange3(expect(k),datatype,NFT_INT1)
+     +                          .and. 
+     +                          in_internal_range(NFT_INT1, 
+     +                                            expect(k))) then
+                            val = value(k)
+                            if (.not.equal(
+     +                          val,
+     +                          expect(k),datatype,
+     +                          NFT_INT1)) then
+                                call error(
+     +                              'att. value read not that expected')
+                                if (verbose) then
+                                    call error(' ')
+                                    call errori('varid: ', i)
+                                    call errorc('att_name: ', 
+     +                                  ATT_NAME(j,i))
+                                    call errori('element number: ', k)
+                                    call errord('expect: ', expect(k))
+                                    call errord('got: ',  val)
+                                end if
+                            else
+                                nok = nok + 1
+                            end if
+                        end if
+3                   continue
+                end if                                               
+2           continue
+1       continue
+
+        call print_nok(nok)
+        end
+
+#endif
+#ifdef NF_INT2_T
+C/* 
+C *  check all attributes in file which are (text/numeric) compatible with TYPE
+C *  ignore any attributes containing values outside range of TYPE
+C */
+        subroutine check_atts_int2(ncid)
+        use tests
+        implicit        none
+        integer ncid
+        integer  err           !/* status */
+        integer  i
+        integer  j
+        integer  k
+        integer ndx(1)
+        NF_INT2_T    value(MAX_NELS)
+        integer datatype
+        doubleprecision expect(MAX_NELS)
+        integer length
+        integer nInExtRange     !/* number values within external range */
+        integer nInIntRange     !/* number values within internal range */
+        logical canConvert      !/* Both text or both numeric */
+        integer nok             !/* count of valid comparisons */
+        doubleprecision val
+
+        nok = 0
+
+        do 1, i = 0, NVARS
+            do 2, j = 1, NATTS(i)
+                canConvert = (ATT_TYPE(j,i) .eq. NF_CHAR) .eqv.
+     +                       (NFT_INT2 .eq. NFT_TEXT)
+                if (canConvert) then
+                    err = nf_inq_att(ncid, i, ATT_NAME(j,i), datatype, 
+     +                               length)
+                    if (err .ne. 0)
+     +                  call errore('nf_inq_att: ', err)
+                    if (datatype .ne. ATT_TYPE(j,i))
+     +                  call error('nf_inq_att: unexpected type')
+                    if (length .ne. ATT_LEN(j,i))
+     +                  call error('nf_inq_att: unexpected length')
+                    if (.not.(length .le. MAX_NELS))
+     +                  stop 2
+                    nInIntRange = 0
+                    nInExtRange = 0
+                    do 4, k = 1, length
+                        ndx(1) = k
+                        expect(k) = hash4( datatype, -1, ndx, 
+     +                                    NFT_INT2)
+                        if (inRange3(expect(k), datatype, 
+     +                               NFT_INT2)) then
+                            nInExtRange = nInExtRange + 1
+                            if (in_internal_range(NFT_INT2,
+     +                                            expect(k)))
+     +                          nInIntRange = nInIntRange + 1
+                        end if
+4                   continue
+                    err = nf_get_att_int2(ncid, i, 
+     +                                  ATT_NAME(j,i), value)
+                    if (nInExtRange .eq. length .and. 
+     +                  nInIntRange .eq. length) then
+                        if (err .ne. 0)
+     +                      call error(nf_strerror(err))
+                    else
+                        if (err .ne. 0 .and. err .ne. NF_ERANGE)
+     +                      call errore('OK or Range error: ', err)
+                    end if
+                    do 3, k = 1, length
+                        if (inRange3(expect(k),datatype,NFT_INT2)
+     +                          .and. 
+     +                          in_internal_range(NFT_INT2, 
+     +                                            expect(k))) then
+                            val = value(k)
+                            if (.not.equal(
+     +                          val,
+     +                          expect(k),datatype,
+     +                          NFT_INT2)) then
+                                call error(
+     +                              'att. value read not that expected')
+                                if (verbose) then
+                                    call error(' ')
+                                    call errori('varid: ', i)
+                                    call errorc('att_name: ', 
+     +                                  ATT_NAME(j,i))
+                                    call errori('element number: ', k)
+                                    call errord('expect: ', expect(k))
+                                    call errord('got: ',  val)
+                                end if
+                            else
+                                nok = nok + 1
+                            end if
+                        end if
+3                   continue
+                end if                                               
+2           continue
+1       continue
+
+        call print_nok(nok)
+        end
+
+#endif
+C/* 
+C *  check all attributes in file which are (text/numeric) compatible with TYPE
+C *  ignore any attributes containing values outside range of TYPE
+C */
+        subroutine check_atts_int(ncid)
+        use tests
+        implicit        none
+        integer ncid
+        integer  err           !/* status */
+        integer  i
+        integer  j
+        integer  k
+        integer ndx(1)
+        integer    value(MAX_NELS)
+        integer datatype
+        doubleprecision expect(MAX_NELS)
+        integer length
+        integer nInExtRange     !/* number values within external range */
+        integer nInIntRange     !/* number values within internal range */
+        logical canConvert      !/* Both text or both numeric */
+        integer nok             !/* count of valid comparisons */
+        doubleprecision val
+
+        nok = 0
+
+        do 1, i = 0, NVARS
+            do 2, j = 1, NATTS(i)
+                canConvert = (ATT_TYPE(j,i) .eq. NF_CHAR) .eqv.
+     +                       (NFT_INT .eq. NFT_TEXT)
+                if (canConvert) then
+                    err = nf_inq_att(ncid, i, ATT_NAME(j,i), datatype, 
+     +                               length)
+                    if (err .ne. 0)
+     +                  call errore('nf_inq_att: ', err)
+                    if (datatype .ne. ATT_TYPE(j,i))
+     +                  call error('nf_inq_att: unexpected type')
+                    if (length .ne. ATT_LEN(j,i))
+     +                  call error('nf_inq_att: unexpected length')
+                    if (.not.(length .le. MAX_NELS))
+     +                  stop 2
+                    nInIntRange = 0
+                    nInExtRange = 0
+                    do 4, k = 1, length
+                        ndx(1) = k
+                        expect(k) = hash4( datatype, -1, ndx, 
+     +                                    NFT_INT)
+                        if (inRange3(expect(k), datatype, 
+     +                               NFT_INT)) then
+                            nInExtRange = nInExtRange + 1
+                            if (in_internal_range(NFT_INT,
+     +                                            expect(k)))
+     +                          nInIntRange = nInIntRange + 1
+                        end if
+4                   continue
+                    err = nf_get_att_int(ncid, i, 
+     +                                  ATT_NAME(j,i), value)
+                    if (nInExtRange .eq. length .and. 
+     +                  nInIntRange .eq. length) then
+                        if (err .ne. 0)
+     +                      call error(nf_strerror(err))
+                    else
+                        if (err .ne. 0 .and. err .ne. NF_ERANGE)
+     +                      call errore('OK or Range error: ', err)
+                    end if
+                    do 3, k = 1, length
+                        if (inRange3(expect(k),datatype,NFT_INT)
+     +                          .and. 
+     +                          in_internal_range(NFT_INT, 
+     +                                            expect(k))) then
+                            val = value(k)
+                            if (.not.equal(
+     +                          val,
+     +                          expect(k),datatype,
+     +                          NFT_INT)) then
+                                call error(
+     +                              'att. value read not that expected')
+                                if (verbose) then
+                                    call error(' ')
+                                    call errori('varid: ', i)
+                                    call errorc('att_name: ', 
+     +                                  ATT_NAME(j,i))
+                                    call errori('element number: ', k)
+                                    call errord('expect: ', expect(k))
+                                    call errord('got: ',  val)
+                                end if
+                            else
+                                nok = nok + 1
+                            end if
+                        end if
+3                   continue
+                end if                                               
+2           continue
+1       continue
+
+        call print_nok(nok)
+        end
+
+C/* 
+C *  check all attributes in file which are (text/numeric) compatible with TYPE
+C *  ignore any attributes containing values outside range of TYPE
+C */
+        subroutine check_atts_real(ncid)
+        use tests
+        implicit        none
+        integer ncid
+        integer  err           !/* status */
+        integer  i
+        integer  j
+        integer  k
+        integer ndx(1)
+        real    value(MAX_NELS)
+        integer datatype
+        doubleprecision expect(MAX_NELS)
+        integer length
+        integer nInExtRange     !/* number values within external range */
+        integer nInIntRange     !/* number values within internal range */
+        logical canConvert      !/* Both text or both numeric */
+        integer nok             !/* count of valid comparisons */
+        doubleprecision val
+
+        nok = 0
+
+        do 1, i = 0, NVARS
+            do 2, j = 1, NATTS(i)
+                canConvert = (ATT_TYPE(j,i) .eq. NF_CHAR) .eqv.
+     +                       (NFT_REAL .eq. NFT_TEXT)
+                if (canConvert) then
+                    err = nf_inq_att(ncid, i, ATT_NAME(j,i), datatype, 
+     +                               length)
+                    if (err .ne. 0)
+     +                  call errore('nf_inq_att: ', err)
+                    if (datatype .ne. ATT_TYPE(j,i))
+     +                  call error('nf_inq_att: unexpected type')
+                    if (length .ne. ATT_LEN(j,i))
+     +                  call error('nf_inq_att: unexpected length')
+                    if (.not.(length .le. MAX_NELS))
+     +                  stop 2
+                    nInIntRange = 0
+                    nInExtRange = 0
+                    do 4, k = 1, length
+                        ndx(1) = k
+                        expect(k) = hash4( datatype, -1, ndx, 
+     +                                    NFT_REAL)
+                        if (inRange3(expect(k), datatype, 
+     +                               NFT_REAL)) then
+                            nInExtRange = nInExtRange + 1
+                            if (in_internal_range(NFT_REAL,
+     +                                            expect(k)))
+     +                          nInIntRange = nInIntRange + 1
+                        end if
+4                   continue
+                    err = nf_get_att_real(ncid, i, 
+     +                                  ATT_NAME(j,i), value)
+                    if (nInExtRange .eq. length .and. 
+     +                  nInIntRange .eq. length) then
+                        if (err .ne. 0)
+     +                      call error(nf_strerror(err))
+                    else
+                        if (err .ne. 0 .and. err .ne. NF_ERANGE)
+     +                      call errore('OK or Range error: ', err)
+                    end if
+                    do 3, k = 1, length
+                        if (inRange3(expect(k),datatype,NFT_REAL)
+     +                          .and. 
+     +                          in_internal_range(NFT_REAL, 
+     +                                            expect(k))) then
+                            val = value(k)
+                            if (.not.equal(
+     +                          val,
+     +                          expect(k),datatype,
+     +                          NFT_REAL)) then
+                                call error(
+     +                              'att. value read not that expected')
+                                if (verbose) then
+                                    call error(' ')
+                                    call errori('varid: ', i)
+                                    call errorc('att_name: ', 
+     +                                  ATT_NAME(j,i))
+                                    call errori('element number: ', k)
+                                    call errord('expect: ', expect(k))
+                                    call errord('got: ',  val)
+                                end if
+                            else
+                                nok = nok + 1
+                            end if
+                        end if
+3                   continue
+                end if                                               
+2           continue
+1       continue
+
+        call print_nok(nok)
+        end
+
+C/* 
+C *  check all attributes in file which are (text/numeric) compatible with TYPE
+C *  ignore any attributes containing values outside range of TYPE
+C */
+        subroutine check_atts_double(ncid)
+        use tests
+        implicit        none
+        integer ncid
+        integer  err           !/* status */
+        integer  i
+        integer  j
+        integer  k
+        integer ndx(1)
+        doubleprecision    value(MAX_NELS)
+        integer datatype
+        doubleprecision expect(MAX_NELS)
+        integer length
+        integer nInExtRange     !/* number values within external range */
+        integer nInIntRange     !/* number values within internal range */
+        logical canConvert      !/* Both text or both numeric */
+        integer nok             !/* count of valid comparisons */
+        doubleprecision val
+
+        nok = 0
+
+        do 1, i = 0, NVARS
+            do 2, j = 1, NATTS(i)
+                canConvert = (ATT_TYPE(j,i) .eq. NF_CHAR) .eqv.
+     +                       (NFT_DOUBLE .eq. NFT_TEXT)
+                if (canConvert) then
+                    err = nf_inq_att(ncid, i, ATT_NAME(j,i), datatype, 
+     +                               length)
+                    if (err .ne. 0)
+     +                  call errore('nf_inq_att: ', err)
+                    if (datatype .ne. ATT_TYPE(j,i))
+     +                  call error('nf_inq_att: unexpected type')
+                    if (length .ne. ATT_LEN(j,i))
+     +                  call error('nf_inq_att: unexpected length')
+                    if (.not.(length .le. MAX_NELS))
+     +                  stop 2
+                    nInIntRange = 0
+                    nInExtRange = 0
+                    do 4, k = 1, length
+                        ndx(1) = k
+                        expect(k) = hash4( datatype, -1, ndx, 
+     +                                    NFT_DOUBLE)
+                        if (inRange3(expect(k), datatype, 
+     +                               NFT_DOUBLE)) then
+                            nInExtRange = nInExtRange + 1
+                            if (in_internal_range(NFT_DOUBLE,
+     +                                            expect(k)))
+     +                          nInIntRange = nInIntRange + 1
+                        end if
+4                   continue
+                    err = nf_get_att_double(ncid, i, 
+     +                                  ATT_NAME(j,i), value)
+                    if (nInExtRange .eq. length .and. 
+     +                  nInIntRange .eq. length) then
+                        if (err .ne. 0)
+     +                      call error(nf_strerror(err))
+                    else
+                        if (err .ne. 0 .and. err .ne. NF_ERANGE)
+     +                      call errore('OK or Range error: ', err)
+                    end if
+                    do 3, k = 1, length
+                        if (inRange3(expect(k),datatype,NFT_DOUBLE)
+     +                          .and. 
+     +                          in_internal_range(NFT_DOUBLE, 
+     +                                            expect(k))) then
+                            val = value(k)
+                            if (.not.equal(
+     +                          val,
+     +                          expect(k),datatype,
+     +                          NFT_DOUBLE)) then
+                                call error(
+     +                              'att. value read not that expected')
+                                if (verbose) then
+                                    call error(' ')
+                                    call errori('varid: ', i)
+                                    call errorc('att_name: ', 
+     +                                  ATT_NAME(j,i))
+                                    call errori('element number: ', k)
+                                    call errord('expect: ', expect(k))
+                                    call errord('got: ',  val)
+                                end if
+                            else
+                                nok = nok + 1
+                            end if
+                        end if
+3                   continue
+                end if                                               
+2           continue
+1       continue
+
+        call print_nok(nok)
+        end
+
+
+        subroutine test_nf_put_var1_text()
+        use tests
+        implicit        none
+        integer ncid
+        integer i
+        integer j
+        integer err
+        integer index(MAX_RANK)
+        logical canConvert      !/* Both text or both numeric */
+        character    value
+        doubleprecision val
+
+        value = char(int(5))!/* any value would do - only for error cases */
+
+        err = nf_create(scratch, NF_CLOBBER, ncid)
+        if (err .ne. 0) then
+            call errore('nf_create: ', err)
+            return
+        end if
+        call def_dims(ncid)
+        call def_vars(ncid)
+        err = nf_enddef(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_enddef: ', err)
+
+        do 1, i = 1, NVARS
+            canConvert = (var_type(i) .eq. NF_CHAR) .eqv.
+     +                   (NFT_TEXT .eq. NFT_TEXT)
+            do 2, j = 1, var_rank(i)
+                index(j) = 1
+2           continue
+            err = nf_put_var1_text(BAD_ID, i, index, value)
+            if (err .ne. NF_EBADID) 
+     +          call errore('bad ncid: ', err)
+            err = nf_put_var1_text(ncid, BAD_VARID,
+     +                           index, value)
+            if (err .ne. NF_ENOTVAR) 
+     +          call errore('bad var id: ', err)
+            do 3, j = 1, var_rank(i)
+                if (var_dimid(j,i) .gt. 1) then         !/* skip record dim */
+                    index(j) = var_shape(j,i) + 1
+                    err = nf_put_var1_text(ncid, i,
+     +                                   index, value)
+                    if (.not. canConvert) then
+                        if (err .ne. NF_ECHAR)
+     +                      call errore('conversion: ', err)
+                        else
+                            if (err .ne. NF_EINVALCOORDS)
+     +                          call errore('bad index: ', err)
+                        endif
+                    index(j) = 0
+                end if
+3           continue
+            do 4, j = 1, var_nels(i)
+                err = index2indexes(j, var_rank(i), var_shape(1,i), 
+     +                              index)
+                if (err .ne. 0) 
+     +              call error('error in index2indexes 1')
+                value = char(int(hash_text(var_type(i),var_rank(i),
+     +                            index, NFT_TEXT)))
+                err = nf_put_var1_text(ncid, i, index, value)
+                if (canConvert) then
+                    val = ichar(value)
+                    if (inRange3(val, var_type(i), NFT_TEXT)) then
+                        if (err .ne. 0)
+     +                      call error(nf_strerror(err))
+                    else
+                        if (err .ne. NF_ERANGE)
+     +                      call errore('Range error: ', err)
+                    end if
+                else
+                    if (err .ne. NF_ECHAR)
+     +                  call errore('wrong type: ', err)
+                end if
+4           continue
+1       continue
+
+        err = nf_close(ncid)
+        if (err .ne. 0) 
+     +      call errore('nf_close: ', err)
+
+        call check_vars_text(scratch)
+
+        err = nf_delete(scratch)
+        if (err .ne. 0)
+     +      call errorc('delete of scratch file failed: ', 
+     +                  scratch)
+        end
+
+#ifdef NF_INT1_T
+        subroutine test_nf_put_var1_int1()
+        use tests
+        implicit        none
+        integer ncid
+        integer i
+        integer j
+        integer err
+        integer index(MAX_RANK)
+        logical canConvert      !/* Both text or both numeric */
+        NF_INT1_T    value
+        doubleprecision val
+
+        value = 5!/* any value would do - only for error cases */
+
+        err = nf_create(scratch, NF_CLOBBER, ncid)
+        if (err .ne. 0) then
+            call errore('nf_create: ', err)
+            return
+        end if
+        call def_dims(ncid)
+        call def_vars(ncid)
+        err = nf_enddef(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_enddef: ', err)
+
+        do 1, i = 1, NVARS
+            canConvert = (var_type(i) .eq. NF_CHAR) .eqv.
+     +                   (NFT_INT1 .eq. NFT_TEXT)
+            do 2, j = 1, var_rank(i)
+                index(j) = 1
+2           continue
+            err = nf_put_var1_int1(BAD_ID, i, index, value)
+            if (err .ne. NF_EBADID) 
+     +          call errore('bad ncid: ', err)
+            err = nf_put_var1_int1(ncid, BAD_VARID,
+     +                           index, value)
+            if (err .ne. NF_ENOTVAR) 
+     +          call errore('bad var id: ', err)
+            do 3, j = 1, var_rank(i)
+                if (var_dimid(j,i) .gt. 1) then         !/* skip record dim */
+                    index(j) = var_shape(j,i) + 1
+                    err = nf_put_var1_int1(ncid, i,
+     +                                   index, value)
+                    if (.not. canConvert) then
+                        if (err .ne. NF_ECHAR)
+     +                      call errore('conversion: ', err)
+                        else
+                            if (err .ne. NF_EINVALCOORDS)
+     +                          call errore('bad index: ', err)
+                        endif
+                    index(j) = 0
+                end if
+3           continue
+            do 4, j = 1, var_nels(i)
+                err = index2indexes(j, var_rank(i), var_shape(1,i), 
+     +                              index)
+                if (err .ne. 0) 
+     +              call error('error in index2indexes 1')
+                value = hash_int1(var_type(i),var_rank(i),
+     +                            index, NFT_INT1)
+                err = nf_put_var1_int1(ncid, i, index, value)
+                if (canConvert) then
+                    val = value
+                    if (inRange3(val, var_type(i), NFT_INT1)) then
+                        if (err .ne. 0)
+     +                      call error(nf_strerror(err))
+                    else
+                        if (err .ne. NF_ERANGE)
+     +                      call errore('Range error: ', err)
+                    end if
+                else
+                    if (err .ne. NF_ECHAR)
+     +                  call errore('wrong type: ', err)
+                end if
+4           continue
+1       continue
+
+        err = nf_close(ncid)
+        if (err .ne. 0) 
+     +      call errore('nf_close: ', err)
+
+        call check_vars_int1(scratch)
+
+        err = nf_delete(scratch)
+        if (err .ne. 0)
+     +      call errorc('delete of scratch file failed: ', 
+     +                  scratch)
+        end
+
+#endif
+#ifdef NF_INT2_T
+        subroutine test_nf_put_var1_int2()
+        use tests
+        implicit        none
+        integer ncid
+        integer i
+        integer j
+        integer err
+        integer index(MAX_RANK)
+        logical canConvert      !/* Both text or both numeric */
+        NF_INT2_T    value
+        doubleprecision val
+
+        value = 5!/* any value would do - only for error cases */
+
+        err = nf_create(scratch, NF_CLOBBER, ncid)
+        if (err .ne. 0) then
+            call errore('nf_create: ', err)
+            return
+        end if
+        call def_dims(ncid)
+        call def_vars(ncid)
+        err = nf_enddef(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_enddef: ', err)
+
+        do 1, i = 1, NVARS
+            canConvert = (var_type(i) .eq. NF_CHAR) .eqv.
+     +                   (NFT_INT2 .eq. NFT_TEXT)
+            do 2, j = 1, var_rank(i)
+                index(j) = 1
+2           continue
+            err = nf_put_var1_int2(BAD_ID, i, index, value)
+            if (err .ne. NF_EBADID) 
+     +          call errore('bad ncid: ', err)
+            err = nf_put_var1_int2(ncid, BAD_VARID,
+     +                           index, value)
+            if (err .ne. NF_ENOTVAR) 
+     +          call errore('bad var id: ', err)
+            do 3, j = 1, var_rank(i)
+                if (var_dimid(j,i) .gt. 1) then         !/* skip record dim */
+                    index(j) = var_shape(j,i) + 1
+                    err = nf_put_var1_int2(ncid, i,
+     +                                   index, value)
+                    if (.not. canConvert) then
+                        if (err .ne. NF_ECHAR)
+     +                      call errore('conversion: ', err)
+                        else
+                            if (err .ne. NF_EINVALCOORDS)
+     +                          call errore('bad index: ', err)
+                        endif
+                    index(j) = 0
+                end if
+3           continue
+            do 4, j = 1, var_nels(i)
+                err = index2indexes(j, var_rank(i), var_shape(1,i), 
+     +                              index)
+                if (err .ne. 0) 
+     +              call error('error in index2indexes 1')
+                value = hash_int2(var_type(i),var_rank(i),
+     +                            index, NFT_INT2)
+                err = nf_put_var1_int2(ncid, i, index, value)
+                if (canConvert) then
+                    val = value
+                    if (inRange3(val, var_type(i), NFT_INT2)) then
+                        if (err .ne. 0)
+     +                      call error(nf_strerror(err))
+                    else
+                        if (err .ne. NF_ERANGE)
+     +                      call errore('Range error: ', err)
+                    end if
+                else
+                    if (err .ne. NF_ECHAR)
+     +                  call errore('wrong type: ', err)
+                end if
+4           continue
+1       continue
+
+        err = nf_close(ncid)
+        if (err .ne. 0) 
+     +      call errore('nf_close: ', err)
+
+        call check_vars_int2(scratch)
+
+        err = nf_delete(scratch)
+        if (err .ne. 0)
+     +      call errorc('delete of scratch file failed: ', 
+     +                  scratch)
+        end
+
+#endif
+        subroutine test_nf_put_var1_int()
+        use tests
+        implicit        none
+        integer ncid
+        integer i
+        integer j
+        integer err
+        integer index(MAX_RANK)
+        logical canConvert      !/* Both text or both numeric */
+        integer    value
+        doubleprecision val
+
+        value = 5!/* any value would do - only for error cases */
+
+        err = nf_create(scratch, NF_CLOBBER, ncid)
+        if (err .ne. 0) then
+            call errore('nf_create: ', err)
+            return
+        end if
+        call def_dims(ncid)
+        call def_vars(ncid)
+        err = nf_enddef(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_enddef: ', err)
+
+        do 1, i = 1, NVARS
+            canConvert = (var_type(i) .eq. NF_CHAR) .eqv.
+     +                   (NFT_INT .eq. NFT_TEXT)
+            do 2, j = 1, var_rank(i)
+                index(j) = 1
+2           continue
+            err = nf_put_var1_int(BAD_ID, i, index, value)
+            if (err .ne. NF_EBADID) 
+     +          call errore('bad ncid: ', err)
+            err = nf_put_var1_int(ncid, BAD_VARID,
+     +                           index, value)
+            if (err .ne. NF_ENOTVAR) 
+     +          call errore('bad var id: ', err)
+            do 3, j = 1, var_rank(i)
+                if (var_dimid(j,i) .gt. 1) then         !/* skip record dim */
+                    index(j) = var_shape(j,i) + 1
+                    err = nf_put_var1_int(ncid, i,
+     +                                   index, value)
+                    if (.not. canConvert) then
+                        if (err .ne. NF_ECHAR)
+     +                      call errore('conversion: ', err)
+                        else
+                            if (err .ne. NF_EINVALCOORDS)
+     +                          call errore('bad index: ', err)
+                        endif
+                    index(j) = 0
+                end if
+3           continue
+            do 4, j = 1, var_nels(i)
+                err = index2indexes(j, var_rank(i), var_shape(1,i), 
+     +                              index)
+                if (err .ne. 0) 
+     +              call error('error in index2indexes 1')
+                value = hash_int(var_type(i),var_rank(i),
+     +                            index, NFT_INT)
+                err = nf_put_var1_int(ncid, i, index, value)
+                if (canConvert) then
+                    val = value
+                    if (inRange3(val, var_type(i), NFT_INT)) then
+                        if (err .ne. 0)
+     +                      call error(nf_strerror(err))
+                    else
+                        if (err .ne. NF_ERANGE)
+     +                      call errore('Range error: ', err)
+                    end if
+                else
+                    if (err .ne. NF_ECHAR)
+     +                  call errore('wrong type: ', err)
+                end if
+4           continue
+1       continue
+
+        err = nf_close(ncid)
+        if (err .ne. 0) 
+     +      call errore('nf_close: ', err)
+
+        call check_vars_int(scratch)
+
+        err = nf_delete(scratch)
+        if (err .ne. 0)
+     +      call errorc('delete of scratch file failed: ', 
+     +                  scratch)
+        end
+
+        subroutine test_nf_put_var1_real()
+        use tests
+        implicit        none
+        integer ncid
+        integer i
+        integer j
+        integer err
+        integer index(MAX_RANK)
+        logical canConvert      !/* Both text or both numeric */
+        real    value
+        doubleprecision val
+
+        value = 5!/* any value would do - only for error cases */
+
+        err = nf_create(scratch, NF_CLOBBER, ncid)
+        if (err .ne. 0) then
+            call errore('nf_create: ', err)
+            return
+        end if
+        call def_dims(ncid)
+        call def_vars(ncid)
+        err = nf_enddef(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_enddef: ', err)
+
+        do 1, i = 1, NVARS
+            canConvert = (var_type(i) .eq. NF_CHAR) .eqv.
+     +                   (NFT_REAL .eq. NFT_TEXT)
+            do 2, j = 1, var_rank(i)
+                index(j) = 1
+2           continue
+            err = nf_put_var1_real(BAD_ID, i, index, value)
+            if (err .ne. NF_EBADID) 
+     +          call errore('bad ncid: ', err)
+            err = nf_put_var1_real(ncid, BAD_VARID,
+     +                           index, value)
+            if (err .ne. NF_ENOTVAR) 
+     +          call errore('bad var id: ', err)
+            do 3, j = 1, var_rank(i)
+                if (var_dimid(j,i) .gt. 1) then         !/* skip record dim */
+                    index(j) = var_shape(j,i) + 1
+                    err = nf_put_var1_real(ncid, i,
+     +                                   index, value)
+                    if (.not. canConvert) then
+                        if (err .ne. NF_ECHAR)
+     +                      call errore('conversion: ', err)
+                        else
+                            if (err .ne. NF_EINVALCOORDS)
+     +                          call errore('bad index: ', err)
+                        endif
+                    index(j) = 0
+                end if
+3           continue
+            do 4, j = 1, var_nels(i)
+                err = index2indexes(j, var_rank(i), var_shape(1,i), 
+     +                              index)
+                if (err .ne. 0) 
+     +              call error('error in index2indexes 1')
+                value = hash_real(var_type(i),var_rank(i),
+     +                            index, NFT_REAL)
+                err = nf_put_var1_real(ncid, i, index, value)
+                if (canConvert) then
+                    val = value
+                    if (inRange3(val, var_type(i), NFT_REAL)) then
+                        if (err .ne. 0)
+     +                      call error(nf_strerror(err))
+                    else
+                        if (err .ne. NF_ERANGE)
+     +                      call errore('Range error: ', err)
+                    end if
+                else
+                    if (err .ne. NF_ECHAR)
+     +                  call errore('wrong type: ', err)
+                end if
+4           continue
+1       continue
+
+        err = nf_close(ncid)
+        if (err .ne. 0) 
+     +      call errore('nf_close: ', err)
+
+        call check_vars_real(scratch)
+
+        err = nf_delete(scratch)
+        if (err .ne. 0)
+     +      call errorc('delete of scratch file failed: ', 
+     +                  scratch)
+        end
+
+        subroutine test_nf_put_var1_double()
+        use tests
+        implicit        none
+        integer ncid
+        integer i
+        integer j
+        integer err
+        integer index(MAX_RANK)
+        logical canConvert      !/* Both text or both numeric */
+        doubleprecision    value
+        doubleprecision val
+
+        value = 5!/* any value would do - only for error cases */
+
+        err = nf_create(scratch, NF_CLOBBER, ncid)
+        if (err .ne. 0) then
+            call errore('nf_create: ', err)
+            return
+        end if
+        call def_dims(ncid)
+        call def_vars(ncid)
+        err = nf_enddef(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_enddef: ', err)
+
+        do 1, i = 1, NVARS
+            canConvert = (var_type(i) .eq. NF_CHAR) .eqv.
+     +                   (NFT_DOUBLE .eq. NFT_TEXT)
+            do 2, j = 1, var_rank(i)
+                index(j) = 1
+2           continue
+            err = nf_put_var1_double(BAD_ID, i, index, value)
+            if (err .ne. NF_EBADID) 
+     +          call errore('bad ncid: ', err)
+            err = nf_put_var1_double(ncid, BAD_VARID,
+     +                           index, value)
+            if (err .ne. NF_ENOTVAR) 
+     +          call errore('bad var id: ', err)
+            do 3, j = 1, var_rank(i)
+                if (var_dimid(j,i) .gt. 1) then         !/* skip record dim */
+                    index(j) = var_shape(j,i) + 1
+                    err = nf_put_var1_double(ncid, i,
+     +                                   index, value)
+                    if (.not. canConvert) then
+                        if (err .ne. NF_ECHAR)
+     +                      call errore('conversion: ', err)
+                        else
+                            if (err .ne. NF_EINVALCOORDS)
+     +                          call errore('bad index: ', err)
+                        endif
+                    index(j) = 0
+                end if
+3           continue
+            do 4, j = 1, var_nels(i)
+                err = index2indexes(j, var_rank(i), var_shape(1,i), 
+     +                              index)
+                if (err .ne. 0) 
+     +              call error('error in index2indexes 1')
+                value = hash_double(var_type(i),var_rank(i),
+     +                            index, NFT_DOUBLE)
+                err = nf_put_var1_double(ncid, i, index, value)
+                if (canConvert) then
+                    val = value
+                    if (inRange3(val, var_type(i), NFT_DOUBLE)) then
+                        if (err .ne. 0)
+     +                      call error(nf_strerror(err))
+                    else
+                        if (err .ne. NF_ERANGE)
+     +                      call errore('Range error: ', err)
+                    end if
+                else
+                    if (err .ne. NF_ECHAR)
+     +                  call errore('wrong type: ', err)
+                end if
+4           continue
+1       continue
+
+        err = nf_close(ncid)
+        if (err .ne. 0) 
+     +      call errore('nf_close: ', err)
+
+        call check_vars_double(scratch)
+
+        err = nf_delete(scratch)
+        if (err .ne. 0)
+     +      call errorc('delete of scratch file failed: ', 
+     +                  scratch)
+        end
+
+
+        subroutine test_nf_put_var_text()
+        use tests
+        implicit        none
+        integer ncid
+        integer vid
+        integer i
+        integer j
+        integer err
+        integer nels
+        integer index(MAX_RANK)
+        logical canConvert      !/* Both text or both numeric */
+        logical allInExtRange   !/* All values within external range?*/
+        character    value(MAX_NELS)
+        doubleprecision val
+
+        err = nf_create(scratch, NF_CLOBBER, ncid)
+        if (err .ne. 0) then
+            call errore('nf_create: ', err)
+            return
+        end if
+        call def_dims(ncid)
+        call def_vars(ncid)
+        err = nf_enddef(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_enddef: ', err)
+
+        do 1, i = 1, NVARS
+            canConvert = (var_type(i) .eq. NF_CHAR) .eqv.
+     +                   (NFT_TEXT .eq. NFT_TEXT)
+            err = nf_put_var_text(BAD_ID, i, value)
+            if (err .ne. NF_EBADID) 
+     +          call errore('bad ncid: ', err)
+            err = nf_put_var_text(ncid, BAD_VARID, value)
+            if (err .ne. NF_ENOTVAR) 
+     +          call errore('bad var id: ', err)
+            nels = 1
+            do 3, j = 1, var_rank(i)
+                nels = nels * var_shape(j,i)
+3           continue
+            allInExtRange = .true.
+            do 4, j = 1, var_nels(i)
+                err = index2indexes(j, var_rank(i), var_shape(1,i), 
+     +                              index)
+                if (err .ne. 0) 
+     +              call error('error in index2indexes 1')
+                value(j) = char(int(hash_text(var_type(i), 
+     +              var_rank(i),
+     +              index, NFT_TEXT)))
+                val = ichar(value(j))
+                allInExtRange = allInExtRange .and.
+     +              inRange3(val, var_type(i), NFT_TEXT)
+4           continue
+            err = nf_put_var_text(ncid, i, value)
+            if (canConvert) then
+                if (allInExtRange) then
+                    if (err .ne. 0)
+     +                  call error(nf_strerror(err))
+                else
+                    if (err .ne. NF_ERANGE .and.
+     +                      var_dimid(var_rank(i),i) .ne. RECDIM)
+     +                  call errore('Range error: ', err)
+                endif
+            else
+                if (err .ne. NF_ECHAR)
+     +              call errore('wrong type: ', err)
+            endif
+1       continue
+
+C       The preceeding has written nothing for record variables, now try
+C       again with more than 0 records.
+
+C       Write record number NRECS to force writing of preceding records.
+C       Assumes variable cr is char vector with UNLIMITED dimension.
+
+        err = nf_inq_varid(ncid, "cr", vid)
+        if (err .ne. 0)
+     +      call errore('nf_inq_varid: ', err)
+        index(1) = NRECS
+        err = nf_put_var1_text(ncid, vid, index, 'x')
+        if (err .ne. 0)
+     +      call errore('nf_put_var1_text: ', err)
+
+        do 5 i = 1, NVARS
+C           Only test record variables here
+            if (var_rank(i) .ge. 1 .and.
+     +          var_dimid(var_rank(i),i) .eq. RECDIM) then
+                canConvert = (var_type(i) .eq. NF_CHAR) .eqv.
+     +                   (NFT_TEXT .eq. NFT_TEXT)
+                if (var_rank(i) .gt. MAX_RANK)
+     +              stop 2
+                if (var_nels(i) .gt. MAX_NELS)
+     +              stop 2
+                err = nf_put_var_text(BAD_ID, i, value)
+
+                nels = 1
+                do 6 j = 1, var_rank(i)
+                    nels = nels * var_shape(j,i)
+6               continue
+                allInExtRange = .true.
+                do 7, j = 1, nels
+                    err = index2indexes(j, var_rank(i), var_shape(1,i), 
+     +                              index)
+                    if (err .ne. 0) 
+     +                  call error('error in index2indexes()')
+                    value(j) = char(int(hash_text(var_type(i), 
+     +                  var_rank(i),
+     +                  index, NFT_TEXT)))
+                    val = ichar(value(j))
+                    allInExtRange = allInExtRange .and.
+     +                  inRange3(val, var_type(i), NFT_TEXT)
+7               continue
+                err = nf_put_var_text(ncid, i, value)
+                if (canConvert) then
+                    if (allInExtRange) then
+                        if (err .ne. 0)
+     +                      call error(nf_strerror(err))
+                    else
+                        if (err .ne. NF_ERANGE)
+     +                      call errore('range error: ', err)
+                    endif
+                else
+                    if (nels .gt. 0 .and. err .ne. NF_ECHAR)
+     +                  call errore('wrong type: ', err)
+                endif
+            endif
+5       continue
+
+        err = nf_close(ncid)
+        if (err .ne. 0) 
+     +      call errore('nf_close: ', err)
+
+        call check_vars_text(scratch)
+
+        err = nf_delete(scratch)
+        if (err .ne. 0)
+     +      call errorc('delete of scratch file failed: ', 
+     +                  scratch)
+        end
+
+#ifdef NF_INT1_T
+        subroutine test_nf_put_var_int1()
+        use tests
+        implicit        none
+        integer ncid
+        integer vid
+        integer i
+        integer j
+        integer err
+        integer nels
+        integer index(MAX_RANK)
+        logical canConvert      !/* Both text or both numeric */
+        logical allInExtRange   !/* All values within external range?*/
+        NF_INT1_T    value(MAX_NELS)
+        doubleprecision val
+
+        err = nf_create(scratch, NF_CLOBBER, ncid)
+        if (err .ne. 0) then
+            call errore('nf_create: ', err)
+            return
+        end if
+        call def_dims(ncid)
+        call def_vars(ncid)
+        err = nf_enddef(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_enddef: ', err)
+
+        do 1, i = 1, NVARS
+            canConvert = (var_type(i) .eq. NF_CHAR) .eqv.
+     +                   (NFT_INT1 .eq. NFT_TEXT)
+            err = nf_put_var_int1(BAD_ID, i, value)
+            if (err .ne. NF_EBADID) 
+     +          call errore('bad ncid: ', err)
+            err = nf_put_var_int1(ncid, BAD_VARID, value)
+            if (err .ne. NF_ENOTVAR) 
+     +          call errore('bad var id: ', err)
+            nels = 1
+            do 3, j = 1, var_rank(i)
+                nels = nels * var_shape(j,i)
+3           continue
+            allInExtRange = .true.
+            do 4, j = 1, var_nels(i)
+                err = index2indexes(j, var_rank(i), var_shape(1,i), 
+     +                              index)
+                if (err .ne. 0) 
+     +              call error('error in index2indexes 1')
+                value(j) = hash_int1(var_type(i), 
+     +              var_rank(i),
+     +              index, NFT_INT1)
+                val = value(j)
+                allInExtRange = allInExtRange .and.
+     +              inRange3(val, var_type(i), NFT_INT1)
+4           continue
+            err = nf_put_var_int1(ncid, i, value)
+            if (canConvert) then
+                if (allInExtRange) then
+                    if (err .ne. 0)
+     +                  call error(nf_strerror(err))
+                else
+                    if (err .ne. NF_ERANGE .and.
+     +                      var_dimid(var_rank(i),i) .ne. RECDIM)
+     +                  call errore('Range error: ', err)
+                endif
+            else
+                if (err .ne. NF_ECHAR)
+     +              call errore('wrong type: ', err)
+            endif
+1       continue
+
+C       The preceeding has written nothing for record variables, now try
+C       again with more than 0 records.
+
+C       Write record number NRECS to force writing of preceding records.
+C       Assumes variable cr is char vector with UNLIMITED dimension.
+
+        err = nf_inq_varid(ncid, "cr", vid)
+        if (err .ne. 0)
+     +      call errore('nf_inq_varid: ', err)
+        index(1) = NRECS
+        err = nf_put_var1_text(ncid, vid, index, 'x')
+        if (err .ne. 0)
+     +      call errore('nf_put_var1_text: ', err)
+
+        do 5 i = 1, NVARS
+C           Only test record variables here
+            if (var_rank(i) .ge. 1 .and.
+     +          var_dimid(var_rank(i),i) .eq. RECDIM) then
+                canConvert = (var_type(i) .eq. NF_CHAR) .eqv.
+     +                   (NFT_INT1 .eq. NFT_TEXT)
+                if (var_rank(i) .gt. MAX_RANK)
+     +              stop 2
+                if (var_nels(i) .gt. MAX_NELS)
+     +              stop 2
+                err = nf_put_var_int1(BAD_ID, i, value)
+
+                nels = 1
+                do 6 j = 1, var_rank(i)
+                    nels = nels * var_shape(j,i)
+6               continue
+                allInExtRange = .true.
+                do 7, j = 1, nels
+                    err = index2indexes(j, var_rank(i), var_shape(1,i), 
+     +                              index)
+                    if (err .ne. 0) 
+     +                  call error('error in index2indexes()')
+                    value(j) = hash_int1(var_type(i), 
+     +                  var_rank(i),
+     +                  index, NFT_INT1)
+                    val = value(j)
+                    allInExtRange = allInExtRange .and.
+     +                  inRange3(val, var_type(i), NFT_INT1)
+7               continue
+                err = nf_put_var_int1(ncid, i, value)
+                if (canConvert) then
+                    if (allInExtRange) then
+                        if (err .ne. 0)
+     +                      call error(nf_strerror(err))
+                    else
+                        if (err .ne. NF_ERANGE)
+     +                      call errore('range error: ', err)
+                    endif
+                else
+                    if (nels .gt. 0 .and. err .ne. NF_ECHAR)
+     +                  call errore('wrong type: ', err)
+                endif
+            endif
+5       continue
+
+        err = nf_close(ncid)
+        if (err .ne. 0) 
+     +      call errore('nf_close: ', err)
+
+        call check_vars_int1(scratch)
+
+        err = nf_delete(scratch)
+        if (err .ne. 0)
+     +      call errorc('delete of scratch file failed: ', 
+     +                  scratch)
+        end
+
+#endif
+#ifdef NF_INT2_T
+        subroutine test_nf_put_var_int2()
+        use tests
+        implicit        none
+        integer ncid
+        integer vid
+        integer i
+        integer j
+        integer err
+        integer nels
+        integer index(MAX_RANK)
+        logical canConvert      !/* Both text or both numeric */
+        logical allInExtRange   !/* All values within external range?*/
+        NF_INT2_T    value(MAX_NELS)
+        doubleprecision val
+
+        err = nf_create(scratch, NF_CLOBBER, ncid)
+        if (err .ne. 0) then
+            call errore('nf_create: ', err)
+            return
+        end if
+        call def_dims(ncid)
+        call def_vars(ncid)
+        err = nf_enddef(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_enddef: ', err)
+
+        do 1, i = 1, NVARS
+            canConvert = (var_type(i) .eq. NF_CHAR) .eqv.
+     +                   (NFT_INT2 .eq. NFT_TEXT)
+            err = nf_put_var_int2(BAD_ID, i, value)
+            if (err .ne. NF_EBADID) 
+     +          call errore('bad ncid: ', err)
+            err = nf_put_var_int2(ncid, BAD_VARID, value)
+            if (err .ne. NF_ENOTVAR) 
+     +          call errore('bad var id: ', err)
+            nels = 1
+            do 3, j = 1, var_rank(i)
+                nels = nels * var_shape(j,i)
+3           continue
+            allInExtRange = .true.
+            do 4, j = 1, var_nels(i)
+                err = index2indexes(j, var_rank(i), var_shape(1,i), 
+     +                              index)
+                if (err .ne. 0) 
+     +              call error('error in index2indexes 1')
+                value(j) = hash_int2(var_type(i), 
+     +              var_rank(i),
+     +              index, NFT_INT2)
+                val = value(j)
+                allInExtRange = allInExtRange .and.
+     +              inRange3(val, var_type(i), NFT_INT2)
+4           continue
+            err = nf_put_var_int2(ncid, i, value)
+            if (canConvert) then
+                if (allInExtRange) then
+                    if (err .ne. 0)
+     +                  call error(nf_strerror(err))
+                else
+                    if (err .ne. NF_ERANGE .and.
+     +                      var_dimid(var_rank(i),i) .ne. RECDIM)
+     +                  call errore('Range error: ', err)
+                endif
+            else
+                if (err .ne. NF_ECHAR)
+     +              call errore('wrong type: ', err)
+            endif
+1       continue
+
+C       The preceeding has written nothing for record variables, now try
+C       again with more than 0 records.
+
+C       Write record number NRECS to force writing of preceding records.
+C       Assumes variable cr is char vector with UNLIMITED dimension.
+
+        err = nf_inq_varid(ncid, "cr", vid)
+        if (err .ne. 0)
+     +      call errore('nf_inq_varid: ', err)
+        index(1) = NRECS
+        err = nf_put_var1_text(ncid, vid, index, 'x')
+        if (err .ne. 0)
+     +      call errore('nf_put_var1_text: ', err)
+
+        do 5 i = 1, NVARS
+C           Only test record variables here
+            if (var_rank(i) .ge. 1 .and.
+     +          var_dimid(var_rank(i),i) .eq. RECDIM) then
+                canConvert = (var_type(i) .eq. NF_CHAR) .eqv.
+     +                   (NFT_INT2 .eq. NFT_TEXT)
+                if (var_rank(i) .gt. MAX_RANK)
+     +              stop 2
+                if (var_nels(i) .gt. MAX_NELS)
+     +              stop 2
+                err = nf_put_var_int2(BAD_ID, i, value)
+
+                nels = 1
+                do 6 j = 1, var_rank(i)
+                    nels = nels * var_shape(j,i)
+6               continue
+                allInExtRange = .true.
+                do 7, j = 1, nels
+                    err = index2indexes(j, var_rank(i), var_shape(1,i), 
+     +                              index)
+                    if (err .ne. 0) 
+     +                  call error('error in index2indexes()')
+                    value(j) = hash_int2(var_type(i), 
+     +                  var_rank(i),
+     +                  index, NFT_INT2)
+                    val = value(j)
+                    allInExtRange = allInExtRange .and.
+     +                  inRange3(val, var_type(i), NFT_INT2)
+7               continue
+                err = nf_put_var_int2(ncid, i, value)
+                if (canConvert) then
+                    if (allInExtRange) then
+                        if (err .ne. 0)
+     +                      call error(nf_strerror(err))
+                    else
+                        if (err .ne. NF_ERANGE)
+     +                      call errore('range error: ', err)
+                    endif
+                else
+                    if (nels .gt. 0 .and. err .ne. NF_ECHAR)
+     +                  call errore('wrong type: ', err)
+                endif
+            endif
+5       continue
+
+        err = nf_close(ncid)
+        if (err .ne. 0) 
+     +      call errore('nf_close: ', err)
+
+        call check_vars_int2(scratch)
+
+        err = nf_delete(scratch)
+        if (err .ne. 0)
+     +      call errorc('delete of scratch file failed: ', 
+     +                  scratch)
+        end
+
+#endif
+        subroutine test_nf_put_var_int()
+        use tests
+        implicit        none
+        integer ncid
+        integer vid
+        integer i
+        integer j
+        integer err
+        integer nels
+        integer index(MAX_RANK)
+        logical canConvert      !/* Both text or both numeric */
+        logical allInExtRange   !/* All values within external range?*/
+        integer    value(MAX_NELS)
+        doubleprecision val
+
+        err = nf_create(scratch, NF_CLOBBER, ncid)
+        if (err .ne. 0) then
+            call errore('nf_create: ', err)
+            return
+        end if
+        call def_dims(ncid)
+        call def_vars(ncid)
+        err = nf_enddef(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_enddef: ', err)
+
+        do 1, i = 1, NVARS
+            canConvert = (var_type(i) .eq. NF_CHAR) .eqv.
+     +                   (NFT_INT .eq. NFT_TEXT)
+            err = nf_put_var_int(BAD_ID, i, value)
+            if (err .ne. NF_EBADID) 
+     +          call errore('bad ncid: ', err)
+            err = nf_put_var_int(ncid, BAD_VARID, value)
+            if (err .ne. NF_ENOTVAR) 
+     +          call errore('bad var id: ', err)
+            nels = 1
+            do 3, j = 1, var_rank(i)
+                nels = nels * var_shape(j,i)
+3           continue
+            allInExtRange = .true.
+            do 4, j = 1, var_nels(i)
+                err = index2indexes(j, var_rank(i), var_shape(1,i), 
+     +                              index)
+                if (err .ne. 0) 
+     +              call error('error in index2indexes 1')
+                value(j) = hash_int(var_type(i), 
+     +              var_rank(i),
+     +              index, NFT_INT)
+                val = value(j)
+                allInExtRange = allInExtRange .and.
+     +              inRange3(val, var_type(i), NFT_INT)
+4           continue
+            err = nf_put_var_int(ncid, i, value)
+            if (canConvert) then
+                if (allInExtRange) then
+                    if (err .ne. 0)
+     +                  call error(nf_strerror(err))
+                else
+                    if (err .ne. NF_ERANGE .and.
+     +                      var_dimid(var_rank(i),i) .ne. RECDIM)
+     +                  call errore('Range error: ', err)
+                endif
+            else
+                if (err .ne. NF_ECHAR)
+     +              call errore('wrong type: ', err)
+            endif
+1       continue
+
+C       The preceeding has written nothing for record variables, now try
+C       again with more than 0 records.
+
+C       Write record number NRECS to force writing of preceding records.
+C       Assumes variable cr is char vector with UNLIMITED dimension.
+
+        err = nf_inq_varid(ncid, "cr", vid)
+        if (err .ne. 0)
+     +      call errore('nf_inq_varid: ', err)
+        index(1) = NRECS
+        err = nf_put_var1_text(ncid, vid, index, 'x')
+        if (err .ne. 0)
+     +      call errore('nf_put_var1_text: ', err)
+
+        do 5 i = 1, NVARS
+C           Only test record variables here
+            if (var_rank(i) .ge. 1 .and.
+     +          var_dimid(var_rank(i),i) .eq. RECDIM) then
+                canConvert = (var_type(i) .eq. NF_CHAR) .eqv.
+     +                   (NFT_INT .eq. NFT_TEXT)
+                if (var_rank(i) .gt. MAX_RANK)
+     +              stop 2
+                if (var_nels(i) .gt. MAX_NELS)
+     +              stop 2
+                err = nf_put_var_int(BAD_ID, i, value)
+
+                nels = 1
+                do 6 j = 1, var_rank(i)
+                    nels = nels * var_shape(j,i)
+6               continue
+                allInExtRange = .true.
+                do 7, j = 1, nels
+                    err = index2indexes(j, var_rank(i), var_shape(1,i), 
+     +                              index)
+                    if (err .ne. 0) 
+     +                  call error('error in index2indexes()')
+                    value(j) = hash_int(var_type(i), 
+     +                  var_rank(i),
+     +                  index, NFT_INT)
+                    val = value(j)
+                    allInExtRange = allInExtRange .and.
+     +                  inRange3(val, var_type(i), NFT_INT)
+7               continue
+                err = nf_put_var_int(ncid, i, value)
+                if (canConvert) then
+                    if (allInExtRange) then
+                        if (err .ne. 0)
+     +                      call error(nf_strerror(err))
+                    else
+                        if (err .ne. NF_ERANGE)
+     +                      call errore('range error: ', err)
+                    endif
+                else
+                    if (nels .gt. 0 .and. err .ne. NF_ECHAR)
+     +                  call errore('wrong type: ', err)
+                endif
+            endif
+5       continue
+
+        err = nf_close(ncid)
+        if (err .ne. 0) 
+     +      call errore('nf_close: ', err)
+
+        call check_vars_int(scratch)
+
+        err = nf_delete(scratch)
+        if (err .ne. 0)
+     +      call errorc('delete of scratch file failed: ', 
+     +                  scratch)
+        end
+
+        subroutine test_nf_put_var_real()
+        use tests
+        implicit        none
+        integer ncid
+        integer vid
+        integer i
+        integer j
+        integer err
+        integer nels
+        integer index(MAX_RANK)
+        logical canConvert      !/* Both text or both numeric */
+        logical allInExtRange   !/* All values within external range?*/
+        real    value(MAX_NELS)
+        doubleprecision val
+
+        err = nf_create(scratch, NF_CLOBBER, ncid)
+        if (err .ne. 0) then
+            call errore('nf_create: ', err)
+            return
+        end if
+        call def_dims(ncid)
+        call def_vars(ncid)
+        err = nf_enddef(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_enddef: ', err)
+
+        do 1, i = 1, NVARS
+            canConvert = (var_type(i) .eq. NF_CHAR) .eqv.
+     +                   (NFT_REAL .eq. NFT_TEXT)
+            err = nf_put_var_real(BAD_ID, i, value)
+            if (err .ne. NF_EBADID) 
+     +          call errore('bad ncid: ', err)
+            err = nf_put_var_real(ncid, BAD_VARID, value)
+            if (err .ne. NF_ENOTVAR) 
+     +          call errore('bad var id: ', err)
+            nels = 1
+            do 3, j = 1, var_rank(i)
+                nels = nels * var_shape(j,i)
+3           continue
+            allInExtRange = .true.
+            do 4, j = 1, var_nels(i)
+                err = index2indexes(j, var_rank(i), var_shape(1,i), 
+     +                              index)
+                if (err .ne. 0) 
+     +              call error('error in index2indexes 1')
+                value(j) = hash_real(var_type(i), 
+     +              var_rank(i),
+     +              index, NFT_REAL)
+                val = value(j)
+                allInExtRange = allInExtRange .and.
+     +              inRange3(val, var_type(i), NFT_REAL)
+4           continue
+            err = nf_put_var_real(ncid, i, value)
+            if (canConvert) then
+                if (allInExtRange) then
+                    if (err .ne. 0)
+     +                  call error(nf_strerror(err))
+                else
+                    if (err .ne. NF_ERANGE .and.
+     +                      var_dimid(var_rank(i),i) .ne. RECDIM)
+     +                  call errore('Range error: ', err)
+                endif
+            else
+                if (err .ne. NF_ECHAR)
+     +              call errore('wrong type: ', err)
+            endif
+1       continue
+
+C       The preceeding has written nothing for record variables, now try
+C       again with more than 0 records.
+
+C       Write record number NRECS to force writing of preceding records.
+C       Assumes variable cr is char vector with UNLIMITED dimension.
+
+        err = nf_inq_varid(ncid, "cr", vid)
+        if (err .ne. 0)
+     +      call errore('nf_inq_varid: ', err)
+        index(1) = NRECS
+        err = nf_put_var1_text(ncid, vid, index, 'x')
+        if (err .ne. 0)
+     +      call errore('nf_put_var1_text: ', err)
+
+        do 5 i = 1, NVARS
+C           Only test record variables here
+            if (var_rank(i) .ge. 1 .and.
+     +          var_dimid(var_rank(i),i) .eq. RECDIM) then
+                canConvert = (var_type(i) .eq. NF_CHAR) .eqv.
+     +                   (NFT_REAL .eq. NFT_TEXT)
+                if (var_rank(i) .gt. MAX_RANK)
+     +              stop 2
+                if (var_nels(i) .gt. MAX_NELS)
+     +              stop 2
+                err = nf_put_var_real(BAD_ID, i, value)
+
+                nels = 1
+                do 6 j = 1, var_rank(i)
+                    nels = nels * var_shape(j,i)
+6               continue
+                allInExtRange = .true.
+                do 7, j = 1, nels
+                    err = index2indexes(j, var_rank(i), var_shape(1,i), 
+     +                              index)
+                    if (err .ne. 0) 
+     +                  call error('error in index2indexes()')
+                    value(j) = hash_real(var_type(i), 
+     +                  var_rank(i),
+     +                  index, NFT_REAL)
+                    val = value(j)
+                    allInExtRange = allInExtRange .and.
+     +                  inRange3(val, var_type(i), NFT_REAL)
+7               continue
+                err = nf_put_var_real(ncid, i, value)
+                if (canConvert) then
+                    if (allInExtRange) then
+                        if (err .ne. 0)
+     +                      call error(nf_strerror(err))
+                    else
+                        if (err .ne. NF_ERANGE)
+     +                      call errore('range error: ', err)
+                    endif
+                else
+                    if (nels .gt. 0 .and. err .ne. NF_ECHAR)
+     +                  call errore('wrong type: ', err)
+                endif
+            endif
+5       continue
+
+        err = nf_close(ncid)
+        if (err .ne. 0) 
+     +      call errore('nf_close: ', err)
+
+        call check_vars_real(scratch)
+
+        err = nf_delete(scratch)
+        if (err .ne. 0)
+     +      call errorc('delete of scratch file failed: ', 
+     +                  scratch)
+        end
+
+        subroutine test_nf_put_var_double()
+        use tests
+        implicit        none
+        integer ncid
+        integer vid
+        integer i
+        integer j
+        integer err
+        integer nels
+        integer index(MAX_RANK)
+        logical canConvert      !/* Both text or both numeric */
+        logical allInExtRange   !/* All values within external range?*/
+        doubleprecision    value(MAX_NELS)
+        doubleprecision val
+
+        err = nf_create(scratch, NF_CLOBBER, ncid)
+        if (err .ne. 0) then
+            call errore('nf_create: ', err)
+            return
+        end if
+        call def_dims(ncid)
+        call def_vars(ncid)
+        err = nf_enddef(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_enddef: ', err)
+
+        do 1, i = 1, NVARS
+            canConvert = (var_type(i) .eq. NF_CHAR) .eqv.
+     +                   (NFT_DOUBLE .eq. NFT_TEXT)
+            err = nf_put_var_double(BAD_ID, i, value)
+            if (err .ne. NF_EBADID) 
+     +          call errore('bad ncid: ', err)
+            err = nf_put_var_double(ncid, BAD_VARID, value)
+            if (err .ne. NF_ENOTVAR) 
+     +          call errore('bad var id: ', err)
+            nels = 1
+            do 3, j = 1, var_rank(i)
+                nels = nels * var_shape(j,i)
+3           continue
+            allInExtRange = .true.
+            do 4, j = 1, var_nels(i)
+                err = index2indexes(j, var_rank(i), var_shape(1,i), 
+     +                              index)
+                if (err .ne. 0) 
+     +              call error('error in index2indexes 1')
+                value(j) = hash_double(var_type(i), 
+     +              var_rank(i),
+     +              index, NFT_DOUBLE)
+                val = value(j)
+                allInExtRange = allInExtRange .and.
+     +              inRange3(val, var_type(i), NFT_DOUBLE)
+4           continue
+            err = nf_put_var_double(ncid, i, value)
+            if (canConvert) then
+                if (allInExtRange) then
+                    if (err .ne. 0)
+     +                  call error(nf_strerror(err))
+                else
+                    if (err .ne. NF_ERANGE .and.
+     +                      var_dimid(var_rank(i),i) .ne. RECDIM)
+     +                  call errore('Range error: ', err)
+                endif
+            else
+                if (err .ne. NF_ECHAR)
+     +              call errore('wrong type: ', err)
+            endif
+1       continue
+
+C       The preceeding has written nothing for record variables, now try
+C       again with more than 0 records.
+
+C       Write record number NRECS to force writing of preceding records.
+C       Assumes variable cr is char vector with UNLIMITED dimension.
+
+        err = nf_inq_varid(ncid, "cr", vid)
+        if (err .ne. 0)
+     +      call errore('nf_inq_varid: ', err)
+        index(1) = NRECS
+        err = nf_put_var1_text(ncid, vid, index, 'x')
+        if (err .ne. 0)
+     +      call errore('nf_put_var1_text: ', err)
+
+        do 5 i = 1, NVARS
+C           Only test record variables here
+            if (var_rank(i) .ge. 1 .and.
+     +          var_dimid(var_rank(i),i) .eq. RECDIM) then
+                canConvert = (var_type(i) .eq. NF_CHAR) .eqv.
+     +                   (NFT_DOUBLE .eq. NFT_TEXT)
+                if (var_rank(i) .gt. MAX_RANK)
+     +              stop 2
+                if (var_nels(i) .gt. MAX_NELS)
+     +              stop 2
+                err = nf_put_var_double(BAD_ID, i, value)
+
+                nels = 1
+                do 6 j = 1, var_rank(i)
+                    nels = nels * var_shape(j,i)
+6               continue
+                allInExtRange = .true.
+                do 7, j = 1, nels
+                    err = index2indexes(j, var_rank(i), var_shape(1,i), 
+     +                              index)
+                    if (err .ne. 0) 
+     +                  call error('error in index2indexes()')
+                    value(j) = hash_double(var_type(i), 
+     +                  var_rank(i),
+     +                  index, NFT_DOUBLE)
+                    val = value(j)
+                    allInExtRange = allInExtRange .and.
+     +                  inRange3(val, var_type(i), NFT_DOUBLE)
+7               continue
+                err = nf_put_var_double(ncid, i, value)
+                if (canConvert) then
+                    if (allInExtRange) then
+                        if (err .ne. 0)
+     +                      call error(nf_strerror(err))
+                    else
+                        if (err .ne. NF_ERANGE)
+     +                      call errore('range error: ', err)
+                    endif
+                else
+                    if (nels .gt. 0 .and. err .ne. NF_ECHAR)
+     +                  call errore('wrong type: ', err)
+                endif
+            endif
+5       continue
+
+        err = nf_close(ncid)
+        if (err .ne. 0) 
+     +      call errore('nf_close: ', err)
+
+        call check_vars_double(scratch)
+
+        err = nf_delete(scratch)
+        if (err .ne. 0)
+     +      call errorc('delete of scratch file failed: ', 
+     +                  scratch)
+        end
+
+
+        subroutine test_nf_put_vara_text()
+        use tests
+        implicit        none
+        integer ncid
+        integer i
+        integer j
+        integer k
+        integer d
+        integer err
+        integer nslabs
+        integer nels
+        integer start(MAX_RANK)
+        integer edge(MAX_RANK)
+        integer mid(MAX_RANK)
+        integer index(MAX_RANK)
+        logical canConvert      !/* Both text or both numeric */
+        logical allInExtRange   !/* all values within external range? */
+        character    value(MAX_NELS)
+        doubleprecision val
+        integer udshift
+
+        err = nf_create(scratch, NF_CLOBBER, ncid)
+        if (err .ne. 0) then
+            call errore('nf_create: ', err)
+            return
+        end if
+        call def_dims(ncid)
+        call def_vars(ncid)
+        err = nf_enddef(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_enddef: ', err)
+
+        do 1, i = 1, NVARS
+            canConvert = (var_type(i) .eq. NF_CHAR) .eqv.
+     +                   (NFT_TEXT .eq. NFT_TEXT)
+            if (.not.(var_rank(i) .le. MAX_RANK))
+     +          stop 2
+            if (.not.(var_nels(i) .le. MAX_NELS))
+     +          stop 2
+            do 2, j = 1, var_rank(i)
+                start(j) = 1
+                edge(j) = 1
+2           continue
+            err = nf_put_vara_text(BAD_ID, i, start,
+     +                  edge, value)
+            if (err .ne. NF_EBADID) 
+     +          call errore('bad ncid: ', err)
+            err = nf_put_vara_text(ncid, BAD_VARID,
+     +                  start, edge, value)
+            if (err .ne. NF_ENOTVAR) 
+     +          call errore('bad var id: ', err)
+            do 3, j = 1, var_rank(i)
+                if (var_dimid(j,i) .ne. RECDIM) then    !/* skip record dim */
+                    start(j) = var_shape(j,i) + 1
+                    err = nf_put_vara_text(ncid, i, start, 
+     +                                   edge, value)
+                    if (.not. canConvert) then
+                        if (err .ne. NF_ECHAR)
+     +                      call errore('conversion: ', err)
+                    else
+                        if (err .ne. NF_EINVALCOORDS)
+     +                      call errore('bad start: ', err)
+                    endif
+                    start(j) = 1
+                    edge(j) = var_shape(j,i) + 1
+                    err = nf_put_vara_text(ncid, i, start, 
+     +                                   edge, value)
+                    if (.not. canConvert) then
+                        if (err .ne. NF_ECHAR)
+     +                      call errore('conversion: ', err)
+                    else
+                        if (err .ne. NF_EEDGE)
+     +                      call errore('bad edge: ', err)
+                    endif
+                    edge(j) = 1
+                end if
+3           continue
+
+C       /* Check correct error returned even when nothing to put */
+        do 20, j = 1, var_rank(i)
+              edge(j) = 0
+20      continue
+        err = nf_put_vara_text(BAD_ID, i, start,
+     +          edge, value)
+        if (err .ne. NF_EBADID) 
+     +      call errore('bad ncid: ', err)
+        err = nf_put_vara_text(ncid, BAD_VARID,
+     +          start, edge, value)
+        if (err .ne. NF_ENOTVAR) 
+     +      call errore('bad var id: ', err)
+        do 21, j = 1, var_rank(i)
+            if (var_dimid(j,i) .gt. 1) then     ! skip record dim
+                start(j) = var_shape(j,i) + 2
+                err = nf_put_vara_text(ncid, i, start,
+     +                  edge, value)
+                if (.not. canConvert) then
+                    if (err .ne. NF_ECHAR)
+     +                  call errore('conversion: ', err)
+                else
+                    if (err .ne. NF_EINVALCOORDS)
+     +                  call errore('bad start: ', err)
+                endif
+                start(j) = 1
+            endif
+21      continue
+        err = nf_put_vara_text(ncid, i, start, edge, value)
+        if (canConvert) then
+            if (err .ne. 0) 
+     +          call error(nf_strerror(err))
+        else
+            if (err .ne. NF_ECHAR)
+     +          call errore('wrong type: ', err)
+        endif
+        do 22, j = 1, var_rank(i)
+              edge(j) = 1
+22      continue
+
+
+                !/* Choose a random point dividing each dim into 2 parts */
+                !/* Put 2^rank (nslabs) slabs so defined */
+            nslabs = 1
+            do 4, j = 1, var_rank(i)
+                mid(j) = roll( var_shape(j,i) )
+                nslabs = nslabs * 2
+4           continue
+                !/* bits of k determine whether to put lower or upper part of dim */
+            do 5, k = 1, nslabs
+                nels = 1
+                do 6, j = 1, var_rank(i)
+                    if (mod(udshift(k-1, -(j-1)), 2) .eq. 1) then
+                        start(j) = 1
+                        edge(j) = mid(j)
+                    else
+                        start(j) = 1 + mid(j)
+                        edge(j) = var_shape(j,i) - mid(j)
+                    end if
+                    nels = nels * edge(j)
+6               continue
+                allInExtRange = .true.
+                do 7, j = 1, nels
+                    err = index2indexes(j, var_rank(i), edge, index)
+                    if (err .ne. 0) 
+     +                  call error('error in index2indexes 1')
+                    do 8, d = 1, var_rank(i)
+                        index(d) = index(d) + start(d) - 1
+8                   continue
+                    value(j)= char(int(hash_text(var_type(i), 
+     +                                  var_rank(i), index, 
+     +                                  NFT_TEXT)))
+                    val = ichar(value(j))
+                    allInExtRange = allInExtRange .and.
+     +                  inRange3(val, var_type(i), NFT_TEXT)
+7               continue
+                err = nf_put_vara_text(ncid, i, start,
+     +                  edge, value)
+                if (canConvert) then
+                    if (allInExtRange) then
+                        if (err .ne. 0) 
+     +                      call error(nf_strerror(err))
+                    else
+                        if (err .ne. NF_ERANGE)
+     +                      call errore('range error: ', err)
+                    end if
+                else
+                    if (nels .gt. 0 .and. err .ne. NF_ECHAR)
+     +                  call errore('wrong type: ', err)
+                end if
+5           continue
+1       continue
+
+        err = nf_close(ncid)
+        if (err .ne. 0) 
+     +      call errore('nf_close: ', err)
+
+        call check_vars_text(scratch)
+
+        err = nf_delete(scratch)
+        if (err .ne. 0)
+     +      call errorc('delete of scratch file failed: ', 
+     +          scratch)
+        end
+
+#ifdef NF_INT1_T
+        subroutine test_nf_put_vara_int1()
+        use tests
+        implicit        none
+        integer ncid
+        integer i
+        integer j
+        integer k
+        integer d
+        integer err
+        integer nslabs
+        integer nels
+        integer start(MAX_RANK)
+        integer edge(MAX_RANK)
+        integer mid(MAX_RANK)
+        integer index(MAX_RANK)
+        logical canConvert      !/* Both text or both numeric */
+        logical allInExtRange   !/* all values within external range? */
+        NF_INT1_T    value(MAX_NELS)
+        doubleprecision val
+        integer udshift
+
+        err = nf_create(scratch, NF_CLOBBER, ncid)
+        if (err .ne. 0) then
+            call errore('nf_create: ', err)
+            return
+        end if
+        call def_dims(ncid)
+        call def_vars(ncid)
+        err = nf_enddef(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_enddef: ', err)
+
+        do 1, i = 1, NVARS
+            canConvert = (var_type(i) .eq. NF_CHAR) .eqv.
+     +                   (NFT_INT1 .eq. NFT_TEXT)
+            if (.not.(var_rank(i) .le. MAX_RANK))
+     +          stop 2
+            if (.not.(var_nels(i) .le. MAX_NELS))
+     +          stop 2
+            do 2, j = 1, var_rank(i)
+                start(j) = 1
+                edge(j) = 1
+2           continue
+            err = nf_put_vara_int1(BAD_ID, i, start,
+     +                  edge, value)
+            if (err .ne. NF_EBADID) 
+     +          call errore('bad ncid: ', err)
+            err = nf_put_vara_int1(ncid, BAD_VARID,
+     +                  start, edge, value)
+            if (err .ne. NF_ENOTVAR) 
+     +          call errore('bad var id: ', err)
+            do 3, j = 1, var_rank(i)
+                if (var_dimid(j,i) .ne. RECDIM) then    !/* skip record dim */
+                    start(j) = var_shape(j,i) + 1
+                    err = nf_put_vara_int1(ncid, i, start, 
+     +                                   edge, value)
+                    if (.not. canConvert) then
+                        if (err .ne. NF_ECHAR)
+     +                      call errore('conversion: ', err)
+                    else
+                        if (err .ne. NF_EINVALCOORDS)
+     +                      call errore('bad start: ', err)
+                    endif
+                    start(j) = 1
+                    edge(j) = var_shape(j,i) + 1
+                    err = nf_put_vara_int1(ncid, i, start, 
+     +                                   edge, value)
+                    if (.not. canConvert) then
+                        if (err .ne. NF_ECHAR)
+     +                      call errore('conversion: ', err)
+                    else
+                        if (err .ne. NF_EEDGE)
+     +                      call errore('bad edge: ', err)
+                    endif
+                    edge(j) = 1
+                end if
+3           continue
+
+C       /* Check correct error returned even when nothing to put */
+        do 20, j = 1, var_rank(i)
+              edge(j) = 0
+20      continue
+        err = nf_put_vara_int1(BAD_ID, i, start,
+     +          edge, value)
+        if (err .ne. NF_EBADID) 
+     +      call errore('bad ncid: ', err)
+        err = nf_put_vara_int1(ncid, BAD_VARID,
+     +          start, edge, value)
+        if (err .ne. NF_ENOTVAR) 
+     +      call errore('bad var id: ', err)
+        do 21, j = 1, var_rank(i)
+            if (var_dimid(j,i) .gt. 1) then     ! skip record dim
+                start(j) = var_shape(j,i) + 2
+                err = nf_put_vara_int1(ncid, i, start,
+     +                  edge, value)
+                if (.not. canConvert) then
+                    if (err .ne. NF_ECHAR)
+     +                  call errore('conversion: ', err)
+                else
+                    if (err .ne. NF_EINVALCOORDS)
+     +                  call errore('bad start: ', err)
+                endif
+                start(j) = 1
+            endif
+21      continue
+        err = nf_put_vara_int1(ncid, i, start, edge, value)
+        if (canConvert) then
+            if (err .ne. 0) 
+     +          call error(nf_strerror(err))
+        else
+            if (err .ne. NF_ECHAR)
+     +          call errore('wrong type: ', err)
+        endif
+        do 22, j = 1, var_rank(i)
+              edge(j) = 1
+22      continue
+
+
+                !/* Choose a random point dividing each dim into 2 parts */
+                !/* Put 2^rank (nslabs) slabs so defined */
+            nslabs = 1
+            do 4, j = 1, var_rank(i)
+                mid(j) = roll( var_shape(j,i) )
+                nslabs = nslabs * 2
+4           continue
+                !/* bits of k determine whether to put lower or upper part of dim */
+            do 5, k = 1, nslabs
+                nels = 1
+                do 6, j = 1, var_rank(i)
+                    if (mod(udshift(k-1, -(j-1)), 2) .eq. 1) then
+                        start(j) = 1
+                        edge(j) = mid(j)
+                    else
+                        start(j) = 1 + mid(j)
+                        edge(j) = var_shape(j,i) - mid(j)
+                    end if
+                    nels = nels * edge(j)
+6               continue
+                allInExtRange = .true.
+                do 7, j = 1, nels
+                    err = index2indexes(j, var_rank(i), edge, index)
+                    if (err .ne. 0) 
+     +                  call error('error in index2indexes 1')
+                    do 8, d = 1, var_rank(i)
+                        index(d) = index(d) + start(d) - 1
+8                   continue
+                    value(j)= hash_int1(var_type(i), 
+     +                                  var_rank(i), index, 
+     +                                  NFT_INT1)
+                    val = value(j)
+                    allInExtRange = allInExtRange .and.
+     +                  inRange3(val, var_type(i), NFT_INT1)
+7               continue
+                err = nf_put_vara_int1(ncid, i, start,
+     +                  edge, value)
+                if (canConvert) then
+                    if (allInExtRange) then
+                        if (err .ne. 0) 
+     +                      call error(nf_strerror(err))
+                    else
+                        if (err .ne. NF_ERANGE)
+     +                      call errore('range error: ', err)
+                    end if
+                else
+                    if (nels .gt. 0 .and. err .ne. NF_ECHAR)
+     +                  call errore('wrong type: ', err)
+                end if
+5           continue
+1       continue
+
+        err = nf_close(ncid)
+        if (err .ne. 0) 
+     +      call errore('nf_close: ', err)
+
+        call check_vars_int1(scratch)
+
+        err = nf_delete(scratch)
+        if (err .ne. 0)
+     +      call errorc('delete of scratch file failed: ', 
+     +          scratch)
+        end
+
+#endif
+#ifdef NF_INT2_T
+        subroutine test_nf_put_vara_int2()
+        use tests
+        implicit        none
+        integer ncid
+        integer i
+        integer j
+        integer k
+        integer d
+        integer err
+        integer nslabs
+        integer nels
+        integer start(MAX_RANK)
+        integer edge(MAX_RANK)
+        integer mid(MAX_RANK)
+        integer index(MAX_RANK)
+        logical canConvert      !/* Both text or both numeric */
+        logical allInExtRange   !/* all values within external range? */
+        NF_INT2_T    value(MAX_NELS)
+        doubleprecision val
+        integer udshift
+
+        err = nf_create(scratch, NF_CLOBBER, ncid)
+        if (err .ne. 0) then
+            call errore('nf_create: ', err)
+            return
+        end if
+        call def_dims(ncid)
+        call def_vars(ncid)
+        err = nf_enddef(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_enddef: ', err)
+
+        do 1, i = 1, NVARS
+            canConvert = (var_type(i) .eq. NF_CHAR) .eqv.
+     +                   (NFT_INT2 .eq. NFT_TEXT)
+            if (.not.(var_rank(i) .le. MAX_RANK))
+     +          stop 2
+            if (.not.(var_nels(i) .le. MAX_NELS))
+     +          stop 2
+            do 2, j = 1, var_rank(i)
+                start(j) = 1
+                edge(j) = 1
+2           continue
+            err = nf_put_vara_int2(BAD_ID, i, start,
+     +                  edge, value)
+            if (err .ne. NF_EBADID) 
+     +          call errore('bad ncid: ', err)
+            err = nf_put_vara_int2(ncid, BAD_VARID,
+     +                  start, edge, value)
+            if (err .ne. NF_ENOTVAR) 
+     +          call errore('bad var id: ', err)
+            do 3, j = 1, var_rank(i)
+                if (var_dimid(j,i) .ne. RECDIM) then    !/* skip record dim */
+                    start(j) = var_shape(j,i) + 1
+                    err = nf_put_vara_int2(ncid, i, start, 
+     +                                   edge, value)
+                    if (.not. canConvert) then
+                        if (err .ne. NF_ECHAR)
+     +                      call errore('conversion: ', err)
+                    else
+                        if (err .ne. NF_EINVALCOORDS)
+     +                      call errore('bad start: ', err)
+                    endif
+                    start(j) = 1
+                    edge(j) = var_shape(j,i) + 1
+                    err = nf_put_vara_int2(ncid, i, start, 
+     +                                   edge, value)
+                    if (.not. canConvert) then
+                        if (err .ne. NF_ECHAR)
+     +                      call errore('conversion: ', err)
+                    else
+                        if (err .ne. NF_EEDGE)
+     +                      call errore('bad edge: ', err)
+                    endif
+                    edge(j) = 1
+                end if
+3           continue
+
+C       /* Check correct error returned even when nothing to put */
+        do 20, j = 1, var_rank(i)
+              edge(j) = 0
+20      continue
+        err = nf_put_vara_int2(BAD_ID, i, start,
+     +          edge, value)
+        if (err .ne. NF_EBADID) 
+     +      call errore('bad ncid: ', err)
+        err = nf_put_vara_int2(ncid, BAD_VARID,
+     +          start, edge, value)
+        if (err .ne. NF_ENOTVAR) 
+     +      call errore('bad var id: ', err)
+        do 21, j = 1, var_rank(i)
+            if (var_dimid(j,i) .gt. 1) then     ! skip record dim
+                start(j) = var_shape(j,i) + 2
+                err = nf_put_vara_int2(ncid, i, start,
+     +                  edge, value)
+                if (.not. canConvert) then
+                    if (err .ne. NF_ECHAR)
+     +                  call errore('conversion: ', err)
+                else
+                    if (err .ne. NF_EINVALCOORDS)
+     +                  call errore('bad start: ', err)
+                endif
+                start(j) = 1
+            endif
+21      continue
+        err = nf_put_vara_int2(ncid, i, start, edge, value)
+        if (canConvert) then
+            if (err .ne. 0) 
+     +          call error(nf_strerror(err))
+        else
+            if (err .ne. NF_ECHAR)
+     +          call errore('wrong type: ', err)
+        endif
+        do 22, j = 1, var_rank(i)
+              edge(j) = 1
+22      continue
+
+
+                !/* Choose a random point dividing each dim into 2 parts */
+                !/* Put 2^rank (nslabs) slabs so defined */
+            nslabs = 1
+            do 4, j = 1, var_rank(i)
+                mid(j) = roll( var_shape(j,i) )
+                nslabs = nslabs * 2
+4           continue
+                !/* bits of k determine whether to put lower or upper part of dim */
+            do 5, k = 1, nslabs
+                nels = 1
+                do 6, j = 1, var_rank(i)
+                    if (mod(udshift(k-1, -(j-1)), 2) .eq. 1) then
+                        start(j) = 1
+                        edge(j) = mid(j)
+                    else
+                        start(j) = 1 + mid(j)
+                        edge(j) = var_shape(j,i) - mid(j)
+                    end if
+                    nels = nels * edge(j)
+6               continue
+                allInExtRange = .true.
+                do 7, j = 1, nels
+                    err = index2indexes(j, var_rank(i), edge, index)
+                    if (err .ne. 0) 
+     +                  call error('error in index2indexes 1')
+                    do 8, d = 1, var_rank(i)
+                        index(d) = index(d) + start(d) - 1
+8                   continue
+                    value(j)= hash_int2(var_type(i), 
+     +                                  var_rank(i), index, 
+     +                                  NFT_INT2)
+                    val = value(j)
+                    allInExtRange = allInExtRange .and.
+     +                  inRange3(val, var_type(i), NFT_INT2)
+7               continue
+                err = nf_put_vara_int2(ncid, i, start,
+     +                  edge, value)
+                if (canConvert) then
+                    if (allInExtRange) then
+                        if (err .ne. 0) 
+     +                      call error(nf_strerror(err))
+                    else
+                        if (err .ne. NF_ERANGE)
+     +                      call errore('range error: ', err)
+                    end if
+                else
+                    if (nels .gt. 0 .and. err .ne. NF_ECHAR)
+     +                  call errore('wrong type: ', err)
+                end if
+5           continue
+1       continue
+
+        err = nf_close(ncid)
+        if (err .ne. 0) 
+     +      call errore('nf_close: ', err)
+
+        call check_vars_int2(scratch)
+
+        err = nf_delete(scratch)
+        if (err .ne. 0)
+     +      call errorc('delete of scratch file failed: ', 
+     +          scratch)
+        end
+
+#endif
+        subroutine test_nf_put_vara_int()
+        use tests
+        implicit        none
+        integer ncid
+        integer i
+        integer j
+        integer k
+        integer d
+        integer err
+        integer nslabs
+        integer nels
+        integer start(MAX_RANK)
+        integer edge(MAX_RANK)
+        integer mid(MAX_RANK)
+        integer index(MAX_RANK)
+        logical canConvert      !/* Both text or both numeric */
+        logical allInExtRange   !/* all values within external range? */
+        integer    value(MAX_NELS)
+        doubleprecision val
+        integer udshift
+
+        err = nf_create(scratch, NF_CLOBBER, ncid)
+        if (err .ne. 0) then
+            call errore('nf_create: ', err)
+            return
+        end if
+        call def_dims(ncid)
+        call def_vars(ncid)
+        err = nf_enddef(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_enddef: ', err)
+
+        do 1, i = 1, NVARS
+            canConvert = (var_type(i) .eq. NF_CHAR) .eqv.
+     +                   (NFT_INT .eq. NFT_TEXT)
+            if (.not.(var_rank(i) .le. MAX_RANK))
+     +          stop 2
+            if (.not.(var_nels(i) .le. MAX_NELS))
+     +          stop 2
+            do 2, j = 1, var_rank(i)
+                start(j) = 1
+                edge(j) = 1
+2           continue
+            err = nf_put_vara_int(BAD_ID, i, start,
+     +                  edge, value)
+            if (err .ne. NF_EBADID) 
+     +          call errore('bad ncid: ', err)
+            err = nf_put_vara_int(ncid, BAD_VARID,
+     +                  start, edge, value)
+            if (err .ne. NF_ENOTVAR) 
+     +          call errore('bad var id: ', err)
+            do 3, j = 1, var_rank(i)
+                if (var_dimid(j,i) .ne. RECDIM) then    !/* skip record dim */
+                    start(j) = var_shape(j,i) + 1
+                    err = nf_put_vara_int(ncid, i, start, 
+     +                                   edge, value)
+                    if (.not. canConvert) then
+                        if (err .ne. NF_ECHAR)
+     +                      call errore('conversion: ', err)
+                    else
+                        if (err .ne. NF_EINVALCOORDS)
+     +                      call errore('bad start: ', err)
+                    endif
+                    start(j) = 1
+                    edge(j) = var_shape(j,i) + 1
+                    err = nf_put_vara_int(ncid, i, start, 
+     +                                   edge, value)
+                    if (.not. canConvert) then
+                        if (err .ne. NF_ECHAR)
+     +                      call errore('conversion: ', err)
+                    else
+                        if (err .ne. NF_EEDGE)
+     +                      call errore('bad edge: ', err)
+                    endif
+                    edge(j) = 1
+                end if
+3           continue
+
+C       /* Check correct error returned even when nothing to put */
+        do 20, j = 1, var_rank(i)
+              edge(j) = 0
+20      continue
+        err = nf_put_vara_int(BAD_ID, i, start,
+     +          edge, value)
+        if (err .ne. NF_EBADID) 
+     +      call errore('bad ncid: ', err)
+        err = nf_put_vara_int(ncid, BAD_VARID,
+     +          start, edge, value)
+        if (err .ne. NF_ENOTVAR) 
+     +      call errore('bad var id: ', err)
+        do 21, j = 1, var_rank(i)
+            if (var_dimid(j,i) .gt. 1) then     ! skip record dim
+                start(j) = var_shape(j,i) + 2
+                err = nf_put_vara_int(ncid, i, start,
+     +                  edge, value)
+                if (.not. canConvert) then
+                    if (err .ne. NF_ECHAR)
+     +                  call errore('conversion: ', err)
+                else
+                    if (err .ne. NF_EINVALCOORDS)
+     +                  call errore('bad start: ', err)
+                endif
+                start(j) = 1
+            endif
+21      continue
+        err = nf_put_vara_int(ncid, i, start, edge, value)
+        if (canConvert) then
+            if (err .ne. 0) 
+     +          call error(nf_strerror(err))
+        else
+            if (err .ne. NF_ECHAR)
+     +          call errore('wrong type: ', err)
+        endif
+        do 22, j = 1, var_rank(i)
+              edge(j) = 1
+22      continue
+
+
+                !/* Choose a random point dividing each dim into 2 parts */
+                !/* Put 2^rank (nslabs) slabs so defined */
+            nslabs = 1
+            do 4, j = 1, var_rank(i)
+                mid(j) = roll( var_shape(j,i) )
+                nslabs = nslabs * 2
+4           continue
+                !/* bits of k determine whether to put lower or upper part of dim */
+            do 5, k = 1, nslabs
+                nels = 1
+                do 6, j = 1, var_rank(i)
+                    if (mod(udshift(k-1, -(j-1)), 2) .eq. 1) then
+                        start(j) = 1
+                        edge(j) = mid(j)
+                    else
+                        start(j) = 1 + mid(j)
+                        edge(j) = var_shape(j,i) - mid(j)
+                    end if
+                    nels = nels * edge(j)
+6               continue
+                allInExtRange = .true.
+                do 7, j = 1, nels
+                    err = index2indexes(j, var_rank(i), edge, index)
+                    if (err .ne. 0) 
+     +                  call error('error in index2indexes 1')
+                    do 8, d = 1, var_rank(i)
+                        index(d) = index(d) + start(d) - 1
+8                   continue
+                    value(j)= hash_int(var_type(i), 
+     +                                  var_rank(i), index, 
+     +                                  NFT_INT)
+                    val = value(j)
+                    allInExtRange = allInExtRange .and.
+     +                  inRange3(val, var_type(i), NFT_INT)
+7               continue
+                err = nf_put_vara_int(ncid, i, start,
+     +                  edge, value)
+                if (canConvert) then
+                    if (allInExtRange) then
+                        if (err .ne. 0) 
+     +                      call error(nf_strerror(err))
+                    else
+                        if (err .ne. NF_ERANGE)
+     +                      call errore('range error: ', err)
+                    end if
+                else
+                    if (nels .gt. 0 .and. err .ne. NF_ECHAR)
+     +                  call errore('wrong type: ', err)
+                end if
+5           continue
+1       continue
+
+        err = nf_close(ncid)
+        if (err .ne. 0) 
+     +      call errore('nf_close: ', err)
+
+        call check_vars_int(scratch)
+
+        err = nf_delete(scratch)
+        if (err .ne. 0)
+     +      call errorc('delete of scratch file failed: ', 
+     +          scratch)
+        end
+
+        subroutine test_nf_put_vara_real()
+        use tests
+        implicit        none
+        integer ncid
+        integer i
+        integer j
+        integer k
+        integer d
+        integer err
+        integer nslabs
+        integer nels
+        integer start(MAX_RANK)
+        integer edge(MAX_RANK)
+        integer mid(MAX_RANK)
+        integer index(MAX_RANK)
+        logical canConvert      !/* Both text or both numeric */
+        logical allInExtRange   !/* all values within external range? */
+        real    value(MAX_NELS)
+        doubleprecision val
+        integer udshift
+
+        err = nf_create(scratch, NF_CLOBBER, ncid)
+        if (err .ne. 0) then
+            call errore('nf_create: ', err)
+            return
+        end if
+        call def_dims(ncid)
+        call def_vars(ncid)
+        err = nf_enddef(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_enddef: ', err)
+
+        do 1, i = 1, NVARS
+            canConvert = (var_type(i) .eq. NF_CHAR) .eqv.
+     +                   (NFT_REAL .eq. NFT_TEXT)
+            if (.not.(var_rank(i) .le. MAX_RANK))
+     +          stop 2
+            if (.not.(var_nels(i) .le. MAX_NELS))
+     +          stop 2
+            do 2, j = 1, var_rank(i)
+                start(j) = 1
+                edge(j) = 1
+2           continue
+            err = nf_put_vara_real(BAD_ID, i, start,
+     +                  edge, value)
+            if (err .ne. NF_EBADID) 
+     +          call errore('bad ncid: ', err)
+            err = nf_put_vara_real(ncid, BAD_VARID,
+     +                  start, edge, value)
+            if (err .ne. NF_ENOTVAR) 
+     +          call errore('bad var id: ', err)
+            do 3, j = 1, var_rank(i)
+                if (var_dimid(j,i) .ne. RECDIM) then    !/* skip record dim */
+                    start(j) = var_shape(j,i) + 1
+                    err = nf_put_vara_real(ncid, i, start, 
+     +                                   edge, value)
+                    if (.not. canConvert) then
+                        if (err .ne. NF_ECHAR)
+     +                      call errore('conversion: ', err)
+                    else
+                        if (err .ne. NF_EINVALCOORDS)
+     +                      call errore('bad start: ', err)
+                    endif
+                    start(j) = 1
+                    edge(j) = var_shape(j,i) + 1
+                    err = nf_put_vara_real(ncid, i, start, 
+     +                                   edge, value)
+                    if (.not. canConvert) then
+                        if (err .ne. NF_ECHAR)
+     +                      call errore('conversion: ', err)
+                    else
+                        if (err .ne. NF_EEDGE)
+     +                      call errore('bad edge: ', err)
+                    endif
+                    edge(j) = 1
+                end if
+3           continue
+
+C       /* Check correct error returned even when nothing to put */
+        do 20, j = 1, var_rank(i)
+              edge(j) = 0
+20      continue
+        err = nf_put_vara_real(BAD_ID, i, start,
+     +          edge, value)
+        if (err .ne. NF_EBADID) 
+     +      call errore('bad ncid: ', err)
+        err = nf_put_vara_real(ncid, BAD_VARID,
+     +          start, edge, value)
+        if (err .ne. NF_ENOTVAR) 
+     +      call errore('bad var id: ', err)
+        do 21, j = 1, var_rank(i)
+            if (var_dimid(j,i) .gt. 1) then     ! skip record dim
+                start(j) = var_shape(j,i) + 2
+                err = nf_put_vara_real(ncid, i, start,
+     +                  edge, value)
+                if (.not. canConvert) then
+                    if (err .ne. NF_ECHAR)
+     +                  call errore('conversion: ', err)
+                else
+                    if (err .ne. NF_EINVALCOORDS)
+     +                  call errore('bad start: ', err)
+                endif
+                start(j) = 1
+            endif
+21      continue
+        err = nf_put_vara_real(ncid, i, start, edge, value)
+        if (canConvert) then
+            if (err .ne. 0) 
+     +          call error(nf_strerror(err))
+        else
+            if (err .ne. NF_ECHAR)
+     +          call errore('wrong type: ', err)
+        endif
+        do 22, j = 1, var_rank(i)
+              edge(j) = 1
+22      continue
+
+
+                !/* Choose a random point dividing each dim into 2 parts */
+                !/* Put 2^rank (nslabs) slabs so defined */
+            nslabs = 1
+            do 4, j = 1, var_rank(i)
+                mid(j) = roll( var_shape(j,i) )
+                nslabs = nslabs * 2
+4           continue
+                !/* bits of k determine whether to put lower or upper part of dim */
+            do 5, k = 1, nslabs
+                nels = 1
+                do 6, j = 1, var_rank(i)
+                    if (mod(udshift(k-1, -(j-1)), 2) .eq. 1) then
+                        start(j) = 1
+                        edge(j) = mid(j)
+                    else
+                        start(j) = 1 + mid(j)
+                        edge(j) = var_shape(j,i) - mid(j)
+                    end if
+                    nels = nels * edge(j)
+6               continue
+                allInExtRange = .true.
+                do 7, j = 1, nels
+                    err = index2indexes(j, var_rank(i), edge, index)
+                    if (err .ne. 0) 
+     +                  call error('error in index2indexes 1')
+                    do 8, d = 1, var_rank(i)
+                        index(d) = index(d) + start(d) - 1
+8                   continue
+                    value(j)= hash_real(var_type(i), 
+     +                                  var_rank(i), index, 
+     +                                  NFT_REAL)
+                    val = value(j)
+                    allInExtRange = allInExtRange .and.
+     +                  inRange3(val, var_type(i), NFT_REAL)
+7               continue
+                err = nf_put_vara_real(ncid, i, start,
+     +                  edge, value)
+                if (canConvert) then
+                    if (allInExtRange) then
+                        if (err .ne. 0) 
+     +                      call error(nf_strerror(err))
+                    else
+                        if (err .ne. NF_ERANGE)
+     +                      call errore('range error: ', err)
+                    end if
+                else
+                    if (nels .gt. 0 .and. err .ne. NF_ECHAR)
+     +                  call errore('wrong type: ', err)
+                end if
+5           continue
+1       continue
+
+        err = nf_close(ncid)
+        if (err .ne. 0) 
+     +      call errore('nf_close: ', err)
+
+        call check_vars_real(scratch)
+
+        err = nf_delete(scratch)
+        if (err .ne. 0)
+     +      call errorc('delete of scratch file failed: ', 
+     +          scratch)
+        end
+
+        subroutine test_nf_put_vara_double()
+        use tests
+        implicit        none
+        integer ncid
+        integer i
+        integer j
+        integer k
+        integer d
+        integer err
+        integer nslabs
+        integer nels
+        integer start(MAX_RANK)
+        integer edge(MAX_RANK)
+        integer mid(MAX_RANK)
+        integer index(MAX_RANK)
+        logical canConvert      !/* Both text or both numeric */
+        logical allInExtRange   !/* all values within external range? */
+        doubleprecision    value(MAX_NELS)
+        doubleprecision val
+        integer udshift
+
+        err = nf_create(scratch, NF_CLOBBER, ncid)
+        if (err .ne. 0) then
+            call errore('nf_create: ', err)
+            return
+        end if
+        call def_dims(ncid)
+        call def_vars(ncid)
+        err = nf_enddef(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_enddef: ', err)
+
+        do 1, i = 1, NVARS
+            canConvert = (var_type(i) .eq. NF_CHAR) .eqv.
+     +                   (NFT_DOUBLE .eq. NFT_TEXT)
+            if (.not.(var_rank(i) .le. MAX_RANK))
+     +          stop 2
+            if (.not.(var_nels(i) .le. MAX_NELS))
+     +          stop 2
+            do 2, j = 1, var_rank(i)
+                start(j) = 1
+                edge(j) = 1
+2           continue
+            err = nf_put_vara_double(BAD_ID, i, start,
+     +                  edge, value)
+            if (err .ne. NF_EBADID) 
+     +          call errore('bad ncid: ', err)
+            err = nf_put_vara_double(ncid, BAD_VARID,
+     +                  start, edge, value)
+            if (err .ne. NF_ENOTVAR) 
+     +          call errore('bad var id: ', err)
+            do 3, j = 1, var_rank(i)
+                if (var_dimid(j,i) .ne. RECDIM) then    !/* skip record dim */
+                    start(j) = var_shape(j,i) + 1
+                    err = nf_put_vara_double(ncid, i, start, 
+     +                                   edge, value)
+                    if (.not. canConvert) then
+                        if (err .ne. NF_ECHAR)
+     +                      call errore('conversion: ', err)
+                    else
+                        if (err .ne. NF_EINVALCOORDS)
+     +                      call errore('bad start: ', err)
+                    endif
+                    start(j) = 1
+                    edge(j) = var_shape(j,i) + 1
+                    err = nf_put_vara_double(ncid, i, start, 
+     +                                   edge, value)
+                    if (.not. canConvert) then
+                        if (err .ne. NF_ECHAR)
+     +                      call errore('conversion: ', err)
+                    else
+                        if (err .ne. NF_EEDGE)
+     +                      call errore('bad edge: ', err)
+                    endif
+                    edge(j) = 1
+                end if
+3           continue
+
+C       /* Check correct error returned even when nothing to put */
+        do 20, j = 1, var_rank(i)
+              edge(j) = 0
+20      continue
+        err = nf_put_vara_double(BAD_ID, i, start,
+     +          edge, value)
+        if (err .ne. NF_EBADID) 
+     +      call errore('bad ncid: ', err)
+        err = nf_put_vara_double(ncid, BAD_VARID,
+     +          start, edge, value)
+        if (err .ne. NF_ENOTVAR) 
+     +      call errore('bad var id: ', err)
+        do 21, j = 1, var_rank(i)
+            if (var_dimid(j,i) .gt. 1) then     ! skip record dim
+                start(j) = var_shape(j,i) + 2
+                err = nf_put_vara_double(ncid, i, start,
+     +                  edge, value)
+                if (.not. canConvert) then
+                    if (err .ne. NF_ECHAR)
+     +                  call errore('conversion: ', err)
+                else
+                    if (err .ne. NF_EINVALCOORDS)
+     +                  call errore('bad start: ', err)
+                endif
+                start(j) = 1
+            endif
+21      continue
+        err = nf_put_vara_double(ncid, i, start, edge, value)
+        if (canConvert) then
+            if (err .ne. 0) 
+     +          call error(nf_strerror(err))
+        else
+            if (err .ne. NF_ECHAR)
+     +          call errore('wrong type: ', err)
+        endif
+        do 22, j = 1, var_rank(i)
+              edge(j) = 1
+22      continue
+
+
+                !/* Choose a random point dividing each dim into 2 parts */
+                !/* Put 2^rank (nslabs) slabs so defined */
+            nslabs = 1
+            do 4, j = 1, var_rank(i)
+                mid(j) = roll( var_shape(j,i) )
+                nslabs = nslabs * 2
+4           continue
+                !/* bits of k determine whether to put lower or upper part of dim */
+            do 5, k = 1, nslabs
+                nels = 1
+                do 6, j = 1, var_rank(i)
+                    if (mod(udshift(k-1, -(j-1)), 2) .eq. 1) then
+                        start(j) = 1
+                        edge(j) = mid(j)
+                    else
+                        start(j) = 1 + mid(j)
+                        edge(j) = var_shape(j,i) - mid(j)
+                    end if
+                    nels = nels * edge(j)
+6               continue
+                allInExtRange = .true.
+                do 7, j = 1, nels
+                    err = index2indexes(j, var_rank(i), edge, index)
+                    if (err .ne. 0) 
+     +                  call error('error in index2indexes 1')
+                    do 8, d = 1, var_rank(i)
+                        index(d) = index(d) + start(d) - 1
+8                   continue
+                    value(j)= hash_double(var_type(i), 
+     +                                  var_rank(i), index, 
+     +                                  NFT_DOUBLE)
+                    val = value(j)
+                    allInExtRange = allInExtRange .and.
+     +                  inRange3(val, var_type(i), NFT_DOUBLE)
+7               continue
+                err = nf_put_vara_double(ncid, i, start,
+     +                  edge, value)
+                if (canConvert) then
+                    if (allInExtRange) then
+                        if (err .ne. 0) 
+     +                      call error(nf_strerror(err))
+                    else
+                        if (err .ne. NF_ERANGE)
+     +                      call errore('range error: ', err)
+                    end if
+                else
+                    if (nels .gt. 0 .and. err .ne. NF_ECHAR)
+     +                  call errore('wrong type: ', err)
+                end if
+5           continue
+1       continue
+
+        err = nf_close(ncid)
+        if (err .ne. 0) 
+     +      call errore('nf_close: ', err)
+
+        call check_vars_double(scratch)
+
+        err = nf_delete(scratch)
+        if (err .ne. 0)
+     +      call errorc('delete of scratch file failed: ', 
+     +          scratch)
+        end
+
+
+        subroutine test_nf_put_vars_text()
+        use tests
+        implicit        none
+        integer ncid
+        integer d
+        integer i
+        integer j
+        integer k
+        integer m
+        integer err
+        integer nels
+        integer nslabs
+        integer nstarts        !/* number of different starts */
+        integer start(MAX_RANK)
+        integer edge(MAX_RANK)
+        integer index(MAX_RANK)
+        integer index2(MAX_RANK)
+        integer mid(MAX_RANK)
+        integer count(MAX_RANK)
+        integer sstride(MAX_RANK)
+        integer stride(MAX_RANK)
+        logical canConvert      !/* Both text or both numeric */
+        logical allInExtRange   !/* all values within external range? */
+        character    value(MAX_NELS)
+        doubleprecision val
+        integer udshift
+
+        err = nf_create(scratch, NF_CLOBBER, ncid)
+        if (err .ne. 0) then
+            call errore('nf_create: ', err)
+            return
+        end if
+        call def_dims(ncid)
+        call def_vars(ncid)
+        err = nf_enddef(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_enddef: ', err)
+
+        do 1, i = 1, NVARS
+            canConvert = (var_type(i) .eq. NF_CHAR) .eqv.
+     +                   (NFT_TEXT .eq. NFT_TEXT)
+            if (.not.(var_rank(i) .le. MAX_RANK))
+     +          stop 2
+            if (.not.(var_nels(i) .le. MAX_NELS))
+     +          stop 2
+            do 2, j = 1, var_rank(i)
+                start(j) = 1
+                edge(j) = 1
+                stride(j) = 1
+2           continue
+            err = nf_put_vars_text(BAD_ID, i, start,
+     +                  edge, stride, value)
+            if (err .ne. NF_EBADID) 
+     +          call errore('bad ncid: ', err)
+            err = nf_put_vars_text(ncid, BAD_VARID, start,
+     +                           edge, stride, 
+     +                           value)
+            if (err .ne. NF_ENOTVAR) 
+     +          call errore('bad var id: ', err)
+            do 3, j = 1, var_rank(i)
+                if (var_dimid(j,i) .ne. RECDIM) then    ! skip record dim
+                    start(j) = var_shape(j,i) + 2
+                    err = nf_put_vars_text(ncid, i, start,
+     +                                   edge, stride, 
+     +                                   value)
+                    if (.not. canConvert) then
+                        if (err .ne. NF_ECHAR)
+     +                      call errore('conversion: ', err)
+                    else
+                        if (err .ne. NF_EINVALCOORDS)
+     +                          call errore('bad start: ', err)
+                    endif
+                    start(j) = 1
+                    edge(j) = var_shape(j,i) + 1
+                    err = nf_put_vars_text(ncid, i, start,
+     +                                   edge, stride, 
+     +                                   value)
+                    if (.not. canConvert) then
+                        if (err .ne. NF_ECHAR)
+     +                      call errore('conversion: ', err)
+                    else
+                        if (err .ne. NF_EEDGE)
+     +                      call errore('bad edge: ', err)
+                    endif
+                    edge(j) = 1
+                    stride(j) = 0
+                    err = nf_put_vars_text(ncid, i, start,
+     +                                   edge, stride, 
+     +                                   value)
+                    if (.not. canConvert) then
+                        if (err .ne. NF_ECHAR)
+     +                      call errore('conversion: ', err)
+                    else
+                        if (err .ne. NF_ESTRIDE)
+     +                      call errore('bad stride: ', err)
+                    endif
+                    stride(j) = 1
+                end if
+3           continue
+                !/* Choose a random point dividing each dim into 2 parts */
+                !/* Put 2^rank (nslabs) slabs so defined */
+            nslabs = 1
+            do 4, j = 1, var_rank(i)
+                mid(j) = roll( var_shape(j,i) )
+                nslabs = nslabs * 2
+4           continue
+                !/* bits of k determine whether to put lower or upper part of dim */
+                !/* choose random stride from 1 to edge */
+            do 5, k = 1, nslabs
+                nstarts = 1
+                do 6, j = 1, var_rank(i)
+                    if (mod(udshift(k-1, -(j-1)), 2) .eq. 1) then
+                        start(j) = 1
+                        edge(j) = mid(j)
+                    else
+                        start(j) = 1 + mid(j)
+                        edge(j) = var_shape(j,i) - mid(j)
+                    end if
+                    if (edge(j) .gt. 0) then
+                        stride(j) = 1+roll(edge(j))
+                    else
+                        stride(j) = 1
+                    end if
+                    sstride(j) = stride(j)
+                    nstarts = nstarts * stride(j)
+6               continue
+                do 7, m = 1, nstarts
+                    err = index2indexes(m, var_rank(i), sstride, index)
+                    if (err .ne. 0)
+     +                  call error('error in index2indexes')
+                    nels = 1
+                    do 8, j = 1, var_rank(i)
+                        count(j) = 1 + (edge(j) - index(j)) / stride(j)
+                        nels = nels * count(j)
+                        index(j) = index(j) + start(j) - 1
+8                   continue
+                        !/* Random choice of forward or backward */
+C/* TODO
+C                   if ( roll(2) ) {
+C                       for (j = 1 j .lt. var_rank(i) j++) {
+C                           index(j) += (count(j) - 1) * stride(j)
+C                           stride(j) = -stride(j)
+C                       }
+C                   }
+C*/
+                    allInExtRange = .true.
+                    do 9, j = 1, nels
+                        err = index2indexes(j, var_rank(i), count, 
+     +                                      index2)
+                        if (err .ne. 0)
+     +                      call error('error in index2indexes')
+                        do 10, d = 1, var_rank(i)
+                            index2(d) = index(d) + 
+     +                                  (index2(d)-1) * stride(d)
+10                      continue
+                        value(j) = char(int(hash_text(var_type(i), 
+     +                     var_rank(i), 
+     +                     index2, NFT_TEXT)))
+                        val = ichar(value(j))
+                        allInExtRange = allInExtRange .and.
+     +                      inRange3(val, var_type(i), 
+     +                               NFT_TEXT)
+9                   continue
+                    err = nf_put_vars_text(ncid, i, index,
+     +                                   count, stride,
+     +                                   value)
+                    if (canConvert) then
+                        if (allInExtRange) then
+                            if (err .ne. 0) 
+     +                          call error(nf_strerror(err))
+                        else
+                            if (err .ne. NF_ERANGE)
+     +                          call errore('range error: ', err)
+                        end if
+                    else
+                        if (nels .gt. 0 .and. err .ne. NF_ECHAR)
+     +                      call errore('wrong type: ', err)
+                    end if
+7               continue
+5           continue
+1       continue
+
+        err = nf_close(ncid)
+        if (err .ne. 0) 
+     +      call errore('nf_close: ', err)
+
+        call check_vars_text(scratch)
+
+        err = nf_delete(scratch)
+        if (err .ne. 0)
+     +      call errorc('delete of scratch file failed:', 
+     +          scratch)
+        end
+
+#ifdef NF_INT1_T
+        subroutine test_nf_put_vars_int1()
+        use tests
+        implicit        none
+        integer ncid
+        integer d
+        integer i
+        integer j
+        integer k
+        integer m
+        integer err
+        integer nels
+        integer nslabs
+        integer nstarts        !/* number of different starts */
+        integer start(MAX_RANK)
+        integer edge(MAX_RANK)
+        integer index(MAX_RANK)
+        integer index2(MAX_RANK)
+        integer mid(MAX_RANK)
+        integer count(MAX_RANK)
+        integer sstride(MAX_RANK)
+        integer stride(MAX_RANK)
+        logical canConvert      !/* Both text or both numeric */
+        logical allInExtRange   !/* all values within external range? */
+        NF_INT1_T    value(MAX_NELS)
+        doubleprecision val
+        integer udshift
+
+        err = nf_create(scratch, NF_CLOBBER, ncid)
+        if (err .ne. 0) then
+            call errore('nf_create: ', err)
+            return
+        end if
+        call def_dims(ncid)
+        call def_vars(ncid)
+        err = nf_enddef(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_enddef: ', err)
+
+        do 1, i = 1, NVARS
+            canConvert = (var_type(i) .eq. NF_CHAR) .eqv.
+     +                   (NFT_INT1 .eq. NFT_TEXT)
+            if (.not.(var_rank(i) .le. MAX_RANK))
+     +          stop 2
+            if (.not.(var_nels(i) .le. MAX_NELS))
+     +          stop 2
+            do 2, j = 1, var_rank(i)
+                start(j) = 1
+                edge(j) = 1
+                stride(j) = 1
+2           continue
+            err = nf_put_vars_int1(BAD_ID, i, start,
+     +                  edge, stride, value)
+            if (err .ne. NF_EBADID) 
+     +          call errore('bad ncid: ', err)
+            err = nf_put_vars_int1(ncid, BAD_VARID, start,
+     +                           edge, stride, 
+     +                           value)
+            if (err .ne. NF_ENOTVAR) 
+     +          call errore('bad var id: ', err)
+            do 3, j = 1, var_rank(i)
+                if (var_dimid(j,i) .ne. RECDIM) then    ! skip record dim
+                    start(j) = var_shape(j,i) + 2
+                    err = nf_put_vars_int1(ncid, i, start,
+     +                                   edge, stride, 
+     +                                   value)
+                    if (.not. canConvert) then
+                        if (err .ne. NF_ECHAR)
+     +                      call errore('conversion: ', err)
+                    else
+                        if (err .ne. NF_EINVALCOORDS)
+     +                          call errore('bad start: ', err)
+                    endif
+                    start(j) = 1
+                    edge(j) = var_shape(j,i) + 1
+                    err = nf_put_vars_int1(ncid, i, start,
+     +                                   edge, stride, 
+     +                                   value)
+                    if (.not. canConvert) then
+                        if (err .ne. NF_ECHAR)
+     +                      call errore('conversion: ', err)
+                    else
+                        if (err .ne. NF_EEDGE)
+     +                      call errore('bad edge: ', err)
+                    endif
+                    edge(j) = 1
+                    stride(j) = 0
+                    err = nf_put_vars_int1(ncid, i, start,
+     +                                   edge, stride, 
+     +                                   value)
+                    if (.not. canConvert) then
+                        if (err .ne. NF_ECHAR)
+     +                      call errore('conversion: ', err)
+                    else
+                        if (err .ne. NF_ESTRIDE)
+     +                      call errore('bad stride: ', err)
+                    endif
+                    stride(j) = 1
+                end if
+3           continue
+                !/* Choose a random point dividing each dim into 2 parts */
+                !/* Put 2^rank (nslabs) slabs so defined */
+            nslabs = 1
+            do 4, j = 1, var_rank(i)
+                mid(j) = roll( var_shape(j,i) )
+                nslabs = nslabs * 2
+4           continue
+                !/* bits of k determine whether to put lower or upper part of dim */
+                !/* choose random stride from 1 to edge */
+            do 5, k = 1, nslabs
+                nstarts = 1
+                do 6, j = 1, var_rank(i)
+                    if (mod(udshift(k-1, -(j-1)), 2) .eq. 1) then
+                        start(j) = 1
+                        edge(j) = mid(j)
+                    else
+                        start(j) = 1 + mid(j)
+                        edge(j) = var_shape(j,i) - mid(j)
+                    end if
+                    if (edge(j) .gt. 0) then
+                        stride(j) = 1+roll(edge(j))
+                    else
+                        stride(j) = 1
+                    end if
+                    sstride(j) = stride(j)
+                    nstarts = nstarts * stride(j)
+6               continue
+                do 7, m = 1, nstarts
+                    err = index2indexes(m, var_rank(i), sstride, index)
+                    if (err .ne. 0)
+     +                  call error('error in index2indexes')
+                    nels = 1
+                    do 8, j = 1, var_rank(i)
+                        count(j) = 1 + (edge(j) - index(j)) / stride(j)
+                        nels = nels * count(j)
+                        index(j) = index(j) + start(j) - 1
+8                   continue
+                        !/* Random choice of forward or backward */
+C/* TODO
+C                   if ( roll(2) ) {
+C                       for (j = 1 j .lt. var_rank(i) j++) {
+C                           index(j) += (count(j) - 1) * stride(j)
+C                           stride(j) = -stride(j)
+C                       }
+C                   }
+C*/
+                    allInExtRange = .true.
+                    do 9, j = 1, nels
+                        err = index2indexes(j, var_rank(i), count, 
+     +                                      index2)
+                        if (err .ne. 0)
+     +                      call error('error in index2indexes')
+                        do 10, d = 1, var_rank(i)
+                            index2(d) = index(d) + 
+     +                                  (index2(d)-1) * stride(d)
+10                      continue
+                        value(j) = hash_int1(var_type(i), 
+     +                     var_rank(i), 
+     +                     index2, NFT_INT1)
+                        val = value(j)
+                        allInExtRange = allInExtRange .and.
+     +                      inRange3(val, var_type(i), 
+     +                               NFT_INT1)
+9                   continue
+                    err = nf_put_vars_int1(ncid, i, index,
+     +                                   count, stride,
+     +                                   value)
+                    if (canConvert) then
+                        if (allInExtRange) then
+                            if (err .ne. 0) 
+     +                          call error(nf_strerror(err))
+                        else
+                            if (err .ne. NF_ERANGE)
+     +                          call errore('range error: ', err)
+                        end if
+                    else
+                        if (nels .gt. 0 .and. err .ne. NF_ECHAR)
+     +                      call errore('wrong type: ', err)
+                    end if
+7               continue
+5           continue
+1       continue
+
+        err = nf_close(ncid)
+        if (err .ne. 0) 
+     +      call errore('nf_close: ', err)
+
+        call check_vars_int1(scratch)
+
+        err = nf_delete(scratch)
+        if (err .ne. 0)
+     +      call errorc('delete of scratch file failed:', 
+     +          scratch)
+        end
+
+#endif
+#ifdef NF_INT2_T
+        subroutine test_nf_put_vars_int2()
+        use tests
+        implicit        none
+        integer ncid
+        integer d
+        integer i
+        integer j
+        integer k
+        integer m
+        integer err
+        integer nels
+        integer nslabs
+        integer nstarts        !/* number of different starts */
+        integer start(MAX_RANK)
+        integer edge(MAX_RANK)
+        integer index(MAX_RANK)
+        integer index2(MAX_RANK)
+        integer mid(MAX_RANK)
+        integer count(MAX_RANK)
+        integer sstride(MAX_RANK)
+        integer stride(MAX_RANK)
+        logical canConvert      !/* Both text or both numeric */
+        logical allInExtRange   !/* all values within external range? */
+        NF_INT2_T    value(MAX_NELS)
+        doubleprecision val
+        integer udshift
+
+        err = nf_create(scratch, NF_CLOBBER, ncid)
+        if (err .ne. 0) then
+            call errore('nf_create: ', err)
+            return
+        end if
+        call def_dims(ncid)
+        call def_vars(ncid)
+        err = nf_enddef(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_enddef: ', err)
+
+        do 1, i = 1, NVARS
+            canConvert = (var_type(i) .eq. NF_CHAR) .eqv.
+     +                   (NFT_INT2 .eq. NFT_TEXT)
+            if (.not.(var_rank(i) .le. MAX_RANK))
+     +          stop 2
+            if (.not.(var_nels(i) .le. MAX_NELS))
+     +          stop 2
+            do 2, j = 1, var_rank(i)
+                start(j) = 1
+                edge(j) = 1
+                stride(j) = 1
+2           continue
+            err = nf_put_vars_int2(BAD_ID, i, start,
+     +                  edge, stride, value)
+            if (err .ne. NF_EBADID) 
+     +          call errore('bad ncid: ', err)
+            err = nf_put_vars_int2(ncid, BAD_VARID, start,
+     +                           edge, stride, 
+     +                           value)
+            if (err .ne. NF_ENOTVAR) 
+     +          call errore('bad var id: ', err)
+            do 3, j = 1, var_rank(i)
+                if (var_dimid(j,i) .ne. RECDIM) then    ! skip record dim
+                    start(j) = var_shape(j,i) + 2
+                    err = nf_put_vars_int2(ncid, i, start,
+     +                                   edge, stride, 
+     +                                   value)
+                    if (.not. canConvert) then
+                        if (err .ne. NF_ECHAR)
+     +                      call errore('conversion: ', err)
+                    else
+                        if (err .ne. NF_EINVALCOORDS)
+     +                          call errore('bad start: ', err)
+                    endif
+                    start(j) = 1
+                    edge(j) = var_shape(j,i) + 1
+                    err = nf_put_vars_int2(ncid, i, start,
+     +                                   edge, stride, 
+     +                                   value)
+                    if (.not. canConvert) then
+                        if (err .ne. NF_ECHAR)
+     +                      call errore('conversion: ', err)
+                    else
+                        if (err .ne. NF_EEDGE)
+     +                      call errore('bad edge: ', err)
+                    endif
+                    edge(j) = 1
+                    stride(j) = 0
+                    err = nf_put_vars_int2(ncid, i, start,
+     +                                   edge, stride, 
+     +                                   value)
+                    if (.not. canConvert) then
+                        if (err .ne. NF_ECHAR)
+     +                      call errore('conversion: ', err)
+                    else
+                        if (err .ne. NF_ESTRIDE)
+     +                      call errore('bad stride: ', err)
+                    endif
+                    stride(j) = 1
+                end if
+3           continue
+                !/* Choose a random point dividing each dim into 2 parts */
+                !/* Put 2^rank (nslabs) slabs so defined */
+            nslabs = 1
+            do 4, j = 1, var_rank(i)
+                mid(j) = roll( var_shape(j,i) )
+                nslabs = nslabs * 2
+4           continue
+                !/* bits of k determine whether to put lower or upper part of dim */
+                !/* choose random stride from 1 to edge */
+            do 5, k = 1, nslabs
+                nstarts = 1
+                do 6, j = 1, var_rank(i)
+                    if (mod(udshift(k-1, -(j-1)), 2) .eq. 1) then
+                        start(j) = 1
+                        edge(j) = mid(j)
+                    else
+                        start(j) = 1 + mid(j)
+                        edge(j) = var_shape(j,i) - mid(j)
+                    end if
+                    if (edge(j) .gt. 0) then
+                        stride(j) = 1+roll(edge(j))
+                    else
+                        stride(j) = 1
+                    end if
+                    sstride(j) = stride(j)
+                    nstarts = nstarts * stride(j)
+6               continue
+                do 7, m = 1, nstarts
+                    err = index2indexes(m, var_rank(i), sstride, index)
+                    if (err .ne. 0)
+     +                  call error('error in index2indexes')
+                    nels = 1
+                    do 8, j = 1, var_rank(i)
+                        count(j) = 1 + (edge(j) - index(j)) / stride(j)
+                        nels = nels * count(j)
+                        index(j) = index(j) + start(j) - 1
+8                   continue
+                        !/* Random choice of forward or backward */
+C/* TODO
+C                   if ( roll(2) ) {
+C                       for (j = 1 j .lt. var_rank(i) j++) {
+C                           index(j) += (count(j) - 1) * stride(j)
+C                           stride(j) = -stride(j)
+C                       }
+C                   }
+C*/
+                    allInExtRange = .true.
+                    do 9, j = 1, nels
+                        err = index2indexes(j, var_rank(i), count, 
+     +                                      index2)
+                        if (err .ne. 0)
+     +                      call error('error in index2indexes')
+                        do 10, d = 1, var_rank(i)
+                            index2(d) = index(d) + 
+     +                                  (index2(d)-1) * stride(d)
+10                      continue
+                        value(j) = hash_int2(var_type(i), 
+     +                     var_rank(i), 
+     +                     index2, NFT_INT2)
+                        val = value(j)
+                        allInExtRange = allInExtRange .and.
+     +                      inRange3(val, var_type(i), 
+     +                               NFT_INT2)
+9                   continue
+                    err = nf_put_vars_int2(ncid, i, index,
+     +                                   count, stride,
+     +                                   value)
+                    if (canConvert) then
+                        if (allInExtRange) then
+                            if (err .ne. 0) 
+     +                          call error(nf_strerror(err))
+                        else
+                            if (err .ne. NF_ERANGE)
+     +                          call errore('range error: ', err)
+                        end if
+                    else
+                        if (nels .gt. 0 .and. err .ne. NF_ECHAR)
+     +                      call errore('wrong type: ', err)
+                    end if
+7               continue
+5           continue
+1       continue
+
+        err = nf_close(ncid)
+        if (err .ne. 0) 
+     +      call errore('nf_close: ', err)
+
+        call check_vars_int2(scratch)
+
+        err = nf_delete(scratch)
+        if (err .ne. 0)
+     +      call errorc('delete of scratch file failed:', 
+     +          scratch)
+        end
+
+#endif
+        subroutine test_nf_put_vars_int()
+        use tests
+        implicit        none
+        integer ncid
+        integer d
+        integer i
+        integer j
+        integer k
+        integer m
+        integer err
+        integer nels
+        integer nslabs
+        integer nstarts        !/* number of different starts */
+        integer start(MAX_RANK)
+        integer edge(MAX_RANK)
+        integer index(MAX_RANK)
+        integer index2(MAX_RANK)
+        integer mid(MAX_RANK)
+        integer count(MAX_RANK)
+        integer sstride(MAX_RANK)
+        integer stride(MAX_RANK)
+        logical canConvert      !/* Both text or both numeric */
+        logical allInExtRange   !/* all values within external range? */
+        integer    value(MAX_NELS)
+        doubleprecision val
+        integer udshift
+
+        err = nf_create(scratch, NF_CLOBBER, ncid)
+        if (err .ne. 0) then
+            call errore('nf_create: ', err)
+            return
+        end if
+        call def_dims(ncid)
+        call def_vars(ncid)
+        err = nf_enddef(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_enddef: ', err)
+
+        do 1, i = 1, NVARS
+            canConvert = (var_type(i) .eq. NF_CHAR) .eqv.
+     +                   (NFT_INT .eq. NFT_TEXT)
+            if (.not.(var_rank(i) .le. MAX_RANK))
+     +          stop 2
+            if (.not.(var_nels(i) .le. MAX_NELS))
+     +          stop 2
+            do 2, j = 1, var_rank(i)
+                start(j) = 1
+                edge(j) = 1
+                stride(j) = 1
+2           continue
+            err = nf_put_vars_int(BAD_ID, i, start,
+     +                  edge, stride, value)
+            if (err .ne. NF_EBADID) 
+     +          call errore('bad ncid: ', err)
+            err = nf_put_vars_int(ncid, BAD_VARID, start,
+     +                           edge, stride, 
+     +                           value)
+            if (err .ne. NF_ENOTVAR) 
+     +          call errore('bad var id: ', err)
+            do 3, j = 1, var_rank(i)
+                if (var_dimid(j,i) .ne. RECDIM) then    ! skip record dim
+                    start(j) = var_shape(j,i) + 2
+                    err = nf_put_vars_int(ncid, i, start,
+     +                                   edge, stride, 
+     +                                   value)
+                    if (.not. canConvert) then
+                        if (err .ne. NF_ECHAR)
+     +                      call errore('conversion: ', err)
+                    else
+                        if (err .ne. NF_EINVALCOORDS)
+     +                          call errore('bad start: ', err)
+                    endif
+                    start(j) = 1
+                    edge(j) = var_shape(j,i) + 1
+                    err = nf_put_vars_int(ncid, i, start,
+     +                                   edge, stride, 
+     +                                   value)
+                    if (.not. canConvert) then
+                        if (err .ne. NF_ECHAR)
+     +                      call errore('conversion: ', err)
+                    else
+                        if (err .ne. NF_EEDGE)
+     +                      call errore('bad edge: ', err)
+                    endif
+                    edge(j) = 1
+                    stride(j) = 0
+                    err = nf_put_vars_int(ncid, i, start,
+     +                                   edge, stride, 
+     +                                   value)
+                    if (.not. canConvert) then
+                        if (err .ne. NF_ECHAR)
+     +                      call errore('conversion: ', err)
+                    else
+                        if (err .ne. NF_ESTRIDE)
+     +                      call errore('bad stride: ', err)
+                    endif
+                    stride(j) = 1
+                end if
+3           continue
+                !/* Choose a random point dividing each dim into 2 parts */
+                !/* Put 2^rank (nslabs) slabs so defined */
+            nslabs = 1
+            do 4, j = 1, var_rank(i)
+                mid(j) = roll( var_shape(j,i) )
+                nslabs = nslabs * 2
+4           continue
+                !/* bits of k determine whether to put lower or upper part of dim */
+                !/* choose random stride from 1 to edge */
+            do 5, k = 1, nslabs
+                nstarts = 1
+                do 6, j = 1, var_rank(i)
+                    if (mod(udshift(k-1, -(j-1)), 2) .eq. 1) then
+                        start(j) = 1
+                        edge(j) = mid(j)
+                    else
+                        start(j) = 1 + mid(j)
+                        edge(j) = var_shape(j,i) - mid(j)
+                    end if
+                    if (edge(j) .gt. 0) then
+                        stride(j) = 1+roll(edge(j))
+                    else
+                        stride(j) = 1
+                    end if
+                    sstride(j) = stride(j)
+                    nstarts = nstarts * stride(j)
+6               continue
+                do 7, m = 1, nstarts
+                    err = index2indexes(m, var_rank(i), sstride, index)
+                    if (err .ne. 0)
+     +                  call error('error in index2indexes')
+                    nels = 1
+                    do 8, j = 1, var_rank(i)
+                        count(j) = 1 + (edge(j) - index(j)) / stride(j)
+                        nels = nels * count(j)
+                        index(j) = index(j) + start(j) - 1
+8                   continue
+                        !/* Random choice of forward or backward */
+C/* TODO
+C                   if ( roll(2) ) {
+C                       for (j = 1 j .lt. var_rank(i) j++) {
+C                           index(j) += (count(j) - 1) * stride(j)
+C                           stride(j) = -stride(j)
+C                       }
+C                   }
+C*/
+                    allInExtRange = .true.
+                    do 9, j = 1, nels
+                        err = index2indexes(j, var_rank(i), count, 
+     +                                      index2)
+                        if (err .ne. 0)
+     +                      call error('error in index2indexes')
+                        do 10, d = 1, var_rank(i)
+                            index2(d) = index(d) + 
+     +                                  (index2(d)-1) * stride(d)
+10                      continue
+                        value(j) = hash_int(var_type(i), 
+     +                     var_rank(i), 
+     +                     index2, NFT_INT)
+                        val = value(j)
+                        allInExtRange = allInExtRange .and.
+     +                      inRange3(val, var_type(i), 
+     +                               NFT_INT)
+9                   continue
+                    err = nf_put_vars_int(ncid, i, index,
+     +                                   count, stride,
+     +                                   value)
+                    if (canConvert) then
+                        if (allInExtRange) then
+                            if (err .ne. 0) 
+     +                          call error(nf_strerror(err))
+                        else
+                            if (err .ne. NF_ERANGE)
+     +                          call errore('range error: ', err)
+                        end if
+                    else
+                        if (nels .gt. 0 .and. err .ne. NF_ECHAR)
+     +                      call errore('wrong type: ', err)
+                    end if
+7               continue
+5           continue
+1       continue
+
+        err = nf_close(ncid)
+        if (err .ne. 0) 
+     +      call errore('nf_close: ', err)
+
+        call check_vars_int(scratch)
+
+        err = nf_delete(scratch)
+        if (err .ne. 0)
+     +      call errorc('delete of scratch file failed:', 
+     +          scratch)
+        end
+
+        subroutine test_nf_put_vars_real()
+        use tests
+        implicit        none
+        integer ncid
+        integer d
+        integer i
+        integer j
+        integer k
+        integer m
+        integer err
+        integer nels
+        integer nslabs
+        integer nstarts        !/* number of different starts */
+        integer start(MAX_RANK)
+        integer edge(MAX_RANK)
+        integer index(MAX_RANK)
+        integer index2(MAX_RANK)
+        integer mid(MAX_RANK)
+        integer count(MAX_RANK)
+        integer sstride(MAX_RANK)
+        integer stride(MAX_RANK)
+        logical canConvert      !/* Both text or both numeric */
+        logical allInExtRange   !/* all values within external range? */
+        real    value(MAX_NELS)
+        doubleprecision val
+        integer udshift
+
+        err = nf_create(scratch, NF_CLOBBER, ncid)
+        if (err .ne. 0) then
+            call errore('nf_create: ', err)
+            return
+        end if
+        call def_dims(ncid)
+        call def_vars(ncid)
+        err = nf_enddef(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_enddef: ', err)
+
+        do 1, i = 1, NVARS
+            canConvert = (var_type(i) .eq. NF_CHAR) .eqv.
+     +                   (NFT_REAL .eq. NFT_TEXT)
+            if (.not.(var_rank(i) .le. MAX_RANK))
+     +          stop 2
+            if (.not.(var_nels(i) .le. MAX_NELS))
+     +          stop 2
+            do 2, j = 1, var_rank(i)
+                start(j) = 1
+                edge(j) = 1
+                stride(j) = 1
+2           continue
+            err = nf_put_vars_real(BAD_ID, i, start,
+     +                  edge, stride, value)
+            if (err .ne. NF_EBADID) 
+     +          call errore('bad ncid: ', err)
+            err = nf_put_vars_real(ncid, BAD_VARID, start,
+     +                           edge, stride, 
+     +                           value)
+            if (err .ne. NF_ENOTVAR) 
+     +          call errore('bad var id: ', err)
+            do 3, j = 1, var_rank(i)
+                if (var_dimid(j,i) .ne. RECDIM) then    ! skip record dim
+                    start(j) = var_shape(j,i) + 2
+                    err = nf_put_vars_real(ncid, i, start,
+     +                                   edge, stride, 
+     +                                   value)
+                    if (.not. canConvert) then
+                        if (err .ne. NF_ECHAR)
+     +                      call errore('conversion: ', err)
+                    else
+                        if (err .ne. NF_EINVALCOORDS)
+     +                          call errore('bad start: ', err)
+                    endif
+                    start(j) = 1
+                    edge(j) = var_shape(j,i) + 1
+                    err = nf_put_vars_real(ncid, i, start,
+     +                                   edge, stride, 
+     +                                   value)
+                    if (.not. canConvert) then
+                        if (err .ne. NF_ECHAR)
+     +                      call errore('conversion: ', err)
+                    else
+                        if (err .ne. NF_EEDGE)
+     +                      call errore('bad edge: ', err)
+                    endif
+                    edge(j) = 1
+                    stride(j) = 0
+                    err = nf_put_vars_real(ncid, i, start,
+     +                                   edge, stride, 
+     +                                   value)
+                    if (.not. canConvert) then
+                        if (err .ne. NF_ECHAR)
+     +                      call errore('conversion: ', err)
+                    else
+                        if (err .ne. NF_ESTRIDE)
+     +                      call errore('bad stride: ', err)
+                    endif
+                    stride(j) = 1
+                end if
+3           continue
+                !/* Choose a random point dividing each dim into 2 parts */
+                !/* Put 2^rank (nslabs) slabs so defined */
+            nslabs = 1
+            do 4, j = 1, var_rank(i)
+                mid(j) = roll( var_shape(j,i) )
+                nslabs = nslabs * 2
+4           continue
+                !/* bits of k determine whether to put lower or upper part of dim */
+                !/* choose random stride from 1 to edge */
+            do 5, k = 1, nslabs
+                nstarts = 1
+                do 6, j = 1, var_rank(i)
+                    if (mod(udshift(k-1, -(j-1)), 2) .eq. 1) then
+                        start(j) = 1
+                        edge(j) = mid(j)
+                    else
+                        start(j) = 1 + mid(j)
+                        edge(j) = var_shape(j,i) - mid(j)
+                    end if
+                    if (edge(j) .gt. 0) then
+                        stride(j) = 1+roll(edge(j))
+                    else
+                        stride(j) = 1
+                    end if
+                    sstride(j) = stride(j)
+                    nstarts = nstarts * stride(j)
+6               continue
+                do 7, m = 1, nstarts
+                    err = index2indexes(m, var_rank(i), sstride, index)
+                    if (err .ne. 0)
+     +                  call error('error in index2indexes')
+                    nels = 1
+                    do 8, j = 1, var_rank(i)
+                        count(j) = 1 + (edge(j) - index(j)) / stride(j)
+                        nels = nels * count(j)
+                        index(j) = index(j) + start(j) - 1
+8                   continue
+                        !/* Random choice of forward or backward */
+C/* TODO
+C                   if ( roll(2) ) {
+C                       for (j = 1 j .lt. var_rank(i) j++) {
+C                           index(j) += (count(j) - 1) * stride(j)
+C                           stride(j) = -stride(j)
+C                       }
+C                   }
+C*/
+                    allInExtRange = .true.
+                    do 9, j = 1, nels
+                        err = index2indexes(j, var_rank(i), count, 
+     +                                      index2)
+                        if (err .ne. 0)
+     +                      call error('error in index2indexes')
+                        do 10, d = 1, var_rank(i)
+                            index2(d) = index(d) + 
+     +                                  (index2(d)-1) * stride(d)
+10                      continue
+                        value(j) = hash_real(var_type(i), 
+     +                     var_rank(i), 
+     +                     index2, NFT_REAL)
+                        val = value(j)
+                        allInExtRange = allInExtRange .and.
+     +                      inRange3(val, var_type(i), 
+     +                               NFT_REAL)
+9                   continue
+                    err = nf_put_vars_real(ncid, i, index,
+     +                                   count, stride,
+     +                                   value)
+                    if (canConvert) then
+                        if (allInExtRange) then
+                            if (err .ne. 0) 
+     +                          call error(nf_strerror(err))
+                        else
+                            if (err .ne. NF_ERANGE)
+     +                          call errore('range error: ', err)
+                        end if
+                    else
+                        if (nels .gt. 0 .and. err .ne. NF_ECHAR)
+     +                      call errore('wrong type: ', err)
+                    end if
+7               continue
+5           continue
+1       continue
+
+        err = nf_close(ncid)
+        if (err .ne. 0) 
+     +      call errore('nf_close: ', err)
+
+        call check_vars_real(scratch)
+
+        err = nf_delete(scratch)
+        if (err .ne. 0)
+     +      call errorc('delete of scratch file failed:', 
+     +          scratch)
+        end
+
+        subroutine test_nf_put_vars_double()
+        use tests
+        implicit        none
+        integer ncid
+        integer d
+        integer i
+        integer j
+        integer k
+        integer m
+        integer err
+        integer nels
+        integer nslabs
+        integer nstarts        !/* number of different starts */
+        integer start(MAX_RANK)
+        integer edge(MAX_RANK)
+        integer index(MAX_RANK)
+        integer index2(MAX_RANK)
+        integer mid(MAX_RANK)
+        integer count(MAX_RANK)
+        integer sstride(MAX_RANK)
+        integer stride(MAX_RANK)
+        logical canConvert      !/* Both text or both numeric */
+        logical allInExtRange   !/* all values within external range? */
+        doubleprecision    value(MAX_NELS)
+        doubleprecision val
+        integer udshift
+
+        err = nf_create(scratch, NF_CLOBBER, ncid)
+        if (err .ne. 0) then
+            call errore('nf_create: ', err)
+            return
+        end if
+        call def_dims(ncid)
+        call def_vars(ncid)
+        err = nf_enddef(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_enddef: ', err)
+
+        do 1, i = 1, NVARS
+            canConvert = (var_type(i) .eq. NF_CHAR) .eqv.
+     +                   (NFT_DOUBLE .eq. NFT_TEXT)
+            if (.not.(var_rank(i) .le. MAX_RANK))
+     +          stop 2
+            if (.not.(var_nels(i) .le. MAX_NELS))
+     +          stop 2
+            do 2, j = 1, var_rank(i)
+                start(j) = 1
+                edge(j) = 1
+                stride(j) = 1
+2           continue
+            err = nf_put_vars_double(BAD_ID, i, start,
+     +                  edge, stride, value)
+            if (err .ne. NF_EBADID) 
+     +          call errore('bad ncid: ', err)
+            err = nf_put_vars_double(ncid, BAD_VARID, start,
+     +                           edge, stride, 
+     +                           value)
+            if (err .ne. NF_ENOTVAR) 
+     +          call errore('bad var id: ', err)
+            do 3, j = 1, var_rank(i)
+                if (var_dimid(j,i) .ne. RECDIM) then    ! skip record dim
+                    start(j) = var_shape(j,i) + 2
+                    err = nf_put_vars_double(ncid, i, start,
+     +                                   edge, stride, 
+     +                                   value)
+                    if (.not. canConvert) then
+                        if (err .ne. NF_ECHAR)
+     +                      call errore('conversion: ', err)
+                    else
+                        if (err .ne. NF_EINVALCOORDS)
+     +                          call errore('bad start: ', err)
+                    endif
+                    start(j) = 1
+                    edge(j) = var_shape(j,i) + 1
+                    err = nf_put_vars_double(ncid, i, start,
+     +                                   edge, stride, 
+     +                                   value)
+                    if (.not. canConvert) then
+                        if (err .ne. NF_ECHAR)
+     +                      call errore('conversion: ', err)
+                    else
+                        if (err .ne. NF_EEDGE)
+     +                      call errore('bad edge: ', err)
+                    endif
+                    edge(j) = 1
+                    stride(j) = 0
+                    err = nf_put_vars_double(ncid, i, start,
+     +                                   edge, stride, 
+     +                                   value)
+                    if (.not. canConvert) then
+                        if (err .ne. NF_ECHAR)
+     +                      call errore('conversion: ', err)
+                    else
+                        if (err .ne. NF_ESTRIDE)
+     +                      call errore('bad stride: ', err)
+                    endif
+                    stride(j) = 1
+                end if
+3           continue
+                !/* Choose a random point dividing each dim into 2 parts */
+                !/* Put 2^rank (nslabs) slabs so defined */
+            nslabs = 1
+            do 4, j = 1, var_rank(i)
+                mid(j) = roll( var_shape(j,i) )
+                nslabs = nslabs * 2
+4           continue
+                !/* bits of k determine whether to put lower or upper part of dim */
+                !/* choose random stride from 1 to edge */
+            do 5, k = 1, nslabs
+                nstarts = 1
+                do 6, j = 1, var_rank(i)
+                    if (mod(udshift(k-1, -(j-1)), 2) .eq. 1) then
+                        start(j) = 1
+                        edge(j) = mid(j)
+                    else
+                        start(j) = 1 + mid(j)
+                        edge(j) = var_shape(j,i) - mid(j)
+                    end if
+                    if (edge(j) .gt. 0) then
+                        stride(j) = 1+roll(edge(j))
+                    else
+                        stride(j) = 1
+                    end if
+                    sstride(j) = stride(j)
+                    nstarts = nstarts * stride(j)
+6               continue
+                do 7, m = 1, nstarts
+                    err = index2indexes(m, var_rank(i), sstride, index)
+                    if (err .ne. 0)
+     +                  call error('error in index2indexes')
+                    nels = 1
+                    do 8, j = 1, var_rank(i)
+                        count(j) = 1 + (edge(j) - index(j)) / stride(j)
+                        nels = nels * count(j)
+                        index(j) = index(j) + start(j) - 1
+8                   continue
+                        !/* Random choice of forward or backward */
+C/* TODO
+C                   if ( roll(2) ) {
+C                       for (j = 1 j .lt. var_rank(i) j++) {
+C                           index(j) += (count(j) - 1) * stride(j)
+C                           stride(j) = -stride(j)
+C                       }
+C                   }
+C*/
+                    allInExtRange = .true.
+                    do 9, j = 1, nels
+                        err = index2indexes(j, var_rank(i), count, 
+     +                                      index2)
+                        if (err .ne. 0)
+     +                      call error('error in index2indexes')
+                        do 10, d = 1, var_rank(i)
+                            index2(d) = index(d) + 
+     +                                  (index2(d)-1) * stride(d)
+10                      continue
+                        value(j) = hash_double(var_type(i), 
+     +                     var_rank(i), 
+     +                     index2, NFT_DOUBLE)
+                        val = value(j)
+                        allInExtRange = allInExtRange .and.
+     +                      inRange3(val, var_type(i), 
+     +                               NFT_DOUBLE)
+9                   continue
+                    err = nf_put_vars_double(ncid, i, index,
+     +                                   count, stride,
+     +                                   value)
+                    if (canConvert) then
+                        if (allInExtRange) then
+                            if (err .ne. 0) 
+     +                          call error(nf_strerror(err))
+                        else
+                            if (err .ne. NF_ERANGE)
+     +                          call errore('range error: ', err)
+                        end if
+                    else
+                        if (nels .gt. 0 .and. err .ne. NF_ECHAR)
+     +                      call errore('wrong type: ', err)
+                    end if
+7               continue
+5           continue
+1       continue
+
+        err = nf_close(ncid)
+        if (err .ne. 0) 
+     +      call errore('nf_close: ', err)
+
+        call check_vars_double(scratch)
+
+        err = nf_delete(scratch)
+        if (err .ne. 0)
+     +      call errorc('delete of scratch file failed:', 
+     +          scratch)
+        end
+
+
+        subroutine test_nf_put_varm_text()
+        use tests
+        implicit        none
+        integer ncid
+        integer d
+        integer i
+        integer j
+        integer k
+        integer m
+        integer err
+        integer nels
+        integer nslabs
+        integer nstarts        !/* number of different starts */
+        integer start(MAX_RANK)
+        integer edge(MAX_RANK)
+        integer index(MAX_RANK)
+        integer index2(MAX_RANK)
+        integer mid(MAX_RANK)
+        integer count(MAX_RANK)
+        integer sstride(MAX_RANK)
+        integer stride(MAX_RANK)
+        integer imap(MAX_RANK)
+        logical canConvert      !/* Both text or both numeric */
+        logical allInExtRange   !/* all values within external range? */
+        character value(MAX_NELS)
+        doubleprecision val
+        integer udshift
+
+        err = nf_create(scratch, NF_CLOBBER, ncid)
+        if (err .ne. 0) then
+            call errore('nf_create: ', err)
+            return
+        end if
+        call def_dims(ncid)
+        call def_vars(ncid)
+        err = nf_enddef(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_enddef: ', err)
+
+        do 1, i = 1, NVARS
+            canConvert = (var_type(i) .eq. NF_CHAR) .eqv.
+     +                   (NFT_TEXT .eq. NFT_TEXT)
+            if (.not.(var_rank(i) .le. MAX_RANK))
+     +          stop 2
+            if (.not.(var_nels(i) .le. MAX_NELS))
+     +          stop 2
+            do 2, j = 1, var_rank(i)
+                start(j) = 1
+                edge(j) = 1
+                stride(j) = 1
+                imap(j) = 1
+2           continue
+            err = nf_put_varm_text(BAD_ID, i, start,
+     +                           edge, stride, imap, 
+     +                           value)
+            if (err .ne. NF_EBADID) 
+     +          call errore('bad ncid: ', err)
+            err = nf_put_varm_text(ncid, BAD_VARID, start,
+     +                           edge, stride, 
+     +                           imap, value)
+            if (err .ne. NF_ENOTVAR) 
+     +          call errore('bad var id: ', err)
+            do 3, j = 1, var_rank(i)
+                if (var_dimid(j,i) .ne. RECDIM) then    !/* skip record dim */
+                    start(j) = var_shape(j,i) + 2
+                    err = nf_put_varm_text(ncid, i, start,
+     +                                   edge, stride, 
+     +                                   imap, value)
+                    if (.not. canConvert) then
+                        if (err .ne. NF_ECHAR)
+     +                      call errore('conversion: ', err)
+                    else
+                        if (err .ne. NF_EINVALCOORDS)
+     +                      call errore('bad start: ', err)
+                    endif
+                    start(j) = 1
+                    edge(j) = var_shape(j,i) + 1
+                    err = nf_put_varm_text(ncid, i, start,
+     +                                   edge, stride, 
+     +                                   imap, value)
+                    if (.not. canConvert) then
+                        if (err .ne. NF_ECHAR)
+     +                      call errore('conversion: ', err)
+                    else
+                        if (err .ne. NF_EEDGE)
+     +                      call errore('bad edge: ', err)
+                    endif
+                    edge(j) = 1
+                    stride(j) = 0
+                    err = nf_put_varm_text(ncid, i, start,
+     +                                   edge, stride, 
+     +                                   imap, value)
+                    if (.not. canConvert) then
+                        if (err .ne. NF_ECHAR)
+     +                      call errore('conversion: ', err)
+                    else
+                        if (err .ne. NF_ESTRIDE)
+     +                      call errore('bad stride: ', err)
+                    endif
+                    stride(j) = 1
+                end if
+3           continue
+                !/* Choose a random point dividing each dim into 2 parts */
+                !/* Put 2^rank (nslabs) slabs so defined */
+            nslabs = 1
+            do 4, j = 1, var_rank(i)
+                mid(j) = roll( var_shape(j,i) )
+                nslabs = nslabs * 2
+4           continue
+                !/* bits of k determine whether to put lower or upper part of dim */
+                !/* choose random stride from 1 to edge */
+            do 5, k = 1, nslabs
+                nstarts = 1
+                do 6, j = 1, var_rank(i)
+                    if (mod(udshift(k-1, -(j-1)), 2) .eq. 1) then
+                        start(j) = 1
+                        edge(j) = mid(j)
+                    else
+                        start(j) = 1 + mid(j)
+                        edge(j) = var_shape(j,i) - mid(j)
+                    end if
+                    if (edge(j) .gt. 0) then
+                        stride(j) = 1+roll(edge(j))
+                    else
+                        stride(j) = 1
+                    end if
+                    sstride(j) = stride(j)
+                    nstarts = nstarts * stride(j)
+6               continue
+                do 7, m = 1, nstarts
+                    err = index2indexes(m, var_rank(i), sstride, index)
+                    if (err .ne. 0)
+     +                  call error('error in index2indexes')
+                    nels = 1
+                    do 8, j = 1, var_rank(i)
+                        count(j) = 1 + (edge(j) - index(j)) / stride(j)
+                        nels = nels * count(j)
+                        index(j) = index(j) + start(j) - 1
+8                   continue
+                        !/* Random choice of forward or backward */
+C/* TODO
+C                   if ( roll(2) ) then
+C                       do 9, j = 1, var_rank(i)
+C                           index(j) = index(j) + 
+C     +                         (count(j) - 1) * stride(j)
+C                           stride(j) = -stride(j)
+C9                      continue
+C                   end if
+C*/
+                    if (var_rank(i) .gt. 0) then
+                        imap(1) = 1
+                        do 10, j = 2, var_rank(i)
+                            imap(j) = imap(j-1) * count(j-1)
+10                      continue
+                    end if
+                    allInExtRange = .true.
+                    do 11 j = 1, nels
+                        err = index2indexes(j, var_rank(i), count, 
+     +                                      index2)
+                        if (err .ne. 0)
+     +                      call error('error in index2indexes')
+                        do 12, d = 1, var_rank(i)
+                            index2(d) = index(d) + 
+     +                          (index2(d)-1) * stride(d)
+12                      continue
+                        value(j) = char(int(hash_text(var_type(i),
+     +                                       var_rank(i), 
+     +                                       index2, NFT_TEXT)))
+                        val = ichar(value(j))
+                        allInExtRange = allInExtRange .and.
+     +                      inRange3(val, var_type(i), 
+     +                               NFT_TEXT)
+11                  continue
+                    err = nf_put_varm_text(ncid,i,index,count,
+     +                                   stride,imap,
+     +                                   value)
+                    if (canConvert) then
+                        if (allInExtRange) then
+                            if (err .ne. 0)
+     +                          call error(nf_strerror(err))
+                        else
+                            if (err .ne. NF_ERANGE)
+     +                          call errore('range error: ', err)
+                        end if
+                    else
+                        if (nels .gt. 0 .and. err .ne. NF_ECHAR)
+     +                      call errore('wrong type: ', err)
+                    end if
+7               continue
+5           continue
+1       continue
+
+        err = nf_close(ncid)
+        if (err .ne. 0) 
+     +      call errore('nf_close: ', err)
+
+        call check_vars_text(scratch)
+
+        err = nf_delete(scratch)
+        if (err .ne. 0)
+     +      call errorc('delete of scratch file failed:', 
+     +          scratch)
+        end
+
+#ifdef NF_INT1_T
+        subroutine test_nf_put_varm_int1()
+        use tests
+        implicit        none
+        integer ncid
+        integer d
+        integer i
+        integer j
+        integer k
+        integer m
+        integer err
+        integer nels
+        integer nslabs
+        integer nstarts        !/* number of different starts */
+        integer start(MAX_RANK)
+        integer edge(MAX_RANK)
+        integer index(MAX_RANK)
+        integer index2(MAX_RANK)
+        integer mid(MAX_RANK)
+        integer count(MAX_RANK)
+        integer sstride(MAX_RANK)
+        integer stride(MAX_RANK)
+        integer imap(MAX_RANK)
+        logical canConvert      !/* Both text or both numeric */
+        logical allInExtRange   !/* all values within external range? */
+        NF_INT1_T value(MAX_NELS)
+        doubleprecision val
+        integer udshift
+
+        err = nf_create(scratch, NF_CLOBBER, ncid)
+        if (err .ne. 0) then
+            call errore('nf_create: ', err)
+            return
+        end if
+        call def_dims(ncid)
+        call def_vars(ncid)
+        err = nf_enddef(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_enddef: ', err)
+
+        do 1, i = 1, NVARS
+            canConvert = (var_type(i) .eq. NF_CHAR) .eqv.
+     +                   (NFT_INT1 .eq. NFT_TEXT)
+            if (.not.(var_rank(i) .le. MAX_RANK))
+     +          stop 2
+            if (.not.(var_nels(i) .le. MAX_NELS))
+     +          stop 2
+            do 2, j = 1, var_rank(i)
+                start(j) = 1
+                edge(j) = 1
+                stride(j) = 1
+                imap(j) = 1
+2           continue
+            err = nf_put_varm_int1(BAD_ID, i, start,
+     +                           edge, stride, imap, 
+     +                           value)
+            if (err .ne. NF_EBADID) 
+     +          call errore('bad ncid: ', err)
+            err = nf_put_varm_int1(ncid, BAD_VARID, start,
+     +                           edge, stride, 
+     +                           imap, value)
+            if (err .ne. NF_ENOTVAR) 
+     +          call errore('bad var id: ', err)
+            do 3, j = 1, var_rank(i)
+                if (var_dimid(j,i) .ne. RECDIM) then    !/* skip record dim */
+                    start(j) = var_shape(j,i) + 2
+                    err = nf_put_varm_int1(ncid, i, start,
+     +                                   edge, stride, 
+     +                                   imap, value)
+                    if (.not. canConvert) then
+                        if (err .ne. NF_ECHAR)
+     +                      call errore('conversion: ', err)
+                    else
+                        if (err .ne. NF_EINVALCOORDS)
+     +                      call errore('bad start: ', err)
+                    endif
+                    start(j) = 1
+                    edge(j) = var_shape(j,i) + 1
+                    err = nf_put_varm_int1(ncid, i, start,
+     +                                   edge, stride, 
+     +                                   imap, value)
+                    if (.not. canConvert) then
+                        if (err .ne. NF_ECHAR)
+     +                      call errore('conversion: ', err)
+                    else
+                        if (err .ne. NF_EEDGE)
+     +                      call errore('bad edge: ', err)
+                    endif
+                    edge(j) = 1
+                    stride(j) = 0
+                    err = nf_put_varm_int1(ncid, i, start,
+     +                                   edge, stride, 
+     +                                   imap, value)
+                    if (.not. canConvert) then
+                        if (err .ne. NF_ECHAR)
+     +                      call errore('conversion: ', err)
+                    else
+                        if (err .ne. NF_ESTRIDE)
+     +                      call errore('bad stride: ', err)
+                    endif
+                    stride(j) = 1
+                end if
+3           continue
+                !/* Choose a random point dividing each dim into 2 parts */
+                !/* Put 2^rank (nslabs) slabs so defined */
+            nslabs = 1
+            do 4, j = 1, var_rank(i)
+                mid(j) = roll( var_shape(j,i) )
+                nslabs = nslabs * 2
+4           continue
+                !/* bits of k determine whether to put lower or upper part of dim */
+                !/* choose random stride from 1 to edge */
+            do 5, k = 1, nslabs
+                nstarts = 1
+                do 6, j = 1, var_rank(i)
+                    if (mod(udshift(k-1, -(j-1)), 2) .eq. 1) then
+                        start(j) = 1
+                        edge(j) = mid(j)
+                    else
+                        start(j) = 1 + mid(j)
+                        edge(j) = var_shape(j,i) - mid(j)
+                    end if
+                    if (edge(j) .gt. 0) then
+                        stride(j) = 1+roll(edge(j))
+                    else
+                        stride(j) = 1
+                    end if
+                    sstride(j) = stride(j)
+                    nstarts = nstarts * stride(j)
+6               continue
+                do 7, m = 1, nstarts
+                    err = index2indexes(m, var_rank(i), sstride, index)
+                    if (err .ne. 0)
+     +                  call error('error in index2indexes')
+                    nels = 1
+                    do 8, j = 1, var_rank(i)
+                        count(j) = 1 + (edge(j) - index(j)) / stride(j)
+                        nels = nels * count(j)
+                        index(j) = index(j) + start(j) - 1
+8                   continue
+                        !/* Random choice of forward or backward */
+C/* TODO
+C                   if ( roll(2) ) then
+C                       do 9, j = 1, var_rank(i)
+C                           index(j) = index(j) + 
+C     +                         (count(j) - 1) * stride(j)
+C                           stride(j) = -stride(j)
+C9                      continue
+C                   end if
+C*/
+                    if (var_rank(i) .gt. 0) then
+                        imap(1) = 1
+                        do 10, j = 2, var_rank(i)
+                            imap(j) = imap(j-1) * count(j-1)
+10                      continue
+                    end if
+                    allInExtRange = .true.
+                    do 11 j = 1, nels
+                        err = index2indexes(j, var_rank(i), count, 
+     +                                      index2)
+                        if (err .ne. 0)
+     +                      call error('error in index2indexes')
+                        do 12, d = 1, var_rank(i)
+                            index2(d) = index(d) + 
+     +                          (index2(d)-1) * stride(d)
+12                      continue
+                        value(j) = hash_int1(var_type(i),
+     +                                       var_rank(i), 
+     +                                       index2, NFT_INT1)
+                        val = value(j)
+                        allInExtRange = allInExtRange .and.
+     +                      inRange3(val, var_type(i), 
+     +                               NFT_INT1)
+11                  continue
+                    err = nf_put_varm_int1(ncid,i,index,count,
+     +                                   stride,imap,
+     +                                   value)
+                    if (canConvert) then
+                        if (allInExtRange) then
+                            if (err .ne. 0)
+     +                          call error(nf_strerror(err))
+                        else
+                            if (err .ne. NF_ERANGE)
+     +                          call errore('range error: ', err)
+                        end if
+                    else
+                        if (nels .gt. 0 .and. err .ne. NF_ECHAR)
+     +                      call errore('wrong type: ', err)
+                    end if
+7               continue
+5           continue
+1       continue
+
+        err = nf_close(ncid)
+        if (err .ne. 0) 
+     +      call errore('nf_close: ', err)
+
+        call check_vars_int1(scratch)
+
+        err = nf_delete(scratch)
+        if (err .ne. 0)
+     +      call errorc('delete of scratch file failed:', 
+     +          scratch)
+        end
+
+#endif
+#ifdef NF_INT2_T
+        subroutine test_nf_put_varm_int2()
+        use tests
+        implicit        none
+        integer ncid
+        integer d
+        integer i
+        integer j
+        integer k
+        integer m
+        integer err
+        integer nels
+        integer nslabs
+        integer nstarts        !/* number of different starts */
+        integer start(MAX_RANK)
+        integer edge(MAX_RANK)
+        integer index(MAX_RANK)
+        integer index2(MAX_RANK)
+        integer mid(MAX_RANK)
+        integer count(MAX_RANK)
+        integer sstride(MAX_RANK)
+        integer stride(MAX_RANK)
+        integer imap(MAX_RANK)
+        logical canConvert      !/* Both text or both numeric */
+        logical allInExtRange   !/* all values within external range? */
+        NF_INT2_T value(MAX_NELS)
+        doubleprecision val
+        integer udshift
+
+        err = nf_create(scratch, NF_CLOBBER, ncid)
+        if (err .ne. 0) then
+            call errore('nf_create: ', err)
+            return
+        end if
+        call def_dims(ncid)
+        call def_vars(ncid)
+        err = nf_enddef(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_enddef: ', err)
+
+        do 1, i = 1, NVARS
+            canConvert = (var_type(i) .eq. NF_CHAR) .eqv.
+     +                   (NFT_INT2 .eq. NFT_TEXT)
+            if (.not.(var_rank(i) .le. MAX_RANK))
+     +          stop 2
+            if (.not.(var_nels(i) .le. MAX_NELS))
+     +          stop 2
+            do 2, j = 1, var_rank(i)
+                start(j) = 1
+                edge(j) = 1
+                stride(j) = 1
+                imap(j) = 1
+2           continue
+            err = nf_put_varm_int2(BAD_ID, i, start,
+     +                           edge, stride, imap, 
+     +                           value)
+            if (err .ne. NF_EBADID) 
+     +          call errore('bad ncid: ', err)
+            err = nf_put_varm_int2(ncid, BAD_VARID, start,
+     +                           edge, stride, 
+     +                           imap, value)
+            if (err .ne. NF_ENOTVAR) 
+     +          call errore('bad var id: ', err)
+            do 3, j = 1, var_rank(i)
+                if (var_dimid(j,i) .ne. RECDIM) then    !/* skip record dim */
+                    start(j) = var_shape(j,i) + 2
+                    err = nf_put_varm_int2(ncid, i, start,
+     +                                   edge, stride, 
+     +                                   imap, value)
+                    if (.not. canConvert) then
+                        if (err .ne. NF_ECHAR)
+     +                      call errore('conversion: ', err)
+                    else
+                        if (err .ne. NF_EINVALCOORDS)
+     +                      call errore('bad start: ', err)
+                    endif
+                    start(j) = 1
+                    edge(j) = var_shape(j,i) + 1
+                    err = nf_put_varm_int2(ncid, i, start,
+     +                                   edge, stride, 
+     +                                   imap, value)
+                    if (.not. canConvert) then
+                        if (err .ne. NF_ECHAR)
+     +                      call errore('conversion: ', err)
+                    else
+                        if (err .ne. NF_EEDGE)
+     +                      call errore('bad edge: ', err)
+                    endif
+                    edge(j) = 1
+                    stride(j) = 0
+                    err = nf_put_varm_int2(ncid, i, start,
+     +                                   edge, stride, 
+     +                                   imap, value)
+                    if (.not. canConvert) then
+                        if (err .ne. NF_ECHAR)
+     +                      call errore('conversion: ', err)
+                    else
+                        if (err .ne. NF_ESTRIDE)
+     +                      call errore('bad stride: ', err)
+                    endif
+                    stride(j) = 1
+                end if
+3           continue
+                !/* Choose a random point dividing each dim into 2 parts */
+                !/* Put 2^rank (nslabs) slabs so defined */
+            nslabs = 1
+            do 4, j = 1, var_rank(i)
+                mid(j) = roll( var_shape(j,i) )
+                nslabs = nslabs * 2
+4           continue
+                !/* bits of k determine whether to put lower or upper part of dim */
+                !/* choose random stride from 1 to edge */
+            do 5, k = 1, nslabs
+                nstarts = 1
+                do 6, j = 1, var_rank(i)
+                    if (mod(udshift(k-1, -(j-1)), 2) .eq. 1) then
+                        start(j) = 1
+                        edge(j) = mid(j)
+                    else
+                        start(j) = 1 + mid(j)
+                        edge(j) = var_shape(j,i) - mid(j)
+                    end if
+                    if (edge(j) .gt. 0) then
+                        stride(j) = 1+roll(edge(j))
+                    else
+                        stride(j) = 1
+                    end if
+                    sstride(j) = stride(j)
+                    nstarts = nstarts * stride(j)
+6               continue
+                do 7, m = 1, nstarts
+                    err = index2indexes(m, var_rank(i), sstride, index)
+                    if (err .ne. 0)
+     +                  call error('error in index2indexes')
+                    nels = 1
+                    do 8, j = 1, var_rank(i)
+                        count(j) = 1 + (edge(j) - index(j)) / stride(j)
+                        nels = nels * count(j)
+                        index(j) = index(j) + start(j) - 1
+8                   continue
+                        !/* Random choice of forward or backward */
+C/* TODO
+C                   if ( roll(2) ) then
+C                       do 9, j = 1, var_rank(i)
+C                           index(j) = index(j) + 
+C     +                         (count(j) - 1) * stride(j)
+C                           stride(j) = -stride(j)
+C9                      continue
+C                   end if
+C*/
+                    if (var_rank(i) .gt. 0) then
+                        imap(1) = 1
+                        do 10, j = 2, var_rank(i)
+                            imap(j) = imap(j-1) * count(j-1)
+10                      continue
+                    end if
+                    allInExtRange = .true.
+                    do 11 j = 1, nels
+                        err = index2indexes(j, var_rank(i), count, 
+     +                                      index2)
+                        if (err .ne. 0)
+     +                      call error('error in index2indexes')
+                        do 12, d = 1, var_rank(i)
+                            index2(d) = index(d) + 
+     +                          (index2(d)-1) * stride(d)
+12                      continue
+                        value(j) = hash_int2(var_type(i),
+     +                                       var_rank(i), 
+     +                                       index2, NFT_INT2)
+                        val = value(j)
+                        allInExtRange = allInExtRange .and.
+     +                      inRange3(val, var_type(i), 
+     +                               NFT_INT2)
+11                  continue
+                    err = nf_put_varm_int2(ncid,i,index,count,
+     +                                   stride,imap,
+     +                                   value)
+                    if (canConvert) then
+                        if (allInExtRange) then
+                            if (err .ne. 0)
+     +                          call error(nf_strerror(err))
+                        else
+                            if (err .ne. NF_ERANGE)
+     +                          call errore('range error: ', err)
+                        end if
+                    else
+                        if (nels .gt. 0 .and. err .ne. NF_ECHAR)
+     +                      call errore('wrong type: ', err)
+                    end if
+7               continue
+5           continue
+1       continue
+
+        err = nf_close(ncid)
+        if (err .ne. 0) 
+     +      call errore('nf_close: ', err)
+
+        call check_vars_int2(scratch)
+
+        err = nf_delete(scratch)
+        if (err .ne. 0)
+     +      call errorc('delete of scratch file failed:', 
+     +          scratch)
+        end
+
+#endif
+        subroutine test_nf_put_varm_int()
+        use tests
+        implicit        none
+        integer ncid
+        integer d
+        integer i
+        integer j
+        integer k
+        integer m
+        integer err
+        integer nels
+        integer nslabs
+        integer nstarts        !/* number of different starts */
+        integer start(MAX_RANK)
+        integer edge(MAX_RANK)
+        integer index(MAX_RANK)
+        integer index2(MAX_RANK)
+        integer mid(MAX_RANK)
+        integer count(MAX_RANK)
+        integer sstride(MAX_RANK)
+        integer stride(MAX_RANK)
+        integer imap(MAX_RANK)
+        logical canConvert      !/* Both text or both numeric */
+        logical allInExtRange   !/* all values within external range? */
+        integer value(MAX_NELS)
+        doubleprecision val
+        integer udshift
+
+        err = nf_create(scratch, NF_CLOBBER, ncid)
+        if (err .ne. 0) then
+            call errore('nf_create: ', err)
+            return
+        end if
+        call def_dims(ncid)
+        call def_vars(ncid)
+        err = nf_enddef(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_enddef: ', err)
+
+        do 1, i = 1, NVARS
+            canConvert = (var_type(i) .eq. NF_CHAR) .eqv.
+     +                   (NFT_INT .eq. NFT_TEXT)
+            if (.not.(var_rank(i) .le. MAX_RANK))
+     +          stop 2
+            if (.not.(var_nels(i) .le. MAX_NELS))
+     +          stop 2
+            do 2, j = 1, var_rank(i)
+                start(j) = 1
+                edge(j) = 1
+                stride(j) = 1
+                imap(j) = 1
+2           continue
+            err = nf_put_varm_int(BAD_ID, i, start,
+     +                           edge, stride, imap, 
+     +                           value)
+            if (err .ne. NF_EBADID) 
+     +          call errore('bad ncid: ', err)
+            err = nf_put_varm_int(ncid, BAD_VARID, start,
+     +                           edge, stride, 
+     +                           imap, value)
+            if (err .ne. NF_ENOTVAR) 
+     +          call errore('bad var id: ', err)
+            do 3, j = 1, var_rank(i)
+                if (var_dimid(j,i) .ne. RECDIM) then    !/* skip record dim */
+                    start(j) = var_shape(j,i) + 2
+                    err = nf_put_varm_int(ncid, i, start,
+     +                                   edge, stride, 
+     +                                   imap, value)
+                    if (.not. canConvert) then
+                        if (err .ne. NF_ECHAR)
+     +                      call errore('conversion: ', err)
+                    else
+                        if (err .ne. NF_EINVALCOORDS)
+     +                      call errore('bad start: ', err)
+                    endif
+                    start(j) = 1
+                    edge(j) = var_shape(j,i) + 1
+                    err = nf_put_varm_int(ncid, i, start,
+     +                                   edge, stride, 
+     +                                   imap, value)
+                    if (.not. canConvert) then
+                        if (err .ne. NF_ECHAR)
+     +                      call errore('conversion: ', err)
+                    else
+                        if (err .ne. NF_EEDGE)
+     +                      call errore('bad edge: ', err)
+                    endif
+                    edge(j) = 1
+                    stride(j) = 0
+                    err = nf_put_varm_int(ncid, i, start,
+     +                                   edge, stride, 
+     +                                   imap, value)
+                    if (.not. canConvert) then
+                        if (err .ne. NF_ECHAR)
+     +                      call errore('conversion: ', err)
+                    else
+                        if (err .ne. NF_ESTRIDE)
+     +                      call errore('bad stride: ', err)
+                    endif
+                    stride(j) = 1
+                end if
+3           continue
+                !/* Choose a random point dividing each dim into 2 parts */
+                !/* Put 2^rank (nslabs) slabs so defined */
+            nslabs = 1
+            do 4, j = 1, var_rank(i)
+                mid(j) = roll( var_shape(j,i) )
+                nslabs = nslabs * 2
+4           continue
+                !/* bits of k determine whether to put lower or upper part of dim */
+                !/* choose random stride from 1 to edge */
+            do 5, k = 1, nslabs
+                nstarts = 1
+                do 6, j = 1, var_rank(i)
+                    if (mod(udshift(k-1, -(j-1)), 2) .eq. 1) then
+                        start(j) = 1
+                        edge(j) = mid(j)
+                    else
+                        start(j) = 1 + mid(j)
+                        edge(j) = var_shape(j,i) - mid(j)
+                    end if
+                    if (edge(j) .gt. 0) then
+                        stride(j) = 1+roll(edge(j))
+                    else
+                        stride(j) = 1
+                    end if
+                    sstride(j) = stride(j)
+                    nstarts = nstarts * stride(j)
+6               continue
+                do 7, m = 1, nstarts
+                    err = index2indexes(m, var_rank(i), sstride, index)
+                    if (err .ne. 0)
+     +                  call error('error in index2indexes')
+                    nels = 1
+                    do 8, j = 1, var_rank(i)
+                        count(j) = 1 + (edge(j) - index(j)) / stride(j)
+                        nels = nels * count(j)
+                        index(j) = index(j) + start(j) - 1
+8                   continue
+                        !/* Random choice of forward or backward */
+C/* TODO
+C                   if ( roll(2) ) then
+C                       do 9, j = 1, var_rank(i)
+C                           index(j) = index(j) + 
+C     +                         (count(j) - 1) * stride(j)
+C                           stride(j) = -stride(j)
+C9                      continue
+C                   end if
+C*/
+                    if (var_rank(i) .gt. 0) then
+                        imap(1) = 1
+                        do 10, j = 2, var_rank(i)
+                            imap(j) = imap(j-1) * count(j-1)
+10                      continue
+                    end if
+                    allInExtRange = .true.
+                    do 11 j = 1, nels
+                        err = index2indexes(j, var_rank(i), count, 
+     +                                      index2)
+                        if (err .ne. 0)
+     +                      call error('error in index2indexes')
+                        do 12, d = 1, var_rank(i)
+                            index2(d) = index(d) + 
+     +                          (index2(d)-1) * stride(d)
+12                      continue
+                        value(j) = hash_int(var_type(i),
+     +                                       var_rank(i), 
+     +                                       index2, NFT_INT)
+                        val = value(j)
+                        allInExtRange = allInExtRange .and.
+     +                      inRange3(val, var_type(i), 
+     +                               NFT_INT)
+11                  continue
+                    err = nf_put_varm_int(ncid,i,index,count,
+     +                                   stride,imap,
+     +                                   value)
+                    if (canConvert) then
+                        if (allInExtRange) then
+                            if (err .ne. 0)
+     +                          call error(nf_strerror(err))
+                        else
+                            if (err .ne. NF_ERANGE)
+     +                          call errore('range error: ', err)
+                        end if
+                    else
+                        if (nels .gt. 0 .and. err .ne. NF_ECHAR)
+     +                      call errore('wrong type: ', err)
+                    end if
+7               continue
+5           continue
+1       continue
+
+        err = nf_close(ncid)
+        if (err .ne. 0) 
+     +      call errore('nf_close: ', err)
+
+        call check_vars_int(scratch)
+
+        err = nf_delete(scratch)
+        if (err .ne. 0)
+     +      call errorc('delete of scratch file failed:', 
+     +          scratch)
+        end
+
+        subroutine test_nf_put_varm_real()
+        use tests
+        implicit        none
+        integer ncid
+        integer d
+        integer i
+        integer j
+        integer k
+        integer m
+        integer err
+        integer nels
+        integer nslabs
+        integer nstarts        !/* number of different starts */
+        integer start(MAX_RANK)
+        integer edge(MAX_RANK)
+        integer index(MAX_RANK)
+        integer index2(MAX_RANK)
+        integer mid(MAX_RANK)
+        integer count(MAX_RANK)
+        integer sstride(MAX_RANK)
+        integer stride(MAX_RANK)
+        integer imap(MAX_RANK)
+        logical canConvert      !/* Both text or both numeric */
+        logical allInExtRange   !/* all values within external range? */
+        real value(MAX_NELS)
+        doubleprecision val
+        integer udshift
+
+        err = nf_create(scratch, NF_CLOBBER, ncid)
+        if (err .ne. 0) then
+            call errore('nf_create: ', err)
+            return
+        end if
+        call def_dims(ncid)
+        call def_vars(ncid)
+        err = nf_enddef(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_enddef: ', err)
+
+        do 1, i = 1, NVARS
+            canConvert = (var_type(i) .eq. NF_CHAR) .eqv.
+     +                   (NFT_REAL .eq. NFT_TEXT)
+            if (.not.(var_rank(i) .le. MAX_RANK))
+     +          stop 2
+            if (.not.(var_nels(i) .le. MAX_NELS))
+     +          stop 2
+            do 2, j = 1, var_rank(i)
+                start(j) = 1
+                edge(j) = 1
+                stride(j) = 1
+                imap(j) = 1
+2           continue
+            err = nf_put_varm_real(BAD_ID, i, start,
+     +                           edge, stride, imap, 
+     +                           value)
+            if (err .ne. NF_EBADID) 
+     +          call errore('bad ncid: ', err)
+            err = nf_put_varm_real(ncid, BAD_VARID, start,
+     +                           edge, stride, 
+     +                           imap, value)
+            if (err .ne. NF_ENOTVAR) 
+     +          call errore('bad var id: ', err)
+            do 3, j = 1, var_rank(i)
+                if (var_dimid(j,i) .ne. RECDIM) then    !/* skip record dim */
+                    start(j) = var_shape(j,i) + 2
+                    err = nf_put_varm_real(ncid, i, start,
+     +                                   edge, stride, 
+     +                                   imap, value)
+                    if (.not. canConvert) then
+                        if (err .ne. NF_ECHAR)
+     +                      call errore('conversion: ', err)
+                    else
+                        if (err .ne. NF_EINVALCOORDS)
+     +                      call errore('bad start: ', err)
+                    endif
+                    start(j) = 1
+                    edge(j) = var_shape(j,i) + 1
+                    err = nf_put_varm_real(ncid, i, start,
+     +                                   edge, stride, 
+     +                                   imap, value)
+                    if (.not. canConvert) then
+                        if (err .ne. NF_ECHAR)
+     +                      call errore('conversion: ', err)
+                    else
+                        if (err .ne. NF_EEDGE)
+     +                      call errore('bad edge: ', err)
+                    endif
+                    edge(j) = 1
+                    stride(j) = 0
+                    err = nf_put_varm_real(ncid, i, start,
+     +                                   edge, stride, 
+     +                                   imap, value)
+                    if (.not. canConvert) then
+                        if (err .ne. NF_ECHAR)
+     +                      call errore('conversion: ', err)
+                    else
+                        if (err .ne. NF_ESTRIDE)
+     +                      call errore('bad stride: ', err)
+                    endif
+                    stride(j) = 1
+                end if
+3           continue
+                !/* Choose a random point dividing each dim into 2 parts */
+                !/* Put 2^rank (nslabs) slabs so defined */
+            nslabs = 1
+            do 4, j = 1, var_rank(i)
+                mid(j) = roll( var_shape(j,i) )
+                nslabs = nslabs * 2
+4           continue
+                !/* bits of k determine whether to put lower or upper part of dim */
+                !/* choose random stride from 1 to edge */
+            do 5, k = 1, nslabs
+                nstarts = 1
+                do 6, j = 1, var_rank(i)
+                    if (mod(udshift(k-1, -(j-1)), 2) .eq. 1) then
+                        start(j) = 1
+                        edge(j) = mid(j)
+                    else
+                        start(j) = 1 + mid(j)
+                        edge(j) = var_shape(j,i) - mid(j)
+                    end if
+                    if (edge(j) .gt. 0) then
+                        stride(j) = 1+roll(edge(j))
+                    else
+                        stride(j) = 1
+                    end if
+                    sstride(j) = stride(j)
+                    nstarts = nstarts * stride(j)
+6               continue
+                do 7, m = 1, nstarts
+                    err = index2indexes(m, var_rank(i), sstride, index)
+                    if (err .ne. 0)
+     +                  call error('error in index2indexes')
+                    nels = 1
+                    do 8, j = 1, var_rank(i)
+                        count(j) = 1 + (edge(j) - index(j)) / stride(j)
+                        nels = nels * count(j)
+                        index(j) = index(j) + start(j) - 1
+8                   continue
+                        !/* Random choice of forward or backward */
+C/* TODO
+C                   if ( roll(2) ) then
+C                       do 9, j = 1, var_rank(i)
+C                           index(j) = index(j) + 
+C     +                         (count(j) - 1) * stride(j)
+C                           stride(j) = -stride(j)
+C9                      continue
+C                   end if
+C*/
+                    if (var_rank(i) .gt. 0) then
+                        imap(1) = 1
+                        do 10, j = 2, var_rank(i)
+                            imap(j) = imap(j-1) * count(j-1)
+10                      continue
+                    end if
+                    allInExtRange = .true.
+                    do 11 j = 1, nels
+                        err = index2indexes(j, var_rank(i), count, 
+     +                                      index2)
+                        if (err .ne. 0)
+     +                      call error('error in index2indexes')
+                        do 12, d = 1, var_rank(i)
+                            index2(d) = index(d) + 
+     +                          (index2(d)-1) * stride(d)
+12                      continue
+                        value(j) = hash_real(var_type(i),
+     +                                       var_rank(i), 
+     +                                       index2, NFT_REAL)
+                        val = value(j)
+                        allInExtRange = allInExtRange .and.
+     +                      inRange3(val, var_type(i), 
+     +                               NFT_REAL)
+11                  continue
+                    err = nf_put_varm_real(ncid,i,index,count,
+     +                                   stride,imap,
+     +                                   value)
+                    if (canConvert) then
+                        if (allInExtRange) then
+                            if (err .ne. 0)
+     +                          call error(nf_strerror(err))
+                        else
+                            if (err .ne. NF_ERANGE)
+     +                          call errore('range error: ', err)
+                        end if
+                    else
+                        if (nels .gt. 0 .and. err .ne. NF_ECHAR)
+     +                      call errore('wrong type: ', err)
+                    end if
+7               continue
+5           continue
+1       continue
+
+        err = nf_close(ncid)
+        if (err .ne. 0) 
+     +      call errore('nf_close: ', err)
+
+        call check_vars_real(scratch)
+
+        err = nf_delete(scratch)
+        if (err .ne. 0)
+     +      call errorc('delete of scratch file failed:', 
+     +          scratch)
+        end
+
+        subroutine test_nf_put_varm_double()
+        use tests
+        implicit        none
+        integer ncid
+        integer d
+        integer i
+        integer j
+        integer k
+        integer m
+        integer err
+        integer nels
+        integer nslabs
+        integer nstarts        !/* number of different starts */
+        integer start(MAX_RANK)
+        integer edge(MAX_RANK)
+        integer index(MAX_RANK)
+        integer index2(MAX_RANK)
+        integer mid(MAX_RANK)
+        integer count(MAX_RANK)
+        integer sstride(MAX_RANK)
+        integer stride(MAX_RANK)
+        integer imap(MAX_RANK)
+        logical canConvert      !/* Both text or both numeric */
+        logical allInExtRange   !/* all values within external range? */
+        doubleprecision value(MAX_NELS)
+        doubleprecision val
+        integer udshift
+
+        err = nf_create(scratch, NF_CLOBBER, ncid)
+        if (err .ne. 0) then
+            call errore('nf_create: ', err)
+            return
+        end if
+        call def_dims(ncid)
+        call def_vars(ncid)
+        err = nf_enddef(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_enddef: ', err)
+
+        do 1, i = 1, NVARS
+            canConvert = (var_type(i) .eq. NF_CHAR) .eqv.
+     +                   (NFT_DOUBLE .eq. NFT_TEXT)
+            if (.not.(var_rank(i) .le. MAX_RANK))
+     +          stop 2
+            if (.not.(var_nels(i) .le. MAX_NELS))
+     +          stop 2
+            do 2, j = 1, var_rank(i)
+                start(j) = 1
+                edge(j) = 1
+                stride(j) = 1
+                imap(j) = 1
+2           continue
+            err = nf_put_varm_double(BAD_ID, i, start,
+     +                           edge, stride, imap, 
+     +                           value)
+            if (err .ne. NF_EBADID) 
+     +          call errore('bad ncid: ', err)
+            err = nf_put_varm_double(ncid, BAD_VARID, start,
+     +                           edge, stride, 
+     +                           imap, value)
+            if (err .ne. NF_ENOTVAR) 
+     +          call errore('bad var id: ', err)
+            do 3, j = 1, var_rank(i)
+                if (var_dimid(j,i) .ne. RECDIM) then    !/* skip record dim */
+                    start(j) = var_shape(j,i) + 2
+                    err = nf_put_varm_double(ncid, i, start,
+     +                                   edge, stride, 
+     +                                   imap, value)
+                    if (.not. canConvert) then
+                        if (err .ne. NF_ECHAR)
+     +                      call errore('conversion: ', err)
+                    else
+                        if (err .ne. NF_EINVALCOORDS)
+     +                      call errore('bad start: ', err)
+                    endif
+                    start(j) = 1
+                    edge(j) = var_shape(j,i) + 1
+                    err = nf_put_varm_double(ncid, i, start,
+     +                                   edge, stride, 
+     +                                   imap, value)
+                    if (.not. canConvert) then
+                        if (err .ne. NF_ECHAR)
+     +                      call errore('conversion: ', err)
+                    else
+                        if (err .ne. NF_EEDGE)
+     +                      call errore('bad edge: ', err)
+                    endif
+                    edge(j) = 1
+                    stride(j) = 0
+                    err = nf_put_varm_double(ncid, i, start,
+     +                                   edge, stride, 
+     +                                   imap, value)
+                    if (.not. canConvert) then
+                        if (err .ne. NF_ECHAR)
+     +                      call errore('conversion: ', err)
+                    else
+                        if (err .ne. NF_ESTRIDE)
+     +                      call errore('bad stride: ', err)
+                    endif
+                    stride(j) = 1
+                end if
+3           continue
+                !/* Choose a random point dividing each dim into 2 parts */
+                !/* Put 2^rank (nslabs) slabs so defined */
+            nslabs = 1
+            do 4, j = 1, var_rank(i)
+                mid(j) = roll( var_shape(j,i) )
+                nslabs = nslabs * 2
+4           continue
+                !/* bits of k determine whether to put lower or upper part of dim */
+                !/* choose random stride from 1 to edge */
+            do 5, k = 1, nslabs
+                nstarts = 1
+                do 6, j = 1, var_rank(i)
+                    if (mod(udshift(k-1, -(j-1)), 2) .eq. 1) then
+                        start(j) = 1
+                        edge(j) = mid(j)
+                    else
+                        start(j) = 1 + mid(j)
+                        edge(j) = var_shape(j,i) - mid(j)
+                    end if
+                    if (edge(j) .gt. 0) then
+                        stride(j) = 1+roll(edge(j))
+                    else
+                        stride(j) = 1
+                    end if
+                    sstride(j) = stride(j)
+                    nstarts = nstarts * stride(j)
+6               continue
+                do 7, m = 1, nstarts
+                    err = index2indexes(m, var_rank(i), sstride, index)
+                    if (err .ne. 0)
+     +                  call error('error in index2indexes')
+                    nels = 1
+                    do 8, j = 1, var_rank(i)
+                        count(j) = 1 + (edge(j) - index(j)) / stride(j)
+                        nels = nels * count(j)
+                        index(j) = index(j) + start(j) - 1
+8                   continue
+                        !/* Random choice of forward or backward */
+C/* TODO
+C                   if ( roll(2) ) then
+C                       do 9, j = 1, var_rank(i)
+C                           index(j) = index(j) + 
+C     +                         (count(j) - 1) * stride(j)
+C                           stride(j) = -stride(j)
+C9                      continue
+C                   end if
+C*/
+                    if (var_rank(i) .gt. 0) then
+                        imap(1) = 1
+                        do 10, j = 2, var_rank(i)
+                            imap(j) = imap(j-1) * count(j-1)
+10                      continue
+                    end if
+                    allInExtRange = .true.
+                    do 11 j = 1, nels
+                        err = index2indexes(j, var_rank(i), count, 
+     +                                      index2)
+                        if (err .ne. 0)
+     +                      call error('error in index2indexes')
+                        do 12, d = 1, var_rank(i)
+                            index2(d) = index(d) + 
+     +                          (index2(d)-1) * stride(d)
+12                      continue
+                        value(j) = hash_double(var_type(i),
+     +                                       var_rank(i), 
+     +                                       index2, NFT_DOUBLE)
+                        val = value(j)
+                        allInExtRange = allInExtRange .and.
+     +                      inRange3(val, var_type(i), 
+     +                               NFT_DOUBLE)
+11                  continue
+                    err = nf_put_varm_double(ncid,i,index,count,
+     +                                   stride,imap,
+     +                                   value)
+                    if (canConvert) then
+                        if (allInExtRange) then
+                            if (err .ne. 0)
+     +                          call error(nf_strerror(err))
+                        else
+                            if (err .ne. NF_ERANGE)
+     +                          call errore('range error: ', err)
+                        end if
+                    else
+                        if (nels .gt. 0 .and. err .ne. NF_ECHAR)
+     +                      call errore('wrong type: ', err)
+                    end if
+7               continue
+5           continue
+1       continue
+
+        err = nf_close(ncid)
+        if (err .ne. 0) 
+     +      call errore('nf_close: ', err)
+
+        call check_vars_double(scratch)
+
+        err = nf_delete(scratch)
+        if (err .ne. 0)
+     +      call errorc('delete of scratch file failed:', 
+     +          scratch)
+        end
+
+
+        subroutine test_nf_put_att_text()
+        use tests
+        implicit        none
+        integer ncid
+        integer i
+        integer j
+        integer k
+        integer err
+        character       value(MAX_NELS)
+
+        err = nf_create(scratch, NF_NOCLOBBER, ncid)
+        if (err .ne. 0) then
+            call errore('NF_create: ', err)
+            return
+        end if
+        call def_dims(ncid)
+        call def_vars(ncid)
+
+        do 1, i = 0, NVARS
+            do 2, j = 1, NATTS(i)
+                if (ATT_TYPE(j,i) .eq. NF_CHAR) then
+                    if (.not.(ATT_LEN(j,i) .le. MAX_NELS))
+     +                  stop 2
+                    err = nf_put_att_text(BAD_ID, i,
+     +                  ATT_NAME(j,i), ATT_LEN(j,i), value)
+                    if (err .ne. NF_EBADID)
+     +                  call errore('bad ncid: ', err)
+                    err = nf_put_att_text(ncid, BAD_VARID, 
+     +                                    ATT_NAME(j,i), 
+     +                                    ATT_LEN(j,i), value)
+                    if (err .ne. NF_ENOTVAR)
+     +                  call errore('bad var id: ', err)
+                    do 3, k = 1, ATT_LEN(j,i)
+                        value(k) = char(int(hash(ATT_TYPE(j,i), -1, k)))
+3                   continue
+                    err = nf_put_att_text(ncid, i, ATT_NAME(j,i), 
+     +                  ATT_LEN(j,i), value)
+                    if (err .ne. 0)
+     +                  call error(NF_strerror(err))
+                end if
+2           continue
+1       continue
+
+        call check_atts_text(ncid)
+        err = NF_close(ncid)
+        if (err .ne. 0)
+     +      call errore('NF_close: ', err)
+
+        err = nf_delete(scratch)
+        if (err .ne. 0)
+     +      call errorc('delete of scratch file failed:', 
+     +          scratch)
+        end
+
+#ifdef NF_INT1_T
+        subroutine test_nf_put_att_int1()
+        use tests
+        implicit        none
+        integer ncid
+        integer i
+        integer j
+        integer k
+        integer ndx(1)
+        integer err
+        NF_INT1_T value(MAX_NELS)
+        logical allInExtRange  !/* all values within external range? */
+        doubleprecision val
+
+        err = nf_create(scratch, NF_NOCLOBBER, ncid)
+        if (err .ne. 0) then
+            call errore('nf_create: ', err)
+            return
+        end if
+        call def_dims(ncid)
+        call def_vars(ncid)
+
+        do 1, i = 0, NVARS
+            do 2, j = 1, NATTS(i)
+                if (.not.(ATT_TYPE(j,i) .eq. NF_CHAR)) then
+                    if (.not.((ATT_LEN(j,i) .le. MAX_NELS)))
+     +                  stop 2
+                    err = nf_put_att_int1(BAD_ID, i,
+     +                                  ATT_NAME(j,i), 
+     +                                  ATT_TYPE(j,i), 
+     +                                  ATT_LEN(j,i), value)
+                    if (err .ne. NF_EBADID)
+     +                  call errore('bad ncid: ', err)
+                    err = nf_put_att_int1(ncid, BAD_VARID,
+     +                  ATT_NAME(j,i), 
+     +                  ATT_TYPE(j,i), ATT_LEN(j,i), value)
+                    if (err .ne. NF_ENOTVAR)
+     +                  call errore('bad var id: ', err)
+                    err = nf_put_att_int1(ncid, i,
+     +                  ATT_NAME(j,i), BAD_TYPE, 
+     +                  ATT_LEN(j,i), value)
+                    if (err .ne. NF_EBADTYPE)
+     +                  call errore('bad type: ', err)
+                    allInExtRange = .true.
+                    do 3, k = 1, ATT_LEN(j,i)
+                        ndx(1) = k
+                        value(k) = hash_int1(ATT_TYPE(j,i), -1, ndx, 
+     +                                     NFT_INT1)
+                        val = value(k)
+                        allInExtRange = allInExtRange .and.
+     +                      inRange3(val, ATT_TYPE(j,i), 
+     +                               NFT_INT1)
+3                   continue
+                    err = nf_put_att_int1(ncid, i, ATT_NAME(j,i), 
+     +                                  ATT_TYPE(j,i), ATT_LEN(j,i), 
+     +                                  value)
+                    if (allInExtRange) then
+                        if (err .ne. 0)
+     +                      call error(nf_strerror(err))
+                    else
+                        if (err .ne. NF_ERANGE)
+     +                      call errore('range error: ', err)
+                    end if
+                end if
+2           continue
+1       continue
+
+        call check_atts_int1(ncid)
+        err = nf_close(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_close: ', err)
+
+        err = nf_delete(scratch)
+        if (err .ne. 0)
+     +      call errorc('delete of scratch file failed:', 
+     +          scratch)
+        end
+
+#endif
+#ifdef NF_INT2_T
+        subroutine test_nf_put_att_int2()
+        use tests
+        implicit        none
+        integer ncid
+        integer i
+        integer j
+        integer k
+        integer ndx(1)
+        integer err
+        NF_INT2_T value(MAX_NELS)
+        logical allInExtRange  !/* all values within external range? */
+        doubleprecision val
+
+        err = nf_create(scratch, NF_NOCLOBBER, ncid)
+        if (err .ne. 0) then
+            call errore('nf_create: ', err)
+            return
+        end if
+        call def_dims(ncid)
+        call def_vars(ncid)
+
+        do 1, i = 0, NVARS
+            do 2, j = 1, NATTS(i)
+                if (.not.(ATT_TYPE(j,i) .eq. NF_CHAR)) then
+                    if (.not.((ATT_LEN(j,i) .le. MAX_NELS)))
+     +                  stop 2
+                    err = nf_put_att_int2(BAD_ID, i,
+     +                                  ATT_NAME(j,i), 
+     +                                  ATT_TYPE(j,i), 
+     +                                  ATT_LEN(j,i), value)
+                    if (err .ne. NF_EBADID)
+     +                  call errore('bad ncid: ', err)
+                    err = nf_put_att_int2(ncid, BAD_VARID,
+     +                  ATT_NAME(j,i), 
+     +                  ATT_TYPE(j,i), ATT_LEN(j,i), value)
+                    if (err .ne. NF_ENOTVAR)
+     +                  call errore('bad var id: ', err)
+                    err = nf_put_att_int2(ncid, i,
+     +                  ATT_NAME(j,i), BAD_TYPE, 
+     +                  ATT_LEN(j,i), value)
+                    if (err .ne. NF_EBADTYPE)
+     +                  call errore('bad type: ', err)
+                    allInExtRange = .true.
+                    do 3, k = 1, ATT_LEN(j,i)
+                        ndx(1) = k
+                        value(k) = hash_int2(ATT_TYPE(j,i), -1, ndx, 
+     +                                     NFT_INT2)
+                        val = value(k)
+                        allInExtRange = allInExtRange .and.
+     +                      inRange3(val, ATT_TYPE(j,i), 
+     +                               NFT_INT2)
+3                   continue
+                    err = nf_put_att_int2(ncid, i, ATT_NAME(j,i), 
+     +                                  ATT_TYPE(j,i), ATT_LEN(j,i), 
+     +                                  value)
+                    if (allInExtRange) then
+                        if (err .ne. 0)
+     +                      call error(nf_strerror(err))
+                    else
+                        if (err .ne. NF_ERANGE)
+     +                      call errore('range error: ', err)
+                    end if
+                end if
+2           continue
+1       continue
+
+        call check_atts_int2(ncid)
+        err = nf_close(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_close: ', err)
+
+        err = nf_delete(scratch)
+        if (err .ne. 0)
+     +      call errorc('delete of scratch file failed:', 
+     +          scratch)
+        end
+
+#endif
+        subroutine test_nf_put_att_int()
+        use tests
+        implicit        none
+        integer ncid
+        integer i
+        integer j
+        integer k
+        integer ndx(1)
+        integer err
+        integer value(MAX_NELS)
+        logical allInExtRange  !/* all values within external range? */
+        doubleprecision val
+
+        err = nf_create(scratch, NF_NOCLOBBER, ncid)
+        if (err .ne. 0) then
+            call errore('nf_create: ', err)
+            return
+        end if
+        call def_dims(ncid)
+        call def_vars(ncid)
+
+        do 1, i = 0, NVARS
+            do 2, j = 1, NATTS(i)
+                if (.not.(ATT_TYPE(j,i) .eq. NF_CHAR)) then
+                    if (.not.((ATT_LEN(j,i) .le. MAX_NELS)))
+     +                  stop 2
+                    err = nf_put_att_int(BAD_ID, i,
+     +                                  ATT_NAME(j,i), 
+     +                                  ATT_TYPE(j,i), 
+     +                                  ATT_LEN(j,i), value)
+                    if (err .ne. NF_EBADID)
+     +                  call errore('bad ncid: ', err)
+                    err = nf_put_att_int(ncid, BAD_VARID,
+     +                  ATT_NAME(j,i), 
+     +                  ATT_TYPE(j,i), ATT_LEN(j,i), value)
+                    if (err .ne. NF_ENOTVAR)
+     +                  call errore('bad var id: ', err)
+                    err = nf_put_att_int(ncid, i,
+     +                  ATT_NAME(j,i), BAD_TYPE, 
+     +                  ATT_LEN(j,i), value)
+                    if (err .ne. NF_EBADTYPE)
+     +                  call errore('bad type: ', err)
+                    allInExtRange = .true.
+                    do 3, k = 1, ATT_LEN(j,i)
+                        ndx(1) = k
+                        value(k) = hash_int(ATT_TYPE(j,i), -1, ndx, 
+     +                                     NFT_INT)
+                        val = value(k)
+                        allInExtRange = allInExtRange .and.
+     +                      inRange3(val, ATT_TYPE(j,i), 
+     +                               NFT_INT)
+3                   continue
+                    err = nf_put_att_int(ncid, i, ATT_NAME(j,i), 
+     +                                  ATT_TYPE(j,i), ATT_LEN(j,i), 
+     +                                  value)
+                    if (allInExtRange) then
+                        if (err .ne. 0)
+     +                      call error(nf_strerror(err))
+                    else
+                        if (err .ne. NF_ERANGE)
+     +                      call errore('range error: ', err)
+                    end if
+                end if
+2           continue
+1       continue
+
+        call check_atts_int(ncid)
+        err = nf_close(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_close: ', err)
+
+        err = nf_delete(scratch)
+        if (err .ne. 0)
+     +      call errorc('delete of scratch file failed:', 
+     +          scratch)
+        end
+
+        subroutine test_nf_put_att_real()
+        use tests
+        implicit        none
+        integer ncid
+        integer i
+        integer j
+        integer k
+        integer ndx(1)
+        integer err
+        real value(MAX_NELS)
+        logical allInExtRange  !/* all values within external range? */
+        doubleprecision val
+
+        err = nf_create(scratch, NF_NOCLOBBER, ncid)
+        if (err .ne. 0) then
+            call errore('nf_create: ', err)
+            return
+        end if
+        call def_dims(ncid)
+        call def_vars(ncid)
+
+        do 1, i = 0, NVARS
+            do 2, j = 1, NATTS(i)
+                if (.not.(ATT_TYPE(j,i) .eq. NF_CHAR)) then
+                    if (.not.((ATT_LEN(j,i) .le. MAX_NELS)))
+     +                  stop 2
+                    err = nf_put_att_real(BAD_ID, i,
+     +                                  ATT_NAME(j,i), 
+     +                                  ATT_TYPE(j,i), 
+     +                                  ATT_LEN(j,i), value)
+                    if (err .ne. NF_EBADID)
+     +                  call errore('bad ncid: ', err)
+                    err = nf_put_att_real(ncid, BAD_VARID,
+     +                  ATT_NAME(j,i), 
+     +                  ATT_TYPE(j,i), ATT_LEN(j,i), value)
+                    if (err .ne. NF_ENOTVAR)
+     +                  call errore('bad var id: ', err)
+                    err = nf_put_att_real(ncid, i,
+     +                  ATT_NAME(j,i), BAD_TYPE, 
+     +                  ATT_LEN(j,i), value)
+                    if (err .ne. NF_EBADTYPE)
+     +                  call errore('bad type: ', err)
+                    allInExtRange = .true.
+                    do 3, k = 1, ATT_LEN(j,i)
+                        ndx(1) = k
+                        value(k) = hash_real(ATT_TYPE(j,i), -1, ndx, 
+     +                                     NFT_REAL)
+                        val = value(k)
+                        allInExtRange = allInExtRange .and.
+     +                      inRange3(val, ATT_TYPE(j,i), 
+     +                               NFT_REAL)
+3                   continue
+                    err = nf_put_att_real(ncid, i, ATT_NAME(j,i), 
+     +                                  ATT_TYPE(j,i), ATT_LEN(j,i), 
+     +                                  value)
+                    if (allInExtRange) then
+                        if (err .ne. 0)
+     +                      call error(nf_strerror(err))
+                    else
+                        if (err .ne. NF_ERANGE)
+     +                      call errore('range error: ', err)
+                    end if
+                end if
+2           continue
+1       continue
+
+        call check_atts_real(ncid)
+        err = nf_close(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_close: ', err)
+
+        err = nf_delete(scratch)
+        if (err .ne. 0)
+     +      call errorc('delete of scratch file failed:', 
+     +          scratch)
+        end
+
+        subroutine test_nf_put_att_double()
+        use tests
+        implicit        none
+        integer ncid
+        integer i
+        integer j
+        integer k
+        integer ndx(1)
+        integer err
+        doubleprecision value(MAX_NELS)
+        logical allInExtRange  !/* all values within external range? */
+        doubleprecision val
+
+        err = nf_create(scratch, NF_NOCLOBBER, ncid)
+        if (err .ne. 0) then
+            call errore('nf_create: ', err)
+            return
+        end if
+        call def_dims(ncid)
+        call def_vars(ncid)
+
+        do 1, i = 0, NVARS
+            do 2, j = 1, NATTS(i)
+                if (.not.(ATT_TYPE(j,i) .eq. NF_CHAR)) then
+                    if (.not.((ATT_LEN(j,i) .le. MAX_NELS)))
+     +                  stop 2
+                    err = nf_put_att_double(BAD_ID, i,
+     +                                  ATT_NAME(j,i), 
+     +                                  ATT_TYPE(j,i), 
+     +                                  ATT_LEN(j,i), value)
+                    if (err .ne. NF_EBADID)
+     +                  call errore('bad ncid: ', err)
+                    err = nf_put_att_double(ncid, BAD_VARID,
+     +                  ATT_NAME(j,i), 
+     +                  ATT_TYPE(j,i), ATT_LEN(j,i), value)
+                    if (err .ne. NF_ENOTVAR)
+     +                  call errore('bad var id: ', err)
+                    err = nf_put_att_double(ncid, i,
+     +                  ATT_NAME(j,i), BAD_TYPE, 
+     +                  ATT_LEN(j,i), value)
+                    if (err .ne. NF_EBADTYPE)
+     +                  call errore('bad type: ', err)
+                    allInExtRange = .true.
+                    do 3, k = 1, ATT_LEN(j,i)
+                        ndx(1) = k
+                        value(k) = hash_double(ATT_TYPE(j,i), -1, ndx, 
+     +                                     NFT_DOUBLE)
+                        val = value(k)
+                        allInExtRange = allInExtRange .and.
+     +                      inRange3(val, ATT_TYPE(j,i), 
+     +                               NFT_DOUBLE)
+3                   continue
+                    err = nf_put_att_double(ncid, i, ATT_NAME(j,i), 
+     +                                  ATT_TYPE(j,i), ATT_LEN(j,i), 
+     +                                  value)
+                    if (allInExtRange) then
+                        if (err .ne. 0)
+     +                      call error(nf_strerror(err))
+                    else
+                        if (err .ne. NF_ERANGE)
+     +                      call errore('range error: ', err)
+                    end if
+                end if
+2           continue
+1       continue
+
+        call check_atts_double(ncid)
+        err = nf_close(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_close: ', err)
+
+        err = nf_delete(scratch)
+        if (err .ne. 0)
+     +      call errorc('delete of scratch file failed:', 
+     +          scratch)
+        end
+
diff --git a/nf03_test/test03_read.F b/nf03_test/test03_read.F
new file mode 100755
index 0000000..0ae4f28
--- /dev/null
+++ b/nf03_test/test03_read.F
@@ -0,0 +1,1069 @@
+C*********************************************************************
+C   Copyright 1996, UCAR/Unidata
+C   See netcdf/COPYRIGHT file for copying and redistribution conditions.
+C   $Id: test_read.F,v 1.13 2006/09/25 20:09:26 ed Exp $
+C*********************************************************************
+
+C Test nf_strerror.
+C    Try on a bad error status.
+C    Test for each defined error status.
+C
+        subroutine test_nf_strerror()
+        use tests
+        implicit        none
+        integer         number_of_messages
+        parameter       (number_of_messages = 27)
+
+        integer         i
+        integer         status(number_of_messages)
+        character*80    message
+        character*80    msg(number_of_messages)
+
+        data    status(1)  / NF_NOERR/
+        data    status(2)  / NF_EBADID /
+        data    status(3)  / NF_EEXIST /
+        data    status(4)  / NF_EINVAL /
+        data    status(5)  / NF_EPERM /
+        data    status(6)  / NF_ENOTINDEFINE /
+        data    status(7)  / NF_EINDEFINE /
+        data    status(8)  / NF_EINVALCOORDS /
+        data    status(9)  / NF_EMAXDIMS /
+        data    status(10) / NF_ENAMEINUSE /
+        data    status(11) / NF_ENOTATT /
+        data    status(12) / NF_EMAXATTS /
+        data    status(13) / NF_EBADTYPE /
+        data    status(14) / NF_EBADDIM /
+        data    status(15) / NF_EUNLIMPOS /
+        data    status(16) / NF_EMAXVARS /
+        data    status(17) / NF_ENOTVAR /
+        data    status(18) / NF_EGLOBAL /
+        data    status(19) / NF_ENOTNC /
+        data    status(20) / NF_ESTS /
+        data    status(21) / NF_EMAXNAME /
+        data    status(22) / NF_EUNLIMIT /
+        data    status(23) / NF_ENORECVARS /
+        data    status(24) / NF_ECHAR /
+        data    status(25) / NF_EEDGE /
+        data    status(26) / NF_ESTRIDE /
+        data    status(27) / NF_EBADNAME /
+
+        data msg(1)  / 'No error' /
+        data msg(2)  / 'NetCDF: Not a valid ID' /
+        data msg(3)  / 'NetCDF: File exists && NC_NOCLOBBER' /
+        data msg(4)  / 'NetCDF: Invalid argument' /
+        data msg(5)  / 'NetCDF: Write to read only' /
+        data msg(6)  / 'NetCDF: Operation not allowed in data mode' /
+        data msg(7)  / 'NetCDF: Operation not allowed in define mode' /
+        data msg(8)  / 'NetCDF: Index exceeds dimension bound' /
+        data msg(9)  / 'NetCDF: NC_MAX_DIMS exceeded' /
+        data msg(10) / 'NetCDF: String match to name in use' /
+        data msg(11) / 'NetCDF: Attribute not found' /
+        data msg(12) / 'NetCDF: NC_MAX_ATTRS exceeded' /
+        data msg(13)
+     +  / 'NetCDF: Not a valid data type or _FillValue type mismatch' /
+        data msg(14) / 'NetCDF: Invalid dimension ID or name' /
+        data msg(15) / 'NetCDF: NC_UNLIMITED in the wrong index' /
+        data msg(16) / 'NetCDF: NC_MAX_VARS exceeded' /
+        data msg(17) / 'NetCDF: Variable not found' /
+        data msg(18) / 'NetCDF: Action prohibited on NC_GLOBAL varid' /
+        data msg(19) / 'NetCDF: Unknown file format' /
+        data msg(20) / 'NetCDF: In Fortran, string too short' /
+        data msg(21) / 'NetCDF: NC_MAX_NAME exceeded' /
+        data msg(22) / 'NetCDF: NC_UNLIMITED size already in use' /
+        data msg(23) 
+     +  / 'NetCDF: nc_rec op when there are no record vars' /
+        data msg(24) 
+     +  /'NetCDF: Attempt to convert between text & numbers'/
+        data msg(25) / 'NetCDF: Start+count exceeds dimension bound' /
+        data msg(26) / 'NetCDF: Illegal stride' /
+        data msg(27) / 'NetCDF: Name contains illegal characters' /
+
+C       /* Try on a bad error status */
+        message = nf_strerror(-666)!/* should fail */
+        if (message .ne. 'Unknown Error')
+     +      call errorc('nf_strerror on bad error status returned: ',
+     +          message)
+
+C       /* Try on each legitimate error status */
+        do 1, i=1, number_of_messages
+            message = nf_strerror(status(i))
+            if (message .ne. msg(i))
+     +          call error('nf_strerror() should return "' // msg(i) //
+     +                     '"')
+1       continue
+        end
+
+
+C Test nf_open.
+C If in read-only section of tests,
+C    Try to open a non-existent netCDF file, check error return.
+C    Open a file that is not a netCDF file, check error return.
+C    Open a netCDF file with a bad mode argument, check error return.
+C    Open a netCDF file with NF_NOWRITE mode, try to write, check error.
+C    Try to open a netcdf twice, check whether returned netcdf ids different.
+C If in writable section of tests,
+C    Open a netCDF file with NF_WRITE mode, write something, close it.
+C On exit, any open netCDF files are closed.
+        subroutine test_nf_open()
+        use tests
+        implicit        none
+        integer err
+        integer ncid
+        integer ncid2
+        character TEMPFILE*8
+        integer unit51
+C       /* Create a non-netCDF file named 'temp.tmp' */
+        unit51 = 51
+        TEMPFILE = 'temp.tmp'
+        OPEN(unit51, FILE=TEMPFILE)
+        WRITE(51,*) 'text'
+        CLOSE(51)
+        
+C       /* Try to open a nonexistent file */
+        err = nf_open('tooth-fairy.nc', NF_NOWRITE, ncid)!/* should fail */
+        if (err .eq. NF_NOERR)
+     +      call error('nf_open of nonexistent file should have failed')
+        if (.not. NF_ISSYSERR(err))
+     +      call error(
+     +  'nf_open of nonexistent file should have returned system error')
+
+C       /* Open a file that is not a netCDF file. */
+        err = nf_open(TEMPFILE, NF_NOWRITE, ncid)!/* should fail */
+        if (err .ne. NF_ENOTNC)
+     +      call errore('nf_open of non-netCDF file: ', err)
+
+C       /* Open a netCDF file in read-only mode, check that write fails */
+        err = nf_open(testfile, NF_NOWRITE, ncid)
+        if (err .ne. 0)
+     +      call errore('nf_open: ', err)
+        err = nf_redef(ncid)    !/* should fail */
+        if (err .ne. NF_EPERM)
+     +      call error('nf_redef of read-only file should fail')
+C       /* Opened OK, see if can open again and get a different netCDF ID */
+        err = nf_open(testfile, NF_NOWRITE, ncid2)
+        if (err .ne. 0) then
+            call errore('nf_open: ', err)
+        else
+            err = nf_close(ncid2)
+        end if
+        if (ncid2 .eq. ncid)
+     +      call error(
+     +  'netCDF IDs for first and second nf_open calls should differ')
+
+        if (.not. readonly) then        !/* tests using netCDF scratch file */
+            err = nf_create(scratch, NF_NOCLOBBER, ncid2)
+            if (err .ne. 0) then
+                call errore('nf_create: ', err)
+            else 
+                err = nf_close(ncid2)
+            end if
+            err = nf_open(scratch, NF_WRITE, ncid2)
+            if (err .ne. 0) then
+                call errore('nf_open: ', err)
+            else 
+                err = nf_close(ncid2)
+            end if
+            err = nf_delete(scratch)
+            if (err .ne. 0) 
+     +          call errorc('delete of scratch file failed', scratch)
+        end if
+
+        err = nf_close(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_close: ', err)
+        end
+
+
+C 
+C Test nf_close.
+C    Try to close a netCDF file twice, check whether second close fails.
+C    Try on bad handle, check error return.
+C    Try in define mode and data mode.
+C/
+        subroutine test_nf_close()
+        use tests
+        implicit        none
+        integer ncid
+        integer err
+
+        err = nf_open(testfile, NF_NOWRITE, ncid)
+        if (err .ne. 0)
+     +      call errore('nf_open: ', err)
+
+C       /* Close a netCDF file twice, second time should fail */
+        err = nf_close(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_close failed: ', err)
+        err = nf_close(ncid)
+        if (err .ne. NF_EBADID)
+     +      call error('nf_close of closed file should have failed')
+        
+C       /* Try with a bad netCDF ID */
+        err = nf_close(BAD_ID)!/* should fail */
+        if (err .ne. NF_EBADID)
+     +      call errore(
+     +          'nf_close with bad netCDF ID returned wrong error: ', 
+     +          err)
+
+C       /* Close in data mode */
+        err = nf_open(testfile, NF_NOWRITE, ncid)
+        if (err .ne. 0)
+     +      call errore('nf_open: ', err)
+        err = nf_close(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_close in data mode failed: ', err)
+
+        if (.not. readonly) then        !/* tests using netCDF scratch file */
+            err = nf_create(scratch, NF_NOCLOBBER, ncid)
+            if (err .ne. 0) 
+     +          call errore('nf_create: ', err)
+            err = nf_close(ncid)
+            if (err .ne. 0)
+     +          call errore('nf_close in define mode: ', err)
+            err = nf_delete(scratch)
+            if (err .ne. 0)
+     +          call errorc('delete of scratch file failed: ', 
+     +              scratch)
+        end if
+        end
+
+
+C Test nf_inq.
+C    Try on bad handle, check error return.
+C    Try in data mode, check returned values.
+C    Try asking for subsets of info.
+C If in writable section of tests,
+C    Try in define mode, after adding an unlimited dimension, variable.
+C On exit, any open netCDF files are closed.
+        subroutine test_nf_inq()
+        use tests, NDIMSG=>NDIMS, NGATTSG=>NGATTS, NVARSG=>NVARS,       &
+     &             RECDIMG=>RECDIM
+        implicit        none
+        integer ncid
+        integer ncid2                   !/* for scratch netCDF dataset */
+        integer ndims                   !/* number of dimensions */
+        integer nvars                   !/* number of variables */
+        integer ngatts                  !/* number of global attributes */
+        integer recdim                  !/* id of unlimited dimension */
+        integer err
+        integer ndims0
+        integer nvars0
+        integer ngatts0
+        integer recdim0
+        integer did
+        integer vid
+
+        err = nf_open(testfile, NF_NOWRITE, ncid)
+        if (err .ne. 0)
+     +      call errore('nf_open: ', err)
+        
+C       /* Try on bad handle */
+        err = nf_inq(BAD_ID, ndims, nvars, ngatts, recdim)
+        if (err .ne. NF_EBADID)
+     +      call errore('bad ncid: ', err)
+        
+        err = nf_inq(ncid, ndims, nvars, ngatts, recdim)
+        if (err .ne. 0) then
+            call errore('nf_inq: ', err)
+        else if (ndims .ne. NDIMS) then
+            call errori('nf_inq: wrong number of dimensions returned: ',
+     +                  ndims)
+        else if (nvars .ne. NVARS) then
+            call errori('nf_inq: wrong number of variables returned: ',
+     +                  nvars)
+        else if (ngatts .ne. NGATTS) then
+            call errori(
+     +          'nf_inq: wrong number of global atts returned: ',
+     +          ngatts)
+        else if (recdim .ne. RECDIM) then
+            call errori('nf_inq: wrong record dimension ID returned: ',
+     +                  recdim)
+        end if
+
+        if (.not. readonly) then        !/* tests using netCDF scratch file */
+            err = nf_create(scratch, NF_NOCLOBBER, ncid2)
+            if (err .ne. 0) then
+                call errore('nf_create: ', err)
+            else                !/* add dim, var, gatt, check inq */
+                err = nf_enddef(ncid2) !/* enter data mode */
+                err = nf_inq(ncid2, ndims0, nvars0, ngatts0, recdim0)
+                if (err .ne. 0)
+     +              call errore('nf_inq: ', err)
+                err = nf_redef(ncid2) !/* enter define mode */
+C               /* Check that inquire still works in define mode */
+                err = nf_inq(ncid2, ndims, nvars, ngatts, recdim)
+                if (err .ne. 0) then
+                    call errore('nf_inq in define mode: ', err)
+                else if (ndims .ne. ndims0) then
+                    call errori('nf_inq in define mode: ndims wrong, ',
+     +                          ndims)
+                else if (nvars .ne. nvars0) then
+                    call errori('nf_inq in define mode: nvars wrong, ',
+     +                          nvars)
+                else if (ngatts .ne. ngatts0) then
+                    call errori(
+     +                  'nf_inq in define mode: ngatts wrong, ', ngatts)
+                else if (recdim .ne. recdim0) then
+                    call errori('nf_inq in define mode: recdim wrong, ',
+     +                          recdim)
+                end if
+
+C               /* Add dim, var, global att */
+                err = nf_def_dim(ncid2, 'inqd', 1, did)
+                if (err .ne. 0)
+     +              call errore('nf_def_dim: ', err)
+                err = nf_def_var(ncid2, 'inqv', NF_FLOAT, 0, (/0/), vid)
+                if (err .ne. 0)
+     +              call errore('nf_def_var: ', err)
+
+                err = nf_put_att_text(ncid2, NF_GLOBAL, 'inqa', 
+     +                                len('stuff'), 'stuff')
+                if (err .ne. 0)
+     +              call errore('nf_put_att_text: ', err)
+
+C               /* Make sure nf_inq sees the additions while in define mode */
+                err = nf_inq(ncid2, ndims, nvars, ngatts, recdim)
+                if (err .ne. 0) then
+                    call errore('nf_inq in define mode: ', err)
+                else if (ndims .ne. ndims0 + 1) then
+                    call errori('nf_inq in define mode: ndims wrong, ',
+     +                          ndims)
+                else if (nvars .ne. nvars0 + 1) then
+                    call errori('nf_inq in define mode: nvars wrong, ',
+     +                          nvars)
+                else if (ngatts .ne. ngatts0 + 1) then
+                    call errori('nf_inq in define mode: ngatts wrong, ',
+     +                          ngatts)
+                end if
+                err = nf_enddef(ncid2)
+                if (err .ne. 0)
+     +              call errore('nf_enddef: ', err)
+
+C               /* Make sure nf_inq stills sees additions in data mode */
+                err = nf_inq(ncid2, ndims, nvars, ngatts, recdim)
+                if (err .ne. 0) then
+                    call errore('nf_inq failed in data mode: ',err)
+                else if (ndims .ne. ndims0 + 1) then
+                    call errori('nf_inq in define mode: ndims wrong, ',
+     +                          ndims)
+                else if (nvars .ne. nvars0 + 1) then
+                    call errori('nf_inq in define mode: nvars wrong, ',
+     +                          nvars)
+                else if (ngatts .ne. ngatts0 + 1) then
+                    call errori('nf_inq in define mode: ngatts wrong, ',
+     +                          ngatts)
+                end if
+                err = nf_close(ncid2)
+                err = nf_delete(scratch)
+                if (err .ne. 0)
+     +              call errorc('delete of scratch file failed:', 
+     +                  scratch)
+            end if
+        end if
+
+        err = nf_close(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_close: ', err)
+        end
+
+
+        subroutine test_nf_inq_natts()
+        use tests, NDIMSG=>NDIMS, NGATTSG=>NGATTS
+        implicit        none
+        integer ncid
+        integer ngatts                  !/* number of global attributes */
+        integer err
+
+        err = nf_inq_natts(BAD_ID, ngatts)
+        if (err .ne. NF_EBADID)
+     +      call errore('bad ncid: ', err)
+        err = nf_open(testfile, NF_NOWRITE, ncid)
+        if (err .ne. 0)
+     +      call errore('nf_open: ', err)
+        err = nf_inq_natts(ncid, ngatts)
+        if (err .ne. 0) then
+            call errore('nf_inq_natts: ', err)
+        else if (ngatts .ne. NGATTS) then
+            call errori(
+     +          'nf_inq_natts: wrong number of global atts returned, ',
+     +          ngatts)
+        end if
+        err = nf_close(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_close: ', err)
+        end
+
+
+        subroutine test_nf_inq_ndims()
+        use tests, NDIMSG=>NDIMS, NGATTSG=>NGATTS
+        implicit        none
+        integer ncid
+        integer ndims
+        integer err
+
+        err = nf_inq_ndims(BAD_ID, ndims)
+        if (err .ne. NF_EBADID)
+     +      call errore('bad ncid: ', err)
+        err = nf_open(testfile, NF_NOWRITE, ncid)
+        if (err .ne. 0)
+     +      call errore('nf_open: ', err)
+        err = nf_inq_ndims(ncid, ndims)
+        if (err .ne. 0) then
+            call errore('nf_inq_ndims: ', err)
+        else if (ndims .ne. NDIMS) then
+            call errori('nf_inq_ndims: wrong number returned, ', ndims)
+        end if
+        err = nf_close(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_close: ', err)
+        end
+
+
+        subroutine test_nf_inq_nvars()
+        use tests, NVARSG=>NVARS
+        implicit        none
+        integer ncid
+        integer nvars
+        integer err
+
+        err = nf_inq_nvars(BAD_ID, nvars)
+        if (err .ne. NF_EBADID)
+     +      call errore('bad ncid: ', err)
+        err = nf_open(testfile, NF_NOWRITE, ncid)
+        if (err .ne. 0)
+     +      call errore('nf_open: ', err)
+        err = nf_inq_nvars(ncid, nvars)
+        if (err .ne. 0) then
+            call errore('nf_inq_nvars: ', err)
+        else if (nvars .ne. NVARS) then
+            call errori('nf_inq_nvars: wrong number returned, ', nvars)
+        end if
+        err = nf_close(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_close: ', err)
+        end
+
+
+        subroutine test_nf_inq_unlimdim()
+        use tests
+        implicit        none
+        integer ncid
+        integer unlimdim
+        integer err
+
+        err = nf_inq_unlimdim(BAD_ID, unlimdim)
+        if (err .ne. NF_EBADID)
+     +      call errore('bad ncid: ', err)
+        err = nf_open(testfile, NF_NOWRITE, ncid)
+        if (err .ne. 0)
+     +      call errore('nf_open: ', err)
+        err = nf_inq_unlimdim(ncid, unlimdim)
+        if (err .ne. 0) then
+            call errore('nf_inq_unlimdim: ', err)
+        else if (unlimdim .ne. RECDIM) then
+            call errori('nf_inq_unlimdim: wrong number returned, ', 
+     +                  unlimdim)
+        end if
+        err = nf_close(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_close: ', err)
+        end
+
+
+        subroutine test_nf_inq_format()
+        use tests
+        implicit        none
+        integer ncid
+        integer nformat
+        integer err
+
+        err = nf_inq_format(BAD_ID, nformat)
+        if (err .ne. NF_EBADID)
+     +      call errore('bad ncid: ', err)
+        err = nf_open(testfile, NF_NOWRITE, ncid)
+        if (err .ne. 0)
+     +      call errore('nf_open: ', err)
+        err = nf_inq_format(ncid, nformat)
+        if (err .ne. 0) then
+            call errore('nf_inq_format: ', err)
+        else if (nformat .ne. nf_format_classic .and.
+     +           nformat .ne. nf_format_64bit) then
+            call errori('nf_inq_format: wrong format number returned, ', 
+     +                  nformat)
+        end if
+        err = nf_close(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_close: ', err)
+        end
+
+
+        subroutine test_nf_inq_dimid()
+        use tests
+        implicit        none
+        integer ncid
+        integer dimid
+        integer i
+        integer err
+
+        err = nf_open(testfile, NF_NOWRITE, ncid)
+        if (err .ne. 0)
+     +      call errore('nf_open: ', err)
+        err = nf_inq_dimid(ncid, 'noSuch', dimid)
+        if (err .ne. NF_EBADDIM)
+     +      call errore('bad dim name: ', err)
+        do 1, i = 1, NDIMS
+            err = nf_inq_dimid(BAD_ID, dim_name(i), dimid)
+            if (err .ne. NF_EBADID)
+     +          call errore('bad ncid: ', err)
+            err = nf_inq_dimid(ncid, dim_name(i), dimid)
+            if (err .ne. 0) then
+                call errore('nf_inq_dimid: ', err)
+            else if (dimid .ne. i) then
+                call errori('expected ', i)
+                call errori('got ', dimid)
+            end if
+1       continue
+        err = nf_close(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_close: ', err)
+        end
+
+
+        subroutine test_nf_inq_dim()
+        use tests
+        implicit        none
+        integer ncid
+        integer i
+        integer err
+        character*(NF_MAX_NAME) name
+        integer length
+
+        err = nf_open(testfile, NF_NOWRITE, ncid)
+        if (err .ne. 0)
+     +      call errore('nf_open: ', err)
+        do 1, i = 1, NDIMS
+            err = nf_inq_dim(BAD_ID, i, name, length)
+            if (err .ne. NF_EBADID)
+     +          call errore('bad ncid: ', err)
+            err = nf_inq_dim(ncid, BAD_DIMID, name, length)
+            if (err .ne. NF_EBADDIM)
+     +          call errore('bad dimid: ', err)
+            err = nf_inq_dim(ncid, i, name, length)
+            if (err .ne. 0) then
+                call errore('nf_inq_dim: ', err)
+            else if (dim_name(i) .ne. name)  then
+                call errorc('name unexpected: ', name)
+            else if (dim_len(i) .ne. length) then
+                call errori('size unexpected: ', length)
+            end if
+1       continue
+        err = nf_close(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_close: ', err)
+        end
+
+
+        subroutine test_nf_inq_dimlen()
+        use tests
+        implicit        none
+        integer ncid
+        integer i
+        integer err
+        integer length
+
+        err = nf_open(testfile, NF_NOWRITE, ncid)
+        if (err .ne. 0)
+     +      call errore('nf_open: ', err)
+        do 1, i = 1, NDIMS
+            err = nf_inq_dimlen(BAD_ID, i, length)
+            if (err .ne. NF_EBADID)
+     +          call errore('bad ncid: ', err)
+            err = nf_inq_dimlen(ncid, BAD_DIMID, length)
+            if (err .ne. NF_EBADDIM)
+     +          call errore('bad dimid: ', err)
+            err = nf_inq_dimlen(ncid, i, length)
+            if (err .ne. 0) then
+                call errore('nf_inq_dimlen: ', err)
+            else if (dim_len(i) .ne. length) then
+                call errori('size unexpected: ', length)
+            end if
+1       continue
+        err = nf_close(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_close: ', err)
+        end
+
+
+        subroutine test_nf_inq_dimname()
+        use tests
+        implicit        none
+        integer ncid
+        integer i
+        integer err
+        character*(NF_MAX_NAME)  name
+
+        err = nf_open(testfile, NF_NOWRITE, ncid)
+        if (err .ne. 0)
+     +      call errore('nf_open: ', err)
+        do 1, i = 1, NDIMS
+            err = nf_inq_dimname(BAD_ID, i, name)
+            if (err .ne. NF_EBADID)
+     +          call errore('bad ncid: ', err)
+            err = nf_inq_dimname(ncid, BAD_DIMID, name)
+            if (err .ne. NF_EBADDIM)
+     +          call errore('bad dimid: ', err)
+            err = nf_inq_dimname(ncid, i, name)
+            if (err .ne. 0) then
+                call errore('nf_inq_dimname: ', err)
+            else if (dim_name(i) .ne. name)  then
+                call errorc('name unexpected: ', name)
+            end if
+1       continue
+        err = nf_close(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_close: ', err)
+        end
+
+
+        subroutine test_nf_inq_varid()
+        use tests
+        implicit        none
+        integer ncid
+        integer vid
+        integer i
+        integer err
+
+        err = nf_open(testfile, NF_NOWRITE, ncid)
+        if (err .ne. 0)
+     +      call errore('nf_open: ', err)
+
+        err = nf_inq_varid(ncid, 'noSuch', vid)
+        if (err .ne. NF_ENOTVAR)
+     +      call errore('bad ncid: ', err)
+
+        do 1, i = 1, NVARS
+            err = nf_inq_varid(BAD_ID, var_name(i), vid)
+            if (err .ne. NF_EBADID)
+     +          call errore('bad ncid: ', err)
+            err = nf_inq_varid(ncid, var_name(i), vid)
+            if (err .ne. 0) then
+                call errore('nf_inq_varid: ', err)
+            else if (vid .ne. i) then
+                call errori('varid unexpected: ', vid)
+            endif
+1       continue
+
+        err = nf_close(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_close: ', err)
+        end
+
+
+        subroutine test_nf_inq_var()
+        use tests, NDIMSG=>NDIMS
+        implicit        none
+        integer ncid
+        integer i
+        integer err
+        character*(NF_MAX_NAME) name
+        integer datatype
+        integer ndims
+        integer dimids(MAX_RANK)
+        integer na
+
+        err = nf_open(testfile, NF_NOWRITE, ncid)
+        if (err .ne. 0)
+     +      call errore('nf_open: ', err)
+        do 1, i = 1, NVARS
+            err = nf_inq_var(BAD_ID, i, name, datatype, ndims, dimids, 
+     +                       na)
+            if (err .ne. NF_EBADID)
+     +          call errore('bad ncid: ', err)
+            err = nf_inq_var(ncid,BAD_VARID,name,datatype,ndims,dimids,
+     +                       na)
+            if (err .ne. NF_ENOTVAR)
+     +          call errore('bad var id: ', err)
+            err = nf_inq_var(ncid, i, name, datatype, ndims, dimids, 
+     +                       na)
+            if (err .ne. 0) then
+                call errore('nf_inq_var: ', err)
+            else if (var_name(i) .ne. name)  then
+                call errorc('name unexpected: ', name)
+            else if (var_type(i) .ne. datatype) then
+                call errori('type unexpected: ', datatype)
+            else if (var_rank(i) .ne. ndims) then
+                call errori('ndims expected: ', ndims)
+            else if (.not.int_vec_eq(var_dimid(1,i),dimids,ndims)) then
+                call error('unexpected dimid')
+            else if (var_natts(i) .ne. na) then
+                call errori('natts unexpected: ', na)
+            end if
+1       continue
+        err = nf_close(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_close: ', err)
+        end
+
+
+        subroutine test_nf_inq_vardimid()
+        use tests
+        implicit        none
+        integer ncid
+        integer i
+        integer err
+        integer dimids(MAX_RANK)
+
+        err = nf_open(testfile, NF_NOWRITE, ncid)
+        if (err .ne. 0)
+     +      call errore('nf_open: ', err)
+        do 1, i = 1, NVARS
+            err = nf_inq_vardimid(BAD_ID, i, dimids)
+            if (err .ne. NF_EBADID)
+     +          call errore('bad ncid: ', err)
+            err = nf_inq_vardimid(ncid, BAD_VARID, dimids)
+            if (err .ne. NF_ENOTVAR)
+     +          call errore('bad var id: ', err)
+            err = nf_inq_vardimid(ncid, i, dimids)
+            if (err .ne. 0) then
+                call errore('nf_inq_vardimid: ', err)
+            else if (.not.int_vec_eq(var_dimid(1,i), dimids, 
+     +               var_rank(i))) then
+                call error('unexpected dimid')
+            end if
+1       continue
+        err = nf_close(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_close: ', err)
+        end
+
+
+        subroutine test_nf_inq_varname()
+        use tests
+        implicit        none
+        integer ncid
+        integer i
+        integer err
+        character*(NF_MAX_NAME) name
+
+        err = nf_open(testfile, NF_NOWRITE, ncid)
+        if (err .ne. 0)
+     +      call errore('nf_open: ', err)
+        do 1, i = 1, NVARS
+            err = nf_inq_varname(BAD_ID, i, name)
+            if (err .ne. NF_EBADID)
+     +          call errore('bad ncid: ', err)
+            err = nf_inq_varname(ncid, BAD_VARID, name)
+            if (err .ne. NF_ENOTVAR)
+     +          call errore('bad var id: ', err)
+            err = nf_inq_varname(ncid, i, name)
+            if (err .ne. 0) then
+                call errore('nf_inq_varname: ', err)
+            else if (var_name(i) .ne. name)  then
+                call errorc('name unexpected: ', name)
+            end if
+1       continue
+        err = nf_close(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_close: ', err)
+        end
+
+
+        subroutine test_nf_inq_varnatts()
+        use tests
+        implicit        none
+        integer ncid
+        integer i
+        integer err
+        integer na
+
+        err = nf_open(testfile, NF_NOWRITE, ncid)
+        if (err .ne. 0)
+     +      call errore('nf_open: ', err)
+        do 1, i = 0, NVARS	! start with global attributes
+            err = nf_inq_varnatts(BAD_ID, i, na)
+            if (err .ne. NF_EBADID)
+     +          call errore('bad ncid: ', err)
+            err = nf_inq_varnatts(ncid, BAD_VARID, na)
+            if (err .ne. NF_ENOTVAR)
+     +          call errore('bad var id: ', err)
+            err = nf_inq_varnatts(ncid, VARID(i), na)
+            if (err .ne. 0) then
+                call errore('nf_inq_varnatts: ', err)
+            else if (NATTS(i) .ne. na) then	! works for global attributes
+                call errori('natts unexpected: ', na)
+            end if
+1       continue
+        err = nf_close(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_close: ', err)
+        end
+
+
+        subroutine test_nf_inq_varndims()
+        use tests, NDIMSG=>NDIMS
+        implicit        none
+        integer ncid
+        integer i
+        integer err
+        integer ndims
+
+        err = nf_open(testfile, NF_NOWRITE, ncid)
+        if (err .ne. 0)
+     +      call errore('nf_open: ', err)
+        do 1, i = 1, NVARS
+            err = nf_inq_varndims(BAD_ID, i, ndims)
+            if (err .ne. NF_EBADID)
+     +          call errore('bad ncid: ', err)
+            err = nf_inq_varndims(ncid, BAD_VARID, ndims)
+            if (err .ne. NF_ENOTVAR)
+     +          call errore('bad var id: ', err)
+            err = nf_inq_varndims(ncid, i, ndims)
+            if (err .ne. 0) then
+                call errore('nf_inq_varndims: ', err)
+            else if (var_rank(i) .ne. ndims) then
+                call errori('ndims unexpected: ', ndims)
+            end if
+1       continue
+        err = nf_close(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_close: ', err)
+        end
+
+
+        subroutine test_nf_inq_vartype()
+        use tests
+        implicit        none
+        integer ncid
+        integer i
+        integer err
+        integer datatype
+
+        err = nf_open(testfile, NF_NOWRITE, ncid)
+        if (err .ne. 0)
+     +      call errore('nf_open: ', err)
+        do 1, i = 1, NVARS
+            err = nf_inq_vartype(BAD_ID, i, datatype)
+            if (err .ne. NF_EBADID)
+     +          call errore('bad ncid: ', err)
+            err = nf_inq_vartype(ncid, BAD_VARID, datatype)
+            if (err .ne. NF_ENOTVAR)
+     +          call errore('bad var id: ', err)
+            err = nf_inq_vartype(ncid, i, datatype)
+            if (err .ne. 0) then
+                call errore('nf_inq_vartype: ', err)
+            else if (var_type(i) .ne. datatype) then
+                call errori('type unexpected: ', datatype)
+            end if
+1       continue
+        err = nf_close(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_close: ', err)
+        end
+
+
+        subroutine test_nf_inq_att()
+        use tests
+        implicit        none
+        integer ncid
+        integer i
+        integer j
+        integer err
+        integer t
+        integer n
+
+        err = nf_open(testfile, NF_NOWRITE, ncid)
+        if (err .ne. 0) 
+     +      call errore('nf_open: ', err)
+
+        do 1, i = 0, NVARS
+            do 2, j = 1, NATTS(i)
+                err = nf_inq_att(BAD_ID, i, ATT_NAME(j,i), t, n)
+                if (err .ne. NF_EBADID) 
+     +              call errore('bad ncid: ', err)
+                err = nf_inq_att(ncid, BAD_VARID, ATT_NAME(j,i), t, n)
+                if (err .ne. NF_ENOTVAR) 
+     +              call errore('bad var id: ', err)
+                err = nf_inq_att(ncid, i, 'noSuch', t, n)
+                if (err .ne. NF_ENOTATT) 
+     +              call errore('Bad attribute name: ', err)
+                err = nf_inq_att(ncid, i, ATT_NAME(j,i), t, n)
+                if (err .ne. 0) then
+                    call error(nf_strerror(err))
+                else
+                    if (t .ne. ATT_TYPE(j,i))
+     +                  call error('type not that expected')
+                    if (n .ne. ATT_LEN(j,i)) 
+     +                  call error('length not that expected')
+                end if
+2           continue
+1       continue
+
+        err = nf_close(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_close: ', err)
+        end
+
+
+        subroutine test_nf_inq_attlen()
+        use tests
+        implicit        none
+        integer ncid
+        integer i
+        integer j
+        integer err
+        integer len
+
+        err = nf_open(testfile, NF_NOWRITE, ncid)
+        if (err .ne. 0)
+     +      call errore('nf_open: ', err)
+
+        do 1, i = 0, NVARS
+            err = nf_inq_attlen(ncid, i, 'noSuch', len)
+            if (err .ne. NF_ENOTATT)
+     +          call errore('Bad attribute name: ', err)
+            do 2, j = 1, NATTS(i)
+                err = nf_inq_attlen(BAD_ID, i, ATT_NAME(j,i), len)
+                if (err .ne. NF_EBADID)
+     +              call errore('bad ncid: ', err)
+                err = nf_inq_attlen(ncid, BAD_VARID, ATT_NAME(j,i), len)
+                if (err .ne. NF_ENOTVAR)
+     +              call errore('bad varid: ', err)
+                err = nf_inq_attlen(ncid, i, ATT_NAME(j,i), len)
+                if (err .ne. 0) then
+                    call error(nf_strerror(err))
+                else
+                    if (len .ne. ATT_LEN(j,i))
+     +                  call error('len not that expected')
+                end if
+2           continue
+1       continue
+
+        err = nf_close(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_close: ', err)
+        end
+
+
+        subroutine test_nf_inq_atttype()
+        use tests
+        implicit        none
+        integer ncid
+        integer i
+        integer j
+        integer err
+        integer datatype
+
+        err = nf_open(testfile, NF_NOWRITE, ncid)
+        if (err .ne. 0)
+     +      call errore('nf_open: ', err)
+
+        do 1, i = 0, NVARS
+            err = nf_inq_atttype(ncid, i, 'noSuch', datatype)
+            if (err .ne. NF_ENOTATT)
+     +          call errore('Bad attribute name: ', err)
+            do 2, j = 1, NATTS(i)
+                err = nf_inq_atttype(BAD_ID, i, ATT_NAME(j,i), datatype)
+                if (err .ne. NF_EBADID)
+     +              call errore('bad ncid: ', err)
+                err = nf_inq_atttype(ncid, BAD_VARID, ATT_NAME(j,i), 
+     +                               datatype)
+                if (err .ne. NF_ENOTVAR)
+     +              call errore('bad varid: ', err)
+                err = nf_inq_atttype(ncid, i, ATT_NAME(j,i), datatype)
+                if (err .ne. 0) then
+                    call error(nf_strerror(err))
+                else
+                    if (datatype .ne. ATT_TYPE(j,i))
+     +                  call error('type not that expected')
+                end if
+2           continue
+1       continue
+
+        err = nf_close(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_close: ', err)
+        end
+
+
+        subroutine test_nf_inq_attname()
+        use tests
+        implicit        none
+        integer ncid
+        integer i
+        integer j
+        integer err
+        character*(NF_MAX_NAME) name
+
+        err = nf_open(testfile, NF_NOWRITE, ncid)
+        if (err .ne. 0)
+     +      call errore('nf_open: ', err)
+
+        do 1, i = 0, NVARS
+            err = nf_inq_attname(ncid, i, BAD_ATTNUM, name)
+            if (err .ne. NF_ENOTATT)
+     +          call errore('Bad attribute number: ', err)
+            err = nf_inq_attname(ncid, i, NATTS(i)+1, name)
+            if (err .ne. NF_ENOTATT)
+     +          call errore('Bad attribute number: ', err)
+            do 2, j = 1, NATTS(i)
+                err = nf_inq_attname(BAD_ID, i, j, name)
+                if (err .ne. NF_EBADID)
+     +              call errore('bad ncid: ', err)
+                err = nf_inq_attname(ncid, BAD_VARID, j, name)
+                if (err .ne. NF_ENOTVAR)
+     +              call errore('bad var id: ', err)
+                err = nf_inq_attname(ncid, i, j, name)
+                if (err .ne. 0) then
+                    call error(nf_strerror(err))
+                else
+                    if (ATT_NAME(j,i) .ne. name)
+     +                  call error('name not that expected')
+                end if
+2           continue
+1       continue
+
+        err = nf_close(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_close: ', err)
+        end
+
+
+        subroutine test_nf_inq_attid()
+        use tests
+        implicit        none
+        integer ncid
+        integer i
+        integer j
+        integer err
+        integer attnum
+
+        err = nf_open(testfile, NF_NOWRITE, ncid)
+        if (err .ne. 0)
+     +      call errore('nf_open: ', err)
+
+        do 1, i = 0, NVARS
+            err = nf_inq_attid(ncid, i, 'noSuch', attnum)
+            if (err .ne. NF_ENOTATT)
+     +          call errore('Bad attribute name: ', err)
+            do 2, j = 1, NATTS(i)
+                err = nf_inq_attid(BAD_ID, i, ATT_NAME(j,i), attnum)
+                if (err .ne. NF_EBADID)
+     +              call errore('bad ncid: ', err)
+                err = nf_inq_attid(ncid, BAD_VARID, ATT_NAME(j,i), 
+     +                             attnum)
+                if (err .ne. NF_ENOTVAR)
+     +              call errore('bad varid: ', err)
+                err = nf_inq_attid(ncid, i, ATT_NAME(j,i), attnum)
+                if (err .ne. 0) then
+                    call error(nf_strerror(err))
+                else
+                    if (attnum .ne. j)
+     +                  call error('attnum not that expected')
+                end if
+2           continue
+1       continue
+
+        err = nf_close(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_close: ', err)
+        end
diff --git a/nf03_test/test03_write.F b/nf03_test/test03_write.F
new file mode 100755
index 0000000..42542a3
--- /dev/null
+++ b/nf03_test/test03_write.F
@@ -0,0 +1,1436 @@
+C********************************************************************
+C   Copyright 1996, UCAR/Unidata
+C   See netcdf/COPYRIGHT file for copying and redistribution conditions.
+C   $Id: test_write.F,v 1.15 2008/04/30 16:50:45 ed Exp $
+C********************************************************************
+
+
+C Test nf_create
+C    For mode in NF_NOCLOBBER, NF_CLOBBER do:
+C       create netcdf file 'scratch.nc' with no data, close it
+C       test that it can be opened, do nf_inq to check nvars = 0, etc.
+C    Try again in NF_NOCLOBBER mode, check error return
+C On exit, delete this file
+        subroutine test_nf_create()
+        use tests, NDIMSG=>NDIMS, NVARSG=>NVARS, NGATTSG=>NGATTS,       &
+     &             RECDIMG=>RECDIM
+        implicit        none
+
+        integer clobber         !/* 0 for NF_NOCLOBBER, 1 for NF_CLOBBER */
+        integer err
+        integer ncid
+        integer ndims           !/* number of dimensions */
+        integer nvars           !/* number of variables */
+        integer ngatts          !/* number of global attributes */
+        integer recdim          !/* id of unlimited dimension */
+        integer flags
+
+        flags = NF_NOCLOBBER
+        do 1, clobber = 0, 1
+            err = nf_create(scratch, flags, ncid)
+            if (err .ne. 0) then
+                call errore('nf_create: ', err)
+            end if
+            err = nf_close(ncid)
+            if (err .ne. 0) then
+                call errore('nf_close: ', err)
+            end if
+            err = nf_open(scratch, NF_NOWRITE, ncid)
+            if (err .ne. 0) then
+                call errore('nf_open: ', err)
+            end if
+            err = nf_inq(ncid, ndims, nvars, ngatts, recdim)
+            if (err .ne. 0) then
+                call errore('nf_inq: ', err)
+            else if (ndims .ne. 0) then
+                call errori(
+     +              'nf_inq: wrong number of dimensions returned, ',
+     +              ndims)
+            else if (nvars .ne. 0) then
+                call errori(
+     +              'nf_inq: wrong number of variables returned, ',
+     +              nvars)
+            else if (ngatts .ne. 0) then
+                call errori(
+     +              'nf_inq: wrong number of global atts returned, ',
+     +              ngatts)
+            else if (recdim .ge. 1) then
+                call errori(
+     +              'nf_inq: wrong record dimension ID returned, ',
+     +              recdim)
+            end if
+            err = nf_close(ncid)
+            if (err .ne. 0) then
+                call errore('nf_close: ', err)
+            end if
+
+            flags = NF_CLOBBER
+1       continue
+
+        err = nf_create(scratch, NF_NOCLOBBER, ncid)
+        if (err .ne. NF_EEXIST) then
+            call errore('attempt to overwrite file: ', err)
+        end if
+        err = nf_delete(scratch)
+        if (err .ne. 0) then
+            call errori('delete of scratch file failed: ', err)
+        end if
+        end
+
+
+C Test nf_redef 
+C (In fact also tests nf_enddef - called from test_nf_enddef)
+C    BAD_ID
+C    attempt redef (error) & enddef on read-only file
+C    create file, define dims & vars. 
+C    attempt put var (error)
+C    attempt redef (error) & enddef.
+C    put vars
+C    attempt def new dims (error)
+C    redef
+C    def new dims, vars.
+C    put atts
+C    enddef
+C    put vars
+C    close
+C    check file: vars & atts
+        subroutine test_nf_redef()
+        use tests
+        implicit        none
+        integer         title_len
+        parameter       (title_len = 9)
+
+        integer                 ncid            !/* netcdf id */
+        integer                 dimid           !/* dimension id */
+        integer                 vid             !/* variable id */
+        integer                 err
+        character*(title_len)   title
+        doubleprecision         var
+        character*(NF_MAX_NAME) name
+        integer                 length
+
+        title = 'Not funny'
+
+C           /* BAD_ID tests */
+        err = nf_redef(BAD_ID)
+        if (err .ne. NF_EBADID)
+     +      call errore('bad ncid: ', err)
+        err = nf_enddef(BAD_ID)
+        if (err .ne. NF_EBADID)
+     +      call errore('bad ncid: ', err)
+
+C           /* read-only tests */
+        err = nf_open(testfile, NF_NOWRITE, ncid)
+        if (err .ne. 0)
+     +      call errore('nf_open: ', err)
+        err = nf_redef(ncid)
+        if (err .ne. NF_EPERM)
+     +      call errore('nf_redef in NF_NOWRITE mode: ', err)
+        err = nf_enddef(ncid)
+        if (err .ne. NF_ENOTINDEFINE)
+     +      call errore('nf_redef in NF_NOWRITE mode: ', err)
+        err = nf_close(ncid)
+        if (err .ne. 0) 
+     +      call errore('nf_close: ', err)
+
+C           /* tests using scratch file */
+        err = nf_create(scratch, NF_NOCLOBBER, ncid)
+        if (err .ne. 0) then
+            call errore('nf_create: ', err)
+            return
+        end if
+        call def_dims(ncid)
+        call def_vars(ncid)
+        call put_atts(ncid)
+        err = nf_inq_varid(ncid, 'd', vid)
+        if (err .ne. 0) 
+     +      call errore('nf_inq_varid: ', err)
+        var = 1.0
+        err = nf_put_var1_double(ncid, vid, (/0/), var)
+        if (err .ne. NF_EINDEFINE)
+     +      call errore('nf_put_var... in define mode: ', err)
+        err = nf_redef(ncid)
+        if (err .ne. NF_EINDEFINE)
+     +      call errore('nf_redef in define mode: ', err)
+        err = nf_enddef(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_enddef: ', err)
+        call put_vars(ncid)
+        err = nf_def_dim(ncid, 'abc', 8, dimid)
+        if (err .ne. NF_ENOTINDEFINE)
+     +      call errore('nf_def_dim in define mode: ', err)
+        err = nf_redef(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_redef: ', err)
+        err = nf_def_dim(ncid, 'abc', 8, dimid)
+        if (err .ne. 0)
+     +      call errore('nf_def_dim: ', err)
+        err = nf_def_var(ncid, 'abc', NF_INT, 0, (/0/), vid)
+        if (err .ne. 0)
+     +      call errore('nf_def_var: ', err)
+        err = nf_put_att_text(ncid, NF_GLOBAL, 'title', len(title), 
+     +                        title)
+        if (err .ne .0)
+     +      call errore('nf_put_att_text: ', err)
+        err = nf_enddef(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_enddef: ', err)
+        var = 1.0
+        err = nf_put_var1_double(ncid, vid, (/0/), var)
+        if (err .ne. 0)
+     +      call errore('nf_put_var1_double: ', err)
+        err = nf_close(ncid)
+        if (err .ne. 0) 
+     +      call errore('nf_close: ', err)
+
+C           /* check scratch file written as expected */
+        call check_file(scratch)
+        err = nf_open(scratch, NF_NOWRITE, ncid)
+        if (err .ne. 0)
+     +      call errore('nf_open: ', err)
+        err = nf_inq_dim(ncid, dimid, name, length)
+        if (err .ne. 0) 
+     +      call errore('nf_inq_dim: ', err)
+        if (name .ne. "abc")
+     +      call errori('Unexpected dim name in netCDF ', ncid)
+        if (length .ne. 8) 
+     +      call errori('Unexpected dim length: ', length)
+        err = nf_get_var1_double(ncid, vid, (/0/), var)
+        if (err .ne. 0)
+     +      call errore('nf_get_var1_double: ', err)
+        if (var .ne. 1.0)
+     +      call errori(
+     +          'nf_get_var1_double: unexpected value in netCDF ', ncid)
+        err = nf_close(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_close: ', err)
+
+        err = nf_delete(scratch)
+        if (err .ne. 0)
+     +      call errori('delete failed for netCDF: ', err)
+        end
+
+C Test nf_enddef 
+C Simply calls test_nf_redef which tests both nf_redef & nf_enddef
+
+        subroutine test_nf_enddef()
+        use tests
+        implicit        none
+
+        call test_nf_redef
+        end
+
+
+C Test nf_sync
+C    try with bad handle, check error
+C    try in define mode, check error
+C    try writing with one handle, reading with another on same netCDF
+        subroutine test_nf_sync()
+        use tests
+        implicit        none
+
+        integer ncidw         !/* netcdf id for writing */
+        integer ncidr         !/* netcdf id for reading */
+        integer err
+
+C           /* BAD_ID test */
+        err = nf_sync(BAD_ID)
+        if (err .ne. NF_EBADID)
+     +      call errore('bad ncid: ', err)
+
+C           /* create scratch file & try nf_sync in define mode */
+        err = nf_create(scratch, NF_NOCLOBBER, ncidw)
+        if (err .ne. 0) then
+            call errore('nf_create: ', err)
+            return
+        end if
+        err = nf_sync(ncidw)
+        if (err .ne. NF_EINDEFINE)
+     +      call errore('nf_sync called in define mode: ', err)
+
+C           /* write using same handle */
+        call def_dims(ncidw)
+        call def_vars(ncidw)
+        call put_atts(ncidw)
+        err = nf_enddef(ncidw)
+        if (err .ne. 0)
+     +      call errore('nf_enddef: ', err)
+        call put_vars(ncidw)
+        err = nf_sync(ncidw)
+        if (err .ne. 0)
+     +      call errore('nf_sync of ncidw failed: ', err)
+
+C           /* open another handle, nf_sync, read (check) */
+        err = nf_open(scratch, NF_NOWRITE, ncidr)
+        if (err .ne. 0)
+     +      call errore('nf_open: ', err)
+        err = nf_sync(ncidr)
+        if (err .ne. 0)
+     +      call errore('nf_sync of ncidr failed: ', err)
+        call check_dims(ncidr)
+        call check_atts(ncidr)
+        call check_vars(ncidr)
+
+C           /* close both handles */
+        err = nf_close(ncidr)
+        if (err .ne. 0)
+     +      call errore('nf_close: ', err)
+        err = nf_close(ncidw)
+        if (err .ne. 0)
+     +      call errore('nf_close: ', err)
+
+        err = nf_delete(scratch)
+        if (err .ne. 0)
+     +      call errori('delete of scratch file failed: ', err)
+        end
+
+
+C Test nf_abort
+C    try with bad handle, check error
+C    try in define mode before anything written, check that file was deleted
+C    try after nf_enddef, nf_redef, define new dims, vars, atts
+C    try after writing variable
+        subroutine test_nf_abort()
+        use tests, NDIMSG=>NDIMS, NVARSG=>NVARS, NGATTSG=>NGATTS,       &
+     &             RECDIMG=>RECDIM
+        implicit        none
+
+        integer ncid          !/* netcdf id */
+        integer err
+        integer ndims
+        integer nvars
+        integer ngatts
+        integer recdim
+
+C           /* BAD_ID test */
+        err = nf_abort(BAD_ID)
+        if (err .ne. NF_EBADID)
+     +      call errore('bad ncid: status = ', err)
+
+C           /* create scratch file & try nf_abort in define mode */
+        err = nf_create(scratch, NF_NOCLOBBER, ncid)
+        if (err .ne. 0) then
+            call errore('nf_create: ', err)
+            return
+        end if
+        call def_dims(ncid)
+        call def_vars(ncid)
+        call put_atts(ncid)
+        err = nf_abort(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_abort of ncid failed: ', err)
+        err = nf_close(ncid)    !/* should already be closed */
+        if (err .ne. NF_EBADID)
+     +      call errore('bad ncid: ', err)
+        err = nf_delete(scratch)        !/* should already be deleted */
+        if (err .eq. 0)
+     +      call errori('scratch file should not exist: ', err)
+
+C            create scratch file
+C            do nf_enddef & nf_redef
+C            define new dims, vars, atts
+C            try nf_abort: should restore previous state (no dims, vars, atts)
+        err = nf_create(scratch, NF_NOCLOBBER, ncid)
+        if (err .ne. 0) then
+            call errore('nf_create: ', err)
+            return
+        end if
+        err = nf_enddef(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_enddef: ', err)
+        err = nf_redef(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_redef: ', err)
+        call def_dims(ncid)
+        call def_vars(ncid)
+        call put_atts(ncid)
+        err = nf_abort(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_abort of ncid failed: ', err)
+        err = nf_close(ncid)    !/* should already be closed */
+        if (err .ne. NF_EBADID)
+     +      call errore('bad ncid: ', err)
+        err = nf_open(scratch, NF_NOWRITE, ncid)
+        if (err .ne. 0)
+     +      call errore('nf_open: ', err)
+        err = nf_inq (ncid, ndims, nvars, ngatts, recdim)
+        if (err .ne. 0)
+     +      call errore('nf_inq: ', err)
+        if (ndims .ne. 0)
+     +      call errori('ndims should be ', 0)
+        if (nvars .ne. 0)
+     +      call errori('nvars should be ', 0)
+        if (ngatts .ne. 0)
+     +      call errori('ngatts should be ', 0)
+        err = nf_close (ncid)
+        if (err .ne. 0)
+     +      call errore('nf_close: ', err)
+
+C           /* try nf_abort in data mode - should just close */
+        err = nf_create(scratch, NF_CLOBBER, ncid)
+        if (err .ne. 0) then
+            call errore('nf_create: ', err)
+            return
+        end if
+        call def_dims(ncid)
+        call def_vars(ncid)
+        call put_atts(ncid)
+        err = nf_enddef(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_enddef: ', err)
+        call put_vars(ncid)
+        err = nf_abort(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_abort of ncid failed: ', err)
+        err = nf_close(ncid)       !/* should already be closed */
+        if (err .ne. NF_EBADID)
+     +      call errore('bad ncid: ', err)
+        call check_file(scratch)
+        err = nf_delete(scratch)
+        if (err .ne. 0)
+     +      call errori('delete of scratch file failed: ', err)
+        end
+
+
+C Test nf_def_dim
+C    try with bad netCDF handle, check error
+C    try in data mode, check error
+C    check that returned id is one more than previous id
+C    try adding same dimension twice, check error
+C    try with illegal sizes, check error
+C    make sure unlimited size works, shows up in nf_inq_unlimdim
+C    try to define a second unlimited dimension, check error
+        subroutine test_nf_def_dim()
+        use tests
+        implicit        none
+
+        integer ncid
+        integer err             !/* status */
+        integer i
+        integer dimid         !/* dimension id */
+        integer length
+
+C           /* BAD_ID test */
+        err = nf_def_dim(BAD_ID, 'abc', 8, dimid)
+        if (err .ne. NF_EBADID)
+     +      call errore('bad ncid: ', err)
+
+C           /* data mode test */
+        err = nf_create(scratch, NF_CLOBBER, ncid)
+        if (err .ne. 0) then
+            call errore('nf_create: ', err)
+            return
+        end if
+        err = nf_enddef(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_enddef: ', err)
+        err = nf_def_dim(ncid, 'abc', 8, dimid)
+        if (err .ne. NF_ENOTINDEFINE)
+     +      call errore('bad ncid: ', err)
+
+C           /* define-mode tests: unlimited dim */
+        err = nf_redef(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_redef: ', err)
+        err = nf_def_dim(ncid, dim_name(1), NF_UNLIMITED, dimid)
+        if (err .ne. 0) 
+     +      call errore('nf_def_dim: ', err)
+        if (dimid .ne. 1) 
+     +      call errori('Unexpected dimid: ', dimid)
+        err = nf_inq_unlimdim(ncid, dimid)
+        if (err .ne. 0) 
+     +      call errore('nf_inq_unlimdim: ', err)
+        if (dimid .ne. RECDIM) 
+     +      call error('Unexpected recdim: ')
+        err = nf_inq_dimlen(ncid, dimid, length)
+        if (length .ne. 0) 
+     +      call errori('Unexpected length: ', 0)
+        err = nf_def_dim(ncid, 'abc', NF_UNLIMITED, dimid)
+        if (err .ne. NF_EUNLIMIT)
+     +      call errore('2nd unlimited dimension: ', err)
+
+C           /* define-mode tests: remaining dims */
+        do 1, i = 2, NDIMS
+            err = nf_def_dim(ncid, dim_name(i-1), dim_len(i), 
+     +                       dimid)
+            if (err .ne. NF_ENAMEINUSE)
+     +          call errore('duplicate name: ', err)
+            err = nf_def_dim(ncid, BAD_NAME, dim_len(i), dimid)
+            if (err .ne. NF_EBADNAME)
+     +          call errore('bad name: ', err)
+            err = nf_def_dim(ncid, dim_name(i), NF_UNLIMITED-1, 
+     +                       dimid)
+            if (err .ne. NF_EDIMSIZE)
+     +          call errore('bad size: ', err)
+            err = nf_def_dim(ncid, dim_name(i), dim_len(i), dimid)
+            if (err .ne. 0) 
+     +          call errore('nf_def_dim: ', err)
+            if (dimid .ne. i) 
+     +          call errori('Unexpected dimid: ', 0)
+1       continue
+
+C           /* Following just to expand unlimited dim */
+        call def_vars(ncid)
+        err = nf_enddef(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_enddef: ', err)
+        call put_vars(ncid)
+
+C           /* Check all dims */
+        call check_dims(ncid)
+
+        err = nf_close(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_close: ', err)
+        err = nf_delete(scratch)
+        if (err .ne. 0)
+     +      call errori('delete of scratch file failed: ', err)
+        end
+
+
+C Test nf_rename_dim
+C    try with bad netCDF handle, check error
+C    check that proper rename worked with nf_inq_dim
+C    try renaming to existing dimension name, check error
+C    try with bad dimension handle, check error
+        subroutine test_nf_rename_dim()
+        use tests
+        implicit        none
+
+        integer ncid
+        integer err             !/* status */
+        character*(NF_MAX_NAME) name
+
+C           /* BAD_ID test */
+        err = nf_rename_dim(BAD_ID, 1, 'abc')
+        if (err .ne. NF_EBADID)
+     +      call errore('bad ncid: ', err)
+
+C           /* main tests */
+        err = nf_create(scratch, NF_NOCLOBBER, ncid)
+        if (err .ne. 0) then
+            call errore('nf_create: ', err)
+            return
+        end if
+        call def_dims(ncid)
+        err = nf_rename_dim(ncid, BAD_DIMID, 'abc')
+        if (err .ne. NF_EBADDIM)
+     +      call errore('bad dimid: ', err)
+        err = nf_rename_dim(ncid, 3, 'abc')
+        if (err .ne. 0)
+     +      call errore('nf_rename_dim: ', err)
+        err = nf_inq_dimname(ncid, 3, name)
+        if (name .ne. 'abc')
+     +      call errorc('Unexpected name: ', name)
+        err = nf_rename_dim(ncid, 1, 'abc')
+        if (err .ne. NF_ENAMEINUSE)
+     +      call errore('duplicate name: ', err)
+
+        err = nf_close(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_close: ', err)
+        err = nf_delete(scratch)
+        if (err .ne. 0)
+     +      call errori('delete of scratch file failed: ', err)
+        end
+
+
+C Test nf_def_var
+C    try with bad netCDF handle, check error
+C    try with bad name, check error
+C    scalar tests:
+C      check that proper define worked with nf_inq_var
+C      try redefining an existing variable, check error
+C      try with bad datatype, check error
+C      try with bad number of dimensions, check error
+C      try in data mode, check error
+C    check that returned id is one more than previous id
+C    try with bad dimension ids, check error
+        subroutine test_nf_def_var()
+        use tests, NDIMSG=>NDIMS
+        implicit        none
+
+        integer ncid
+        integer vid
+        integer err             !/* status */
+        integer i
+        integer ndims
+        integer na
+        character*(NF_MAX_NAME) name
+        integer dimids(MAX_RANK)
+        integer datatype
+
+C           /* BAD_ID test */
+        err = nf_def_var(BAD_ID, 'abc', NF_SHORT, 0, dimids, vid)
+        if (err .ne. NF_EBADID)
+     +      call errore('bad ncid: status = ', err)
+
+C           /* scalar tests */
+        err = nf_create(scratch, NF_NOCLOBBER, ncid)
+        if (err .ne. 0) then
+            call errore('nf_create: ', err)
+            return
+        end if
+        err = nf_def_var(ncid, 'abc', NF_SHORT, 0, dimids, vid)
+        if (err .ne. 0)
+     +      call errore('nf_def_var: ', err)
+        err = nf_inq_var(ncid, vid, name, datatype, ndims, dimids, 
+     +                   na)
+        if (err .ne. 0)
+     +      call errore('nf_inq_var: ', err)
+        if (name .ne. 'abc')
+     +      call errorc('Unexpected name: ', name)
+        if (datatype .ne. NF_SHORT)
+     +      call error('Unexpected datatype')
+        if (ndims .ne. 0)
+     +      call error('Unexpected rank')
+        err = nf_def_var(ncid, BAD_NAME, NF_SHORT, 0, dimids, vid)
+        if (err .ne. NF_EBADNAME)
+     +      call errore('bad name: ', err)
+        err = nf_def_var(ncid, 'abc', NF_SHORT, 0, dimids, vid)
+        if (err .ne. NF_ENAMEINUSE)
+     +      call errore('duplicate name: ', err)
+        err = nf_def_var(ncid, 'ABC', BAD_TYPE, -1, dimids, vid)
+        if (err .ne. NF_EBADTYPE)
+     +      call errore('bad type: ', err)
+        err = nf_def_var(ncid, 'ABC', NF_SHORT, -1, dimids, vid)
+        if (err .ne. NF_EINVAL)
+     +      call errore('bad rank: ', err)
+        err = nf_enddef(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_enddef: ', err)
+        err = nf_def_var(ncid, 'ABC', NF_SHORT, 0, dimids, vid)
+        if (err .ne. NF_ENOTINDEFINE)
+     +      call errore('nf_def_var called in data mode: ', err)
+        err = nf_close(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_close: ', err)
+        err = nf_delete(scratch)
+        if (err .ne. 0)
+     +      call errorc('delete of scratch file failed: ', scratch)
+
+C           /* general tests using global vars */
+        err = nf_create(scratch, NF_CLOBBER, ncid)
+        if (err .ne. 0) then
+            call errore('nf_create: ', err)
+            return
+        end if
+        call def_dims(ncid)
+        do 1, i = 1, NVARS
+            err = nf_def_var(ncid, var_name(i), var_type(i), 
+     +                       var_rank(i), var_dimid(1,i), vid)
+            if (err .ne. 0) 
+     +          call errore('nf_def_var: ', err)
+            if (vid .ne. i)
+     +          call error('Unexpected varid')
+1       continue
+
+C           /* try bad dim ids */
+        dimids(1) = BAD_DIMID
+        err = nf_def_var(ncid, 'abc', NF_SHORT, 1, dimids, vid)
+        if (err .ne. NF_EBADDIM)
+     +      call errore('bad dim ids: ', err)
+        err = nf_close(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_close: ', err)
+
+        err = nf_delete(scratch)
+        if (err .ne. 0)
+     +      call errorc('delete of scratch file failed: ', scratch)
+        end
+
+
+C Test nf_rename_var
+C    try with bad netCDF handle, check error
+C    try with bad variable handle, check error
+C    try renaming to existing variable name, check error
+C    check that proper rename worked with nf_inq_varid
+C    try in data mode, check error
+        subroutine test_nf_rename_var()
+        use tests
+        implicit        none
+
+        integer ncid
+        integer vid
+        integer err
+        integer i
+        character*(NF_MAX_NAME) name
+
+        err = nf_create(scratch, NF_NOCLOBBER, ncid)
+        if (err .ne. 0) then
+            call errore('nf_create: ', err)
+            return
+        end if
+        err = nf_rename_var(ncid, BAD_VARID, 'newName')
+        if (err .ne. NF_ENOTVAR)
+     +      call errore('bad var id: ', err)
+        call def_dims(ncid)
+        call def_vars(ncid)
+
+C           /* Prefix "new_" to each name */
+        do 1, i = 1, NVARS
+            err = nf_rename_var(BAD_ID, i, 'newName')
+            if (err .ne. NF_EBADID)
+     +          call errore('bad ncid: ', err)
+            err = nf_rename_var(ncid, i, var_name(NVARS))
+            if (err .ne. NF_ENAMEINUSE)
+     +          call errore('duplicate name: ', err)
+            name = 'new_' // var_name(i)
+            err = nf_rename_var(ncid, i, name)
+            if (err .ne. 0)
+     +          call errore('nf_rename_var: ', err)
+            err = nf_inq_varid(ncid, name, vid)
+            if (err .ne. 0)
+     +          call errore('nf_inq_varid: ', err)
+            if (vid .ne. i)
+     +          call error('Unexpected varid')
+1       continue
+
+C           /* Change to data mode */
+C           /* Try making names even longer. Then restore original names */
+        err = nf_enddef(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_enddef: ', err)
+        do 2, i = 1, NVARS
+            name = 'even_longer_' // var_name(i)
+            err = nf_rename_var(ncid, i, name)
+            if (err .ne. NF_ENOTINDEFINE)
+     +          call errore('longer name in data mode: ', err)
+            err = nf_rename_var(ncid, i, var_name(i))
+            if (err .ne. 0)
+     +          call errore('nf_rename_var: ', err)
+            err = nf_inq_varid(ncid, var_name(i), vid)
+            if (err .ne. 0)
+     +          call errore('nf_inq_varid: ', err)
+            if (vid .ne. i)
+     +          call error('Unexpected varid')
+2       continue
+
+        call put_vars(ncid)
+        call check_vars(ncid)
+
+        err = nf_close(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_close: ', err)
+
+        err = nf_delete(scratch)
+        if (err .ne. 0)
+     +      call errorc('delete of scratch file failed: ', scratch)
+        end
+
+
+C Test nf_copy_att
+C    try with bad source or target netCDF handles, check error
+C    try with bad source or target variable handle, check error
+C    try with nonexisting attribute, check error
+C    check that NF_GLOBAL variable for source or target works
+C    check that new attribute put works with target in define mode
+C    check that old attribute put works with target in data mode
+C    check that changing type and length of an attribute work OK
+C    try with same ncid for source and target, different variables
+C    try with same ncid for source and target, same variable
+        subroutine test_nf_copy_att()
+        use tests
+        implicit        none
+
+        integer ncid_in
+        integer ncid_out
+        integer vid
+        integer err
+        integer i
+        integer j
+        character*(NF_MAX_NAME) name    !/* of att */
+        integer datatype                !/* of att */
+        integer length                  !/* of att */
+        character*1     value
+
+        err = nf_open(testfile, NF_NOWRITE, ncid_in)
+        if (err .ne. 0)
+     +      call errore('nf_open: ', err)
+        err = nf_create(scratch, NF_NOCLOBBER, ncid_out)
+        if (err .ne. 0) then
+            call errore('nf_create: ', err)
+            return
+        end if
+        call def_dims(ncid_out)
+        call def_vars(ncid_out)
+
+        do 1, i = 0, NVARS
+            vid = VARID(i)
+            do 2, j = 1, NATTS(i)
+                name = ATT_NAME(j,i)
+                err = nf_copy_att(ncid_in, BAD_VARID, name, ncid_out, 
+     +                            vid)
+                if (err .ne. NF_ENOTVAR)
+     +              call errore('bad var id: ', err)
+                err = nf_copy_att(ncid_in, vid, name, ncid_out, 
+     +                            BAD_VARID)
+                if (err .ne. NF_ENOTVAR)
+     +              call errore('bad var id: ', err)
+                err = nf_copy_att(BAD_ID, vid, name, ncid_out, vid)
+                if (err .ne. NF_EBADID)
+     +              call errore('bad ncid: ', err)
+                err = nf_copy_att(ncid_in, vid, name, BAD_ID, vid)
+                if (err .ne. NF_EBADID)
+     +              call errore('bad ncid: ', err)
+                err = nf_copy_att(ncid_in, vid, 'noSuch', ncid_out, vid)
+                if (err .ne. NF_ENOTATT)
+     +              call errore('bad attname: ', err)
+                err = nf_copy_att(ncid_in, vid, name, ncid_out, vid)
+                if (err .ne. 0)
+     +              call errore('nf_copy_att: ', err)
+                err = nf_copy_att(ncid_out, vid, name, ncid_out, vid)
+                if (err .ne. 0)
+     +              call errore('source = target: ', err)
+2           continue
+1       continue
+
+        err = nf_close(ncid_in)
+        if (err .ne. 0)
+     +      call errore('nf_close: ', err)
+
+C           /* Close scratch. Reopen & check attributes */
+        err = nf_close(ncid_out)
+        if (err .ne. 0)
+     +      call errore('nf_close: ', err)
+        err = nf_open(scratch, NF_WRITE, ncid_out)
+        if (err .ne. 0)
+     +      call errore('nf_open: ', err)
+        call check_atts(ncid_out)
+
+C           change to define mode
+C           define single char. global att. ':a' with value 'A'
+C           This will be used as source for following copies
+        err = nf_redef(ncid_out)
+        if (err .ne. 0)
+     +      call errore('nf_redef: ', err)
+        err = nf_put_att_text(ncid_out, NF_GLOBAL, 'a', 1, 'A')
+        if (err .ne. 0)
+     +      call errore('nf_put_att_text: ', err)
+
+C           change to data mode
+C           Use scratch as both source & dest.
+C           try copy to existing att. change type & decrease length
+C           rename 1st existing att of each var (if any) 'a'
+C           if this att. exists them copy ':a' to it
+        err = nf_enddef(ncid_out)
+        if (err .ne. 0)
+     +      call errore('nf_enddef: ', err)
+        do 3, i = 1, NVARS
+            if (NATTS(i) .gt. 0 .and. ATT_LEN(1,i) .gt. 0) then
+                err = nf_rename_att(ncid_out, i, att_name(1,i), 'a')
+                if (err .ne. 0)
+     +              call errore('nf_rename_att: ', err)
+                err = nf_copy_att(ncid_out, NF_GLOBAL, 'a', ncid_out, 
+     +                            i)
+                if (err .ne. 0)
+     +              call errore('nf_copy_att: ', err)
+            end if
+3       continue
+        err = nf_close(ncid_out)
+        if (err .ne. 0)
+     +      call errore('nf_close: ', err)
+
+C           /* Reopen & check */
+        err = nf_open(scratch, NF_WRITE, ncid_out)
+        if (err .ne. 0)
+     +      call errore('nf_open: ', err)
+        do 4, i = 1, NVARS
+            if (NATTS(i) .gt. 0 .and. ATT_LEN(1,i) .gt. 0) then
+                err = nf_inq_att(ncid_out, i, 'a', datatype, length)
+                if (err .ne. 0)
+     +              call errore('nf_inq_att: ', err)
+                if (datatype .ne. NF_CHAR)
+     +              call error('Unexpected type')
+                if (length .ne. 1)
+     +              call error('Unexpected length')
+                err = nf_get_att_text(ncid_out, i, 'a', value)
+                if (err .ne. 0)
+     +              call errore('nf_get_att_text: ', err)
+                if (value .ne. 'A')
+     +              call error('Unexpected value')
+            end if                                                   
+4       continue                                                   
+
+        err = nf_close(ncid_out)
+        if (err .ne. 0)
+     +      call errore('nf_close: ', err)
+        err = nf_delete(scratch)
+        if (err .ne. 0)
+     +      call errorc('delete of scratch file failed', scratch)
+        end
+
+
+C Test nf_rename_att
+C    try with bad netCDF handle, check error
+C    try with bad variable handle, check error
+C    try with nonexisting att name, check error
+C    try renaming to existing att name, check error
+C    check that proper rename worked with nf_inq_attid
+C    try in data mode, check error
+        subroutine test_nf_rename_att()
+        use tests
+        implicit        none
+
+        integer ncid
+        integer vid
+        integer err
+        integer i
+        integer j
+        integer  k
+        integer attnum
+        character*(NF_MAX_NAME) atnam
+        character*(NF_MAX_NAME) name
+        character*(NF_MAX_NAME) oldname
+        character*(NF_MAX_NAME) newname
+        integer nok             !/* count of valid comparisons */
+        integer datatype
+        integer attyp
+        integer length
+        integer attlength
+        integer ndx(1)
+        character*(MAX_NELS)    text
+        doubleprecision value(MAX_NELS)
+        doubleprecision expect
+
+        nok = 0
+
+        err = nf_create(scratch, NF_NOCLOBBER, ncid)
+        if (err .ne. 0) then
+            call errore('nf_create: ', err)
+            return
+        end if
+        err = nf_rename_att(ncid, BAD_VARID, 'abc', 'newName')
+        if (err .ne. NF_ENOTVAR)
+     +      call errore('bad var id: ', err)
+        call def_dims(ncid)
+        call def_vars(ncid)
+        call put_atts(ncid)
+
+        do 1, i = 0, NVARS
+            vid = VARID(i)
+            do 2, j = 1, NATTS(i)
+                atnam = ATT_NAME(j,i)
+                err = nf_rename_att(BAD_ID, vid, atnam, 'newName')
+                if (err .ne. NF_EBADID)
+     +              call errore('bad ncid: ', err)
+                err = nf_rename_att(ncid, vid, 'noSuch', 'newName')
+                if (err .ne. NF_ENOTATT)
+     +              call errore('bad attname: ', err)
+                newname = 'new_' // atnam
+                err = nf_rename_att(ncid, vid, atnam, newname)
+                if (err .ne. 0)
+     +              call errore('nf_rename_att: ', err)
+                err = nf_inq_attid(ncid, vid, newname, attnum)
+                if (err .ne. 0)
+     +              call errore('nf_inq_attid: ', err)
+                if (attnum .ne. j)
+     +              call error('Unexpected attnum')
+2           continue
+1       continue
+
+C           /* Close. Reopen & check */
+        err = nf_close(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_close: ', err)
+        err = nf_open(scratch, NF_WRITE, ncid)
+        if (err .ne. 0)
+     +      call errore('nf_open: ', err)
+
+        do 3, i = 0, NVARS
+            vid = VARID(i)
+            do 4, j = 1, NATTS(i)
+                atnam = ATT_NAME(j,i)
+                attyp = ATT_TYPE(j,i)
+                attlength = ATT_LEN(j,i)
+                newname = 'new_' // atnam
+                err = nf_inq_attname(ncid, vid, j, name)
+                if (err .ne. 0)
+     +              call errore('nf_inq_attname: ', err)
+                if (name .ne. newname)
+     +              call error('nf_inq_attname: unexpected name')
+                err = nf_inq_att(ncid, vid, name, datatype, length)
+                if (err .ne. 0)
+     +              call errore('nf_inq_att: ', err)
+                if (datatype .ne. attyp)
+     +              call error('nf_inq_att: unexpected type')
+                if (length .ne. attlength)
+     +              call error('nf_inq_att: unexpected length')
+                if (datatype .eq. NF_CHAR) then
+                    err = nf_get_att_text(ncid, vid, name, text)
+                    if (err .ne. 0)
+     +                  call errore('nf_get_att_text: ', err)
+                    do 5, k = 1, attlength
+                        ndx(1) = k
+                        expect = hash(datatype, -1, ndx)
+                        if (ichar(text(k:k)) .ne. expect) then
+                            call error(
+     +                          'nf_get_att_text: unexpected value')
+                        else
+                            nok = nok + 1
+                        end if
+5                   continue
+                else
+                    err = nf_get_att_double(ncid, vid, name, value)
+                    if (err .ne. 0)
+     +                  call errore('nf_get_att_double: ', err)
+                    do 6, k = 1, attlength
+                        ndx(1) = k
+                        expect = hash(datatype, -1, ndx)
+                        if (inRange(expect, datatype)) then
+                            if (.not. equal(value(k),expect,datatype,
+     +                                      NF_DOUBLE)) then
+                                call error(
+     +                          'nf_get_att_double: unexpected value')
+                            else
+                                nok = nok + 1
+                            end if
+                        end if
+6                   continue
+                end if
+4           continue
+3       continue
+        call print_nok(nok)
+
+C           /* Now in data mode */
+C           /* Try making names even longer. Then restore original names */
+
+        do 7, i = 0, NVARS
+            vid = VARID(i)
+            do 8, j = 1, NATTS(i)
+                atnam = ATT_NAME(j,i)
+                oldname = 'new_' // atnam
+                newname = 'even_longer_' // atnam
+                err = nf_rename_att(ncid, vid, oldname, newname)
+                if (err .ne. NF_ENOTINDEFINE)
+     +              call errore('longer name in data mode: ', err)
+                err = nf_rename_att(ncid, vid, oldname, atnam)
+                if (err .ne. 0)
+     +              call errore('nf_rename_att: ', err)
+                err = nf_inq_attid(ncid, vid, atnam, attnum)
+                if (err .ne. 0)
+     +              call errore('nf_inq_attid: ', err)
+                if (attnum .ne. j)
+     +              call error('Unexpected attnum')
+8           continue
+7       continue
+
+        err = nf_close(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_close: ', err)
+
+        err = nf_delete(scratch)
+        if (err .ne. 0)
+     +      call errori('delete of scratch file failed: ', err)
+        end
+
+
+C Test nf_del_att
+C    try with bad netCDF handle, check error
+C    try with bad variable handle, check error
+C    try with nonexisting att name, check error
+C    check that proper delete worked using:
+C      nf_inq_attid, nf_inq_natts, nf_inq_varnatts
+        subroutine test_nf_del_att()
+        use tests
+        implicit        none
+
+        integer ncid
+        integer err
+        integer i
+        integer j
+        integer attnum
+        integer na
+        integer numatts
+        integer vid
+        character*(NF_MAX_NAME)  name           !/* of att */
+
+        err = nf_create(scratch, NF_NOCLOBBER, ncid)
+        if (err .ne. 0) then
+            call errore('nf_create: ', err)
+            return
+        end if
+        err = nf_del_att(ncid, BAD_VARID, 'abc')
+        if (err .ne. NF_ENOTVAR)
+     +      call errore('bad var id: ', err)
+        call def_dims(ncid)
+        call def_vars(ncid)
+        call put_atts(ncid)
+
+        do 1, i = 0, NVARS
+            vid = VARID(i)
+            numatts = NATTS(i)
+            do 2, j = 1, numatts
+                name = ATT_NAME(j,i)
+                err = nf_del_att(BAD_ID, vid, name)
+                if (err .ne. NF_EBADID)
+     +              call errore('bad ncid: ', err)
+                err = nf_del_att(ncid, vid, 'noSuch')
+                if (err .ne. NF_ENOTATT)
+     +              call errore('bad attname: ', err)
+                err = nf_del_att(ncid, vid, name)
+                if (err .ne. 0)
+     +              call errore('nf_del_att: ', err)
+                err = nf_inq_attid(ncid, vid, name, attnum)
+                if (err .ne. NF_ENOTATT)
+     +              call errore('bad attname: ', err)
+                if (i .lt. 1) then
+                    err = nf_inq_natts(ncid, na)
+                    if (err .ne. 0)
+     +                  call errore('nf_inq_natts: ', err)
+		    if (na .ne. numatts-j) then
+			call errori('natts: expected: ', numatts-j)
+			call errori('natts: got:      ', na)
+		    end if
+		end if
+		err = nf_inq_varnatts(ncid, vid, na)
+		if (err .ne. 0)
+     +              call errore('nf_inq_natts: ', err)
+                if (na .ne. numatts-j) then
+                    call errori('natts: expected: ', numatts-j)
+                    call errori('natts: got:      ', na)
+                end if
+2           continue
+1       continue
+
+C           /* Close. Reopen & check no attributes left */
+        err = nf_close(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_close: ', err)
+        err = nf_open(scratch, NF_WRITE, ncid)
+        if (err .ne. 0)
+     +      call errore('nf_open: ', err)
+        err = nf_inq_natts(ncid, na)
+        if (err .ne. 0)
+     +      call errore('nf_inq_natts: ', err)
+        if (na .ne. 0)
+     +      call errori('natts: expected 0, got ', na)
+        do 3, i = 0, NVARS
+            vid = VARID(i)
+            err = nf_inq_varnatts(ncid, vid, na)
+            if (err .ne. 0)
+     +          call errore('nf_inq_natts: ', err)
+            if (na .ne. 0)
+     +          call errori('natts: expected 0, got ', na)
+3       continue
+
+C           /* restore attributes. change to data mode. try to delete */
+        err = nf_redef(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_redef: ', err)
+        call put_atts(ncid)
+        err = nf_enddef(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_enddef: ', err)
+
+        do 4, i = 0, NVARS
+            vid = VARID(i)
+            numatts = NATTS(i)
+            do 5, j = 1, numatts
+                name = ATT_NAME(j,i)
+                err = nf_del_att(ncid, vid, name)
+                if (err .ne. NF_ENOTINDEFINE)
+     +              call errore('in data mode: ', err)
+5           continue
+4       continue
+
+        err = nf_close(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_close: ', err)
+        err = nf_delete(scratch)
+        if (err .ne. 0)
+     +      call errori('delete of scratch file failed: ', err)
+        end
+
+
+C Test nf_set_fill
+C    try with bad netCDF handle, check error
+C    try in read-only mode, check error
+C    try with bad new_fillmode, check error
+C    try in data mode, check error
+C    check that proper set to NF_FILL works for record & non-record variables
+C    (note that it is not possible to test NF_NOFILL mode!)
+C    close file & create again for test using attribute _FillValue
+        subroutine test_nf_set_fill()
+        use tests
+        implicit none
+
+        integer ncid
+        integer vid
+        integer err
+        integer i
+        integer j
+        integer old_fillmode
+        integer nok             !/* count of valid comparisons */
+        character*1 text
+        doubleprecision value
+        doubleprecision fill
+        integer index(MAX_RANK)
+
+        nok = 0
+        value = 0
+
+C           /* bad ncid */
+        err = nf_set_fill(BAD_ID, NF_NOFILL, old_fillmode)
+        if (err .ne. NF_EBADID)
+     +      call errore('bad ncid: ', err)
+
+C           /* try in read-only mode */
+        err = nf_open(testfile, NF_NOWRITE, ncid)
+        if (err .ne. 0)
+     +      call errore('nf_open: ', err)
+        err = nf_set_fill(ncid, NF_NOFILL, old_fillmode)
+        if (err .ne. NF_EPERM)
+     +      call errore('read-only: ', err)
+        err = nf_close(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_close: ', err)
+
+C           /* create scratch */
+        err = nf_create(scratch, NF_NOCLOBBER, ncid)
+        if (err .ne. 0) then
+            call errore('nf_create: ', err)
+            return
+        end if
+
+C           /* BAD_FILLMODE */
+        err = nf_set_fill(ncid, BAD_FILLMODE, old_fillmode)
+        if (err .ne. NF_EINVAL)
+     +      call errore('bad fillmode: ', err)
+
+C           /* proper calls */
+        err = nf_set_fill(ncid, NF_NOFILL, old_fillmode)
+        if (err .ne. 0)
+     +      call errore('nf_set_fill: ', err)
+        if (old_fillmode .ne. NF_FILL)
+     +      call errori('Unexpected old fill mode: ', old_fillmode)
+        err = nf_set_fill(ncid, NF_FILL, old_fillmode)
+        if (err .ne. 0)
+     +      call errore('nf_set_fill: ', err)
+        if (old_fillmode .ne. NF_NOFILL)
+     +      call errori('Unexpected old fill mode: ', old_fillmode)
+
+C           /* define dims & vars */
+        call def_dims(ncid)
+        call def_vars(ncid)
+
+C           /* Change to data mode. Set fillmode again */
+        err = nf_enddef(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_enddef: ', err)
+        err = nf_set_fill(ncid, NF_FILL, old_fillmode)
+        if (err .ne. 0)
+     +      call errore('nf_set_fill: ', err)
+        if (old_fillmode .ne. NF_FILL)
+     +      call errori('Unexpected old fill mode: ', old_fillmode)
+
+C       /* Write record number NRECS to force writing of preceding records */
+C       /* Assumes variable cr is char vector with UNLIMITED dimension */
+        err = nf_inq_varid(ncid, 'cr', vid)
+        if (err .ne. 0)
+     +      call errore('nf_inq_varid: ', err)
+        index(1) = NRECS
+        text = char(NF_FILL_CHAR)
+        err = nf_put_var1_text(ncid, vid, index, text)
+        if (err .ne. 0)
+     +      call errore('nf_put_var1_text: ', err)
+
+C           /* get all variables & check all values equal default fill */
+        do 1, i = 1, NVARS
+            if (var_type(i) .eq. NF_CHAR) then
+                fill = NF_FILL_CHAR
+            else if (var_type(i) .eq. NF_BYTE) then
+                fill = NF_FILL_BYTE
+            else if (var_type(i) .eq. NF_SHORT) then
+                fill = NF_FILL_SHORT
+            else if (var_type(i) .eq. NF_INT) then
+                fill = NF_FILL_INT
+            else if (var_type(i) .eq. NF_FLOAT) then
+                fill = NF_FILL_FLOAT
+            else if (var_type(i) .eq. NF_DOUBLE) then
+                fill = NF_FILL_DOUBLE
+            else
+                stop 2
+            end if
+
+            do 2, j = 1, var_nels(i)
+                err = index2indexes(j, var_rank(i), var_shape(1,i), 
+     +                              index)
+                if (err .ne. 0)
+     +              call error('error in index2indexes()')
+                if (var_type(i) .eq. NF_CHAR) then
+                    err = nf_get_var1_text(ncid, i, index, text)
+                    if (err .ne. 0)
+     +                  call errore('nf_get_var1_text failed: ',err)
+                    value = ichar(text)
+                else
+                    err = nf_get_var1_double(ncid, i, index, value)
+                    if (err .ne. 0)
+     +                  call errore('nf_get_var1_double failed: ',err)
+                end if
+                if (value .ne. fill .and. 
+     +              abs((fill - value)/fill) .gt. 1.0e-9) then
+                    call errord('Unexpected fill value: ', value)
+                else
+                    nok = nok + 1
+                end if
+2           continue
+1       continue
+
+C       /* close scratch & create again for test using attribute _FillValue */
+        err = nf_close(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_close: ', err)
+        err = nf_create(scratch, NF_CLOBBER, ncid)
+        if (err .ne. 0) then
+            call errore('nf_create: ', err)
+            return
+        end if
+        call def_dims(ncid)
+        call def_vars(ncid)
+
+C           /* set _FillValue = 42 for all vars */
+        fill = 42
+        text = char(int(fill))
+        do 3, i = 1, NVARS
+            if (var_type(i) .eq. NF_CHAR) then
+                err = nf_put_att_text(ncid, i, '_FillValue', 1, text)
+                if (err .ne. 0)
+     +              call errore('nf_put_att_text: ', err)
+            else
+                err = nf_put_att_double(ncid, i, '_FillValue',
+     +                                  var_type(i),1,(/fill/))
+                if (err .ne. 0)
+     +              call errore('nf_put_att_double: ', err)
+            end if
+3       continue
+
+C           /* data mode. write records */
+        err = nf_enddef(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_enddef: ', err)
+        index(1) = NRECS
+        err = nf_put_var1_text(ncid, vid, index, text)
+        if (err .ne. 0)
+     +      call errore('nf_put_var1_text: ', err)
+
+C           /* get all variables & check all values equal 42 */
+        do 4, i = 1, NVARS
+            do 5, j = 1, var_nels(i)
+                err = index2indexes(j, var_rank(i), var_shape(1,i), 
+     +                              index)
+                if (err .ne. 0)
+     +              call error('error in index2indexes')
+                if (var_type(i) .eq. NF_CHAR) then
+                    err = nf_get_var1_text(ncid, i, index, text)
+                    if (err .ne. 0)
+     +                  call errore('nf_get_var1_text failed: ',err)
+                    value = ichar(text)
+                else
+                    err = nf_get_var1_double(ncid, i, index, value)
+                    if (err .ne. 0)
+     +                  call errore('nf_get_var1_double failed: ', err)
+                end if
+                if (value .ne. fill) then
+                    call errord(' Value expected: ', fill)
+                    call errord(' Value read:     ', value)
+                else
+                    nok = nok + 1
+                end if
+5           continue
+4       continue
+        call print_nok(nok)
+
+        err = nf_close(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_close: ', err)
+        err = nf_delete(scratch)
+        if (err .ne. 0)
+     +      call errori('delete of scratch file failed: ', err)
+        end
+
+C * Test nc_set_default_format
+C *    try with bad default format
+C *    try with NULL old_formatp
+C *    try in data mode, check error
+C *    check that proper set to NC_FILL works for record & non-record variables
+C *    (note that it is not possible to test NC_NOFILL mode!)
+C *    close file & create again for test using attribute _FillValue
+      subroutine test_nf_set_default_format()
+      use tests
+      implicit none
+      
+      integer ncid
+      integer err
+      integer i
+      integer version
+      integer old_format
+      integer nf_get_file_version
+      
+C     /* bad format */
+      err = nf_set_default_format(5, old_format)
+      IF (err .ne. NF_EINVAL)
+     +     call errore("bad default format: status = %d", err)
+     
+C     /* Cycle through available formats. (actually netcdf-4 formats are
+C     ignored for the moment - ed 5/15/5) */
+      do 1 i=1, 2
+         err = nf_set_default_format(i, old_format)
+         if (err .ne. 0) 
+     +         call errore("setting classic format: status = %d", err)
+         err = nf_create(scratch, NF_CLOBBER, ncid)
+         if (err .ne. 0) call errore("bad nf_create: status = %d", err)
+         err = nf_put_att_text(ncid, NF_GLOBAL, "testatt", 
+     +        4, "blah")
+         if (err .ne. 0) call errore("bad put_att: status = %d", err)
+         err = nf_close(ncid)
+         if (err .ne. 0) call errore("bad close: status = %d", err)
+         err = nf_get_file_version(scratch, version)
+         if (err .ne. 0) call errore("bad file version = %d", err)
+         if (version .ne. i)
+     +        call errore("bad file version = %d", err)
+ 1    continue
+
+C    /* Remove the left-over file. */
+C      err = nf_delete(scratch)
+      if (err .ne. 0) call errore("remove failed", err)
+      end
+      
+C     This function looks in a file for the netCDF magic number.
+      integer function nf_get_file_version(path, version)
+      use tests
+      implicit none
+      
+      character*(*) path
+      integer version, iosnum
+      character magic*4
+      integer ver
+      integer f
+      parameter (f = 10)
+
+      open(f, file=path, status='OLD', form='UNFORMATTED',
+     +     access='DIRECT', recl=4)
+
+C     Assume this is not a netcdf file.
+      nf_get_file_version = NF_ENOTNC
+      version = 0
+
+C     Read the magic number, the first 4 bytes of the file.
+      read(f, rec=1, err = 1) magic
+
+C     If the first three characters are not "CDF" we're done.
+      if (index(magic, 'CDF') .eq. 1) then
+         ver = ichar(magic(4:4))
+         if (ver .eq. 1) then
+            version = 1
+            nf_get_file_version = NF_NOERR
+         elseif (ver .eq. 2) then
+            version = 2
+            nf_get_file_version = NF_NOERR
+         endif
+      endif
+
+ 1    close(f)
+      return
+      end
+
diff --git a/nf03_test/tst03_f77_v2.F b/nf03_test/tst03_f77_v2.F
new file mode 100755
index 0000000..7abf6fb
--- /dev/null
+++ b/nf03_test/tst03_f77_v2.F
@@ -0,0 +1,73 @@
+C     This is part of netCDF, Copyright 2006, UCAR
+
+C     This test program uses the fortran 77 v2 API to create a simple
+C     data file with some phoney data in it. This program is heavily
+C     based on one contributed by Jeremy Kepner,
+C     jvkepner at astro.Princeton.EDU.
+
+C     This program will bail out in the event of a netcdf error.
+
+C     $Id: tst_f77_v2.F,v 1.2 2009/01/25 14:33:44 ed Exp $
+
+      PROGRAM tst_f77_v2
+      use tests      
+      IMPLICIT NONE
+
+
+      INTEGER n_dim,x_dim,y_dim,z_dim
+      PARAMETER(n_dim = 3, x_dim = 20, y_dim = 10, z_dim = 5)
+      INTEGER dim_array(n_dim)
+      INTEGER start(n_dim),count(n_dim)
+
+      INTEGER ncid, errcode
+      INTEGER x_id,y_id,z_id,arr_id
+      REAL array(x_dim,y_dim,z_dim)
+      INTEGER i,j,k
+
+C     Put something into the array.
+      DO i=1,x_dim
+         DO j=1,y_dim
+            DO k=1,z_dim
+               array(i,j,k) = (i-1) + x_dim*(j-1) + x_dim*y_dim*(k-1)
+            ENDDO
+         ENDDO
+      ENDDO
+
+      print *, ''
+      print *, ' *** Testing netCDF v2 api for F77.'
+
+C     Create file.
+      ncid = NCCRE('tst_f77_v2.nc', NCCLOB, errcode)
+
+C     Create Dimensions.
+      x_id = NCDDEF(ncid, 'X', x_dim, errcode)
+      y_id = NCDDEF(ncid, 'Y', y_dim, errcode)
+      z_id = NCDDEF(ncid, 'Z', z_dim, errcode)
+
+C     Create a variable.
+C     Assign dimensions to array.
+      dim_array(1) = z_id
+      dim_array(2) = y_id
+      dim_array(3) = x_id
+      arr_id = NCVDEF(ncid,'array',NCFLOAT,n_dim,dim_array,errcode)
+
+C     Skip attributes.
+
+C     Leave definitions.
+      CALL NCENDF(ncid, errcode)
+
+C     Write variable to file.
+      start(1) = 1
+      start(2) = 1
+      start(3) = 1
+      count(1) = z_dim
+      count(2) = y_dim
+      count(3) = x_dim
+      CALL NCVPT(ncid,arr_id,start,count,array,errcode)
+
+C     Close the file.
+      CALL NCCLOS(ncid, errcode)
+
+      print *, ' *** SUCCESS!'
+
+      END
diff --git a/nf03_test/util03.F b/nf03_test/util03.F
new file mode 100755
index 0000000..a143c24
--- /dev/null
+++ b/nf03_test/util03.F
@@ -0,0 +1,1496 @@
+#include "nfconfig.inc"
+!*********************************************************************
+!   Copyright 1996, UCAR/Unidata
+!   See netcdf/COPYRIGHT file for copying and redistribution conditions.
+!   $Id: util.F,v 1.16 2008/12/31 17:54:10 ed Exp $
+!********************************************************************/
+
+! Implementation of util.F for F03 interfaces
+
+      SUBROUTINE PRINT_NOK(NOK)
+      use tests, ONLY: NFAILS, VERBOSE
+      IMPLICIT  NONE
+      INTEGER   NOK
+
+      IF (VERBOSE .OR. NFAILS .GT. 0) PRINT *, ' '
+      IF (VERBOSE) PRINT *, NOK, ' good comparisons.'
+      END
+
+
+! Is value within external type range? */
+      FUNCTION INRANGE(VALUE, DATATYPE)
+      use tests, ONLY: NF_CHAR, NF_BYTE, NF_SHORT, NF_INT, NF_FLOAT,    &
+     &                 NF_DOUBLE, X_CHAR_MIN, X_CHAR_MAX, X_BYTE_MIN,   &
+     &                 X_BYTE_MAX, X_SHORT_MIN, X_SHORT_MAX, X_INT_MIN, &
+     &                 X_INT_MAX, X_FLOAT_MIN, X_FLOAT_MAX,             &
+     &                 X_DOUBLE_MIN, X_DOUBLE_MAX
+
+      IMPLICIT  NONE
+      DOUBLEPRECISION   VALUE
+      INTEGER           DATATYPE
+      LOGICAL           INRANGE
+
+      DOUBLEPRECISION   MIN
+      DOUBLEPRECISION   MAX
+
+      IF (DATATYPE .EQ. NF_CHAR) THEN
+          MIN = X_CHAR_MIN
+          MAX = X_CHAR_MAX
+      ELSE IF (DATATYPE .EQ. NF_BYTE) THEN
+          MIN = X_BYTE_MIN
+          MAX = X_BYTE_MAX
+      ELSE IF (DATATYPE .EQ. NF_SHORT) THEN
+          MIN = X_SHORT_MIN
+          MAX = X_SHORT_MAX
+      ELSE IF (DATATYPE .EQ. NF_INT) THEN
+          MIN = X_INT_MIN
+          MAX = X_INT_MAX
+      ELSE IF (DATATYPE .EQ. NF_FLOAT) THEN
+          MIN = X_FLOAT_MIN
+          MAX = X_FLOAT_MAX
+      ELSE IF (DATATYPE .EQ. NF_DOUBLE) THEN
+          MIN = X_DOUBLE_MIN
+          MAX = X_DOUBLE_MAX
+      ELSE
+          CALL UDABORT
+      END IF
+
+      INRANGE = (VALUE .GE. MIN) .AND. (VALUE .LE. MAX)
+      END
+
+
+      FUNCTION INRANGE_UCHAR(VALUE, DATATYPE)
+      use tests, ONLY: NF_BYTE, INRANGE
+      IMPLICIT  NONE
+      DOUBLEPRECISION   VALUE
+      INTEGER           DATATYPE
+      LOGICAL INRANGE_UCHAR
+
+      IF (DATATYPE .EQ. NF_BYTE) THEN
+          INRANGE_UCHAR = (VALUE .GE. 0) .AND. (VALUE .LE. 255)
+      ELSE
+          INRANGE_UCHAR = INRANGE(VALUE, DATATYPE)
+      END IF
+      END
+
+
+      FUNCTION INRANGE_FLOAT(VALUE, DATATYPE)
+      use tests, ONLY: NF_CHAR, NF_BYTE, NF_SHORT, NF_INT, NF_FLOAT,    &
+     &                 NF_DOUBLE, X_CHAR_MIN, X_CHAR_MAX, X_BYTE_MIN,   &
+     &                 X_BYTE_MAX, X_SHORT_MIN, X_SHORT_MAX, X_INT_MIN, &
+     &                 X_INT_MAX, X_FLOAT_MIN, X_FLOAT_MAX, NFT_REAL,   &
+     &                 X_DOUBLE_MIN, X_DOUBLE_MAX, internal_max
+      IMPLICIT  NONE
+      DOUBLEPRECISION   VALUE
+      INTEGER           DATATYPE
+      LOGICAL INRANGE_FLOAT
+
+      DOUBLEPRECISION   MIN
+      DOUBLEPRECISION   MAX
+      REAL              FVALUE
+
+      IF (DATATYPE .EQ. NF_CHAR) THEN
+          MIN = X_CHAR_MIN
+          MAX = X_CHAR_MAX
+      ELSE IF (DATATYPE .EQ. NF_BYTE) THEN
+          MIN = X_BYTE_MIN
+          MAX = X_BYTE_MAX
+      ELSE IF (DATATYPE .EQ. NF_SHORT) THEN
+          MIN = X_SHORT_MIN
+          MAX = X_SHORT_MAX
+      ELSE IF (DATATYPE .EQ. NF_INT) THEN
+          MIN = X_INT_MIN
+          MAX = X_INT_MAX
+      ELSE IF (DATATYPE .EQ. NF_FLOAT) THEN
+          IF (internal_max(NFT_REAL) .LT. X_FLOAT_MAX) THEN
+              MIN = -internal_max(NFT_REAL)
+              MAX = internal_max(NFT_REAL)
+          ELSE
+              MIN = X_FLOAT_MIN
+              MAX = X_FLOAT_MAX
+          END IF
+      ELSE IF (DATATYPE .EQ. NF_DOUBLE) THEN
+          IF (internal_max(NFT_REAL) .LT. X_DOUBLE_MAX) THEN
+              MIN = -internal_max(NFT_REAL)
+              MAX = internal_max(NFT_REAL)
+          ELSE
+              MIN = X_DOUBLE_MIN
+              MAX = X_DOUBLE_MAX
+          END IF
+      ELSE
+          CALL UDABORT
+      END IF
+
+      IF (.NOT.((VALUE .GE. MIN) .AND. (VALUE .LE. MAX))) THEN
+          INRANGE_FLOAT = .FALSE.
+      ELSE
+          FVALUE = VALUE
+          INRANGE_FLOAT = (FVALUE .GE. MIN) .AND. (FVALUE .LE. MAX)
+      END IF
+      END
+
+
+! wrapper for inrange to handle special NF_BYTE/uchar adjustment */
+      function inrange3(value, datatype, itype)
+      use tests, ONLY: NFT_REAL, inrange, inrange_float
+      implicit          none
+      doubleprecision   value
+      integer           datatype
+      integer           itype
+      logical inrange3
+
+      if (itype .eq. NFT_REAL) then
+          inrange3 = inrange_float(value, datatype)
+      else
+          inrange3 = inrange(value, datatype)
+      end if
+      end
+
+
+!
+!  Does x == y, where one is internal and other external (netCDF)?  
+!  Use tolerant comparison based on IEEE FLT_EPSILON or DBL_EPSILON.
+!
+      function equal(x, y, extType, itype)
+      use tests, ONLY: NF_REAL, NFT_REAL
+      implicit  none
+      doubleprecision   x
+      doubleprecision   y
+      integer           extType         !!/* external data type */
+      integer           itype
+      logical equal
+      doubleprecision   epsilon
+
+      if ((extType .eq. NF_REAL) .or. (itype .eq. NFT_REAL)) then
+          epsilon = 1.19209290E-07
+      else
+          epsilon = 2.2204460492503131E-16
+      end if
+      equal = abs(x-y) .le. epsilon * max( abs(x), abs(y))
+      end
+
+
+! Test whether two int vectors are equal. If so return 1, else 0  */
+        function int_vec_eq(v1, v2, n)
+!        use tests
+        implicit        none
+        integer n
+        integer v1(n)
+        integer v2(n)
+
+        integer i
+        logical int_vec_eq
+
+        int_vec_eq = .true.
+
+        if (n .le. 0)
+     +      return
+
+        do 1, i=1, n
+            if (v1(i) .ne. v2(i)) then
+                int_vec_eq = .false.
+                return
+            end if
+1       continue
+        end
+
+
+!
+!  Generate random integer from 0 through n-1
+!  Like throwing an n-sided dice marked 0, 1, 2, ..., n-1
+!
+      function roll(n)
+!      use tests
+      implicit  none
+      integer   n
+      integer roll
+      doubleprecision   udrand
+      external          udrand
+      
+1     roll = (udrand(0) * (n-1)) + 0.5
+      if (roll .ge. n) goto 1
+      end
+
+
+!
+!      Convert an origin-1 cumulative index to a netCDF index vector.
+!       Grosset dimension first; finest dimension last.
+!
+!      Authors: Harvey Davies, Unidata/UCAR, Boulder, Colorado
+!                Steve Emmerson, (same place)
+!
+        function index2ncindexes(index, rank, base, indexes)
+!        use tests
+        implicit        none
+        integer         index           !!/* index to be converted */
+        integer         rank            !/* number of dimensions */
+        integer         base(rank)      !/* base(rank) ignored */
+        integer         indexes(rank)   !/* returned FORTRAN indexes */
+
+        integer i
+        integer offset
+        integer index2ncindexes
+
+        if (rank .gt. 0) then
+            offset = index - 1
+            do 1, i = rank, 1, -1
+                if (base(i) .eq. 0) then
+                    index2ncindexes = 1
+                    return
+                end if
+                indexes(i) = 1 + mod(offset, base(i))
+                offset = offset / base(i)
+1           continue
+        end if
+        index2ncindexes = 0
+        end
+
+
+!
+!      Convert an origin-1 cumulative index to a FORTRAN index vector.
+!       Finest dimension first; grossest dimension last.
+!
+!      Authors: Harvey Davies, Unidata/UCAR, Boulder, Colorado
+!                Steve Emmerson, (same place)
+!
+        function index2indexes(index, rank, base, indexes)
+!        use tests
+        implicit        none
+        integer         index           !/* index to be converted */
+        integer         rank            !/* number of dimensions */
+        integer         base(rank)      !/* base(rank) ignored */
+        integer         indexes(rank)   !/* returned FORTRAN indexes */
+        integer         index2indexes
+        integer i
+        integer offset
+
+        if (rank .gt. 0) then
+            offset = index - 1
+            do 1, i = 1, rank
+                if (base(i) .eq. 0) then
+                    index2indexes = 1
+                    return
+                end if
+                indexes(i) = 1 + mod(offset, base(i))
+                offset = offset / base(i)
+1           continue
+        end if
+        index2indexes = 0
+        end
+
+
+!
+!      Convert a FORTRAN index vector to an origin-1 cumulative index.
+!       Finest dimension first; grossest dimension last.
+!
+!      Authors: Harvey Davies, Unidata/UCAR, Boulder, Colorado
+!                Steve Emmerson, (same place)
+!
+        function indexes2index(rank, indexes, base)
+!        use tests
+        implicit        none
+        integer         rank            !/* number of dimensions */
+        integer         indexes(rank)   !/* FORTRAN indexes */
+        integer         base(rank)      !/* base(rank) ignored */
+        integer  indexes2index
+        integer i
+
+        indexes2index = 0
+        if (rank .gt. 0) then
+            do 1, i = rank, 1, -1
+                indexes2index = (indexes2index-1) * base(i) + indexes(i)
+1           continue
+        end if
+        end
+
+
+#ifdef USE_EXTREME_NUMBERS
+! Generate data values as function of type, rank (-1 for attribute), index */
+      function hash(type, rank, index) 
+      use tests, ONLY: NF_CHAR, NF_BYTE, NF_SHORT, NF_INT, NF_FLOAT,    &
+     &                 NF_DOUBLE, X_CHAR_MIN, X_CHAR_MAX, X_BYTE_MIN,   &
+     &                 X_BYTE_MAX, X_SHORT_MIN, X_SHORT_MAX, X_INT_MIN, &
+     &                 X_INT_MAX, X_FLOAT_MIN, X_FLOAT_MAX,             &
+     &                 X_DOUBLE_MIN, X_DOUBLE_MAX, RK8
+      implicit  none
+      integer   type
+      integer   rank
+      integer   index(*)
+      real(RK8) hash
+
+      doubleprecision   base
+      doubleprecision   result
+      integer           d       !/* index of dimension */
+
+        !/* If vector then elements 1 & 2 are min & max. Elements 3 & 4 are */
+        !/* just < min & > max (except for NF_CHAR & NF_DOUBLE) */
+      if (abs(rank) .eq. 1 .and. index(1) .le. 4) then
+          if (index(1) .eq. 1) then
+              if (type .eq. NF_CHAR) then
+                  hash = X_CHAR_MIN
+              else if (type .eq. NF_BYTE) then
+                  hash = X_BYTE_MIN
+              else if (type .eq. NF_SHORT) then
+                  hash = X_SHORT_MIN
+              else if (type .eq. NF_INT) then
+                  hash = X_INT_MIN
+              else if (type .eq. NF_FLOAT) then
+                  hash = X_FLOAT_MIN
+              else if (type .eq. NF_DOUBLE) then
+                  hash = X_DOUBLE_MIN
+              else
+                  call udabort
+              end if
+          else if (index(1) .eq. 2) then
+              if (type .eq. NF_CHAR) then
+                  hash = X_CHAR_MAX
+              else if (type .eq. NF_BYTE) then
+                  hash = X_BYTE_MAX
+              else if (type .eq. NF_SHORT) then
+                  hash = X_SHORT_MAX
+              else if (type .eq. NF_INT) then
+                  hash = X_INT_MAX
+              else if (type .eq. NF_FLOAT) then
+                  hash = X_FLOAT_MAX
+              else if (type .eq. NF_DOUBLE) then
+                  hash = X_DOUBLE_MAX
+              else
+                  call udabort
+              end if
+          else if (index(1) .eq. 3) then
+              if (type .eq. NF_CHAR) then
+                  hash = ichar('A')
+              else if (type .eq. NF_BYTE) then
+                  hash = X_BYTE_MIN-1.0
+              else if (type .eq. NF_SHORT) then
+                  hash = X_SHORT_MIN-1.0
+              else if (type .eq. NF_INT) then
+                  hash = X_INT_MIN
+              else if (type .eq. NF_FLOAT) then
+                  hash = X_FLOAT_MIN
+              else if (type .eq. NF_DOUBLE) then
+                  hash = -1.0
+              else
+                  call udabort
+              end if
+          else if (index(1) .eq. 4) then
+              if (type .eq. NF_CHAR) then
+                  hash = ichar('Z')
+              else if (type .eq. NF_BYTE) then
+                  hash = X_BYTE_MAX+1.0
+              else if (type .eq. NF_SHORT) then
+                  hash = X_SHORT_MAX+1.0
+              else if (type .eq. NF_INT) then
+                  hash = X_INT_MAX+1.0
+              else if (type .eq. NF_FLOAT) then
+                  hash = X_FLOAT_MAX
+              else if (type .eq. NF_DOUBLE) then
+                  hash = 1.0
+              else
+                  call udabort
+              end if
+          end if
+      else
+          if (type .eq. NF_CHAR) then
+              base = 2
+          else if (type .eq. NF_BYTE) then
+              base = -2
+          else if (type .eq. NF_SHORT) then
+              base = -5
+          else if (type .eq. NF_INT) then
+              base = -20
+          else if (type .eq. NF_FLOAT) then
+              base = -9
+          else if (type .eq. NF_DOUBLE) then
+              base = -10
+          else
+              stop 2
+          end if
+
+          if (rank .lt. 0) then
+              result = base * 7
+          else
+              result = base * (rank + 1)
+          end if
+
+!         /*
+!          * NB: Finest netCDF dimension assumed first.
+!          */
+          do 1, d = abs(rank), 1, -1
+              result = base * (result + index(d) - 1)
+1         continue
+          hash = result
+      end if
+      end
+#else /* USE_EXTREME_NUMBERS */
+#define SANE_SHORT 3333
+#define SANE_INT 2222
+#define SANE_FLOAT 300.0
+#define SANE_DOUBLE 1000.0
+
+! Generate data values as function of type, rank (-1 for attribute), index */
+      function hash(type, rank, index) 
+      use tests, ONLY: NF_CHAR, NF_BYTE, NF_SHORT, NF_INT, NF_FLOAT,    &
+     &                 NF_DOUBLE, X_CHAR_MIN, X_CHAR_MAX, X_BYTE_MIN,   &
+     &                 X_BYTE_MAX, X_SHORT_MIN, X_SHORT_MAX, X_INT_MIN, &
+     &                 X_INT_MAX, X_FLOAT_MIN, X_FLOAT_MAX,             &
+     &                 X_DOUBLE_MIN, X_DOUBLE_MAX, RK8
+      implicit  none
+      integer   type
+      integer   rank
+      integer   index(*)
+
+      real(RK8) hash
+      doubleprecision   base
+      doubleprecision   result
+      integer           d       !/* index of dimension */
+
+        !/* If vector then elements 1 & 2 are min & max. Elements 3 & 4 are */
+        !/* just < min & > max (except for NF_CHAR & NF_DOUBLE) */
+      if (abs(rank) .eq. 1 .and. index(1) .le. 4) then
+          if (index(1) .eq. 1) then
+              if (type .eq. NF_CHAR) then
+                  hash = X_CHAR_MIN
+              else if (type .eq. NF_BYTE) then
+                  hash = X_BYTE_MIN
+              else if (type .eq. NF_SHORT) then
+                  hash = SANE_SHORT
+              else if (type .eq. NF_INT) then
+                  hash = SANE_INT
+              else if (type .eq. NF_FLOAT) then
+                  hash = SANE_FLOAT
+              else if (type .eq. NF_DOUBLE) then
+                  hash = SANE_DOUBLE
+              else
+                  call udabort
+              end if
+          else if (index(1) .eq. 2) then
+              if (type .eq. NF_CHAR) then
+                  hash = X_CHAR_MAX
+              else if (type .eq. NF_BYTE) then
+                  hash = X_BYTE_MAX
+              else if (type .eq. NF_SHORT) then
+                  hash = SANE_SHORT
+              else if (type .eq. NF_INT) then
+                  hash = SANE_INT
+              else if (type .eq. NF_FLOAT) then
+                  hash = SANE_FLOAT
+              else if (type .eq. NF_DOUBLE) then
+                  hash = SANE_DOUBLE
+              else
+                  call udabort
+              end if
+          else if (index(1) .eq. 3) then
+              if (type .eq. NF_CHAR) then
+                  hash = ichar('A')
+              else if (type .eq. NF_BYTE) then
+                  hash = X_BYTE_MIN-1.0
+              else if (type .eq. NF_SHORT) then
+                  hash = SANE_SHORT-1.0
+              else if (type .eq. NF_INT) then
+                  hash = SANE_INT
+              else if (type .eq. NF_FLOAT) then
+                  hash = SANE_FLOAT
+              else if (type .eq. NF_DOUBLE) then
+                  hash = -1.0
+              else
+                  call udabort
+              end if
+          else if (index(1) .eq. 4) then
+              if (type .eq. NF_CHAR) then
+                  hash = ichar('Z')
+              else if (type .eq. NF_BYTE) then
+                  hash = X_BYTE_MAX+1.0
+              else if (type .eq. NF_SHORT) then
+                  hash = SANE_SHORT+1.0
+              else if (type .eq. NF_INT) then
+                  hash = SANE_INT+1.0
+              else if (type .eq. NF_FLOAT) then
+                  hash = SANE_FLOAT
+              else if (type .eq. NF_DOUBLE) then
+                  hash = 1.0
+              else
+                  call udabort
+              end if
+          end if
+      else
+          if (type .eq. NF_CHAR) then
+              base = 2
+          else if (type .eq. NF_BYTE) then
+              base = -2
+          else if (type .eq. NF_SHORT) then
+              base = -5
+          else if (type .eq. NF_INT) then
+              base = -20
+          else if (type .eq. NF_FLOAT) then
+              base = -9
+          else if (type .eq. NF_DOUBLE) then
+              base = -10
+          else
+              stop 2
+          end if
+
+          if (rank .lt. 0) then
+              result = base * 7
+          else
+              result = base * (rank + 1)
+          end if
+
+!         /*
+!          * NB: Finest netCDF dimension assumed first.
+!          */
+          do 1, d = abs(rank), 1, -1
+              result = base * (result + index(d) - 1)
+1         continue
+          hash = result
+      end if
+      end
+#endif
+
+! wrapper for hash to handle special NC_BYTE/uchar adjustment */
+      function hash4(type, rank, index, itype)
+      use tests, ONLY: NFT_CHAR, NF_BYTE, RK8, hash
+      implicit  none
+      integer   type
+      integer   rank
+      integer   index(*)
+      integer   itype
+      real(RK8) hash4
+
+      hash4 = hash( type, rank, index )
+      if ((itype .eq. NFT_CHAR) .and. (type .eq. NF_BYTE) .and. 
+     +    (hash4 .ge. -128) .and. (hash4 .lt. 0)) hash4 = hash4 + 256
+      end
+
+
+      integer function char2type(letter)
+      use tests, ONLY: NF_CHAR, NF_SHORT, NF_BYTE, NF_INT, NF_FLOAT,    &
+     &                 NF_DOUBLE
+      implicit          none
+      character*1       letter
+
+      if (letter .eq. 'c') then
+          char2type = NF_CHAR
+      else if (letter .eq. 'b') then
+          char2type = NF_BYTE
+      else if (letter .eq. 's') then
+          char2type = NF_SHORT
+      else if (letter .eq. 'i') then
+          char2type = NF_INT
+      else if (letter .eq. 'f') then
+          char2type = NF_FLOAT
+      else if (letter .eq. 'd') then
+          char2type = NF_DOUBLE
+      else
+        stop 2
+      end if
+      end
+
+
+      subroutine init_dims(digit)
+      use tests, ONLY: NDIMS, RECDIM, NRECS, DIM_LEN, DIM_NAME
+      implicit          none
+      character*1       digit(NDIMS)
+
+      integer   dimid                   !/* index of dimension */
+      do 1, dimid = 1, NDIMS
+          if (dimid .eq. RECDIM) then
+              dim_len(dimid) = NRECS
+          else
+              dim_len(dimid) = dimid - 1
+          endif
+          dim_name(dimid) = 'D' // digit(dimid)
+1     continue
+      end
+
+
+      subroutine init_gatts(type_letter)
+      use tests, ONLY: NTYPES, gatt_name, gatt_len, gatt_type
+      implicit          none
+      character*1       type_letter(NTYPES)
+
+      integer   attid
+      integer   char2type
+
+      do 1, attid = 1, NTYPES
+          gatt_name(attid) = 'G' // type_letter(attid)
+          gatt_len(attid) = attid
+          gatt_type(attid) = char2type(type_letter(attid))
+1     continue
+      end
+
+
+      integer function prod(nn, sp)
+      use tests, ONLY: MAX_RANK
+      implicit  none
+      integer   nn
+      integer   sp(MAX_RANK)
+
+      integer   i
+
+      prod = 1
+      do 1, i = 1, nn
+          prod = prod * sp(i)
+1     continue
+      end
+
+
+!
+!   define global variables:
+!   dim_name, dim_len, 
+!   var_name, var_type, var_rank, var_shape, var_natts, var_dimid, var_nels
+!   att_name, gatt_name, att_type, gatt_type, att_len, gatt_len
+!
+        subroutine init_gvars 
+        use tests, NTYPESP=>NTYPES, MAX_DIM_LENP=>MAX_DIM_LEN,          &
+     &             NVARSP=>NVARS
+        implicit        none
+
+        integer         max_dim_len(MAX_RANK)
+        character*1     type_letter(NTYPESP)
+        character*1     digit(10)
+
+        integer rank
+        integer vn              !/* var number */
+        integer xtype           !/* index of type */
+        integer an              !/* origin-0 cumulative attribute index */
+        integer nvars
+        integer jj
+        integer ntypes
+        integer tc
+        integer tmp(MAX_RANK)
+        integer ac              !/* attribute index */
+        integer dn              !/* dimension number */
+        integer prod            !/* function */
+        integer char2type       !/* function */
+        integer err
+
+        data    max_dim_len     /0, MAX_DIM_LENP, MAX_DIM_LENP/
+        data    type_letter     /'c', 'b', 's', 'i', 'f', 'd'/
+        data    digit           /'r', '1', '2', '3', '4', '5',
+     +                           '6', '7', '8', '9'/
+
+        max_dim_len(1) = MAX_DIM_LENP + 1
+
+        call init_dims(digit)
+
+        vn = 1
+        xtype = 1
+        an = 0
+
+!       /* Loop over variable ranks */
+        do 1, rank = 0, MAX_RANK
+            nvars = prod(rank, max_dim_len)
+
+            !/* Loop over variable shape vectors */
+            do 2, jj = 1, nvars                         !/* 1, 5, 20, 80 */
+                !/* number types of this shape */
+                if (rank .lt. 2) then
+                    ntypes = NTYPESP                     !/* 6 */
+                else
+                    ntypes = 1
+                end if
+
+                !/* Loop over external data types */
+                do 3, tc = 1, ntypes                    !/* 6, 1 */
+                    var_name(vn) = type_letter(xtype)
+                    var_type(vn) = char2type(type_letter(xtype))
+                    var_rank(vn) = rank
+                    if (rank .eq. 0) then
+                        var_natts(vn) = mod(vn - 1, MAX_NATTS + 1)
+                    else
+                        var_natts(vn) = 0
+                    end if
+
+                    do 4, ac = 1, var_natts(vn)
+                        attname(ac,vn) = 
+     +                      type_letter(1+mod(an, NTYPESP))
+                        attlen(ac,vn) = an
+                        atttype(ac,vn) =
+     +                      char2type(type_letter(1+mod(an, NTYPESP)))
+                        an = an + 1
+4                   continue
+
+                    !/* Construct initial shape vector */
+                    err = index2ncindexes(jj, rank, max_dim_len, tmp)
+                    do 5, dn = 1, rank
+                        var_dimid(dn,vn) = tmp(1+rank-dn)
+5                   continue
+
+                    var_nels(vn) = 1
+                    do 6, dn = 1, rank
+                        if (dn .lt. rank) then
+                            var_dimid(dn,vn) = var_dimid(dn,vn) + 1
+                        end if
+                        if (var_dimid(dn,vn) .gt. 9) then
+                            stop 2
+                        end if
+                        var_name(vn)(rank+2-dn:rank+2-dn) = 
+     +                      digit(var_dimid(dn,vn))
+                        if (var_dimid(dn,vn) .ne. RECDIM) then
+                            var_shape(dn,vn) = var_dimid(dn,vn) - 1
+                        else
+                            var_shape(dn,vn) = NRECS
+                        end if
+                        var_nels(vn) = var_nels(vn) * var_shape(dn,vn)
+6                   continue
+
+                    vn = vn + 1
+                    xtype = 1 + mod(xtype, NTYPESP)
+3               continue
+2           continue
+1       continue
+
+        call init_gatts(type_letter)
+        end
+
+
+! define dims defined by global variables */
+        subroutine def_dims(ncid)
+        use tests
+        implicit        none
+        integer         ncid
+
+        integer         err             !/* status */
+        integer         i
+        integer         dimid           !/* dimension id */
+
+        do 1, i = 1, NDIMS
+            if (i .eq. RECDIM) then
+                err = nf_def_dim(ncid, dim_name(i), NF_UNLIMITED,
+     +                           dimid)
+            else
+                err = nf_def_dim(ncid, dim_name(i), dim_len(i),
+     +                           dimid)
+            end if
+            if (err .ne. 0) then
+                call errore('nf_def_dim: ', err)
+            end if
+1       continue
+        end
+
+
+! define vars defined by global variables */
+        subroutine def_vars(ncid)
+        use tests
+        implicit        none
+        integer         ncid
+
+        integer         err             !/* status */
+        integer         i
+        integer         var_id
+
+        do 1, i = 1, NVARS
+            err = nf_def_var(ncid, var_name(i), var_type(i), 
+     +                       var_rank(i), var_dimid(1,i), var_id)
+            if (err .ne. 0) then
+                call errore('nf_def_var: ', err)
+            end if
+1       continue
+        end
+
+
+! put attributes defined by global variables */
+        subroutine put_atts(ncid)
+        use tests
+        implicit        none
+        integer         ncid
+
+        integer                 err             !/* netCDF status */
+        integer                 i               !/* variable index (0 => global 
+                                                ! * attribute */
+        integer                 k               !/* attribute index */
+        integer                 j               !/* index of attribute */
+        integer                 ndx(1)
+        logical                 allInRange
+
+        doubleprecision         att(MAX_NELS)
+        character*(MAX_NELS+2)  catt
+
+        do 1, i = 0, NVARS      !/* var 0 => NF_GLOBAL attributes */
+            do 2, j = 1, NATTS(i)
+                if (NF_CHAR .eq. ATT_TYPE(j,i)) then
+                    catt = ' '
+                    do 3, k = 1, ATT_LEN(j,i)
+                        ndx(1) = k
+                        catt(k:k) = char(int(hash(ATT_TYPE(j,i), -1, 
+     +                                   ndx)))
+3                   continue
+!                   /*
+!                    * The following ensures that the text buffer doesn't
+!                    * start with 4 zeros (which is a CFORTRAN NULL pointer
+!                    * indicator) yet contains a zero (which causes the
+!                    * CFORTRAN interface to pass the address of the
+!                    * actual text buffer).
+!                    */
+                    catt(ATT_LEN(j,i)+1:ATT_LEN(j,i)+1) = char(1)
+                    catt(ATT_LEN(j,i)+2:ATT_LEN(j,i)+2) = char(0)
+
+                    err = nf_put_att_text(ncid, varid(i), 
+     +                                    ATT_NAME(j,i),
+     +                                    ATT_LEN(j,i), catt)
+                    if (err .ne. 0) then
+                        call errore('nf_put_att_text: ', err)
+                    end if
+                else
+                    allInRange = .true.
+                    do 4, k = 1, ATT_LEN(j,i)
+                        ndx(1) = k
+                        att(k) = hash(ATT_TYPE(j,i), -1, ndx)
+                        allInRange = allInRange .and.
+     +                               inRange(att(k), ATT_TYPE(j,i))
+4                   continue
+                    err = nf_put_att_double(ncid, varid(i),
+     +                                      ATT_NAME(j,i),
+     +                                      ATT_TYPE(j,i),
+     +                                      ATT_LEN(j,i), att)
+                    if (allInRange) then
+                        if (err .ne. 0) then
+                            call errore('nf_put_att_double: ', err)
+                        end if
+                    else
+                        if (err .ne. NF_ERANGE) then
+                            call errore(
+     +                  'type-conversion range error: status = ',
+     +                          err)
+                        end if
+                    end if
+                end if
+2           continue
+1       continue
+        end
+
+
+! put variables defined by global variables */
+        subroutine put_vars(ncid)
+        use tests
+        implicit        none
+        integer                 ncid
+
+        integer                 start(MAX_RANK)
+        integer                 index(MAX_RANK)
+        integer                 err             !/* netCDF status */
+        integer                 i
+        integer                 j
+        doubleprecision         value(MAX_NELS)
+        character*(MAX_NELS+2)  text
+        logical                 allInRange
+
+        do 1, j = 1, MAX_RANK
+            start(j) = 1
+1       continue
+
+        do 2, i = 1, NVARS
+            allInRange = .true.
+            do 3, j = 1, var_nels(i)
+                err = index2indexes(j, var_rank(i), var_shape(1,i), 
+     +                              index)
+                if (err .ne. 0) then
+                    call errori(
+     +                  'Error calling index2indexes() for var ', j)
+                end if
+                if (var_name(i)(1:1) .eq. 'c') then
+                    text(j:j) = 
+     +                  char(int(hash(var_type(i), var_rank(i), index)))
+                else
+                    value(j)  = hash(var_type(i), var_rank(i), index)
+                    allInRange = allInRange .and.
+     +                  inRange(value(j), var_type(i))
+                end if
+3           continue
+            if (var_name(i)(1:1) .eq. 'c') then
+!               /*
+!                * The following statement ensures that the first 4
+!                * characters in 'text' are not all zeros (which is
+!                * a cfortran.h NULL indicator) and that the string
+!                * contains a zero (which will cause the address of the
+!                * actual string buffer to be passed).
+!                */
+                text(var_nels(i)+1:var_nels(i)+1) = char(1)
+                text(var_nels(i)+2:var_nels(i)+2) = char(0)
+                err = nf_put_vara_text(ncid, i, start, var_shape(1:,i), & 
+     &                                 text)
+                if (err .ne. 0) then
+                    call errore('nf_put_vara_text: ', err)
+                end if
+            else
+                err = nf_put_vara_double(ncid, i, start,var_shape(1:,i),&
+     &                                   value)
+                if (allInRange) then
+                    if (err .ne. 0) then
+                        call errore('nf_put_vara_double: ', err)
+                    end if
+                else
+                    if (err .ne. NF_ERANGE) then                        &
+                        call errore(                                    & 
+     &                      'type-conversion range error: status = ',   & 
+     &                      err)
+                    end if
+                end if
+            end if
+2       continue
+        end
+
+
+! Create & write all of specified file using global variables */
+        subroutine write_file(filename) 
+        use tests
+        implicit        none
+        character*(*)   filename
+
+        integer ncid            !/* netCDF id */
+        integer err             !/* netCDF status */
+
+        err = nf_create(filename, NF_CLOBBER, ncid)
+        if (err .ne. 0) then
+            call errore('nf_create: ', err)
+        end if
+
+        call def_dims(ncid)
+        call def_vars(ncid)
+        call put_atts(ncid)
+        err = nf_enddef(ncid)
+        if (err .ne. 0) then
+            call errore('nf_enddef: ', err)
+        end if
+        call put_vars(ncid)
+
+        err = nf_close(ncid)
+        if (err .ne. 0) then
+            call errore('nf_close: ', err)
+        end if
+        end
+
+
+!
+! check dimensions of specified file have expected name & length
+!
+        subroutine check_dims(ncid)
+        use tests
+        implicit        none
+        integer         ncid
+
+        character*(NF_MAX_NAME) name
+        integer                 length
+        integer                 i
+        integer                 err           !/* netCDF status */
+
+        do 1, i = 1, NDIMS
+            err = nf_inq_dim(ncid, i, name, length)
+            if (err .ne. 0) then
+                call errore('nf_inq_dim: ', err)
+            end if
+            if (name .ne. dim_name(i)) then
+                call errori('Unexpected name of dimension ', i)
+            end if
+            if (length .ne. dim_len(i)) then
+                call errori('Unexpected length of dimension ', i)
+            end if
+1       continue
+        end
+
+
+!
+! check variables of specified file have expected name, type, shape & values
+!
+        subroutine check_vars(ncid)
+        use tests, NDIMSP=>NDIMS
+        implicit        none
+        integer         ncid
+
+        integer                 index(MAX_RANK)
+        integer                 err             !/* netCDF status */
+        integer                 i
+        integer                 j
+        character*1             text
+        doubleprecision         value
+        integer                 datatype
+        integer                 ndims
+        integer                 natt
+        integer                 dimids(MAX_RANK)
+        logical                 isChar
+        doubleprecision         expect
+        character*(NF_MAX_NAME) name
+        integer                 length
+        integer                 nok             !/* count of valid comparisons */
+
+        nok = 0
+
+        do 1, i = 1, NVARS
+            isChar = var_type(i) .eq. NF_CHAR
+            err = nf_inq_var(ncid, i, name, datatype, ndims, dimids, 
+     +          natt)
+            if (err .ne. 0) then
+                call errore('nf_inq_var: ', err)
+            end if
+            if (name .ne. var_name(i)) then
+                call errori('Unexpected var_name for variable ', i)
+            end if
+            if (datatype .ne. var_type(i))  then
+                call errori('Unexpected type for variable ', i)
+            end if
+            if (ndims .ne. var_rank(i))  then
+                call errori('Unexpected rank for variable ', i)
+            end if
+            do 2, j = 1, ndims
+                err = nf_inq_dim(ncid, dimids(j), name, length)
+                if (err .ne. 0) then
+                    call errore('nf_inq_dim: ', err)
+                end if
+                if (length .ne. var_shape(j,i))  then
+                    call errori('Unexpected shape for variable ', i)
+                end if
+2           continue
+            do 3, j = 1, var_nels(i)
+                err = index2indexes(j, var_rank(i), var_shape(1,i), 
+     +                  index)
+                if (err .ne. 0)  then
+                    call errori('error in index2indexes() 2, variable ',
+     +                          i)
+                end if
+                expect = hash(var_type(i), var_rank(i), index )
+                if (isChar) then
+                    err = nf_get_var1_text(ncid, i, index, text)
+                    if (err .ne. 0) then
+                        call errore('nf_get_var1_text: ', err)
+                    end if
+                    if (ichar(text) .ne. expect) then
+                        call errori(
+     +              'Var value read not that expected for variable ', i)
+                    else
+                        nok = nok + 1
+                    end if
+                else
+                    err = nf_get_var1_double(ncid, i, index, value)
+                    if (inRange(expect,var_type(i))) then
+                        if (err .ne. 0) then
+                            call errore('nf_get_var1_double: ', err)
+                        else
+                            if (.not. equal(value,expect,var_type(i),
+     +                          NFT_DOUBLE)) then
+                                call errori(
+     +              'Var value read not that expected for variable ', i)
+                            else
+                                nok = nok + 1
+                            end if
+                        end if
+                    end if
+                end if
+3           continue
+1       continue
+        call print_nok(nok)
+        end
+
+
+!
+! check attributes of specified file have expected name, type, length & values
+!
+        subroutine check_atts(ncid) 
+        use tests
+        implicit        none
+        integer         ncid
+
+        integer                 err             !/* netCDF status */
+        integer                 i
+        integer                 j
+        integer                 k
+        integer                 vid             !/* "variable" ID */
+        integer                 datatype
+        integer                 ndx(1)
+        character*(NF_MAX_NAME) name
+        integer                 length
+        character*(MAX_NELS)    text
+        doubleprecision         value(MAX_NELS)
+        doubleprecision         expect
+        integer                 nok             !/* count of valid comparisons */
+
+        nok = 0
+
+        do 1, vid = 0, NVARS
+            i = varid(vid)
+
+            do 2, j = 1, NATTS(i)
+                err = nf_inq_attname(ncid, i, j, name)
+                if (err .ne. 0) then
+                    call errore('nf_inq_attname: ', err)
+                end if
+                if (name .ne. ATT_NAME(j,i)) then
+                    call errori(
+     +                  'nf_inq_attname: unexpected name for var ', i)
+                end if
+                err = nf_inq_att(ncid, i, name, datatype, length)
+                if (err .ne. 0) then
+                    call errore('nf_inq_att: ', err)
+                end if
+                if (datatype .ne. ATT_TYPE(j,i)) then
+                    call errori('nf_inq_att: unexpected type for var ',
+     +                         i)
+                end if
+                if (length .ne. ATT_LEN(j,i)) then
+                    call errori(
+     +                  'nf_inq_att: unexpected length for var ', i)
+                end if
+                if (datatype .eq. NF_CHAR) then
+                    err = nf_get_att_text(ncid, i, name, text)
+                    if (err .ne. 0) then
+                        call errore('nf_get_att_text: ', err)
+                    end if
+                    do 3, k = 1, ATT_LEN(j,i)
+                        ndx(1) = k
+                        if (ichar(text(k:k)) .ne. hash(datatype, -1, 
+     +                                                 ndx))
+     +                  then
+                            call errori(
+     +          'nf_get_att_text: unexpected value for var ', i)
+                        else
+                            nok = nok + 1
+                        end if
+3                   continue
+                else
+                    err = nf_get_att_double(ncid, i, name, value)
+                    do 4, k = 1, ATT_LEN(j,i)
+                        ndx(1) = k
+                        expect = hash(datatype, -1, ndx)
+                        if (inRange(expect,ATT_TYPE(j,i))) then
+                            if (err .ne. 0) then
+                                call errore('nf_get_att_double: ', err)
+                            end if
+                            if (.not. equal(value(k), expect,
+     +                          ATT_TYPE(j,i), NFT_DOUBLE)) then
+                                call errori(
+     +                  'Att value read not that expected for var ', i)
+                            else
+                                nok = nok + 1
+                            end if
+                        end if
+4                   continue
+                end if
+2           continue
+1       continue
+        call print_nok(nok)
+        end
+
+
+! Check file (dims, vars, atts) corresponds to global variables */
+        subroutine check_file(filename) 
+        use tests
+        implicit        none
+        character*(*)   filename
+
+        integer ncid            !/* netCDF id */
+        integer err             !/* netCDF status */
+
+        err = nf_open(filename, NF_NOWRITE, ncid)
+        if (err .ne. 0) then
+            call errore('nf_open: ', err)
+        else
+            call check_dims(ncid)
+            call check_vars(ncid)
+            call check_atts(ncid)
+            err = nf_close (ncid)
+            if (err .ne. 0) then
+                call errore('nf_close: ', err)
+            end if
+        end if
+        end
+
+
+!
+! Functions for accessing attribute test data.
+!
+! NB: 'varid' is 0 for global attributes; thus, global attributes can
+! be handled in the same loop as variable attributes.
+!
+
+      FUNCTION VARID(VID)
+      use tests, ONLY: NF_GLOBAL 
+      IMPLICIT NONE
+      INTEGER VID
+      INTEGER VARID
+      IF (VID .LT. 1) THEN
+          VARID = NF_GLOBAL
+      ELSE
+          VARID = VID
+      ENDIF
+      end
+
+
+      FUNCTION NATTS(VID)
+      use tests, ONLY: NGATTS, VAR_NATTS
+      IMPLICIT  NONE
+      INTEGER VID
+      Integer NATTS
+
+      IF (VID .LT. 1) THEN
+          NATTS = NGATTS
+      ELSE
+          NATTS = VAR_NATTS(VID)
+      ENDIF
+      END
+
+
+      FUNCTION ATT_NAME(J,VID)
+      use tests, ONLY: GATT_NAME, ATTNAME
+      IMPLICIT  NONE
+      INTEGER J
+      INTEGER VID
+      CHARACTER*2 ATT_NAME
+      IF (VID .LT. 1) THEN
+          ATT_NAME = GATT_NAME(J)
+      ELSE
+          ATT_NAME = ATTNAME(J,VID)
+      ENDIF
+      END
+
+
+      FUNCTION ATT_TYPE(J,VID)
+      use tests, ONLY :GATT_TYPE, ATTTYPE
+      IMPLICIT  NONE
+      INTEGER J
+      INTEGER VID
+      INTEGER ATT_TYPE
+      IF (VID .LT. 1) THEN
+          ATT_TYPE = GATT_TYPE(J)
+      ELSE
+          ATT_TYPE = ATTTYPE(J,VID)
+      ENDIF
+      END
+
+
+      FUNCTION ATT_LEN(J,VID)
+      use tests, ONLY: GATT_LEN, ATTLEN
+      IMPLICIT  NONE
+      INTEGER J
+      INTEGER VID
+      INTEGER ATT_LEN
+      IF (VID .LT. 1) THEN
+          ATT_LEN = GATT_LEN(J)
+      ELSE
+          ATT_LEN = ATTLEN(J,VID)
+      ENDIF
+      END
+
+
+!
+! Return the minimum value of an internal type.
+!
+        function internal_min(type)
+        use tests, ONLY: RK8, NFT_CHAR, NFT_INT1, NFT_INT2, NFT_INT,    &
+     &                   NFT_REAL, NFT_DOUBLE
+        implicit        none
+        integer         type
+        real(RK8) internal_min
+        doubleprecision min_schar
+        doubleprecision min_short
+        doubleprecision min_int
+        doubleprecision min_long
+        doubleprecision max_float
+        doubleprecision max_double
+        if (type .eq. NFT_CHAR) then
+            internal_min = 0
+        else if (type .eq. NFT_INT1) then
+#if NF_INT1_IS_C_SIGNED_CHAR
+            internal_min = min_schar()
+#endif
+#if NF_INT1_IS_C_SHORT
+            internal_min = min_short()
+#endif
+#if NF_INT1_IS_C_INT
+            internal_min = min_int()
+#endif
+#if NF_INT1_IS_C_LONG
+            internal_min = min_long()
+#endif
+        else if (type .eq. NFT_INT2) then
+#if NF_INT2_IS_C_SHORT
+            internal_min = min_short()
+#endif            
+#if NF_INT2_IS_C_INT
+            internal_min = min_int()
+#endif            
+#if NF_INT2_IS_C_LONG
+            internal_min = min_long()
+#endif
+        else if (type .eq. NFT_INT) then
+#if NF_INT_IS_C_INT
+            internal_min = min_int()
+#endif            
+#if NF_INT_IS_C_LONG
+            internal_min = min_long()
+#endif
+        else if (type .eq. NFT_REAL) then
+#if NF_REAL_IS_C_FLOAT
+            internal_min = -max_float()
+#endif
+#if NF_REAL_IS_C_DOUBLE
+            internal_min = -max_double()
+#endif
+        else if (type .eq. NFT_DOUBLE) then
+#if NF_DOUBLEPRECISION_IS_C_DOUBLE
+            internal_min = -max_double()
+#endif
+#if NF_DOUBLEPRECISION_IS_C_FLOAT
+            internal_min = -max_float()
+#endif
+        else
+            stop 2
+        end if
+        end
+
+
+!
+! Return the maximum value of an internal type.
+!
+        function internal_max(type)
+        use tests, ONLY: RK8, NFT_CHAR, NFT_INT1, NFT_INT2, NFT_INT,    &
+     &                   NFT_REAL, NFT_DOUBLE
+        implicit        none
+        integer         type
+        doubleprecision max_schar
+        doubleprecision max_short
+        doubleprecision max_int
+        doubleprecision max_long
+        doubleprecision max_float
+        doubleprecision max_double
+        real(RK8) internal_max
+        if (type .eq. NFT_CHAR) then
+            internal_max = 255
+        else if (type .eq. NFT_INT1) then
+#if NF_INT1_IS_C_SIGNED_CHAR
+            internal_max = max_schar()
+#endif
+#if NF_INT1_IS_C_SHORT
+            internal_max = max_short()
+#endif
+#if NF_INT1_IS_C_INT
+            internal_max = max_int()
+#endif
+#if NF_INT1_IS_C_LONG
+            internal_max = max_long()
+#endif
+        else if (type .eq. NFT_INT2) then
+#if NF_INT2_IS_C_SHORT
+            internal_max = max_short()
+#endif
+#if NF_INT2_IS_C_INT
+            internal_max = max_int()
+#endif
+#if NF_INT2_IS_C_LONG
+            internal_max = max_long()
+#endif
+        else if (type .eq. NFT_INT) then
+#if NF_INT_IS_C_INT
+            internal_max = max_int()
+#endif
+#if NF_INT_IS_C_LONG
+            internal_max = max_long()
+#endif
+        else if (type .eq. NFT_REAL) then
+#if NF_REAL_IS_C_FLOAT
+            internal_max = max_float()
+#endif
+#if NF_REAL_IS_C_DOUBLE
+            internal_max = max_double()
+#endif
+        else if (type .eq. NFT_DOUBLE) then
+#if NF_DOUBLEPRECISION_IS_C_DOUBLE
+            internal_max = max_double()
+#endif            
+#if NF_DOUBLEPRECISION_IS_C_FLOAT
+            internal_max = max_float()
+#endif
+        else
+            stop 2
+        end if
+        end
+
+
+!
+! Return the minimum value of an external type.
+!
+        function external_min(type)
+        use tests, ONLY: RK8, NF_CHAR, NF_SHORT, NF_INT, NF_FLOAT,      &
+     &                   NF_DOUBLE, X_BYTE_MIN, X_CHAR_MIN, X_SHORT_MIN,&
+     &                   X_INT_MIN, X_FLOAT_MIN, X_DOUBLE_MIN , NF_BYTE
+        implicit        none
+        integer         type
+        real(rk8) external_min
+
+        if (type .eq. NF_BYTE) then
+            external_min = X_BYTE_MIN
+        else if (type .eq. NF_CHAR) then
+            external_min = X_CHAR_MIN
+        else if (type .eq. NF_SHORT) then
+            external_min = X_SHORT_MIN
+        else if (type .eq. NF_INT) then
+            external_min = X_INT_MIN
+        else if (type .eq. NF_FLOAT) then
+            external_min = X_FLOAT_MIN
+        else if (type .eq. NF_DOUBLE) then
+            external_min = X_DOUBLE_MIN
+        else
+            stop 2
+        end if
+        end
+
+
+!
+! Return the maximum value of an internal type.
+!
+        function external_max(type)
+        use tests, ONLY: RK8, NF_CHAR, NF_SHORT, NF_INT, NF_FLOAT,      &
+     &                   NF_DOUBLE, X_BYTE_MAX, X_CHAR_MAX, X_SHORT_MAX,&
+     &                   X_INT_MAX, X_FLOAT_MAX, X_DOUBLE_MAX, NF_BYTE
+        implicit        none
+        integer         type
+        real(RK8) external_max
+        if (type .eq. NF_BYTE) then
+            external_max = X_BYTE_MAX
+        else if (type .eq. NF_CHAR) then
+            external_max = X_CHAR_MAX
+        else if (type .eq. NF_SHORT) then
+            external_max = X_SHORT_MAX
+        else if (type .eq. NF_INT) then
+            external_max = X_INT_MAX
+        else if (type .eq. NF_FLOAT) then
+            external_max = X_FLOAT_MAX
+        else if (type .eq. NF_DOUBLE) then
+            external_max = X_DOUBLE_MAX
+        else
+            stop 2
+        end if
+        end
+
+
+!
+! Indicate whether or not a value lies in the range of an internal type.
+!
+        function in_internal_range(itype, value)
+        use tests, ONLY: RK8
+        implicit        none
+        integer         itype
+        doubleprecision value
+        logical in_internal_range
+        real(rk8), external :: internal_min, internal_max
+
+        in_internal_range = value .ge. internal_min(itype) .and.
+     +                      value .le. internal_max(itype)
+        end
+
+
+!
+! Return the length of a character variable minus any trailing blanks.
+!  not needed for Fortran 90/95/2003 which have an intrinsic LEN_TRIM
+!
+!        function len_trim(string)
+!        use tests
+!        implicit        none
+!        character*(*)   string
+
+!        do 1, len_trim = len(string), 1, -1
+!            if (string(len_trim:len_trim) .ne. ' ')
+!     +          goto 2
+!1       continue
+
+!2       return
+!        end
diff --git a/nf_test/CMakeLists.txt b/nf_test/CMakeLists.txt
new file mode 100644
index 0000000..2655604
--- /dev/null
+++ b/nf_test/CMakeLists.txt
@@ -0,0 +1,199 @@
+CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
+
+SET(CMAKE_VERBOSE_MAKEFILE ON)
+SET(CMAKE_BUILD_TYPE "RelWithDebInfo")
+SET(CMAKE_INCLUDE_CURRENT_DIR ON)
+
+
+# Process these files with m4.
+SET(m4_SOURCES test_get test_put)
+foreach (f ${m4_SOURCES})
+		   GEN_m4(${f})
+endforeach(f)
+
+
+IF (BUILD_F03)
+  SET(nf_test_SOURCES
+    f03lib_f_interfaces.f90 test_get.F test_put.F nf_error.F nf_test.F
+    test_read.F test_write.F util.F f03lib.c tests.inc)
+ELSE()
+  SET(nf_test_SOURCES
+    test_get.F test_put.F nf_error.F nf_test.F
+    test_read.F test_write.F util.F fortlib.c tests.inc
+    )
+ENDIF()
+
+SET(TESTS nf_test)
+IF (BUILD_V2)
+  SET(check_PROGRAMS tst_f77_v2)
+  SET(tst_f77_v2_SOURCES tst_f77_v2.F)
+  SET(TESTS ${TESTS} tst_f77_v2)
+ENDIF(BUILD_V2)
+
+# Is the user building netCDF-4?
+if (USE_NETCDF4)
+  # Add these netCDF-4 test programs.
+  SET(nc4_check_PROGRAMS
+    ftst_vars ftst_vars2 ftst_vars3 ftst_vars4 ftst_vars5
+    ftst_vars6 ftst_types ftst_types2 ftst_types3 ftst_groups ftst_path ftst_rengrps)
+  SET(check_PROGRAMS ${check_PROGRAMS} ${nc4_check_PROGRAMS})
+  SET(TESTS ${TESTS} ${nc4_check_PROGRAMS})
+
+  if (BUILD_F03)
+    SET(ftst_types_SOURCES ftst_types.F f03lib_f_interfaces.f90 f03lib.c handle_err.F)
+    SET(ftst_types2_SOURCES ftst_types2.F f03lib_f_interfaces.f90 f03lib.c handle_err.F)
+    SET(ftst_types3_SOURCES ftst_types3.F f03lib_f_interfaces.f90 f03lib.c handle_err.F)
+    SET(ftst_vars_SOURCES ftst_vars.F f03lib_f_interfaces.f90 f03lib.c handle_err.F)
+    SET(ftst_vars2_SOURCES ftst_vars2.F f03lib_f_interfaces.f90 f03lib.c handle_err.F)
+    SET(ftst_vars3_SOURCES ftst_vars3.F f03lib_f_interfaces.f90 f03lib.c handle_err.F)
+    SET(ftst_vars4_SOURCES ftst_vars4.F f03lib_f_interfaces.f90 f03lib.c handle_err.F)
+    SET(ftst_vars5_SOURCES ftst_vars5.F f03lib_f_interfaces.f90 f03lib.c handle_err.F)
+    SET(ftst_vars6_SOURCES ftst_vars6.F f03lib_f_interfaces.f90 f03lib.c handle_err.F)
+    SET(ftst_groups_SOURCES ftst_groups.F f03lib_f_interfaces.f90 f03lib.c handle_err.F)
+    SET(ftst_path_SOURCES ftst_path.F f03lib_f_interfaces.f90 f03lib.c handle_err.F)
+    SET(ftst_rengrps_SOURCES ftst_rengrps.F f03lib_f_interfaces.f90 f03lib.c handle_err.F)
+  else()
+    SET(ftst_types_SOURCES ftst_types.F fortlib.c handle_err.F)
+    SET(ftst_types2_SOURCES ftst_types2.F fortlib.c handle_err.F)
+    SET(ftst_types3_SOURCES ftst_types3.F fortlib.c handle_err.F)
+    SET(ftst_vars_SOURCES ftst_vars.F fortlib.c handle_err.F)
+    SET(ftst_vars2_SOURCES ftst_vars2.F fortlib.c handle_err.F)
+    SET(ftst_vars3_SOURCES ftst_vars3.F fortlib.c handle_err.F)
+    SET(ftst_vars4_SOURCES ftst_vars4.F fortlib.c handle_err.F)
+    SET(ftst_vars5_SOURCES ftst_vars5.F fortlib.c handle_err.F)
+    SET(ftst_vars6_SOURCES ftst_vars6.F fortlib.c handle_err.F)
+    SET(ftst_groups_SOURCES ftst_groups.F fortlib.c handle_err.F)
+    SET(ftst_path_SOURCES ftst_path.F fortlib.c handle_err.F)
+    SET(ftst_rengrps_SOURCES ftst_rengrps.F fortlib.c handle_err.F)
+  endif(BUILD_F03)
+  # Add these netCDF-4 f90 test programs.
+  SET(nc4_f90_PROGRAMS
+    f90tst_vars tst_types tst_types2 f90tst_vars_vlen
+    tst_f90_nc4 f90tst_grps f90tst_fill f90tst_fill2 f90tst_vars3
+    f90tst_vars4 f90tst_vars2)
+  SET(check_PROGRAMS ${check_PROGRAMS} ${nc4_f90_PROGRAMS})
+  SET(TESTS ${TESTS} ${nc4_f90_PROGRAMS})
+  SET(f90tst_vars_SOURCES f90tst_vars.f90)
+  SET(tst_types_SOURCES tst_types.f90)
+  SET(tst_types2_SOURCES tst_types2.f90)
+  SET(tst_f90_nc4_SOURCES tst_f90_nc4.f90)
+  SET(f90tst_vars_vlen_SOURCES f90tst_vars_vlen.f90)
+  SET(f90tst_grps_SOURCES f90tst_grps.f90)
+  SET(f90tst_fill_SOURCES f90tst_fill.f90)
+  SET(f90tst_fill2_SOURCES f90tst_fill2.f90)
+  SET(f90tst_vars2_SOURCES f90tst_vars2.f90)
+  SET(f90tst_vars3_SOURCES f90tst_vars3.f90)
+  SET(f90tst_vars4_SOURCES f90tst_vars4.f90)
+
+  # This is a netCDF-4 V2 test program.
+  IF (BUILD_V2)
+    SET(nc4_v2_PROGRAMS ftst_v2)
+    SET(check_PROGRAMS ${check_PROGRAMS} ${nc4_v2_PROGRAMS})
+    SET(TESTS ${TESTS} ${nc4_v2_PROGRAMS})
+    SET(ftst_v2_SOURCES ftst_v2.F)
+  ENDIF (BUILD_V2)
+
+  # This is the netCDF-4 F90 large file test.
+  IF (LARGE_FILE_TESTS)
+    SET(nc4_largefile_PROGRAMS tst_flarge)
+    SET(check_PROGRAMS ${check_PROGRAMS} ${nc4_largefile_PROGRAMS})
+    SET(TESTS ${TESTS} ${nc4_largefile_PROGRAMS})
+    SET(tst_flarge_SOURCES tst_flarge.f90)
+  ENDIF(LARGE_FILE_TESTS)
+
+  # This is an f90 benchmark.
+  IF(BUILD_BENCHMARKS)
+    SET(nc4_io_PROGRAMS tst_io)
+    SET(check_PROGRAMS ${check_PROGRAMS} ${nc4_io_PROGRAMS})
+    SET(TESTS ${TESTS} ${nc4_io_PROGRAMS})
+    SET(tst_io_SOURCES tst_io.f90)
+  ENDIF(BUILD_BENCHMARKS)
+
+  # Test parallel I/O.
+  IF (TEST_PARALLEL)
+    SET(check_PROGRAMS ${check_PROGRAMS} f90tst_parallel f90tst_parallel2 f90tst_parallel3
+      f90tst_nc4_par)
+
+    build_bin_test(f90tst_parallel ".f90")
+    build_bin_test(f90tst_parallel2 ".f90")
+    build_bin_test(f90tst_parallel3 ".f90")
+    build_bin_test(f90tst_nc4_par ".f90")
+
+    #SET(f90tst_parallel_fill_SOURCES f90tst_parallel_fill.f90)
+
+  ENDIF (TEST_PARALLEL)
+
+  # Test parallel I/O for F77.
+  IF (TEST_PARALLEL)
+    SET(check_PROGRAMS ${check_PROGRAMS} ftst_parallel ftst_parallel_nasa)
+    SET(SCRIPT_TESTS ${SCRIPT_TESTS} run_f77_par_test)
+
+    # Add executables for f77_par_tst
+    build_bin_test(ftst_parallel ".F")
+    build_bin_test(ftst_parallel_nasa ".F")
+
+  ENDIF (TEST_PARALLEL)
+
+endif(USE_NETCDF4)
+
+# This is the fortran v2 test. It depends on the utilities being built
+# to generate its input file.
+IF (BUILD_V2)
+  SET(check_PROGRAMS ${check_PROGRAMS} ftest)
+  SET(TESTS ${TESTS} ftest)
+  IF (BUILD_F03)
+    SET(ftest_SOURCES ftest.F f03lib.c)
+  ELSE()
+    SET(ftest_SOURCES ftest.F fortlib.c)
+  ENDIF(BUILD_F03)
+ENDIF(BUILD_V2)
+
+SET(check_PROGRAMS ${check_PROGRAMS} tst_f90)
+SET(TESTS ${TESTS} tst_f90)
+SET(tst_f90_SOURCES tst_f90.f90)
+
+FIND_LIBRARY(NETCDF_C_LIBRARY NAMES netcdf libnetcdf)
+FIND_PATH(NETCDF_C_INCLUDE_DIR netcdf.h)
+IF(NOT NETCDF_C_LIBRARY)
+  MESSAGE(FATAL_ERROR "Cannot find netCDF C library, needed for netCDF Fortran tests.")
+ENDIF()
+
+# Need a copy of ref_fills.nc for ftest
+execute_process(COMMAND cp ${CMAKE_CURRENT_SOURCE_DIR}/ref_fills.nc
+  ${CMAKE_CURRENT_BINARY_DIR}/fills.nc)
+
+INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/fortran ${CMAKE_SOURCE_DIR}/libsrc
+  ${CMAKE_SOURCE_DIR} ${CMAKE_CPP_FLAGS}
+  ${NETCDF_C_INCLUDE_DIR} ${NC4F_BINARY_DIR}/fortran
+  ${NC4F_BINARY_DIR}/libsrc)
+LINK_DIRECTORIES(${CMAKE_SOURCE_DIR}/fortran ${CMAKE_SOURCE_DIR}/libsrc
+  ${NC4F_BINARY_DIR}/fortran)
+
+# Create pre-compiled tests.
+FOREACH(t ${TESTS})
+  ADD_EXECUTABLE(${t} ${${t}_SOURCES})
+  TARGET_LINK_LIBRARIES(${t} netcdff)
+  ADD_TEST(${t} ${t})
+ENDFOREACH()
+
+# Copy test scripts in to current directory.
+FILE(GLOB COPY_FILES ${CMAKE_CURRENT_SOURCE_DIR}/*.sh)
+FILE(COPY ${COPY_FILES}
+	  DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/
+	  FILE_PERMISSIONS OWNER_WRITE OWNER_READ OWNER_EXECUTE)
+
+# Add script-based tests.
+FOREACH(t ${SCRIPT_TESTS})
+  add_sh_test(nf_test ${t})
+ENDFOREACH()
+
+
+# test_get.F and test_put.f need to be distributed, so that the user
+# need not have m4. fills.nc is used by test program ftest.
+SET (EXTRA_DIST test_get.F test_put.F fills.cdl create_fills.sh
+  run_f90_par_test.sh run_f77_par_test.sh ref_fills.nc)
+
+# Cleaning up files created during the process.
+SET (CLEANFILES scratch.nc test.nc copy.nc fills.nc tst_*.nc ftst_*.nc f90tst_*.nc)
+
+SET (MAINTAINERCLEANFILES test_get.F test_put.F)
diff --git a/nf_test/Makefile.am b/nf_test/Makefile.am
new file mode 100644
index 0000000..87071bc
--- /dev/null
+++ b/nf_test/Makefile.am
@@ -0,0 +1,179 @@
+# This is a automake file, part of Unidata's netCDF package.
+# Copyright 2005-2011, see the COPYRIGHT file for more information.
+
+# This file builds and runs the f77 and f90 tests.
+
+AM_FCFLAGS = -I$(top_srcdir)/fortran ${AM_CPPFLAGS}
+
+# Some fortran compilers think your files should not have an .f90
+# extension! The value of FCFLAGS_f90 is set in the configure script,
+# based on the fortran compiler.
+AM_FCFLAGS += $(FCFLAGS_f90) @MOD_FLAG@$(top_builddir)/fortran
+
+AM_FFLAGS = ${AM_FCFLAGS}
+
+# All tests need to link to fortran and C libraries.
+LDADD = ${top_builddir}/fortran/libnetcdff.la
+
+# nf_test is the main test program.
+check_PROGRAMS = nf_test
+TESTS = nf_test
+
+if BUILD_F03
+nf_test_SOURCES = f03lib_f_interfaces.f90 test_get.m4 test_put.m4 nf_error.F nf_test.F	\
+                  test_read.F test_write.F util.F f03lib.c tests.inc
+else
+nf_test_SOURCES = test_get.m4 test_put.m4 nf_error.F nf_test.F	\
+                  test_read.F test_write.F util.F fortlib.c tests.inc
+endif
+
+# The create_fills shell creates the file fills.nc, needed by later
+# tests.
+TESTS += create_fills.sh
+# Need access to top_srcdir
+TESTS_ENVIRONMENT=TOPSRCDIR=${abs_top_srcdir}
+
+# Did the user build the V2 F77 API? If so, run this test.
+if BUILD_V2
+check_PROGRAMS += tst_f77_v2
+tst_f77_v2_SOURCES = tst_f77_v2.F
+TESTS += tst_f77_v2
+endif # BUILD_V2
+
+# Is the user building netCDF-4?
+if USE_NETCDF4
+
+# Add these netCDF-4 test programs.
+check_PROGRAMS += ftst_vars ftst_vars2 ftst_vars3 ftst_vars4 ftst_vars5	\
+                  ftst_vars6 ftst_types ftst_types2 ftst_types3 ftst_groups \
+                  ftst_path ftst_rengrps
+TESTS += ftst_vars ftst_vars2 ftst_vars3 ftst_vars4 ftst_vars5	\
+         ftst_vars6 ftst_types ftst_types2 ftst_types3 ftst_groups \
+         ftst_path ftst_rengrps
+
+if BUILD_F03
+ftst_types_SOURCES = ftst_types.F f03lib_f_interfaces.f90 f03lib.c handle_err.F
+ftst_types2_SOURCES = ftst_types2.F f03lib_f_interfaces.f90 f03lib.c handle_err.F
+ftst_types3_SOURCES = ftst_types3.F f03lib_f_interfaces.f90 f03lib.c handle_err.F
+ftst_vars_SOURCES = ftst_vars.F f03lib_f_interfaces.f90 f03lib.c handle_err.F
+ftst_vars2_SOURCES = ftst_vars2.F f03lib_f_interfaces.f90 f03lib.c handle_err.F
+ftst_vars3_SOURCES = ftst_vars3.F f03lib_f_interfaces.f90 f03lib.c handle_err.F
+ftst_vars4_SOURCES = ftst_vars4.F f03lib_f_interfaces.f90 f03lib.c handle_err.F
+ftst_vars5_SOURCES = ftst_vars5.F f03lib_f_interfaces.f90 f03lib.c handle_err.F
+ftst_vars6_SOURCES = ftst_vars6.F f03lib_f_interfaces.f90 f03lib.c handle_err.F
+ftst_groups_SOURCES = ftst_groups.F f03lib_f_interfaces.f90 f03lib.c handle_err.F
+ftst_path_SOURCES = ftst_path.F f03lib_f_interfaces.f90 f03lib.c handle_err.F
+ftst_rengrps_SOURCES = ftst_rengrps.F f03lib_f_interfaces.f90 f03lib.c handle_err.F
+else !BUILD_F03
+ftst_types_SOURCES = ftst_types.F fortlib.c handle_err.F
+ftst_types2_SOURCES = ftst_types2.F fortlib.c handle_err.F
+ftst_types3_SOURCES = ftst_types3.F fortlib.c handle_err.F
+ftst_vars_SOURCES = ftst_vars.F fortlib.c handle_err.F
+ftst_vars2_SOURCES = ftst_vars2.F fortlib.c handle_err.F
+ftst_vars3_SOURCES = ftst_vars3.F fortlib.c handle_err.F
+ftst_vars4_SOURCES = ftst_vars4.F fortlib.c handle_err.F
+ftst_vars5_SOURCES = ftst_vars5.F fortlib.c handle_err.F
+ftst_vars6_SOURCES = ftst_vars6.F fortlib.c handle_err.F
+ftst_groups_SOURCES = ftst_groups.F fortlib.c handle_err.F
+ftst_path_SOURCES = ftst_path.F fortlib.c handle_err.F
+ftst_rengrps_SOURCES = ftst_rengrps.F fortlib.c handle_err.F
+endif !BUILD_F03
+
+# Add these netCDF-4 f90 test programs.
+check_PROGRAMS += f90tst_vars tst_types tst_types2 f90tst_vars_vlen	\
+                  tst_f90_nc4 f90tst_grps f90tst_fill f90tst_fill2 f90tst_vars3		\
+                  f90tst_vars4 f90tst_vars2 f90tst_path f90tst_rengrps
+
+TESTS += f90tst_vars tst_types tst_types2 f90tst_vars_vlen tst_f90_nc4	\
+         f90tst_grps f90tst_fill f90tst_fill2 f90tst_vars3 f90tst_vars4		\
+         f90tst_vars2 f90tst_path f90tst_rengrps
+
+f90tst_vars_SOURCES = f90tst_vars.f90
+tst_types_SOURCES = tst_types.f90
+tst_types2_SOURCES = tst_types2.f90
+tst_f90_nc4_SOURCES = tst_f90_nc4.f90
+f90tst_vars_vlen_SOURCES = f90tst_vars_vlen.f90
+f90tst_grps_SOURCES = f90tst_grps.f90
+f90tst_path_SOURCES = f90tst_path.f90
+f90tst_rengrps_SOURCES = f90tst_rengrps.f90
+f90tst_fill_SOURCES = f90tst_fill.f90
+f90tst_fill2_SOURCES = f90tst_fill2.f90
+f90tst_vars2_SOURCES = f90tst_vars2.f90
+f90tst_vars3_SOURCES = f90tst_vars3.f90
+f90tst_vars4_SOURCES = f90tst_vars4.f90
+
+# This is a netCDF-4 V2 test program.
+if BUILD_V2
+check_PROGRAMS += ftst_v2
+TESTS += ftst_v2
+ftst_v2_SOURCES = ftst_v2.F
+endif # BUILD_V2
+
+# This is the netCDF-4 F90 large file test.
+if LARGE_FILE_TESTS
+check_PROGRAMS += tst_flarge
+TESTS += tst_flarge
+tst_flarge_SOURCES = tst_flarge.f90
+endif # LARGE_FILE_TESTS
+
+# This is an f90 benchmark.
+if BUILD_BENCHMARKS
+check_PROGRAMS += tst_io
+TESTS += tst_io
+tst_io_SOURCES = tst_io.f90
+endif #BUILD_BENCHMARKS
+
+# Test parallel I/O.
+if TEST_PARALLEL
+check_PROGRAMS += f90tst_parallel f90tst_parallel2 f90tst_parallel3	\
+                  f90tst_nc4_par
+#f90tst_parallel_fill
+TESTS += run_f90_par_test.sh
+
+f90tst_parallel_SOURCES = f90tst_parallel.f90
+f90tst_parallel2_SOURCES = f90tst_parallel2.f90
+f90tst_parallel3_SOURCES = f90tst_parallel3.f90
+f90tst_nc4_par_SOURCES = f90tst_nc4_par.f90
+#f90tst_parallel_fill_SOURCES = f90tst_parallel_fill.f90
+endif # TEST_PARALLEL
+
+# Test parallel I/O for F77.
+if TEST_PARALLEL
+check_PROGRAMS += ftst_parallel ftst_parallel_nasa
+TESTS += run_f77_par_test.sh
+ftst_parallel_SOURCES = ftst_parallel.F
+ftst_parallel_nasa_SOURCES = ftst_parallel_nasa.F
+endif # TEST_PARALLEL
+
+endif #USE_NETCDF4
+
+# This is the fortran v2 test. It depends on the utilities being built
+# to generate it's input file.
+if BUILD_V2
+check_PROGRAMS += ftest
+TESTS += ftest
+if BUILD_F03
+ftest_SOURCES = ftest.F f03lib.c
+else
+ftest_SOURCES = ftest.F fortlib.c
+endif
+endif # BUILD_V2
+
+check_PROGRAMS += tst_f90
+TESTS += tst_f90
+tst_f90_SOURCES = tst_f90.f90
+
+# Tell make how to turn .m4 files into .F files.
+.m4.F:
+	m4 $(M4FLAGS) $< >$@
+
+# test_get.F and test_put.f need to be distributed, so that the user
+# need not have m4. fills.nc is used by test program ftest.
+EXTRA_DIST = test_get.F test_put.F fills.cdl create_fills.sh	\
+             run_f90_par_test.sh run_f77_par_test.sh ref_fills.nc \
+			CMakeLists.txt
+
+# Cleaning up files created during the process.
+CLEANFILES = scratch.nc test.nc copy.nc fills.nc tst_*.nc ftst_*.nc f90tst_*.nc temp.tmp
+
+MAINTAINERCLEANFILES = test_get.F test_put.F
diff --git a/nf_test/Makefile.in b/nf_test/Makefile.in
new file mode 100644
index 0000000..97d4da7
--- /dev/null
+++ b/nf_test/Makefile.in
@@ -0,0 +1,1948 @@
+# Makefile.in generated by automake 1.14.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2013 Free Software Foundation, Inc.
+
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+ at SET_MAKE@
+
+# This is a automake file, part of Unidata's netCDF package.
+# Copyright 2005-2011, see the COPYRIGHT file for more information.
+
+# This file builds and runs the f77 and f90 tests.
+VPATH = @srcdir@
+am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
+am__make_running_with_option = \
+  case $${target_option-} in \
+      ?) ;; \
+      *) echo "am__make_running_with_option: internal error: invalid" \
+              "target option '$${target_option-}' specified" >&2; \
+         exit 1;; \
+  esac; \
+  has_opt=no; \
+  sane_makeflags=$$MAKEFLAGS; \
+  if $(am__is_gnu_make); then \
+    sane_makeflags=$$MFLAGS; \
+  else \
+    case $$MAKEFLAGS in \
+      *\\[\ \	]*) \
+        bs=\\; \
+        sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+          | sed "s/$$bs$$bs[$$bs $$bs	]*//g"`;; \
+    esac; \
+  fi; \
+  skip_next=no; \
+  strip_trailopt () \
+  { \
+    flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+  }; \
+  for flg in $$sane_makeflags; do \
+    test $$skip_next = yes && { skip_next=no; continue; }; \
+    case $$flg in \
+      *=*|--*) continue;; \
+        -*I) strip_trailopt 'I'; skip_next=yes;; \
+      -*I?*) strip_trailopt 'I';; \
+        -*O) strip_trailopt 'O'; skip_next=yes;; \
+      -*O?*) strip_trailopt 'O';; \
+        -*l) strip_trailopt 'l'; skip_next=yes;; \
+      -*l?*) strip_trailopt 'l';; \
+      -[dEDm]) skip_next=yes;; \
+      -[JT]) skip_next=yes;; \
+    esac; \
+    case $$flg in \
+      *$$target_option*) has_opt=yes; break;; \
+    esac; \
+  done; \
+  test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+target_triplet = @target@
+check_PROGRAMS = nf_test$(EXEEXT) $(am__EXEEXT_1) $(am__EXEEXT_2) \
+	$(am__EXEEXT_3) $(am__EXEEXT_4) $(am__EXEEXT_5) \
+	$(am__EXEEXT_6) $(am__EXEEXT_7) tst_f90$(EXEEXT)
+TESTS = nf_test$(EXEEXT) create_fills.sh $(am__EXEEXT_1) \
+	$(am__EXEEXT_2) $(am__EXEEXT_3) $(am__EXEEXT_4) \
+	$(am__EXEEXT_5) $(am__append_12) $(am__EXEEXT_7) \
+	tst_f90$(EXEEXT)
+
+# Did the user build the V2 F77 API? If so, run this test.
+ at BUILD_V2_TRUE@am__append_1 = tst_f77_v2
+ at BUILD_V2_TRUE@am__append_2 = tst_f77_v2
+
+# Is the user building netCDF-4?
+
+# Add these netCDF-4 test programs.
+
+# Add these netCDF-4 f90 test programs.
+ at USE_NETCDF4_TRUE@am__append_3 = ftst_vars ftst_vars2 ftst_vars3 \
+ at USE_NETCDF4_TRUE@	ftst_vars4 ftst_vars5 ftst_vars6 ftst_types \
+ at USE_NETCDF4_TRUE@	ftst_types2 ftst_types3 ftst_groups \
+ at USE_NETCDF4_TRUE@	ftst_path ftst_rengrps f90tst_vars tst_types \
+ at USE_NETCDF4_TRUE@	tst_types2 f90tst_vars_vlen tst_f90_nc4 \
+ at USE_NETCDF4_TRUE@	f90tst_grps f90tst_fill f90tst_fill2 \
+ at USE_NETCDF4_TRUE@	f90tst_vars3 f90tst_vars4 f90tst_vars2 \
+ at USE_NETCDF4_TRUE@	f90tst_path f90tst_rengrps
+ at USE_NETCDF4_TRUE@am__append_4 = ftst_vars ftst_vars2 ftst_vars3 \
+ at USE_NETCDF4_TRUE@	ftst_vars4 ftst_vars5 ftst_vars6 ftst_types \
+ at USE_NETCDF4_TRUE@	ftst_types2 ftst_types3 ftst_groups \
+ at USE_NETCDF4_TRUE@	ftst_path ftst_rengrps f90tst_vars tst_types \
+ at USE_NETCDF4_TRUE@	tst_types2 f90tst_vars_vlen tst_f90_nc4 \
+ at USE_NETCDF4_TRUE@	f90tst_grps f90tst_fill f90tst_fill2 \
+ at USE_NETCDF4_TRUE@	f90tst_vars3 f90tst_vars4 f90tst_vars2 \
+ at USE_NETCDF4_TRUE@	f90tst_path f90tst_rengrps
+
+# This is a netCDF-4 V2 test program.
+ at BUILD_V2_TRUE@@USE_NETCDF4_TRUE at am__append_5 = ftst_v2
+ at BUILD_V2_TRUE@@USE_NETCDF4_TRUE at am__append_6 = ftst_v2
+
+# This is the netCDF-4 F90 large file test.
+ at LARGE_FILE_TESTS_TRUE@@USE_NETCDF4_TRUE at am__append_7 = tst_flarge
+ at LARGE_FILE_TESTS_TRUE@@USE_NETCDF4_TRUE at am__append_8 = tst_flarge
+
+# This is an f90 benchmark.
+ at BUILD_BENCHMARKS_TRUE@@USE_NETCDF4_TRUE at am__append_9 = tst_io
+ at BUILD_BENCHMARKS_TRUE@@USE_NETCDF4_TRUE at am__append_10 = tst_io
+
+# Test parallel I/O.
+#f90tst_parallel_fill_SOURCES = f90tst_parallel_fill.f90
+
+# Test parallel I/O for F77.
+ at TEST_PARALLEL_TRUE@@USE_NETCDF4_TRUE at am__append_11 = f90tst_parallel \
+ at TEST_PARALLEL_TRUE@@USE_NETCDF4_TRUE@	f90tst_parallel2 \
+ at TEST_PARALLEL_TRUE@@USE_NETCDF4_TRUE@	f90tst_parallel3 \
+ at TEST_PARALLEL_TRUE@@USE_NETCDF4_TRUE@	f90tst_nc4_par \
+ at TEST_PARALLEL_TRUE@@USE_NETCDF4_TRUE@	ftst_parallel \
+ at TEST_PARALLEL_TRUE@@USE_NETCDF4_TRUE@	ftst_parallel_nasa
+#f90tst_parallel_fill
+ at TEST_PARALLEL_TRUE@@USE_NETCDF4_TRUE at am__append_12 =  \
+ at TEST_PARALLEL_TRUE@@USE_NETCDF4_TRUE@	run_f90_par_test.sh \
+ at TEST_PARALLEL_TRUE@@USE_NETCDF4_TRUE@	run_f77_par_test.sh
+
+# This is the fortran v2 test. It depends on the utilities being built
+# to generate it's input file.
+ at BUILD_V2_TRUE@am__append_13 = ftest
+ at BUILD_V2_TRUE@am__append_14 = ftest
+subdir = nf_test
+DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \
+	$(top_srcdir)/depcomp $(top_srcdir)/test-driver
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \
+	$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+	$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+	$(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/config.h \
+	$(top_builddir)/libsrc/nfconfig1.inc
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+ at BUILD_V2_TRUE@am__EXEEXT_1 = tst_f77_v2$(EXEEXT)
+ at USE_NETCDF4_TRUE@am__EXEEXT_2 = ftst_vars$(EXEEXT) \
+ at USE_NETCDF4_TRUE@	ftst_vars2$(EXEEXT) ftst_vars3$(EXEEXT) \
+ at USE_NETCDF4_TRUE@	ftst_vars4$(EXEEXT) ftst_vars5$(EXEEXT) \
+ at USE_NETCDF4_TRUE@	ftst_vars6$(EXEEXT) ftst_types$(EXEEXT) \
+ at USE_NETCDF4_TRUE@	ftst_types2$(EXEEXT) ftst_types3$(EXEEXT) \
+ at USE_NETCDF4_TRUE@	ftst_groups$(EXEEXT) ftst_path$(EXEEXT) \
+ at USE_NETCDF4_TRUE@	ftst_rengrps$(EXEEXT) f90tst_vars$(EXEEXT) \
+ at USE_NETCDF4_TRUE@	tst_types$(EXEEXT) tst_types2$(EXEEXT) \
+ at USE_NETCDF4_TRUE@	f90tst_vars_vlen$(EXEEXT) \
+ at USE_NETCDF4_TRUE@	tst_f90_nc4$(EXEEXT) f90tst_grps$(EXEEXT) \
+ at USE_NETCDF4_TRUE@	f90tst_fill$(EXEEXT) f90tst_fill2$(EXEEXT) \
+ at USE_NETCDF4_TRUE@	f90tst_vars3$(EXEEXT) f90tst_vars4$(EXEEXT) \
+ at USE_NETCDF4_TRUE@	f90tst_vars2$(EXEEXT) f90tst_path$(EXEEXT) \
+ at USE_NETCDF4_TRUE@	f90tst_rengrps$(EXEEXT)
+ at BUILD_V2_TRUE@@USE_NETCDF4_TRUE at am__EXEEXT_3 = ftst_v2$(EXEEXT)
+ at LARGE_FILE_TESTS_TRUE@@USE_NETCDF4_TRUE at am__EXEEXT_4 =  \
+ at LARGE_FILE_TESTS_TRUE@@USE_NETCDF4_TRUE@	tst_flarge$(EXEEXT)
+ at BUILD_BENCHMARKS_TRUE@@USE_NETCDF4_TRUE at am__EXEEXT_5 =  \
+ at BUILD_BENCHMARKS_TRUE@@USE_NETCDF4_TRUE@	tst_io$(EXEEXT)
+ at TEST_PARALLEL_TRUE@@USE_NETCDF4_TRUE at am__EXEEXT_6 = f90tst_parallel$(EXEEXT) \
+ at TEST_PARALLEL_TRUE@@USE_NETCDF4_TRUE@	f90tst_parallel2$(EXEEXT) \
+ at TEST_PARALLEL_TRUE@@USE_NETCDF4_TRUE@	f90tst_parallel3$(EXEEXT) \
+ at TEST_PARALLEL_TRUE@@USE_NETCDF4_TRUE@	f90tst_nc4_par$(EXEEXT) \
+ at TEST_PARALLEL_TRUE@@USE_NETCDF4_TRUE@	ftst_parallel$(EXEEXT) \
+ at TEST_PARALLEL_TRUE@@USE_NETCDF4_TRUE@	ftst_parallel_nasa$(EXEEXT)
+ at BUILD_V2_TRUE@am__EXEEXT_7 = ftest$(EXEEXT)
+am__f90tst_fill_SOURCES_DIST = f90tst_fill.f90
+ at USE_NETCDF4_TRUE@am_f90tst_fill_OBJECTS = f90tst_fill.$(OBJEXT)
+f90tst_fill_OBJECTS = $(am_f90tst_fill_OBJECTS)
+f90tst_fill_LDADD = $(LDADD)
+f90tst_fill_DEPENDENCIES = ${top_builddir}/fortran/libnetcdff.la
+AM_V_lt = $(am__v_lt_ at AM_V@)
+am__v_lt_ = $(am__v_lt_ at AM_DEFAULT_V@)
+am__v_lt_0 = --silent
+am__v_lt_1 = 
+am__f90tst_fill2_SOURCES_DIST = f90tst_fill2.f90
+ at USE_NETCDF4_TRUE@am_f90tst_fill2_OBJECTS = f90tst_fill2.$(OBJEXT)
+f90tst_fill2_OBJECTS = $(am_f90tst_fill2_OBJECTS)
+f90tst_fill2_LDADD = $(LDADD)
+f90tst_fill2_DEPENDENCIES = ${top_builddir}/fortran/libnetcdff.la
+am__f90tst_grps_SOURCES_DIST = f90tst_grps.f90
+ at USE_NETCDF4_TRUE@am_f90tst_grps_OBJECTS = f90tst_grps.$(OBJEXT)
+f90tst_grps_OBJECTS = $(am_f90tst_grps_OBJECTS)
+f90tst_grps_LDADD = $(LDADD)
+f90tst_grps_DEPENDENCIES = ${top_builddir}/fortran/libnetcdff.la
+am__f90tst_nc4_par_SOURCES_DIST = f90tst_nc4_par.f90
+ at TEST_PARALLEL_TRUE@@USE_NETCDF4_TRUE at am_f90tst_nc4_par_OBJECTS = f90tst_nc4_par.$(OBJEXT)
+f90tst_nc4_par_OBJECTS = $(am_f90tst_nc4_par_OBJECTS)
+f90tst_nc4_par_LDADD = $(LDADD)
+f90tst_nc4_par_DEPENDENCIES = ${top_builddir}/fortran/libnetcdff.la
+am__f90tst_parallel_SOURCES_DIST = f90tst_parallel.f90
+ at TEST_PARALLEL_TRUE@@USE_NETCDF4_TRUE at am_f90tst_parallel_OBJECTS = f90tst_parallel.$(OBJEXT)
+f90tst_parallel_OBJECTS = $(am_f90tst_parallel_OBJECTS)
+f90tst_parallel_LDADD = $(LDADD)
+f90tst_parallel_DEPENDENCIES = ${top_builddir}/fortran/libnetcdff.la
+am__f90tst_parallel2_SOURCES_DIST = f90tst_parallel2.f90
+ at TEST_PARALLEL_TRUE@@USE_NETCDF4_TRUE at am_f90tst_parallel2_OBJECTS = f90tst_parallel2.$(OBJEXT)
+f90tst_parallel2_OBJECTS = $(am_f90tst_parallel2_OBJECTS)
+f90tst_parallel2_LDADD = $(LDADD)
+f90tst_parallel2_DEPENDENCIES = ${top_builddir}/fortran/libnetcdff.la
+am__f90tst_parallel3_SOURCES_DIST = f90tst_parallel3.f90
+ at TEST_PARALLEL_TRUE@@USE_NETCDF4_TRUE at am_f90tst_parallel3_OBJECTS = f90tst_parallel3.$(OBJEXT)
+f90tst_parallel3_OBJECTS = $(am_f90tst_parallel3_OBJECTS)
+f90tst_parallel3_LDADD = $(LDADD)
+f90tst_parallel3_DEPENDENCIES = ${top_builddir}/fortran/libnetcdff.la
+am__f90tst_path_SOURCES_DIST = f90tst_path.f90
+ at USE_NETCDF4_TRUE@am_f90tst_path_OBJECTS = f90tst_path.$(OBJEXT)
+f90tst_path_OBJECTS = $(am_f90tst_path_OBJECTS)
+f90tst_path_LDADD = $(LDADD)
+f90tst_path_DEPENDENCIES = ${top_builddir}/fortran/libnetcdff.la
+am__f90tst_rengrps_SOURCES_DIST = f90tst_rengrps.f90
+ at USE_NETCDF4_TRUE@am_f90tst_rengrps_OBJECTS =  \
+ at USE_NETCDF4_TRUE@	f90tst_rengrps.$(OBJEXT)
+f90tst_rengrps_OBJECTS = $(am_f90tst_rengrps_OBJECTS)
+f90tst_rengrps_LDADD = $(LDADD)
+f90tst_rengrps_DEPENDENCIES = ${top_builddir}/fortran/libnetcdff.la
+am__f90tst_vars_SOURCES_DIST = f90tst_vars.f90
+ at USE_NETCDF4_TRUE@am_f90tst_vars_OBJECTS = f90tst_vars.$(OBJEXT)
+f90tst_vars_OBJECTS = $(am_f90tst_vars_OBJECTS)
+f90tst_vars_LDADD = $(LDADD)
+f90tst_vars_DEPENDENCIES = ${top_builddir}/fortran/libnetcdff.la
+am__f90tst_vars2_SOURCES_DIST = f90tst_vars2.f90
+ at USE_NETCDF4_TRUE@am_f90tst_vars2_OBJECTS = f90tst_vars2.$(OBJEXT)
+f90tst_vars2_OBJECTS = $(am_f90tst_vars2_OBJECTS)
+f90tst_vars2_LDADD = $(LDADD)
+f90tst_vars2_DEPENDENCIES = ${top_builddir}/fortran/libnetcdff.la
+am__f90tst_vars3_SOURCES_DIST = f90tst_vars3.f90
+ at USE_NETCDF4_TRUE@am_f90tst_vars3_OBJECTS = f90tst_vars3.$(OBJEXT)
+f90tst_vars3_OBJECTS = $(am_f90tst_vars3_OBJECTS)
+f90tst_vars3_LDADD = $(LDADD)
+f90tst_vars3_DEPENDENCIES = ${top_builddir}/fortran/libnetcdff.la
+am__f90tst_vars4_SOURCES_DIST = f90tst_vars4.f90
+ at USE_NETCDF4_TRUE@am_f90tst_vars4_OBJECTS = f90tst_vars4.$(OBJEXT)
+f90tst_vars4_OBJECTS = $(am_f90tst_vars4_OBJECTS)
+f90tst_vars4_LDADD = $(LDADD)
+f90tst_vars4_DEPENDENCIES = ${top_builddir}/fortran/libnetcdff.la
+am__f90tst_vars_vlen_SOURCES_DIST = f90tst_vars_vlen.f90
+ at USE_NETCDF4_TRUE@am_f90tst_vars_vlen_OBJECTS =  \
+ at USE_NETCDF4_TRUE@	f90tst_vars_vlen.$(OBJEXT)
+f90tst_vars_vlen_OBJECTS = $(am_f90tst_vars_vlen_OBJECTS)
+f90tst_vars_vlen_LDADD = $(LDADD)
+f90tst_vars_vlen_DEPENDENCIES = ${top_builddir}/fortran/libnetcdff.la
+am__ftest_SOURCES_DIST = ftest.F fortlib.c f03lib.c
+ at BUILD_F03_FALSE@@BUILD_V2_TRUE at am_ftest_OBJECTS = ftest.$(OBJEXT) \
+ at BUILD_F03_FALSE@@BUILD_V2_TRUE@	fortlib.$(OBJEXT)
+ at BUILD_F03_TRUE@@BUILD_V2_TRUE at am_ftest_OBJECTS = ftest.$(OBJEXT) \
+ at BUILD_F03_TRUE@@BUILD_V2_TRUE@	f03lib.$(OBJEXT)
+ftest_OBJECTS = $(am_ftest_OBJECTS)
+ftest_LDADD = $(LDADD)
+ftest_DEPENDENCIES = ${top_builddir}/fortran/libnetcdff.la
+am__ftst_groups_SOURCES_DIST = ftst_groups.F fortlib.c handle_err.F \
+	f03lib_f_interfaces.f90 f03lib.c
+ at BUILD_F03_FALSE@@USE_NETCDF4_TRUE at am_ftst_groups_OBJECTS =  \
+ at BUILD_F03_FALSE@@USE_NETCDF4_TRUE@	ftst_groups.$(OBJEXT) \
+ at BUILD_F03_FALSE@@USE_NETCDF4_TRUE@	fortlib.$(OBJEXT) \
+ at BUILD_F03_FALSE@@USE_NETCDF4_TRUE@	handle_err.$(OBJEXT)
+ at BUILD_F03_TRUE@@USE_NETCDF4_TRUE at am_ftst_groups_OBJECTS =  \
+ at BUILD_F03_TRUE@@USE_NETCDF4_TRUE@	ftst_groups.$(OBJEXT) \
+ at BUILD_F03_TRUE@@USE_NETCDF4_TRUE@	f03lib_f_interfaces.$(OBJEXT) \
+ at BUILD_F03_TRUE@@USE_NETCDF4_TRUE@	f03lib.$(OBJEXT) \
+ at BUILD_F03_TRUE@@USE_NETCDF4_TRUE@	handle_err.$(OBJEXT)
+ftst_groups_OBJECTS = $(am_ftst_groups_OBJECTS)
+ftst_groups_LDADD = $(LDADD)
+ftst_groups_DEPENDENCIES = ${top_builddir}/fortran/libnetcdff.la
+am__ftst_parallel_SOURCES_DIST = ftst_parallel.F
+ at TEST_PARALLEL_TRUE@@USE_NETCDF4_TRUE at am_ftst_parallel_OBJECTS =  \
+ at TEST_PARALLEL_TRUE@@USE_NETCDF4_TRUE@	ftst_parallel.$(OBJEXT)
+ftst_parallel_OBJECTS = $(am_ftst_parallel_OBJECTS)
+ftst_parallel_LDADD = $(LDADD)
+ftst_parallel_DEPENDENCIES = ${top_builddir}/fortran/libnetcdff.la
+am__ftst_parallel_nasa_SOURCES_DIST = ftst_parallel_nasa.F
+ at TEST_PARALLEL_TRUE@@USE_NETCDF4_TRUE at am_ftst_parallel_nasa_OBJECTS = ftst_parallel_nasa.$(OBJEXT)
+ftst_parallel_nasa_OBJECTS = $(am_ftst_parallel_nasa_OBJECTS)
+ftst_parallel_nasa_LDADD = $(LDADD)
+ftst_parallel_nasa_DEPENDENCIES =  \
+	${top_builddir}/fortran/libnetcdff.la
+am__ftst_path_SOURCES_DIST = ftst_path.F fortlib.c handle_err.F \
+	f03lib_f_interfaces.f90 f03lib.c
+ at BUILD_F03_FALSE@@USE_NETCDF4_TRUE at am_ftst_path_OBJECTS =  \
+ at BUILD_F03_FALSE@@USE_NETCDF4_TRUE@	ftst_path.$(OBJEXT) \
+ at BUILD_F03_FALSE@@USE_NETCDF4_TRUE@	fortlib.$(OBJEXT) \
+ at BUILD_F03_FALSE@@USE_NETCDF4_TRUE@	handle_err.$(OBJEXT)
+ at BUILD_F03_TRUE@@USE_NETCDF4_TRUE at am_ftst_path_OBJECTS =  \
+ at BUILD_F03_TRUE@@USE_NETCDF4_TRUE@	ftst_path.$(OBJEXT) \
+ at BUILD_F03_TRUE@@USE_NETCDF4_TRUE@	f03lib_f_interfaces.$(OBJEXT) \
+ at BUILD_F03_TRUE@@USE_NETCDF4_TRUE@	f03lib.$(OBJEXT) \
+ at BUILD_F03_TRUE@@USE_NETCDF4_TRUE@	handle_err.$(OBJEXT)
+ftst_path_OBJECTS = $(am_ftst_path_OBJECTS)
+ftst_path_LDADD = $(LDADD)
+ftst_path_DEPENDENCIES = ${top_builddir}/fortran/libnetcdff.la
+am__ftst_rengrps_SOURCES_DIST = ftst_rengrps.F fortlib.c handle_err.F \
+	f03lib_f_interfaces.f90 f03lib.c
+ at BUILD_F03_FALSE@@USE_NETCDF4_TRUE at am_ftst_rengrps_OBJECTS =  \
+ at BUILD_F03_FALSE@@USE_NETCDF4_TRUE@	ftst_rengrps.$(OBJEXT) \
+ at BUILD_F03_FALSE@@USE_NETCDF4_TRUE@	fortlib.$(OBJEXT) \
+ at BUILD_F03_FALSE@@USE_NETCDF4_TRUE@	handle_err.$(OBJEXT)
+ at BUILD_F03_TRUE@@USE_NETCDF4_TRUE at am_ftst_rengrps_OBJECTS =  \
+ at BUILD_F03_TRUE@@USE_NETCDF4_TRUE@	ftst_rengrps.$(OBJEXT) \
+ at BUILD_F03_TRUE@@USE_NETCDF4_TRUE@	f03lib_f_interfaces.$(OBJEXT) \
+ at BUILD_F03_TRUE@@USE_NETCDF4_TRUE@	f03lib.$(OBJEXT) \
+ at BUILD_F03_TRUE@@USE_NETCDF4_TRUE@	handle_err.$(OBJEXT)
+ftst_rengrps_OBJECTS = $(am_ftst_rengrps_OBJECTS)
+ftst_rengrps_LDADD = $(LDADD)
+ftst_rengrps_DEPENDENCIES = ${top_builddir}/fortran/libnetcdff.la
+am__ftst_types_SOURCES_DIST = ftst_types.F fortlib.c handle_err.F \
+	f03lib_f_interfaces.f90 f03lib.c
+ at BUILD_F03_FALSE@@USE_NETCDF4_TRUE at am_ftst_types_OBJECTS =  \
+ at BUILD_F03_FALSE@@USE_NETCDF4_TRUE@	ftst_types.$(OBJEXT) \
+ at BUILD_F03_FALSE@@USE_NETCDF4_TRUE@	fortlib.$(OBJEXT) \
+ at BUILD_F03_FALSE@@USE_NETCDF4_TRUE@	handle_err.$(OBJEXT)
+ at BUILD_F03_TRUE@@USE_NETCDF4_TRUE at am_ftst_types_OBJECTS =  \
+ at BUILD_F03_TRUE@@USE_NETCDF4_TRUE@	ftst_types.$(OBJEXT) \
+ at BUILD_F03_TRUE@@USE_NETCDF4_TRUE@	f03lib_f_interfaces.$(OBJEXT) \
+ at BUILD_F03_TRUE@@USE_NETCDF4_TRUE@	f03lib.$(OBJEXT) \
+ at BUILD_F03_TRUE@@USE_NETCDF4_TRUE@	handle_err.$(OBJEXT)
+ftst_types_OBJECTS = $(am_ftst_types_OBJECTS)
+ftst_types_LDADD = $(LDADD)
+ftst_types_DEPENDENCIES = ${top_builddir}/fortran/libnetcdff.la
+am__ftst_types2_SOURCES_DIST = ftst_types2.F fortlib.c handle_err.F \
+	f03lib_f_interfaces.f90 f03lib.c
+ at BUILD_F03_FALSE@@USE_NETCDF4_TRUE at am_ftst_types2_OBJECTS =  \
+ at BUILD_F03_FALSE@@USE_NETCDF4_TRUE@	ftst_types2.$(OBJEXT) \
+ at BUILD_F03_FALSE@@USE_NETCDF4_TRUE@	fortlib.$(OBJEXT) \
+ at BUILD_F03_FALSE@@USE_NETCDF4_TRUE@	handle_err.$(OBJEXT)
+ at BUILD_F03_TRUE@@USE_NETCDF4_TRUE at am_ftst_types2_OBJECTS =  \
+ at BUILD_F03_TRUE@@USE_NETCDF4_TRUE@	ftst_types2.$(OBJEXT) \
+ at BUILD_F03_TRUE@@USE_NETCDF4_TRUE@	f03lib_f_interfaces.$(OBJEXT) \
+ at BUILD_F03_TRUE@@USE_NETCDF4_TRUE@	f03lib.$(OBJEXT) \
+ at BUILD_F03_TRUE@@USE_NETCDF4_TRUE@	handle_err.$(OBJEXT)
+ftst_types2_OBJECTS = $(am_ftst_types2_OBJECTS)
+ftst_types2_LDADD = $(LDADD)
+ftst_types2_DEPENDENCIES = ${top_builddir}/fortran/libnetcdff.la
+am__ftst_types3_SOURCES_DIST = ftst_types3.F fortlib.c handle_err.F \
+	f03lib_f_interfaces.f90 f03lib.c
+ at BUILD_F03_FALSE@@USE_NETCDF4_TRUE at am_ftst_types3_OBJECTS =  \
+ at BUILD_F03_FALSE@@USE_NETCDF4_TRUE@	ftst_types3.$(OBJEXT) \
+ at BUILD_F03_FALSE@@USE_NETCDF4_TRUE@	fortlib.$(OBJEXT) \
+ at BUILD_F03_FALSE@@USE_NETCDF4_TRUE@	handle_err.$(OBJEXT)
+ at BUILD_F03_TRUE@@USE_NETCDF4_TRUE at am_ftst_types3_OBJECTS =  \
+ at BUILD_F03_TRUE@@USE_NETCDF4_TRUE@	ftst_types3.$(OBJEXT) \
+ at BUILD_F03_TRUE@@USE_NETCDF4_TRUE@	f03lib_f_interfaces.$(OBJEXT) \
+ at BUILD_F03_TRUE@@USE_NETCDF4_TRUE@	f03lib.$(OBJEXT) \
+ at BUILD_F03_TRUE@@USE_NETCDF4_TRUE@	handle_err.$(OBJEXT)
+ftst_types3_OBJECTS = $(am_ftst_types3_OBJECTS)
+ftst_types3_LDADD = $(LDADD)
+ftst_types3_DEPENDENCIES = ${top_builddir}/fortran/libnetcdff.la
+am__ftst_v2_SOURCES_DIST = ftst_v2.F
+ at BUILD_V2_TRUE@@USE_NETCDF4_TRUE at am_ftst_v2_OBJECTS =  \
+ at BUILD_V2_TRUE@@USE_NETCDF4_TRUE@	ftst_v2.$(OBJEXT)
+ftst_v2_OBJECTS = $(am_ftst_v2_OBJECTS)
+ftst_v2_LDADD = $(LDADD)
+ftst_v2_DEPENDENCIES = ${top_builddir}/fortran/libnetcdff.la
+am__ftst_vars_SOURCES_DIST = ftst_vars.F fortlib.c handle_err.F \
+	f03lib_f_interfaces.f90 f03lib.c
+ at BUILD_F03_FALSE@@USE_NETCDF4_TRUE at am_ftst_vars_OBJECTS =  \
+ at BUILD_F03_FALSE@@USE_NETCDF4_TRUE@	ftst_vars.$(OBJEXT) \
+ at BUILD_F03_FALSE@@USE_NETCDF4_TRUE@	fortlib.$(OBJEXT) \
+ at BUILD_F03_FALSE@@USE_NETCDF4_TRUE@	handle_err.$(OBJEXT)
+ at BUILD_F03_TRUE@@USE_NETCDF4_TRUE at am_ftst_vars_OBJECTS =  \
+ at BUILD_F03_TRUE@@USE_NETCDF4_TRUE@	ftst_vars.$(OBJEXT) \
+ at BUILD_F03_TRUE@@USE_NETCDF4_TRUE@	f03lib_f_interfaces.$(OBJEXT) \
+ at BUILD_F03_TRUE@@USE_NETCDF4_TRUE@	f03lib.$(OBJEXT) \
+ at BUILD_F03_TRUE@@USE_NETCDF4_TRUE@	handle_err.$(OBJEXT)
+ftst_vars_OBJECTS = $(am_ftst_vars_OBJECTS)
+ftst_vars_LDADD = $(LDADD)
+ftst_vars_DEPENDENCIES = ${top_builddir}/fortran/libnetcdff.la
+am__ftst_vars2_SOURCES_DIST = ftst_vars2.F fortlib.c handle_err.F \
+	f03lib_f_interfaces.f90 f03lib.c
+ at BUILD_F03_FALSE@@USE_NETCDF4_TRUE at am_ftst_vars2_OBJECTS =  \
+ at BUILD_F03_FALSE@@USE_NETCDF4_TRUE@	ftst_vars2.$(OBJEXT) \
+ at BUILD_F03_FALSE@@USE_NETCDF4_TRUE@	fortlib.$(OBJEXT) \
+ at BUILD_F03_FALSE@@USE_NETCDF4_TRUE@	handle_err.$(OBJEXT)
+ at BUILD_F03_TRUE@@USE_NETCDF4_TRUE at am_ftst_vars2_OBJECTS =  \
+ at BUILD_F03_TRUE@@USE_NETCDF4_TRUE@	ftst_vars2.$(OBJEXT) \
+ at BUILD_F03_TRUE@@USE_NETCDF4_TRUE@	f03lib_f_interfaces.$(OBJEXT) \
+ at BUILD_F03_TRUE@@USE_NETCDF4_TRUE@	f03lib.$(OBJEXT) \
+ at BUILD_F03_TRUE@@USE_NETCDF4_TRUE@	handle_err.$(OBJEXT)
+ftst_vars2_OBJECTS = $(am_ftst_vars2_OBJECTS)
+ftst_vars2_LDADD = $(LDADD)
+ftst_vars2_DEPENDENCIES = ${top_builddir}/fortran/libnetcdff.la
+am__ftst_vars3_SOURCES_DIST = ftst_vars3.F fortlib.c handle_err.F \
+	f03lib_f_interfaces.f90 f03lib.c
+ at BUILD_F03_FALSE@@USE_NETCDF4_TRUE at am_ftst_vars3_OBJECTS =  \
+ at BUILD_F03_FALSE@@USE_NETCDF4_TRUE@	ftst_vars3.$(OBJEXT) \
+ at BUILD_F03_FALSE@@USE_NETCDF4_TRUE@	fortlib.$(OBJEXT) \
+ at BUILD_F03_FALSE@@USE_NETCDF4_TRUE@	handle_err.$(OBJEXT)
+ at BUILD_F03_TRUE@@USE_NETCDF4_TRUE at am_ftst_vars3_OBJECTS =  \
+ at BUILD_F03_TRUE@@USE_NETCDF4_TRUE@	ftst_vars3.$(OBJEXT) \
+ at BUILD_F03_TRUE@@USE_NETCDF4_TRUE@	f03lib_f_interfaces.$(OBJEXT) \
+ at BUILD_F03_TRUE@@USE_NETCDF4_TRUE@	f03lib.$(OBJEXT) \
+ at BUILD_F03_TRUE@@USE_NETCDF4_TRUE@	handle_err.$(OBJEXT)
+ftst_vars3_OBJECTS = $(am_ftst_vars3_OBJECTS)
+ftst_vars3_LDADD = $(LDADD)
+ftst_vars3_DEPENDENCIES = ${top_builddir}/fortran/libnetcdff.la
+am__ftst_vars4_SOURCES_DIST = ftst_vars4.F fortlib.c handle_err.F \
+	f03lib_f_interfaces.f90 f03lib.c
+ at BUILD_F03_FALSE@@USE_NETCDF4_TRUE at am_ftst_vars4_OBJECTS =  \
+ at BUILD_F03_FALSE@@USE_NETCDF4_TRUE@	ftst_vars4.$(OBJEXT) \
+ at BUILD_F03_FALSE@@USE_NETCDF4_TRUE@	fortlib.$(OBJEXT) \
+ at BUILD_F03_FALSE@@USE_NETCDF4_TRUE@	handle_err.$(OBJEXT)
+ at BUILD_F03_TRUE@@USE_NETCDF4_TRUE at am_ftst_vars4_OBJECTS =  \
+ at BUILD_F03_TRUE@@USE_NETCDF4_TRUE@	ftst_vars4.$(OBJEXT) \
+ at BUILD_F03_TRUE@@USE_NETCDF4_TRUE@	f03lib_f_interfaces.$(OBJEXT) \
+ at BUILD_F03_TRUE@@USE_NETCDF4_TRUE@	f03lib.$(OBJEXT) \
+ at BUILD_F03_TRUE@@USE_NETCDF4_TRUE@	handle_err.$(OBJEXT)
+ftst_vars4_OBJECTS = $(am_ftst_vars4_OBJECTS)
+ftst_vars4_LDADD = $(LDADD)
+ftst_vars4_DEPENDENCIES = ${top_builddir}/fortran/libnetcdff.la
+am__ftst_vars5_SOURCES_DIST = ftst_vars5.F fortlib.c handle_err.F \
+	f03lib_f_interfaces.f90 f03lib.c
+ at BUILD_F03_FALSE@@USE_NETCDF4_TRUE at am_ftst_vars5_OBJECTS =  \
+ at BUILD_F03_FALSE@@USE_NETCDF4_TRUE@	ftst_vars5.$(OBJEXT) \
+ at BUILD_F03_FALSE@@USE_NETCDF4_TRUE@	fortlib.$(OBJEXT) \
+ at BUILD_F03_FALSE@@USE_NETCDF4_TRUE@	handle_err.$(OBJEXT)
+ at BUILD_F03_TRUE@@USE_NETCDF4_TRUE at am_ftst_vars5_OBJECTS =  \
+ at BUILD_F03_TRUE@@USE_NETCDF4_TRUE@	ftst_vars5.$(OBJEXT) \
+ at BUILD_F03_TRUE@@USE_NETCDF4_TRUE@	f03lib_f_interfaces.$(OBJEXT) \
+ at BUILD_F03_TRUE@@USE_NETCDF4_TRUE@	f03lib.$(OBJEXT) \
+ at BUILD_F03_TRUE@@USE_NETCDF4_TRUE@	handle_err.$(OBJEXT)
+ftst_vars5_OBJECTS = $(am_ftst_vars5_OBJECTS)
+ftst_vars5_LDADD = $(LDADD)
+ftst_vars5_DEPENDENCIES = ${top_builddir}/fortran/libnetcdff.la
+am__ftst_vars6_SOURCES_DIST = ftst_vars6.F fortlib.c handle_err.F \
+	f03lib_f_interfaces.f90 f03lib.c
+ at BUILD_F03_FALSE@@USE_NETCDF4_TRUE at am_ftst_vars6_OBJECTS =  \
+ at BUILD_F03_FALSE@@USE_NETCDF4_TRUE@	ftst_vars6.$(OBJEXT) \
+ at BUILD_F03_FALSE@@USE_NETCDF4_TRUE@	fortlib.$(OBJEXT) \
+ at BUILD_F03_FALSE@@USE_NETCDF4_TRUE@	handle_err.$(OBJEXT)
+ at BUILD_F03_TRUE@@USE_NETCDF4_TRUE at am_ftst_vars6_OBJECTS =  \
+ at BUILD_F03_TRUE@@USE_NETCDF4_TRUE@	ftst_vars6.$(OBJEXT) \
+ at BUILD_F03_TRUE@@USE_NETCDF4_TRUE@	f03lib_f_interfaces.$(OBJEXT) \
+ at BUILD_F03_TRUE@@USE_NETCDF4_TRUE@	f03lib.$(OBJEXT) \
+ at BUILD_F03_TRUE@@USE_NETCDF4_TRUE@	handle_err.$(OBJEXT)
+ftst_vars6_OBJECTS = $(am_ftst_vars6_OBJECTS)
+ftst_vars6_LDADD = $(LDADD)
+ftst_vars6_DEPENDENCIES = ${top_builddir}/fortran/libnetcdff.la
+am__nf_test_SOURCES_DIST = test_get.m4 test_put.m4 nf_error.F \
+	nf_test.F test_read.F test_write.F util.F fortlib.c tests.inc \
+	f03lib_f_interfaces.f90 f03lib.c
+ at BUILD_F03_FALSE@am_nf_test_OBJECTS = test_get.$(OBJEXT) \
+ at BUILD_F03_FALSE@	test_put.$(OBJEXT) nf_error.$(OBJEXT) \
+ at BUILD_F03_FALSE@	nf_test.$(OBJEXT) test_read.$(OBJEXT) \
+ at BUILD_F03_FALSE@	test_write.$(OBJEXT) util.$(OBJEXT) \
+ at BUILD_F03_FALSE@	fortlib.$(OBJEXT)
+ at BUILD_F03_TRUE@am_nf_test_OBJECTS = f03lib_f_interfaces.$(OBJEXT) \
+ at BUILD_F03_TRUE@	test_get.$(OBJEXT) test_put.$(OBJEXT) \
+ at BUILD_F03_TRUE@	nf_error.$(OBJEXT) nf_test.$(OBJEXT) \
+ at BUILD_F03_TRUE@	test_read.$(OBJEXT) test_write.$(OBJEXT) \
+ at BUILD_F03_TRUE@	util.$(OBJEXT) f03lib.$(OBJEXT)
+nf_test_OBJECTS = $(am_nf_test_OBJECTS)
+nf_test_LDADD = $(LDADD)
+nf_test_DEPENDENCIES = ${top_builddir}/fortran/libnetcdff.la
+am__tst_f77_v2_SOURCES_DIST = tst_f77_v2.F
+ at BUILD_V2_TRUE@am_tst_f77_v2_OBJECTS = tst_f77_v2.$(OBJEXT)
+tst_f77_v2_OBJECTS = $(am_tst_f77_v2_OBJECTS)
+tst_f77_v2_LDADD = $(LDADD)
+tst_f77_v2_DEPENDENCIES = ${top_builddir}/fortran/libnetcdff.la
+am_tst_f90_OBJECTS = tst_f90.$(OBJEXT)
+tst_f90_OBJECTS = $(am_tst_f90_OBJECTS)
+tst_f90_LDADD = $(LDADD)
+tst_f90_DEPENDENCIES = ${top_builddir}/fortran/libnetcdff.la
+am__tst_f90_nc4_SOURCES_DIST = tst_f90_nc4.f90
+ at USE_NETCDF4_TRUE@am_tst_f90_nc4_OBJECTS = tst_f90_nc4.$(OBJEXT)
+tst_f90_nc4_OBJECTS = $(am_tst_f90_nc4_OBJECTS)
+tst_f90_nc4_LDADD = $(LDADD)
+tst_f90_nc4_DEPENDENCIES = ${top_builddir}/fortran/libnetcdff.la
+am__tst_flarge_SOURCES_DIST = tst_flarge.f90
+ at LARGE_FILE_TESTS_TRUE@@USE_NETCDF4_TRUE at am_tst_flarge_OBJECTS =  \
+ at LARGE_FILE_TESTS_TRUE@@USE_NETCDF4_TRUE@	tst_flarge.$(OBJEXT)
+tst_flarge_OBJECTS = $(am_tst_flarge_OBJECTS)
+tst_flarge_LDADD = $(LDADD)
+tst_flarge_DEPENDENCIES = ${top_builddir}/fortran/libnetcdff.la
+am__tst_io_SOURCES_DIST = tst_io.f90
+ at BUILD_BENCHMARKS_TRUE@@USE_NETCDF4_TRUE at am_tst_io_OBJECTS =  \
+ at BUILD_BENCHMARKS_TRUE@@USE_NETCDF4_TRUE@	tst_io.$(OBJEXT)
+tst_io_OBJECTS = $(am_tst_io_OBJECTS)
+tst_io_LDADD = $(LDADD)
+tst_io_DEPENDENCIES = ${top_builddir}/fortran/libnetcdff.la
+am__tst_types_SOURCES_DIST = tst_types.f90
+ at USE_NETCDF4_TRUE@am_tst_types_OBJECTS = tst_types.$(OBJEXT)
+tst_types_OBJECTS = $(am_tst_types_OBJECTS)
+tst_types_LDADD = $(LDADD)
+tst_types_DEPENDENCIES = ${top_builddir}/fortran/libnetcdff.la
+am__tst_types2_SOURCES_DIST = tst_types2.f90
+ at USE_NETCDF4_TRUE@am_tst_types2_OBJECTS = tst_types2.$(OBJEXT)
+tst_types2_OBJECTS = $(am_tst_types2_OBJECTS)
+tst_types2_LDADD = $(LDADD)
+tst_types2_DEPENDENCIES = ${top_builddir}/fortran/libnetcdff.la
+AM_V_P = $(am__v_P_ at AM_V@)
+am__v_P_ = $(am__v_P_ at AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_ at AM_V@)
+am__v_GEN_ = $(am__v_GEN_ at AM_DEFAULT_V@)
+am__v_GEN_0 = @echo "  GEN     " $@;
+am__v_GEN_1 = 
+AM_V_at = $(am__v_at_ at AM_V@)
+am__v_at_ = $(am__v_at_ at AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 = 
+DEFAULT_INCLUDES = -I. at am__isrc@ -I$(top_builddir) -I$(top_builddir)/libsrc
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__depfiles_maybe = depfiles
+am__mv = mv -f
+PPF77COMPILE = $(F77) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_FFLAGS) $(FFLAGS)
+LTPPF77COMPILE = $(LIBTOOL) $(AM_V_lt) --tag=F77 $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=compile $(F77) $(DEFS) \
+	$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+	$(AM_FFLAGS) $(FFLAGS)
+AM_V_PPF77 = $(am__v_PPF77_ at AM_V@)
+am__v_PPF77_ = $(am__v_PPF77_ at AM_DEFAULT_V@)
+am__v_PPF77_0 = @echo "  PPF77   " $@;
+am__v_PPF77_1 = 
+F77LD = $(F77)
+F77LINK = $(LIBTOOL) $(AM_V_lt) --tag=F77 $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(F77LD) $(AM_FFLAGS) $(FFLAGS) \
+	$(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_F77LD = $(am__v_F77LD_ at AM_V@)
+am__v_F77LD_ = $(am__v_F77LD_ at AM_DEFAULT_V@)
+am__v_F77LD_0 = @echo "  F77LD   " $@;
+am__v_F77LD_1 = 
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+	$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \
+	$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+	$(AM_CFLAGS) $(CFLAGS)
+AM_V_CC = $(am__v_CC_ at AM_V@)
+am__v_CC_ = $(am__v_CC_ at AM_DEFAULT_V@)
+am__v_CC_0 = @echo "  CC      " $@;
+am__v_CC_1 = 
+CCLD = $(CC)
+LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+	$(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CCLD = $(am__v_CCLD_ at AM_V@)
+am__v_CCLD_ = $(am__v_CCLD_ at AM_DEFAULT_V@)
+am__v_CCLD_0 = @echo "  CCLD    " $@;
+am__v_CCLD_1 = 
+FCCOMPILE = $(FC) $(AM_FCFLAGS) $(FCFLAGS)
+LTFCCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=FC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=compile $(FC) $(AM_FCFLAGS) $(FCFLAGS)
+AM_V_FC = $(am__v_FC_ at AM_V@)
+am__v_FC_ = $(am__v_FC_ at AM_DEFAULT_V@)
+am__v_FC_0 = @echo "  FC      " $@;
+am__v_FC_1 = 
+FCLD = $(FC)
+FCLINK = $(LIBTOOL) $(AM_V_lt) --tag=FC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(FCLD) $(AM_FCFLAGS) $(FCFLAGS) \
+	$(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_FCLD = $(am__v_FCLD_ at AM_V@)
+am__v_FCLD_ = $(am__v_FCLD_ at AM_DEFAULT_V@)
+am__v_FCLD_0 = @echo "  FCLD    " $@;
+am__v_FCLD_1 = 
+SOURCES = $(f90tst_fill_SOURCES) $(f90tst_fill2_SOURCES) \
+	$(f90tst_grps_SOURCES) $(f90tst_nc4_par_SOURCES) \
+	$(f90tst_parallel_SOURCES) $(f90tst_parallel2_SOURCES) \
+	$(f90tst_parallel3_SOURCES) $(f90tst_path_SOURCES) \
+	$(f90tst_rengrps_SOURCES) $(f90tst_vars_SOURCES) \
+	$(f90tst_vars2_SOURCES) $(f90tst_vars3_SOURCES) \
+	$(f90tst_vars4_SOURCES) $(f90tst_vars_vlen_SOURCES) \
+	$(ftest_SOURCES) $(ftst_groups_SOURCES) \
+	$(ftst_parallel_SOURCES) $(ftst_parallel_nasa_SOURCES) \
+	$(ftst_path_SOURCES) $(ftst_rengrps_SOURCES) \
+	$(ftst_types_SOURCES) $(ftst_types2_SOURCES) \
+	$(ftst_types3_SOURCES) $(ftst_v2_SOURCES) $(ftst_vars_SOURCES) \
+	$(ftst_vars2_SOURCES) $(ftst_vars3_SOURCES) \
+	$(ftst_vars4_SOURCES) $(ftst_vars5_SOURCES) \
+	$(ftst_vars6_SOURCES) $(nf_test_SOURCES) $(tst_f77_v2_SOURCES) \
+	$(tst_f90_SOURCES) $(tst_f90_nc4_SOURCES) \
+	$(tst_flarge_SOURCES) $(tst_io_SOURCES) $(tst_types_SOURCES) \
+	$(tst_types2_SOURCES)
+DIST_SOURCES = $(am__f90tst_fill_SOURCES_DIST) \
+	$(am__f90tst_fill2_SOURCES_DIST) \
+	$(am__f90tst_grps_SOURCES_DIST) \
+	$(am__f90tst_nc4_par_SOURCES_DIST) \
+	$(am__f90tst_parallel_SOURCES_DIST) \
+	$(am__f90tst_parallel2_SOURCES_DIST) \
+	$(am__f90tst_parallel3_SOURCES_DIST) \
+	$(am__f90tst_path_SOURCES_DIST) \
+	$(am__f90tst_rengrps_SOURCES_DIST) \
+	$(am__f90tst_vars_SOURCES_DIST) \
+	$(am__f90tst_vars2_SOURCES_DIST) \
+	$(am__f90tst_vars3_SOURCES_DIST) \
+	$(am__f90tst_vars4_SOURCES_DIST) \
+	$(am__f90tst_vars_vlen_SOURCES_DIST) $(am__ftest_SOURCES_DIST) \
+	$(am__ftst_groups_SOURCES_DIST) \
+	$(am__ftst_parallel_SOURCES_DIST) \
+	$(am__ftst_parallel_nasa_SOURCES_DIST) \
+	$(am__ftst_path_SOURCES_DIST) $(am__ftst_rengrps_SOURCES_DIST) \
+	$(am__ftst_types_SOURCES_DIST) $(am__ftst_types2_SOURCES_DIST) \
+	$(am__ftst_types3_SOURCES_DIST) $(am__ftst_v2_SOURCES_DIST) \
+	$(am__ftst_vars_SOURCES_DIST) $(am__ftst_vars2_SOURCES_DIST) \
+	$(am__ftst_vars3_SOURCES_DIST) $(am__ftst_vars4_SOURCES_DIST) \
+	$(am__ftst_vars5_SOURCES_DIST) $(am__ftst_vars6_SOURCES_DIST) \
+	$(am__nf_test_SOURCES_DIST) $(am__tst_f77_v2_SOURCES_DIST) \
+	$(tst_f90_SOURCES) $(am__tst_f90_nc4_SOURCES_DIST) \
+	$(am__tst_flarge_SOURCES_DIST) $(am__tst_io_SOURCES_DIST) \
+	$(am__tst_types_SOURCES_DIST) $(am__tst_types2_SOURCES_DIST)
+am__can_run_installinfo = \
+  case $$AM_UPDATE_INFO_DIR in \
+    n|no|NO) false;; \
+    *) (install-info --version) >/dev/null 2>&1;; \
+  esac
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates.  Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+  BEGIN { nonempty = 0; } \
+  { items[$$0] = 1; nonempty = 1; } \
+  END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique.  This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+  list='$(am__tagged_files)'; \
+  unique=`for i in $$list; do \
+    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+  done | $(am__uniquify_input)`
+ETAGS = etags
+CTAGS = ctags
+am__tty_colors_dummy = \
+  mgn= red= grn= lgn= blu= brg= std=; \
+  am__color_tests=no
+am__tty_colors = { \
+  $(am__tty_colors_dummy); \
+  if test "X$(AM_COLOR_TESTS)" = Xno; then \
+    am__color_tests=no; \
+  elif test "X$(AM_COLOR_TESTS)" = Xalways; then \
+    am__color_tests=yes; \
+  elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \
+    am__color_tests=yes; \
+  fi; \
+  if test $$am__color_tests = yes; then \
+    red=''; \
+    grn=''; \
+    lgn=''; \
+    blu=''; \
+    mgn=''; \
+    brg=''; \
+    std=''; \
+  fi; \
+}
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+  for p in $$list; do echo "$$p $$p"; done | \
+  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+    if (++n[$$2] == $(am__install_max)) \
+      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+    END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__uninstall_files_from_dir = { \
+  test -z "$$files" \
+    || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+    || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+         $(am__cd) "$$dir" && rm -f $$files; }; \
+  }
+am__recheck_rx = ^[ 	]*:recheck:[ 	]*
+am__global_test_result_rx = ^[ 	]*:global-test-result:[ 	]*
+am__copy_in_global_log_rx = ^[ 	]*:copy-in-global-log:[ 	]*
+# A command that, given a newline-separated list of test names on the
+# standard input, print the name of the tests that are to be re-run
+# upon "make recheck".
+am__list_recheck_tests = $(AWK) '{ \
+  recheck = 1; \
+  while ((rc = (getline line < ($$0 ".trs"))) != 0) \
+    { \
+      if (rc < 0) \
+        { \
+          if ((getline line2 < ($$0 ".log")) < 0) \
+	    recheck = 0; \
+          break; \
+        } \
+      else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \
+        { \
+          recheck = 0; \
+          break; \
+        } \
+      else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \
+        { \
+          break; \
+        } \
+    }; \
+  if (recheck) \
+    print $$0; \
+  close ($$0 ".trs"); \
+  close ($$0 ".log"); \
+}'
+# A command that, given a newline-separated list of test names on the
+# standard input, create the global log from their .trs and .log files.
+am__create_global_log = $(AWK) ' \
+function fatal(msg) \
+{ \
+  print "fatal: making $@: " msg | "cat >&2"; \
+  exit 1; \
+} \
+function rst_section(header) \
+{ \
+  print header; \
+  len = length(header); \
+  for (i = 1; i <= len; i = i + 1) \
+    printf "="; \
+  printf "\n\n"; \
+} \
+{ \
+  copy_in_global_log = 1; \
+  global_test_result = "RUN"; \
+  while ((rc = (getline line < ($$0 ".trs"))) != 0) \
+    { \
+      if (rc < 0) \
+         fatal("failed to read from " $$0 ".trs"); \
+      if (line ~ /$(am__global_test_result_rx)/) \
+        { \
+          sub("$(am__global_test_result_rx)", "", line); \
+          sub("[ 	]*$$", "", line); \
+          global_test_result = line; \
+        } \
+      else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \
+        copy_in_global_log = 0; \
+    }; \
+  if (copy_in_global_log) \
+    { \
+      rst_section(global_test_result ": " $$0); \
+      while ((rc = (getline line < ($$0 ".log"))) != 0) \
+      { \
+        if (rc < 0) \
+          fatal("failed to read from " $$0 ".log"); \
+        print line; \
+      }; \
+      printf "\n"; \
+    }; \
+  close ($$0 ".trs"); \
+  close ($$0 ".log"); \
+}'
+# Restructured Text title.
+am__rst_title = { sed 's/.*/   &   /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; }
+# Solaris 10 'make', and several other traditional 'make' implementations,
+# pass "-e" to $(SHELL), and POSIX 2008 even requires this.  Work around it
+# by disabling -e (using the XSI extension "set +e") if it's set.
+am__sh_e_setup = case $$- in *e*) set +e;; esac
+# Default flags passed to test drivers.
+am__common_driver_flags = \
+  --color-tests "$$am__color_tests" \
+  --enable-hard-errors "$$am__enable_hard_errors" \
+  --expect-failure "$$am__expect_failure"
+# To be inserted before the command running the test.  Creates the
+# directory for the log if needed.  Stores in $dir the directory
+# containing $f, in $tst the test, in $log the log.  Executes the
+# developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and
+# passes TESTS_ENVIRONMENT.  Set up options for the wrapper that
+# will run the test scripts (or their associated LOG_COMPILER, if
+# thy have one).
+am__check_pre = \
+$(am__sh_e_setup);					\
+$(am__vpath_adj_setup) $(am__vpath_adj)			\
+$(am__tty_colors);					\
+srcdir=$(srcdir); export srcdir;			\
+case "$@" in						\
+  */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;;	\
+    *) am__odir=.;; 					\
+esac;							\
+test "x$$am__odir" = x"." || test -d "$$am__odir" 	\
+  || $(MKDIR_P) "$$am__odir" || exit $$?;		\
+if test -f "./$$f"; then dir=./;			\
+elif test -f "$$f"; then dir=;				\
+else dir="$(srcdir)/"; fi;				\
+tst=$$dir$$f; log='$@'; 				\
+if test -n '$(DISABLE_HARD_ERRORS)'; then		\
+  am__enable_hard_errors=no; 				\
+else							\
+  am__enable_hard_errors=yes; 				\
+fi; 							\
+case " $(XFAIL_TESTS) " in				\
+  *[\ \	]$$f[\ \	]* | *[\ \	]$$dir$$f[\ \	]*) \
+    am__expect_failure=yes;;				\
+  *)							\
+    am__expect_failure=no;;				\
+esac; 							\
+$(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT)
+# A shell command to get the names of the tests scripts with any registered
+# extension removed (i.e., equivalently, the names of the test logs, with
+# the '.log' extension removed).  The result is saved in the shell variable
+# '$bases'.  This honors runtime overriding of TESTS and TEST_LOGS.  Sadly,
+# we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)",
+# since that might cause problem with VPATH rewrites for suffix-less tests.
+# See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'.
+am__set_TESTS_bases = \
+  bases='$(TEST_LOGS)'; \
+  bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \
+  bases=`echo $$bases`
+RECHECK_LOGS = $(TEST_LOGS)
+AM_RECURSIVE_TARGETS = check recheck
+TEST_SUITE_LOG = test-suite.log
+TEST_EXTENSIONS = @EXEEXT@ .test
+LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver
+LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS)
+am__set_b = \
+  case '$@' in \
+    */*) \
+      case '$*' in \
+        */*) b='$*';; \
+          *) b=`echo '$@' | sed 's/\.log$$//'`; \
+       esac;; \
+    *) \
+      b='$*';; \
+  esac
+am__test_logs1 = $(TESTS:=.log)
+am__test_logs2 = $(am__test_logs1:@EXEEXT at .log=.log)
+TEST_LOGS = $(am__test_logs2:.test.log=.log)
+TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver
+TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \
+	$(TEST_LOG_FLAGS)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+ALLOCA = @ALLOCA@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BUILD_INTERNAL_DOCS = @BUILD_INTERNAL_DOCS@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+DOT = @DOT@
+DOXYGEN = @DOXYGEN@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+F77 = @F77@
+FC = @FC@
+FCFLAGS = @FCFLAGS@
+FCFLAGS_f90 = @FCFLAGS_f90@
+FFLAGS = @FFLAGS@
+FGREP = @FGREP@
+GREP = @GREP@
+HAS_DAP = @HAS_DAP@
+HAS_F03 = @HAS_F03@
+HAS_F90 = @HAS_F90@
+HAS_NC2 = @HAS_NC2@
+HAS_NC4 = @HAS_NC4@
+HAVE_DOT = @HAVE_DOT@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MKDIR_P = @MKDIR_P@
+MOD_FLAG = @MOD_FLAG@
+NC_FLIBS = @NC_FLIBS@
+NC_LIBS = @NC_LIBS@
+NM = @NM@
+NMEDIT = @NMEDIT@
+NMFLAGS = @NMFLAGS@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+VERSION = @VERSION@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+ac_ct_F77 = @ac_ct_F77@
+ac_ct_FC = @ac_ct_FC@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target = @target@
+target_alias = @target_alias@
+target_cpu = @target_cpu@
+target_os = @target_os@
+target_vendor = @target_vendor@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+
+# Some fortran compilers think your files should not have an .f90
+# extension! The value of FCFLAGS_f90 is set in the configure script,
+# based on the fortran compiler.
+AM_FCFLAGS = -I$(top_srcdir)/fortran ${AM_CPPFLAGS} $(FCFLAGS_f90) \
+	@MOD_FLAG@$(top_builddir)/fortran
+AM_FFLAGS = ${AM_FCFLAGS}
+
+# All tests need to link to fortran and C libraries.
+LDADD = ${top_builddir}/fortran/libnetcdff.la
+ at BUILD_F03_FALSE@nf_test_SOURCES = test_get.m4 test_put.m4 nf_error.F nf_test.F	\
+ at BUILD_F03_FALSE@                  test_read.F test_write.F util.F fortlib.c tests.inc
+
+ at BUILD_F03_TRUE@nf_test_SOURCES = f03lib_f_interfaces.f90 test_get.m4 test_put.m4 nf_error.F nf_test.F	\
+ at BUILD_F03_TRUE@                  test_read.F test_write.F util.F f03lib.c tests.inc
+
+# Need access to top_srcdir
+TESTS_ENVIRONMENT = TOPSRCDIR=${abs_top_srcdir}
+ at BUILD_V2_TRUE@tst_f77_v2_SOURCES = tst_f77_v2.F
+ at BUILD_F03_FALSE@@USE_NETCDF4_TRUE at ftst_types_SOURCES = ftst_types.F fortlib.c handle_err.F
+ at BUILD_F03_TRUE@@USE_NETCDF4_TRUE at ftst_types_SOURCES = ftst_types.F f03lib_f_interfaces.f90 f03lib.c handle_err.F
+ at BUILD_F03_FALSE@@USE_NETCDF4_TRUE at ftst_types2_SOURCES = ftst_types2.F fortlib.c handle_err.F
+ at BUILD_F03_TRUE@@USE_NETCDF4_TRUE at ftst_types2_SOURCES = ftst_types2.F f03lib_f_interfaces.f90 f03lib.c handle_err.F
+ at BUILD_F03_FALSE@@USE_NETCDF4_TRUE at ftst_types3_SOURCES = ftst_types3.F fortlib.c handle_err.F
+ at BUILD_F03_TRUE@@USE_NETCDF4_TRUE at ftst_types3_SOURCES = ftst_types3.F f03lib_f_interfaces.f90 f03lib.c handle_err.F
+ at BUILD_F03_FALSE@@USE_NETCDF4_TRUE at ftst_vars_SOURCES = ftst_vars.F fortlib.c handle_err.F
+ at BUILD_F03_TRUE@@USE_NETCDF4_TRUE at ftst_vars_SOURCES = ftst_vars.F f03lib_f_interfaces.f90 f03lib.c handle_err.F
+ at BUILD_F03_FALSE@@USE_NETCDF4_TRUE at ftst_vars2_SOURCES = ftst_vars2.F fortlib.c handle_err.F
+ at BUILD_F03_TRUE@@USE_NETCDF4_TRUE at ftst_vars2_SOURCES = ftst_vars2.F f03lib_f_interfaces.f90 f03lib.c handle_err.F
+ at BUILD_F03_FALSE@@USE_NETCDF4_TRUE at ftst_vars3_SOURCES = ftst_vars3.F fortlib.c handle_err.F
+ at BUILD_F03_TRUE@@USE_NETCDF4_TRUE at ftst_vars3_SOURCES = ftst_vars3.F f03lib_f_interfaces.f90 f03lib.c handle_err.F
+ at BUILD_F03_FALSE@@USE_NETCDF4_TRUE at ftst_vars4_SOURCES = ftst_vars4.F fortlib.c handle_err.F
+ at BUILD_F03_TRUE@@USE_NETCDF4_TRUE at ftst_vars4_SOURCES = ftst_vars4.F f03lib_f_interfaces.f90 f03lib.c handle_err.F
+ at BUILD_F03_FALSE@@USE_NETCDF4_TRUE at ftst_vars5_SOURCES = ftst_vars5.F fortlib.c handle_err.F
+ at BUILD_F03_TRUE@@USE_NETCDF4_TRUE at ftst_vars5_SOURCES = ftst_vars5.F f03lib_f_interfaces.f90 f03lib.c handle_err.F
+ at BUILD_F03_FALSE@@USE_NETCDF4_TRUE at ftst_vars6_SOURCES = ftst_vars6.F fortlib.c handle_err.F
+ at BUILD_F03_TRUE@@USE_NETCDF4_TRUE at ftst_vars6_SOURCES = ftst_vars6.F f03lib_f_interfaces.f90 f03lib.c handle_err.F
+ at BUILD_F03_FALSE@@USE_NETCDF4_TRUE at ftst_groups_SOURCES = ftst_groups.F fortlib.c handle_err.F
+ at BUILD_F03_TRUE@@USE_NETCDF4_TRUE at ftst_groups_SOURCES = ftst_groups.F f03lib_f_interfaces.f90 f03lib.c handle_err.F
+ at BUILD_F03_FALSE@@USE_NETCDF4_TRUE at ftst_path_SOURCES = ftst_path.F fortlib.c handle_err.F
+ at BUILD_F03_TRUE@@USE_NETCDF4_TRUE at ftst_path_SOURCES = ftst_path.F f03lib_f_interfaces.f90 f03lib.c handle_err.F
+ at BUILD_F03_FALSE@@USE_NETCDF4_TRUE at ftst_rengrps_SOURCES = ftst_rengrps.F fortlib.c handle_err.F
+ at BUILD_F03_TRUE@@USE_NETCDF4_TRUE at ftst_rengrps_SOURCES = ftst_rengrps.F f03lib_f_interfaces.f90 f03lib.c handle_err.F
+ at USE_NETCDF4_TRUE@f90tst_vars_SOURCES = f90tst_vars.f90
+ at USE_NETCDF4_TRUE@tst_types_SOURCES = tst_types.f90
+ at USE_NETCDF4_TRUE@tst_types2_SOURCES = tst_types2.f90
+ at USE_NETCDF4_TRUE@tst_f90_nc4_SOURCES = tst_f90_nc4.f90
+ at USE_NETCDF4_TRUE@f90tst_vars_vlen_SOURCES = f90tst_vars_vlen.f90
+ at USE_NETCDF4_TRUE@f90tst_grps_SOURCES = f90tst_grps.f90
+ at USE_NETCDF4_TRUE@f90tst_path_SOURCES = f90tst_path.f90
+ at USE_NETCDF4_TRUE@f90tst_rengrps_SOURCES = f90tst_rengrps.f90
+ at USE_NETCDF4_TRUE@f90tst_fill_SOURCES = f90tst_fill.f90
+ at USE_NETCDF4_TRUE@f90tst_fill2_SOURCES = f90tst_fill2.f90
+ at USE_NETCDF4_TRUE@f90tst_vars2_SOURCES = f90tst_vars2.f90
+ at USE_NETCDF4_TRUE@f90tst_vars3_SOURCES = f90tst_vars3.f90
+ at USE_NETCDF4_TRUE@f90tst_vars4_SOURCES = f90tst_vars4.f90
+ at BUILD_V2_TRUE@@USE_NETCDF4_TRUE at ftst_v2_SOURCES = ftst_v2.F
+ at LARGE_FILE_TESTS_TRUE@@USE_NETCDF4_TRUE at tst_flarge_SOURCES = tst_flarge.f90
+ at BUILD_BENCHMARKS_TRUE@@USE_NETCDF4_TRUE at tst_io_SOURCES = tst_io.f90
+ at TEST_PARALLEL_TRUE@@USE_NETCDF4_TRUE at f90tst_parallel_SOURCES = f90tst_parallel.f90
+ at TEST_PARALLEL_TRUE@@USE_NETCDF4_TRUE at f90tst_parallel2_SOURCES = f90tst_parallel2.f90
+ at TEST_PARALLEL_TRUE@@USE_NETCDF4_TRUE at f90tst_parallel3_SOURCES = f90tst_parallel3.f90
+ at TEST_PARALLEL_TRUE@@USE_NETCDF4_TRUE at f90tst_nc4_par_SOURCES = f90tst_nc4_par.f90
+ at TEST_PARALLEL_TRUE@@USE_NETCDF4_TRUE at ftst_parallel_SOURCES = ftst_parallel.F
+ at TEST_PARALLEL_TRUE@@USE_NETCDF4_TRUE at ftst_parallel_nasa_SOURCES = ftst_parallel_nasa.F
+ at BUILD_F03_FALSE@@BUILD_V2_TRUE at ftest_SOURCES = ftest.F fortlib.c
+ at BUILD_F03_TRUE@@BUILD_V2_TRUE at ftest_SOURCES = ftest.F f03lib.c
+tst_f90_SOURCES = tst_f90.f90
+
+# test_get.F and test_put.f need to be distributed, so that the user
+# need not have m4. fills.nc is used by test program ftest.
+EXTRA_DIST = test_get.F test_put.F fills.cdl create_fills.sh	\
+             run_f90_par_test.sh run_f77_par_test.sh ref_fills.nc \
+			CMakeLists.txt
+
+
+# Cleaning up files created during the process.
+CLEANFILES = scratch.nc test.nc copy.nc fills.nc tst_*.nc ftst_*.nc f90tst_*.nc temp.tmp
+MAINTAINERCLEANFILES = test_get.F test_put.F
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .F .c .f .f90 .lo .log .m4 .o .obj .test .test$(EXEEXT) .trs
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign nf_test/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign nf_test/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+
+clean-checkPROGRAMS:
+	@list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \
+	echo " rm -f" $$list; \
+	rm -f $$list || exit $$?; \
+	test -n "$(EXEEXT)" || exit 0; \
+	list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
+	echo " rm -f" $$list; \
+	rm -f $$list
+
+f90tst_fill$(EXEEXT): $(f90tst_fill_OBJECTS) $(f90tst_fill_DEPENDENCIES) $(EXTRA_f90tst_fill_DEPENDENCIES) 
+	@rm -f f90tst_fill$(EXEEXT)
+	$(AM_V_FCLD)$(FCLINK) $(f90tst_fill_OBJECTS) $(f90tst_fill_LDADD) $(LIBS)
+
+f90tst_fill2$(EXEEXT): $(f90tst_fill2_OBJECTS) $(f90tst_fill2_DEPENDENCIES) $(EXTRA_f90tst_fill2_DEPENDENCIES) 
+	@rm -f f90tst_fill2$(EXEEXT)
+	$(AM_V_FCLD)$(FCLINK) $(f90tst_fill2_OBJECTS) $(f90tst_fill2_LDADD) $(LIBS)
+
+f90tst_grps$(EXEEXT): $(f90tst_grps_OBJECTS) $(f90tst_grps_DEPENDENCIES) $(EXTRA_f90tst_grps_DEPENDENCIES) 
+	@rm -f f90tst_grps$(EXEEXT)
+	$(AM_V_FCLD)$(FCLINK) $(f90tst_grps_OBJECTS) $(f90tst_grps_LDADD) $(LIBS)
+
+f90tst_nc4_par$(EXEEXT): $(f90tst_nc4_par_OBJECTS) $(f90tst_nc4_par_DEPENDENCIES) $(EXTRA_f90tst_nc4_par_DEPENDENCIES) 
+	@rm -f f90tst_nc4_par$(EXEEXT)
+	$(AM_V_FCLD)$(FCLINK) $(f90tst_nc4_par_OBJECTS) $(f90tst_nc4_par_LDADD) $(LIBS)
+
+f90tst_parallel$(EXEEXT): $(f90tst_parallel_OBJECTS) $(f90tst_parallel_DEPENDENCIES) $(EXTRA_f90tst_parallel_DEPENDENCIES) 
+	@rm -f f90tst_parallel$(EXEEXT)
+	$(AM_V_FCLD)$(FCLINK) $(f90tst_parallel_OBJECTS) $(f90tst_parallel_LDADD) $(LIBS)
+
+f90tst_parallel2$(EXEEXT): $(f90tst_parallel2_OBJECTS) $(f90tst_parallel2_DEPENDENCIES) $(EXTRA_f90tst_parallel2_DEPENDENCIES) 
+	@rm -f f90tst_parallel2$(EXEEXT)
+	$(AM_V_FCLD)$(FCLINK) $(f90tst_parallel2_OBJECTS) $(f90tst_parallel2_LDADD) $(LIBS)
+
+f90tst_parallel3$(EXEEXT): $(f90tst_parallel3_OBJECTS) $(f90tst_parallel3_DEPENDENCIES) $(EXTRA_f90tst_parallel3_DEPENDENCIES) 
+	@rm -f f90tst_parallel3$(EXEEXT)
+	$(AM_V_FCLD)$(FCLINK) $(f90tst_parallel3_OBJECTS) $(f90tst_parallel3_LDADD) $(LIBS)
+
+f90tst_path$(EXEEXT): $(f90tst_path_OBJECTS) $(f90tst_path_DEPENDENCIES) $(EXTRA_f90tst_path_DEPENDENCIES) 
+	@rm -f f90tst_path$(EXEEXT)
+	$(AM_V_FCLD)$(FCLINK) $(f90tst_path_OBJECTS) $(f90tst_path_LDADD) $(LIBS)
+
+f90tst_rengrps$(EXEEXT): $(f90tst_rengrps_OBJECTS) $(f90tst_rengrps_DEPENDENCIES) $(EXTRA_f90tst_rengrps_DEPENDENCIES) 
+	@rm -f f90tst_rengrps$(EXEEXT)
+	$(AM_V_FCLD)$(FCLINK) $(f90tst_rengrps_OBJECTS) $(f90tst_rengrps_LDADD) $(LIBS)
+
+f90tst_vars$(EXEEXT): $(f90tst_vars_OBJECTS) $(f90tst_vars_DEPENDENCIES) $(EXTRA_f90tst_vars_DEPENDENCIES) 
+	@rm -f f90tst_vars$(EXEEXT)
+	$(AM_V_FCLD)$(FCLINK) $(f90tst_vars_OBJECTS) $(f90tst_vars_LDADD) $(LIBS)
+
+f90tst_vars2$(EXEEXT): $(f90tst_vars2_OBJECTS) $(f90tst_vars2_DEPENDENCIES) $(EXTRA_f90tst_vars2_DEPENDENCIES) 
+	@rm -f f90tst_vars2$(EXEEXT)
+	$(AM_V_FCLD)$(FCLINK) $(f90tst_vars2_OBJECTS) $(f90tst_vars2_LDADD) $(LIBS)
+
+f90tst_vars3$(EXEEXT): $(f90tst_vars3_OBJECTS) $(f90tst_vars3_DEPENDENCIES) $(EXTRA_f90tst_vars3_DEPENDENCIES) 
+	@rm -f f90tst_vars3$(EXEEXT)
+	$(AM_V_FCLD)$(FCLINK) $(f90tst_vars3_OBJECTS) $(f90tst_vars3_LDADD) $(LIBS)
+
+f90tst_vars4$(EXEEXT): $(f90tst_vars4_OBJECTS) $(f90tst_vars4_DEPENDENCIES) $(EXTRA_f90tst_vars4_DEPENDENCIES) 
+	@rm -f f90tst_vars4$(EXEEXT)
+	$(AM_V_FCLD)$(FCLINK) $(f90tst_vars4_OBJECTS) $(f90tst_vars4_LDADD) $(LIBS)
+
+f90tst_vars_vlen$(EXEEXT): $(f90tst_vars_vlen_OBJECTS) $(f90tst_vars_vlen_DEPENDENCIES) $(EXTRA_f90tst_vars_vlen_DEPENDENCIES) 
+	@rm -f f90tst_vars_vlen$(EXEEXT)
+	$(AM_V_FCLD)$(FCLINK) $(f90tst_vars_vlen_OBJECTS) $(f90tst_vars_vlen_LDADD) $(LIBS)
+
+ftest$(EXEEXT): $(ftest_OBJECTS) $(ftest_DEPENDENCIES) $(EXTRA_ftest_DEPENDENCIES) 
+	@rm -f ftest$(EXEEXT)
+	$(AM_V_F77LD)$(F77LINK) $(ftest_OBJECTS) $(ftest_LDADD) $(LIBS)
+
+ftst_groups$(EXEEXT): $(ftst_groups_OBJECTS) $(ftst_groups_DEPENDENCIES) $(EXTRA_ftst_groups_DEPENDENCIES) 
+	@rm -f ftst_groups$(EXEEXT)
+	$(AM_V_F77LD)$(F77LINK) $(ftst_groups_OBJECTS) $(ftst_groups_LDADD) $(LIBS)
+
+ftst_parallel$(EXEEXT): $(ftst_parallel_OBJECTS) $(ftst_parallel_DEPENDENCIES) $(EXTRA_ftst_parallel_DEPENDENCIES) 
+	@rm -f ftst_parallel$(EXEEXT)
+	$(AM_V_F77LD)$(F77LINK) $(ftst_parallel_OBJECTS) $(ftst_parallel_LDADD) $(LIBS)
+
+ftst_parallel_nasa$(EXEEXT): $(ftst_parallel_nasa_OBJECTS) $(ftst_parallel_nasa_DEPENDENCIES) $(EXTRA_ftst_parallel_nasa_DEPENDENCIES) 
+	@rm -f ftst_parallel_nasa$(EXEEXT)
+	$(AM_V_F77LD)$(F77LINK) $(ftst_parallel_nasa_OBJECTS) $(ftst_parallel_nasa_LDADD) $(LIBS)
+
+ftst_path$(EXEEXT): $(ftst_path_OBJECTS) $(ftst_path_DEPENDENCIES) $(EXTRA_ftst_path_DEPENDENCIES) 
+	@rm -f ftst_path$(EXEEXT)
+	$(AM_V_F77LD)$(F77LINK) $(ftst_path_OBJECTS) $(ftst_path_LDADD) $(LIBS)
+
+ftst_rengrps$(EXEEXT): $(ftst_rengrps_OBJECTS) $(ftst_rengrps_DEPENDENCIES) $(EXTRA_ftst_rengrps_DEPENDENCIES) 
+	@rm -f ftst_rengrps$(EXEEXT)
+	$(AM_V_F77LD)$(F77LINK) $(ftst_rengrps_OBJECTS) $(ftst_rengrps_LDADD) $(LIBS)
+
+ftst_types$(EXEEXT): $(ftst_types_OBJECTS) $(ftst_types_DEPENDENCIES) $(EXTRA_ftst_types_DEPENDENCIES) 
+	@rm -f ftst_types$(EXEEXT)
+	$(AM_V_F77LD)$(F77LINK) $(ftst_types_OBJECTS) $(ftst_types_LDADD) $(LIBS)
+
+ftst_types2$(EXEEXT): $(ftst_types2_OBJECTS) $(ftst_types2_DEPENDENCIES) $(EXTRA_ftst_types2_DEPENDENCIES) 
+	@rm -f ftst_types2$(EXEEXT)
+	$(AM_V_F77LD)$(F77LINK) $(ftst_types2_OBJECTS) $(ftst_types2_LDADD) $(LIBS)
+
+ftst_types3$(EXEEXT): $(ftst_types3_OBJECTS) $(ftst_types3_DEPENDENCIES) $(EXTRA_ftst_types3_DEPENDENCIES) 
+	@rm -f ftst_types3$(EXEEXT)
+	$(AM_V_F77LD)$(F77LINK) $(ftst_types3_OBJECTS) $(ftst_types3_LDADD) $(LIBS)
+
+ftst_v2$(EXEEXT): $(ftst_v2_OBJECTS) $(ftst_v2_DEPENDENCIES) $(EXTRA_ftst_v2_DEPENDENCIES) 
+	@rm -f ftst_v2$(EXEEXT)
+	$(AM_V_F77LD)$(F77LINK) $(ftst_v2_OBJECTS) $(ftst_v2_LDADD) $(LIBS)
+
+ftst_vars$(EXEEXT): $(ftst_vars_OBJECTS) $(ftst_vars_DEPENDENCIES) $(EXTRA_ftst_vars_DEPENDENCIES) 
+	@rm -f ftst_vars$(EXEEXT)
+	$(AM_V_F77LD)$(F77LINK) $(ftst_vars_OBJECTS) $(ftst_vars_LDADD) $(LIBS)
+
+ftst_vars2$(EXEEXT): $(ftst_vars2_OBJECTS) $(ftst_vars2_DEPENDENCIES) $(EXTRA_ftst_vars2_DEPENDENCIES) 
+	@rm -f ftst_vars2$(EXEEXT)
+	$(AM_V_F77LD)$(F77LINK) $(ftst_vars2_OBJECTS) $(ftst_vars2_LDADD) $(LIBS)
+
+ftst_vars3$(EXEEXT): $(ftst_vars3_OBJECTS) $(ftst_vars3_DEPENDENCIES) $(EXTRA_ftst_vars3_DEPENDENCIES) 
+	@rm -f ftst_vars3$(EXEEXT)
+	$(AM_V_F77LD)$(F77LINK) $(ftst_vars3_OBJECTS) $(ftst_vars3_LDADD) $(LIBS)
+
+ftst_vars4$(EXEEXT): $(ftst_vars4_OBJECTS) $(ftst_vars4_DEPENDENCIES) $(EXTRA_ftst_vars4_DEPENDENCIES) 
+	@rm -f ftst_vars4$(EXEEXT)
+	$(AM_V_F77LD)$(F77LINK) $(ftst_vars4_OBJECTS) $(ftst_vars4_LDADD) $(LIBS)
+
+ftst_vars5$(EXEEXT): $(ftst_vars5_OBJECTS) $(ftst_vars5_DEPENDENCIES) $(EXTRA_ftst_vars5_DEPENDENCIES) 
+	@rm -f ftst_vars5$(EXEEXT)
+	$(AM_V_F77LD)$(F77LINK) $(ftst_vars5_OBJECTS) $(ftst_vars5_LDADD) $(LIBS)
+
+ftst_vars6$(EXEEXT): $(ftst_vars6_OBJECTS) $(ftst_vars6_DEPENDENCIES) $(EXTRA_ftst_vars6_DEPENDENCIES) 
+	@rm -f ftst_vars6$(EXEEXT)
+	$(AM_V_F77LD)$(F77LINK) $(ftst_vars6_OBJECTS) $(ftst_vars6_LDADD) $(LIBS)
+
+nf_test$(EXEEXT): $(nf_test_OBJECTS) $(nf_test_DEPENDENCIES) $(EXTRA_nf_test_DEPENDENCIES) 
+	@rm -f nf_test$(EXEEXT)
+	$(AM_V_F77LD)$(F77LINK) $(nf_test_OBJECTS) $(nf_test_LDADD) $(LIBS)
+
+tst_f77_v2$(EXEEXT): $(tst_f77_v2_OBJECTS) $(tst_f77_v2_DEPENDENCIES) $(EXTRA_tst_f77_v2_DEPENDENCIES) 
+	@rm -f tst_f77_v2$(EXEEXT)
+	$(AM_V_F77LD)$(F77LINK) $(tst_f77_v2_OBJECTS) $(tst_f77_v2_LDADD) $(LIBS)
+
+tst_f90$(EXEEXT): $(tst_f90_OBJECTS) $(tst_f90_DEPENDENCIES) $(EXTRA_tst_f90_DEPENDENCIES) 
+	@rm -f tst_f90$(EXEEXT)
+	$(AM_V_FCLD)$(FCLINK) $(tst_f90_OBJECTS) $(tst_f90_LDADD) $(LIBS)
+
+tst_f90_nc4$(EXEEXT): $(tst_f90_nc4_OBJECTS) $(tst_f90_nc4_DEPENDENCIES) $(EXTRA_tst_f90_nc4_DEPENDENCIES) 
+	@rm -f tst_f90_nc4$(EXEEXT)
+	$(AM_V_FCLD)$(FCLINK) $(tst_f90_nc4_OBJECTS) $(tst_f90_nc4_LDADD) $(LIBS)
+
+tst_flarge$(EXEEXT): $(tst_flarge_OBJECTS) $(tst_flarge_DEPENDENCIES) $(EXTRA_tst_flarge_DEPENDENCIES) 
+	@rm -f tst_flarge$(EXEEXT)
+	$(AM_V_FCLD)$(FCLINK) $(tst_flarge_OBJECTS) $(tst_flarge_LDADD) $(LIBS)
+
+tst_io$(EXEEXT): $(tst_io_OBJECTS) $(tst_io_DEPENDENCIES) $(EXTRA_tst_io_DEPENDENCIES) 
+	@rm -f tst_io$(EXEEXT)
+	$(AM_V_FCLD)$(FCLINK) $(tst_io_OBJECTS) $(tst_io_LDADD) $(LIBS)
+
+tst_types$(EXEEXT): $(tst_types_OBJECTS) $(tst_types_DEPENDENCIES) $(EXTRA_tst_types_DEPENDENCIES) 
+	@rm -f tst_types$(EXEEXT)
+	$(AM_V_FCLD)$(FCLINK) $(tst_types_OBJECTS) $(tst_types_LDADD) $(LIBS)
+
+tst_types2$(EXEEXT): $(tst_types2_OBJECTS) $(tst_types2_DEPENDENCIES) $(EXTRA_tst_types2_DEPENDENCIES) 
+	@rm -f tst_types2$(EXEEXT)
+	$(AM_V_FCLD)$(FCLINK) $(tst_types2_OBJECTS) $(tst_types2_LDADD) $(LIBS)
+
+mostlyclean-compile:
+	-rm -f *.$(OBJEXT)
+
+distclean-compile:
+	-rm -f *.tab.c
+
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/f03lib.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/fortlib.Po at am__quote@
+
+.F.o:
+	$(AM_V_PPF77)$(PPF77COMPILE) -c -o $@ $<
+
+.F.obj:
+	$(AM_V_PPF77)$(PPF77COMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.F.lo:
+	$(AM_V_PPF77)$(LTPPF77COMPILE) -c -o $@ $<
+.F.f:
+	$(F77COMPILE) -F $<
+
+.c.o:
+ at am__fastdepCC_TRUE@	$(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\
+ at am__fastdepCC_TRUE@	$(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+ at am__fastdepCC_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.Po
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(COMPILE) -c -o $@ $<
+
+.c.obj:
+ at am__fastdepCC_TRUE@	$(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\
+ at am__fastdepCC_TRUE@	$(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\
+ at am__fastdepCC_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.Po
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.c.lo:
+ at am__fastdepCC_TRUE@	$(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\
+ at am__fastdepCC_TRUE@	$(LTCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+ at am__fastdepCC_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LTCOMPILE) -c -o $@ $<
+
+.f90.o:
+	$(AM_V_FC)$(FCCOMPILE) -c -o $@ $(FCFLAGS_f90) $<
+
+.f90.obj:
+	$(AM_V_FC)$(FCCOMPILE) -c -o $@ $(FCFLAGS_f90) `$(CYGPATH_W) '$<'`
+
+.f90.lo:
+	$(AM_V_FC)$(LTFCCOMPILE) -c -o $@ $(FCFLAGS_f90) $<
+
+mostlyclean-libtool:
+	-rm -f *.lo
+
+clean-libtool:
+	-rm -rf .libs _libs
+
+ID: $(am__tagged_files)
+	$(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-am
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+	set x; \
+	here=`pwd`; \
+	$(am__define_uniq_tagged_files); \
+	shift; \
+	if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+	  test -n "$$unique" || unique=$$empty_fix; \
+	  if test $$# -gt 0; then \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      "$$@" $$unique; \
+	  else \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      $$unique; \
+	  fi; \
+	fi
+ctags: ctags-am
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+	$(am__define_uniq_tagged_files); \
+	test -z "$(CTAGS_ARGS)$$unique" \
+	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+	     $$unique
+
+GTAGS:
+	here=`$(am__cd) $(top_builddir) && pwd` \
+	  && $(am__cd) $(top_srcdir) \
+	  && gtags -i $(GTAGS_ARGS) "$$here"
+cscopelist: cscopelist-am
+
+cscopelist-am: $(am__tagged_files)
+	list='$(am__tagged_files)'; \
+	case "$(srcdir)" in \
+	  [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+	  *) sdir=$(subdir)/$(srcdir) ;; \
+	esac; \
+	for i in $$list; do \
+	  if test -f "$$i"; then \
+	    echo "$(subdir)/$$i"; \
+	  else \
+	    echo "$$sdir/$$i"; \
+	  fi; \
+	done >> $(top_builddir)/cscope.files
+
+distclean-tags:
+	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+# Recover from deleted '.trs' file; this should ensure that
+# "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create
+# both 'foo.log' and 'foo.trs'.  Break the recipe in two subshells
+# to avoid problems with "make -n".
+.log.trs:
+	rm -f $< $@
+	$(MAKE) $(AM_MAKEFLAGS) $<
+
+# Leading 'am--fnord' is there to ensure the list of targets does not
+# expand to empty, as could happen e.g. with make check TESTS=''.
+am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck)
+am--force-recheck:
+	@:
+
+$(TEST_SUITE_LOG): $(TEST_LOGS)
+	@$(am__set_TESTS_bases); \
+	am__f_ok () { test -f "$$1" && test -r "$$1"; }; \
+	redo_bases=`for i in $$bases; do \
+	              am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \
+	            done`; \
+	if test -n "$$redo_bases"; then \
+	  redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \
+	  redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \
+	  if $(am__make_dryrun); then :; else \
+	    rm -f $$redo_logs && rm -f $$redo_results || exit 1; \
+	  fi; \
+	fi; \
+	if test -n "$$am__remaking_logs"; then \
+	  echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \
+	       "recursion detected" >&2; \
+	else \
+	  am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \
+	fi; \
+	if $(am__make_dryrun); then :; else \
+	  st=0;  \
+	  errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \
+	  for i in $$redo_bases; do \
+	    test -f $$i.trs && test -r $$i.trs \
+	      || { echo "$$errmsg $$i.trs" >&2; st=1; }; \
+	    test -f $$i.log && test -r $$i.log \
+	      || { echo "$$errmsg $$i.log" >&2; st=1; }; \
+	  done; \
+	  test $$st -eq 0 || exit 1; \
+	fi
+	@$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \
+	ws='[ 	]'; \
+	results=`for b in $$bases; do echo $$b.trs; done`; \
+	test -n "$$results" || results=/dev/null; \
+	all=`  grep "^$$ws*:test-result:"           $$results | wc -l`; \
+	pass=` grep "^$$ws*:test-result:$$ws*PASS"  $$results | wc -l`; \
+	fail=` grep "^$$ws*:test-result:$$ws*FAIL"  $$results | wc -l`; \
+	skip=` grep "^$$ws*:test-result:$$ws*SKIP"  $$results | wc -l`; \
+	xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \
+	xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \
+	error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \
+	if test `expr $$fail + $$xpass + $$error` -eq 0; then \
+	  success=true; \
+	else \
+	  success=false; \
+	fi; \
+	br='==================='; br=$$br$$br$$br$$br; \
+	result_count () \
+	{ \
+	    if test x"$$1" = x"--maybe-color"; then \
+	      maybe_colorize=yes; \
+	    elif test x"$$1" = x"--no-color"; then \
+	      maybe_colorize=no; \
+	    else \
+	      echo "$@: invalid 'result_count' usage" >&2; exit 4; \
+	    fi; \
+	    shift; \
+	    desc=$$1 count=$$2; \
+	    if test $$maybe_colorize = yes && test $$count -gt 0; then \
+	      color_start=$$3 color_end=$$std; \
+	    else \
+	      color_start= color_end=; \
+	    fi; \
+	    echo "$${color_start}# $$desc $$count$${color_end}"; \
+	}; \
+	create_testsuite_report () \
+	{ \
+	  result_count $$1 "TOTAL:" $$all   "$$brg"; \
+	  result_count $$1 "PASS: " $$pass  "$$grn"; \
+	  result_count $$1 "SKIP: " $$skip  "$$blu"; \
+	  result_count $$1 "XFAIL:" $$xfail "$$lgn"; \
+	  result_count $$1 "FAIL: " $$fail  "$$red"; \
+	  result_count $$1 "XPASS:" $$xpass "$$red"; \
+	  result_count $$1 "ERROR:" $$error "$$mgn"; \
+	}; \
+	{								\
+	  echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" |	\
+	    $(am__rst_title);						\
+	  create_testsuite_report --no-color;				\
+	  echo;								\
+	  echo ".. contents:: :depth: 2";				\
+	  echo;								\
+	  for b in $$bases; do echo $$b; done				\
+	    | $(am__create_global_log);					\
+	} >$(TEST_SUITE_LOG).tmp || exit 1;				\
+	mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG);			\
+	if $$success; then						\
+	  col="$$grn";							\
+	 else								\
+	  col="$$red";							\
+	  test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG);		\
+	fi;								\
+	echo "$${col}$$br$${std}"; 					\
+	echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}";	\
+	echo "$${col}$$br$${std}"; 					\
+	create_testsuite_report --maybe-color;				\
+	echo "$$col$$br$$std";						\
+	if $$success; then :; else					\
+	  echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}";		\
+	  if test -n "$(PACKAGE_BUGREPORT)"; then			\
+	    echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}";	\
+	  fi;								\
+	  echo "$$col$$br$$std";					\
+	fi;								\
+	$$success || exit 1
+
+check-TESTS:
+	@list='$(RECHECK_LOGS)';           test -z "$$list" || rm -f $$list
+	@list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list
+	@test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+	@set +e; $(am__set_TESTS_bases); \
+	log_list=`for i in $$bases; do echo $$i.log; done`; \
+	trs_list=`for i in $$bases; do echo $$i.trs; done`; \
+	log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \
+	$(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \
+	exit $$?;
+recheck: all $(check_PROGRAMS)
+	@test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+	@set +e; $(am__set_TESTS_bases); \
+	bases=`for i in $$bases; do echo $$i; done \
+	         | $(am__list_recheck_tests)` || exit 1; \
+	log_list=`for i in $$bases; do echo $$i.log; done`; \
+	log_list=`echo $$log_list`; \
+	$(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \
+	        am__force_recheck=am--force-recheck \
+	        TEST_LOGS="$$log_list"; \
+	exit $$?
+nf_test.log: nf_test$(EXEEXT)
+	@p='nf_test$(EXEEXT)'; \
+	b='nf_test'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+create_fills.sh.log: create_fills.sh
+	@p='create_fills.sh'; \
+	b='create_fills.sh'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+tst_f77_v2.log: tst_f77_v2$(EXEEXT)
+	@p='tst_f77_v2$(EXEEXT)'; \
+	b='tst_f77_v2'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+ftst_vars.log: ftst_vars$(EXEEXT)
+	@p='ftst_vars$(EXEEXT)'; \
+	b='ftst_vars'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+ftst_vars2.log: ftst_vars2$(EXEEXT)
+	@p='ftst_vars2$(EXEEXT)'; \
+	b='ftst_vars2'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+ftst_vars3.log: ftst_vars3$(EXEEXT)
+	@p='ftst_vars3$(EXEEXT)'; \
+	b='ftst_vars3'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+ftst_vars4.log: ftst_vars4$(EXEEXT)
+	@p='ftst_vars4$(EXEEXT)'; \
+	b='ftst_vars4'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+ftst_vars5.log: ftst_vars5$(EXEEXT)
+	@p='ftst_vars5$(EXEEXT)'; \
+	b='ftst_vars5'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+ftst_vars6.log: ftst_vars6$(EXEEXT)
+	@p='ftst_vars6$(EXEEXT)'; \
+	b='ftst_vars6'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+ftst_types.log: ftst_types$(EXEEXT)
+	@p='ftst_types$(EXEEXT)'; \
+	b='ftst_types'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+ftst_types2.log: ftst_types2$(EXEEXT)
+	@p='ftst_types2$(EXEEXT)'; \
+	b='ftst_types2'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+ftst_types3.log: ftst_types3$(EXEEXT)
+	@p='ftst_types3$(EXEEXT)'; \
+	b='ftst_types3'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+ftst_groups.log: ftst_groups$(EXEEXT)
+	@p='ftst_groups$(EXEEXT)'; \
+	b='ftst_groups'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+ftst_path.log: ftst_path$(EXEEXT)
+	@p='ftst_path$(EXEEXT)'; \
+	b='ftst_path'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+ftst_rengrps.log: ftst_rengrps$(EXEEXT)
+	@p='ftst_rengrps$(EXEEXT)'; \
+	b='ftst_rengrps'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+f90tst_vars.log: f90tst_vars$(EXEEXT)
+	@p='f90tst_vars$(EXEEXT)'; \
+	b='f90tst_vars'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+tst_types.log: tst_types$(EXEEXT)
+	@p='tst_types$(EXEEXT)'; \
+	b='tst_types'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+tst_types2.log: tst_types2$(EXEEXT)
+	@p='tst_types2$(EXEEXT)'; \
+	b='tst_types2'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+f90tst_vars_vlen.log: f90tst_vars_vlen$(EXEEXT)
+	@p='f90tst_vars_vlen$(EXEEXT)'; \
+	b='f90tst_vars_vlen'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+tst_f90_nc4.log: tst_f90_nc4$(EXEEXT)
+	@p='tst_f90_nc4$(EXEEXT)'; \
+	b='tst_f90_nc4'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+f90tst_grps.log: f90tst_grps$(EXEEXT)
+	@p='f90tst_grps$(EXEEXT)'; \
+	b='f90tst_grps'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+f90tst_fill.log: f90tst_fill$(EXEEXT)
+	@p='f90tst_fill$(EXEEXT)'; \
+	b='f90tst_fill'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+f90tst_fill2.log: f90tst_fill2$(EXEEXT)
+	@p='f90tst_fill2$(EXEEXT)'; \
+	b='f90tst_fill2'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+f90tst_vars3.log: f90tst_vars3$(EXEEXT)
+	@p='f90tst_vars3$(EXEEXT)'; \
+	b='f90tst_vars3'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+f90tst_vars4.log: f90tst_vars4$(EXEEXT)
+	@p='f90tst_vars4$(EXEEXT)'; \
+	b='f90tst_vars4'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+f90tst_vars2.log: f90tst_vars2$(EXEEXT)
+	@p='f90tst_vars2$(EXEEXT)'; \
+	b='f90tst_vars2'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+f90tst_path.log: f90tst_path$(EXEEXT)
+	@p='f90tst_path$(EXEEXT)'; \
+	b='f90tst_path'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+f90tst_rengrps.log: f90tst_rengrps$(EXEEXT)
+	@p='f90tst_rengrps$(EXEEXT)'; \
+	b='f90tst_rengrps'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+ftst_v2.log: ftst_v2$(EXEEXT)
+	@p='ftst_v2$(EXEEXT)'; \
+	b='ftst_v2'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+tst_flarge.log: tst_flarge$(EXEEXT)
+	@p='tst_flarge$(EXEEXT)'; \
+	b='tst_flarge'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+tst_io.log: tst_io$(EXEEXT)
+	@p='tst_io$(EXEEXT)'; \
+	b='tst_io'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+run_f90_par_test.sh.log: run_f90_par_test.sh
+	@p='run_f90_par_test.sh'; \
+	b='run_f90_par_test.sh'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+run_f77_par_test.sh.log: run_f77_par_test.sh
+	@p='run_f77_par_test.sh'; \
+	b='run_f77_par_test.sh'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+ftest.log: ftest$(EXEEXT)
+	@p='ftest$(EXEEXT)'; \
+	b='ftest'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+tst_f90.log: tst_f90$(EXEEXT)
+	@p='tst_f90$(EXEEXT)'; \
+	b='tst_f90'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+.test.log:
+	@p='$<'; \
+	$(am__set_b); \
+	$(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+ at am__EXEEXT_TRUE@.test$(EXEEXT).log:
+ at am__EXEEXT_TRUE@	@p='$<'; \
+ at am__EXEEXT_TRUE@	$(am__set_b); \
+ at am__EXEEXT_TRUE@	$(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \
+ at am__EXEEXT_TRUE@	--log-file $$b.log --trs-file $$b.trs \
+ at am__EXEEXT_TRUE@	$(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \
+ at am__EXEEXT_TRUE@	"$$tst" $(AM_TESTS_FD_REDIRECT)
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+	  else \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
+	    || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+	$(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS)
+	$(MAKE) $(AM_MAKEFLAGS) check-TESTS
+check: check-am
+all-am: Makefile
+installdirs:
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	if test -z '$(STRIP)'; then \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	      install; \
+	else \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	    "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+	fi
+mostlyclean-generic:
+	-test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS)
+	-test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs)
+	-test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+
+clean-generic:
+	-test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+	-test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES)
+clean: clean-am
+
+clean-am: clean-checkPROGRAMS clean-generic clean-libtool \
+	mostlyclean-am
+
+distclean: distclean-am
+	-rm -rf ./$(DEPDIR)
+	-rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+	distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+	-rm -rf ./$(DEPDIR)
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+	mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am:
+
+.MAKE: check-am install-am install-strip
+
+.PHONY: CTAGS GTAGS TAGS all all-am check check-TESTS check-am clean \
+	clean-checkPROGRAMS clean-generic clean-libtool cscopelist-am \
+	ctags ctags-am distclean distclean-compile distclean-generic \
+	distclean-libtool distclean-tags distdir dvi dvi-am html \
+	html-am info info-am install install-am install-data \
+	install-data-am install-dvi install-dvi-am install-exec \
+	install-exec-am install-html install-html-am install-info \
+	install-info-am install-man install-pdf install-pdf-am \
+	install-ps install-ps-am install-strip installcheck \
+	installcheck-am installdirs maintainer-clean \
+	maintainer-clean-generic mostlyclean mostlyclean-compile \
+	mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+	recheck tags tags-am uninstall uninstall-am
+
+
+# Tell make how to turn .m4 files into .F files.
+.m4.F:
+	m4 $(M4FLAGS) $< >$@
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/nf_test/create_fills.sh b/nf_test/create_fills.sh
new file mode 100755
index 0000000..b1ba43c
--- /dev/null
+++ b/nf_test/create_fills.sh
@@ -0,0 +1,11 @@
+#!/bin/sh
+# This shell script which creates the fill.nc file from fill.cdl.
+# $Id: create_fills.sh,v 1.2 2009/01/25 14:33:45 ed Exp $
+
+echo
+echo "*** Testing creating file with fill values."
+set -e
+#../ncgen/ncgen -b $srcdir/fills.cdl
+cp ${TOPSRCDIR}/nf_test/ref_fills.nc ./fills.nc
+echo "*** SUCCESS!"
+exit 0
diff --git a/nf_test/f03lib.c b/nf_test/f03lib.c
new file mode 100755
index 0000000..d7c5d37
--- /dev/null
+++ b/nf_test/f03lib.c
@@ -0,0 +1,116 @@
+/*
+ * $Id: fort03.c,v 1.9 2007/07/28 13:14:00 rick Exp $
+ *
+ * This file contains support functions for FORTRAN code.  For example,
+ * under HP-UX A.09.05, the U77 library doesn't contain the exit()
+ * routine -- so we create one here.
+ */
+
+/*
+   Modified fortlib.c - We remove all cfortran.h stuff to make 
+   compiling easier. Also functions are modified to be extern
+   and not static so FORTRAN can see them
+
+   Version 1. July  2007 first vesion 
+   Version 2. April 2009 - modified for netCDF 4.0.1
+      
+   Modified by: Richard Weed, Ph.D
+   Center for Advanced Vehicular Systems
+   Misssissippi State University
+   rweed at .cavs.msstate.edu
+*/
+
+#include <stdlib.h>
+#include <limits.h>
+#include <float.h>
+
+
+extern double
+myrand(int iflag)
+{
+    if (iflag != 0)
+	srand(iflag);
+
+    /*
+     * Return a pseudo-random value between 0.0 and 1.0.
+     *
+     * We don't use RAND_MAX here because not all compilation
+     * environments define it (e.g. gcc(1) under SunOS 4.1.3).
+     */
+    return (rand() % 32768) / 32767.0;
+}
+
+
+extern int
+myshift(int value, int amount)
+{
+    if (amount < 0)
+	value >>= -amount;
+    else
+    if (amount > 0)
+	value <<= amount;
+    return value;
+}
+
+#include <signal.h>
+extern void
+nc_ignorefpe(int doit)
+{
+	if(doit)
+		(void) signal(SIGFPE, SIG_IGN);
+}
+
+extern double cmax_uchar()
+{
+    return UCHAR_MAX;
+}
+
+extern double cmin_schar()
+{
+    return SCHAR_MIN;
+}
+
+extern double cmax_schar()
+{
+    return SCHAR_MAX;
+}
+
+extern double cmin_short()
+{
+    return SHRT_MIN;
+}
+
+extern double cmax_short()
+{
+    return SHRT_MAX;
+}
+
+extern double cmin_int()
+{
+    return INT_MIN;
+}
+
+extern double cmax_int()
+{
+    return INT_MAX;
+}
+
+extern double cmin_long()
+{
+    return LONG_MIN;
+}
+
+extern double cmax_long()
+{
+    return LONG_MAX;
+}
+
+extern double cmax_float()
+{
+    return FLT_MAX;
+}
+
+extern double cmax_double()
+{
+    return DBL_MAX;
+}
diff --git a/nf_test/f03lib_f_interfaces.f90 b/nf_test/f03lib_f_interfaces.f90
new file mode 100755
index 0000000..fad5c68
--- /dev/null
+++ b/nf_test/f03lib_f_interfaces.f90
@@ -0,0 +1,349 @@
+! FORTRAN interfaces to the C utilties defined in fortlib.c
+!
+! Written by: Richard Weed, Ph.D
+!             Center for Advanced Vehicular Systems
+!             Mississippi State University
+!             rweed at cavs.msstate.edu
+
+
+
+
+! License (and other Lawyer Language)
+ 
+! This software is released under the Apache 2.0 Open Source License. The
+! full text of the License can be viewed at :
+!
+!   http:www.apache.org/licenses/LICENSE-2.0.html
+!
+! The author grants to the University Corporation for Atmospheric Research
+! (UCAR), Boulder, CO, USA the right to revise and extend the software
+! without restriction. However, the author retains all copyrights and
+! intellectual property rights explicitly stated in or implied by the
+! Apache license
+
+! Version 1.  June 2006
+!             Unchanged for netCDF 4.1.1
+
+!-------------------------------  udexit --------------------------------------
+ Subroutine udexit(status)
+!
+ USE ISO_C_BINDING, ONLY: C_INT
+ Implicit NONE
+
+ 
+ Integer, Intent(IN) :: status
+ Integer(KIND=C_INT) :: cstatus
+ Interface
+  Subroutine exit(status) BIND(C)
+  USE ISO_C_BINDING, ONLY: C_INT
+  Integer(KIND=C_INT), VALUE :: status  
+  End Subroutine exit
+ End Interface
+
+ cstatus = status
+ Call exit(cstatus)
+
+ End Subroutine udexit
+!-------------------------------  udabort --------------------------------------
+ Subroutine udabort()
+ USE ISO_C_BINDING
+ Implicit NONE
+ Interface
+  Subroutine abort() BIND(C)
+  End Subroutine abort
+ End Interface
+
+ Call abort()
+
+ End Subroutine udabort
+!-------------------------------  udrand -------------------------------------
+ Function udrand(iflag) RESULT(rannum)
+
+ USE ISO_C_BINDING
+
+ Implicit NONE
+ Integer, Parameter :: RK8=SELECTED_REAL_KIND(P=13, R=307)  ! double
+ Integer, Intent(IN) :: iflag
+ Real(RK8) :: rannum
+ Integer(KIND=C_INT) :: ciflag
+ Real(KIND=C_DOUBLE) :: crannum
+ Interface
+  Function myrand(iflag) BIND(C)
+   USE ISO_C_BINDING, ONLY: C_INT, C_DOUBLE
+   Integer(KIND=C_INT), VALUE :: iflag
+   Real(KIND=C_DOUBLE) :: myrand
+  End Function myrand
+ End Interface
+
+ ciflag = iflag
+  
+ crannum = myrand(ciflag)
+ rannum = crannum
+
+ End Function udrand
+!-------------------------------  udshift -------------------------------------
+ Function udshift(ivalue, amount) RESULT(shiftval)
+
+ USE ISO_C_BINDING
+
+ Implicit NONE
+
+ Integer, Intent(IN) :: ivalue, amount
+ Integer(KIND=C_INT) :: cvalue, camount 
+ Integer :: shiftval 
+ Integer(KIND=C_INT) :: cshiftval
+ Interface
+  Function myshift(cvalue, camount) BIND(C)
+   USE ISO_C_BINDING, ONLY: C_INT
+   Integer(KIND=C_INT), VALUE :: cvalue, camount 
+   Integer(KIND=C_INT) :: myshift
+  End Function myshift
+ End Interface
+
+ cvalue = ivalue
+ camount = amount
+  
+ cshiftval = myshift(cvalue, camount)
+ shiftval = cshiftval
+
+ End Function udshift
+!-------------------------------  ignorefpe  ----------------------------------
+ Subroutine ignorefpe(idoit)
+
+ USE ISO_C_BINDING
+
+ Implicit NONE
+
+ Integer, Intent(IN) :: idoit 
+ Integer(KIND=C_INT) :: cdoit 
+ Interface
+  Subroutine nc_ignorefpe(cdoit) BIND(C)
+   USE ISO_C_BINDING, ONLY: C_INT
+   Integer(KIND=C_INT), VALUE :: cdoit 
+  End Subroutine nc_ignorefpe 
+ End Interface
+
+ cdoit = idoit
+ Call nc_ignorefpe(cdoit)
+
+ End Subroutine ignorefpe
+!-------------------------------  max_uchar  ----------------------------------
+ Function max_uchar() RESULT(cmax)
+
+ USE ISO_C_BINDING
+
+ Implicit NONE
+ Integer, Parameter :: RK8=SELECTED_REAL_KIND(P=13, R=307)  ! double
+ Real(RK8) :: cmax
+ Real(KIND=C_DOUBLE) :: ccmax
+ Interface
+  Function cmax_uchar() BIND(C)
+   USE ISO_C_BINDING, ONLY: C_DOUBLE
+   Real(KIND=C_DOUBLE) :: cmax_uchar
+  End Function cmax_uchar
+ End Interface
+
+ ccmax = cmax_uchar()
+ cmax = ccmax
+
+ End Function max_uchar
+!-------------------------------  min_schar  ----------------------------------
+ Function min_schar() RESULT(cmin)
+
+ USE ISO_C_BINDING
+
+ Implicit NONE
+ Integer, Parameter :: RK8=SELECTED_REAL_KIND(P=13, R=307)  ! double
+ Real(RK8) :: cmin
+ Real(KIND=C_DOUBLE) :: ccmin
+ Interface
+  Function cmin_schar() BIND(C)
+   USE ISO_C_BINDING, ONLY: C_DOUBLE
+   Real(KIND=C_DOUBLE) :: cmin_schar
+  End Function cmin_schar
+ End Interface
+
+ ccmin = cmin_schar()
+ cmin = ccmin
+
+ End Function min_schar
+!-------------------------------  max_schar  ----------------------------------
+ Function max_schar() RESULT(cmax)
+
+ USE ISO_C_BINDING
+
+ Implicit NONE
+ Integer, Parameter :: RK8=SELECTED_REAL_KIND(P=13, R=307)  ! double
+ Real(RK8) :: cmax
+ Real(KIND=C_DOUBLE) :: ccmax
+ Interface
+  Function cmax_schar() BIND(C)
+   USE ISO_C_BINDING, ONLY: C_DOUBLE
+   Real(KIND=C_DOUBLE) :: cmax_schar
+  End Function cmax_schar
+ End Interface
+
+ ccmax = cmax_schar()
+ cmax = ccmax
+
+ End Function max_schar
+!-------------------------------  min_short  ----------------------------------
+ Function min_short() RESULT(cmin)
+
+ USE ISO_C_BINDING
+
+ Implicit NONE
+ Integer, Parameter :: RK8=SELECTED_REAL_KIND(P=13, R=307)  ! double
+ Real(RK8) :: cmin
+ Real(KIND=C_DOUBLE) :: ccmin
+ Interface
+  Function cmin_short() BIND(C)
+   USE ISO_C_BINDING, ONLY: C_DOUBLE
+   Real(KIND=C_DOUBLE) :: cmin_short
+  End Function cmin_short
+ End Interface
+
+ ccmin = cmin_short()
+ cmin = ccmin
+
+ End Function min_short
+!-------------------------------  max_short  ----------------------------------
+ Function max_short() RESULT(cmax)
+
+ USE ISO_C_BINDING
+
+ Implicit NONE
+ Integer, Parameter :: RK8=SELECTED_REAL_KIND(P=13, R=307)  ! double
+ Real(RK8) :: cmax
+ Real(KIND=C_DOUBLE) :: ccmax
+ Interface
+  Function cmax_short() BIND(C)
+   USE ISO_C_BINDING, ONLY: C_DOUBLE
+   Real(KIND=C_DOUBLE) :: cmax_short
+  End Function cmax_short
+ End Interface
+
+ ccmax = cmax_short()
+ cmax = ccmax
+
+ End Function max_short
+!-------------------------------  min_int  ----------------------------------
+ Function min_int() RESULT(cmin)
+
+ USE ISO_C_BINDING
+
+ Implicit NONE
+ Integer, Parameter :: RK8=SELECTED_REAL_KIND(P=13, R=307)  ! double
+ Real(RK8) :: cmin
+ Real(KIND=C_DOUBLE) :: ccmin
+ Interface
+  Function cmin_int() BIND(C)
+   USE ISO_C_BINDING, ONLY: C_DOUBLE
+   Real(KIND=C_DOUBLE) :: cmin_int
+  End Function cmin_int
+ End Interface
+
+ ccmin = cmin_int()
+ cmin = ccmin
+
+ End Function min_int
+!-------------------------------  max_int  ----------------------------------
+ Function max_int() RESULT(cmax)
+
+ USE ISO_C_BINDING
+
+ Implicit NONE
+ Integer, Parameter :: RK8=SELECTED_REAL_KIND(P=13, R=307)  ! double
+ Real(RK8) :: cmax
+ Real(KIND=C_DOUBLE) :: ccmax
+ Interface
+  Function cmax_int() BIND(C)
+   USE ISO_C_BINDING, ONLY: C_DOUBLE
+   Real(KIND=C_DOUBLE) :: cmax_int
+  End Function cmax_int
+ End Interface
+
+ ccmax = cmax_int()
+ cmax = ccmax
+
+ End Function max_int
+!-------------------------------  min_long  ----------------------------------
+ Function min_long() RESULT(cmin)
+
+ USE ISO_C_BINDING
+
+ Implicit NONE
+ Integer, Parameter :: RK8=SELECTED_REAL_KIND(P=13, R=307)  ! double
+ Real(RK8) :: cmin
+ Real(KIND=C_DOUBLE) :: ccmin
+ Interface
+  Function cmin_long() BIND(C)
+   USE ISO_C_BINDING, ONLY: C_DOUBLE
+   Real(KIND=C_DOUBLE) :: cmin_long
+  End Function cmin_long
+ End Interface
+
+ ccmin = cmin_long()
+ cmin = ccmin
+
+ End Function min_long
+!-------------------------------  max_long  ----------------------------------
+ Function max_long() RESULT(cmax)
+
+ USE ISO_C_BINDING
+
+ Implicit NONE
+ Integer, Parameter :: RK8=SELECTED_REAL_KIND(P=13, R=307)  ! double
+ Real(RK8) :: cmax
+ Real(KIND=C_DOUBLE) :: ccmax
+ Interface
+  Function cmax_long() BIND(C)
+   USE ISO_C_BINDING, ONLY: C_DOUBLE
+   Real(KIND=C_DOUBLE) :: cmax_long
+  End Function cmax_long
+ End Interface
+
+ ccmax = cmax_long()
+ cmax = ccmax
+
+ End Function max_long
+!-------------------------------  max_float  ----------------------------------
+ Function max_float() RESULT(cmax)
+
+ USE ISO_C_BINDING
+
+ Implicit NONE
+ Integer, Parameter :: RK8=SELECTED_REAL_KIND(P=13, R=307)  ! double
+ Real(RK8) :: cmax
+ Real(KIND=C_DOUBLE) :: ccmax
+ Interface
+  Function cmax_float() BIND(C)
+   USE ISO_C_BINDING, ONLY: C_DOUBLE
+   Real(KIND=C_DOUBLE) :: cmax_float
+  End Function cmax_float
+ End Interface
+
+ ccmax = cmax_float()
+ cmax = ccmax
+
+ End Function max_float
+!-------------------------------  max_double  ----------------------------------
+ Function max_double() RESULT(cmax)
+
+ USE ISO_C_BINDING
+
+ Implicit NONE
+ Integer, Parameter :: RK8=SELECTED_REAL_KIND(P=13, R=307)  ! double
+ Real(RK8) :: cmax
+ Real(KIND=C_DOUBLE) :: ccmax
+ Interface
+  Function cmax_double() BIND(C)
+   USE ISO_C_BINDING, ONLY: C_DOUBLE
+   Real(KIND=C_DOUBLE) :: cmax_double
+  End Function cmax_double
+ End Interface
+
+ ccmax = cmax_double()
+ cmax = ccmax
+
+ End Function max_double
diff --git a/nf_test/f90tst_fill.f90 b/nf_test/f90tst_fill.f90
new file mode 100644
index 0000000..5f83601
--- /dev/null
+++ b/nf_test/f90tst_fill.f90
@@ -0,0 +1,147 @@
+!     This is part of the netCDF package.
+!     Copyright 2006 University Corporation for Atmospheric Research/Unidata.
+!     See COPYRIGHT file for conditions of use.
+
+!     This program tests netCDF-4 fill values.
+
+!     $Id: f90tst_fill.f90,v 1.2 2009/12/28 15:45:23 russ Exp $
+
+program f90tst_fill
+  use typeSizes
+  use netcdf
+  implicit none
+  
+  ! This is the name of the data file we will create.
+  character (len = *), parameter :: FILE_NAME = "f90tst_fill.nc"
+  integer, parameter :: MAX_DIMS = 2
+  integer, parameter :: NX = 16, NY = 16
+  integer, parameter :: HALF_NX = NX / 2, HALF_NY = NY / 2
+  integer, parameter :: NUM_VARS = 8
+  character (len = *), parameter :: var_name(NUM_VARS) = &
+       (/ 'byte  ', 'short ', 'int   ', 'float ', 'double', 'ubyte ', &
+          'ushort', 'uint  ' /)
+  integer :: ncid, varid(NUM_VARS), dimids(MAX_DIMS)
+  integer :: var_type(NUM_VARS) = (/ nf90_byte, nf90_short, nf90_int, &
+       nf90_float, nf90_double, nf90_ubyte, nf90_ushort, nf90_uint /)
+  integer :: x_dimid, y_dimid
+  integer :: byte_out(HALF_NY, HALF_NX), byte_in(NY, NX)
+  integer :: short_out(HALF_NY, HALF_NX), short_in(NY, NX)
+  integer :: int_out(HALF_NY, HALF_NX), int_in(NY, NX)
+  real :: areal_out(HALF_NY, HALF_NX), areal_in(NY, NX)
+  real :: double_out(HALF_NY, HALF_NX), double_in(NY, NX)
+  integer :: ubyte_out(HALF_NY, HALF_NX), ubyte_in(NY, NX)
+  integer :: ushort_out(HALF_NY, HALF_NX), ushort_in(NY, NX)
+  integer (kind = EightByteInt) :: uint_out(HALF_NY, HALF_NX), uint_in(NY, NX)
+  integer :: nvars, ngatts, ndims, unlimdimid, file_format
+  integer :: x, y, v
+  integer :: start(MAX_DIMS), count_out(MAX_DIMS), count_in(MAX_DIMS)
+
+  print *
+  print *, '*** Testing netCDF-4 fill values.'
+
+  ! Create some pretend data.
+  do x = 1, HALF_NX
+     do y = 1, HALF_NY
+        byte_out(y, x) = -1
+        short_out(y, x) =  -2
+        int_out(y, x) = -4
+        areal_out(y, x) = 2.5
+        double_out(y, x) = -4.5
+        ubyte_out(y, x) = 1
+        ushort_out(y, x) = 2
+        uint_out(y, x) = 4
+     end do
+  end do
+
+  ! Create the netCDF file. 
+  call handle_err(nf90_create(FILE_NAME, nf90_netcdf4, ncid))
+
+  ! Define the dimensions.
+  call handle_err(nf90_def_dim(ncid, "x", NX, x_dimid))
+  call handle_err(nf90_def_dim(ncid, "y", NY, y_dimid))
+  dimids =  (/ y_dimid, x_dimid /)
+
+  ! Define the variables. 
+  do v = 1, NUM_VARS
+     call handle_err(nf90_def_var(ncid, var_name(v), var_type(v), dimids, varid(v)))
+  end do
+
+  ! Write one-quarter of the data.
+  count_out = (/ HALF_NX, HALF_NY /)
+  start = (/ 1, 1 /)
+  call handle_err(nf90_put_var(ncid, varid(1), byte_out, start = start, count = count_out))
+  call handle_err(nf90_put_var(ncid, varid(2), short_out, start = start, count = count_out))
+  call handle_err(nf90_put_var(ncid, varid(3), int_out, start = start, count = count_out))
+  call handle_err(nf90_put_var(ncid, varid(4), areal_out, start = start, count = count_out))
+  call handle_err(nf90_put_var(ncid, varid(5), double_out, start = start, count = count_out))
+  call handle_err(nf90_put_var(ncid, varid(6), ubyte_out, start = start, count = count_out))
+  call handle_err(nf90_put_var(ncid, varid(7), ushort_out, start = start, count = count_out))
+  call handle_err(nf90_put_var(ncid, varid(8), uint_out, start = start, count = count_out))
+
+  ! Close the file. 
+  call handle_err(nf90_close(ncid))
+
+  ! Reopen the file.
+  call handle_err(nf90_open(FILE_NAME, nf90_nowrite, ncid))
+  
+  ! Check some stuff out.
+  call handle_err(nf90_inquire(ncid, ndims, nvars, ngatts, unlimdimid, file_format))
+  if (ndims /= 2 .or. nvars /= NUM_VARS .or. ngatts /= 0 .or. unlimdimid /= -1 .or. &
+       file_format /= nf90_format_netcdf4) stop 2
+
+  ! Read all the data.
+  count_in = (/ NX, NY /)
+  call handle_err(nf90_get_var(ncid, varid(1), byte_in, start = start, count = count_in))
+  call handle_err(nf90_get_var(ncid, varid(2), short_in, start = start, count = count_in))
+  call handle_err(nf90_get_var(ncid, varid(3), int_in, start = start, count = count_in))
+  call handle_err(nf90_get_var(ncid, varid(4), areal_in, start = start, count = count_in))
+  call handle_err(nf90_get_var(ncid, varid(5), double_in, start = start, count = count_in))
+  call handle_err(nf90_get_var(ncid, varid(6), ubyte_in, start = start, count = count_in))
+  call handle_err(nf90_get_var(ncid, varid(7), ushort_in, start = start, count = count_in))
+  call handle_err(nf90_get_var(ncid, varid(8), uint_in, start = start, count = count_in))
+
+  ! Check the data. All the data in the first quadrant are fill value.
+  do x = 1, NX
+     do y = 1, NY
+        if ((x .le. HALF_NX) .and. (y .le. HALF_NY)) then
+           if (byte_in(y, x) .ne. -1) stop 13
+           if (short_in(y, x) .ne. -2) stop 14
+           if (int_in(y, x) .ne. -4) stop 15
+           if (areal_in(y, x) .ne. 2.5) stop 16
+           if (double_in(y, x) .ne. -4.5) stop 17
+           if (ubyte_in(y, x) .ne. 1) stop 18
+           if (ushort_in(y, x) .ne. 2) stop 19
+           if (uint_in(y, x) .ne. 4) stop 20
+        else 
+           if (byte_in(y, x) .ne. nf90_fill_byte) stop 3
+           if (short_in(y, x) .ne. nf90_fill_short) stop 4
+           if (int_in(y, x) .ne. nf90_fill_int) stop 5
+           if (areal_in(y, x) .ne. nf90_fill_real) stop 6
+           if (double_in(y, x) .ne. nf90_fill_double) stop 7
+           if (ubyte_in(y, x) .ne. nf90_fill_ubyte) stop 8
+           if (ushort_in(y, x) .ne. nf90_fill_ushort) stop 9
+           if (uint_in(y, x) .ne. nf90_fill_uint) stop 10
+        endif
+     end do
+  end do
+
+  ! Close the file. 
+  call handle_err(nf90_close(ncid))
+
+  print *,'*** SUCCESS!'
+
+contains
+!     This subroutine handles errors by printing an error message and
+!     exiting with a non-zero status.
+  subroutine handle_err(errcode)
+    use netcdf
+    implicit none
+    integer, intent(in) :: errcode
+    
+    if(errcode /= nf90_noerr) then
+       print *, 'Error: ', trim(nf90_strerror(errcode))
+       stop 99
+    endif
+  end subroutine handle_err
+end program f90tst_fill
+
diff --git a/nf_test/f90tst_fill2.f90 b/nf_test/f90tst_fill2.f90
new file mode 100644
index 0000000..75024ed
--- /dev/null
+++ b/nf_test/f90tst_fill2.f90
@@ -0,0 +1,156 @@
+!     This is part of the netCDF package.
+!     Copyright 2006 University Corporation for Atmospheric Research/Unidata.
+!     See COPYRIGHT file for conditions of use.
+
+!     This program tests netCDF-4 fill values.
+
+!     $Id: f90tst_fill2.f90,v 1.2 2009/12/28 15:45:23 russ Exp $
+
+program f90tst_fill
+  use typeSizes
+  use netcdf
+  implicit none
+  
+  ! This is the name of the data file we will create.
+  character (len = *), parameter :: FILE_NAME = "f90tst_fill2.nc"
+  integer, parameter :: MAX_DIMS = 2
+  integer, parameter :: NX = 16, NY = 16
+  integer, parameter :: HALF_NX = NX / 2, HALF_NY = NY / 2
+  integer, parameter :: ZERO_COUNT = 0
+  integer, parameter :: NUM_VARS = 8
+  character (len = *), parameter :: var_name(NUM_VARS) = &
+       (/ 'byte  ', 'short ', 'int   ', 'float ', 'double', 'ubyte ', &
+          'ushort', 'uint  ' /)
+  integer :: ncid, varid(NUM_VARS), dimids(MAX_DIMS)
+  integer :: var_type(NUM_VARS) = (/ nf90_byte, nf90_short, nf90_int, &
+       nf90_float, nf90_double, nf90_ubyte, nf90_ushort, nf90_uint /)
+  integer :: x_dimid, y_dimid
+  integer :: byte_out(HALF_NY, HALF_NX), byte_in(NY, NX)
+  integer :: short_out(HALF_NY, HALF_NX), short_in(NY, NX)
+  integer :: int_out(HALF_NY, HALF_NX), int_in(NY, NX)
+  real :: areal_out(HALF_NY, HALF_NX), areal_in(NY, NX)
+  real :: double_out(HALF_NY, HALF_NX), double_in(NY, NX)
+  integer :: ubyte_out(HALF_NY, HALF_NX), ubyte_in(NY, NX)
+  integer :: ushort_out(HALF_NY, HALF_NX), ushort_in(NY, NX)
+  integer (kind = EightByteInt) :: uint_out(HALF_NY, HALF_NX), uint_in(NY, NX)
+  integer :: nvars, ngatts, ndims, unlimdimid, file_format
+  integer :: x, y, v
+  integer :: start_out(MAX_DIMS), count_out(MAX_DIMS)
+  integer :: start_in(MAX_DIMS), count_in(MAX_DIMS)
+
+  print *
+  print *, '*** Testing netCDF-4 fill values with unlimited dimension.'
+
+  ! Create some pretend data.
+  do x = 1, HALF_NX
+     do y = 1, HALF_NY
+        byte_out(y, x) = -1
+        short_out(y, x) =  -2
+        int_out(y, x) = -4
+        areal_out(y, x) = 2.5
+        double_out(y, x) = -4.5
+        ubyte_out(y, x) = 1
+        ushort_out(y, x) = 2
+        uint_out(y, x) = 4
+     end do
+  end do
+
+  ! Create the netCDF file. 
+  call handle_err(nf90_create(FILE_NAME, nf90_netcdf4, ncid))
+
+  ! Define the dimensions.
+  call handle_err(nf90_def_dim(ncid, "x", NF90_UNLIMITED, x_dimid))
+  call handle_err(nf90_def_dim(ncid, "y", NY, y_dimid))
+  dimids =  (/ y_dimid, x_dimid /)
+
+  ! Define the variables. 
+  do v = 1, NUM_VARS
+     call handle_err(nf90_def_var(ncid, var_name(v), var_type(v), dimids, varid(v)))
+  end do
+
+  ! Write one-quarter of the data.
+  count_out = (/ HALF_NX, HALF_NY /)
+  start_out = (/ HALF_NX + 1, HALF_NY + 1 /)
+  call handle_err(nf90_put_var(ncid, varid(1), byte_out, start = start_out, count = count_out))
+  call handle_err(nf90_put_var(ncid, varid(2), short_out, start = start_out, count = count_out))
+  call handle_err(nf90_put_var(ncid, varid(3), int_out, start = start_out, count = count_out))
+  call handle_err(nf90_put_var(ncid, varid(4), areal_out, start = start_out, count = count_out))
+  call handle_err(nf90_put_var(ncid, varid(5), double_out, start = start_out, count = count_out))
+  call handle_err(nf90_put_var(ncid, varid(6), ubyte_out, start = start_out, count = count_out))
+  call handle_err(nf90_put_var(ncid, varid(7), ushort_out, start = start_out, count = count_out))
+  call handle_err(nf90_put_var(ncid, varid(8), uint_out, start = start_out, count = count_out))
+
+  ! Test when one dimension of count is 0
+  count_out = (/ HALF_NX, ZERO_COUNT /)
+  call handle_err(nf90_put_var(ncid, varid(3), int_out, start = start_out, count = count_out))
+  count_out = (/ HALF_NX, HALF_NY /)
+
+  ! Close the file. 
+  call handle_err(nf90_close(ncid))
+
+  ! Reopen the file.
+  call handle_err(nf90_open(FILE_NAME, nf90_nowrite, ncid))
+  
+  ! Check some stuff out.
+  call handle_err(nf90_inquire(ncid, ndims, nvars, ngatts, unlimdimid, file_format))
+  if (ndims /= 2 .or. nvars /= NUM_VARS .or. ngatts /= 0 .or. unlimdimid /= 1 .or. &
+       file_format /= nf90_format_netcdf4) stop 2
+
+  ! Read all the data.
+  start_in = (/ 1, 1 /)
+  count_in = (/ NX, NY /)
+  call handle_err(nf90_get_var(ncid, varid(1), byte_in, start = start_in, count = count_in))
+  call handle_err(nf90_get_var(ncid, varid(2), short_in, start = start_in, count = count_in))
+  call handle_err(nf90_get_var(ncid, varid(3), int_in, start = start_in, count = count_in))
+  call handle_err(nf90_get_var(ncid, varid(4), areal_in, start = start_in, count = count_in))
+  call handle_err(nf90_get_var(ncid, varid(5), double_in, start = start_in, count = count_in))
+  call handle_err(nf90_get_var(ncid, varid(6), ubyte_in, start = start_in, count = count_in))
+  call handle_err(nf90_get_var(ncid, varid(7), ushort_in, start = start_in, count = count_in))
+  call handle_err(nf90_get_var(ncid, varid(8), uint_in, start = start_in, count = count_in))
+
+  ! Check the data. All the data except the third quadrant are fill
+  ! value.
+  do x = 1, NX
+     do y = 1, NY
+        if ((x .gt. HALF_NX) .and. (y .gt. HALF_NY)) then
+           if (byte_in(y, x) .ne. -1) stop 13
+           if (short_in(y, x) .ne. -2) stop 14
+           if (int_in(y, x) .ne. -4) stop 15
+           if (areal_in(y, x) .ne. 2.5) stop 16
+           if (double_in(y, x) .ne. -4.5) stop 17
+           if (ubyte_in(y, x) .ne. 1) stop 18
+           if (ushort_in(y, x) .ne. 2) stop 19
+           if (uint_in(y, x) .ne. 4) stop 20
+        else 
+           if (byte_in(y, x) .ne. nf90_fill_byte) stop 3
+           if (short_in(y, x) .ne. nf90_fill_short) stop 4
+           if (int_in(y, x) .ne. nf90_fill_int) stop 5
+           if (areal_in(y, x) .ne. nf90_fill_real) stop 6
+           if (double_in(y, x) .ne. nf90_fill_double) stop 7
+           if (ubyte_in(y, x) .ne. nf90_fill_ubyte) stop 8
+           if (ushort_in(y, x) .ne. nf90_fill_ushort) stop 9
+           if (uint_in(y, x) .ne. nf90_fill_uint) stop 10
+        endif
+     end do
+  end do
+
+  ! Close the file. 
+  call handle_err(nf90_close(ncid))
+
+  print *,'*** SUCCESS!'
+
+contains
+!     This subroutine handles errors by printing an error message and
+!     exiting with a non-zero status.
+  subroutine handle_err(errcode)
+    use netcdf
+    implicit none
+    integer, intent(in) :: errcode
+    
+    if(errcode /= nf90_noerr) then
+       print *, 'Error: ', trim(nf90_strerror(errcode))
+       stop 99
+    endif
+  end subroutine handle_err
+end program f90tst_fill
+
diff --git a/nf_test/f90tst_grps.f90 b/nf_test/f90tst_grps.f90
new file mode 100644
index 0000000..71fa91d
--- /dev/null
+++ b/nf_test/f90tst_grps.f90
@@ -0,0 +1,158 @@
+!     This is part of the netCDF package.
+!     Copyright 2006 University Corporation for Atmospheric Research/Unidata.
+!     See COPYRIGHT file for conditions of use.
+
+!     This program tests netCDF-4 variable functions from fortran.
+
+!     $Id: f90tst_grps.f90,v 1.3 2010/02/03 14:35:21 ed Exp $
+
+program f90tst_grps
+  use typeSizes
+  use netcdf
+  implicit none
+  
+  ! This is the name of the data file we will create.
+  character (len = *), parameter :: FILE_NAME = "f90tst_grps.nc"
+
+  ! We are writing 2D data, a 6 x 12 grid. 
+  integer, parameter :: MAX_DIMS = 2
+  integer, parameter :: NX = 6, NY = 12
+
+  ! We need these ids and other gunk for netcdf.
+  integer :: ncid, varid1, varid2, varid3, varid4, dimids(MAX_DIMS)
+  integer :: chunksizes(MAX_DIMS), chunksizes_in(MAX_DIMS)
+  integer :: x_dimid, y_dimid
+  integer :: nvars, ngatts, ndims, unlimdimid, file_format
+  integer, parameter :: CACHE_NELEMS = 10000, CACHE_SIZE = 1000000
+  integer, parameter :: DEFLATE_LEVEL = 4
+  integer (kind = 8), parameter :: TOE_SAN_VALUE = 2147483648_8
+  character (len = *), parameter :: VAR1_NAME = "Payroll"
+  character (len = *), parameter :: VAR2_NAME = "Spies"
+  character (len = *), parameter :: VAR3_NAME = "Propaganda"
+  character (len = *), parameter :: VAR4_NAME = "Arms"
+  character (len = *), parameter :: GRP1_NAME = "Irish_Republican_Brotherhood"
+  character (len = *), parameter :: GRP2_NAME = "Sinn_Fein"
+  character (len = *), parameter :: GRP3_NAME = "Gaelic_Athletic_Association"
+  character (len = *), parameter :: GRP4_NAME = "Provisional_Government"
+
+  character (len = NF90_MAX_NAME) :: grp1_full_name
+  integer :: len
+
+  ! Information read back from the file to check correctness.
+  integer :: varid1_in, varid2_in, varid3_in, varid4_in
+  integer :: grpid1, grpid2, grpid3, grpid4
+  integer :: xtype_in, ndims_in, natts_in, dimids_in(MAX_DIMS)
+  character (len = nf90_max_name) :: name_in
+  integer :: endianness_in, deflate_level_in
+  logical :: shuffle_in, fletcher32_in, contiguous_in
+
+  print *, ''
+  print *,'*** Testing netCDF-4 groups from Fortran 90.'
+
+  ! Create the netCDF file. 
+  call check(nf90_create(FILE_NAME, nf90_netcdf4, ncid))
+
+  ! Define the dimensions.
+  call check(nf90_def_dim(ncid, "x", NX, x_dimid))
+  call check(nf90_def_dim(ncid, "y", NY, y_dimid))
+  dimids =  (/ y_dimid, x_dimid /)
+
+  ! Define some nested groups.
+  call check(nf90_def_grp(ncid, GRP1_NAME, grpid1))
+  call check(nf90_def_grp(grpid1, GRP2_NAME, grpid2))
+  call check(nf90_def_grp(grpid2, GRP3_NAME, grpid3))
+  call check(nf90_def_grp(grpid3, GRP4_NAME, grpid4))
+
+  ! Define some variables. 
+  chunksizes = (/ NY, NX /)
+  call check(nf90_def_var(ncid, VAR1_NAME, NF90_INT, dimids, varid1, chunksizes = chunksizes, &
+       shuffle = .TRUE., fletcher32 = .TRUE., endianness = nf90_endian_big, deflate_level = DEFLATE_LEVEL))
+  call check(nf90_def_var(grpid1, VAR2_NAME, NF90_INT, dimids, varid2, contiguous = .TRUE.))
+  call check(nf90_def_var(grpid2, VAR3_NAME, NF90_INT64, varid3))
+  call check(nf90_def_var(grpid3, VAR4_NAME, NF90_INT, x_dimid, varid4, contiguous = .TRUE.))
+
+  ! Close the file. 
+  call check(nf90_close(ncid))
+
+  ! Reopen the file.
+  call check(nf90_open(FILE_NAME, nf90_nowrite, ncid))
+  
+  ! Check some stuff out.
+  call check(nf90_inquire(ncid, ndims, nvars, ngatts, unlimdimid, file_format))
+  if (ndims /= 2 .or. nvars /= 1 .or. ngatts /= 0 .or. unlimdimid /= -1 .or. &
+       file_format /= nf90_format_netcdf4) stop 21
+
+  ! Get the group ids for the newly reopened file.
+  call check(nf90_inq_grp_ncid(ncid, GRP1_NAME, grpid1))
+  call check(nf90_inq_grp_ncid(grpid1, GRP2_NAME, grpid2))
+  call check(nf90_inq_grp_ncid(grpid2, GRP3_NAME, grpid3))
+  call check(nf90_inq_grp_ncid(grpid3, GRP4_NAME, grpid4))
+
+  ! Check for the groups with full group names. 
+  write(grp1_full_name, '(A,A)') '/', GRP1_NAME
+  call check(nf90_inq_grp_full_ncid(ncid, grp1_full_name, grpid1))
+  call check(nf90_inq_grpname(grpid1, name_in))
+  if (name_in .ne. GRP1_NAME) stop 61
+  call check(nf90_inq_grpname_full(grpid1, len, name_in))
+  if (name_in .ne. grp1_full_name) stop 62
+
+  ! Get varids.
+  call check(nf90_inq_varid(ncid, VAR1_NAME, varid1_in))
+  call check(nf90_inq_varid(grpid1, VAR2_NAME, varid2_in))
+  call check(nf90_inq_varid(grpid2, VAR3_NAME, varid3_in))
+  call check(nf90_inq_varid(grpid3, VAR4_NAME, varid4_in))
+
+  ! Check variable 1.
+  call check(nf90_inquire_variable(ncid, varid1_in, name_in, xtype_in, ndims_in, dimids_in, &
+       natts_in, chunksizes = chunksizes_in, endianness = endianness_in, fletcher32 = fletcher32_in, &
+       deflate_level = deflate_level_in, shuffle = shuffle_in))
+  if (name_in .ne. VAR1_NAME .or. xtype_in .ne. NF90_INT .or. ndims_in .ne. MAX_DIMS .or. &
+       natts_in .ne. 0 .or. dimids_in(1) .ne. dimids(1) .or. dimids_in(2) .ne. dimids(2)) stop 3
+  if (chunksizes_in(1) /= chunksizes(1) .or. chunksizes_in(2) /= chunksizes(2)) &
+       stop 4
+  if (endianness_in .ne. nf90_endian_big) stop 5
+
+  ! Check variable 2.
+  call check(nf90_inquire_variable(grpid1, varid2_in, name_in, xtype_in, ndims_in, dimids_in, &
+       natts_in, contiguous = contiguous_in, endianness = endianness_in, fletcher32 = fletcher32_in, &
+       deflate_level = deflate_level_in, shuffle = shuffle_in))
+  if (name_in .ne. VAR2_NAME .or. xtype_in .ne. NF90_INT .or. ndims_in .ne. MAX_DIMS .or. &
+       natts_in .ne. 0 .or. dimids_in(1) .ne. dimids(1) .or. dimids_in(2) .ne. dimids(2)) stop 6
+  if (deflate_level_in .ne. 0 .or. .not. contiguous_in .or. fletcher32_in .or. shuffle_in) stop 7
+
+  ! Check variable 3.
+  call check(nf90_inquire_variable(grpid2, varid3_in, name_in, xtype_in, ndims_in, dimids_in, &
+       natts_in, contiguous = contiguous_in, endianness = endianness_in, fletcher32 = fletcher32_in, &
+       deflate_level = deflate_level_in, shuffle = shuffle_in))
+  if (name_in .ne. VAR3_NAME .or. xtype_in .ne. NF90_INT64 .or. ndims_in .ne. 0 .or. &
+       natts_in .ne. 0) stop 8
+  if (deflate_level_in .ne. 0 .or. .not. contiguous_in .or. fletcher32_in .or. shuffle_in) stop 9
+  
+  ! Check variable 4.
+  call check(nf90_inquire_variable(grpid3, varid4_in, name_in, xtype_in, ndims_in, dimids_in, &
+       natts_in, contiguous = contiguous_in, endianness = endianness_in, fletcher32 = fletcher32_in, &
+       deflate_level = deflate_level_in, shuffle = shuffle_in))
+  if (name_in .ne. VAR4_NAME .or. xtype_in .ne. NF90_INT .or. ndims_in .ne. 1 .or. &
+       natts_in .ne. 0 .or. dimids_in(1) .ne. x_dimid) stop 10
+  if (deflate_level_in .ne. 0 .or. .not. contiguous_in .or. fletcher32_in .or. shuffle_in) stop 11
+
+  ! Close the file. 
+  call check(nf90_close(ncid))
+
+  print *,'*** SUCCESS!'
+
+contains
+!     This subroutine handles errors by printing an error message and
+!     exiting with a non-zero status.
+  subroutine check(errcode)
+    use netcdf
+    implicit none
+    integer, intent(in) :: errcode
+    
+    if(errcode /= nf90_noerr) then
+       print *, 'Error: ', trim(nf90_strerror(errcode))
+       stop 2
+    endif
+  end subroutine check
+end program f90tst_grps
+
diff --git a/nf_test/f90tst_nc4_par.f90 b/nf_test/f90tst_nc4_par.f90
new file mode 100644
index 0000000..4f3daa7
--- /dev/null
+++ b/nf_test/f90tst_nc4_par.f90
@@ -0,0 +1,82 @@
+! This parallel test was contributed by Jim Edwards at UCAR. Thanks Jim!
+program f90tst_nc4_par
+  use netcdf
+  use mpi
+  implicit none
+
+  character (len = *), parameter :: FILE_NAME = "f90tst_nc4_par.nc"
+  integer :: nmode, ierr, fh, my_task, nprocs, i, varid
+  integer :: dimid(3), start(3), count(3)
+  real :: f(3)
+
+
+  call MPI_INIT(ierr)
+  call MPI_COMM_RANK(MPI_COMM_WORLD, my_task, ierr)
+  call MPI_COMM_SIZE(MPI_COMM_WORLD, nprocs, ierr)
+
+  if(nprocs/=8)then
+     stop 'requires 8 tasks'
+  end if
+
+
+  nmode = ior(NF90_CLOBBER,NF90_NETCDF4)
+  nmode = IOR(nmode, nf90_mpiio) 
+
+  call handle_err(nf90_create(FILE_NAME, nmode, fh, &
+       comm = MPI_COMM_WORLD, info = MPI_INFO_NULL))
+
+  call handle_err(nf90_set_fill(fh, NF90_NOFILL, nmode))
+
+
+  call handle_err(nf90_def_dim(fh, 'dim1', 6, dimid(1)))
+  call handle_err(nf90_def_dim(fh, 'dim2', 4, dimid(2)))
+  call handle_err(nf90_def_dim(fh, 'dim3', 1, dimid(3)))
+
+
+  call handle_err(nf90_def_var(fh, 'var1', NF90_DOUBLE, dimid, varid))
+  call handle_err(nf90_enddef(fh))
+
+
+  do i=1,3
+     f(i) = my_task*3+i
+  end do
+
+  count = (/3,1,1/)
+  start(1) = mod(my_task,2)*3+1
+  start(2) = my_task/2+1
+  start(3) = 1
+
+  print *,my_task, start, count, f
+
+  call handle_err(nf90_put_var(fh, varid, f,start=start,count=count))
+
+  call handle_err(nf90_close(fh))
+
+  ! Reopen the file and check it.
+  call handle_err(nf90_open(FILE_NAME, NF90_MPIIO, fh, &
+       comm = MPI_COMM_WORLD, info = MPI_INFO_NULL))
+
+  call handle_err(nf90_get_var(fh, varid, f, start=start, count=count))
+  do i=1,3
+     if (f(i) .ne. my_task*3+i) stop 3
+  end do
+
+  call handle_err(nf90_close(fh))
+  call MPI_Finalize(ierr)
+
+contains
+  !     This subroutine handles errors by printing an error message and                                                                                                               
+  !     exiting with a non-zero status.                                                                                                                                               
+  subroutine handle_err(errcode)
+    use netcdf
+    implicit none
+    integer, intent(in) :: errcode
+
+    if(errcode /= nf90_noerr) then
+       print *, 'Error: ', trim(nf90_strerror(errcode))
+       stop 2
+    endif
+  end subroutine handle_err
+
+end program f90tst_nc4_par
+
diff --git a/nf_test/f90tst_parallel.f90 b/nf_test/f90tst_parallel.f90
new file mode 100644
index 0000000..49e7e97
--- /dev/null
+++ b/nf_test/f90tst_parallel.f90
@@ -0,0 +1,165 @@
+!     This is part of the netCDF package.
+!     Copyright 2006 University Corporation for Atmospheric Research/Unidata.
+!     See COPYRIGHT file for conditions of use.
+
+!     This program tests netCDF-4 parallel I/O functions from fortran.
+
+!     We are writing 2D data, a 6 x 12 grid, on 4 processors. Each
+!     processor will write it's rank to it's quarter of the array. The
+!     result will be (in CDL):
+!
+! netcdf f90tst_parallel {
+! dimensions:
+! 	x = 16 ;
+! 	y = 16 ;
+! variables:
+! 	int data(x, y) ;
+! data:
+! 
+!  data =
+!   0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1,
+!   0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1,
+!   0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1,
+!   0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1,
+!   0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1,
+!   0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1,
+!   0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1,
+!   0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1,
+!   2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3,
+!   2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3,
+!   2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3,
+!   2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3,
+!   2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3,
+!   2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3,
+!   2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3,
+!   2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3 ;
+! }
+
+!     $Id: f90tst_parallel.f90,v 1.6 2010/05/25 13:53:04 ed Exp $
+
+program f90tst_parallel
+  use typeSizes
+  use netcdf
+  implicit none
+  include 'mpif.h'
+  
+  ! This is the name of the data file we will create.
+  character (len = *), parameter :: FILE_NAME = "f90tst_parallel.nc"
+
+  integer, parameter :: MAX_DIMS = 2
+  integer, parameter :: NX = 16, NY = 16
+  integer, parameter :: NUM_PROC = 4
+  integer :: ncid, varid, dimids(MAX_DIMS), chunksizes(MAX_DIMS), chunksizes_in(MAX_DIMS)
+  integer :: x_dimid, y_dimid, contig
+  integer :: data_out(NY / 2, NX / 2), data_in(NY / 2, NX / 2)
+  integer :: mode_flag
+  integer :: nvars, ngatts, ndims, unlimdimid, file_format
+  integer :: x, y, retval
+  integer :: p, my_rank, ierr
+  integer :: start(MAX_DIMS), count(MAX_DIMS)
+
+  call MPI_Init(ierr)
+  call MPI_Comm_rank(MPI_COMM_WORLD, my_rank, ierr)
+  call MPI_Comm_size(MPI_COMM_WORLD, p, ierr)
+
+  if (my_rank .eq. 0) then
+     print *, ' '
+     print *, '*** Testing netCDF-4 parallel I/O from Fortran 90.'
+  endif
+
+  ! There must be 4 procs for this test.
+  if (p .ne. 4) then
+     print *, 'Sorry, this test program must be run on four processors.'
+     stop 2 
+  endif
+
+  ! Create some pretend data.
+  do x = 1, NX / 2
+     do y = 1, NY / 2
+        data_out(y, x) = my_rank
+     end do
+  end do
+
+  ! Create the netCDF file. 
+  mode_flag = IOR(nf90_netcdf4, nf90_classic_model) 
+  mode_flag = IOR(mode_flag, nf90_mpiio) 
+  call handle_err(nf90_create(FILE_NAME, mode_flag, ncid, comm = MPI_COMM_WORLD, &
+       info = MPI_INFO_NULL))
+
+  ! Define the dimensions.
+  call handle_err(nf90_def_dim(ncid, "x", NX, x_dimid))
+  call handle_err(nf90_def_dim(ncid, "y", NY, y_dimid))
+  dimids =  (/ y_dimid, x_dimid /)
+
+  ! Define the variable. 
+  call handle_err(nf90_def_var(ncid, "data", NF90_INT, dimids, varid))
+
+  ! With classic model netCDF-4 file, enddef must be called.
+  call handle_err(nf90_enddef(ncid))
+
+  ! Determine what part of the variable will be written for this
+  ! processor. It's a checkerboard decomposition.
+  count = (/ NX / 2, NY / 2 /)
+  if (my_rank .eq. 0) then
+     start = (/ 1, 1 /)
+  else if (my_rank .eq. 1) then
+     start = (/ NX / 2 + 1, 1 /)
+  else if (my_rank .eq. 2) then
+     start = (/ 1, NY / 2 + 1 /)
+  else if (my_rank .eq. 3) then
+     start = (/ NX / 2 + 1, NY / 2 + 1 /)
+  endif
+
+  ! Write this processor's data.
+  call handle_err(nf90_put_var(ncid, varid, data_out, start = start, count = count))
+
+  ! Close the file. 
+  call handle_err(nf90_close(ncid))
+
+  ! Reopen the file.
+  call handle_err(nf90_open(FILE_NAME, IOR(nf90_nowrite, nf90_mpiio), ncid, &
+       comm = MPI_COMM_WORLD, info = MPI_INFO_NULL))
+  
+  ! Check some stuff out.
+  call handle_err(nf90_inquire(ncid, ndims, nvars, ngatts, unlimdimid, file_format))
+  if (ndims /= 2 .or. nvars /= 1 .or. ngatts /= 0 .or. unlimdimid /= -1 .or. &
+       file_format /= nf90_format_netcdf4_classic) stop 3
+
+  ! Set collective access on this variable. This will cause all
+  ! reads/writes to happen together on every processor. Fairly
+  ! pointless, in this contexct, but I want to at least call this
+  ! function once in my testing.
+  call handle_err(nf90_var_par_access(ncid, varid, nf90_collective))
+      
+  ! Read this processor's data.
+  call handle_err(nf90_get_var(ncid, varid, data_in, start = start, count = count))
+
+  ! Check the data.
+  do x = 1, NX / 2
+     do y = 1, NY / 2
+        if (data_in(y, x) .ne. my_rank) stop 4
+     end do
+  end do
+
+  ! Close the file. 
+  call handle_err(nf90_close(ncid))
+
+  call MPI_Finalize(ierr)
+
+  if (my_rank .eq. 0) print *,'*** SUCCESS!'
+
+contains
+!     This subroutine handles errors by printing an error message and
+!     exiting with a non-zero status.
+  subroutine handle_err(errcode)
+    use netcdf
+    implicit none
+    integer, intent(in) :: errcode
+    
+    if(errcode /= nf90_noerr) then
+       print *, 'Error: ', trim(nf90_strerror(errcode))
+       stop 2
+    endif
+  end subroutine handle_err
+end program f90tst_parallel
+
diff --git a/nf_test/f90tst_parallel2.f90 b/nf_test/f90tst_parallel2.f90
new file mode 100644
index 0000000..28afc1f
--- /dev/null
+++ b/nf_test/f90tst_parallel2.f90
@@ -0,0 +1,170 @@
+!     This is part of the netCDF package.
+!     Copyright 2006 University Corporation for Atmospheric Research/Unidata.
+!     See COPYRIGHT file for conditions of use.
+
+!     This program tests netCDF-4 parallel I/O functions from fortran.
+
+!     We are writing 2D data, a 6 x 12 grid, on 4 processors. We only
+!     have half that amount of input data, because a stride is used so
+!     that only every other value is written to the file. Each
+!     processor will write it's rank to every other value in it's
+!     quarter of the array. The result will be (in CDL):
+!
+! netcdf f90tst_parallel2 {
+! dimensions:
+! 	x = 16 ;
+! 	y = 16 ;
+! variables:
+! 	int data(x, y) ;
+! data:
+
+!  data =
+!   0, _, 0, _, 0, _, 0, _, 1, _, 1, _, 1, _, 1, _,
+!   _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
+!   0, _, 0, _, 0, _, 0, _, 0, _, 0, _, 0, _, 0, _,
+!   _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
+!   0, _, 0, _, 0, _, 0, _, 1, _, 1, _, 1, _, 1, _,
+!   _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
+!   0, _, 0, _, 0, _, 0, _, 0, _, 0, _, 0, _, 0, _,
+!   _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
+!   2, _, 2, _, 2, _, 2, _, 3, _, 3, _, 3, _, 3, _,
+!   _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
+!   0, _, 0, _, 0, _, 0, _, 0, _, 0, _, 0, _, 0, _,
+!   _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
+!   2, _, 2, _, 2, _, 2, _, 3, _, 3, _, 3, _, 3, _,
+!   _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
+!   0, _, 0, _, 0, _, 0, _, 0, _, 0, _, 0, _, 0, _,
+!   _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _ ;
+! }
+
+!     $Id: f90tst_parallel2.f90,v 1.4 2010/05/25 13:53:04 ed Exp $
+
+program f90tst_parallel
+  use typeSizes
+  use netcdf
+  implicit none
+  include 'mpif.h'
+  
+  ! This is the name of the data file we will create.
+  character (len = *), parameter :: FILE_NAME = "f90tst_parallel2.nc"
+
+  integer, parameter :: MAX_DIMS = 2
+  integer, parameter :: NX = 16, NY = 16
+  integer, parameter :: NUM_PROC = 4
+  integer :: ncid, varid, dimids(MAX_DIMS)
+  integer :: x_dimid, y_dimid
+  integer :: data_out(NY / 4, NX / 4), data_in(NY / 4, NX / 4)
+  integer :: mode_flag
+  integer :: nvars, ngatts, ndims, unlimdimid, file_format
+  integer :: x, y
+  integer :: p, my_rank, ierr
+  integer :: start(MAX_DIMS), count(MAX_DIMS), stride(MAX_DIMS)
+
+  call MPI_Init(ierr)
+  call MPI_Comm_rank(MPI_COMM_WORLD, my_rank, ierr)
+  call MPI_Comm_size(MPI_COMM_WORLD, p, ierr)
+
+  if (my_rank .eq. 0) then
+     print *, ' '
+     print *, '*** Testing netCDF-4 parallel I/O with strided access.'
+  endif
+
+  ! There must be 4 procs for this test.
+  if (p .ne. 4) then
+     print *, 'Sorry, this test program must be run on four processors.'
+     stop 2 
+  endif
+
+  ! Create some pretend data.
+  do x = 1, NX / 4
+     do y = 1, NY / 4
+        data_out(y, x) = my_rank
+     end do
+  end do
+
+  ! Create the netCDF file. 
+  mode_flag = IOR(nf90_netcdf4, nf90_classic_model) 
+  mode_flag = IOR(mode_flag, nf90_mpiposix) 
+  call handle_err(nf90_create(FILE_NAME, mode_flag, ncid, comm = MPI_COMM_WORLD, &
+       info = MPI_INFO_NULL))
+
+  ! Define the dimensions.
+  call handle_err(nf90_def_dim(ncid, "x", NX, x_dimid))
+  call handle_err(nf90_def_dim(ncid, "y", NY, y_dimid))
+  dimids =  (/ y_dimid, x_dimid /)
+
+  ! Define the variable. 
+  call handle_err(nf90_def_var(ncid, "data", NF90_INT, dimids, varid))
+
+  ! With classic model netCDF-4 file, enddef must be called.
+  call handle_err(nf90_enddef(ncid))
+
+  ! Determine what part of the variable will be written for this
+  ! processor. It's a checkerboard decomposition.
+  count = (/ NX / 4, NY / 4 /)
+  stride = (/ 2, 2 /)
+  if (my_rank .eq. 0) then
+     start = (/ 1, 1 /)
+  else if (my_rank .eq. 1) then
+     start = (/ NX / 2 + 1, 1 /)
+  else if (my_rank .eq. 2) then
+     start = (/ 1, NY / 2 + 1 /)
+  else if (my_rank .eq. 3) then
+     start = (/ NX / 2 + 1, NY / 2 + 1 /)
+  endif
+
+  ! Write this processor's data.
+  call handle_err(nf90_put_var(ncid, varid, data_out, start = start, &
+       count = count, stride = stride))
+
+  ! Close the file. 
+  call handle_err(nf90_close(ncid))
+
+  ! Reopen the file.
+  call handle_err(nf90_open(FILE_NAME, IOR(nf90_nowrite, nf90_mpiposix), ncid, &
+       comm = MPI_COMM_WORLD, info = MPI_INFO_NULL))
+  
+  ! Check some stuff out.
+  call handle_err(nf90_inquire(ncid, ndims, nvars, ngatts, unlimdimid, file_format))
+  if (ndims /= 2 .or. nvars /= 1 .or. ngatts /= 0 .or. unlimdimid /= -1 .or. &
+       file_format /= nf90_format_netcdf4_classic) stop 3
+
+  ! Set collective access on this variable. This will cause all
+  ! reads/writes to happen together on every processor. Fairly
+  ! pointless, in this contexct, but I want to at least call this
+  ! function once in my testing.
+  call handle_err(nf90_var_par_access(ncid, varid, nf90_collective))
+      
+  ! Read this processor's data.
+  call handle_err(nf90_get_var(ncid, varid, data_in, start = start, count = count, &
+       stride = stride))
+
+  ! Check the data.
+  do x = 1, NX / 4
+     do y = 1, NY / 4
+        if (data_in(y, x) .ne. my_rank) stop 4
+     end do
+  end do
+
+  ! Close the file. 
+  call handle_err(nf90_close(ncid))
+
+  call MPI_Finalize(ierr)
+
+  if (my_rank .eq. 0) print *,'*** SUCCESS!'
+
+contains
+!     This subroutine handles errors by printing an error message and
+!     exiting with a non-zero status.
+  subroutine handle_err(errcode)
+    use netcdf
+    implicit none
+    integer, intent(in) :: errcode
+    
+    if(errcode /= nf90_noerr) then
+       print *, 'Error: ', trim(nf90_strerror(errcode))
+       stop 5
+    endif
+  end subroutine handle_err
+end program f90tst_parallel
+
diff --git a/nf_test/f90tst_parallel3.f90 b/nf_test/f90tst_parallel3.f90
new file mode 100644
index 0000000..9328d45
--- /dev/null
+++ b/nf_test/f90tst_parallel3.f90
@@ -0,0 +1,206 @@
+!     This is part of the netCDF package.
+!     Copyright 2006 University Corporation for Atmospheric Research/Unidata.
+!     See COPYRIGHT file for conditions of use.
+
+!     This program tests netCDF-4 parallel I/O and fill values from
+!     fortran. It creates a file like this:
+
+! netcdf f90tst_parallel3 {
+! dimensions:
+! 	x = 16 ;
+! 	y = 16 ;
+! variables:
+! 	byte byte(x, y) ;
+! 	short short(x, y) ;
+! 	int int(x, y) ;
+! 	float float(x, y) ;
+! 	double double(x, y) ;
+! 	ubyte ubyte(x, y) ;
+! 	ushort ushort(x, y) ;
+! 	uint uint(x, y) ;
+
+!     $Id: f90tst_parallel3.f90,v 1.5 2010/05/25 13:53:04 ed Exp $
+
+program f90tst_parallel3
+  use typeSizes
+  use netcdf
+  implicit none
+  include 'mpif.h'
+  
+  ! This is the name of the data file we will create.
+  character (len = *), parameter :: FILE_NAME = "f90tst_parallel3.nc"
+  integer, parameter :: MAX_DIMS = 2
+  integer, parameter :: NX = 16, NY = 16
+  integer, parameter :: HALF_NX = NX/2, HALF_NY = NY/2
+  integer, parameter :: NUM_PROC = 4
+  integer, parameter :: NUM_VARS = 8
+  integer, parameter :: CACHE_SIZE = 4194304, CACHE_NELEMS = 1013
+  integer, parameter :: CACHE_PREEMPTION = 79
+  character (len = *), parameter :: var_name(NUM_VARS) = &
+       (/ 'byte__', 'short_', 'int___', 'float_', 'double', 'ubyte_', 'ushort', 'uint__' /)
+  integer :: ncid, varid(NUM_VARS), dimids(MAX_DIMS)
+  integer :: var_type(NUM_VARS) = (/ nf90_byte, nf90_short, nf90_int, &
+       nf90_float, nf90_double, nf90_ubyte, nf90_ushort, nf90_uint /)
+  integer :: x_dimid, y_dimid
+  integer :: byte_out(HALF_NY, HALF_NX), byte_in(HALF_NY, HALF_NX)
+  integer :: short_out(HALF_NY, HALF_NX), short_in(HALF_NY, HALF_NX)
+  integer :: int_out(HALF_NY, HALF_NX), int_in(HALF_NY, HALF_NX)
+  real :: areal_out(HALF_NY, HALF_NX), areal_in(HALF_NY, HALF_NX)
+  real :: double_out(HALF_NY, HALF_NX), double_in(HALF_NY, HALF_NX)
+  integer :: ubyte_out(HALF_NY, HALF_NX), ubyte_in(HALF_NY, HALF_NX)
+  integer :: ushort_out(HALF_NY, HALF_NX), ushort_in(HALF_NY, HALF_NX)
+  integer (kind = EightByteInt) :: uint_out(HALF_NY, HALF_NX), uint_in(HALF_NY, HALF_NX)
+  integer :: nvars, ngatts, ndims, unlimdimid, file_format
+  integer :: x, y, v
+  integer :: p, my_rank, ierr
+  integer :: start(MAX_DIMS), count(MAX_DIMS)
+  integer :: ret
+
+  call MPI_Init(ierr)
+  call MPI_Comm_rank(MPI_COMM_WORLD, my_rank, ierr)
+  call MPI_Comm_size(MPI_COMM_WORLD, p, ierr)
+
+  if (my_rank .eq. 0) then
+     print *, ' '
+     print *, '*** Testing netCDF-4 parallel I/O with fill values.'
+  endif
+
+  ! There must be 4 procs for this test.
+  if (p .ne. 4) then
+     print *, 'Sorry, this test program must be run on four processors.'
+     stop 1
+  endif
+
+  ! Create some pretend data.
+  do x = 1, HALF_NX
+     do y = 1, HALF_NY
+        byte_out(y, x) = my_rank * (-1)
+        short_out(y, x) =  my_rank * (-2)
+        int_out(y, x) = my_rank * (-4)
+        areal_out(y, x) = my_rank * 2.5
+        double_out(y, x) = my_rank * (-4.5)
+        ubyte_out(y, x) = my_rank
+        ushort_out(y, x) = my_rank * 2
+        uint_out(y, x) = my_rank * 4
+     end do
+  end do
+
+  ! THis should fail, because I have not set either mpiposix or mpiio.
+  ret = nf90_create(FILE_NAME, nf90_netcdf4, ncid, &
+       comm = MPI_COMM_WORLD, info = MPI_INFO_NULL, cache_size = CACHE_SIZE, &
+       cache_nelems = CACHE_NELEMS, cache_preemption = CACHE_PREEMPTION)
+  if (ret /= nf90_einval) stop 8
+  
+  ! Create the netCDF file. 
+  call check(nf90_create(FILE_NAME, IOR(nf90_netcdf4, nf90_mpiposix), ncid, &
+       comm = MPI_COMM_WORLD, info = MPI_INFO_NULL, cache_size = CACHE_SIZE, &
+       cache_nelems = CACHE_NELEMS, cache_preemption = CACHE_PREEMPTION))
+
+  ! Define the dimensions.
+  call check(nf90_def_dim(ncid, "x", NX, x_dimid))
+  call check(nf90_def_dim(ncid, "y", NY, y_dimid))
+  dimids =  (/ y_dimid, x_dimid /)
+
+  ! Define the variables. 
+  do v = 1, NUM_VARS
+     call check(nf90_def_var(ncid, var_name(v), var_type(v), dimids, varid(v)))
+  end do
+
+  ! This will be the last collective operation.
+  call check(nf90_enddef(ncid))
+
+  ! Determine what part of the variable will be written/read for this
+  ! processor. It's a checkerboard decomposition.
+  count = (/ HALF_NX, HALF_NY /)
+  if (my_rank .eq. 0) then
+     start = (/ 1, 1 /)
+  else if (my_rank .eq. 1) then
+     start = (/ HALF_NX + 1, 1 /)
+  else if (my_rank .eq. 2) then
+     start = (/ 1, HALF_NY + 1 /)
+  else if (my_rank .eq. 3) then
+     start = (/ HALF_NX + 1, HALF_NY + 1 /)
+  endif
+
+  ! Write this processor's data, except for processor zero.
+  if (my_rank .ne. 0) then
+     call check(nf90_put_var(ncid, varid(1), byte_out, start = start, count = count))
+     call check(nf90_put_var(ncid, varid(2), short_out, start = start, count = count))
+     call check(nf90_put_var(ncid, varid(3), int_out, start = start, count = count))
+     call check(nf90_put_var(ncid, varid(4), areal_out, start = start, count = count))
+     call check(nf90_put_var(ncid, varid(5), double_out, start = start, count = count))
+     call check(nf90_put_var(ncid, varid(6), ubyte_out, start = start, count = count))
+     call check(nf90_put_var(ncid, varid(7), ushort_out, start = start, count = count))
+     call check(nf90_put_var(ncid, varid(8), uint_out, start = start, count = count))
+  endif
+
+  ! Close the file. 
+  call check(nf90_close(ncid))
+
+  ! Reopen the file.
+  call check(nf90_open(FILE_NAME, IOR(nf90_nowrite, nf90_mpiio), ncid, &
+       comm = MPI_COMM_WORLD, info = MPI_INFO_NULL))
+  
+  ! Check some stuff out.
+  call check(nf90_inquire(ncid, ndims, nvars, ngatts, unlimdimid, file_format))
+  if (ndims /= 2 .or. nvars /= NUM_VARS .or. ngatts /= 0 .or. unlimdimid /= -1 .or. &
+       file_format /= nf90_format_netcdf4) stop 2
+
+  ! Read this processor's data.
+  call check(nf90_get_var(ncid, varid(1), byte_in, start = start, count = count))
+  call check(nf90_get_var(ncid, varid(2), short_in, start = start, count = count))
+  call check(nf90_get_var(ncid, varid(3), int_in, start = start, count = count))
+  call check(nf90_get_var(ncid, varid(4), areal_in, start = start, count = count))
+  call check(nf90_get_var(ncid, varid(5), double_in, start = start, count = count))
+  call check(nf90_get_var(ncid, varid(6), ubyte_in, start = start, count = count))
+  call check(nf90_get_var(ncid, varid(7), ushort_in, start = start, count = count))
+  call check(nf90_get_var(ncid, varid(8), uint_in, start = start, count = count))
+
+  ! Check the data. All the data from the processor zero are fill
+  ! value.
+  do x = 1, HALF_NX
+     do y = 1, HALF_NY
+        if (my_rank .eq. 0) then
+           if (byte_in(y, x) .ne. nf90_fill_byte) stop 3
+           if (short_in(y, x) .ne. nf90_fill_short) stop 4
+           if (int_in(y, x) .ne. nf90_fill_int) stop 5
+           if (areal_in(y, x) .ne. nf90_fill_real) stop 6
+           if (double_in(y, x) .ne. nf90_fill_double) stop 7
+           if (ubyte_in(y, x) .ne. nf90_fill_ubyte) stop 8
+           if (ushort_in(y, x) .ne. nf90_fill_ushort) stop 9
+           if (uint_in(y, x) .ne. nf90_fill_uint) stop 10
+        else 
+           if (byte_in(y, x) .ne. (my_rank * (-1))) stop 13
+           if (short_in(y, x) .ne. (my_rank * (-2))) stop 14
+           if (int_in(y, x) .ne. (my_rank * (-4))) stop 15
+           if (areal_in(y, x) .ne. (my_rank * (2.5))) stop 16
+           if (double_in(y, x) .ne. (my_rank * (-4.5))) stop 17
+           if (ubyte_in(y, x) .ne. (my_rank * (1))) stop 18
+           if (ushort_in(y, x) .ne. (my_rank * (2))) stop 19
+           if (uint_in(y, x) .ne. (my_rank * (4))) stop 20
+        endif
+     end do
+  end do
+
+  ! Close the file. 
+  call check(nf90_close(ncid))
+
+  call MPI_Finalize(ierr)
+
+  if (my_rank .eq. 0) print *,'*** SUCCESS!'
+
+contains
+!     This subroutine handles errors by printing an error message and
+!     exiting with a non-zero status.
+  subroutine check(errcode)
+    use netcdf
+    implicit none
+    integer, intent(in) :: errcode
+    
+    if(errcode /= nf90_noerr) then
+       print *, 'Error: ', trim(nf90_strerror(errcode))
+       stop 99
+    endif
+  end subroutine check
+end program f90tst_parallel3
+
diff --git a/nf_test/f90tst_path.f90 b/nf_test/f90tst_path.f90
new file mode 100644
index 0000000..cd9cbbf
--- /dev/null
+++ b/nf_test/f90tst_path.f90
@@ -0,0 +1,88 @@
+program f90tst_path
+
+! Tests new nf90_inq_path function
+! Mimics tests in C tst_files5.c code
+
+  use typeSizes
+  use netcdf
+
+  implicit NONE
+
+  character(len=*), parameter :: FILE_NAME="f90tst_path.nc"
+
+  integer                        :: path_len, ncid
+  character(LEN=NF90_MAX_NAME+1) :: path_in
+
+  path_in   = REPEAT(" ", LEN(path_in))
+  path_len  = 0
+
+  print *,''
+  print *,'*** Testing netcdf file functions.'
+  print *,'*** Checking the new inq_path function'
+
+! Test with classic mode nf90_create
+
+  call check(nf90_create(FILE_NAME, nf90_classic_model, ncid))
+  call check(nf90_inq_path(ncid, path_len, path_in))
+
+  if ((path_len /= LEN(FILE_NAME)) .OR. (FILE_NAME /= TRIM(path_in)))  &
+    call check(-1)
+  call check(nf90_close(ncid))
+
+  path_in=REPEAT(" ", LEN(path_in))
+  path_len=0
+
+! Test with classic mode nf90_open
+
+  call check(nf90_open(FILE_NAME, nf90_classic_model, ncid))
+  call check(nf90_inq_path(ncid, path_len, path_in))
+
+  if ((path_len /= LEN(FILE_NAME)) .OR. (FILE_NAME /= TRIM(path_in)))  &
+    call check(-1)
+  call check(nf90_close(ncid))
+
+  path_in=REPEAT(" ", LEN(path_in))
+  path_len=0
+
+
+! Test with netcdf4 mode nf90_create
+
+  call check(nf90_create(FILE_NAME, nf90_netcdf4, ncid))
+  call check(nf90_inq_path(ncid, path_len, path_in))
+
+  if ((path_len /= LEN(FILE_NAME)) .OR. (FILE_NAME /= TRIM(path_in)))  &
+    call check(-1)
+  call check(nf90_close(ncid))
+
+  path_in=REPEAT(" ", LEN(path_in))
+  path_len=0
+
+! Test with netcdf4 mode nf90_open
+
+  call check(nf90_open(FILE_NAME, nf90_netcdf4, ncid))
+  call check(nf90_inq_path(ncid, path_len, path_in))
+
+  if ((path_len /= LEN(FILE_NAME)) .OR. (FILE_NAME /= TRIM(path_in)))  &
+    call check(-1)
+  call check(nf90_close(ncid))
+
+  path_in=REPEAT(" ", LEN(path_in))
+  path_len=0
+
+  Print *,'*** SUCCESS!'
+
+contains
+!     This subroutine handles errors by printing an error message and
+!     exiting with a non-zero status.
+  subroutine check(errcode)
+    use netcdf
+    implicit none
+    integer, intent(in) :: errcode
+
+    if(errcode /= nf90_noerr) then
+       print *, 'Error: ', trim(nf90_strerror(errcode))
+       stop 2
+    endif
+  end subroutine check
+
+end program f90tst_path
diff --git a/nf_test/f90tst_rengrps.f90 b/nf_test/f90tst_rengrps.f90
new file mode 100644
index 0000000..95ea084
--- /dev/null
+++ b/nf_test/f90tst_rengrps.f90
@@ -0,0 +1,99 @@
+!     Modified version of f90tst_grps to add test for rename_grps 
+program f90tst_rengrps
+  use typeSizes
+  use netcdf
+  implicit none
+  
+  ! This is the name of the data file we will create.
+  character (len = *), parameter :: FILE_NAME = "f90tst_grps.nc"
+
+  ! We are writing 2D data, a 6 x 12 grid. 
+  integer, parameter :: MAX_DIMS = 2
+  integer, parameter :: NX = 6, NY = 12
+  integer :: chunksizes(MAX_DIMS), chunksizes_in(MAX_DIMS)
+  integer, parameter :: CACHE_NELEMS = 10000, CACHE_SIZE = 1000000
+  integer, parameter :: DEFLATE_LEVEL = 4
+  ! We need these ids and other gunk for netcdf.
+  integer :: ncid, varid1, varid2, dimids(MAX_DIMS)
+  integer :: x_dimid, y_dimid
+  integer :: nvars, ngatts, ndims, unlimdimid, file_format
+  character (len = *), parameter :: VAR1_NAME = "VarName1"
+  character (len = *), parameter :: VAR2_NAME = "VarName2"
+  character (len = *), parameter :: GRP1_NAME = "Old_Grp1_name"
+  character (len = *), parameter :: GRP2_NAME = "Old_Grp2_name"
+  character (len = *), parameter :: NEW_GRP1_NAME = "new_Grp1_name"
+  character (len = *), parameter :: NEW_GRP2_NAME = "new_Grp2_name"
+
+  character (len = NF90_MAX_NAME) :: grp1_full_name
+  integer :: ilen
+
+  ! Information read back from the file to check correctness.
+  integer :: varid1_in, varid2_in
+  integer :: grpid1, grpid2
+  integer :: xtype_in, ndims_in, natts_in, dimids_in(MAX_DIMS)
+  character (len = nf90_max_name) :: name_in
+
+  print *, ''
+  print *,'*** Testing netCDF-4 rename groups from Fortran 90.'
+
+  ! Create the netCDF file. 
+  call check(nf90_create(FILE_NAME, nf90_netcdf4, ncid))
+
+  ! Define the dimensions.
+  call check(nf90_def_dim(ncid, "x", NX, x_dimid))
+  call check(nf90_def_dim(ncid, "y", NY, y_dimid))
+  dimids =  (/ y_dimid, x_dimid /)
+
+  ! Define some nested groups.
+  call check(nf90_def_grp(ncid, GRP1_NAME, grpid1))
+  call check(nf90_def_grp(grpid1, GRP2_NAME, grpid2))
+
+  ! Define some variables. 
+  chunksizes = (/ NY, NX /)
+  call check(nf90_def_var(ncid, VAR1_NAME, NF90_INT, dimids, varid1, chunksizes = chunksizes, &
+       shuffle = .TRUE., fletcher32 = .TRUE., endianness = nf90_endian_big, deflate_level = DEFLATE_LEVEL))
+  call check(nf90_def_var(grpid1, VAR2_NAME, NF90_INT, dimids, varid2, contiguous = .TRUE.))
+
+  ! Close the file. 
+  call check(nf90_close(ncid))
+
+  ! Reopen the file.
+  call check(nf90_open(FILE_NAME, nf90_write, ncid))
+  
+  ! Get the group ids for the newly reopened file.
+  call check(nf90_inq_grp_ncid(ncid, GRP1_NAME, grpid1))
+  call check(nf90_inq_grp_ncid(grpid1, GRP2_NAME, grpid2))
+
+  ! Check for the groups with full group names. 
+  write(grp1_full_name, '(A,A)') '/', GRP1_NAME
+  call check(nf90_inq_grp_full_ncid(ncid, grp1_full_name, grpid1))
+  call check(nf90_inq_grpname(grpid1, name_in))
+  if (name_in .ne. GRP1_NAME) stop 61
+  call check(nf90_inq_grpname_full(grpid1, ilen, name_in))
+  if (name_in .ne. grp1_full_name) stop 62
+
+  Call check(nf90_rename_grp(grpid1, NEW_GRP1_NAME))
+  name_in=REPEAT(" ",LEN(name_in))
+  Call check(nf90_inq_grpname(grpid1, name_in))
+  If (name_in /= NEW_GRP1_NAME) Call check(-1)
+
+  ! Close the file. 
+  call check(nf90_close(ncid))
+
+  print *,'*** SUCCESS!'
+
+contains
+!     This subroutine handles errors by printing an error message and
+!     exiting with a non-zero status.
+  subroutine check(errcode)
+    use netcdf
+    implicit none
+    integer, intent(in) :: errcode
+    
+    if(errcode /= nf90_noerr) then
+       print *, 'Error: ', trim(nf90_strerror(errcode))
+       stop 2
+    endif
+  end subroutine check
+end program f90tst_rengrps
+
diff --git a/nf_test/f90tst_vars.f90 b/nf_test/f90tst_vars.f90
new file mode 100644
index 0000000..483b2ab
--- /dev/null
+++ b/nf_test/f90tst_vars.f90
@@ -0,0 +1,106 @@
+!     This is part of the netCDF package.
+!     Copyright 2006 University Corporation for Atmospheric Research/Unidata.
+!     See COPYRIGHT file for conditions of use.
+
+!     This program tests netCDF-4 variable functions from fortran.
+
+!     $Id: f90tst_vars.f90,v 1.8 2009/02/23 17:55:10 ed Exp $
+
+program f90tst_vars
+  use typeSizes
+  use netcdf
+  implicit none
+  
+  ! This is the name of the data file we will create.
+  character (len = *), parameter :: FILE_NAME = "f90tst_vars.nc"
+
+  ! We are writing 2D data, a 6 x 12 grid. 
+  integer, parameter :: MAX_DIMS = 2
+  integer, parameter :: NX = 6, NY = 12
+  integer :: data_out(NY, NX), data_in(NY, NX)
+
+  ! We need these ids and other gunk for netcdf.
+  integer :: ncid, varid, dimids(MAX_DIMS), chunksizes(MAX_DIMS), chunksizes_in(MAX_DIMS)
+  integer :: x_dimid, y_dimid, contig
+  integer :: mode_flag
+  integer :: nvars, ngatts, ndims, unlimdimid, file_format
+  integer :: x, y
+  integer :: CACHE_SIZE = 1000000;
+  ! integer, parameter :: CACHE_SIZE = 1000000
+
+  print *, ''
+  print *,'*** Testing definition of netCDF-4 vars from Fortran 90.'
+
+  ! Create some pretend data.
+  do x = 1, NX
+     do y = 1, NY
+        data_out(y, x) = (x - 1) * NY + (y - 1)
+     end do
+  end do
+
+  ! Create the netCDF file. 
+  mode_flag = IOR(nf90_netcdf4, nf90_classic_model) 
+  ! call handle_err(nf90_create(FILE_NAME, mode_flag, ncid, cache_size = CACHE_SIZE))
+  call handle_err(nf90_create(FILE_NAME, mode_flag, ncid, 0, CACHE_SIZE))
+
+  ! Define the dimensions.
+  call handle_err(nf90_def_dim(ncid, "x", NX, x_dimid))
+  call handle_err(nf90_def_dim(ncid, "y", NY, y_dimid))
+  dimids =  (/ y_dimid, x_dimid /)
+
+  ! Define the variable. 
+  call handle_err(nf90_def_var(ncid, "data", NF90_INT, dimids, varid))
+
+  ! Set up chunking.
+  chunksizes = (/ NY, NX /)
+  call handle_err(nf90_def_var_chunking(ncid, varid, 0, chunksizes))
+
+  ! With classic model netCDF-4 file, enddef must be called.
+  call handle_err(nf90_enddef(ncid))
+
+  ! Write the pretend data to the file.
+  call handle_err(nf90_put_var(ncid, varid, data_out))
+
+  ! Close the file. 
+  call handle_err(nf90_close(ncid))
+
+  ! Reopen the file.
+  call handle_err(nf90_open(FILE_NAME, nf90_nowrite, ncid))
+  
+  ! Check some stuff out.
+  call handle_err(nf90_inquire(ncid, ndims, nvars, ngatts, unlimdimid, file_format))
+  if (ndims /= 2 .or. nvars /= 1 .or. ngatts /= 0 .or. unlimdimid /= -1 .or. &
+       file_format /= nf90_format_netcdf4_classic) stop 2
+
+  call handle_err(nf90_inq_var_chunking(ncid, varid, contig, chunksizes_in))
+  if (chunksizes_in(1) /= chunksizes(1) .or. chunksizes_in(2) /= chunksizes(2)) &
+       stop 2
+
+  ! Check the data.
+  call handle_err(nf90_get_var(ncid, varid, data_in))
+  do x = 1, NX
+     do y = 1, NY
+        if (data_out(y, x) .ne. data_in(y, x)) stop 3
+     end do
+  end do
+
+  ! Close the file. 
+  call handle_err(nf90_close(ncid))
+
+  print *,'*** SUCCESS!'
+
+contains
+!     This subroutine handles errors by printing an error message and
+!     exiting with a non-zero status.
+  subroutine handle_err(errcode)
+    use netcdf
+    implicit none
+    integer, intent(in) :: errcode
+    
+    if(errcode /= nf90_noerr) then
+       print *, 'Error: ', trim(nf90_strerror(errcode))
+       stop 2
+    endif
+  end subroutine handle_err
+end program f90tst_vars
+
diff --git a/nf_test/f90tst_vars2.f90 b/nf_test/f90tst_vars2.f90
new file mode 100644
index 0000000..cbf9ba7
--- /dev/null
+++ b/nf_test/f90tst_vars2.f90
@@ -0,0 +1,183 @@
+!     This is part of the netCDF package.
+!     Copyright 2006 University Corporation for Atmospheric Research/Unidata.
+!     See COPYRIGHT file for conditions of use.
+
+!     This program tests netCDF-4 variable functions from fortran.
+
+!     $Id: f90tst_vars2.f90,v 1.7 2010/01/25 21:01:07 ed Exp $
+
+program f90tst_vars2
+  use typeSizes
+  use netcdf
+  implicit none
+  
+  ! This is the name of the data file we will create.
+  character (len = *), parameter :: FILE_NAME = "f90tst_vars2.nc"
+
+  ! We are writing 2D data, a 6 x 12 grid. 
+  integer, parameter :: MAX_DIMS = 2
+  integer, parameter :: NX = 6, NY = 12
+  integer :: data_out(NY, NX), data_in(NY, NX)
+  integer :: data_out_1d(NX), data_in_1d(NX)
+
+  ! We need these ids and other gunk for netcdf.
+  integer :: ncid, varid1, varid2, varid3, varid4, varid5, dimids(MAX_DIMS)
+  integer :: chunksizes(MAX_DIMS), chunksizes_in(MAX_DIMS)
+  integer :: x_dimid, y_dimid
+  integer :: nvars, ngatts, ndims, unlimdimid, file_format
+  integer :: x, y
+  integer, parameter :: DEFLATE_LEVEL = 4
+  integer (kind = 8), parameter :: TOE_SAN_VALUE = 2147483648_8
+  character (len = *), parameter :: VAR1_NAME = "Chon-Ji"
+  character (len = *), parameter :: VAR2_NAME = "Tan-Gun"
+  character (len = *), parameter :: VAR3_NAME = "Toe-San"
+  character (len = *), parameter :: VAR4_NAME = "Won-Hyo"
+  character (len = *), parameter :: VAR5_NAME = "Yul-Guk"
+  integer, parameter :: CACHE_SIZE = 8, CACHE_NELEMS = 571
+  integer, parameter :: CACHE_PREEMPTION = 66
+
+  ! Information read back from the file to check correctness.
+  integer :: varid1_in, varid2_in, varid3_in, varid4_in, varid5_in
+  integer :: xtype_in, ndims_in, natts_in, dimids_in(MAX_DIMS)
+  character (len = nf90_max_name) :: name_in
+  integer :: endianness_in, deflate_level_in
+  logical :: shuffle_in, fletcher32_in, contiguous_in
+  integer (kind = 8) :: toe_san_in
+  integer :: cache_size_in, cache_nelems_in, cache_preemption_in
+
+  print *, ''
+  print *,'*** Testing definition of netCDF-4 vars from Fortran 90.'
+
+  ! Create some pretend data.
+  do x = 1, NX
+     do y = 1, NY
+        data_out(y, x) = (x - 1) * NY + (y - 1)
+     end do
+  end do
+  do x = 1, NX
+        data_out_1d(x) = x
+  end do
+
+  ! Create the netCDF file. 
+  call check(nf90_create(FILE_NAME, nf90_netcdf4, ncid, cache_nelems = CACHE_NELEMS, &
+       cache_size = CACHE_SIZE))
+
+  ! Define the dimensions.
+  call check(nf90_def_dim(ncid, "x", NX, x_dimid))
+  call check(nf90_def_dim(ncid, "y", NY, y_dimid))
+  dimids =  (/ y_dimid, x_dimid /)
+
+  ! Define some variables. 
+  chunksizes = (/ NY, NX /)
+  call check(nf90_def_var(ncid, VAR1_NAME, NF90_INT, dimids, varid1, chunksizes = chunksizes, &
+       shuffle = .TRUE., fletcher32 = .TRUE., endianness = nf90_endian_big, deflate_level = DEFLATE_LEVEL))
+  call check(nf90_def_var(ncid, VAR2_NAME, NF90_INT, dimids, varid2, contiguous = .TRUE.))
+  call check(nf90_def_var(ncid, VAR3_NAME, NF90_INT64, varid3))
+  call check(nf90_def_var(ncid, VAR4_NAME, NF90_INT, x_dimid, varid4, contiguous = .TRUE.))
+  call check(nf90_def_var(ncid, VAR5_NAME, NF90_INT, dimids, varid5, chunksizes = chunksizes))
+
+  ! Write the pretend data to the file.
+  call check(nf90_put_var(ncid, varid1, data_out))
+  call check(nf90_put_var(ncid, varid2, data_out))
+  call check(nf90_put_var(ncid, varid3, TOE_SAN_VALUE))
+  call check(nf90_put_var(ncid, varid4, data_out_1d))
+  call check(nf90_put_var(ncid, varid5, data_out))
+
+  ! Close the file. 
+  call check(nf90_close(ncid))
+
+  ! Reopen the file.
+  call check(nf90_open(FILE_NAME, nf90_nowrite, ncid))
+  
+  ! Check some stuff out.
+  call check(nf90_inquire(ncid, ndims, nvars, ngatts, unlimdimid, file_format))
+  if (ndims /= 2 .or. nvars /= 5 .or. ngatts /= 0 .or. unlimdimid /= -1 .or. &
+       file_format /= nf90_format_netcdf4) stop 2
+
+  ! Get varids.
+  call check(nf90_inq_varid(ncid, VAR1_NAME, varid1_in))
+  call check(nf90_inq_varid(ncid, VAR2_NAME, varid2_in))
+  call check(nf90_inq_varid(ncid, VAR3_NAME, varid3_in))
+  call check(nf90_inq_varid(ncid, VAR4_NAME, varid4_in))
+  call check(nf90_inq_varid(ncid, VAR5_NAME, varid5_in))
+
+  ! Check variable 1.
+  call check(nf90_inquire_variable(ncid, varid1_in, name_in, xtype_in, ndims_in, dimids_in, &
+       natts_in, chunksizes = chunksizes_in, endianness = endianness_in, fletcher32 = fletcher32_in, &
+       deflate_level = deflate_level_in, shuffle = shuffle_in))
+  if (name_in .ne. VAR1_NAME .or. xtype_in .ne. NF90_INT .or. ndims_in .ne. MAX_DIMS .or. &
+       natts_in .ne. 0 .or. dimids_in(1) .ne. dimids(1) .or. dimids_in(2) .ne. dimids(2)) stop 3
+  if (chunksizes_in(1) /= chunksizes(1) .or. chunksizes_in(2) /= chunksizes(2)) &
+       stop 4
+  if (endianness_in .ne. nf90_endian_big) stop 5
+
+  ! Check variable 2.
+  call check(nf90_inquire_variable(ncid, varid2_in, name_in, xtype_in, ndims_in, dimids_in, &
+       natts_in, contiguous = contiguous_in, endianness = endianness_in, fletcher32 = fletcher32_in, &
+       deflate_level = deflate_level_in, shuffle = shuffle_in))
+  if (name_in .ne. VAR2_NAME .or. xtype_in .ne. NF90_INT .or. ndims_in .ne. MAX_DIMS .or. &
+       natts_in .ne. 0 .or. dimids_in(1) .ne. dimids(1) .or. dimids_in(2) .ne. dimids(2)) stop 6
+  if (deflate_level_in .ne. 0 .or. .not. contiguous_in .or. fletcher32_in .or. shuffle_in) stop 7
+
+  ! Check variable 3.
+  call check(nf90_inquire_variable(ncid, varid3_in, name_in, xtype_in, ndims_in, dimids_in, &
+       natts_in, contiguous = contiguous_in, endianness = endianness_in, fletcher32 = fletcher32_in, &
+       deflate_level = deflate_level_in, shuffle = shuffle_in))
+  if (name_in .ne. VAR3_NAME .or. xtype_in .ne. NF90_INT64 .or. ndims_in .ne. 0 .or. &
+       natts_in .ne. 0) stop 8
+  if (deflate_level_in .ne. 0 .or. .not. contiguous_in .or. fletcher32_in .or. shuffle_in) stop 9
+  
+  ! Check variable 4.
+  call check(nf90_inquire_variable(ncid, varid4_in, name_in, xtype_in, ndims_in, dimids_in, &
+       natts_in, contiguous = contiguous_in, endianness = endianness_in, fletcher32 = fletcher32_in, &
+       deflate_level = deflate_level_in, shuffle = shuffle_in))
+  if (name_in .ne. VAR4_NAME .or. xtype_in .ne. NF90_INT .or. ndims_in .ne. 1 .or. &
+       natts_in .ne. 0 .or. dimids_in(1) .ne. x_dimid) stop 10
+  if (deflate_level_in .ne. 0 .or. .not. contiguous_in .or. fletcher32_in .or. shuffle_in) stop 11
+
+  ! Check the data.
+  call check(nf90_get_var(ncid, varid1_in, data_in))
+  do x = 1, NX
+     do y = 1, NY
+        if (data_out(y, x) .ne. data_in(y, x)) stop 12
+     end do
+  end do
+  call check(nf90_get_var(ncid, varid2_in, data_in))
+  do x = 1, NX
+     do y = 1, NY
+        if (data_out(y, x) .ne. data_in(y, x)) stop 13
+     end do
+  end do
+  call check(nf90_get_var(ncid, varid3_in, toe_san_in))
+  if (toe_san_in .ne. TOE_SAN_VALUE) stop 14
+  call check(nf90_get_var(ncid, varid4_in, data_in_1d))
+  do x = 1, NX
+     if (data_out_1d(x) .ne. data_in_1d(x)) stop 15
+  end do
+  call check(nf90_get_var(ncid, varid5_in, data_in))
+  do x = 1, NX
+     do y = 1, NY
+        if (data_out(y, x) .ne. data_in(y, x)) stop 12
+     end do
+  end do
+
+  ! Close the file. 
+  call check(nf90_close(ncid))
+
+  print *,'*** SUCCESS!'
+
+contains
+!     This subroutine handles errors by printing an error message and
+!     exiting with a non-zero status.
+  subroutine check(errcode)
+    use netcdf
+    implicit none
+    integer, intent(in) :: errcode
+    
+    if(errcode /= nf90_noerr) then
+       print *, 'Error: ', trim(nf90_strerror(errcode))
+       stop 2
+    endif
+  end subroutine check
+end program f90tst_vars2
+
diff --git a/nf_test/f90tst_vars3.f90 b/nf_test/f90tst_vars3.f90
new file mode 100644
index 0000000..d6410e5
--- /dev/null
+++ b/nf_test/f90tst_vars3.f90
@@ -0,0 +1,195 @@
+!     This is part of the netCDF package.
+!     Copyright 2006 University Corporation for Atmospheric Research/Unidata.
+!     See COPYRIGHT file for conditions of use.
+
+!     This program tests netCDF-4 variable functions from fortran.
+
+!     $Id: f90tst_vars3.f90,v 1.1 2010/01/25 21:54:51 ed Exp $
+
+program f90tst_vars3
+  use typeSizes
+  use netcdf
+  implicit none
+  
+  ! This is the name of the data file we will create.
+  character (len = *), parameter :: FILE_NAME = "f90tst_vars3.nc"
+
+  ! We are writing 2D data, a 6 x 12 grid. 
+  integer, parameter :: MAX_DIMS = 2
+  integer, parameter :: NX = 6, NY = 12
+  integer :: data_out(NY, NX), data_in(NY, NX)
+  integer :: data_out_1d(NX), data_in_1d(NX)
+
+  ! We need these ids and other gunk for netcdf.
+  integer :: ncid, varid1, varid2, varid3, varid4, varid5, dimids(MAX_DIMS)
+  integer :: chunksizes(MAX_DIMS), chunksizes_in(MAX_DIMS)
+  integer :: x_dimid, y_dimid
+  integer :: nvars, ngatts, ndims, unlimdimid, file_format
+  integer :: x, y
+  integer, parameter :: DEFAULT_CACHE_NELEMS = 10000, DEFAULT_CACHE_SIZE = 1000000
+  integer, parameter :: DEFAULT_CACHE_PREEMPTION = 22
+  integer, parameter :: DEFLATE_LEVEL = 4
+  integer (kind = 8), parameter :: TOE_SAN_VALUE = 2147483648_8
+  character (len = *), parameter :: VAR1_NAME = "Chon-Ji"
+  character (len = *), parameter :: VAR2_NAME = "Tan-Gun"
+  character (len = *), parameter :: VAR3_NAME = "Toe-San"
+  character (len = *), parameter :: VAR4_NAME = "Won-Hyo"
+  character (len = *), parameter :: VAR5_NAME = "Yul-Guk"
+  integer, parameter :: CACHE_SIZE = 8, CACHE_NELEMS = 571, CACHE_PREEMPTION = 66
+
+  ! Information read back from the file to check correctness.
+  integer :: varid1_in, varid2_in, varid3_in, varid4_in, varid5_in
+  integer :: xtype_in, ndims_in, natts_in, dimids_in(MAX_DIMS)
+  character (len = nf90_max_name) :: name_in
+  integer :: endianness_in, deflate_level_in
+  logical :: shuffle_in, fletcher32_in, contiguous_in
+  integer (kind = 8) :: toe_san_in
+  integer :: cache_size_in, cache_nelems_in, cache_preemption_in
+
+  print *, ''
+  print *,'*** Testing definition of netCDF-4 vars from Fortran 90.'
+
+  ! Create some pretend data.
+  do x = 1, NX
+     do y = 1, NY
+        data_out(y, x) = (x - 1) * NY + (y - 1)
+     end do
+  end do
+  do x = 1, NX
+        data_out_1d(x) = x
+  end do
+
+  ! Create the netCDF file. 
+  call check(nf90_create(FILE_NAME, nf90_netcdf4, ncid, cache_nelems = DEFAULT_CACHE_NELEMS, &
+       cache_size = DEFAULT_CACHE_SIZE, cache_preemption = DEFAULT_CACHE_PREEMPTION))
+
+  ! Define the dimensions.
+  call check(nf90_def_dim(ncid, "x", NX, x_dimid))
+  call check(nf90_def_dim(ncid, "y", NY, y_dimid))
+  dimids =  (/ y_dimid, x_dimid /)
+
+  ! Define some variables. 
+  chunksizes = (/ NY, NX /)
+  call check(nf90_def_var(ncid, VAR1_NAME, NF90_INT, dimids, varid1, chunksizes = chunksizes, &
+       shuffle = .TRUE., fletcher32 = .TRUE., endianness = nf90_endian_big, deflate_level = DEFLATE_LEVEL))
+  call check(nf90_def_var(ncid, VAR2_NAME, NF90_INT, dimids, varid2, contiguous = .TRUE.))
+  call check(nf90_def_var(ncid, VAR3_NAME, NF90_INT64, varid3))
+  call check(nf90_def_var(ncid, VAR4_NAME, NF90_INT, x_dimid, varid4, contiguous = .TRUE.))
+  call check(nf90_def_var(ncid, VAR5_NAME, NF90_INT, dimids, varid5, chunksizes = chunksizes, &
+       deflate_level = DEFLATE_LEVEL, cache_size = CACHE_SIZE, cache_nelems = CACHE_NELEMS, &
+       cache_preemption = CACHE_PREEMPTION))
+
+  call check(nf90_inquire_variable(ncid, varid1, cache_size = cache_size_in, &
+       cache_nelems = cache_nelems_in, cache_preemption = cache_preemption_in))
+!  if (cache_size_in .ne. DEFAULT_CACHE_SIZE .or. cache_nelems_in .ne. &
+!       DEFAULT_CACHE_NELEMS .or. cache_preemption_in .ne. DEFAULT_CACHE_PREEMPTION) stop 101
+  call check(nf90_inquire_variable(ncid, varid5, cache_size = cache_size_in, &
+       cache_nelems = cache_nelems_in, cache_preemption = cache_preemption_in))
+  if (cache_size_in .ne. CACHE_SIZE .or. cache_nelems_in .ne. &
+       CACHE_NELEMS .or. cache_preemption_in .ne. CACHE_PREEMPTION) stop 1
+
+  ! Write the pretend data to the file.
+  call check(nf90_put_var(ncid, varid1, data_out))
+  call check(nf90_put_var(ncid, varid2, data_out))
+  call check(nf90_put_var(ncid, varid3, TOE_SAN_VALUE))
+  call check(nf90_put_var(ncid, varid4, data_out_1d))
+  call check(nf90_put_var(ncid, varid5, data_out))
+
+  ! Close the file. 
+  call check(nf90_close(ncid))
+
+  ! Reopen the file.
+  call check(nf90_open(FILE_NAME, nf90_nowrite, ncid))
+  
+  ! Check some stuff out.
+  call check(nf90_inquire(ncid, ndims, nvars, ngatts, unlimdimid, file_format))
+  if (ndims /= 2 .or. nvars /= 5 .or. ngatts /= 0 .or. unlimdimid /= -1 .or. &
+       file_format /= nf90_format_netcdf4) stop 2
+
+  ! Get varids.
+  call check(nf90_inq_varid(ncid, VAR1_NAME, varid1_in))
+  call check(nf90_inq_varid(ncid, VAR2_NAME, varid2_in))
+  call check(nf90_inq_varid(ncid, VAR3_NAME, varid3_in))
+  call check(nf90_inq_varid(ncid, VAR4_NAME, varid4_in))
+  call check(nf90_inq_varid(ncid, VAR5_NAME, varid5_in))
+
+  ! Check variable 1.
+  call check(nf90_inquire_variable(ncid, varid1_in, name_in, xtype_in, ndims_in, dimids_in, &
+       natts_in, chunksizes = chunksizes_in, endianness = endianness_in, fletcher32 = fletcher32_in, &
+       deflate_level = deflate_level_in, shuffle = shuffle_in))
+  if (name_in .ne. VAR1_NAME .or. xtype_in .ne. NF90_INT .or. ndims_in .ne. MAX_DIMS .or. &
+       natts_in .ne. 0 .or. dimids_in(1) .ne. dimids(1) .or. dimids_in(2) .ne. dimids(2)) stop 3
+  if (chunksizes_in(1) /= chunksizes(1) .or. chunksizes_in(2) /= chunksizes(2)) &
+       stop 4
+  if (endianness_in .ne. nf90_endian_big) stop 5
+
+  ! Check variable 2.
+  call check(nf90_inquire_variable(ncid, varid2_in, name_in, xtype_in, ndims_in, dimids_in, &
+       natts_in, contiguous = contiguous_in, endianness = endianness_in, fletcher32 = fletcher32_in, &
+       deflate_level = deflate_level_in, shuffle = shuffle_in))
+  if (name_in .ne. VAR2_NAME .or. xtype_in .ne. NF90_INT .or. ndims_in .ne. MAX_DIMS .or. &
+       natts_in .ne. 0 .or. dimids_in(1) .ne. dimids(1) .or. dimids_in(2) .ne. dimids(2)) stop 6
+  if (deflate_level_in .ne. 0 .or. .not. contiguous_in .or. fletcher32_in .or. shuffle_in) stop 7
+
+  ! Check variable 3.
+  call check(nf90_inquire_variable(ncid, varid3_in, name_in, xtype_in, ndims_in, dimids_in, &
+       natts_in, contiguous = contiguous_in, endianness = endianness_in, fletcher32 = fletcher32_in, &
+       deflate_level = deflate_level_in, shuffle = shuffle_in))
+  if (name_in .ne. VAR3_NAME .or. xtype_in .ne. NF90_INT64 .or. ndims_in .ne. 0 .or. &
+       natts_in .ne. 0) stop 8
+  if (deflate_level_in .ne. 0 .or. .not. contiguous_in .or. fletcher32_in .or. shuffle_in) stop 9
+  
+  ! Check variable 4.
+  call check(nf90_inquire_variable(ncid, varid4_in, name_in, xtype_in, ndims_in, dimids_in, &
+       natts_in, contiguous = contiguous_in, endianness = endianness_in, fletcher32 = fletcher32_in, &
+       deflate_level = deflate_level_in, shuffle = shuffle_in))
+  if (name_in .ne. VAR4_NAME .or. xtype_in .ne. NF90_INT .or. ndims_in .ne. 1 .or. &
+       natts_in .ne. 0 .or. dimids_in(1) .ne. x_dimid) stop 10
+  if (deflate_level_in .ne. 0 .or. .not. contiguous_in .or. fletcher32_in .or. shuffle_in) stop 11
+
+  ! Check the data.
+  call check(nf90_get_var(ncid, varid1_in, data_in))
+  do x = 1, NX
+     do y = 1, NY
+        if (data_out(y, x) .ne. data_in(y, x)) stop 12
+     end do
+  end do
+  call check(nf90_get_var(ncid, varid2_in, data_in))
+  do x = 1, NX
+     do y = 1, NY
+        if (data_out(y, x) .ne. data_in(y, x)) stop 13
+     end do
+  end do
+  call check(nf90_get_var(ncid, varid3_in, toe_san_in))
+  if (toe_san_in .ne. TOE_SAN_VALUE) stop 14
+  call check(nf90_get_var(ncid, varid4_in, data_in_1d))
+  do x = 1, NX
+     if (data_out_1d(x) .ne. data_in_1d(x)) stop 15
+  end do
+  call check(nf90_get_var(ncid, varid5_in, data_in))
+  do x = 1, NX
+     do y = 1, NY
+        if (data_out(y, x) .ne. data_in(y, x)) stop 12
+     end do
+  end do
+
+  ! Close the file. 
+  call check(nf90_close(ncid))
+
+  print *,'*** SUCCESS!'
+
+contains
+!     This subroutine handles errors by printing an error message and
+!     exiting with a non-zero status.
+  subroutine check(errcode)
+    use netcdf
+    implicit none
+    integer, intent(in) :: errcode
+    
+    if(errcode /= nf90_noerr) then
+       print *, 'Error: ', trim(nf90_strerror(errcode))
+       stop 2
+    endif
+  end subroutine check
+end program f90tst_vars3
+
diff --git a/nf_test/f90tst_vars4.f90 b/nf_test/f90tst_vars4.f90
new file mode 100644
index 0000000..5c8c8e1
--- /dev/null
+++ b/nf_test/f90tst_vars4.f90
@@ -0,0 +1,111 @@
+!     This is part of the netCDF package.
+!     Copyright 2006 University Corporation for Atmospheric Research/Unidata.
+!     See COPYRIGHT file for conditions of use.
+
+!     This program tests netCDF-4 variable functions from fortran.
+
+program f90tst_vars4
+  use typeSizes
+  use netcdf
+  implicit none
+
+  ! This is the name of the data file we will create.
+  character (len = *), parameter :: FILE_NAME = "f90tst_vars4.nc"
+
+  integer, parameter :: MAX_DIMS = 2
+  integer, parameter :: NX = 40, NY = 4096
+  integer :: data_out(NY, NX), data_in(NY, NX)
+
+  ! We need these ids and other gunk for netcdf.
+  integer :: ncid, varid, dimids(MAX_DIMS), chunksizes(MAX_DIMS)
+  integer :: x_dimid, y_dimid, contig
+  integer :: mode_flag
+  integer :: nvars, ngatts, ndims, unlimdimid, file_format
+  integer :: x, y
+  integer, parameter :: CACHE_SIZE = 1000000
+  integer :: xtype_in, natts_in, dimids_in(MAX_DIMS), chunksizes_in(MAX_DIMS)
+  logical :: contiguous_in, shuffle_in, fletcher32_in
+  integer :: deflate_level_in, endianness_in
+  character (len = NF90_MAX_NAME) :: name_in
+
+
+  print *, ''
+  print *,'*** Testing definition of netCDF-4 vars from Fortran 90.'
+
+  ! Create some pretend data.
+  do x = 1, NX
+     do y = 1, NY
+        data_out(y, x) = (x - 1) * NY + (y - 1)
+     end do
+  end do
+
+  ! Create the netCDF file. 
+  mode_flag = IOR(nf90_netcdf4, nf90_classic_model) 
+  call handle_err(nf90_create(FILE_NAME, mode_flag, ncid, cache_size = CACHE_SIZE))
+
+  ! Define the dimensions.
+  call handle_err(nf90_def_dim(ncid, "x", NX, x_dimid))
+  call handle_err(nf90_def_dim(ncid, "y", NY, y_dimid))
+  dimids =  (/ y_dimid, x_dimid /)
+
+  ! Define the variable. 
+  chunksizes = (/ 256, 10 /)
+  call handle_err(nf90_def_var(ncid, 'data', NF90_INT, dimids, & 
+       varid, chunksizes = chunksizes, deflate_level = 4))
+
+  ! With classic model netCDF-4 file, enddef must be called.
+  call handle_err(nf90_enddef(ncid))
+
+  ! Write the pretend data to the file.
+  call handle_err(nf90_put_var(ncid, varid, data_out))
+
+  ! Close the file. 
+  call handle_err(nf90_close(ncid))
+
+  ! Reopen the file.
+  call handle_err(nf90_open(FILE_NAME, nf90_nowrite, ncid))
+  
+  ! Check some stuff out.
+  call handle_err(nf90_inquire(ncid, ndims, nvars, ngatts, unlimdimid, file_format))
+  if (ndims /= 2 .or. nvars /= 1 .or. ngatts /= 0 .or. unlimdimid /= -1 .or. &
+       file_format /= nf90_format_netcdf4_classic) stop 3
+
+  call handle_err(nf90_inquire_variable(ncid, varid, name_in, xtype_in, ndims, dimids_in, &
+       natts_in, contiguous_in, chunksizes_in, deflate_level_in, shuffle_in, fletcher32_in, &
+       endianness_in))
+  if (name_in .ne. 'data' .or. xtype_in .ne. NF90_INT .or. ndims .ne. MAX_DIMS .or. &
+       dimids_in(1) /= y_dimid .or. dimids_in(2) /= x_dimid .or. &
+       natts_in .ne. 0 .or. contiguous_in .neqv. .false. .or. &
+       chunksizes_in(1) /= chunksizes(1) .or. chunksizes_in(2) /= chunksizes(2) .or. &
+       deflate_level_in .ne. 4 .or. shuffle_in .neqv. .false. .or. fletcher32_in .neqv. .false.) &
+       stop 4
+
+  ! Check the data.
+  call handle_err(nf90_get_var(ncid, varid, data_in))
+  do x = 1, NX
+     do y = 1, NY
+        if (data_out(y, x) .ne. data_in(y, x)) stop 3
+     end do
+  end do
+
+  ! Close the file. 
+  call handle_err(nf90_close(ncid))
+
+  print *,'*** SUCCESS!'
+
+
+contains
+!     This subroutine handles errors by printing an error message and
+!     exiting with a non-zero status.
+  subroutine handle_err(errcode)
+    use netcdf
+    implicit none
+    integer, intent(in) :: errcode
+    
+    if(errcode /= nf90_noerr) then
+       print *, 'Error: ', trim(nf90_strerror(errcode))
+       stop 2
+    endif
+  end subroutine handle_err
+end program f90tst_vars4
+
diff --git a/nf_test/f90tst_vars_vlen.f90 b/nf_test/f90tst_vars_vlen.f90
new file mode 100644
index 0000000..aa9bfb3
--- /dev/null
+++ b/nf_test/f90tst_vars_vlen.f90
@@ -0,0 +1,132 @@
+! This is part of the netCDF package.
+! Copyright 2009 University Corporation for Atmospheric Research/Unidata.
+! See COPYRIGHT file for conditions of use.
+
+! This program tests netCDF-4 vlen variable functions from fortran 90.
+
+! $Id: f90tst_vars_vlen.f90,v 1.3 2009/02/02 19:31:25 ed Exp $
+
+program f90tst_vars_vlen
+  use typeSizes
+  use netcdf
+  implicit none
+!  include 'netcdf.inc'
+
+!   ! This is the name of the data file we will create.
+!   character*(*) FILE_NAME
+!   parameter (FILE_NAME='f90tst_vars_vlen.nc')
+
+!   ! NetCDF IDs.
+!   integer ncid, vlen_typeid
+
+!   integer max_types
+!   parameter (max_types = 1)
+
+!   ! Need these to read type information.
+!   integer num_types, typeids(max_types)
+!   integer base_type, base_size
+!   character*80 type_name
+!   integer type_size, nfields, class
+
+!   ! Information for the vlen type we will define.
+!   character*(*) vlen_type_name
+!   parameter (vlen_type_name = 'vlen_type')
+
+!   ! Some data about and for the vlen.
+!   integer vlen_len, vlen_len_in
+!   parameter (vlen_len = 5)
+!   integer data1(vlen_len), data1_in(vlen_len)
+
+!   ! These must be big enough to hold the stuct nc_vlen in netcdf.h.
+!   integer vlen(10), vlen_in(10)
+
+!   ! Loop indexes, and error handling.
+!   integer x, retval
+
+!   print *, ''
+!   print *,'*** Testing VLEN types.'
+
+!   do x = 1, vlen_len
+!      data1(x) = x
+!   end do
+
+!   ! Create the netCDF file.
+!   retval = nf_create(FILE_NAME, NF_NETCDF4, ncid)
+!   if (retval .ne. nf_noerr) call handle_err(retval)
+
+!   ! Create the vlen type.
+!   retval = nf_def_vlen(ncid, vlen_type_name, nf_int, vlen_typeid)
+!   if (retval .ne. nf_noerr) call handle_err(retval)
+
+!   ! Set up the vlen with this helper function, since F77 can't deal
+!   ! with pointers.
+!   retval = nf_put_vlen_element(ncid, vlen_typeid, vlen, vlen_len, data1)
+!   if (retval .ne. nf_noerr) call handle_err(retval)
+
+!   ! Write the vlen attribute.
+!   retval = nf_put_att(ncid, NF_GLOBAL, 'att1', vlen_typeid, 1, vlen)
+!   if (retval .ne. nf_noerr) call handle_err(retval)
+
+!   ! Close the file. 
+!   retval = nf_close(ncid)
+!   if (retval .ne. nf_noerr) call handle_err(retval)
+
+!   ! Reopen the file.
+!   retval = nf_open(FILE_NAME, NF_NOWRITE, ncid)
+!   if (retval .ne. nf_noerr) call handle_err(retval)
+
+!   ! Get the typeids of all user defined types.
+!   retval = nf_inq_typeids(ncid, num_types, typeids)
+!   if (retval .ne. nf_noerr) call handle_err(retval)
+!   if (num_types .ne. max_types) stop 2
+
+!   ! Use nf_inq_user_type to confirm this is an vlen type, with vlen
+!   ! size 16, base type NF_INT.
+!   retval = nf_inq_user_type(ncid, typeids(1), type_name, type_size, &
+!        base_type, nfields, class)
+!   if (retval .ne. nf_noerr) call handle_err(retval)
+!   if (type_name(1:len(vlen_type_name)) .ne. vlen_type_name .or. &
+!         type_size .ne. 16 .or. base_type .ne. nf_int .or. &
+!         nfields .ne. 0 .or. class .ne. nf_vlen) stop 3
+
+!   ! Use nf_inq_vlen and make sure we get the same answers as we did
+!   ! with nf_inq_user_type.
+!   retval = nf_inq_vlen(ncid, typeids(1), type_name, base_size, base_type)
+!   if (retval .ne. nf_noerr) call handle_err(retval)
+!   if (type_name(1:len(vlen_type_name)) .ne. vlen_type_name .or. &
+!        base_type .ne. nf_int .or. base_size .ne. 16) stop 4
+
+!   ! Read the vlen attribute.
+!   retval = nf_get_att(ncid, NF_GLOBAL, 'att1', vlen_in)
+!   if (retval .ne. nf_noerr) call handle_err(retval)
+
+!   ! Get the data from the vlen we just read.
+!   retval = nf_get_vlen_element(ncid, vlen_typeid, vlen_in, &
+!        vlen_len_in, data1_in)
+!   if (retval .ne. nf_noerr) call handle_err(retval)
+!   if (vlen_len_in .ne. vlen_len) stop 5
+
+!   ! Check the data
+!   do x = 1, vlen_len
+!      if (data1(x) .ne. data1_in(x)) stop 6
+!   end do
+
+!   ! Close the file. 
+!   retval = nf_close(ncid)
+!   if (retval .ne. nf_noerr) call handle_err(retval)
+
+!   print *,'*** SUCCESS!'
+! contains
+! !     This subroutine handles errors by printing an error message and
+! !     exiting with a non-zero status.
+!   subroutine handle_err(errcode)
+!     use netcdf
+!     implicit none
+!     integer, intent(in) :: errcode
+    
+!     if(errcode /= nf90_noerr) then
+!        print *, 'Error: ', trim(nf90_strerror(errcode))
+!        stop 1
+!     endif
+!   end subroutine handle_err
+end program f90tst_vars_vlen
diff --git a/nf_test/fills.cdl b/nf_test/fills.cdl
new file mode 100644
index 0000000..cb25a3d
--- /dev/null
+++ b/nf_test/fills.cdl
@@ -0,0 +1,21 @@
+netcdf fills {
+dimensions:
+	n = 2 ;
+variables:
+	double d(n) ;
+	float f(n) ;
+	int l(n) ;
+	short s(n) ;
+	byte b(n) ;
+data:
+
+ d = 1, _ ;
+
+ f = 1, _ ;
+
+ l = 1, _ ;
+
+ s = 1, _ ;
+
+ b = 1, -127 ;
+}
diff --git a/nf_test/fortlib.c b/nf_test/fortlib.c
new file mode 100644
index 0000000..6cc63d0
--- /dev/null
+++ b/nf_test/fortlib.c
@@ -0,0 +1,147 @@
+/*
+ * $Id: fortlib.c,v 1.11 2010/04/05 17:29:17 ed Exp $
+ *
+ * This file contains support functions for FORTRAN code.  For example,
+ * under HP-UX A.09.05, the U77 library doesn't contain the exit()
+ * routine -- so we create one here.
+ */
+
+#include <config.h>
+#include <stdlib.h>
+#include <limits.h>
+#include <float.h>
+
+#include "ncfortran.h"
+
+
+#if defined(f2cFortran) && !defined(pgiFortran) && !defined(gFortran)
+/*
+ * The f2c(1) utility on BSD/OS and Linux systems adds an additional
+ * underscore suffix (besides the usual one) to global names that have
+ * an embedded underscore.  For example, `nfclose' becomes `nfclose_',
+ * but `nf_close' becomes `nf_close__.  Consequently, we have to modify
+ * some names.
+ */
+#define max_uchar	max_uchar_
+#define min_schar	min_schar_
+#define max_schar	max_schar_
+#define min_short	min_short_
+#define max_short	max_short_
+#define min_int		min_int_
+#define max_int		max_int_
+#define min_long	min_long_
+#define max_long	max_long_
+#define max_float	max_float_
+#define max_double	max_double_
+#endif	/* f2cFortran */
+
+
+FCALLSCSUB1(exit, UDEXIT, udexit, FINT2CINT)
+
+
+FCALLSCSUB0(abort, UDABORT, udabort)
+
+
+static double
+myrand(int iflag)
+{
+    if (iflag != 0)
+	srand(iflag);
+
+    /*
+     * Return a pseudo-random value between 0.0 and 1.0.
+     *
+     * We don't use RAND_MAX here because not all compilation
+     * environments define it (e.g. gcc(1) under SunOS 4.1.3).
+     */
+    return (rand() % 32768) / 32767.0;
+}
+FCALLSCFUN1(DOUBLE, myrand, UDRAND, udrand, FINT2CINT)
+
+
+static int
+myshift(int value, int amount)
+{
+    if (amount < 0)
+	value >>= -amount;
+    else
+    if (amount > 0)
+	value <<= amount;
+    return value;
+}
+FCALLSCFUN2(NF_INT, myshift, UDSHIFT, udshift, FINT2CINT, FINT2CINT)
+
+#include <signal.h>
+static void
+nc_ignorefpe(int doit)
+{
+	if(doit)
+		(void) signal(SIGFPE, SIG_IGN);
+}
+FCALLSCSUB1(nc_ignorefpe, IGNOREFPE, ignorefpe, FINT2CINT)
+
+static double cmax_uchar()
+{
+    return UCHAR_MAX;
+}
+FCALLSCFUN0(DOUBLE, cmax_uchar, MAX_UCHAR, max_uchar)
+
+static double cmin_schar()
+{
+    return SCHAR_MIN;
+}
+FCALLSCFUN0(DOUBLE, cmin_schar, MIN_SCHAR, min_schar)
+
+static double cmax_schar()
+{
+    return SCHAR_MAX;
+}
+FCALLSCFUN0(DOUBLE, cmax_schar, MAX_SCHAR, max_schar)
+
+static double cmin_short()
+{
+    return SHRT_MIN;
+}
+FCALLSCFUN0(DOUBLE, cmin_short, MIN_SHORT, min_short)
+
+static double cmax_short()
+{
+    return SHRT_MAX;
+}
+FCALLSCFUN0(DOUBLE, cmax_short, MAX_SHORT, max_short)
+
+static double cmin_int()
+{
+    return INT_MIN;
+}
+FCALLSCFUN0(DOUBLE, cmin_int, MIN_INT, min_int)
+
+static double cmax_int()
+{
+    return INT_MAX;
+}
+FCALLSCFUN0(DOUBLE, cmax_int, MAX_INT, max_int)
+
+static double cmin_long()
+{
+    return LONG_MIN;
+}
+FCALLSCFUN0(DOUBLE, cmin_long, MIN_LONG, min_long)
+
+static double cmax_long()
+{
+    return LONG_MAX;
+}
+FCALLSCFUN0(DOUBLE, cmax_long, MAX_LONG, max_long)
+
+static double cmax_float()
+{
+    return FLT_MAX;
+}
+FCALLSCFUN0(DOUBLE, cmax_float, MAX_FLOAT, max_float)
+
+static double cmax_double()
+{
+    return DBL_MAX;
+}
+FCALLSCFUN0(DOUBLE, cmax_double, MAX_DOUBLE, max_double)
diff --git a/nf_test/ftest.F b/nf_test/ftest.F
new file mode 100644
index 0000000..db6d05c
--- /dev/null
+++ b/nf_test/ftest.F
@@ -0,0 +1,1458 @@
+!********************************************************************
+!   Copyright 1993, UCAR/Unidata
+!   See netcdf/COPYRIGHT file for copying and redistribution conditions.
+!   $Id: ftest.F,v 1.12 2009/04/02 18:29:20 dmh Exp $
+!********************************************************************
+
+#include "nfconfig.inc"
+
+!
+!     program to test the netCDF-2 Fortran API
+!
+      program ftest
+
+#include "netcdf.inc"
+
+!     name of first test cdf
+      character*31 name
+!     name of second test cdf
+      character*31 name2
+      
+!     Returned error code.
+      integer iret 
+!     netCDF ID
+      integer ncid
+!     ID of dimension lat
+      integer  latdim
+!     ID of dimension lon
+      integer londim
+!     ID of dimension level
+      integer leveldim
+!     ID of dimension time
+      integer timedim
+!     ID of dimension len
+      integer lendim
+
+!     Count the errors.
+      integer nfails
+
+!     variable used to control error-handling behavior
+      integer ncopts
+      integer dimsiz(MAXNCDIM)
+!      allowable roundoff 
+      common /dims/timedim, latdim, londim, leveldim, lendim,
+     + dimsiz
+      data name/'test.nc'/
+      data name2/'copy.nc'/
+
+      print *, ''
+      print *,'*** Testing netCDF-2 Fortran 77 API.'
+
+100   format(' *** testing ', a, ' ...')
+!     set error-handling to verbose and non-fatal
+      ncopts = NCVERBOS
+      call ncpopt(ncopts)
+
+!     This will be a count of how many failures we experience.
+      nfails = 0
+
+!     create a netCDF named 'test.nc'
+      write(*,100) 'nccre'
+      ncid = nccre(name, NCCLOB, iret)
+      if (ncid .eq. -1) then nfails = nfails + 1
+
+!     test ncddef
+      write(*,100) 'ncddef'
+      call tncddef(ncid, nfails)
+
+!     test ncvdef
+      write(*,100) 'ncvdef'
+      call tncvdef(ncid, nfails)
+
+!     test ncapt
+      write(*, 100) 'ncapt, ncaptc'
+      call tncapt(ncid, nfails)
+
+!     close 'test.nc'
+      write(*, 100) 'ncclos'
+      call ncclos(ncid, iret)
+      if (ncid .eq. -1) then nfails = nfails + 1
+
+!     test ncvpt1
+      write(*, 100) 'ncvpt1'
+      call tncvpt1(name, nfails)
+
+!     test ncvgt1
+      write(*, 100) 'ncvgt1'
+      call tncvgt1(name, nfails)
+
+!     test ncvpt
+      write(*, 100) 'ncvpt'
+      call tncvpt(name, nfails)
+
+!     test ncinq
+      write(*, 100) 'ncopn, ncinq, ncdinq, ncvinq, ncanam, ncainq'
+      call tncinq(name, nfails)
+
+!     test ncvgt
+      write(*, 100) 'ncvgt, ncvgtc'
+      call tncvgt(name, nfails)
+
+!     test ncagt
+      write(*, 100) 'ncagt, ncagtc'
+      call tncagt(name, nfails)
+
+!     test ncredf
+      write(*, 100) 'ncredf, ncdren, ncvren, ncaren, ncendf'
+      call tncredf(name, nfails)
+
+      call tncinq(name, nfails)
+
+!     test ncacpy
+      write(*, 100) 'ncacpy'
+      call tncacpy(name, name2, nfails)
+
+!     test ncadel
+      write(*, 100) 'ncadel'
+      call tncadel(name2, nfails)
+
+!     test fill values
+      write(*, 100) 'fill values'
+      call tfills(nfails)
+
+      print *,'Total number of failures: ', nfails
+      if (nfails .ne. 0) stop 2
+
+      print *,'*** SUCCESS!'
+
+      end
+!
+!     subroutine to test ncacpy
+!
+      subroutine tncacpy(iname, oname, nfails)
+      character*31 iname, oname
+#include "netcdf.inc"
+      integer ndims, nvars, natts, recdim, iret
+      character*31 vname, attnam
+      integer attype, attlen
+      integer vartyp, nvdims, vdims(MAXVDIMS), nvatts
+      integer lenstr
+!     existing netCDF id
+      integer incdf
+!     netCDF id of the output netCDF file to which the attribute
+!     will be copied
+      integer outcdf
+
+      integer mattlen
+      parameter (mattlen = 80)
+      character*80 charval
+      doubleprecision doubval(2)
+      real flval(2)
+      integer lngval(2)
+      NCSHORT_T shval(2)
+      integer i, j, k
+      character*31 varnam, attname(2,7), gattnam(2)
+      NCBYTE_T bytval(2)
+      common /atts/attname, gattnam
+      NCSHORT_T svalidrg(2)
+      real rvalidrg(2)
+      integer lvalidrg(2)
+      doubleprecision dvalidrg(2)
+      NCBYTE_T bvalidrg(2)
+      character*31 gavalue(2), cavalue(2)
+      real epsilon
+
+      data bvalidrg/-127,127/
+      data svalidrg/-100,100/
+      data lvalidrg/0,360/
+      data rvalidrg/0.0, 5000.0/
+      data dvalidrg/0D0,500D0/
+      data gavalue/'NWS', '88/10/25 12:00:00'/
+      data cavalue/'test string', 'a'/
+      data lenstr/80/   
+      data epsilon /.000001/
+
+      incdf = ncopn(iname, NCNOWRIT, iret)
+      if (iret .ne. 0) nfails = nfails + 1
+
+      outcdf = nccre(oname, NCCLOB, iret)
+      if (iret .ne. 0) nfails = nfails + 1
+
+      call tncddef(outcdf, nfails)
+      call tncvdef(outcdf, nfails)
+      call ncinq (incdf, ndims, nvars, natts, recdim, iret)
+      if (iret .ne. 0) nfails = nfails + 1
+      do 5 j = 1, natts
+         call ncanam (incdf, NCGLOBAL, j, attnam, iret)
+         if (iret .ne. 0) nfails = nfails + 1
+         call ncacpy (incdf, NCGLOBAL, attnam, outcdf, NCGLOBAL, iret)
+         if (iret .ne. 0) nfails = nfails + 1
+ 5    continue
+      do 10 i = 1, nvars
+         call ncvinq (incdf, i, vname, vartyp, nvdims,
+     +        vdims, nvatts, iret)
+         if (iret .ne. 0) nfails = nfails + 1
+         do 20 k = 1, nvatts
+            call ncanam (incdf, i, k, attnam, iret)
+            if (iret .ne. 0) nfails = nfails + 1
+            call ncacpy (incdf, i, attnam, outcdf, i, iret)
+            if (iret .ne. 0) nfails = nfails + 1
+ 20      continue
+ 10   continue
+!     
+!     get global attributes first
+!     
+      do 100 i = 1, natts
+         call ncanam (outcdf, NCGLOBAL, i, attnam, iret)
+         if (iret .ne. 0) nfails = nfails + 1
+         call ncainq (outcdf, NCGLOBAL, attnam, attype, attlen,
+     +        iret)
+         if (iret .ne. 0) nfails = nfails + 1
+         if (attlen .gt. mattlen) then
+            write (*,*) 'global attribute too big!', attlen, mattlen
+            stop 2
+         else if (attype .eq. NCBYTE) then
+            call ncagt (outcdf, NCBYTE, attnam, bytval, iret)
+            if (iret .ne. 0) nfails = nfails + 1
+         else if (attype .eq. NCCHAR) then
+            call ncagtc (outcdf, NCGLOBAL, attnam, charval, 
+     +           lenstr, iret)
+            if (iret .ne. 0) nfails = nfails + 1
+            if (attnam .ne. gattnam(i)) write(*,*) 'error in ncagt G'
+            if (charval .ne. gavalue(i))
+     + write(*,*) 'error in ncagt G2', lenstr, charval, gavalue(i)
+                  charval = ' '
+         else if (attype .eq. NCSHORT) then
+            call ncagt (outcdf, NCGLOBAL, attnam, shval, iret)
+            if (iret .ne. 0) nfails = nfails + 1
+         else if (attype .eq. NCLONG) then
+            call ncagt (outcdf, NCGLOBAL, attnam, lngval, iret)            
+            if (iret .ne. 0) nfails = nfails + 1
+         else if (attype .eq. NCFLOAT) then
+            call ncagt (outcdf, NCGLOBAL, attnam, flval, iret)
+            if (iret .ne. 0) nfails = nfails + 1
+         else 
+            call ncagt (outcdf, NCGLOBAL, attnam, doubval,iret)          
+            if (iret .ne. 0) nfails = nfails + 1
+         end if
+ 100   continue
+!
+!     get variable attributes
+!
+      do 200 i = 1, nvars
+         call ncvinq (outcdf, i, varnam, vartyp, nvdims, vdims,
+     +                nvatts, iret)
+         if (iret .ne. 0) nfails = nfails + 1
+         do 250 j = 1, nvatts
+            call ncanam (outcdf, i, j, attnam, iret)
+            if (iret .ne. 0) nfails = nfails + 1
+            call ncainq (outcdf, i, attnam, attype, attlen,
+     +                   iret)
+            if (iret .ne. 0) nfails = nfails + 1
+            if (attlen .gt. mattlen) then
+               write (*,*) 'variable ', i,  'attribute too big !'
+               stop 2
+            else 
+               if (attype .eq. NCBYTE) then
+                  call ncagt (outcdf, i, attnam, bytval, 
+     +                 iret)
+                  if (iret .ne. 0) nfails = nfails + 1
+                  if (attnam .ne. attname(j,i))
+     +               write(*,*) 'error in ncagt BYTE N'
+                  if (bytval(j) .ne. bvalidrg(j)) write(*,*)
+     + 'ncacpy: byte ', bytval(j), ' .ne. ', bvalidrg(j)
+               else if (attype .eq. NCCHAR) then
+                  call ncagtc (outcdf, i, attnam, charval, 
+     +                 lenstr, iret)
+                  if (iret .ne. 0) nfails = nfails + 1
+                  if (attnam .ne. attname(j,i)) 
+     +               write(*,*) 'error in ncagt CHAR N'
+                  if (charval .ne. cavalue(j)) 
+     +               write(*,*) 'error in ncagt'
+                  charval = ' '
+               else if (attype .eq. NCSHORT) then
+                  call ncagt (outcdf, i, attnam, shval, 
+     +                 iret)  
+                  if (iret .ne. 0) nfails = nfails + 1
+                  if (attnam .ne. attname(j,i)) 
+     +               write(*,*) 'error in ncagt SHORT N'
+                  if (shval(j) .ne. svalidrg(j)) then
+                     write(*,*) 'error in ncagt SHORT'
+                  end if
+               else if (attype .eq. NCLONG) then
+                  call ncagt (outcdf, i, attnam, lngval, 
+     +                 iret)
+                  if (iret .ne. 0) nfails = nfails + 1
+                  if (attnam .ne. attname(j,i)) 
+     +               write(*,*) 'error in ncagt LONG N'
+                  if (lngval(j) .ne. lvalidrg(j)) 
+     +               write(*,*) 'error in ncagt LONG'
+               else if (attype .eq. NCFLOAT) then
+                  call ncagt (outcdf, i, attnam, flval, 
+     +                 iret)            
+                  if (iret .ne. 0) nfails = nfails + 1
+                  if (attnam .ne. attname(j,i)) 
+     +               write(*,*) 'error in ncagt FLOAT N'
+                  if (flval(j) .ne. rvalidrg(j)) 
+     +               write(*,*) 'error in ncagt FLOAT'
+               else if (attype .eq. NCDOUBLE) then
+                  call ncagt (outcdf, i, attnam, doubval,
+     +                 iret)          
+                  if (iret .ne. 0) nfails = nfails + 1
+                  if (attnam .ne. attname(j,i)) 
+     +               write(*,*) 'error in ncagt DOUBLE N'
+                  if ( abs(doubval(j) - dvalidrg(j)) .gt. epsilon)
+     + write(*,*) 'error in ncagt DOUBLE'
+               end if
+            end if
+ 250     continue
+ 200   continue
+      call ncclos(incdf, iret)
+      if (iret .ne. 0) nfails = nfails + 1
+      call ncclos(outcdf, iret)
+      if (iret .ne. 0) nfails = nfails + 1
+      return
+      end
+
+
+      
+!     
+!     subroutine to test ncadel
+!
+      subroutine tncadel (cdfname, nfails)
+      character*31 cdfname
+#include "netcdf.inc"
+      
+      integer  bid, sid, lid, fid, did, cid, chid
+      common /vars/bid, sid, lid, fid, did, cid, chid
+      integer ncid, iret, i, j
+      integer ndims, nvars, natts, recdim
+      integer vartyp, nvdims, vdims(MAXVDIMS), nvatts
+      character*31 varnam, attnam
+
+      ncid = ncopn(cdfname, NCWRITE, iret)
+      if (iret .ne. 0) nfails = nfails + 1
+!     put cdf in define mode
+      call ncredf (ncid,iret)
+      if (iret .ne. 0) nfails = nfails + 1
+!     get number of global attributes
+      call ncinq (ncid, ndims, nvars, natts, recdim, iret)
+      if (iret .ne. 0) nfails = nfails + 1
+      do 10 i = natts, 1, -1
+!     get name of global attribute
+         call ncanam (ncid, NCGLOBAL, i, attnam, iret)
+         if (iret .ne. 0) nfails = nfails + 1
+!     delete global attribute
+         call ncadel (ncid, NCGLOBAL, attnam, iret)
+         if (iret .ne. 0) nfails = nfails + 1
+ 10   continue
+
+      do 100 i = 1, nvars
+!     get number of variable attributes
+         call ncvinq (ncid, i, varnam, vartyp, nvdims, vdims,
+     +        nvatts, iret)
+         if (iret .ne. 0) nfails = nfails + 1
+         do 200 j = nvatts, 1, -1
+            call ncanam (ncid, i, j, attnam, iret)
+            if (iret .ne. 0) nfails = nfails + 1
+            call ncadel (ncid, i, attnam, iret)
+            if (iret .ne. 0) nfails = nfails + 1
+ 200     continue
+ 100  continue
+      call ncinq (ncid, ndims, nvars, natts, recdim, iret)
+      if (iret .ne. 0) nfails = nfails + 1
+      if (natts .ne. 0) write(*,*) 'error in ncadel'
+!     put netCDF into data mode
+      call ncendf (ncid, iret)
+      if (iret .ne. 0) nfails = nfails + 1
+      call ncclos (ncid, iret)
+      if (iret .ne. 0) nfails = nfails + 1
+      return
+      end
+
+!
+!     subroutine to test ncagt and ncagtc
+
+      subroutine tncagt(cdfname, nfails)
+#include "netcdf.inc"
+      character*31 cdfname
+            
+!     maximum length of an attribute
+      integer mattlen
+      parameter (mattlen = 80)
+      integer ncid, ndims, nvars, natts, recdim
+      integer bid, sid, lid, fid, did, cid, chid
+      common /vars/bid, sid, lid, fid, did, cid, chid
+      integer i, j
+      integer attype, attlen, lenstr, iret
+      character*31 attnam
+      character*80 charval
+      doubleprecision doubval(2)
+      real flval(2)
+      integer lngval(2)
+      NCSHORT_T shval(2)
+      NCBYTE_T bytval(2)
+      integer vartyp, nvdims, vdims(MAXVDIMS), nvatts
+
+      character*31 varnam, attname(2,7), gattnam(2)
+      common /atts/attname, gattnam
+      NCSHORT_T svalidrg(2)
+      real rvalidrg(2)
+      integer lvalidrg(2)
+      doubleprecision dvalidrg(2)
+      NCBYTE_T bvalidrg(2)
+      character*31 gavalue(2), cavalue(2)
+      real epsilon
+
+      data bvalidrg/-127,127/
+      data svalidrg/-100,100/
+      data lvalidrg/0,360/
+      data rvalidrg/0.0, 5000.0/
+      data dvalidrg/0D0,500D0/
+      data gavalue/'NWS', '88/10/25 12:00:00'/
+      data cavalue/'test string', 'a'/
+      data lenstr/80/   
+      data epsilon /.000001/
+      
+      ncid = ncopn (cdfname, NCNOWRIT, iret)
+      if (iret .ne. 0) nfails = nfails + 1
+      call ncinq (ncid, ndims, nvars, natts, recdim, iret)
+      if (iret .ne. 0) nfails = nfails + 1
+!     
+!     get global attributes first
+!     
+      do 10 i = 1, natts
+!     get name of attribute
+         call ncanam (ncid, NCGLOBAL, i, attnam, iret)
+         if (iret .ne. 0) nfails = nfails + 1
+!     get attribute type and length
+         call ncainq (ncid, NCGLOBAL, attnam, attype, attlen,
+     +        iret)
+         if (iret .ne. 0) nfails = nfails + 1
+         if (attlen .gt. mattlen) then
+            write (*,*) 'global attribute too big!'
+            stop 2
+         else if (attype .eq. NCBYTE) then
+            call ncagt (ncid, NCBYTE, attnam, bytval, iret)
+            if (iret .ne. 0) nfails = nfails + 1
+         else if (attype .eq. NCCHAR) then
+            call ncagtc (ncid, NCGLOBAL, attnam, charval, 
+     +           lenstr, iret)
+            if (iret .ne. 0) nfails = nfails + 1
+            if (attnam .ne. gattnam(i)) write(*,*) 'error in ncagt'
+            if (charval .ne. gavalue(i)) write(*,*) 'error in ncagt'
+            charval = '                                        '
+         else if (attype .eq. NCSHORT) then
+            call ncagt (ncid, NCGLOBAL, attnam, shval, iret) 
+            if (iret .ne. 0) nfails = nfails + 1
+         else if (attype .eq. NCLONG) then
+            call ncagt (ncid, NCGLOBAL, attnam, lngval, iret)            
+            if (iret .ne. 0) nfails = nfails + 1
+         else if (attype .eq. NCFLOAT) then
+            call ncagt (ncid, NCGLOBAL, attnam, flval, iret)
+            if (iret .ne. 0) nfails = nfails + 1
+         else 
+            call ncagt (ncid, NCGLOBAL, attnam, doubval,iret)          
+            if (iret .ne. 0) nfails = nfails + 1
+         end if
+ 10   continue
+
+!
+!     get variable attributes
+!
+      do 20 i = 1, nvars
+         call ncvinq (ncid, i, varnam, vartyp, nvdims, vdims,
+     +                nvatts, iret)
+         if (iret .ne. 0) nfails = nfails + 1
+         do 25 j = 1, nvatts
+            call ncanam (ncid, i, j, attnam, iret)
+            if (iret .ne. 0) nfails = nfails + 1
+            call ncainq (ncid, i, attnam, attype, attlen,
+     +                   iret)
+            if (iret .ne. 0) nfails = nfails + 1
+            if (attlen .gt. mattlen) then
+               write (*,*) 'variable ', i,  'attribute too big !'
+               stop 2
+            else 
+               if (attype .eq. NCBYTE) then
+                  call ncagt (ncid, i, attnam, bytval, 
+     +                 iret)
+                  if (iret .ne. 0) nfails = nfails + 1
+                  if (attnam .ne. attname(j,i)) 
+     +               write(*,*) 'error in ncagt BYTE name'
+                  if (bytval(j) .ne. bvalidrg(j)) write(*,*)
+     + 'ncacpy: byte ', bytval(j), ' .ne. ', bvalidrg(j)
+               else if (attype .eq. NCCHAR) then
+                  call ncagtc (ncid, i, attnam, charval, 
+     +                 lenstr, iret)
+                  if (iret .ne. 0) nfails = nfails + 1
+                  if (attnam .ne. attname(j,i)) 
+     +               write(*,*) 'error in ncagt CHAR name'
+                  if (charval .ne. cavalue(j)) 
+     +               write(*,*) 'error in ncagt CHAR name'
+                 charval = '                                        '
+               else if (attype .eq. NCSHORT) then
+                  call ncagt (ncid, i, attnam, shval, 
+     +                 iret)  
+                  if (iret .ne. 0) nfails = nfails + 1
+                  if (attnam .ne. attname(j,i)) 
+     +               write(*,*) 'error in ncagt SHORT name'
+                  if (shval(j) .ne. svalidrg(j)) then
+                     write(*,*) 'error in ncagt SHORT'
+                  end if
+               else if (attype .eq. NCLONG) then
+                  call ncagt (ncid, i, attnam, lngval, 
+     +                 iret)
+                  if (iret .ne. 0) nfails = nfails + 1
+                  if (attnam .ne. attname(j,i)) 
+     +               write(*,*) 'error in ncagt LONG name'
+                  if (lngval(j) .ne. lvalidrg(j)) 
+     +               write(*,*) 'error in ncagt LONG'
+               else if (attype .eq. NCFLOAT) then
+                  call ncagt (ncid, i, attnam, flval, 
+     +                 iret)            
+                  if (iret .ne. 0) nfails = nfails + 1
+                  if (attnam .ne. attname(j,i)) 
+     +               write(*,*) 'error in ncagt FLOAT name'
+                  if (flval(j) .ne. rvalidrg(j)) 
+     +               write(*,*) 'error in ncagt FLOAT'
+               else if (attype .eq. NCDOUBLE) then
+                  call ncagt (ncid, i, attnam, doubval,
+     +                 iret)          
+                  if (iret .ne. 0) nfails = nfails + 1
+                  if (attnam .ne. attname(j,i)) 
+     +               write(*,*) 'error in ncagt DOUBLE name'
+                  if ( abs(doubval(j) - dvalidrg(j)) .gt. epsilon)
+     + write(*,*) 'error in ncagt DOUBLE'
+               end if
+            end if
+ 25      continue
+ 20   continue
+      call ncclos(ncid, iret)
+      if (iret .ne. 0) nfails = nfails + 1
+      return
+      end
+!
+!     subroutine to test ncapt
+!
+      subroutine tncapt (ncid, nfails)
+#include "netcdf.inc"
+      integer ncid, iret
+
+! attribute vectors
+      NCSHORT_T svalidrg(2)
+      real rvalidrg(2)
+      integer lvalidrg(2)
+      doubleprecision dvalidrg(2)
+      NCBYTE_T bvalidrg(2)
+
+!     variable ids
+      integer  bid, sid, lid, fid, did, cid, chid
+      common /vars/bid, sid, lid, fid, did, cid, chid
+
+! assign attributes
+      
+!
+!     byte
+!
+      
+      bvalidrg(1) = -127
+      bvalidrg(2) =  127
+      call ncapt (ncid, bid, 'validrange', NCBYTE, 2,
+     +bvalidrg, iret)
+      if (iret .ne. 0) nfails = nfails + 1
+
+!
+!     short
+!
+
+      svalidrg(1) = -100
+      svalidrg(2) = 100
+      call ncapt (ncid, sid, 'validrange', NCSHORT, 2, 
+     +svalidrg, iret)
+      if (iret .ne. 0) nfails = nfails + 1
+
+!
+!     long
+!
+
+      lvalidrg(1) = 0
+      lvalidrg(2) = 360
+      call ncapt (ncid, lid, 'validrange', NCLONG, 2,
+     +lvalidrg, iret)
+      if (iret .ne. 0) nfails = nfails + 1
+      
+!
+!     float
+!
+
+      rvalidrg(1) = 0.0
+      rvalidrg(2) = 5000.0
+      call ncapt (ncid, fid, 'validrange', NCFLOAT, 2,
+     +rvalidrg, iret)
+      if (iret .ne. 0) nfails = nfails + 1
+
+!
+!     double
+!
+
+      dvalidrg(1) = 0D0
+      dvalidrg(2) = 500D0
+      call ncapt (ncid, did, 'validrange', NCDOUBLE, 2,
+     +dvalidrg, iret)
+      if (iret .ne. 0) nfails = nfails + 1
+
+!
+!     global
+!
+
+      call ncaptc (ncid, NCGLOBAL, 'source', NCCHAR, 3, 
+     +'NWS', iret)
+      if (iret .ne. 0) nfails = nfails + 1
+      call ncaptc (ncid, NCGLOBAL, 'basetime', NCCHAR, 17, 
+     +'88/10/25 12:00:00', iret)
+      if (iret .ne. 0) nfails = nfails + 1
+
+!
+!     char
+!
+
+      call ncaptc (ncid, chid, 'longname', NCCHAR, 11,
+     +'test string', iret)
+      if (iret .ne. 0) nfails = nfails + 1
+
+      call ncaptc (ncid, chid, 'id', NCCHAR, 1,
+     +'a', iret)
+      if (iret .ne. 0) nfails = nfails + 1
+
+      return
+      end
+
+!
+!     initialize variables in labelled common blocks
+!
+      block data
+      common /cdims/ dimnam
+      common /dims/timedim, latdim, londim, leveldim, lendim,
+     + dimsiz
+      common /varn/varnam
+      common /atts/attname, gattnam
+      integer  latdim, londim, leveldim, timedim, lendim
+
+!     should include 'netcdf.inc' for MAXNCDIM, but it has EXTERNAL
+!     declaration, which is not permitted in a BLOCK DATA unit.
+
+      integer dimsiz(1024)
+      character*31 dimnam(1024)
+      character*31 varnam(7)
+      character*31 attname(2,7)
+      character*31 gattnam(2)
+
+      data dimnam /'time', 'lat', 'lon', 'level',
+     + 'length', 1019*'0'/
+      data dimsiz /4, 5, 5, 4, 80, 1019*0/
+      data varnam/'bytev', 'shortv', 'longv', 'floatv', 'doublev', 
+     + 'chv', 'cv'/
+      
+      data attname/'validrange', '0', 'validrange', '0', 'validrange',
+     + '0', 'validrange', '0', 'validrange', '0', 'longname', 'id',
+     + '0', '0'/
+      data gattnam/'source','basetime'/
+      end
+
+
+!
+!     subroutine to test ncddef
+!
+
+      subroutine tncddef(ncid, nfails)
+#include "netcdf.inc"
+      integer ncid
+
+!     sizes of dimensions of 'test.nc' and 'copy.nc'
+      integer  ndims
+      parameter(ndims=5)
+! dimension ids
+      integer  latdim, londim, leveldim, timedim, lendim
+      integer iret
+!     function to define a netCDF dimension
+      integer dimsiz(MAXNCDIM)
+      character*31 dimnam(MAXNCDIM)
+      
+      common /dims/timedim, latdim, londim, leveldim, lendim,
+     + dimsiz
+      common /cdims/ dimnam
+
+! define dimensions
+      timedim = ncddef(ncid, dimnam(1), NCUNLIM, iret)
+      if (iret .ne. 0) nfails = nfails + 1
+      latdim = ncddef(ncid, dimnam(2), dimsiz(2), iret)
+      if (iret .ne. 0) nfails = nfails + 1
+      londim = ncddef(ncid, dimnam(3), dimsiz(3), iret)
+      if (iret .ne. 0) nfails = nfails + 1
+      leveldim = ncddef(ncid, dimnam(4), dimsiz(4), iret)
+      if (iret .ne. 0) nfails = nfails + 1
+      lendim = ncddef(ncid, dimnam(5), dimsiz(5), iret)
+      if (iret .ne. 0) nfails = nfails + 1
+      return
+      end
+!
+!     subroutine to test ncinq, ncdinq, ncdid, ncvinq, ncanam
+!     and ncainq
+!
+      subroutine tncinq(cdfname, nfails)
+#include "netcdf.inc"
+      character*31 cdfname
+
+!     netCDF id
+      integer ncid
+!     returned number of dimensions
+      integer ndims
+!     returned number of variables
+      integer nvars
+!     returned number of global attributes
+      integer natts
+!     returned id of the unlimited dimension
+      integer recdim
+!     returned error code
+      integer iret
+!     returned name of record dimension
+      character*31 recnam
+!     returned size of record dimension
+      integer recsiz
+!     loop control variables
+      integer i, j, k
+!     returned size of dimension
+      integer dsize
+!     returned dimension ID
+      integer dimid
+!     returned dimension name
+      character*31 dname
+!     returned variable name
+      character*31 vname
+!     returned attribute name
+      character*31 attnam
+!     returned netCDF datatype of variable
+      integer vartyp
+!     returned number of variable dimensions
+      integer nvdims
+!     returned number of variable attributes
+      integer nvatts
+!     returned vector of nvdims dimension IDS corresponding to the
+!     variable dimensions
+      integer vdims(MAXNCDIM)
+!     returned attribute length
+      integer attlen
+!     returned attribute type
+      integer attype
+      character*31 dimnam(MAXNCDIM)
+      character*31 varnam(7)
+      character*31 attname(2,7)
+      character*31 gattnam(2)
+      integer vdlist(5,7), vtyp(7), vndims(7), vnatts(7)
+      integer attyp(2,7),atlen(2,7),gattyp(2),gatlen(2)
+      integer timedim,latdim,londim,leveldim,lendim
+      integer dimsiz(MAXNCDIM)
+      common /dims/timedim, latdim, londim, leveldim, lendim,
+     + dimsiz
+      common /varn/varnam
+      common /atts/attname, gattnam
+      common /cdims/ dimnam
+
+      data vdlist/1,0,0,0,0,1,0,0,0,0,2,0,0,0,0,4,3,2,1,0,4,3,2,1,0,
+     + 5,1,0,0,0,1,0,0,0,0/
+      data vtyp/NCBYTE, NCSHORT, NCLONG, NCFLOAT, NCDOUBLE, NCCHAR,
+     + NCCHAR/
+      data vndims/1,1,1,4,4,2,1/
+      data vnatts/1,1,1,1,1,2,0/
+      data attyp/NCBYTE, 0, NCSHORT, 0, NCLONG, 0, NCFLOAT, 0,
+     + NCDOUBLE, 0, NCCHAR, NCCHAR, 0, 0/
+      data atlen/2,0,2,0,2,0,2,0,2,0,11,1, 0, 0/
+      data gattyp/NCCHAR,NCCHAR/
+      data gatlen/3,17/
+
+      ncid = ncopn (cdfname, NCNOWRIT, iret)
+      call ncinq (ncid, ndims, nvars, natts, recdim, iret)
+      if (iret .ne. 0) nfails = nfails + 1
+      if (ndims .ne. 5) write(*,*) 'error in ncinq or ncddef'
+      if (nvars .ne. 7) write(*,*) 'error in ncinq or ncvdef'
+      if (natts .ne. 2) write(*,*) 'error in ncinq or ncapt'
+      call ncdinq (ncid, recdim, recnam, recsiz, iret)
+      if (iret .ne. 0) nfails = nfails + 1
+      if (recnam .ne. 'time') write(*,*) 'error: bad recdim from ncinq'
+!
+!     dimensions
+!
+      do 10 i = 1, ndims
+         call ncdinq (ncid, i, dname, dsize, iret)
+         if (iret .ne. 0) nfails = nfails + 1
+         if (dname .ne. dimnam(i)) 
+     +      write(*,*) 'error in ncdinq or ncddef, dname=', dname
+         if (dsize .ne. dimsiz(i)) 
+     +      write(*,*) 'error in ncdinq or ncddef, dsize=',dsize
+         dimid = ncdid (ncid, dname, iret)
+         if (dimid .ne. i) write(*,*)
+     +      'error in ncdinq or ncddef, dimid=', dimid
+ 10   continue
+!
+!     variables
+!
+      do 30 i = 1, nvars
+         call ncvinq (ncid, i, vname, vartyp, nvdims,
+     +        vdims, nvatts, iret)
+         if (iret .ne. 0) nfails = nfails + 1
+         if (vname .ne. varnam(i)) 
+     +      write(*,*) 'error: from ncvinq, wrong name returned: ', 
+     +         vname, ' .ne. ', varnam(i)
+         if (vartyp .ne. vtyp(i)) 
+     +      write(*,*) 'error: from ncvinq, wrong type returned: ', 
+     +         vartyp, ' .ne. ', vtyp(i)
+         if (nvdims .ne. vndims(i)) 
+     +      write(*,*) 'error: from ncvinq, wrong num dims returned: ', 
+     +         vdims, ' .ne. ', vndims(i)
+         do 35 j = 1, nvdims
+            if (vdims(j) .ne. vdlist(j,i)) 
+     +         write(*,*) 'error: from ncvinq wrong dimids: ',
+     +            vdims(j), ' .ne. ', vdlist(j,i)
+ 35      continue
+         if (nvatts .ne. vnatts(i)) 
+     +      write(*,*) 'error in ncvinq or ncvdef'
+!
+!     attributes
+!
+         do 45 k = 1, nvatts
+            call ncanam (ncid, i, k, attnam, iret)
+            if (iret .ne. 0) nfails = nfails + 1
+            call ncainq (ncid, i, attnam, attype, attlen, iret)
+            if (iret .ne. 0) nfails = nfails + 1
+            if (attnam .ne. attname(k,i)) 
+     +         write(*,*) 'error in ncanam or ncapt'
+            if (attype .ne. attyp(k,i)) 
+     +         write(*,*) 'error in ncainq or ncapt'
+            if (attlen .ne. atlen(k,i)) 
+     +         write(*,*) 'error in ncainq or ncapt'
+ 45      continue
+ 30   continue
+      do 40 i = 1, natts
+         call ncanam (ncid, NCGLOBAL, i, attnam, iret)
+         if (iret .ne. 0) nfails = nfails + 1
+         call ncainq (ncid, NCGLOBAL, attnam, attype, attlen, iret)
+         if (iret .ne. 0) nfails = nfails + 1
+         if (attnam .ne. gattnam(i)) 
+     +      write(*,*) 'error in ncanam or ncapt'
+         if (attype .ne. gattyp(i)) 
+     +      write(*,*) 'error in ncainq or ncapt'
+         if (attlen .ne. gatlen(i)) 
+     +      write(*,*) 'error in ncainq or ncapt'
+ 40   continue
+      call ncclos(ncid, iret)
+      if (iret .ne. 0) nfails = nfails + 1
+      return
+      end
+      
+      
+      
+!     subroutine to test ncredf, ncdren, ncvren, ncaren, and 
+!     ncendf
+
+      subroutine tncredf(cdfname, nfails)
+#include "netcdf.inc"
+      character*31 cdfname
+      character*31 attname(2,7)
+      character*31 gattnam(2)
+      common /atts/attname, gattnam
+      common /cdims/ dimnam
+      character*31 dimnam(MAXNCDIM)
+      character*31 varnam(7)
+      common /varn/varnam
+      integer ncid, iret, latid, varid
+
+      dimnam(2) = 'latitude'
+      varnam(4) = 'realv'
+      attname(1,6) = 'stringname'
+      gattnam(1) = 'agency'
+      ncid = ncopn(cdfname, NCWRITE, iret)
+      if (iret .ne. 0) nfails = nfails + 1
+      call ncredf(ncid, iret)
+      if (iret .ne. 0) nfails = nfails + 1
+      latid = ncdid(ncid, 'lat', iret)
+      call ncdren(ncid, latid, 'latitude', iret)
+      if (iret .ne. 0) nfails = nfails + 1
+      varid = ncvid(ncid, 'floatv', iret)
+      call ncvren(ncid, varid, 'realv', iret)
+      if (iret .ne. 0) nfails = nfails + 1
+      varid = ncvid(ncid, 'chv', iret)
+      if (iret .ne. 0) nfails = nfails + 1
+      call ncaren(ncid, varid, 'longname', 'stringname', iret)
+      if (iret .ne. 0) nfails = nfails + 1
+      call ncaren(ncid, NCGLOBAL, 'source', 'agency', iret)
+      if (iret .ne. 0) nfails = nfails + 1
+      call ncendf(ncid, iret)
+      if (iret .ne. 0) nfails = nfails + 1
+      call ncclos(ncid, iret)
+      if (iret .ne. 0) nfails = nfails + 1
+      return
+      end
+!     
+!     subroutine to test ncvdef
+!
+
+      subroutine tncvdef(ncid, nfails)
+#include "netcdf.inc"
+      integer ncid
+
+!     function to define a netCDF variable
+      integer dimsiz(MAXNCDIM)
+      integer  latdim, londim, leveldim, timedim, lendim
+      common /dims/timedim, latdim, londim, leveldim, lendim, 
+     + dimsiz
+
+! variable ids
+      integer  bid, sid, lid, fid, did, cid, chid
+      common /vars/bid, sid, lid, fid, did, cid, chid
+
+! variable shapes
+      integer  bdims(1), fdims(4), ddims(4), ldims(1), sdims(1) 
+      integer chdims(2), cdims(1)
+
+      integer iret
+!
+! define variables
+!
+!     byte
+! 
+      bdims(1) = timedim
+      bid = ncvdef(ncid, 'bytev', NCBYTE, 1, bdims, iret)
+      if (iret .ne. 0) nfails = nfails + 1
+!
+!     short
+!
+      sdims(1) = timedim
+      sid = ncvdef (ncid, 'shortv', NCSHORT, 1, sdims, iret)
+      if (iret .ne. 0) nfails = nfails + 1
+!
+!     long
+!
+      ldims(1) = latdim
+      lid = ncvdef (ncid, 'longv', NCLONG, 1, ldims, iret)
+      if (iret .ne. 0) nfails = nfails + 1
+!
+!     float
+!
+      fdims(4) = timedim
+      fdims(1) = leveldim
+      fdims(2) = londim
+      fdims(3) = latdim
+      fid = ncvdef (ncid, 'floatv', NCFLOAT, 4, fdims, iret)
+      if (iret .ne. 0) nfails = nfails + 1
+!
+!     double
+!
+      ddims(4) = timedim
+      ddims(1) = leveldim
+      ddims(2) = londim
+      ddims(3) = latdim
+      did = ncvdef (ncid, 'doublev', NCDOUBLE, 4, ddims, iret)
+      if (iret .ne. 0) nfails = nfails + 1
+!
+!     char
+!
+      chdims(2) = timedim
+      chdims(1) = lendim
+      chid = ncvdef (ncid, 'chv', NCCHAR, 2, chdims, iret)
+      if (iret .ne. 0) nfails = nfails + 1
+
+      cdims(1) = timedim
+      cid = ncvdef (ncid, 'cv', NCCHAR, 1, cdims, iret)
+      if (iret .ne. 0) nfails = nfails + 1
+
+
+      return
+      end
+
+
+!    
+!     subroutine to test ncvgt and ncvgtc
+!
+      subroutine tncvgt(cdfname, nfails)
+#include "netcdf.inc"
+      character*31 cdfname
+
+      integer ndims, times, lats, lons, levels, lenstr
+      parameter (times=4, lats=5, lons=5, levels=4)
+
+      integer start(4), count(4)
+      integer ncid, iret, i, m
+      integer  latdim, londim, leveldim, timedim, lendim
+      integer dimsiz(MAXNCDIM)
+      common /dims/timedim, latdim, londim, leveldim, lendim,
+     + dimsiz
+
+      integer bid, sid, lid, fid, did, cid, chid
+      common /vars/bid, sid, lid, fid, did, cid, chid
+      integer itime, ilev, ilat, ilon
+
+!     arrays of data values to be read
+      NCBYTE_T barray(times), byval(times)
+      NCSHORT_T sarray(times), shval(times)
+      integer larray(lats)
+      real farray(levels, lats, lons, times)
+      doubleprecision darray(levels, lats, lons, times)
+!     character array of data values to be read
+      character*31 string
+      character*31 varnam
+      integer nvars, natts, recdim
+      integer vartyp, nvdims, vdims(MAXVDIMS), nvatts
+
+      data start/1,1,1,1/
+      data count/levels, lats, lons, times/
+      data byval /97, 98, 99, 100/
+      data shval /10, 11, 12, 13/
+
+      ncid = ncopn (cdfname, NCWRITE, iret)
+      if (iret .ne. 0) nfails = nfails + 1
+!     get number of variables in netCDF
+      call ncinq (ncid, ndims, nvars, natts, recdim, iret)
+      if (iret .ne. 0) nfails = nfails + 1
+      do 5 m = 1, nvars-1
+!     get variable name, datatype, number of dimensions
+!     vector of dimension ids, and number of variable attributes
+         call ncvinq (ncid, m, varnam, vartyp, nvdims, vdims,
+     +                nvatts, iret)
+         if (iret .ne. 0) nfails = nfails + 1
+         if (vartyp .eq. NCBYTE) then
+!
+!     byte
+!
+            count(1) = times
+            call ncvgt (ncid, m, start, count, barray, iret)
+            if (iret .ne. 0) nfails = nfails + 1
+            do 10 i = 1, times
+               if (barray(i) .ne. byval(i)) then 
+                  write(*,*) 'ncvgt of bytes, got ', barray(i), ' .ne. '
+     +                       , byval(i)
+               end if
+ 10         continue
+         else if (vartyp .eq. NCSHORT) then
+!
+!     short
+!
+            count(1) = times
+            call ncvgt (ncid, m, start, count, sarray, iret)
+            if (iret .ne. 0) nfails = nfails + 1
+            do 20 i = 1, times
+               if (sarray(i) .ne. shval(i)) then 
+                  write(*,*) 'ncvgt of short, got ', sarray(i), ' .ne. '
+     +                       , shval(i)
+               end if
+ 20         continue
+         else if (vartyp .eq. NCLONG) then
+!     
+!     long
+!
+            count(1) = lats
+            call ncvgt (ncid, m, start, count, larray, iret)
+            if (iret .ne. 0) nfails = nfails + 1
+            do 30 i = 1, lats
+               if (larray(i) .ne. 1000) then 
+                  write(*,*) 'long error in ncvgt'
+               end if
+ 30         continue
+         else if (vartyp .eq. NCFLOAT) then
+!     
+!     float
+!
+            count(1) = levels
+            call ncvgt (ncid, m, start, count, farray, iret)
+            if (iret .ne. 0) nfails = nfails + 1
+            i = 0
+            do 40 itime = 1,times
+               do 41 ilon = 1, lons
+                  do 42 ilat = 1, lats
+                     do 43 ilev = 1, levels
+                        i = i + 1
+                        if (farray(ilev, ilat, ilon, itime) .ne.
+     + real(i)) then
+                           write (*,*) 'float error in ncvgt'
+                        end if
+ 43         continue
+ 42         continue
+ 41         continue
+ 40         continue
+         else if (vartyp .eq. NCDOUBLE) then
+!
+!     double
+!
+            count(1) = levels
+            call ncvgt (ncid, m, start, count, darray, iret)
+            if (iret .ne. 0) nfails = nfails + 1
+            i = 0
+            do 50 itime = 1, times
+               do 51 ilon = 1, lons
+                  do 52 ilat = 1, lats
+                     do 53 ilev = 1, levels
+                        i = i + 1
+                        if (darray(ilev, ilat, ilon, itime) .ne.
+     +                       real (i)) then
+                           write(*,*) 'double error in ncvgt:', i,
+     +              darray(ilev, ilat, ilon, itime), '.ne.', 
+     +              real (i)
+                        end if
+ 53         continue
+ 52         continue
+ 51         continue
+ 50         continue
+         else 
+!     
+!     char
+!
+            count(1) = 3
+            count(2) = 4
+            lenstr = 31
+            call ncvgtc (ncid, m, start, count, string, lenstr, iret)
+            if (iret .ne. 0) nfails = nfails + 1
+            if (string .ne. 'testhikin of') then 
+               write(*,*) 'error in ncvgt, returned string =', string
+            end if
+         end if
+ 5    continue
+      call ncclos(ncid, iret)
+      if (iret .ne. 0) nfails = nfails + 1
+      return
+      end
+
+      
+      subroutine tncvgt1(cdfname, nfails)
+#include "netcdf.inc"
+      character*31 cdfname
+
+      integer ncid, iret
+      integer  latdim, londim, leveldim, timedim, lendim
+      integer dimsiz(MAXNCDIM)
+      common /dims/timedim, latdim, londim, leveldim, lendim,
+     + dimsiz
+
+      integer bindx(1), sindx(1), lindx(1), findx(4), dindx(4), cindx(1)
+
+      integer bid, sid, lid, fid, did, cid, chid
+      common /vars/bid, sid, lid, fid, did, cid, chid
+
+      NCBYTE_T bvalue
+      NCSHORT_T svalue
+      integer lvalue
+      real fvalue
+      doubleprecision dvalue
+      character*1 c
+      real epsilon
+      doubleprecision onethird
+
+      data epsilon /.000001/
+      data lindx/1/, bindx/1/, sindx/1/, findx/1,1,1,1/
+     +dindx/1,1,1,1/, cindx/1/
+      data onethird/0.3333333333D0/
+      
+      ncid = ncopn (cdfname, NCNOWRIT, iret)
+      if (iret .ne. 0) nfails = nfails + 1
+!
+!     test ncvgt1 for byte
+!
+      call ncvgt1 (ncid, bid, bindx, bvalue, iret)
+      if (iret .ne. 0) nfails = nfails + 1
+      if (bvalue .ne. ichar('z')) write(*,*) 'error in ncvgt1 byte:',
+     + bvalue, ' .ne.', ichar('z')
+!
+!     test ncvgt1 for short
+!
+      call ncvgt1 (ncid, sid, sindx, svalue, iret)
+      if (iret .ne. 0) nfails = nfails + 1
+      if (svalue .ne. 10) write(*,*) 'error in ncvgt1 short:',
+     + svalue, ' .ne.', 10
+!     
+!     test ncvgt1 for long
+!
+      call ncvgt1 (ncid, lid, lindx, lvalue, iret)
+      if (iret .ne. 0) nfails = nfails + 1
+      if (lvalue .ne. 1000) write(*,*) 'error in ncvgt1 long:',
+     + lvalue,  ' .ne.', 1000
+!
+!     test ncvgt1 for float
+!
+      call ncvgt1 (ncid, fid, findx, fvalue, iret)
+      if (iret .ne. 0) nfails = nfails + 1
+      if (abs(fvalue - 3.14159) .gt. epsilon) 
+     +   write(*,*) 'error in ncvgt 1 float:', fvalue, 
+     +      ' not close to', 3.14159
+!
+!     test ncvgt1 for double
+!
+      call ncvgt1 (ncid, did, dindx, dvalue, iret)
+      if (iret .ne. 0) nfails = nfails + 1
+      if (abs(dvalue - onethird) .gt. epsilon) write(*,*)
+     + 'error in ncvgt1 double:', dvalue, ' not close to',
+     +     onethird
+!
+!     test ncvg1c for char
+!
+      call ncvg1c (ncid, cid, cindx, c, iret)
+      if (iret .ne. 0) nfails = nfails + 1
+      if (c .ne. 'a') write(*,*) 'error in ncvg1c'
+      call ncclos(ncid, iret)
+      if (iret .ne. 0) nfails = nfails + 1
+      return
+      end
+
+      
+      
+!
+!     subroutine to test ncvpt and ncvptc
+!
+      subroutine tncvpt(cdfname, nfails)
+#include "netcdf.inc"
+      character*31 cdfname
+
+!     size of dimensions
+      integer times, lats, lons, levels
+      parameter (times=4, lats=5, lons=5, levels=4)
+
+      integer ncid, iret
+!     loop control variables
+      integer itime, ilev, ilon, ilat, i
+      integer  latdim, londim, leveldim, timedim, lendim
+      integer dimsiz(MAXNCDIM)
+      common /dims/timedim, latdim, londim, leveldim, lendim,
+     + dimsiz
+      integer lenstr
+      integer bid, sid, lid, fid, did, cid, chid
+      common /vars/bid, sid, lid, fid, did, cid, chid
+
+!     vector of integers specifying the corner of the  hypercube
+!     where the first of the data values will be written
+      integer start(4)
+!     vector of integers specifying the edge lengths from the
+!     corner of the hypercube where the first of the data values
+!     will be written
+      integer count(4)
+
+!     arrays of data values to be written
+      NCBYTE_T barray(times)
+      NCSHORT_T sarray(times)
+      integer larray(lats)
+      real farray(levels, lats, lons, times)
+      doubleprecision darray(levels, lats, lons, times)
+      character*31 string
+
+      data start/1,1,1,1/
+      data count/levels, lats, lons, times/
+      data barray /97, 98, 99, 100/
+      data sarray /10, 11, 12, 13/
+
+      ncid = ncopn (cdfname, NCWRITE, iret)
+      if (iret .ne. 0) nfails = nfails + 1
+
+!
+!     byte
+!
+      count(1) = times
+      call ncvpt (ncid, bid, start, count, barray, iret)
+      if (iret .ne. 0) nfails = nfails + 1
+!
+!     short
+!
+      count(1) = times
+      call ncvpt (ncid, sid, start, count, sarray, iret)
+      if (iret .ne. 0) nfails = nfails + 1
+!
+!     long
+!
+      do 30 i = 1,lats
+         larray(i) = 1000
+ 30   continue
+      count(1) = lats
+      call ncvpt (ncid, lid, start, count, larray, iret)
+      if (iret .ne. 0) nfails = nfails + 1
+
+!
+!     float
+!
+      i = 0
+      do 40 itime = 1,times
+         do 41 ilon = 1, lons
+            do 42 ilat = 1, lats
+               do 43 ilev = 1, levels
+                  i = i + 1
+                  farray(ilev, ilat, ilon, itime) = real (i)
+ 43   continue
+ 42   continue
+ 41   continue
+ 40   continue
+      count(1) = levels
+      call ncvpt (ncid, fid, start, count, farray, iret)
+      if (iret .ne. 0) nfails = nfails + 1
+
+!
+!     double
+!
+      i = 0
+      do 50 itime = 1, times
+         do 51 ilon = 1, lons
+            do 52 ilat = 1, lats
+               do 53 ilev = 1, levels
+                  i = i + 1
+                  darray(ilev, ilat, ilon, itime) = real (i)
+ 53   continue
+ 52   continue
+ 51   continue
+ 50   continue
+      count(1) = levels
+      call ncvpt (ncid, did, start, count, darray, iret)
+      if (iret .ne. 0) nfails = nfails + 1
+
+!
+!     char
+!
+      start(1) = 1
+      start(2) = 1
+      count(1) = 4
+      count(2) = 4
+      lenstr = 31       
+      string = 'testthiskind of '
+      call ncvptc (ncid, chid,start, count, string, lenstr, iret)
+      if (iret .ne. 0) nfails = nfails + 1
+
+      call ncclos(ncid, iret)
+      if (iret .ne. 0) nfails = nfails + 1
+
+      return
+      end
+
+
+      subroutine tncvpt1(cdfname, nfails)
+#include "netcdf.inc"
+      character*31 cdfname
+
+
+      integer iret, ncid
+      integer  latdim, londim, leveldim, timedim, lendim
+      integer dimsiz(MAXNCDIM)
+      common /dims/timedim, latdim, londim, leveldim, lendim, 
+     + dimsiz
+
+      integer bindx(1), sindx(1), lindx(1), findx(4), dindx(4), cindx(1)
+
+      integer lvalue
+      NCSHORT_T svalue
+      NCBYTE_T bvalue
+      doubleprecision onethird
+      integer bid, sid, lid, fid, did, cid, chid
+      common /vars/bid, sid, lid, fid, did, cid, chid
+      data lindx/1/, bindx/1/, sindx/1/, findx/1,1,1,1/
+     +dindx/1,1,1,1/, cindx/1/
+      data lvalue /1000/
+      data svalue/10/
+      data onethird/0.3333333333D0/
+
+      bvalue = ichar('z')
+      
+      ncid = ncopn (cdfname, NCWRITE, iret)
+      if (iret .ne. 0) nfails = nfails + 1
+
+!
+!     test ncvpt1 for byte
+!
+      call ncvpt1 (ncid, bid, bindx, bvalue, iret)
+      if (iret .ne. 0) nfails = nfails + 1
+
+!
+!     test ncvpt1 for short
+!
+      call ncvpt1 (ncid, sid, sindx, svalue, iret)
+      if (iret .ne. 0) nfails = nfails + 1
+
+!     
+!     test ncvpt1 for long
+!
+      call ncvpt1 (ncid, lid, lindx, lvalue, iret)
+      if (iret .ne. 0) nfails = nfails + 1
+
+!
+!     test ncvpt1 for float
+!
+      call ncvpt1 (ncid, fid, findx, 3.14159, iret)
+      if (iret .ne. 0) nfails = nfails + 1
+
+!
+!     test ncvpt1 for double
+!
+      call ncvpt1 (ncid, did, dindx, onethird, iret)
+      if (iret .ne. 0) nfails = nfails + 1
+
+!
+!     test ncvp1c for char
+!
+      call ncvp1c (ncid, cid, cindx, 'a', iret)
+      if (iret .ne. 0) nfails = nfails + 1
+
+      call ncclos (ncid, iret)
+      if (iret .ne. 0) nfails = nfails + 1
+
+      return
+      end
+
+!
+! subroutine to test default fill values
+!
+      subroutine tfills(nfails)
+#include "netcdf.inc"
+      integer ncid
+      integer bid, sid, lid, fid, did
+      integer ix(1)
+      integer l
+      NCSHORT_T s
+      doubleprecision d
+      real f
+      NCBYTE_T b
+
+      ncid = NCOPN('fills.nc', NCNOWRIT, iret)
+      if (iret .ne. 0) nfails = nfails + 1
+
+      bid = ncvid(ncid, 'b', iret)
+      if (iret .ne. 0) nfails = nfails + 1
+
+      sid = ncvid(ncid, 's', iret)
+      if (iret .ne. 0) nfails = nfails + 1
+
+      lid = ncvid(ncid, 'l', iret)
+      if (iret .ne. 0) nfails = nfails + 1
+
+      fid = ncvid(ncid, 'f', iret)
+      if (iret .ne. 0) nfails = nfails + 1
+
+      did = ncvid(ncid, 'd', iret)
+      if (iret .ne. 0) nfails = nfails + 1
+
+
+      ix(1) = 2
+      call ncvgt1(ncid, bid, ix, b, iret)
+      if (iret .ne. 0) nfails = nfails + 1
+
+      call ncvgt1(ncid, sid, ix, s, iret)
+      if (iret .ne. 0) nfails = nfails + 1
+
+      call ncvgt1(ncid, lid, ix, l, iret)
+      if (iret .ne. 0) nfails = nfails + 1
+
+      call ncvgt1(ncid, fid, ix, f, iret)
+      if (iret .ne. 0) nfails = nfails + 1
+
+      call ncvgt1(ncid, did, ix, d, iret)
+      if (iret .ne. 0) nfails = nfails + 1
+
+
+      if (b .ne. FILBYTE) write(*,*) 'error in byte fill value'
+      if (d .ne. FILDOUB) write(*,*) 'error in double fill value'
+      if (f .ne. FILFLOAT) write(*,*) 'error in float fill value'
+      if (l .ne. FILLONG) write(*,*) 'error in long fill value'
+      if (s .ne. FILSHORT) write(*,*) 'error in short fill value'
+
+      return
+      end
diff --git a/nf_test/ftst_groups.F b/nf_test/ftst_groups.F
new file mode 100644
index 0000000..0644130
--- /dev/null
+++ b/nf_test/ftst_groups.F
@@ -0,0 +1,152 @@
+C     This is part of the netCDF package.
+C     Copyright 2006 University Corporation for Atmospheric Research/Unidata.
+C     See COPYRIGHT file for conditions of use.
+
+C     This program tests netCDF-4 variable functions from fortran.
+
+C     $Id: ftst_groups.F,v 1.5 2009/01/25 14:33:44 ed Exp $
+
+      program ftst_groups
+      implicit none
+      include 'netcdf.inc'
+
+C     This is the name of the data file we will create.
+      character*(*) file_name
+      parameter (file_name='ftst_groups.nc')
+
+C     Info about the groups we'll create.
+      character*(*) group_name, sub_group_name
+      parameter (group_name = 'grp', sub_group_name = 'sub')
+      character*80 name_in, name_in2
+      integer ngroups_in
+      integer full_name_len
+
+C     Dimensions and variables.
+      character*(*) dim1_name, dim2_name
+      parameter (dim1_name = 'd1', dim2_name = 'd2')
+      character*(*) var1_name, var2_name
+      parameter (var1_name = 'v1', var2_name = 'v2')
+      integer nvars, ndims
+
+C     NetCDF IDs.
+      integer ncid, grpid, sub_grpid, subgrp_in
+      integer grpids(1), grpid_in, dimids(2), varids(2)
+      integer varids_in(2), dimids_in(2)
+
+C     Error handling.
+      integer retval
+
+      print *, ''
+      print *,'*** Testing netCDF-4 groups from F77.'
+
+C     Create the netCDF file.
+      retval = nf_create(file_name, NF_NETCDF4, ncid)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+
+C     Create a group and a subgroup.
+      retval = nf_def_grp(ncid, group_name, grpid)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      retval = nf_def_grp(grpid, sub_group_name, sub_grpid)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+
+C     Create a two dims and two vars.
+      retval = nf_def_dim(sub_grpid, dim1_name, 0, dimids(1))
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      retval = nf_def_dim(sub_grpid, dim2_name, 0, dimids(2))
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      retval = nf_def_var(sub_grpid, var1_name, NF_UINT64, 2, dimids, 
+     &     varids(1))
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      retval = nf_def_var(sub_grpid, var2_name, NF_UINT64, 2, dimids, 
+     &     varids(2))
+      if (retval .ne. nf_noerr) call handle_err(retval)
+
+C     Close the file. 
+      retval = nf_close(ncid)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+
+C     Reopen the file.
+      retval = nf_open(file_name, NF_NOWRITE, ncid)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      
+C     Check the name of the root group.
+      retval = nf_inq_grpname(ncid, name_in)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      if (name_in(1:1) .ne. '/') stop 2
+
+C     Check the full name of the root group (also "/").
+      retval = nf_inq_grpname_full(ncid, full_name_len, name_in)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      if (full_name_len .ne. 1 .or. name_in(1:1) .ne. '/') stop 2
+
+C     What groups are there from the root group?
+      retval = nf_inq_grps(ncid, ngroups_in, grpids)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      if (ngroups_in .ne. 1) stop 2
+
+C     Check the name of this group.
+      retval = nf_inq_grpname(grpids(1), name_in)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      if (name_in(1:len(group_name)) .ne. group_name) stop 2
+
+C     Check the length of the full name.
+      retval = nf_inq_grpname_len(grpids(1), full_name_len)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      if (full_name_len .ne. len(group_name) + 1) stop 2
+
+C     Check the full name.
+      retval = nf_inq_grpname_full(grpids(1), full_name_len, name_in2)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      if (name_in2(1:1) .ne. '/' .or. 
+     &     name_in2(2:len(group_name)+1) .ne. group_name .or.
+     &     full_name_len .ne. len(group_name) + 1) stop 2
+
+C     Check getting the grpid by full name
+      retval = nf_inq_grp_full_ncid(ncid, name_in, grpid_in)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      if (grpid_in .ne. grpids(1)) stop 2
+
+C     Check the parent ncid.
+      retval = nf_inq_grp_parent(grpids(1), grpid_in)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      if (grpid_in .ne. ncid) stop 2
+
+C     Check getting the group by name
+      retval = nf_inq_ncid(ncid, group_name, grpid_in)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      if (grpid_in .ne. grpids(1)) stop 2
+
+C     Check getting the group by name
+      retval = nf_inq_ncid(ncid, group_name, grpid_in)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      if (grpid_in .ne. grpids(1)) stop 2
+
+C     Get the sub group id, using its name.
+      retval = nf_inq_ncid(grpid_in, sub_group_name, subgrp_in)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+
+C     Check varids in subgroup.
+      retval = nf_inq_varids(subgrp_in, nvars, varids_in)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      if (nvars .ne. 2 .or. varids_in(1) .ne. varids(1) .or.
+     &     varids_in(2) .ne. varids(2)) stop 2
+
+C     Check dimids in subgroup.
+      retval = nf_inq_dimids(subgrp_in, ndims, dimids_in, 0)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      if (ndims .ne. 2 .or. dimids_in(1) .ne. dimids(1) .or.
+     &     dimids_in(2) .ne. dimids(2)) stop 2
+
+C     Check dimids including parents (will get same answers, since there
+C     are no dims in parent group.
+      retval = nf_inq_dimids(subgrp_in, ndims, dimids_in, 1)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      if (ndims .ne. 2 .or. dimids_in(1) .ne. dimids(1) .or.
+     &     dimids_in(2) .ne. dimids(2)) stop 2
+
+C     Close the file. 
+      retval = nf_close(ncid)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+
+      print *,'*** SUCCESS!'
+      end
diff --git a/nf_test/ftst_parallel.F b/nf_test/ftst_parallel.F
new file mode 100644
index 0000000..c4e78d0
--- /dev/null
+++ b/nf_test/ftst_parallel.F
@@ -0,0 +1,138 @@
+!     This is part of the netCDF package.
+!     Copyright 2006 University Corporation for Atmospheric Research/Unidata.
+!     See COPYRIGHT file for conditions of use.
+
+!     This program tests netCDF-4 variable functions from fortran.
+
+!     $Id: ftst_parallel.F,v 1.5 2010/05/25 13:53:04 ed Exp $
+
+      program ftst_parallel
+      implicit none
+      include 'netcdf.inc'
+      include 'mpif.h'
+      
+      character*(*) FILE_NAME
+      parameter (FILE_NAME = 'ftst_parallel.nc')
+
+      integer MAX_DIMS
+      parameter (MAX_DIMS = 2)
+      integer NX, NY
+      parameter (NX = 16)
+      parameter (NY = 16)
+      integer NUM_PROC
+      parameter (NUM_PROC = 4)
+      integer ncid, varid, dimids(MAX_DIMS)
+      integer x_dimid, y_dimid
+      integer data_out(NY / 2, NX / 2), data_in(NY / 2, NX / 2)
+      integer mode_flag
+      integer x, y, retval
+      integer p, my_rank, ierr
+      integer start(MAX_DIMS), count(MAX_DIMS)
+
+      call MPI_Init(ierr)
+      call MPI_Comm_rank(MPI_COMM_WORLD, my_rank, ierr)
+      call MPI_Comm_size(MPI_COMM_WORLD, p, ierr)
+
+      if (my_rank .eq. 0) then
+         print *, ' '
+         print *, '*** Testing netCDF-4 parallel I/O from Fortran 77.'
+      endif
+
+!     There must be 4 procs for this test.
+      if (p .ne. 4) then
+         print *, 'This test program must be run on 4 processors.'
+         stop 2 
+      endif
+
+!     Create some pretend data.
+      do x = 1, NX / 2
+         do y = 1, NY / 2
+            data_out(y, x) = my_rank
+         end do
+      end do
+
+!     Create the netCDF file. 
+      mode_flag = IOR(nf_netcdf4, nf_classic_model) 
+      mode_flag = IOR(mode_flag, nf_mpiio) 
+      retval = nf_create_par(FILE_NAME, mode_flag, MPI_COMM_WORLD, 
+     $     MPI_INFO_NULL, ncid)
+      if (retval .ne. nf_noerr) stop 3
+
+!     Define the dimensions.
+      retval = nf_def_dim(ncid, "x", NX, x_dimid)
+      if (retval .ne. nf_noerr) stop 4
+      retval = nf_def_dim(ncid, "y", NY, y_dimid)
+      if (retval .ne. nf_noerr) stop 5
+      dimids(1) = y_dimid
+      dimids(2) = x_dimid
+
+!     Define the variable. 
+      retval = nf_def_var(ncid, "data", NF_INT, MAX_DIMS, dimids, varid)
+      if (retval .ne. nf_noerr) stop 6
+
+!     With classic model netCDF-4 file, enddef must be called.
+      retval = nf_enddef(ncid)
+      if (retval .ne. nf_noerr) stop 7
+
+!     Determine what part of the variable will be written for this
+!     processor. It's a checkerboard decomposition.
+      count(1) = NX / 2
+      count(2) = NY / 2
+      if (my_rank .eq. 0) then
+         start(1) = 1
+         start(2) = 1
+      else if (my_rank .eq. 1) then
+         start(1) = NX / 2 + 1
+         start(2) = 1
+      else if (my_rank .eq. 2) then
+         start(1) = 1
+         start(2) = NY / 2 + 1
+      else if (my_rank .eq. 3) then
+         start(1) = NX / 2 + 1
+         start(2) = NY / 2 + 1
+      endif
+
+!     Write this processor's data.
+      retval = nf_put_vara_int(ncid, varid, start, count, data_out)
+      if (retval .ne. nf_noerr) stop 8
+
+!     Close the file. 
+      retval = nf_close(ncid)
+      if (retval .ne. nf_noerr) stop 9
+
+!     Reopen the file.
+      retval = nf_open_par(FILE_NAME, nf_nowrite, 
+     $     MPI_COMM_WORLD, MPI_INFO_NULL, ncid)
+      if (retval .ne. nf_einval) stop 7
+      retval = nf_open_par(FILE_NAME, IOR(nf_nowrite, nf_mpiio), 
+     $     MPI_COMM_WORLD, MPI_INFO_NULL, ncid)
+      if (retval .ne. nf_noerr) stop 10
+
+!     Set collective access on this variable. This will cause all
+!     reads/writes to happen together on every processor. Fairly
+!     pointless, in this contexct, but I want to at least call this
+!     function once in my testing.
+      retval = nf_var_par_access(ncid, varid, nf_collective)
+      if (retval .ne. nf_noerr) stop 11
+      
+!     Read this processor's data.
+      retval = nf_get_vara_int(ncid, varid, start, count, data_in)
+      if (retval .ne. nf_noerr) stop 12
+
+!     Check the data.
+      do x = 1, NX / 2
+         do y = 1, NY / 2
+            if (data_in(y, x) .ne. my_rank) stop 13
+         end do
+      end do
+
+!     Close the file. 
+      retval = nf_close(ncid)
+      if (retval .ne. nf_noerr) stop 14
+
+      call MPI_Finalize(ierr)
+
+      if (my_rank .eq. 0) print *,'*** SUCCESS!'
+
+      end program ftst_parallel
+
diff --git a/nf_test/ftst_parallel_nasa.F b/nf_test/ftst_parallel_nasa.F
new file mode 100644
index 0000000..0275c23
--- /dev/null
+++ b/nf_test/ftst_parallel_nasa.F
@@ -0,0 +1,142 @@
+!     This is part of the netCDF package. Copyright 2011 University
+!     Corporation for Atmospheric Research/Unidata. See COPYRIGHT file
+!     for conditions of use. 
+
+!     This program tests netCDF-4 parallel I/O from fortran. This
+!     variation of the test was contributed by Dan at NASA. Thanks Dan!
+
+      program ftst_parallel_nasa
+      implicit none
+      include 'netcdf.inc'
+      include 'mpif.h'
+
+      character*(*) FILE_NAME
+      parameter (FILE_NAME = 'ftst_parallel_nasa.nc')
+
+      integer MAX_DIMS
+      parameter (MAX_DIMS = 2)
+      integer NX, NY
+      parameter (NX = 16)
+      parameter (NY = 16)
+      integer NUM_PROC
+      parameter (NUM_PROC = 4)
+      integer ncid, varid, dimids(MAX_DIMS)
+      integer x_dimid, y_dimid
+      real data_out(NY / 2, NX / 2), data_in(NY / 2, NX / 2)
+      integer mode_flag
+      integer x, y, retval
+      integer p, my_rank, ierr
+      integer start(MAX_DIMS), count(MAX_DIMS)
+
+      call MPI_Init(ierr)
+      call MPI_Comm_rank(MPI_COMM_WORLD, my_rank, ierr)
+      call MPI_Comm_size(MPI_COMM_WORLD, p, ierr)
+
+      if (my_rank .eq. 0) then
+         print *, ' '
+         print *, '*** Testing netCDF-4 parallel I/O from F77 again.'
+      endif
+
+!     There must be 4 procs for this test.
+      if (p .ne. 4) then
+         print *, 'This test program must be run on 4 processors.'
+         stop 2
+      endif
+
+!     Create some pretend data.
+      do x = 1, NX / 2
+         do y = 1, NY / 2
+            data_out(y, x) = real(my_rank)
+         end do
+      end do
+
+!     Create the netCDF file.
+      mode_flag = IOR(nf_netcdf4, nf_clobber)
+!     mode_flag = IOR(nf_netcdf4, nf_classic_model)
+      mode_flag = IOR(mode_flag, nf_mpiio)
+      retval = nf_create_par(FILE_NAME, mode_flag, MPI_COMM_WORLD,
+     $     MPI_INFO_NULL, ncid)
+      if (retval .ne. nf_noerr) stop 3
+
+!     Define the dimensions.
+      retval = nf_def_dim(ncid, "x", NX, x_dimid)
+      if (retval .ne. nf_noerr) stop 4
+      retval = nf_def_dim(ncid, "y", NY, y_dimid)
+      if (retval .ne. nf_noerr) stop 5
+      dimids(1) = x_dimid
+      dimids(2) = y_dimid
+
+!     Define the variable.
+      retval = nf_def_var(ncid, "data", NF_FLOAT, MAX_DIMS, dimids,
+     $     varid)
+      if (retval .ne. nf_noerr) stop 6
+
+!     With classic model netCDF-4 file, enddef must be called.
+      retval = nf_enddef(ncid)
+      if (retval .ne. nf_noerr) stop 7
+
+!     Determine what part of the variable will be written for this
+!     processor. It's a checkerboard decomposition.
+      count(1) = NX / 2
+      count(2) = NY / 2
+      if (my_rank .eq. 0) then
+         start(1) = 1
+         start(2) = 1
+      else if (my_rank .eq. 1) then
+         start(1) = NX / 2 + 1
+         start(2) = 1
+      else if (my_rank .eq. 2) then
+         start(1) = 1
+         start(2) = NY / 2 + 1
+      else if (my_rank .eq. 3) then
+         start(1) = NX / 2 + 1
+         start(2) = NY / 2 + 1
+      endif
+
+!     Write this processor's data.
+      retval = nf_put_vara_real(ncid, varid, start, count, data_out)
+      if (retval .ne. nf_noerr) then
+         print*,'Error writing data ', retval
+         print*, NF_STRERROR(retval)
+         stop 8
+      endif
+
+!     Close the file.
+      retval = nf_close(ncid)
+      if (retval .ne. nf_noerr) stop 9
+
+!     Reopen the file.
+      retval = nf_open_par(FILE_NAME, IOR(nf_nowrite, nf_mpiio),
+     $     MPI_COMM_WORLD, MPI_INFO_NULL, ncid)
+      if (retval .ne. nf_noerr) stop 10
+
+!     Set collective access on this variable. This will cause all
+!     reads/writes to happen together on every processor. Fairly
+!     pointless, in this contexct, but I want to at least call this
+!     function once in my testing.
+      retval = nf_var_par_access(ncid, varid, nf_collective)
+      if (retval .ne. nf_noerr) stop 11
+
+!     Read this processor's data.
+      retval = nf_get_vara_real(ncid, varid, start, count, data_in)
+      if (retval .ne. nf_noerr) stop 12
+
+!     Check the data.
+      do x = 1, NX / 2
+         do y = 1, NY / 2
+            if (data_in(y, x) .ne. my_rank) then
+               print*,data_in(y, x), ' NE ', my_rank
+               stop 13
+            endif
+         end do
+      end do
+
+!     Close the file.
+      retval = nf_close(ncid)
+      if (retval .ne. nf_noerr) stop 14
+
+      call MPI_Finalize(ierr)
+
+      if (my_rank .eq. 0) print *,'*** SUCCESS!'
+
+      end program ftst_parallel_nasa
diff --git a/nf_test/ftst_path.F b/nf_test/ftst_path.F
new file mode 100644
index 0000000..58432fe
--- /dev/null
+++ b/nf_test/ftst_path.F
@@ -0,0 +1,92 @@
+      program ftst_path
+
+C Tests new nf_inq_path function
+C Mimics tests in C tst_files5.c code
+
+
+      implicit NONE
+
+      include "netcdf.inc" 
+
+      character(len=*), parameter  :: FILE_NAME="ftst_path.nc"
+
+      integer                      :: path_len, ncid
+      character(LEN=NF_MAX_NAME+1) :: path_in
+
+      path_in   = REPEAT(" ", LEN(path_in))
+      path_len  = 0
+
+      print *,''
+      print *,'*** Testing netcdf file functions.'
+      print *,'*** Checking the new inq_path function'
+
+C Test with classic mode nf_create
+
+      call check(nf_create(FILE_NAME, nf_classic_model, ncid))
+      call check(nf_inq_path(ncid, path_len, path_in))
+
+      if ((path_len /= LEN(FILE_NAME)) .OR.                             &
+     &    (FILE_NAME /= TRIM(path_in)))                                 &
+     &   call check(-1)
+      call check(nf_close(ncid))
+
+      path_in=REPEAT(" ", LEN(path_in))
+      path_len=0
+
+C Test with classic mode nf_open
+
+      call check(nf_open(FILE_NAME, nf_classic_model, ncid))
+      call check(nf_inq_path(ncid, path_len, path_in))
+
+      if ((path_len /= LEN(FILE_NAME)) .OR.                             &
+     &    (FILE_NAME /= TRIM(path_in)))                                 &
+     &   call check(-1)
+      call check(nf_close(ncid))
+
+      path_in=REPEAT(" ", LEN(path_in))
+      path_len=0
+
+
+C Test with netcdf4 mode nf_create
+
+      call check(nf_create(FILE_NAME, nf_netcdf4, ncid))
+      call check(nf_inq_path(ncid, path_len, path_in))
+
+      if ((path_len /= LEN(FILE_NAME)) .OR.                             &
+     &    (FILE_NAME /= TRIM(path_in)))                                 &
+     &  call check(-1)
+      call check(nf_close(ncid))
+
+      path_in=REPEAT(" ", LEN(path_in))
+      path_len=0
+
+C Test with netcdf4 mode nf_open
+
+      call check(nf_open(FILE_NAME, nf_netcdf4, ncid))
+      call check(nf_inq_path(ncid, path_len, path_in))
+
+      if ((path_len /= LEN(FILE_NAME)) .OR.                             &
+     &    (FILE_NAME /= TRIM(path_in)))                                 &
+     &  call check(-1)
+      call check(nf_close(ncid))
+
+      path_in=REPEAT(" ", LEN(path_in))
+      path_len=0
+
+      print *,'*** SUCCESS! '
+
+      contains
+C       This subroutine handles errors by printing an error message and
+C       exiting with a non-zero status.
+      subroutine check(errcode)
+        use netcdf
+        implicit none
+        integer, intent(in) :: errcode
+
+        if(errcode /= nf_noerr) then
+           print *, 'Error: ', trim(nf_strerror(errcode))
+           stop 2
+        endif
+      end subroutine check
+
+      end program ftst_path
diff --git a/nf_test/ftst_rengrps.F b/nf_test/ftst_rengrps.F
new file mode 100644
index 0000000..13f98d4
--- /dev/null
+++ b/nf_test/ftst_rengrps.F
@@ -0,0 +1,110 @@
+C     This is part of the netCDF package.
+C     Copyright 2006 University Corporation for Atmospheric Research/Unidata.
+C     See COPYRIGHT file for conditions of use.
+
+C     This program tests netCDF-4 variable functions from fortran.
+
+C     $Id: ftst_rengrps.F,v 1.3 2010/02/03 14:35:21 ed Exp $
+
+      program ftst_rengrps
+C      use typeSizes
+C      use netcdf
+      use netcdf4_f03
+      implicit none
+C     include "netcdf.inc"
+      
+C This is the name of the data file we will create.
+      character (len = *), parameter :: FILE_NAME = "ftst_rengrps.nc"
+
+C We are writing 2D data, a 6 x 12 grid. 
+      integer, parameter :: MAX_DIMS = 2
+      integer, parameter :: NX = 6, NY = 12
+      integer :: chunksizes(MAX_DIMS), chunksizes_in(MAX_DIMS)
+      integer, parameter :: CACHE_NELEMS = 10000, CACHE_SIZE = 1000000
+      integer, parameter :: DEFLATE_LEVEL = 4
+C We need these ids and other gunk for netcdf.
+      integer :: ncid, varid1, varid2, dimids(MAX_DIMS)
+      integer :: x_dimid, y_dimid
+      integer :: nvars, ngatts, ndims, unlimdimid, file_format
+      character (len = *), parameter :: VAR1_NAME = "VarName1"
+      character (len = *), parameter :: VAR2_NAME = "VarName2"
+      character (len = *), parameter :: GRP1_NAME = "Old_Grp1_name"
+      character (len = *), parameter :: GRP2_NAME = "Old_Grp2_name"
+      character (len = *), parameter :: NEW_GRP1_NAME = "new_Grp1_name"
+      character (len = *), parameter :: NEW_GRP2_NAME = "new_Grp2_name"
+
+      character (len = NF_MAX_NAME) :: grp1_full_name
+      integer :: ilen
+
+C Information read back from the file to check correctness.
+      integer :: varid1_in, varid2_in
+      integer :: grpid1, grpid2
+      integer :: xtype_in, ndims_in, natts_in, dimids_in(MAX_DIMS)
+      character (len = nf_max_name) :: name_in
+
+      print *, ''
+      print *,'*** Testing netCDF-4 rename groups from Fortran 90.'
+
+C Create the netCDF file. 
+      call check(nf_create(FILE_NAME, NF_NETCDF4, ncid))
+
+C Define the dimensions.
+      call check(nf_def_dim(ncid, "x", NX, x_dimid))
+      call check(nf_def_dim(ncid, "y", NY, y_dimid))
+      dimids =  (/ y_dimid, x_dimid /)
+
+C Define some nested groups.
+      call check(nf_def_grp(ncid, GRP1_NAME, grpid1))
+      call check(nf_def_grp(grpid1, GRP2_NAME, grpid2))
+
+C Define some variables. 
+      chunksizes = (/ NY, NX /)
+      call check(nf_def_var(ncid, VAR1_NAME, NF_INT, MAX_DIMS, dimids,  &
+     &  varid1))
+      call check(nf_def_var(grpid1, VAR2_NAME, NF_INT, MAX_DIMS, dimids,&
+     & varid2))
+
+C Close the file. 
+      call check(nf_close(ncid))
+
+C Reopen the file.
+      call check(nf_open(FILE_NAME, NF_WRITE, ncid))
+      
+C Get the group ids for the newly reopened file.
+      call check(nf_inq_grp_ncid(ncid, GRP1_NAME, grpid1))
+      call check(nf_inq_grp_ncid(grpid1, GRP2_NAME, grpid2))
+
+C Check for the groups with full group names. 
+      write(grp1_full_name, '(A,A)') '/', GRP1_NAME
+      call check(nf_inq_grp_full_ncid(ncid, grp1_full_name, grpid1))
+      call check(nf_inq_grpname(grpid1, name_in))
+      if (name_in .ne. GRP1_NAME) stop 61
+      call check(nf_inq_grpname_full(grpid1, ilen, name_in))
+      if (name_in .ne. grp1_full_name) stop 62
+
+      Call check(nf_rename_grp(grpid1, NEW_GRP1_NAME))
+      name_in=REPEAT(" ",LEN(name_in))
+      Call check(nf_inq_grpname(grpid1, name_in))
+      If (name_in /= NEW_GRP1_NAME) Call check(-1)
+
+C Close the file. 
+      call check(nf_close(ncid))
+
+      print *,'*** SUCCESS!'
+
+      contains
+C         This subroutine handles errors by printing an error message and
+C         exiting with a non-zero status.
+      subroutine check(errcode)
+C        use netcdf
+        implicit none
+        include "netcdf.inc"
+        integer, intent(in) :: errcode
+        
+        if(errcode /= NF_NOERR) then
+           print *, 'Error: ', trim(nf_strerror(errcode))
+           stop 2
+        endif
+      end subroutine check
+
+      end program ftst_rengrps
diff --git a/nf_test/ftst_types.F b/nf_test/ftst_types.F
new file mode 100644
index 0000000..699330c
--- /dev/null
+++ b/nf_test/ftst_types.F
@@ -0,0 +1,178 @@
+C     This is part of the netCDF package.
+C     Copyright 2007 University Corporation for Atmospheric Research/Unidata.
+C     See COPYRIGHT file for conditions of use.
+
+C     This program tests netCDF-4 user defined types from fortran.
+
+C     $Id: ftst_types.F,v 1.6 2009/01/25 14:33:44 ed Exp $
+
+      program ftst_types
+      implicit none
+      include 'netcdf.inc'
+
+C     This is the name of the data file we will create.
+      character*(*) FILE_NAME
+      parameter (FILE_NAME='ftst_types.nc')
+
+C     We are writing 2D data, a 6 x 12 grid. 
+      integer NDIMS
+      parameter (NDIMS=2)
+      integer NX, NY
+      parameter (NX = 6, NY = 12)
+
+C     NetCDF IDs.
+      integer ncid, varid, dimids(NDIMS)
+      integer wind_typeid
+      integer x_dimid, y_dimid
+      integer typeids(1)
+
+C     Info about the type we'll create.
+      integer size_in, base_type_in, nfields_in, class_in
+      character*80 name_in
+      character*(*) type_name, u_name, v_name
+      parameter (type_name = 'wind_t', u_name = 'U', v_name = 'V')
+      integer ntypes
+      integer WIND_T_SIZE
+      parameter (WIND_T_SIZE = 8)
+      integer offset_in, field_typeid_in, ndims_in, dim_sizes_in(1)
+
+C     This is the data array we will write, and a place to store it when
+C     we read it back in.
+      integer data_out(NY, NX), data_in(NY, NX)
+
+C     Loop indexes, and error handling.
+      integer x, y, retval
+
+C     Create some pretend data.
+      do x = 1, NX
+         do y = 1, NY
+            data_out(y, x) = (x - 1) * NY + (y - 1)
+         end do
+      end do
+
+      print *, ''
+      print *,'*** Testing netCDF-4 compound type from F77.'
+
+C     Create the netCDF file.
+      retval = nf_create(FILE_NAME, NF_NETCDF4, ncid)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+
+C     Define the dimensions.
+      retval = nf_def_dim(ncid, "x", NX, x_dimid)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      retval = nf_def_dim(ncid, "y", NY, y_dimid)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+
+C     Define a compound type.
+      retval = nf_def_compound(ncid, WIND_T_SIZE, type_name, 
+     &     wind_typeid)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      retval = nf_insert_compound(ncid, wind_typeid, u_name, 0, NF_INT)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      retval = nf_insert_compound(ncid, wind_typeid, v_name, 4, NF_INT)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+
+C     Check out my new type.
+      retval = nf_inq_typeids(ncid, ntypes, typeids)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      if (ntypes .ne. 1) stop 2
+      if (typeids(1) .ne. wind_typeid) stop 2
+
+C     Define the variable. 
+      dimids(2) = x_dimid
+      dimids(1) = y_dimid
+      retval = nf_def_var(ncid, "data", NF_INT, NDIMS, dimids, varid)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+
+C     Write the pretend data to the file.
+      retval = nf_put_var_int(ncid, varid, data_out)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+
+C     Close the file. 
+      retval = nf_close(ncid)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+
+C     Reopen the file and check again.
+      retval = nf_open(FILE_NAME, NF_NOWRITE, ncid)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+
+C     Find the type.
+      retval = nf_inq_typeids(ncid, ntypes, typeids)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      if (ntypes .ne. 1 .or. typeids(1) .ne. wind_typeid) stop 2
+      
+C     Check the type.
+      retval = nf_inq_user_type(ncid, typeids(1), name_in, size_in, 
+     &     base_type_in, nfields_in, class_in)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      if (name_in(1:len(type_name)) .ne. type_name .or. 
+     &     size_in .ne. WIND_T_SIZE .or. nfields_in .ne. 2 .or.
+     &     class_in .ne. NF_COMPOUND) stop 2
+
+C     Check it differently.
+      retval = nf_inq_compound(ncid, typeids(1), name_in, size_in, 
+     &     nfields_in)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      if (name_in(1:len(type_name)) .ne. type_name .or. 
+     &     size_in .ne. WIND_T_SIZE .or. nfields_in .ne. 2) stop 2
+
+C     Check it one piece at a time.
+      retval = nf_inq_compound_nfields(ncid, typeids(1), nfields_in)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      if (nfields_in .ne. 2) stop 2
+      retval = nf_inq_compound_size(ncid, typeids(1), size_in)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      if (size_in .ne. WIND_T_SIZE) stop 2
+      retval = nf_inq_compound_name(ncid, typeids(1), name_in)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      if (name_in(1:len(type_name)) .ne. type_name) stop 2
+
+C     Check the first field of the compound type.
+      retval = nf_inq_compound_field(ncid, typeids(1), 1, name_in, 
+     &     offset_in, field_typeid_in, ndims_in, dim_sizes_in)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      if (name_in(1:len(u_name)) .ne. u_name .or. offset_in .ne. 0 .or.
+     &     field_typeid_in .ne. NF_INT .or. ndims_in .ne. 0) stop 2
+      retval = nf_inq_compound_fieldname(ncid, typeids(1), 1, name_in)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      if (name_in(1:len(u_name)) .ne. u_name) stop 2
+      retval = nf_inq_compound_fieldoffset(ncid, typeids(1), 1, 
+     &     offset_in)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      if (offset_in .ne. 0) stop 2
+      retval = nf_inq_compound_fieldtype(ncid, typeids(1), 1, 
+     &     field_typeid_in)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      if (field_typeid_in .ne. NF_INT) stop 2
+      retval = nf_inq_compound_fieldndims(ncid, typeids(1), 1, 
+     &     ndims_in)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      if (ndims_in .ne. 0) stop 2
+      
+C     Check the second field of the compound type.
+      retval = nf_inq_compound_field(ncid, typeids(1), 2, name_in, 
+     &     offset_in, field_typeid_in, ndims_in, dim_sizes_in)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      if (name_in(1:len(v_name)) .ne. v_name .or. offset_in .ne. 4 .or.
+     &     field_typeid_in .ne. NF_INT .or. ndims_in .ne. 0) stop 2
+      
+C     Find our variable.
+      retval = nf_inq_varid(ncid, "data", varid)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      if (varid .ne. 1) stop 2
+
+C     Read the data and check it.
+      retval = nf_get_var_int(ncid, varid, data_in)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      do x = 1, NX
+         do y = 1, NY
+            if (data_in(y, x) .ne. data_out(y, x)) stop 2
+         end do
+      end do
+
+C     Close the file. 
+      retval = nf_close(ncid)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+
+      print *,'*** SUCCESS!'
+      end
diff --git a/nf_test/ftst_types2.F b/nf_test/ftst_types2.F
new file mode 100644
index 0000000..1ef9833
--- /dev/null
+++ b/nf_test/ftst_types2.F
@@ -0,0 +1,98 @@
+C     This is part of the netCDF package.
+C     Copyright 2007 University Corporation for Atmospheric Research/Unidata.
+C     See COPYRIGHT file for conditions of use.
+
+C     This program tests netCDF-4 user defined types from fortran.
+
+C     $Id: ftst_types2.F,v 1.5 2009/09/25 19:23:37 ed Exp $
+
+      program ftst_types2
+      implicit none
+      include 'netcdf.inc'
+
+C     This is the name of the data file we will create.
+      character*(*) FILE_NAME
+      parameter (FILE_NAME='ftst_types2.nc')
+
+C     We are writing 2D data, a 3 x 2 grid. 
+      integer NDIMS
+      parameter (NDIMS = 2)
+      integer dim_sizes(NDIMS)
+      integer NX, NY
+      parameter (NX = 3, NY = 2)
+
+C     NetCDF IDs.
+      integer ncid, varid, dimids(NDIMS)
+      integer cmp_typeid
+      integer x_dimid, y_dimid
+      integer typeids(1)
+
+C     Info about the type we'll create.
+      integer size_in, base_type_in, nfields_in, class_in
+      character*80 name_in
+      character*(*) type_name, ary_name
+      parameter (type_name = 'cmp_w_ary', ary_name = 'A')
+      integer ntypes
+      integer cmp_size
+      parameter (cmp_size = 24)
+      integer offset_in, field_typeid_in, ndims_in, dim_sizes_in(NDIMS)
+
+C     Loop indexes, and error handling.
+      integer x, y, retval
+
+      print *, ''
+      print *,'*** Testing netCDF-4 compound types from F77 some more.'
+
+C     Create the netCDF file.
+      retval = nf_create(FILE_NAME, NF_NETCDF4, ncid)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+
+C     Define a compound type.
+      retval = nf_def_compound(ncid, cmp_size, type_name, 
+     &     cmp_typeid)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+
+C     Include an array.
+      dim_sizes(1) = NX
+      dim_sizes(2) = NY
+      retval = nf_insert_array_compound(ncid, cmp_typeid, ary_name, 0, 
+     &     NF_INT, NDIMS, dim_sizes)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+
+C     Close the file. 
+      retval = nf_close(ncid)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+
+C     Reopen the file and check again.
+      retval = nf_open(FILE_NAME, NF_NOWRITE, ncid)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+
+C     Find the type.
+      retval = nf_inq_typeids(ncid, ntypes, typeids)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      if (ntypes .ne. 1 .or. typeids(1) .ne. cmp_typeid) stop 2
+      
+C     Check the type.
+      retval = nf_inq_user_type(ncid, typeids(1), name_in, size_in, 
+     &     base_type_in, nfields_in, class_in)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      if (name_in(1:len(type_name)) .ne. type_name .or. 
+     &     size_in .ne. cmp_size .or. nfields_in .ne. 1 .or. 
+     &     class_in .ne. NF_COMPOUND) stop 2
+
+C     Check the first field of the compound type.
+      retval = nf_inq_compound_field(ncid, typeids(1), 1, name_in, 
+     &     offset_in, field_typeid_in, ndims_in, dim_sizes_in)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      if (name_in(1:len(ary_name)) .ne. ary_name .or. 
+     &     offset_in .ne. 0 .or. field_typeid_in .ne. NF_INT .or. 
+     &     ndims_in .ne. NDIMS .or. 
+     &     dim_sizes_in(1) .ne. dim_sizes(1) .or. 
+     &     dim_sizes_in(2) .ne. dim_sizes(2)) stop 2
+
+C     Close the file. 
+      retval = nf_close(ncid)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+
+      print *,'*** SUCCESS!'
+      end
diff --git a/nf_test/ftst_types3.F b/nf_test/ftst_types3.F
new file mode 100644
index 0000000..0c7516f
--- /dev/null
+++ b/nf_test/ftst_types3.F
@@ -0,0 +1,121 @@
+C     This is part of the netCDF package.
+C     Copyright 2007 University Corporation for Atmospheric Research/Unidata.
+C     See COPYRIGHT file for conditions of use.
+
+C     This program tests netCDF-4 user defined types from fortran.
+
+C     $Id: ftst_types3.F,v 1.2 2009/09/25 19:23:37 ed Exp $
+
+      program ftst_types3
+      implicit none
+      include 'netcdf.inc'
+
+C     This is the name of the data file we will create.
+      character*(*) FILE_NAME
+      parameter (FILE_NAME='ftst_types3.nc')
+
+C     We are writing 2D data, a 3 x 2 grid. 
+      integer NDIMS
+      parameter (NDIMS = 2)
+      integer dim_sizes(NDIMS)
+      integer NX, NY
+      parameter (NX = 3, NY = 2)
+
+C     NetCDF IDs.
+      integer ncid, varid, dimids(NDIMS)
+      integer cmp_typeid, typeid_in
+      integer x_dimid, y_dimid
+      integer typeids(1)
+      integer grpid, sub_grpid
+
+C     Info about the groups we'll create.
+      character*(*) group_name, sub_group_name
+      parameter (group_name = 'you_drive_me_crazy')
+      parameter (sub_group_name = 'baby_Im_so_into_you')
+
+C     Info about the type we'll create.
+      integer size_in, base_type_in, nfields_in, class_in
+      character*80 name_in
+      character*(*) type_name, field_name
+      parameter (type_name = 'I_just_want_to_have_some_fun')
+      parameter (field_name = 'Ill_tell_it_to_the_world')
+      integer ntypes
+      integer cmp_size
+      parameter (cmp_size = 4)
+      integer offset_in, field_typeid_in, ndims_in, dim_sizes_in(NDIMS)
+
+C     Loop indexes, and error handling.
+      integer x, y, retval
+
+      print *, ''
+      print *,'*** Testing netCDF-4 user-defined types and groups.'
+
+C     Create the netCDF file.
+      retval = nf_create(FILE_NAME, NF_NETCDF4, ncid)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+
+C     Create a group and a subgroup.
+      retval = nf_def_grp(ncid, group_name, grpid)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      retval = nf_def_grp(grpid, sub_group_name, sub_grpid)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+
+C     Define a compound type in the root group.
+      retval = nf_def_compound(ncid, cmp_size, type_name, 
+     &     cmp_typeid)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+
+C     Include a float.
+      retval = nf_insert_compound(ncid, cmp_typeid, field_name, 0, 
+     &     NF_FLOAT)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+
+C     Close the file. 
+      retval = nf_close(ncid)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+
+C     Reopen the file and check again.
+      retval = nf_open(FILE_NAME, NF_NOWRITE, ncid)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+
+C     Find the type.
+      retval = nf_inq_typeids(ncid, ntypes, typeids)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      if (ntypes .ne. 1 .or. typeids(1) .ne. cmp_typeid) stop 2
+      
+C     Check the type.
+      retval = nf_inq_user_type(ncid, typeids(1), name_in, size_in, 
+     &     base_type_in, nfields_in, class_in)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      if (name_in(1:len(type_name)) .ne. type_name .or. 
+     &     size_in .ne. cmp_size .or. nfields_in .ne. 1 .or. 
+     &     class_in .ne. NF_COMPOUND) stop 31
+
+C     Check the first field of the compound type.
+      retval = nf_inq_compound_field(ncid, typeids(1), 1, name_in, 
+     &     offset_in, field_typeid_in, ndims_in, dim_sizes_in)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      if (name_in(1:len(field_name)) .ne. field_name .or. 
+     &     offset_in .ne. 0 .or. field_typeid_in .ne. NF_FLOAT .or. 
+     &     ndims_in .ne. 0) stop 19
+
+C     Go to a child group and find the id of our type.
+      retval = nf_inq_grp_ncid(ncid, group_name, sub_grpid)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      retval = nf_inq_typeid(sub_grpid, type_name, typeid_in)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      retval = nf_inq_user_type(sub_grpid, typeid_in, name_in, size_in, 
+     &     base_type_in, nfields_in, class_in)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      if (name_in(1:len(type_name)) .ne. type_name .or. 
+     &     size_in .ne. cmp_size .or. nfields_in .ne. 1 .or. 
+     &     class_in .ne. NF_COMPOUND) stop 22
+      
+
+
+C     Close the file. 
+      retval = nf_close(ncid)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+
+      print *,'*** SUCCESS!'
+      end
diff --git a/nf_test/ftst_v2.F b/nf_test/ftst_v2.F
new file mode 100644
index 0000000..684c302
--- /dev/null
+++ b/nf_test/ftst_v2.F
@@ -0,0 +1,94 @@
+C     This is part of the netCDF package.
+C     Copyright 2009 University Corporation for Atmospheric Research/Unidata.
+C     See COPYRIGHT file for conditions of use.
+
+C     This program tests the fortran V2 API with netCDF-4.
+
+C     $Id: ftst_v2.F,v 1.1 2009/01/27 19:49:11 ed Exp $
+
+      program ftst_v2
+      implicit none
+      include 'netcdf.inc'
+
+C     This is the name of the data file we will create.
+      character*(*) FILE_NAME
+      parameter (FILE_NAME='ftst_v2.nc')
+
+      integer ncid, timedim, londim, latdim, lonid, latid
+      character*(3) lat_name
+      parameter (lat_name = 'lat')
+      character*(3) lon_name
+      parameter (lon_name = 'lon')
+      character*(4) time_name
+      parameter (time_name = 'time')
+      integer LON_LEN, LAT_LEN
+      parameter (LON_LEN = 3, LAT_LEN = 5)
+      integer NDIMS, NVARS
+      parameter (NDIMS = 3, NVARS = 2)
+      integer ndims_in, nvars_in, ngatts_in, recdim_in
+      integer dimsize_in, natts_in
+      integer xtype_in, dimids_in(NDIMS)
+      character*(128) name_in
+      integer rc
+
+      print *, ''
+      print *,'*** Testing v2 fortran API with netCDF-4.'
+
+C     Create the file.
+      ncid = nccre(FILE_NAME, NF_NETCDF4, rc)
+      timedim = ncddef(ncid, time_name, NCUNLIM, rc)
+      londim = ncddef(ncid, lon_name, LON_LEN, rc)
+      latdim = ncddef(ncid, lat_name, LAT_LEN, rc)
+      lonid = ncvdef(ncid, lon_name, NCFLOAT, 1, londim, rc)
+      latid = ncvdef(ncid, lat_name, NCFLOAT, 1, latdim, rc)
+
+C     Check the file.
+      call ncinq(ncid, ndims_in, nvars_in, ngatts_in, recdim_in, rc)
+      if (ndims_in .ne. NDIMS) stop 2
+      if (ndims_in .ne. NDIMS .or. nvars_in .ne. NVARS .or.
+     $     ngatts_in .ne. 0 .or. recdim_in .ne. timedim) stop 2
+      call ncdinq(ncid, timedim, name_in, dimsize_in, rc)
+      if (name_in .ne. time_name .or. dimsize_in .ne. 0) stop 2
+      call ncdinq(ncid, londim, name_in, dimsize_in, rc)
+      if (name_in .ne. lon_name .or. dimsize_in .ne. LON_LEN) stop 2
+      call ncdinq(ncid, latdim, name_in, dimsize_in, rc)
+      if (name_in .ne. lat_name .or. dimsize_in .ne. LAT_LEN) stop 2
+      call ncvinq(ncid, lonid, name_in, xtype_in, ndims_in, dimids_in, 
+     $     natts_in, rc)
+      if (name_in .ne. lon_name .or. xtype_in .ne. NCFLOAT .or.
+     $     ndims_in .ne. 1 .or. dimids_in(1) .ne. londim) stop 2
+      call ncvinq(ncid, latid, name_in, xtype_in, ndims_in, dimids_in, 
+     $     natts_in, rc)
+      if (name_in .ne. lat_name .or. xtype_in .ne. NCFLOAT .or.
+     $     ndims_in .ne. 1 .or. dimids_in(1) .ne. latdim) stop 2
+
+C     Close the file.
+      call ncclos(ncid, rc)
+
+C     Reopen, and check again.
+      ncid = ncopn(FILE_NAME, NCNOWRIT, rc)
+C     Check the file.
+      call ncinq(ncid, ndims_in, nvars_in, ngatts_in, recdim_in, rc)
+      if (ndims_in .ne. NDIMS) stop 2
+      if (ndims_in .ne. NDIMS .or. nvars_in .ne. NVARS .or.
+     $     ngatts_in .ne. 0 .or. recdim_in .ne. timedim) stop 2
+      call ncdinq(ncid, timedim, name_in, dimsize_in, rc)
+      if (name_in .ne. time_name .or. dimsize_in .ne. 0) stop 2
+      call ncdinq(ncid, londim, name_in, dimsize_in, rc)
+      if (name_in .ne. lon_name .or. dimsize_in .ne. LON_LEN) stop 2
+      call ncdinq(ncid, latdim, name_in, dimsize_in, rc)
+      if (name_in .ne. lat_name .or. dimsize_in .ne. LAT_LEN) stop 2
+      call ncvinq(ncid, lonid, name_in, xtype_in, ndims_in, dimids_in, 
+     $     natts_in, rc)
+      if (name_in .ne. lon_name .or. xtype_in .ne. NCFLOAT .or.
+     $     ndims_in .ne. 1 .or. dimids_in(1) .ne. londim) stop 2
+      call ncvinq(ncid, latid, name_in, xtype_in, ndims_in, dimids_in, 
+     $     natts_in, rc)
+      if (name_in .ne. lat_name .or. xtype_in .ne. NCFLOAT .or.
+     $     ndims_in .ne. 1 .or. dimids_in(1) .ne. latdim) stop 2
+
+      call ncclos(ncid, rc)
+
+      print *,'*** SUCCESS!'
+      end
+
diff --git a/nf_test/ftst_vars.F b/nf_test/ftst_vars.F
new file mode 100644
index 0000000..7f46de3
--- /dev/null
+++ b/nf_test/ftst_vars.F
@@ -0,0 +1,172 @@
+C     This is part of the netCDF package.
+C     Copyright 2006 University Corporation for Atmospheric Research/Unidata.
+C     See COPYRIGHT file for conditions of use.
+
+C     This program tests netCDF-4 variable functions from fortran.
+
+C     $Id: ftst_vars.F,v 1.19 2009/09/27 21:25:23 ed Exp $
+
+      program ftst_vars
+      implicit none
+      include 'netcdf.inc'
+
+C     This is the name of the data file we will create.
+      character*(*) FILE_NAME
+      parameter (FILE_NAME='ftst_vars.nc')
+
+C     We are writing 2D data, a 6 x 12 grid. 
+      integer NDIMS
+      parameter (NDIMS=2)
+      integer NX, NY
+      parameter (NX = 6, NY = 12)
+
+C     NetCDF IDs.
+      integer ncid, varid, dimids(NDIMS)
+      integer x_dimid, y_dimid
+
+C     This is the data array we will write, and a place to store it when
+C     we read it back in.
+      integer data_out(NY, NX), data_in(NY, NX)
+
+C     For checking our data file to make sure it's correct.
+      integer chunks(NDIMS), chunks_in(NDIMS)
+      integer shuffle, deflate, deflate_level, checksum, contiguous
+      integer endianness
+
+C     Cache size stuff.
+      integer CACHE_SIZE, CACHE_NELEMS, CACHE_PREEMPTION
+      parameter (CACHE_SIZE = 8000, CACHE_NELEMS = 500)
+      parameter (CACHE_PREEMPTION = 50)
+      integer cache_size_in, cache_nelems_in, cache_preemption_in
+
+C     Loop indexes, and error handling.
+      integer x, y, retval
+
+C     Create some pretend data.
+      do x = 1, NX
+         do y = 1, NY
+            data_out(y, x) = 2147483646 + x * y
+         end do
+      end do
+
+      print *, ''
+      print *,'*** Testing definition of netCDF-4 vars from Fortran 77.'
+
+C     Change the cache size for the files created/opened in this program.
+      retval = nf_set_chunk_cache(CACHE_SIZE, CACHE_NELEMS, 
+     &     CACHE_PREEMPTION)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+
+C     Check chunk cache sizes.
+      retval = nf_get_chunk_cache(cache_size_in, cache_nelems_in, 
+     &     cache_preemption_in)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      if (cache_size_in .ne. CACHE_SIZE .or. 
+     &     cache_nelems_in .ne. CACHE_NELEMS .or. 
+     &     cache_preemption_in .ne. CACHE_PREEMPTION) stop 4
+
+C     Create the netCDF file.
+      retval = nf_create(FILE_NAME, NF_NETCDF4, ncid)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+
+C     Define the dimensions.
+      retval = nf_def_dim(ncid, "x", NX, x_dimid)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      retval = nf_def_dim(ncid, "y", NY, y_dimid)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+
+C     Define the variable. 
+      dimids(1) = y_dimid
+      dimids(2) = x_dimid
+      retval = nf_def_var(ncid, "data", NF_INT64, NDIMS, dimids, varid)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+
+C     Turn on chunking.
+      chunks(1) = NY
+      chunks(2) = NX
+      retval = nf_def_var_chunking(ncid, varid, 0, chunks)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+
+C     Set variable to big-endian (default is whatever is native to
+C     writing machine).
+      retval = nf_def_var_endian(ncid, varid, NF_ENDIAN_BIG)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+
+C     Turn on deflate, fletcher32.
+      retval = nf_def_var_deflate(ncid, varid, 0, 1, 4)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      retval = nf_def_var_fletcher32(ncid, varid, NF_FLETCHER32)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+
+C     Is everything set that is supposed to be?
+      retval = nf_inq_var_deflate(ncid, varid, shuffle, deflate, 
+     +     deflate_level)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      if (shuffle .ne. 0 .or. deflate .ne. 1 .or. 
+     +     deflate_level .ne. 4) stop 2
+      retval = nf_inq_var_fletcher32(ncid, varid, checksum)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      if (checksum .ne. NF_FLETCHER32) stop 2
+      retval = nf_inq_var_chunking(ncid, varid, contiguous, chunks_in)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      if (contiguous .ne. 0) stop 2
+      if (chunks(1) .ne. chunks_in(1) .or.
+     +     chunks(2) .ne. chunks_in(2)) stop 2
+      retval = nf_inq_var_endian(ncid, varid, endianness)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      if (endianness .ne. NF_ENDIAN_BIG) stop 2
+
+C     Since this is a classic model file, we must call enddef
+      retval = nf_enddef(ncid)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+
+C     Write the pretend data to the file.
+      retval = nf_put_var_int(ncid, varid, data_out)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+
+C     Close the file. 
+      retval = nf_close(ncid)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+
+C     Reopen the file and check again.
+      retval = nf_open(FILE_NAME, NF_NOWRITE, ncid)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+
+C     Find our variable.
+      retval = nf_inq_varid(ncid, "data", varid)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      if (varid .ne. 1) stop 2
+
+C     Check the deflate, fletcher32, chunking, and endianness.
+      retval = nf_inq_var_deflate(ncid, varid, shuffle, deflate, 
+     +     deflate_level)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      if (shuffle .ne. 0 .or. deflate .ne. 1 .or. 
+     +     deflate_level .ne. 4) stop 2
+      retval = nf_inq_var_fletcher32(ncid, varid, checksum)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      if (checksum .ne. NF_FLETCHER32) stop 2
+      retval = nf_inq_var_chunking(ncid, varid, contiguous, chunks_in)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      if (contiguous .ne. 0) stop 2
+      if (chunks(1) .ne. chunks_in(1) .or.
+     +     chunks(2) .ne. chunks_in(2)) stop 2
+      retval = nf_inq_var_endian(ncid, varid, endianness)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      if (endianness .ne. NF_ENDIAN_BIG) stop 2
+
+C     Read the data and check it.
+      retval = nf_get_var_int(ncid, varid, data_in)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      do x = 1, NX
+         do y = 1, NY
+            if (data_in(y, x) .ne. data_out(y, x)) stop 2
+         end do
+      end do
+
+C     Close the file. 
+      retval = nf_close(ncid)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+
+      print *,'*** SUCCESS!'
+      end
diff --git a/nf_test/ftst_vars2.F b/nf_test/ftst_vars2.F
new file mode 100644
index 0000000..1615b82
--- /dev/null
+++ b/nf_test/ftst_vars2.F
@@ -0,0 +1,137 @@
+C     This is part of the netCDF package.
+C     Copyright 2008 University Corporation for Atmospheric Research/Unidata.
+C     See COPYRIGHT file for conditions of use.
+
+C     This program tests netCDF-4 variable functions from fortran, even
+C     more.
+
+C     $Id: ftst_vars2.F,v 1.6 2010/01/20 15:21:46 ed Exp $
+
+      program ftst_vars2
+      implicit none
+      include 'netcdf.inc'
+
+C     This is the name of the data file we will create.
+      character*(*) FILE_NAME
+      parameter (FILE_NAME='ftst_vars2.nc')
+
+C     We are writing 3D data, a 3 x 5 x 2 grid. Why do I use "x, y, z,"
+C     and then do everything in order "z, y, x?" Because I am a C
+C     programmer, and everything in Fortran seems backwards!
+      integer NDIMS, NTYPES
+      parameter (NDIMS = 3, NTYPES = 5)
+      integer NX, NY, NZ
+      parameter (NX = 3, NY = 5, NZ = 2)
+
+C     These will be used to set the per-variable chunk cache.
+      integer CACHE_SIZE, CACHE_NELEMS, CACHE_PREEMPTION
+      parameter (CACHE_SIZE = 8, CACHE_NELEMS = 571)
+      parameter (CACHE_PREEMPTION = 42)
+
+C     These will be used to check the setting of the per-variable chunk
+C     cache.
+      integer cache_size_in, cache_nelems_in, cache_preemption_in
+
+C     NetCDF IDs.
+      integer ncid, varid(NTYPES), dimids(NDIMS), typeid(NTYPES)
+
+C     Name of the variable is stored here.
+      character*80 var_name
+
+C     This is the data array we will write, and a place to store it when
+C     we read it back in. Z is the fastest varying dimension.
+      integer data_out(NZ, NY, NX), data_in(NZ, NY, NX)
+
+C     Loop indexes, and error handling.
+      integer i, x, y, z, retval
+
+C     Create some pretend data.
+      do x = 1, NX
+         do y = 1, NY
+            do z = 1, NZ
+               data_out(z, y, x) = (x-1) * NY * NZ + (y-1) * NZ + (z-1)
+            end do
+         end do
+      end do
+
+      print *, ''
+      print *,'*** Testing netCDF-4 vars from F77 with new types.'
+
+C     Create the netCDF file.
+      retval = nf_create(FILE_NAME, NF_NETCDF4, ncid)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+
+C     Define the dimensions.
+      retval = nf_def_dim(ncid, "z", NZ, dimids(3))
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      retval = nf_def_dim(ncid, "y", NY, dimids(2))
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      retval = nf_def_dim(ncid, "x", NX, dimids(1))
+      if (retval .ne. nf_noerr) call handle_err(retval)
+
+C     These are the types of vars that will be written.
+      typeid(1) = NF_UBYTE
+      typeid(2) = NF_USHORT
+      typeid(3) = NF_UINT
+      typeid(4) = NF_INT64
+      typeid(5) = NF_UINT64
+
+C     Define the variables. 
+      do i = 1, NTYPES
+         write(var_name, 1001) i
+ 1001    format('var', I1)
+         retval = nf_def_var(ncid, var_name, typeid(i), NDIMS, 
+     &        dimids, varid(i))
+         if (retval .ne. nf_noerr) call handle_err(retval)
+
+C        Set variable caches.
+         retval = nf_set_var_chunk_cache(ncid, varid(i), CACHE_SIZE, 
+     &        CACHE_NELEMS, CACHE_PREEMPTION)
+         if (retval .ne. nf_noerr) call handle_err(retval)
+      end do
+
+C     Check the per-variable cache to make sure it is what we think it
+C     is.
+      do i = 1, NTYPES
+         retval = nf_get_var_chunk_cache(ncid, varid(i), cache_size_in, 
+     &        cache_nelems_in, cache_preemption_in)
+         if (retval .ne. nf_noerr) call handle_err(retval)
+         if (cache_size_in .ne. CACHE_SIZE .or. cache_nelems_in .ne. 
+     &        CACHE_NELEMS .or. cache_preemption .ne. CACHE_PREEMPTION)
+     &        stop 8
+         
+      end do
+
+C     Write the pretend data to the file.
+      do i = 1, NTYPES
+         retval = nf_put_var_int(ncid, varid(i), data_out)
+         if (retval .ne. nf_noerr) call handle_err(retval)
+      end do
+
+C     Close the file. 
+      retval = nf_close(ncid)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+
+C     Reopen the file and check again.
+      retval = nf_open(FILE_NAME, NF_NOWRITE, ncid)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+
+C     Read the data and check it.
+      do i = 1, NTYPES
+         retval = nf_get_var_int(ncid, varid(i), data_in)
+         if (retval .ne. nf_noerr) call handle_err(retval)
+         do x = 1, NX
+            do y = 1, NY
+               do z = 1, NZ
+                  if (data_in(z, y, x) .ne. data_out(z, y, x)) stop 2
+               end do
+            end do
+         end do
+      end do
+
+C     Close the file. 
+      retval = nf_close(ncid)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+
+      print *,'*** SUCCESS!'
+      end
diff --git a/nf_test/ftst_vars3.F b/nf_test/ftst_vars3.F
new file mode 100644
index 0000000..be808b7
--- /dev/null
+++ b/nf_test/ftst_vars3.F
@@ -0,0 +1,189 @@
+C     This is part of the netCDF package.
+C     Copyright 2008 University Corporation for Atmospheric Research/Unidata.
+C     See COPYRIGHT file for conditions of use.
+
+C     This program tests netCDF-4 variable functions from fortran, even
+C     more, even more.
+
+C     $Id: ftst_vars3.F,v 1.11 2009/01/25 14:33:44 ed Exp $
+
+      program ftst_vars3
+      implicit none
+      include 'netcdf.inc'
+
+C     This is the name of the data file we will create.
+      character*(*) FILE_NAME
+      parameter (FILE_NAME='ftst_vars3.nc')
+
+C     We are writing an attribute, of length 3.
+      integer NDIMS
+      parameter (NDIMS = 1)
+      integer NX
+      parameter (NX = 3)
+
+C     NetCDF IDs.
+      integer ncid, varid, dimids(1)
+      integer enum_typeid, opaque_typeid
+
+C     This is the data array we will write as an enum attribute, and a
+C     place to store it when we read it back in. Z is the fastest
+C     varying dimension.
+      integer data_out(NX), data_in(NX)
+
+      integer max_types
+      parameter (max_types = 2)
+
+C     Need these to read type information.
+      integer num_types, typeids(max_types)
+      integer base_type, base_size, num_members, member_value
+      character*80 type_name, member_name
+      integer type_size, nfields, class
+
+C     Information for the enum type we will define.
+      character*(*) enum_type_name, one_name, zero_name
+      parameter (enum_type_name = 'enum_type')
+      parameter (zero_name = 'zero', one_name = 'one')
+      integer one, zero
+
+C     Information for the opaque type we will define.
+      character*(*) opaque_type_name
+      parameter (opaque_type_name = 'opaque_type')
+      integer opaque_size
+      parameter (opaque_size = 16)
+      character*(opaque_size) opaque_data, opaque_data_in
+      parameter (opaque_data = '0123456789012345')
+
+C     Loop indexes, and error handling.
+      integer x, retval, index(1)
+
+C     Create some pretend data.
+      do x = 1, NX
+         data_out(x) = 0
+      end do
+      data_out(1) = 1
+
+      print *, ''
+      print *,'*** Testing enum and opaque types.'
+
+C     Create the netCDF file.
+      retval = nf_create(FILE_NAME, NF_NETCDF4, ncid)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+
+C     Create the enum type.
+      retval = nf_def_enum(ncid, NF_INT, enum_type_name, enum_typeid)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      one = 1
+      zero = 0
+      retval = nf_insert_enum(ncid, enum_typeid, zero_name, zero)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      retval = nf_insert_enum(ncid, enum_typeid, one_name, one)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+
+C     Create the opaque type.
+      retval = nf_def_opaque(ncid, opaque_size, opaque_type_name, 
+     &     opaque_typeid)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+
+C     Create a dimension.
+      retval = nf_def_dim(ncid, 'dim', 1, dimids(1))
+      if (retval .ne. nf_noerr) call handle_err(retval)
+
+C     Create an opaque variable.
+      retval = nf_def_var(ncid, 'var', opaque_typeid, 1, dimids, varid)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+
+C     Write the opaque scalar var. (Could also use nf_put_var).
+      index(1) = 1
+      retval = nf_put_var1(ncid, varid, index, opaque_data)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+
+C     Attach an enum attribute to the variable.
+      retval = nf_put_att(ncid, varid, 'att', enum_typeid, NX, 
+     &     data_out)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+
+C     Close the file. 
+      retval = nf_close(ncid)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+
+C     Reopen the file.
+      retval = nf_open(FILE_NAME, NF_NOWRITE, ncid)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+
+C     Get the typeids of all user defined types.
+      retval = nf_inq_typeids(ncid, num_types, typeids)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      if (num_types .ne. max_types) stop 2
+
+C     Use nf_inq_user_type to confirm this is an enum type.
+      retval = nf_inq_user_type(ncid, typeids(1), type_name, type_size, 
+     &     base_type, nfields, class)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      if (type_name(1:len(enum_type_name)) .ne. enum_type_name .or.
+     &     type_size .ne. 4 .or. base_type .ne. NF_INT .or. 
+     &     nfields .ne. 2 .or. class .ne. nf_enum) stop 2
+
+C     Use nf_inq_enum and make sure we get the same answers as we did
+C     with nf_inq_user_type.
+      retval = nf_inq_enum(ncid, typeids(1), type_name, base_type, 
+     &     base_size, num_members)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      if (type_name(1:len(enum_type_name)) .ne. enum_type_name .or.
+     &     base_type .ne. NF_INT .or. num_members .ne. 2) stop 2
+
+C     Check the members of the enum type.
+      retval = nf_inq_enum_member(ncid, typeids(1), 1, member_name, 
+     &     member_value)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      if (member_name(1:len(zero_name)) .ne. zero_name .or.
+     &     member_value .ne. 0) stop 2
+      retval = nf_inq_enum_member(ncid, typeids(1), 2, member_name, 
+     &     member_value)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      if (member_name(1:len(one_name)) .ne. one_name .or.
+     &     member_value .ne. 1) stop 2
+      retval = nf_inq_enum_ident(ncid, typeids(1), 0, member_name)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      if (member_name(1:len(zero_name)) .ne. zero_name) stop 2
+      retval = nf_inq_enum_ident(ncid, typeids(1), 1, member_name)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      if (member_name(1:len(one_name)) .ne. one_name) stop 2
+
+C     Use nf_inq_user_type to confirm that the second typeid is an
+C     opaque type.
+      retval = nf_inq_user_type(ncid, typeids(2), type_name, type_size, 
+     &     base_type, nfields, class)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      if (type_name(1:len(opaque_type_name)) .ne. opaque_type_name .or.
+     &     type_size .ne. opaque_size .or. base_type .ne. 0 .or. 
+     &     nfields .ne. 0 .or. class .ne. nf_opaque) stop 2
+
+C     Use nf_inq_opaque and make sure we get the same answers as we did
+C     with nf_inq_user_type.
+      retval = nf_inq_opaque(ncid, typeids(2), type_name, base_size)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      if (base_size .ne. opaque_size .or. 
+     &     type_name(1:len(opaque_type_name)) .ne. opaque_type_name) 
+     &     stop 2
+
+C     Read the variable.
+      index(1) = 1
+      retval = nf_get_var1(ncid, varid, index, opaque_data_in)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      if (opaque_data_in .ne. opaque_data) stop 2
+
+C     Read the attribute.
+      retval = nf_get_att(ncid, varid, 'att', data_in)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+
+C     Check the values.
+      do x = 1, NX
+         if (data_in(x) .ne. data_out(x)) stop 2
+      end do
+
+C     Close the file. 
+      retval = nf_close(ncid)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+
+      print *,'*** SUCCESS!'
+      end
diff --git a/nf_test/ftst_vars4.F b/nf_test/ftst_vars4.F
new file mode 100644
index 0000000..6e69ca8
--- /dev/null
+++ b/nf_test/ftst_vars4.F
@@ -0,0 +1,120 @@
+C     This is part of the netCDF package.
+C     Copyright 2008 University Corporation for Atmospheric Research/Unidata.
+C     See COPYRIGHT file for conditions of use.
+
+C     This program tests netCDF-4 variable functions from fortran, even
+C     more, even more.
+
+C     $Id: ftst_vars4.F,v 1.11 2009/10/24 10:03:39 ed Exp $
+
+      program ftst_vars4
+      implicit none
+      include 'netcdf.inc'
+
+C     This is the name of the data file we will create.
+      character*(*) FILE_NAME
+      parameter (FILE_NAME='ftst_vars4.nc')
+
+C     NetCDF IDs.
+      integer ncid, vlen_typeid
+
+      integer max_types
+      parameter (max_types = 1)
+
+C     Need these to read type information.
+      integer num_types, typeids(max_types)
+      integer base_type, base_size, num_members, member_value
+      character*80 type_name, member_name
+      integer type_size, nfields, class
+
+C     Information for the vlen type we will define.
+      character*(*) vlen_type_name
+      parameter (vlen_type_name = 'vlen_type')
+
+C     Some data about and for the vlen.
+      integer vlen_len, vlen_len_in
+      parameter (vlen_len = 5)
+      integer data1(vlen_len), data1_in(vlen_len)
+
+C     These must be big enough to hold the struct nc_vlen in netcdf.h.
+      integer*8 vlen(10), vlen_in(10)
+
+C     Loop indexes, and error handling.
+      integer x, retval, index(1)
+
+      print *, ''
+      print *,'*** Testing VLEN types.'
+
+      do x = 1, vlen_len
+         data1(x) = x
+      end do
+
+C     Create the netCDF file.
+      retval = nf_create(FILE_NAME, NF_NETCDF4, ncid)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+
+C     Create the vlen type.
+      retval = nf_def_vlen(ncid, vlen_type_name, nf_int, vlen_typeid)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+
+C     Set up the vlen with this helper function, since F77 can't deal
+C     with pointers.
+      retval = nf_put_vlen_element(ncid, vlen_typeid, vlen, 
+     &     vlen_len, data1)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+
+C     Write the vlen attribute.
+      retval = nf_put_att(ncid, NF_GLOBAL, 'att1', vlen_typeid, 1, vlen)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+
+C     Close the file. 
+      retval = nf_close(ncid)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+
+C     Reopen the file.
+      retval = nf_open(FILE_NAME, NF_NOWRITE, ncid)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+
+C     Get the typeids of all user defined types.
+      retval = nf_inq_typeids(ncid, num_types, typeids)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      if (num_types .ne. max_types) stop 2
+
+C     Use nf_inq_user_type to confirm this is an vlen type, with base
+C     type NF_INT.
+      retval = nf_inq_user_type(ncid, typeids(1), type_name, type_size, 
+     &     base_type, nfields, class)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      if (type_name(1:len(vlen_type_name)) .ne. vlen_type_name .or.
+     &     base_type .ne. nf_int .or.
+     &     nfields .ne. 0 .or. class .ne. nf_vlen) stop 2
+
+C     Use nf_inq_vlen and make sure we get the same answers as we did
+C     with nf_inq_user_type.
+      retval = nf_inq_vlen(ncid, typeids(1), type_name, base_size, 
+     &     base_type)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      if (type_name(1:len(vlen_type_name)) .ne. vlen_type_name .or.
+     &     base_type .ne. nf_int) stop 2
+
+C     Read the vlen attribute.
+      retval = nf_get_att(ncid, NF_GLOBAL, 'att1', vlen_in)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+
+C     Get the data from the vlen we just read.
+      retval = nf_get_vlen_element(ncid, vlen_typeid, vlen_in, 
+     &     vlen_len_in, data1_in)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      if (vlen_len_in .ne. vlen_len) stop 2
+
+C     Check the data
+      do x = 1, vlen_len
+         if (data1(x) .ne. data1_in(x)) stop 2
+      end do
+
+C     Close the file. 
+      retval = nf_close(ncid)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+
+      print *,'*** SUCCESS!'
+      end
diff --git a/nf_test/ftst_vars5.F b/nf_test/ftst_vars5.F
new file mode 100644
index 0000000..2cdc182
--- /dev/null
+++ b/nf_test/ftst_vars5.F
@@ -0,0 +1,117 @@
+C     This is part of the netCDF package.
+C     Copyright 2008 University Corporation for Atmospheric Research/Unidata.
+C     See COPYRIGHT file for conditions of use.
+
+C     This program tests netCDF-4 variable functions from fortran, even
+C     more, even more.
+
+C     $Id: ftst_vars5.F,v 1.4 2009/01/25 14:33:44 ed Exp $
+
+      program ftst_vars5
+      implicit none
+      include 'netcdf.inc'
+
+C     This is the name of the data file we will create.
+      character*(*) FILE_NAME
+      parameter (FILE_NAME='ftst_vars5.nc')
+
+C     NetCDF IDs.
+      integer ncid, cmp_typeid
+
+      integer max_types
+      parameter (max_types = 1)
+
+C     Need these to read type information.
+      integer num_types, typeids(max_types)
+      integer base_type, type_size, num_members, member_value
+      character*80 type_name, member_name
+      integer nfields, class
+
+C     Information for the compound type we will define.
+      character*(*) cmp_type_name, int1_name, int2_name
+      parameter (cmp_type_name = 'compound_type')
+      parameter (int1_name = 'int1', int2_name = 'int2')
+      integer compound_len, compound_len_in
+      parameter (compound_len = 2)
+      integer data1(compound_len), data1_in(compound_len)
+      character*(4) att_name
+      parameter (att_name = 'att1')
+
+C     Loop indexes, and error handling.
+      integer x, retval, index(1)
+
+      print *, ''
+      print *,'*** Testing compound types.'
+
+C     Prepare some data to write.
+      do x = 1, compound_len
+         data1(x) = x
+      end do
+
+C     Create the netCDF file.
+      retval = nf_create(FILE_NAME, NF_NETCDF4, ncid)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+
+C     Create the compound type.
+      retval = nf_def_compound(ncid, 8, cmp_type_name, 
+     &     cmp_typeid)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+
+C     Insert two integers.
+      retval = nf_insert_compound(ncid, cmp_typeid, int1_name, 
+     &     0, NF_INT)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      retval = nf_insert_compound(ncid, cmp_typeid, int2_name, 
+     &     4, NF_INT)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+
+C     Write the compound attribute.
+      retval = nf_put_att(ncid, NF_GLOBAL, att_name, cmp_typeid, 
+     &     1, data1)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+
+C     Close the file. 
+      retval = nf_close(ncid)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+
+C     Reopen the file.
+      retval = nf_open(FILE_NAME, NF_NOWRITE, ncid)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+
+C     Get the typeids of all user defined types.
+      retval = nf_inq_typeids(ncid, num_types, typeids)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      if (num_types .ne. max_types) stop 2
+
+C     Use nf_inq_user_type to confirm this is an compound type
+      retval = nf_inq_user_type(ncid, typeids(1), type_name, type_size, 
+     &     base_type, nfields, class)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      if (type_name(1:len(cmp_type_name)) .ne. cmp_type_name .or.
+     &     type_size .ne. 8 .or. base_type .ne. 0 .or.
+     &     nfields .ne. 2 .or. class .ne. nf_compound) stop 2
+
+C     Use nf_inq_compound and make sure we get the same answers as we did
+C     with nf_inq_user_type.
+      retval = nf_inq_compound(ncid, typeids(1), type_name, type_size, 
+     &     nfields)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      if (type_name(1:len(cmp_type_name)) .ne. cmp_type_name .or.
+     &     base_type .ne. 0 .or. type_size .ne. 8 .or.
+     &     nfields .ne. 2) stop 2
+
+C     Read the compound attribute.
+      retval = nf_get_att(ncid, NF_GLOBAL, att_name, data1_in)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+
+C     Check the data
+      do x = 1, compound_len
+         if (data1(x) .ne. data1_in(x)) stop 2
+      end do
+
+C     Close the file. 
+      retval = nf_close(ncid)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+
+      print *,'*** SUCCESS!'
+      end
diff --git a/nf_test/ftst_vars6.F b/nf_test/ftst_vars6.F
new file mode 100644
index 0000000..0819d43
--- /dev/null
+++ b/nf_test/ftst_vars6.F
@@ -0,0 +1,204 @@
+C     This is part of the netCDF package.
+C     Copyright 2008 University Corporation for Atmospheric Research/Unidata.
+C     See COPYRIGHT file for conditions of use.
+
+C     This program tests netCDF-4 variable functions from fortran, even
+C     more, even more.
+
+C     $Id: ftst_vars6.F,v 1.7 2009/02/11 16:53:46 ed Exp $
+
+      program ftst_vars6
+      implicit none
+      include 'netcdf.inc'
+
+C     This is the name of the data file we will create.
+      character*(*) FILE_NAME
+      parameter (FILE_NAME='ftst_vars6.nc')
+      integer NDIMS
+      parameter (NDIMS = 1)
+      integer DIM_LEN
+      parameter (DIM_LEN = 22)
+      integer NVARS
+      parameter (NVARS = 3)
+      integer DATA_LEN
+      parameter (DATA_LEN = 2)
+      integer check_file
+
+      integer ncid, varid(NVARS), dimids(NDIMS)
+      integer data_len_in, offset
+      parameter (offset = 20)
+      integer data1(data_len), data1_in(data_len)
+      character*(4) var_name(NVARS)
+      character*(4) dim_name
+      parameter (dim_name = 'dim1')
+      integer NO_FILL, MY_FILL_VALUE
+      parameter (NO_FILL = 1)
+      parameter (MY_FILL_VALUE = 42)
+
+C     Loop index and error handling.
+      integer x, retval
+
+      print *, ''
+      print *,'*** Testing fill values.'
+
+C     Prepare some data to write.
+      do x = 1, data_len
+         data1(x) = x
+      end do
+
+C     Set up var names.
+      var_name(1) = 'var1'
+      var_name(2) = 'var2'
+      var_name(3) = 'var3'
+
+C     Create the netCDF file.
+      retval = nf_create(FILE_NAME, NF_NETCDF4, ncid)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+
+C     Create a dimension.
+      retval = nf_def_dim(ncid, dim_name, DIM_LEN, dimids(1))
+      if (retval .ne. nf_noerr) call handle_err(retval)
+
+C     Create a few integer variables.
+      do x = 1, NVARS      
+         retval = nf_def_var(ncid, var_name(x), NF_INT, NDIMS, dimids,
+     $        varid(x))
+         if (retval .ne. nf_noerr) call handle_err(retval)
+      end do
+
+C     Set no fill mode for the second variable.
+      retval = nf_def_var_fill(ncid, varid(2), NO_FILL, 88)
+      if (retval .ne. 0) stop 2
+
+C     Set an alternative fill value for the third variable.
+      retval = nf_def_var_fill(ncid, varid(3), 0, MY_FILL_VALUE)
+      if (retval .ne. 0) stop 3
+
+C     Check it out. 
+c      retval = check_file(ncid, var_name, dim_name)
+c      if (retval .ne. 0) stop 2
+
+C     Close the file. 
+      retval = nf_close(ncid)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+
+C     Reopen the file.
+      retval = nf_open(FILE_NAME, NF_NOWRITE, ncid)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+
+C     Check it out. 
+      retval = check_file(ncid, var_name, dim_name)
+      if (retval .ne. 0) stop 4
+
+C     Close the file. 
+      retval = nf_close(ncid)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+
+      print *,'*** SUCCESS!'
+      end
+
+C     This function check the file to make sure everything is OK.
+      integer function check_file(ncid, var_name, dim_name)
+      implicit none
+      include 'netcdf.inc'
+
+C     I need these in both here and the main program.
+      integer NDIMS
+      parameter (NDIMS = 1)
+      integer DIM_LEN
+      parameter (DIM_LEN = 22)
+      integer NVARS
+      parameter (NVARS = 3)
+      integer DATA_LEN
+      parameter (DATA_LEN = 2)
+      integer MY_FILL_VALUE
+      parameter (MY_FILL_VALUE = 42)
+
+C     Parameters
+      integer ncid
+      character*(4) var_name(NVARS)
+      character*(4) dim_name
+
+C     Values that are read in, to check the file.
+      integer ndims_in, nvars_in, ngatts_in, unlimdimid_in
+      integer xtype_in, dimids_in(NDIMS), natts_in
+      integer varid_in(NVARS), dimid_in, no_fill_in, fill_value_in
+      character*(4) var_name_in
+      integer int_data_in(DIM_LEN)
+
+      integer x, retval
+
+C     Check it out.
+      retval = nf_inq(ncid, ndims_in, nvars_in, ngatts_in,
+     $     unlimdimid_in)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      if (ndims_in .ne. 1 .or. nvars_in .ne. NVARS .or. ngatts_in .ne. 0
+     $     .or. unlimdimid_in .ne. -1) stop 5
+
+C     Get the varids and the dimid.
+      do x = 1, NVARS      
+         retval = nf_inq_varid(ncid, var_name(x), varid_in(x))
+         if (retval .ne. nf_noerr) call handle_err(retval)
+         if (varid_in(x) .ne. x) stop 6
+      end do
+      retval = nf_inq_dimid(ncid, dim_name, dimid_in)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      if (dimid_in .ne. 1) stop 7
+
+C     These things are the same for all three variables, except
+C     natts_in..
+      do x = 1, NVARS      
+         retval = nf_inq_var(ncid, varid_in(x), var_name_in, xtype_in,
+     $        ndims_in, dimids_in, natts_in)
+         if (retval .ne. nf_noerr) call handle_err(retval)
+         if (ndims_in .ne. 1 .or. xtype_in .ne. NF_INT .or. dimids_in(1)
+     $        .ne. dimid_in) stop 8
+         if (x .eq. 3 .and. natts_in .ne. 1) stop 9
+         if (x .lt. 3 .and. natts_in .ne. 0) stop 10
+      end do
+
+C     Check the fill value for the first var. Nothing was set, so
+C     no_fill should be off, and fill_value should be the default fill
+C     value for this type.
+      retval = nf_inq_var_fill(ncid, varid_in(1), no_fill_in,
+     $     fill_value_in)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      if (no_fill_in .ne. 0 .or. fill_value_in .ne. nf_fill_int) stop 11
+
+C     Check that no_fill mode is on for the second variable.
+      retval = nf_inq_var_fill(ncid, varid_in(2), no_fill_in,
+     $     fill_value_in)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      if (no_fill_in .ne. 1 .or. fill_value_in .ne. nf_fill_int) stop 12
+
+C     Check that a non-default fill value is in use for the third variable.
+      retval = nf_inq_var_fill(ncid, varid_in(3), no_fill_in,
+     $     fill_value_in)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      if (no_fill_in .ne. 0 .or. fill_value_in .ne. MY_FILL_VALUE) stop
+     $     2
+
+C     Get the data in var1. It will be all the default fill value.
+      retval = nf_get_var_int(ncid, varid_in(1), int_data_in)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      do x = 1, DIM_LEN
+         if (int_data_in(x) .ne. nf_fill_int) stop 13
+      end do
+
+C     Get the data in var2. What will it be?
+      retval = nf_get_var_int(ncid, varid_in(2), int_data_in)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+C$$$      do x = 1, DIM_LEN
+C$$$         print *, int_data_in(x)
+C$$$      end do
+
+C     Get the data in var3. It will be all the default fill value.
+      retval = nf_get_var_int(ncid, varid_in(3), int_data_in)
+      if (retval .ne. nf_noerr) call handle_err(retval)
+      do x = 1, DIM_LEN
+C         print *, int_data_in(x)
+         if (int_data_in(x) .ne. MY_FILL_VALUE) stop 14
+      end do
+
+      check_file = 0
+      end 
diff --git a/nf_test/handle_err.F b/nf_test/handle_err.F
new file mode 100644
index 0000000..0d292f6
--- /dev/null
+++ b/nf_test/handle_err.F
@@ -0,0 +1,20 @@
+C     This is part of the netCDF package.
+C     Copyright 2005 University Corporation for Atmospheric Research/Unidata.
+C     See COPYRIGHT file for conditions of use.
+
+C     This is the error handling function for some of the F77
+C     tests. This error handler comes from the netcdf tutorial.
+
+C     $Id: handle_err.F,v 1.1 2009/06/07 13:17:26 ed Exp $
+
+C     This subroutine handles errors by printing an error message and
+C     exiting with a non-zero status.
+      subroutine handle_err(errcode)
+      implicit none
+      include 'netcdf.inc'
+      integer errcode
+
+      print *, 'Error: ', nf_strerror(errcode)
+      stop 2
+      end
+
diff --git a/nf_test/nf_error.F b/nf_test/nf_error.F
new file mode 100644
index 0000000..9b4aed6
--- /dev/null
+++ b/nf_test/nf_error.F
@@ -0,0 +1,75 @@
+#if 0
+    Copyright 1996, UCAR/Unidata
+    See netcdf/COPYRIGHT file for copying and redistribution conditions.
+    $Id: nf_error.F,v 1.4 1997/06/03 22:26:09 steve Exp $
+#endif
+
+
+C
+C Use for logging error messages
+C
+        subroutine error(msg)
+        implicit        none
+        character*(*)   msg
+#include "tests.inc"
+
+        nfails = nfails + 1
+        if (nfails .le. max_nmpt) print *, msg
+        end
+
+
+C
+C Use for logging error conditions
+C
+        subroutine errori(msg, i)
+        implicit        none
+        character*(*)   msg
+        integer         i
+#include "tests.inc"
+
+        nfails = nfails + 1
+        if (nfails .le. max_nmpt) print *, msg, i
+        end
+
+
+C
+C Use for logging error conditions
+C
+        subroutine errord(msg, d)
+        implicit        none
+        character*(*)   msg
+        doubleprecision d
+#include "tests.inc"
+
+        nfails = nfails + 1
+        if (nfails .le. max_nmpt) print *, msg, d
+        end
+
+
+C
+C Use for logging error conditions
+C
+        subroutine errorc(msg, string)
+        implicit        none
+        character*(*)   msg
+        character*(*)   string
+#include "tests.inc"
+
+        nfails = nfails + 1
+        if (nfails .le. max_nmpt) print *, msg, 
+     +      string(1:len_trim(string))
+        end
+
+
+C
+C Use for logging error conditions
+C
+        subroutine errore(msg, err)
+        implicit        none
+        character*(*)   msg
+        integer         err
+#include "tests.inc"
+
+        nfails = nfails + 1
+        call errorc(msg, nf_strerror(err))
+        end
diff --git a/nf_test/nf_test.F b/nf_test/nf_test.F
new file mode 100644
index 0000000..04d3d8d
--- /dev/null
+++ b/nf_test/nf_test.F
@@ -0,0 +1,387 @@
+C Copyright 1996-2006, UCAR/Unidata
+C See COPYRIGHT file for copying and redistribution conditions.
+
+C Test driver for netCDF-3 interface.  This program performs tests against
+C the netCDF-3 specification for all user-level functions in an
+C implementation of the netCDF library.
+
+C $Id: nf_test.F,v 1.29 2009/09/01 16:56:46 ed Exp $
+
+        subroutine test(name, func)
+        implicit        none
+        character*(*)   name
+        external        func
+#include "tests.inc"
+
+        write(*, 1) name
+1       format(' *** testing ', a, ' ... ')
+        nfails = 0
+        call func()
+        nfailsTotal = nfailsTotal + nfails
+        if ( nfails .ne. 0) then
+            print *, ' '
+            print *, '  ### ', nfails, ' FAILURES TESTING ', name, 
+     +               '! ###'
+        end if
+        end
+
+        program nf_test
+        implicit        none
+
+#include "tests.inc"
+
+        integer         status
+
+        external        test_nf_strerror
+        external        test_nf_open
+        external        test_nf_close
+        external        test_nf_inq
+        external        test_nf_inq_dimid
+        external        test_nf_inq_dim
+        external        test_nf_inq_dimlen
+        external        test_nf_inq_dimname
+        external        test_nf_inq_varid
+        external        test_nf_inq_var
+        external        test_nf_inq_natts
+        external        test_nf_inq_ndims
+        external        test_nf_inq_nvars
+        external        test_nf_inq_unlimdim
+        external        test_nf_inq_format
+        external        test_nf_inq_vardimid
+        external        test_nf_inq_varname
+        external        test_nf_inq_varnatts
+        external        test_nf_inq_varndims
+        external        test_nf_inq_vartype
+        external        test_nf_get_var1_text
+#if defined(NF_INT1_T)
+        external        test_nf_get_var1_int1
+#endif
+#if defined(NF_INT2_T)
+        external        test_nf_get_var1_int2
+#endif
+        external        test_nf_get_var1_int
+        external        test_nf_get_var1_real
+        external        test_nf_get_var1_double
+        external        test_nf_get_var_text
+#if defined(NF_INT1_T)
+        external        test_nf_get_var_int1
+#endif
+#if defined(NF_INT2_T)
+        external        test_nf_get_var_int2
+#endif
+        external        test_nf_get_var_int
+        external        test_nf_get_var_real
+        external        test_nf_get_var_double
+        external        test_nf_get_vara_text
+#if defined(NF_INT1_T)
+        external        test_nf_get_vara_int1
+#endif
+#if defined(NF_INT2_T)
+        external        test_nf_get_vara_int2
+#endif
+        external        test_nf_get_vara_int
+        external        test_nf_get_vara_real
+        external        test_nf_get_vara_double
+        external        test_nf_get_vars_text
+#if defined(NF_INT1_T)
+        external        test_nf_get_vars_int1
+#endif
+#if defined(NF_INT2_T)
+        external        test_nf_get_vars_int2
+#endif
+        external        test_nf_get_vars_int
+        external        test_nf_get_vars_real
+        external        test_nf_get_vars_double
+        external        test_nf_get_varm_text
+#if defined(NF_INT1_T)
+        external        test_nf_get_varm_int1
+#endif
+#if defined(NF_INT2_T)
+        external        test_nf_get_varm_int2
+#endif
+        external        test_nf_get_varm_int
+        external        test_nf_get_varm_real
+        external        test_nf_get_varm_double
+        external        test_nf_get_att_text
+#if defined(NF_INT1_T)
+        external        test_nf_get_att_int1
+#endif
+#if defined(NF_INT2_T)
+        external        test_nf_get_att_int2
+#endif
+        external        test_nf_get_att_int
+        external        test_nf_get_att_real
+        external        test_nf_get_att_double
+        external        test_nf_inq_att
+        external        test_nf_inq_attname
+        external        test_nf_inq_attid
+        external        test_nf_inq_attlen
+        external        test_nf_inq_atttype
+        external        test_nf_create
+        external        test_nf_redef
+        external        test_nf_enddef
+        external        test_nf_sync
+        external        test_nf_abort
+        external        test_nf_def_dim
+        external        test_nf_rename_dim
+        external        test_nf_def_var
+        external        test_nf_put_var1_text
+#if defined(NF_INT1_T)
+        external        test_nf_put_var1_int1
+#endif
+#if defined(NF_INT2_T)
+        external        test_nf_put_var1_int2
+#endif
+        external        test_nf_put_var1_int
+        external        test_nf_put_var1_real
+        external        test_nf_put_var1_double
+        external        test_nf_put_var_text
+#if defined(NF_INT1_T)
+        external        test_nf_put_var_int1
+#endif
+#if defined(NF_INT2_T)
+        external        test_nf_put_var_int2
+#endif
+        external        test_nf_put_var_int
+        external        test_nf_put_var_real
+        external        test_nf_put_var_double
+        external        test_nf_put_vara_text
+#if defined(NF_INT1_T)
+        external        test_nf_put_vara_int1
+#endif
+#if defined(NF_INT2_T)
+        external        test_nf_put_vara_int2
+#endif
+        external        test_nf_put_vara_int
+        external        test_nf_put_vara_real
+        external        test_nf_put_vara_double
+        external        test_nf_put_vars_text
+#if defined(NF_INT1_T)
+        external        test_nf_put_vars_int1
+#endif
+#if defined(NF_INT2_T)
+        external        test_nf_put_vars_int2
+#endif
+        external        test_nf_put_vars_int
+        external        test_nf_put_vars_real
+        external        test_nf_put_vars_double
+        external        test_nf_put_varm_text
+#if defined(NF_INT1_T)
+        external        test_nf_put_varm_int1
+#endif
+#if defined(NF_INT2_T)
+        external        test_nf_put_varm_int2
+#endif
+        external        test_nf_put_varm_int
+        external        test_nf_put_varm_real
+        external        test_nf_put_varm_double
+        external        test_nf_rename_var
+        external        test_nf_put_att_text
+#if defined(NF_INT1_T)
+        external        test_nf_put_att_int1
+#endif
+#if defined(NF_INT2_T)
+        external        test_nf_put_att_int2
+#endif
+        external        test_nf_put_att_int
+        external        test_nf_put_att_real
+        external        test_nf_put_att_double
+        external        test_nf_copy_att
+        external        test_nf_rename_att
+        external        test_nf_del_att
+        external        test_nf_set_fill
+        external        test_nf_set_default_format
+        external        ignorefpe
+
+        print *, ''
+        print *, '*** Testing netCDF-3 Fortran 77 API.'
+        call ignorefpe(1)
+
+        testfile = 'test.nc'
+        scratch = 'scratch.nc'
+
+        nfailsTotal = 0
+        progname = 'nf_test'
+        max_nmpt = 8
+
+        write(*, *) 'NetCDF version: ', nf_inq_libvers()
+
+C       /* Initialize global variables defining test file */
+        call init_gvars
+
+        call write_file(testfile)
+        if (nfailsTotal .gt. 0) call udexit(1)
+
+C       /* delete any existing scratch netCDF file */
+        status = nf_delete(scratch)
+
+C       /* Test read-only functions, using pregenerated test-file */
+        call test('nf_strerror', test_nf_strerror)
+        call test('nf_open', test_nf_open)
+        call test('nf_close', test_nf_close)
+        call test('nf_inq', test_nf_inq)
+        call test('nf_inq_dimid', test_nf_inq_dimid)
+        call test('nf_inq_dim', test_nf_inq_dim)
+        call test('nf_inq_dimlen', test_nf_inq_dimlen)
+        call test('nf_inq_dimname', test_nf_inq_dimname)
+        call test('nf_inq_varid', test_nf_inq_varid)
+        call test('nf_inq_var', test_nf_inq_var)
+        call test('nf_inq_natts', test_nf_inq_natts)
+        call test('nf_inq_ndims', test_nf_inq_ndims)
+        call test('nf_inq_nvars', test_nf_inq_nvars)
+        call test('nf_inq_unlimdim', test_nf_inq_unlimdim)
+        call test('nf_inq_format', test_nf_inq_format)
+        call test('nf_inq_vardimid', test_nf_inq_vardimid)
+        call test('nf_inq_varname', test_nf_inq_varname)
+        call test('nf_inq_varnatts', test_nf_inq_varnatts)
+        call test('nf_inq_varndims', test_nf_inq_varndims)
+        call test('nf_inq_vartype', test_nf_inq_vartype)
+        call test('nf_get_var1_text', test_nf_get_var1_text)
+#if defined(NF_INT1_T)
+        call test('nf_get_var1_int1', test_nf_get_var1_int1)
+#endif
+#if defined(NF_INT2_T)
+        call test('nf_get_var1_int2', test_nf_get_var1_int2)
+#endif
+        call test('nf_get_var1_int', test_nf_get_var1_int)
+        call test('nf_get_var1_real', test_nf_get_var1_real)
+        call test('nf_get_var1_double', test_nf_get_var1_double)
+        call test('nf_get_var_text', test_nf_get_var_text)
+#if defined(NF_INT1_T)
+        call test('nf_get_var_int1', test_nf_get_var_int1)
+#endif
+#if defined(NF_INT2_T)
+        call test('nf_get_var_int2', test_nf_get_var_int2)
+#endif
+        call test('nf_get_var_int', test_nf_get_var_int)
+        call test('nf_get_var_real', test_nf_get_var_real)
+        call test('nf_get_var_double', test_nf_get_var_double)
+        call test('nf_get_vara_text', test_nf_get_vara_text)
+#if defined(NF_INT1_T)
+        call test('nf_get_vara_int1', test_nf_get_vara_int1)
+#endif
+#if defined(NF_INT2_T)
+        call test('nf_get_vara_int2', test_nf_get_vara_int2)
+#endif
+        call test('nf_get_vara_int', test_nf_get_vara_int)
+        call test('nf_get_vara_real', test_nf_get_vara_real)
+        call test('nf_get_vara_double', test_nf_get_vara_double)
+        call test('nf_get_vars_text', test_nf_get_vars_text)
+#if defined(NF_INT1_T)
+        call test('nf_get_vars_int1', test_nf_get_vars_int1)
+#endif
+#if defined(NF_INT2_T)
+        call test('nf_get_vars_int2', test_nf_get_vars_int2)
+#endif
+        call test('nf_get_vars_int', test_nf_get_vars_int)
+        call test('nf_get_vars_real', test_nf_get_vars_real)
+        call test('nf_get_vars_double', test_nf_get_vars_double)
+        call test('nf_get_varm_text', test_nf_get_varm_text)
+#if defined(NF_INT1_T)
+        call test('nf_get_varm_int1', test_nf_get_varm_int1)
+#endif
+#if defined(NF_INT2_T)
+        call test('nf_get_varm_int2', test_nf_get_varm_int2)
+#endif
+        call test('nf_get_varm_int', test_nf_get_varm_int)
+        call test('nf_get_varm_real', test_nf_get_varm_real)
+        call test('nf_get_varm_double', test_nf_get_varm_double)
+        call test('nf_get_att_text', test_nf_get_att_text)
+#if defined(NF_INT1_T)
+        call test('nf_get_att_int1', test_nf_get_att_int1)
+#endif
+#if defined(NF_INT2_T)
+        call test('nf_get_att_int2', test_nf_get_att_int2)
+#endif
+        call test('nf_get_att_int', test_nf_get_att_int)
+        call test('nf_get_att_real', test_nf_get_att_real)
+        call test('nf_get_att_double', test_nf_get_att_double)
+        call test('nf_inq_att', test_nf_inq_att)
+        call test('nf_inq_attname', test_nf_inq_attname)
+        call test('nf_inq_attid', test_nf_inq_attid)
+        call test('nf_inq_attlen', test_nf_inq_attlen)
+        call test('nf_inq_atttype', test_nf_inq_atttype)
+
+C           /* Test write functions */
+        call test('nf_create', test_nf_create)
+        call test('nf_redef', test_nf_redef)
+        call test('nf_enddef', test_nf_enddef)
+        call test('nf_sync', test_nf_sync)
+        call test('nf_abort', test_nf_abort)
+        call test('nf_def_dim', test_nf_def_dim)
+        call test('nf_rename_dim', test_nf_rename_dim)
+        call test('nf_def_var', test_nf_def_var)
+        call test('nf_put_var1_text', test_nf_put_var1_text)
+#if defined(NF_INT1_T)
+        call test('nf_put_var1_int1', test_nf_put_var1_int1)
+#endif
+#if defined(NF_INT2_T)
+        call test('nf_put_var1_int2', test_nf_put_var1_int2)
+#endif
+        call test('nf_put_var1_int', test_nf_put_var1_int)
+        call test('nf_put_var1_real', test_nf_put_var1_real)
+        call test('nf_put_var1_double', test_nf_put_var1_double)
+        call test('nf_put_var_text', test_nf_put_var_text)
+#if defined(NF_INT1_T)
+        call test('nf_put_var_int1', test_nf_put_var_int1)
+#endif
+#if defined(NF_INT2_T)
+        call test('nf_put_var_int2', test_nf_put_var_int2)
+#endif
+        call test('nf_put_var_int', test_nf_put_var_int)
+        call test('nf_put_var_real', test_nf_put_var_real)
+        call test('nf_put_var_double', test_nf_put_var_double)
+        call test('nf_put_vara_text', test_nf_put_vara_text)
+#if defined(NF_INT1_T)
+        call test('nf_put_vara_int1', test_nf_put_vara_int1)
+#endif
+#if defined(NF_INT2_T)
+        call test('nf_put_vara_int2', test_nf_put_vara_int2)
+#endif
+        call test('nf_put_vara_int', test_nf_put_vara_int)
+        call test('nf_put_vara_real', test_nf_put_vara_real)
+        call test('nf_put_vara_double', test_nf_put_vara_double)
+        call test('nf_put_vars_text', test_nf_put_vars_text)
+#if defined(NF_INT1_T)
+        call test('nf_put_vars_int1', test_nf_put_vars_int1)
+#endif
+#if defined(NF_INT2_T)
+        call test('nf_put_vars_int2', test_nf_put_vars_int2)
+#endif
+        call test('nf_put_vars_int', test_nf_put_vars_int)
+        call test('nf_put_vars_real', test_nf_put_vars_real)
+        call test('nf_put_vars_double', test_nf_put_vars_double)
+        call test('nf_put_varm_text', test_nf_put_varm_text)
+#if defined(NF_INT1_T)
+        call test('nf_put_varm_int1', test_nf_put_varm_int1)
+#endif
+#if defined(NF_INT2_T)
+        call test('nf_put_varm_int2', test_nf_put_varm_int2)
+#endif
+        call test('nf_put_varm_int', test_nf_put_varm_int)
+        call test('nf_put_varm_real', test_nf_put_varm_real)
+        call test('nf_put_varm_double', test_nf_put_varm_double)
+        call test('nf_rename_var', test_nf_rename_var)
+        call test('nf_put_att_text', test_nf_put_att_text)
+#if defined(NF_INT1_T)
+        call test('nf_put_att_int1', test_nf_put_att_int1)
+#endif
+#if defined(NF_INT2_T)
+        call test('nf_put_att_int2', test_nf_put_att_int2)
+#endif
+        call test('nf_put_att_int', test_nf_put_att_int)
+        call test('nf_put_att_real', test_nf_put_att_real)
+        call test('nf_put_att_double', test_nf_put_att_double)
+        call test('nf_copy_att', test_nf_copy_att)
+        call test('nf_rename_att', test_nf_rename_att)
+        call test('nf_del_att', test_nf_del_att)
+        call test('nf_set_fill', test_nf_set_fill)
+        call test('nf_set_default_format', 
+     +       test_nf_set_default_format)
+
+        print *,'Total number of failures: ', nfailsTotal
+        if (nfailsTotal .ne. 0) stop 2
+        print *,'*** SUCCESS!'        
+
+        end
+
diff --git a/nf_test/ref_fills.nc b/nf_test/ref_fills.nc
new file mode 100644
index 0000000..43438fe
Binary files /dev/null and b/nf_test/ref_fills.nc differ
diff --git a/nf_test/run_f77_par_test.sh b/nf_test/run_f77_par_test.sh
new file mode 100755
index 0000000..e3745fb
--- /dev/null
+++ b/nf_test/run_f77_par_test.sh
@@ -0,0 +1,12 @@
+#!/bin/sh
+
+# This shell runs some parallel I/O tests for the F77 API.
+
+set -e
+echo "Testing netCDF parallel I/O through the F77 API..."
+
+mpiexec -n 4 ./ftst_parallel
+mpiexec -n 4 ./ftst_parallel_nasa
+
+echo "SUCCESS!!!"
+exit 0
diff --git a/nf_test/run_f90_par_test.sh b/nf_test/run_f90_par_test.sh
new file mode 100755
index 0000000..2fa7527
--- /dev/null
+++ b/nf_test/run_f90_par_test.sh
@@ -0,0 +1,16 @@
+#!/bin/sh
+
+# This shell runs some parallel I/O tests for the F90 API.
+
+set -e
+echo "Testing netCDF parallel I/O through the F90 API."
+mpiexec -n 4 ./f90tst_parallel
+mpiexec -n 4 ./f90tst_parallel2
+mpiexec -n 4 ./f90tst_parallel3
+mpiexec -n 8 ./f90tst_nc4_par
+#mpiexec -n 4 ./f90tst_parallel_fill
+
+echo "SUCCESS!!!"
+exit 0
+
+
diff --git a/nf_test/test_get.F b/nf_test/test_get.F
new file mode 100644
index 0000000..20993d2
--- /dev/null
+++ b/nf_test/test_get.F
@@ -0,0 +1,5599 @@
+C Do not edit this file. It is produced from the corresponding .m4 source */
+
+C*********************************************************************
+C   Copyright 1996, UCAR/Unidata
+C   See netcdf/COPYRIGHT file for copying and redistribution conditions.
+C   $Id: test_get.m4,v 1.11 2008/04/30 16:50:46 ed Exp $
+C*********************************************************************
+
+        subroutine test_nf_get_var1_text()
+        implicit        none
+#include "tests.inc"
+        integer ncid
+        integer i
+        integer j
+        integer err
+        integer nok      
+        integer index(MAX_RANK)
+        doubleprecision expect
+        logical canConvert     
+        character    value
+        doubleprecision val
+
+        nok = 0
+
+        err = nf_open(testfile, NF_NOWRITE, ncid)
+        if (err .ne. 0)
+     +      call errore('nf_open: ', err)
+        do 1, i = 1, NVARS
+            canConvert = (var_type(i) .eq. NF_CHAR) .eqv.
+     +                   (NFT_TEXT .eq. NFT_TEXT)
+            do 2, j = 1, var_rank(i)
+                index(j) = 1
+2           continue
+            err = nf_get_var1_text(BAD_ID, i, index, value)
+            if (err .ne. NF_EBADID)
+     +          call errore('bad ncid: ', err)
+            err = nf_get_var1_text(ncid, BAD_VARID,
+     +                  index, value)
+            if (err .ne. NF_ENOTVAR)
+     +          call errore('bad var id: ', err)
+            do 3, j = 1, var_rank(i)
+                index(j) = var_shape(j,i) + 1
+                err = nf_get_var1_text(ncid, i, index, value)
+                if (.not. canConvert) then
+                    if (err .ne. NF_ECHAR)
+     +                  call errore('conversion: ', err)
+                else
+                    if (err .ne. NF_EINVALCOORDS)
+     +                  call errore('bad index: ', err)
+                endif
+                index(j) = 1
+3           continue
+            do 4, j = 1, var_nels(i)
+                err = index2indexes(j, var_rank(i), var_shape(1,i), 
+     +                              index)
+                if (err .ne. 0)
+     +              call error('error in index2indexes 1')
+                expect = hash4( var_type(i), var_rank(i), index, 
+     +                          NFT_TEXT )
+                err = nf_get_var1_text(ncid, i, index,
+     +                          value)
+                if (canConvert) then
+                    if (inRange3(expect,var_type(i), 
+     +                           NFT_TEXT)) then
+                        if (in_internal_range(NFT_TEXT,
+     +                                        expect)) then
+                            if (err .ne. 0) then
+                                call errore('nf_get_var: ', err)
+                            else
+                                val = ichar(value)
+                                if (.not. equal(val, expect, 
+     +                                          var_type(i), 
+     +                                          NFT_TEXT)) then
+                                    call errord('unexpected: ', val)
+                                else
+                                    nok = nok + 1
+                                end if
+                            end if
+                        else
+                            if (err .ne. NF_ERANGE)
+     +                          call errore('Range error: ', err)
+                        end if
+                    else
+                        if (err .ne. 0  .and. err .ne. NF_ERANGE)
+     +                      call errore('OK or Range error: ', err)
+                    end if
+                else
+                    if (err .ne. NF_ECHAR)
+     +                  call errore('wrong type: ', err)
+                end if
+4           continue
+1       continue
+        err = nf_close(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_close: ',  err)
+        call print_nok(nok)
+        end
+
+#ifdef NF_INT1_T
+        subroutine test_nf_get_var1_int1()
+        implicit        none
+#include "tests.inc"
+        integer ncid
+        integer i
+        integer j
+        integer err
+        integer nok      
+        integer index(MAX_RANK)
+        doubleprecision expect
+        logical canConvert     
+        NF_INT1_T    value
+        doubleprecision val
+
+        nok = 0
+
+        err = nf_open(testfile, NF_NOWRITE, ncid)
+        if (err .ne. 0)
+     +      call errore('nf_open: ', err)
+        do 1, i = 1, NVARS
+            canConvert = (var_type(i) .eq. NF_CHAR) .eqv.
+     +                   (NFT_INT1 .eq. NFT_TEXT)
+            do 2, j = 1, var_rank(i)
+                index(j) = 1
+2           continue
+            err = nf_get_var1_int1(BAD_ID, i, index, value)
+            if (err .ne. NF_EBADID)
+     +          call errore('bad ncid: ', err)
+            err = nf_get_var1_int1(ncid, BAD_VARID,
+     +                  index, value)
+            if (err .ne. NF_ENOTVAR)
+     +          call errore('bad var id: ', err)
+            do 3, j = 1, var_rank(i)
+                index(j) = var_shape(j,i) + 1
+                err = nf_get_var1_int1(ncid, i, index, value)
+                if (.not. canConvert) then
+                    if (err .ne. NF_ECHAR)
+     +                  call errore('conversion: ', err)
+                else
+                    if (err .ne. NF_EINVALCOORDS)
+     +                  call errore('bad index: ', err)
+                endif
+                index(j) = 1
+3           continue
+            do 4, j = 1, var_nels(i)
+                err = index2indexes(j, var_rank(i), var_shape(1,i), 
+     +                              index)
+                if (err .ne. 0)
+     +              call error('error in index2indexes 1')
+                expect = hash4( var_type(i), var_rank(i), index, 
+     +                          NFT_INT1 )
+                err = nf_get_var1_int1(ncid, i, index,
+     +                          value)
+                if (canConvert) then
+                    if (inRange3(expect,var_type(i), 
+     +                           NFT_INT1)) then
+                        if (in_internal_range(NFT_INT1,
+     +                                        expect)) then
+                            if (err .ne. 0) then
+                                call errore('nf_get_var: ', err)
+                            else
+                                val = value
+                                if (.not. equal(val, expect, 
+     +                                          var_type(i), 
+     +                                          NFT_INT1)) then
+                                    call errord('unexpected: ', val)
+                                else
+                                    nok = nok + 1
+                                end if
+                            end if
+                        else
+                            if (err .ne. NF_ERANGE)
+     +                          call errore('Range error: ', err)
+                        end if
+                    else
+                        if (err .ne. 0  .and. err .ne. NF_ERANGE)
+     +                      call errore('OK or Range error: ', err)
+                    end if
+                else
+                    if (err .ne. NF_ECHAR)
+     +                  call errore('wrong type: ', err)
+                end if
+4           continue
+1       continue
+        err = nf_close(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_close: ',  err)
+        call print_nok(nok)
+        end
+
+#endif
+#ifdef NF_INT2_T
+        subroutine test_nf_get_var1_int2()
+        implicit        none
+#include "tests.inc"
+        integer ncid
+        integer i
+        integer j
+        integer err
+        integer nok      
+        integer index(MAX_RANK)
+        doubleprecision expect
+        logical canConvert     
+        NF_INT2_T    value
+        doubleprecision val
+
+        nok = 0
+
+        err = nf_open(testfile, NF_NOWRITE, ncid)
+        if (err .ne. 0)
+     +      call errore('nf_open: ', err)
+        do 1, i = 1, NVARS
+            canConvert = (var_type(i) .eq. NF_CHAR) .eqv.
+     +                   (NFT_INT2 .eq. NFT_TEXT)
+            do 2, j = 1, var_rank(i)
+                index(j) = 1
+2           continue
+            err = nf_get_var1_int2(BAD_ID, i, index, value)
+            if (err .ne. NF_EBADID)
+     +          call errore('bad ncid: ', err)
+            err = nf_get_var1_int2(ncid, BAD_VARID,
+     +                  index, value)
+            if (err .ne. NF_ENOTVAR)
+     +          call errore('bad var id: ', err)
+            do 3, j = 1, var_rank(i)
+                index(j) = var_shape(j,i) + 1
+                err = nf_get_var1_int2(ncid, i, index, value)
+                if (.not. canConvert) then
+                    if (err .ne. NF_ECHAR)
+     +                  call errore('conversion: ', err)
+                else
+                    if (err .ne. NF_EINVALCOORDS)
+     +                  call errore('bad index: ', err)
+                endif
+                index(j) = 1
+3           continue
+            do 4, j = 1, var_nels(i)
+                err = index2indexes(j, var_rank(i), var_shape(1,i), 
+     +                              index)
+                if (err .ne. 0)
+     +              call error('error in index2indexes 1')
+                expect = hash4( var_type(i), var_rank(i), index, 
+     +                          NFT_INT2 )
+                err = nf_get_var1_int2(ncid, i, index,
+     +                          value)
+                if (canConvert) then
+                    if (inRange3(expect,var_type(i), 
+     +                           NFT_INT2)) then
+                        if (in_internal_range(NFT_INT2,
+     +                                        expect)) then
+                            if (err .ne. 0) then
+                                call errore('nf_get_var: ', err)
+                            else
+                                val = value
+                                if (.not. equal(val, expect, 
+     +                                          var_type(i), 
+     +                                          NFT_INT2)) then
+                                    call errord('unexpected: ', val)
+                                else
+                                    nok = nok + 1
+                                end if
+                            end if
+                        else
+                            if (err .ne. NF_ERANGE)
+     +                          call errore('Range error: ', err)
+                        end if
+                    else
+                        if (err .ne. 0  .and. err .ne. NF_ERANGE)
+     +                      call errore('OK or Range error: ', err)
+                    end if
+                else
+                    if (err .ne. NF_ECHAR)
+     +                  call errore('wrong type: ', err)
+                end if
+4           continue
+1       continue
+        err = nf_close(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_close: ',  err)
+        call print_nok(nok)
+        end
+
+#endif
+        subroutine test_nf_get_var1_int()
+        implicit        none
+#include "tests.inc"
+        integer ncid
+        integer i
+        integer j
+        integer err
+        integer nok      
+        integer index(MAX_RANK)
+        doubleprecision expect
+        logical canConvert     
+        integer    value
+        doubleprecision val
+
+        nok = 0
+
+        err = nf_open(testfile, NF_NOWRITE, ncid)
+        if (err .ne. 0)
+     +      call errore('nf_open: ', err)
+        do 1, i = 1, NVARS
+            canConvert = (var_type(i) .eq. NF_CHAR) .eqv.
+     +                   (NFT_INT .eq. NFT_TEXT)
+            do 2, j = 1, var_rank(i)
+                index(j) = 1
+2           continue
+            err = nf_get_var1_int(BAD_ID, i, index, value)
+            if (err .ne. NF_EBADID)
+     +          call errore('bad ncid: ', err)
+            err = nf_get_var1_int(ncid, BAD_VARID,
+     +                  index, value)
+            if (err .ne. NF_ENOTVAR)
+     +          call errore('bad var id: ', err)
+            do 3, j = 1, var_rank(i)
+                index(j) = var_shape(j,i) + 1
+                err = nf_get_var1_int(ncid, i, index, value)
+                if (.not. canConvert) then
+                    if (err .ne. NF_ECHAR)
+     +                  call errore('conversion: ', err)
+                else
+                    if (err .ne. NF_EINVALCOORDS)
+     +                  call errore('bad index: ', err)
+                endif
+                index(j) = 1
+3           continue
+            do 4, j = 1, var_nels(i)
+                err = index2indexes(j, var_rank(i), var_shape(1,i), 
+     +                              index)
+                if (err .ne. 0)
+     +              call error('error in index2indexes 1')
+                expect = hash4( var_type(i), var_rank(i), index, 
+     +                          NFT_INT )
+                err = nf_get_var1_int(ncid, i, index,
+     +                          value)
+                if (canConvert) then
+                    if (inRange3(expect,var_type(i), 
+     +                           NFT_INT)) then
+                        if (in_internal_range(NFT_INT,
+     +                                        expect)) then
+                            if (err .ne. 0) then
+                                call errore('nf_get_var: ', err)
+                            else
+                                val = value
+                                if (.not. equal(val, expect, 
+     +                                          var_type(i), 
+     +                                          NFT_INT)) then
+                                    call errord('unexpected: ', val)
+                                else
+                                    nok = nok + 1
+                                end if
+                            end if
+                        else
+                            if (err .ne. NF_ERANGE)
+     +                          call errore('Range error: ', err)
+                        end if
+                    else
+                        if (err .ne. 0  .and. err .ne. NF_ERANGE)
+     +                      call errore('OK or Range error: ', err)
+                    end if
+                else
+                    if (err .ne. NF_ECHAR)
+     +                  call errore('wrong type: ', err)
+                end if
+4           continue
+1       continue
+        err = nf_close(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_close: ',  err)
+        call print_nok(nok)
+        end
+
+        subroutine test_nf_get_var1_real()
+        implicit        none
+#include "tests.inc"
+        integer ncid
+        integer i
+        integer j
+        integer err
+        integer nok      
+        integer index(MAX_RANK)
+        doubleprecision expect
+        logical canConvert     
+        real    value
+        doubleprecision val
+
+        nok = 0
+
+        err = nf_open(testfile, NF_NOWRITE, ncid)
+        if (err .ne. 0)
+     +      call errore('nf_open: ', err)
+        do 1, i = 1, NVARS
+            canConvert = (var_type(i) .eq. NF_CHAR) .eqv.
+     +                   (NFT_REAL .eq. NFT_TEXT)
+            do 2, j = 1, var_rank(i)
+                index(j) = 1
+2           continue
+            err = nf_get_var1_real(BAD_ID, i, index, value)
+            if (err .ne. NF_EBADID)
+     +          call errore('bad ncid: ', err)
+            err = nf_get_var1_real(ncid, BAD_VARID,
+     +                  index, value)
+            if (err .ne. NF_ENOTVAR)
+     +          call errore('bad var id: ', err)
+            do 3, j = 1, var_rank(i)
+                index(j) = var_shape(j,i) + 1
+                err = nf_get_var1_real(ncid, i, index, value)
+                if (.not. canConvert) then
+                    if (err .ne. NF_ECHAR)
+     +                  call errore('conversion: ', err)
+                else
+                    if (err .ne. NF_EINVALCOORDS)
+     +                  call errore('bad index: ', err)
+                endif
+                index(j) = 1
+3           continue
+            do 4, j = 1, var_nels(i)
+                err = index2indexes(j, var_rank(i), var_shape(1,i), 
+     +                              index)
+                if (err .ne. 0)
+     +              call error('error in index2indexes 1')
+                expect = hash4( var_type(i), var_rank(i), index, 
+     +                          NFT_REAL )
+                err = nf_get_var1_real(ncid, i, index,
+     +                          value)
+                if (canConvert) then
+                    if (inRange3(expect,var_type(i), 
+     +                           NFT_REAL)) then
+                        if (in_internal_range(NFT_REAL,
+     +                                        expect)) then
+                            if (err .ne. 0) then
+                                call errore('nf_get_var: ', err)
+                            else
+                                val = value
+                                if (.not. equal(val, expect, 
+     +                                          var_type(i), 
+     +                                          NFT_REAL)) then
+                                    call errord('unexpected: ', val)
+                                else
+                                    nok = nok + 1
+                                end if
+                            end if
+                        else
+                            if (err .ne. NF_ERANGE)
+     +                          call errore('Range error: ', err)
+                        end if
+                    else
+                        if (err .ne. 0  .and. err .ne. NF_ERANGE)
+     +                      call errore('OK or Range error: ', err)
+                    end if
+                else
+                    if (err .ne. NF_ECHAR)
+     +                  call errore('wrong type: ', err)
+                end if
+4           continue
+1       continue
+        err = nf_close(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_close: ',  err)
+        call print_nok(nok)
+        end
+
+        subroutine test_nf_get_var1_double()
+        implicit        none
+#include "tests.inc"
+        integer ncid
+        integer i
+        integer j
+        integer err
+        integer nok      
+        integer index(MAX_RANK)
+        doubleprecision expect
+        logical canConvert     
+        doubleprecision    value
+        doubleprecision val
+
+        nok = 0
+
+        err = nf_open(testfile, NF_NOWRITE, ncid)
+        if (err .ne. 0)
+     +      call errore('nf_open: ', err)
+        do 1, i = 1, NVARS
+            canConvert = (var_type(i) .eq. NF_CHAR) .eqv.
+     +                   (NFT_DOUBLE .eq. NFT_TEXT)
+            do 2, j = 1, var_rank(i)
+                index(j) = 1
+2           continue
+            err = nf_get_var1_double(BAD_ID, i, index, value)
+            if (err .ne. NF_EBADID)
+     +          call errore('bad ncid: ', err)
+            err = nf_get_var1_double(ncid, BAD_VARID,
+     +                  index, value)
+            if (err .ne. NF_ENOTVAR)
+     +          call errore('bad var id: ', err)
+            do 3, j = 1, var_rank(i)
+                index(j) = var_shape(j,i) + 1
+                err = nf_get_var1_double(ncid, i, index, value)
+                if (.not. canConvert) then
+                    if (err .ne. NF_ECHAR)
+     +                  call errore('conversion: ', err)
+                else
+                    if (err .ne. NF_EINVALCOORDS)
+     +                  call errore('bad index: ', err)
+                endif
+                index(j) = 1
+3           continue
+            do 4, j = 1, var_nels(i)
+                err = index2indexes(j, var_rank(i), var_shape(1,i), 
+     +                              index)
+                if (err .ne. 0)
+     +              call error('error in index2indexes 1')
+                expect = hash4( var_type(i), var_rank(i), index, 
+     +                          NFT_DOUBLE )
+                err = nf_get_var1_double(ncid, i, index,
+     +                          value)
+                if (canConvert) then
+                    if (inRange3(expect,var_type(i), 
+     +                           NFT_DOUBLE)) then
+                        if (in_internal_range(NFT_DOUBLE,
+     +                                        expect)) then
+                            if (err .ne. 0) then
+                                call errore('nf_get_var: ', err)
+                            else
+                                val = value
+                                if (.not. equal(val, expect, 
+     +                                          var_type(i), 
+     +                                          NFT_DOUBLE)) then
+                                    call errord('unexpected: ', val)
+                                else
+                                    nok = nok + 1
+                                end if
+                            end if
+                        else
+                            if (err .ne. NF_ERANGE)
+     +                          call errore('Range error: ', err)
+                        end if
+                    else
+                        if (err .ne. 0  .and. err .ne. NF_ERANGE)
+     +                      call errore('OK or Range error: ', err)
+                    end if
+                else
+                    if (err .ne. NF_ECHAR)
+     +                  call errore('wrong type: ', err)
+                end if
+4           continue
+1       continue
+        err = nf_close(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_close: ',  err)
+        call print_nok(nok)
+        end
+
+
+        subroutine test_nf_get_var_text()
+        implicit        none
+#include "tests.inc"
+        integer ncid
+        integer i
+        integer j
+        integer err
+        logical allInExtRange   
+        logical allInIntRange   
+        integer nels
+        integer nok      
+        integer index(MAX_RANK)
+        doubleprecision expect(MAX_NELS)
+        logical canConvert     
+        character    value(MAX_NELS)
+        doubleprecision val
+
+        nok = 0
+
+        err = nf_open(testfile, NF_NOWRITE, ncid)
+        if (err .ne. 0)
+     +      call errore('nf_open: ', err)
+        do 1, i = 1, NVARS
+            canConvert = (var_type(i) .eq. NF_CHAR) .eqv.
+     +                   (NFT_TEXT .eq. NFT_TEXT)
+            err = nf_get_var_text(BAD_ID, i, value)
+            if (err .ne. NF_EBADID)
+     +          call errore('bad ncid: ', err)
+            err = nf_get_var_text(ncid, BAD_VARID, value)
+            if (err .ne. NF_ENOTVAR)
+     +          call errore('bad var id: ', err)
+            nels = 1
+            do 3, j = 1, var_rank(i)
+                nels = nels * var_shape(j,i)
+3           continue
+            allInExtRange = .true.
+            allInIntRange = .true.
+            do 4, j = 1, var_nels(i)
+                err = index2indexes(j, var_rank(i), var_shape(1,i), 
+     +                              index)
+                if (err .ne. 0)
+     +              call error('error in index2indexes 1')
+                expect(j) = hash4( var_type(i), var_rank(i), index, 
+     +                          NFT_TEXT )
+                if (inRange3(expect(j),var_type(i), NFT_TEXT)) then
+                    allInIntRange = allInIntRange .and.
+     +                  in_internal_range(NFT_TEXT, expect(j))
+                else
+                    allInExtRange = .false.
+                end if
+4           continue
+            err = nf_get_var_text(ncid, i, value)
+            if (canConvert) then
+                if (allInExtRange) then
+                    if (allInIntRange) then
+                        if (err .ne. 0) 
+     +                      call errore('nf_get_var: ', err)
+                    else
+                        if (err .ne. NF_ERANGE)
+     +                      call errore('Range error: ', err)
+                    endif
+                else
+                    if (err .ne. 0  .and. err .ne. NF_ERANGE)
+     +                  call errore('Range error: ', err)
+                endif
+                do 5, j = 1, var_nels(i)
+                    if (inRange3(expect(j),var_type(i),
+     +                           NFT_TEXT) .and.
+     +                  in_internal_range(NFT_TEXT,
+     +                                          expect(j))) then
+                        val = ichar(value(j))
+                        if (.not. equal(val, expect(j), 
+     +                                  var_type(i), 
+     +                                  NFT_TEXT)) then
+                            call errord('unexpected: ', val)
+                        else
+                            nok = nok + 1
+                        end if
+                    endif
+5               continue
+            else
+                if (err .ne. NF_ECHAR)
+     +                  call errore('wrong type: ', err)
+            end if
+1       continue
+        err = nf_close(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_close: ',  err)
+        call print_nok(nok)
+        end
+
+#ifdef NF_INT1_T
+        subroutine test_nf_get_var_int1()
+        implicit        none
+#include "tests.inc"
+        integer ncid
+        integer i
+        integer j
+        integer err
+        logical allInExtRange   
+        logical allInIntRange   
+        integer nels
+        integer nok      
+        integer index(MAX_RANK)
+        doubleprecision expect(MAX_NELS)
+        logical canConvert     
+        NF_INT1_T    value(MAX_NELS)
+        doubleprecision val
+
+        nok = 0
+
+        err = nf_open(testfile, NF_NOWRITE, ncid)
+        if (err .ne. 0)
+     +      call errore('nf_open: ', err)
+        do 1, i = 1, NVARS
+            canConvert = (var_type(i) .eq. NF_CHAR) .eqv.
+     +                   (NFT_INT1 .eq. NFT_TEXT)
+            err = nf_get_var_int1(BAD_ID, i, value)
+            if (err .ne. NF_EBADID)
+     +          call errore('bad ncid: ', err)
+            err = nf_get_var_int1(ncid, BAD_VARID, value)
+            if (err .ne. NF_ENOTVAR)
+     +          call errore('bad var id: ', err)
+            nels = 1
+            do 3, j = 1, var_rank(i)
+                nels = nels * var_shape(j,i)
+3           continue
+            allInExtRange = .true.
+            allInIntRange = .true.
+            do 4, j = 1, var_nels(i)
+                err = index2indexes(j, var_rank(i), var_shape(1,i), 
+     +                              index)
+                if (err .ne. 0)
+     +              call error('error in index2indexes 1')
+                expect(j) = hash4( var_type(i), var_rank(i), index, 
+     +                          NFT_INT1 )
+                if (inRange3(expect(j),var_type(i), NFT_INT1)) then
+                    allInIntRange = allInIntRange .and.
+     +                  in_internal_range(NFT_INT1, expect(j))
+                else
+                    allInExtRange = .false.
+                end if
+4           continue
+            err = nf_get_var_int1(ncid, i, value)
+            if (canConvert) then
+                if (allInExtRange) then
+                    if (allInIntRange) then
+                        if (err .ne. 0) 
+     +                      call errore('nf_get_var: ', err)
+                    else
+                        if (err .ne. NF_ERANGE)
+     +                      call errore('Range error: ', err)
+                    endif
+                else
+                    if (err .ne. 0  .and. err .ne. NF_ERANGE)
+     +                  call errore('Range error: ', err)
+                endif
+                do 5, j = 1, var_nels(i)
+                    if (inRange3(expect(j),var_type(i),
+     +                           NFT_INT1) .and.
+     +                  in_internal_range(NFT_INT1,
+     +                                          expect(j))) then
+                        val = value(j)
+                        if (.not. equal(val, expect(j), 
+     +                                  var_type(i), 
+     +                                  NFT_INT1)) then
+                            call errord('unexpected: ', val)
+                        else
+                            nok = nok + 1
+                        end if
+                    endif
+5               continue
+            else
+                if (err .ne. NF_ECHAR)
+     +                  call errore('wrong type: ', err)
+            end if
+1       continue
+        err = nf_close(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_close: ',  err)
+        call print_nok(nok)
+        end
+
+#endif
+#ifdef NF_INT2_T
+        subroutine test_nf_get_var_int2()
+        implicit        none
+#include "tests.inc"
+        integer ncid
+        integer i
+        integer j
+        integer err
+        logical allInExtRange   
+        logical allInIntRange   
+        integer nels
+        integer nok      
+        integer index(MAX_RANK)
+        doubleprecision expect(MAX_NELS)
+        logical canConvert     
+        NF_INT2_T    value(MAX_NELS)
+        doubleprecision val
+
+        nok = 0
+
+        err = nf_open(testfile, NF_NOWRITE, ncid)
+        if (err .ne. 0)
+     +      call errore('nf_open: ', err)
+        do 1, i = 1, NVARS
+            canConvert = (var_type(i) .eq. NF_CHAR) .eqv.
+     +                   (NFT_INT2 .eq. NFT_TEXT)
+            err = nf_get_var_int2(BAD_ID, i, value)
+            if (err .ne. NF_EBADID)
+     +          call errore('bad ncid: ', err)
+            err = nf_get_var_int2(ncid, BAD_VARID, value)
+            if (err .ne. NF_ENOTVAR)
+     +          call errore('bad var id: ', err)
+            nels = 1
+            do 3, j = 1, var_rank(i)
+                nels = nels * var_shape(j,i)
+3           continue
+            allInExtRange = .true.
+            allInIntRange = .true.
+            do 4, j = 1, var_nels(i)
+                err = index2indexes(j, var_rank(i), var_shape(1,i), 
+     +                              index)
+                if (err .ne. 0)
+     +              call error('error in index2indexes 1')
+                expect(j) = hash4( var_type(i), var_rank(i), index, 
+     +                          NFT_INT2 )
+                if (inRange3(expect(j),var_type(i), NFT_INT2)) then
+                    allInIntRange = allInIntRange .and.
+     +                  in_internal_range(NFT_INT2, expect(j))
+                else
+                    allInExtRange = .false.
+                end if
+4           continue
+            err = nf_get_var_int2(ncid, i, value)
+            if (canConvert) then
+                if (allInExtRange) then
+                    if (allInIntRange) then
+                        if (err .ne. 0) 
+     +                      call errore('nf_get_var: ', err)
+                    else
+                        if (err .ne. NF_ERANGE)
+     +                      call errore('Range error: ', err)
+                    endif
+                else
+                    if (err .ne. 0  .and. err .ne. NF_ERANGE)
+     +                  call errore('Range error: ', err)
+                endif
+                do 5, j = 1, var_nels(i)
+                    if (inRange3(expect(j),var_type(i),
+     +                           NFT_INT2) .and.
+     +                  in_internal_range(NFT_INT2,
+     +                                          expect(j))) then
+                        val = value(j)
+                        if (.not. equal(val, expect(j), 
+     +                                  var_type(i), 
+     +                                  NFT_INT2)) then
+                            call errord('unexpected: ', val)
+                        else
+                            nok = nok + 1
+                        end if
+                    endif
+5               continue
+            else
+                if (err .ne. NF_ECHAR)
+     +                  call errore('wrong type: ', err)
+            end if
+1       continue
+        err = nf_close(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_close: ',  err)
+        call print_nok(nok)
+        end
+
+#endif
+        subroutine test_nf_get_var_int()
+        implicit        none
+#include "tests.inc"
+        integer ncid
+        integer i
+        integer j
+        integer err
+        logical allInExtRange   
+        logical allInIntRange   
+        integer nels
+        integer nok      
+        integer index(MAX_RANK)
+        doubleprecision expect(MAX_NELS)
+        logical canConvert     
+        integer    value(MAX_NELS)
+        doubleprecision val
+
+        nok = 0
+
+        err = nf_open(testfile, NF_NOWRITE, ncid)
+        if (err .ne. 0)
+     +      call errore('nf_open: ', err)
+        do 1, i = 1, NVARS
+            canConvert = (var_type(i) .eq. NF_CHAR) .eqv.
+     +                   (NFT_INT .eq. NFT_TEXT)
+            err = nf_get_var_int(BAD_ID, i, value)
+            if (err .ne. NF_EBADID)
+     +          call errore('bad ncid: ', err)
+            err = nf_get_var_int(ncid, BAD_VARID, value)
+            if (err .ne. NF_ENOTVAR)
+     +          call errore('bad var id: ', err)
+            nels = 1
+            do 3, j = 1, var_rank(i)
+                nels = nels * var_shape(j,i)
+3           continue
+            allInExtRange = .true.
+            allInIntRange = .true.
+            do 4, j = 1, var_nels(i)
+                err = index2indexes(j, var_rank(i), var_shape(1,i), 
+     +                              index)
+                if (err .ne. 0)
+     +              call error('error in index2indexes 1')
+                expect(j) = hash4( var_type(i), var_rank(i), index, 
+     +                          NFT_INT )
+                if (inRange3(expect(j),var_type(i), NFT_INT)) then
+                    allInIntRange = allInIntRange .and.
+     +                  in_internal_range(NFT_INT, expect(j))
+                else
+                    allInExtRange = .false.
+                end if
+4           continue
+            err = nf_get_var_int(ncid, i, value)
+            if (canConvert) then
+                if (allInExtRange) then
+                    if (allInIntRange) then
+                        if (err .ne. 0) 
+     +                      call errore('nf_get_var: ', err)
+                    else
+                        if (err .ne. NF_ERANGE)
+     +                      call errore('Range error: ', err)
+                    endif
+                else
+                    if (err .ne. 0  .and. err .ne. NF_ERANGE)
+     +                  call errore('Range error: ', err)
+                endif
+                do 5, j = 1, var_nels(i)
+                    if (inRange3(expect(j),var_type(i),
+     +                           NFT_INT) .and.
+     +                  in_internal_range(NFT_INT,
+     +                                          expect(j))) then
+                        val = value(j)
+                        if (.not. equal(val, expect(j), 
+     +                                  var_type(i), 
+     +                                  NFT_INT)) then
+                            call errord('unexpected: ', val)
+                        else
+                            nok = nok + 1
+                        end if
+                    endif
+5               continue
+            else
+                if (err .ne. NF_ECHAR)
+     +                  call errore('wrong type: ', err)
+            end if
+1       continue
+        err = nf_close(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_close: ',  err)
+        call print_nok(nok)
+        end
+
+        subroutine test_nf_get_var_real()
+        implicit        none
+#include "tests.inc"
+        integer ncid
+        integer i
+        integer j
+        integer err
+        logical allInExtRange   
+        logical allInIntRange   
+        integer nels
+        integer nok      
+        integer index(MAX_RANK)
+        doubleprecision expect(MAX_NELS)
+        logical canConvert     
+        real    value(MAX_NELS)
+        doubleprecision val
+
+        nok = 0
+
+        err = nf_open(testfile, NF_NOWRITE, ncid)
+        if (err .ne. 0)
+     +      call errore('nf_open: ', err)
+        do 1, i = 1, NVARS
+            canConvert = (var_type(i) .eq. NF_CHAR) .eqv.
+     +                   (NFT_REAL .eq. NFT_TEXT)
+            err = nf_get_var_real(BAD_ID, i, value)
+            if (err .ne. NF_EBADID)
+     +          call errore('bad ncid: ', err)
+            err = nf_get_var_real(ncid, BAD_VARID, value)
+            if (err .ne. NF_ENOTVAR)
+     +          call errore('bad var id: ', err)
+            nels = 1
+            do 3, j = 1, var_rank(i)
+                nels = nels * var_shape(j,i)
+3           continue
+            allInExtRange = .true.
+            allInIntRange = .true.
+            do 4, j = 1, var_nels(i)
+                err = index2indexes(j, var_rank(i), var_shape(1,i), 
+     +                              index)
+                if (err .ne. 0)
+     +              call error('error in index2indexes 1')
+                expect(j) = hash4( var_type(i), var_rank(i), index, 
+     +                          NFT_REAL )
+                if (inRange3(expect(j),var_type(i), NFT_REAL)) then
+                    allInIntRange = allInIntRange .and.
+     +                  in_internal_range(NFT_REAL, expect(j))
+                else
+                    allInExtRange = .false.
+                end if
+4           continue
+            err = nf_get_var_real(ncid, i, value)
+            if (canConvert) then
+                if (allInExtRange) then
+                    if (allInIntRange) then
+                        if (err .ne. 0) 
+     +                      call errore('nf_get_var: ', err)
+                    else
+                        if (err .ne. NF_ERANGE)
+     +                      call errore('Range error: ', err)
+                    endif
+                else
+                    if (err .ne. 0  .and. err .ne. NF_ERANGE)
+     +                  call errore('Range error: ', err)
+                endif
+                do 5, j = 1, var_nels(i)
+                    if (inRange3(expect(j),var_type(i),
+     +                           NFT_REAL) .and.
+     +                  in_internal_range(NFT_REAL,
+     +                                          expect(j))) then
+                        val = value(j)
+                        if (.not. equal(val, expect(j), 
+     +                                  var_type(i), 
+     +                                  NFT_REAL)) then
+                            call errord('unexpected: ', val)
+                        else
+                            nok = nok + 1
+                        end if
+                    endif
+5               continue
+            else
+                if (err .ne. NF_ECHAR)
+     +                  call errore('wrong type: ', err)
+            end if
+1       continue
+        err = nf_close(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_close: ',  err)
+        call print_nok(nok)
+        end
+
+        subroutine test_nf_get_var_double()
+        implicit        none
+#include "tests.inc"
+        integer ncid
+        integer i
+        integer j
+        integer err
+        logical allInExtRange   
+        logical allInIntRange   
+        integer nels
+        integer nok      
+        integer index(MAX_RANK)
+        doubleprecision expect(MAX_NELS)
+        logical canConvert     
+        doubleprecision    value(MAX_NELS)
+        doubleprecision val
+
+        nok = 0
+
+        err = nf_open(testfile, NF_NOWRITE, ncid)
+        if (err .ne. 0)
+     +      call errore('nf_open: ', err)
+        do 1, i = 1, NVARS
+            canConvert = (var_type(i) .eq. NF_CHAR) .eqv.
+     +                   (NFT_DOUBLE .eq. NFT_TEXT)
+            err = nf_get_var_double(BAD_ID, i, value)
+            if (err .ne. NF_EBADID)
+     +          call errore('bad ncid: ', err)
+            err = nf_get_var_double(ncid, BAD_VARID, value)
+            if (err .ne. NF_ENOTVAR)
+     +          call errore('bad var id: ', err)
+            nels = 1
+            do 3, j = 1, var_rank(i)
+                nels = nels * var_shape(j,i)
+3           continue
+            allInExtRange = .true.
+            allInIntRange = .true.
+            do 4, j = 1, var_nels(i)
+                err = index2indexes(j, var_rank(i), var_shape(1,i), 
+     +                              index)
+                if (err .ne. 0)
+     +              call error('error in index2indexes 1')
+                expect(j) = hash4( var_type(i), var_rank(i), index, 
+     +                          NFT_DOUBLE )
+                if (inRange3(expect(j),var_type(i), NFT_DOUBLE)) then
+                    allInIntRange = allInIntRange .and.
+     +                  in_internal_range(NFT_DOUBLE, expect(j))
+                else
+                    allInExtRange = .false.
+                end if
+4           continue
+            err = nf_get_var_double(ncid, i, value)
+            if (canConvert) then
+                if (allInExtRange) then
+                    if (allInIntRange) then
+                        if (err .ne. 0) 
+     +                      call errore('nf_get_var: ', err)
+                    else
+                        if (err .ne. NF_ERANGE)
+     +                      call errore('Range error: ', err)
+                    endif
+                else
+                    if (err .ne. 0  .and. err .ne. NF_ERANGE)
+     +                  call errore('Range error: ', err)
+                endif
+                do 5, j = 1, var_nels(i)
+                    if (inRange3(expect(j),var_type(i),
+     +                           NFT_DOUBLE) .and.
+     +                  in_internal_range(NFT_DOUBLE,
+     +                                          expect(j))) then
+                        val = value(j)
+                        if (.not. equal(val, expect(j), 
+     +                                  var_type(i), 
+     +                                  NFT_DOUBLE)) then
+                            call errord('unexpected: ', val)
+                        else
+                            nok = nok + 1
+                        end if
+                    endif
+5               continue
+            else
+                if (err .ne. NF_ECHAR)
+     +                  call errore('wrong type: ', err)
+            end if
+1       continue
+        err = nf_close(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_close: ',  err)
+        call print_nok(nok)
+        end
+
+
+        subroutine test_nf_get_vara_text()
+        implicit        none
+#include "tests.inc"
+        integer ncid
+        integer d
+        integer i
+        integer j
+        integer k
+        integer err
+        logical allInExtRange   
+        logical allInIntRange   
+        integer nels
+        integer nslabs
+        integer nok      
+        integer start(MAX_RANK)
+        integer edge(MAX_RANK)
+        integer index(MAX_RANK)
+        integer mid(MAX_RANK)
+        logical canConvert     
+        character    value(MAX_NELS)
+        doubleprecision expect(MAX_NELS)
+        doubleprecision val
+        integer udshift
+
+        nok = 0
+
+        err = nf_open(testfile, NF_NOWRITE, ncid)
+        if (err .ne. 0)
+     +      call errore('nf_open: ', err)
+        do 1, i = 1, NVARS
+            canConvert = (var_type(i) .eq. NF_CHAR) .eqv. 
+     +                   (NFT_TEXT .eq. NFT_TEXT)
+            if (.not.(var_rank(i) .le. MAX_RANK)) stop 2
+            if (.not.(var_nels(i) .le. MAX_NELS)) stop 2
+            do 2, j = 1, var_rank(i)
+                start(j) = 1
+                edge(j) = 1
+2           continue
+            err = nf_get_vara_text(BAD_ID, i, start,
+     +                  edge, value)
+            if (err .ne. NF_EBADID)
+     +          call errore('bad ncid: ', err)
+            err = nf_get_vara_text(ncid, BAD_VARID, start, 
+     +                           edge, value)
+            if (err .ne. NF_ENOTVAR)
+     +          call errore('bad var id: ', err)
+            do 3, j = 1, var_rank(i)
+                start(j) = var_shape(j,i) + 1
+                err = nf_get_vara_text(ncid, i, start,
+     +                               edge, value)
+                if (canConvert .and. err .ne. NF_EINVALCOORDS)
+     +              call errore('bad index: ', err)
+                start(j) = 1
+                edge(j) = var_shape(j,i) + 1
+                err = nf_get_vara_text(ncid, i, start,
+     +                               edge, value)
+                if (canConvert .and. err .ne. NF_EEDGE)
+     +              call errore('bad edge: ', err)
+                edge(j) = 1
+3           continue
+
+C           /* Check non-scalars for correct error returned even when */
+C           /* there is nothing to get (edge(j).eq.0) */
+            if (var_rank(i) .gt. 0) then
+                do 10, j = 1, var_rank(i)
+                    edge(j) = 0
+10              continue
+                err = nf_get_vara_text(BAD_ID, i, start,
+     +                  edge, value)
+                if (err .ne. NF_EBADID) 
+     +              call errore('bad ncid: ', err)
+                err = nf_get_vara_text(ncid, BAD_VARID,
+     +                  start, edge, value)
+                if (err .ne. NF_ENOTVAR) 
+     +              call errore('bad var id: ', err)
+                do 11, j = 1, var_rank(i)
+                    if (var_dimid(j,i) .gt. 1) then     !/* skip record dim */
+                        start(j) = var_shape(j,i) + 1
+                        err = nf_get_vara_text(ncid, i,
+     +                          start, edge, value)
+                        if (canConvert .and. err .ne. NF_EINVALCOORDS)
+     +                      call errore('bad start: ', err)
+                        start(j) = 1
+                    endif
+11              continue
+                err = nf_get_vara_text(ncid, i, start,
+     +                          edge, value)
+                if (canConvert) then
+                    if (err .ne. 0) 
+     +                  call error(nf_strerror(err))
+                else
+                    if (err .ne. NF_ECHAR)
+     +                  call errore('wrong type: ', err)
+                endif
+                do 12, j = 1, var_rank(i)
+                    edge(j) = 1
+12              continue
+            endif
+
+C           Choose a random point dividing each dim into 2 parts
+C           get 2^rank (nslabs) slabs so defined
+            nslabs = 1
+            do 4, j = 1, var_rank(i)
+                mid(j) = roll( var_shape(j,i) )
+                nslabs = nslabs * 2
+4           continue
+C           bits of k determine whether to get lower or upper part of dim 
+            do 5, k = 1, nslabs
+                nels = 1
+                do 6, j = 1, var_rank(i)
+                    if (mod(udshift((k-1), -(j-1)), 2) .eq. 1) then
+                        start(j) = 1
+                        edge(j) = mid(j)
+                    else
+                        start(j) = 1 + mid(j)
+                        edge(j) = var_shape(j,i) - mid(j)
+                    end if
+                    nels = nels * edge(j)
+6               continue
+                allInIntRange = .true.
+                allInExtRange = .true.
+                do 7, j = 1, nels
+                    err = index2indexes(j, var_rank(i), edge, index)
+                    if (err .ne. 0)
+     +                  call error('error in index2indexes 1')
+                    do 8, d = 1, var_rank(i)
+                        index(d) = index(d) + start(d) - 1
+8                   continue
+                    expect(j) = hash4(var_type(i), var_rank(i), index, 
+     +                                NFT_TEXT)
+                    if (inRange3(expect(j),var_type(i), 
+     +                           NFT_TEXT)) then
+                        allInIntRange = 
+     +                      allInIntRange .and.
+     +                      in_internal_range(NFT_TEXT, expect(j))
+                    else
+                        allInExtRange = .false.
+                    end if
+7               continue
+                err = nf_get_vara_text(ncid, i, start,
+     +                          edge, value)
+                if (canConvert) then
+                    if (allInExtRange) then
+                        if (allInIntRange) then
+                            if (err .ne. 0)
+     +                          call errore('nf_get_vara_text:', err)
+                        else
+                            if (err .ne. NF_ERANGE)
+     +                          call errore('Range error: ', err)
+                        end if
+                    else
+                        if (err .ne. 0 .and. err .ne. NF_ERANGE)
+     +                      call errore('OK or Range error: ', err)
+                    end if
+                    do 9, j = 1, nels
+                        if (inRange3(expect(j),var_type(i),
+     +                               NFT_TEXT) .and.
+     +                      in_internal_range(NFT_TEXT, expect(j)))
+     +                          then
+                            val = ichar(value(j))
+                            if (.not.equal(val,expect(j),
+     +                                     var_type(i),NFT_TEXT)) 
+     +                              then
+                                call error(
+     +                              'value read not that expected')
+                                if (verbose) then
+                                    call error(' ')
+                                    call errori('varid: ', i)
+                                    call errorc('var_name: ',
+     +                                  var_name(i))
+                                    call errori('element number: %d ', 
+     +                                          j)
+                                    call errord('expect: ', expect(j))
+                                    call errord('got: ', val)
+                                end if
+                            else
+                                nok = nok + 1
+                            end if
+                        end if
+9                   continue
+                else
+                    if (nels .gt. 0  .and. err .ne. NF_ECHAR)
+     +                  call errore('wrong type: ', err)
+                end if
+5           continue
+1       continue
+        err = nf_close(ncid)
+        if (err .ne. 0)
+     +      call errorc('nf_close: ', nf_strerror(err))
+        call print_nok(nok)
+        end
+
+#ifdef NF_INT1_T
+        subroutine test_nf_get_vara_int1()
+        implicit        none
+#include "tests.inc"
+        integer ncid
+        integer d
+        integer i
+        integer j
+        integer k
+        integer err
+        logical allInExtRange   
+        logical allInIntRange   
+        integer nels
+        integer nslabs
+        integer nok      
+        integer start(MAX_RANK)
+        integer edge(MAX_RANK)
+        integer index(MAX_RANK)
+        integer mid(MAX_RANK)
+        logical canConvert     
+        NF_INT1_T    value(MAX_NELS)
+        doubleprecision expect(MAX_NELS)
+        doubleprecision val
+        integer udshift
+
+        nok = 0
+
+        err = nf_open(testfile, NF_NOWRITE, ncid)
+        if (err .ne. 0)
+     +      call errore('nf_open: ', err)
+        do 1, i = 1, NVARS
+            canConvert = (var_type(i) .eq. NF_CHAR) .eqv. 
+     +                   (NFT_INT1 .eq. NFT_TEXT)
+            if (.not.(var_rank(i) .le. MAX_RANK)) stop 2
+            if (.not.(var_nels(i) .le. MAX_NELS)) stop 2
+            do 2, j = 1, var_rank(i)
+                start(j) = 1
+                edge(j) = 1
+2           continue
+            err = nf_get_vara_int1(BAD_ID, i, start,
+     +                  edge, value)
+            if (err .ne. NF_EBADID)
+     +          call errore('bad ncid: ', err)
+            err = nf_get_vara_int1(ncid, BAD_VARID, start, 
+     +                           edge, value)
+            if (err .ne. NF_ENOTVAR)
+     +          call errore('bad var id: ', err)
+            do 3, j = 1, var_rank(i)
+                start(j) = var_shape(j,i) + 1
+                err = nf_get_vara_int1(ncid, i, start,
+     +                               edge, value)
+                if (canConvert .and. err .ne. NF_EINVALCOORDS)
+     +              call errore('bad index: ', err)
+                start(j) = 1
+                edge(j) = var_shape(j,i) + 1
+                err = nf_get_vara_int1(ncid, i, start,
+     +                               edge, value)
+                if (canConvert .and. err .ne. NF_EEDGE)
+     +              call errore('bad edge: ', err)
+                edge(j) = 1
+3           continue
+
+C           /* Check non-scalars for correct error returned even when */
+C           /* there is nothing to get (edge(j).eq.0) */
+            if (var_rank(i) .gt. 0) then
+                do 10, j = 1, var_rank(i)
+                    edge(j) = 0
+10              continue
+                err = nf_get_vara_int1(BAD_ID, i, start,
+     +                  edge, value)
+                if (err .ne. NF_EBADID) 
+     +              call errore('bad ncid: ', err)
+                err = nf_get_vara_int1(ncid, BAD_VARID,
+     +                  start, edge, value)
+                if (err .ne. NF_ENOTVAR) 
+     +              call errore('bad var id: ', err)
+                do 11, j = 1, var_rank(i)
+                    if (var_dimid(j,i) .gt. 1) then     !/* skip record dim */
+                        start(j) = var_shape(j,i) + 1
+                        err = nf_get_vara_int1(ncid, i,
+     +                          start, edge, value)
+                        if (canConvert .and. err .ne. NF_EINVALCOORDS)
+     +                      call errore('bad start: ', err)
+                        start(j) = 1
+                    endif
+11              continue
+                err = nf_get_vara_int1(ncid, i, start,
+     +                          edge, value)
+                if (canConvert) then
+                    if (err .ne. 0) 
+     +                  call error(nf_strerror(err))
+                else
+                    if (err .ne. NF_ECHAR)
+     +                  call errore('wrong type: ', err)
+                endif
+                do 12, j = 1, var_rank(i)
+                    edge(j) = 1
+12              continue
+            endif
+
+C           Choose a random point dividing each dim into 2 parts
+C           get 2^rank (nslabs) slabs so defined
+            nslabs = 1
+            do 4, j = 1, var_rank(i)
+                mid(j) = roll( var_shape(j,i) )
+                nslabs = nslabs * 2
+4           continue
+C           bits of k determine whether to get lower or upper part of dim 
+            do 5, k = 1, nslabs
+                nels = 1
+                do 6, j = 1, var_rank(i)
+                    if (mod(udshift((k-1), -(j-1)), 2) .eq. 1) then
+                        start(j) = 1
+                        edge(j) = mid(j)
+                    else
+                        start(j) = 1 + mid(j)
+                        edge(j) = var_shape(j,i) - mid(j)
+                    end if
+                    nels = nels * edge(j)
+6               continue
+                allInIntRange = .true.
+                allInExtRange = .true.
+                do 7, j = 1, nels
+                    err = index2indexes(j, var_rank(i), edge, index)
+                    if (err .ne. 0)
+     +                  call error('error in index2indexes 1')
+                    do 8, d = 1, var_rank(i)
+                        index(d) = index(d) + start(d) - 1
+8                   continue
+                    expect(j) = hash4(var_type(i), var_rank(i), index, 
+     +                                NFT_INT1)
+                    if (inRange3(expect(j),var_type(i), 
+     +                           NFT_INT1)) then
+                        allInIntRange = 
+     +                      allInIntRange .and.
+     +                      in_internal_range(NFT_INT1, expect(j))
+                    else
+                        allInExtRange = .false.
+                    end if
+7               continue
+                err = nf_get_vara_int1(ncid, i, start,
+     +                          edge, value)
+                if (canConvert) then
+                    if (allInExtRange) then
+                        if (allInIntRange) then
+                            if (err .ne. 0)
+     +                          call errore('nf_get_vara_int1:', err)
+                        else
+                            if (err .ne. NF_ERANGE)
+     +                          call errore('Range error: ', err)
+                        end if
+                    else
+                        if (err .ne. 0 .and. err .ne. NF_ERANGE)
+     +                      call errore('OK or Range error: ', err)
+                    end if
+                    do 9, j = 1, nels
+                        if (inRange3(expect(j),var_type(i),
+     +                               NFT_INT1) .and.
+     +                      in_internal_range(NFT_INT1, expect(j)))
+     +                          then
+                            val = value(j)
+                            if (.not.equal(val,expect(j),
+     +                                     var_type(i),NFT_INT1)) 
+     +                              then
+                                call error(
+     +                              'value read not that expected')
+                                if (verbose) then
+                                    call error(' ')
+                                    call errori('varid: ', i)
+                                    call errorc('var_name: ',
+     +                                  var_name(i))
+                                    call errori('element number: %d ', 
+     +                                          j)
+                                    call errord('expect: ', expect(j))
+                                    call errord('got: ', val)
+                                end if
+                            else
+                                nok = nok + 1
+                            end if
+                        end if
+9                   continue
+                else
+                    if (nels .gt. 0  .and. err .ne. NF_ECHAR)
+     +                  call errore('wrong type: ', err)
+                end if
+5           continue
+1       continue
+        err = nf_close(ncid)
+        if (err .ne. 0)
+     +      call errorc('nf_close: ', nf_strerror(err))
+        call print_nok(nok)
+        end
+
+#endif
+#ifdef NF_INT2_T
+        subroutine test_nf_get_vara_int2()
+        implicit        none
+#include "tests.inc"
+        integer ncid
+        integer d
+        integer i
+        integer j
+        integer k
+        integer err
+        logical allInExtRange   
+        logical allInIntRange   
+        integer nels
+        integer nslabs
+        integer nok      
+        integer start(MAX_RANK)
+        integer edge(MAX_RANK)
+        integer index(MAX_RANK)
+        integer mid(MAX_RANK)
+        logical canConvert     
+        NF_INT2_T    value(MAX_NELS)
+        doubleprecision expect(MAX_NELS)
+        doubleprecision val
+        integer udshift
+
+        nok = 0
+
+        err = nf_open(testfile, NF_NOWRITE, ncid)
+        if (err .ne. 0)
+     +      call errore('nf_open: ', err)
+        do 1, i = 1, NVARS
+            canConvert = (var_type(i) .eq. NF_CHAR) .eqv. 
+     +                   (NFT_INT2 .eq. NFT_TEXT)
+            if (.not.(var_rank(i) .le. MAX_RANK)) stop 2
+            if (.not.(var_nels(i) .le. MAX_NELS)) stop 2
+            do 2, j = 1, var_rank(i)
+                start(j) = 1
+                edge(j) = 1
+2           continue
+            err = nf_get_vara_int2(BAD_ID, i, start,
+     +                  edge, value)
+            if (err .ne. NF_EBADID)
+     +          call errore('bad ncid: ', err)
+            err = nf_get_vara_int2(ncid, BAD_VARID, start, 
+     +                           edge, value)
+            if (err .ne. NF_ENOTVAR)
+     +          call errore('bad var id: ', err)
+            do 3, j = 1, var_rank(i)
+                start(j) = var_shape(j,i) + 1
+                err = nf_get_vara_int2(ncid, i, start,
+     +                               edge, value)
+                if (canConvert .and. err .ne. NF_EINVALCOORDS)
+     +              call errore('bad index: ', err)
+                start(j) = 1
+                edge(j) = var_shape(j,i) + 1
+                err = nf_get_vara_int2(ncid, i, start,
+     +                               edge, value)
+                if (canConvert .and. err .ne. NF_EEDGE)
+     +              call errore('bad edge: ', err)
+                edge(j) = 1
+3           continue
+
+C           /* Check non-scalars for correct error returned even when */
+C           /* there is nothing to get (edge(j).eq.0) */
+            if (var_rank(i) .gt. 0) then
+                do 10, j = 1, var_rank(i)
+                    edge(j) = 0
+10              continue
+                err = nf_get_vara_int2(BAD_ID, i, start,
+     +                  edge, value)
+                if (err .ne. NF_EBADID) 
+     +              call errore('bad ncid: ', err)
+                err = nf_get_vara_int2(ncid, BAD_VARID,
+     +                  start, edge, value)
+                if (err .ne. NF_ENOTVAR) 
+     +              call errore('bad var id: ', err)
+                do 11, j = 1, var_rank(i)
+                    if (var_dimid(j,i) .gt. 1) then     !/* skip record dim */
+                        start(j) = var_shape(j,i) + 1
+                        err = nf_get_vara_int2(ncid, i,
+     +                          start, edge, value)
+                        if (canConvert .and. err .ne. NF_EINVALCOORDS)
+     +                      call errore('bad start: ', err)
+                        start(j) = 1
+                    endif
+11              continue
+                err = nf_get_vara_int2(ncid, i, start,
+     +                          edge, value)
+                if (canConvert) then
+                    if (err .ne. 0) 
+     +                  call error(nf_strerror(err))
+                else
+                    if (err .ne. NF_ECHAR)
+     +                  call errore('wrong type: ', err)
+                endif
+                do 12, j = 1, var_rank(i)
+                    edge(j) = 1
+12              continue
+            endif
+
+C           Choose a random point dividing each dim into 2 parts
+C           get 2^rank (nslabs) slabs so defined
+            nslabs = 1
+            do 4, j = 1, var_rank(i)
+                mid(j) = roll( var_shape(j,i) )
+                nslabs = nslabs * 2
+4           continue
+C           bits of k determine whether to get lower or upper part of dim 
+            do 5, k = 1, nslabs
+                nels = 1
+                do 6, j = 1, var_rank(i)
+                    if (mod(udshift((k-1), -(j-1)), 2) .eq. 1) then
+                        start(j) = 1
+                        edge(j) = mid(j)
+                    else
+                        start(j) = 1 + mid(j)
+                        edge(j) = var_shape(j,i) - mid(j)
+                    end if
+                    nels = nels * edge(j)
+6               continue
+                allInIntRange = .true.
+                allInExtRange = .true.
+                do 7, j = 1, nels
+                    err = index2indexes(j, var_rank(i), edge, index)
+                    if (err .ne. 0)
+     +                  call error('error in index2indexes 1')
+                    do 8, d = 1, var_rank(i)
+                        index(d) = index(d) + start(d) - 1
+8                   continue
+                    expect(j) = hash4(var_type(i), var_rank(i), index, 
+     +                                NFT_INT2)
+                    if (inRange3(expect(j),var_type(i), 
+     +                           NFT_INT2)) then
+                        allInIntRange = 
+     +                      allInIntRange .and.
+     +                      in_internal_range(NFT_INT2, expect(j))
+                    else
+                        allInExtRange = .false.
+                    end if
+7               continue
+                err = nf_get_vara_int2(ncid, i, start,
+     +                          edge, value)
+                if (canConvert) then
+                    if (allInExtRange) then
+                        if (allInIntRange) then
+                            if (err .ne. 0)
+     +                          call errore('nf_get_vara_int2:', err)
+                        else
+                            if (err .ne. NF_ERANGE)
+     +                          call errore('Range error: ', err)
+                        end if
+                    else
+                        if (err .ne. 0 .and. err .ne. NF_ERANGE)
+     +                      call errore('OK or Range error: ', err)
+                    end if
+                    do 9, j = 1, nels
+                        if (inRange3(expect(j),var_type(i),
+     +                               NFT_INT2) .and.
+     +                      in_internal_range(NFT_INT2, expect(j)))
+     +                          then
+                            val = value(j)
+                            if (.not.equal(val,expect(j),
+     +                                     var_type(i),NFT_INT2)) 
+     +                              then
+                                call error(
+     +                              'value read not that expected')
+                                if (verbose) then
+                                    call error(' ')
+                                    call errori('varid: ', i)
+                                    call errorc('var_name: ',
+     +                                  var_name(i))
+                                    call errori('element number: %d ', 
+     +                                          j)
+                                    call errord('expect: ', expect(j))
+                                    call errord('got: ', val)
+                                end if
+                            else
+                                nok = nok + 1
+                            end if
+                        end if
+9                   continue
+                else
+                    if (nels .gt. 0  .and. err .ne. NF_ECHAR)
+     +                  call errore('wrong type: ', err)
+                end if
+5           continue
+1       continue
+        err = nf_close(ncid)
+        if (err .ne. 0)
+     +      call errorc('nf_close: ', nf_strerror(err))
+        call print_nok(nok)
+        end
+
+#endif
+        subroutine test_nf_get_vara_int()
+        implicit        none
+#include "tests.inc"
+        integer ncid
+        integer d
+        integer i
+        integer j
+        integer k
+        integer err
+        logical allInExtRange   
+        logical allInIntRange   
+        integer nels
+        integer nslabs
+        integer nok      
+        integer start(MAX_RANK)
+        integer edge(MAX_RANK)
+        integer index(MAX_RANK)
+        integer mid(MAX_RANK)
+        logical canConvert     
+        integer    value(MAX_NELS)
+        doubleprecision expect(MAX_NELS)
+        doubleprecision val
+        integer udshift
+
+        nok = 0
+
+        err = nf_open(testfile, NF_NOWRITE, ncid)
+        if (err .ne. 0)
+     +      call errore('nf_open: ', err)
+        do 1, i = 1, NVARS
+            canConvert = (var_type(i) .eq. NF_CHAR) .eqv. 
+     +                   (NFT_INT .eq. NFT_TEXT)
+            if (.not.(var_rank(i) .le. MAX_RANK)) stop 2
+            if (.not.(var_nels(i) .le. MAX_NELS)) stop 2
+            do 2, j = 1, var_rank(i)
+                start(j) = 1
+                edge(j) = 1
+2           continue
+            err = nf_get_vara_int(BAD_ID, i, start,
+     +                  edge, value)
+            if (err .ne. NF_EBADID)
+     +          call errore('bad ncid: ', err)
+            err = nf_get_vara_int(ncid, BAD_VARID, start, 
+     +                           edge, value)
+            if (err .ne. NF_ENOTVAR)
+     +          call errore('bad var id: ', err)
+            do 3, j = 1, var_rank(i)
+                start(j) = var_shape(j,i) + 1
+                err = nf_get_vara_int(ncid, i, start,
+     +                               edge, value)
+                if (canConvert .and. err .ne. NF_EINVALCOORDS)
+     +              call errore('bad index: ', err)
+                start(j) = 1
+                edge(j) = var_shape(j,i) + 1
+                err = nf_get_vara_int(ncid, i, start,
+     +                               edge, value)
+                if (canConvert .and. err .ne. NF_EEDGE)
+     +              call errore('bad edge: ', err)
+                edge(j) = 1
+3           continue
+
+C           /* Check non-scalars for correct error returned even when */
+C           /* there is nothing to get (edge(j).eq.0) */
+            if (var_rank(i) .gt. 0) then
+                do 10, j = 1, var_rank(i)
+                    edge(j) = 0
+10              continue
+                err = nf_get_vara_int(BAD_ID, i, start,
+     +                  edge, value)
+                if (err .ne. NF_EBADID) 
+     +              call errore('bad ncid: ', err)
+                err = nf_get_vara_int(ncid, BAD_VARID,
+     +                  start, edge, value)
+                if (err .ne. NF_ENOTVAR) 
+     +              call errore('bad var id: ', err)
+                do 11, j = 1, var_rank(i)
+                    if (var_dimid(j,i) .gt. 1) then     !/* skip record dim */
+                        start(j) = var_shape(j,i) + 1
+                        err = nf_get_vara_int(ncid, i,
+     +                          start, edge, value)
+                        if (canConvert .and. err .ne. NF_EINVALCOORDS)
+     +                      call errore('bad start: ', err)
+                        start(j) = 1
+                    endif
+11              continue
+                err = nf_get_vara_int(ncid, i, start,
+     +                          edge, value)
+                if (canConvert) then
+                    if (err .ne. 0) 
+     +                  call error(nf_strerror(err))
+                else
+                    if (err .ne. NF_ECHAR)
+     +                  call errore('wrong type: ', err)
+                endif
+                do 12, j = 1, var_rank(i)
+                    edge(j) = 1
+12              continue
+            endif
+
+C           Choose a random point dividing each dim into 2 parts
+C           get 2^rank (nslabs) slabs so defined
+            nslabs = 1
+            do 4, j = 1, var_rank(i)
+                mid(j) = roll( var_shape(j,i) )
+                nslabs = nslabs * 2
+4           continue
+C           bits of k determine whether to get lower or upper part of dim 
+            do 5, k = 1, nslabs
+                nels = 1
+                do 6, j = 1, var_rank(i)
+                    if (mod(udshift((k-1), -(j-1)), 2) .eq. 1) then
+                        start(j) = 1
+                        edge(j) = mid(j)
+                    else
+                        start(j) = 1 + mid(j)
+                        edge(j) = var_shape(j,i) - mid(j)
+                    end if
+                    nels = nels * edge(j)
+6               continue
+                allInIntRange = .true.
+                allInExtRange = .true.
+                do 7, j = 1, nels
+                    err = index2indexes(j, var_rank(i), edge, index)
+                    if (err .ne. 0)
+     +                  call error('error in index2indexes 1')
+                    do 8, d = 1, var_rank(i)
+                        index(d) = index(d) + start(d) - 1
+8                   continue
+                    expect(j) = hash4(var_type(i), var_rank(i), index, 
+     +                                NFT_INT)
+                    if (inRange3(expect(j),var_type(i), 
+     +                           NFT_INT)) then
+                        allInIntRange = 
+     +                      allInIntRange .and.
+     +                      in_internal_range(NFT_INT, expect(j))
+                    else
+                        allInExtRange = .false.
+                    end if
+7               continue
+                err = nf_get_vara_int(ncid, i, start,
+     +                          edge, value)
+                if (canConvert) then
+                    if (allInExtRange) then
+                        if (allInIntRange) then
+                            if (err .ne. 0)
+     +                          call errore('nf_get_vara_int:', err)
+                        else
+                            if (err .ne. NF_ERANGE)
+     +                          call errore('Range error: ', err)
+                        end if
+                    else
+                        if (err .ne. 0 .and. err .ne. NF_ERANGE)
+     +                      call errore('OK or Range error: ', err)
+                    end if
+                    do 9, j = 1, nels
+                        if (inRange3(expect(j),var_type(i),
+     +                               NFT_INT) .and.
+     +                      in_internal_range(NFT_INT, expect(j)))
+     +                          then
+                            val = value(j)
+                            if (.not.equal(val,expect(j),
+     +                                     var_type(i),NFT_INT)) 
+     +                              then
+                                call error(
+     +                              'value read not that expected')
+                                if (verbose) then
+                                    call error(' ')
+                                    call errori('varid: ', i)
+                                    call errorc('var_name: ',
+     +                                  var_name(i))
+                                    call errori('element number: %d ', 
+     +                                          j)
+                                    call errord('expect: ', expect(j))
+                                    call errord('got: ', val)
+                                end if
+                            else
+                                nok = nok + 1
+                            end if
+                        end if
+9                   continue
+                else
+                    if (nels .gt. 0  .and. err .ne. NF_ECHAR)
+     +                  call errore('wrong type: ', err)
+                end if
+5           continue
+1       continue
+        err = nf_close(ncid)
+        if (err .ne. 0)
+     +      call errorc('nf_close: ', nf_strerror(err))
+        call print_nok(nok)
+        end
+
+        subroutine test_nf_get_vara_real()
+        implicit        none
+#include "tests.inc"
+        integer ncid
+        integer d
+        integer i
+        integer j
+        integer k
+        integer err
+        logical allInExtRange   
+        logical allInIntRange   
+        integer nels
+        integer nslabs
+        integer nok      
+        integer start(MAX_RANK)
+        integer edge(MAX_RANK)
+        integer index(MAX_RANK)
+        integer mid(MAX_RANK)
+        logical canConvert     
+        real    value(MAX_NELS)
+        doubleprecision expect(MAX_NELS)
+        doubleprecision val
+        integer udshift
+
+        nok = 0
+
+        err = nf_open(testfile, NF_NOWRITE, ncid)
+        if (err .ne. 0)
+     +      call errore('nf_open: ', err)
+        do 1, i = 1, NVARS
+            canConvert = (var_type(i) .eq. NF_CHAR) .eqv. 
+     +                   (NFT_REAL .eq. NFT_TEXT)
+            if (.not.(var_rank(i) .le. MAX_RANK)) stop 2
+            if (.not.(var_nels(i) .le. MAX_NELS)) stop 2
+            do 2, j = 1, var_rank(i)
+                start(j) = 1
+                edge(j) = 1
+2           continue
+            err = nf_get_vara_real(BAD_ID, i, start,
+     +                  edge, value)
+            if (err .ne. NF_EBADID)
+     +          call errore('bad ncid: ', err)
+            err = nf_get_vara_real(ncid, BAD_VARID, start, 
+     +                           edge, value)
+            if (err .ne. NF_ENOTVAR)
+     +          call errore('bad var id: ', err)
+            do 3, j = 1, var_rank(i)
+                start(j) = var_shape(j,i) + 1
+                err = nf_get_vara_real(ncid, i, start,
+     +                               edge, value)
+                if (canConvert .and. err .ne. NF_EINVALCOORDS)
+     +              call errore('bad index: ', err)
+                start(j) = 1
+                edge(j) = var_shape(j,i) + 1
+                err = nf_get_vara_real(ncid, i, start,
+     +                               edge, value)
+                if (canConvert .and. err .ne. NF_EEDGE)
+     +              call errore('bad edge: ', err)
+                edge(j) = 1
+3           continue
+
+C           /* Check non-scalars for correct error returned even when */
+C           /* there is nothing to get (edge(j).eq.0) */
+            if (var_rank(i) .gt. 0) then
+                do 10, j = 1, var_rank(i)
+                    edge(j) = 0
+10              continue
+                err = nf_get_vara_real(BAD_ID, i, start,
+     +                  edge, value)
+                if (err .ne. NF_EBADID) 
+     +              call errore('bad ncid: ', err)
+                err = nf_get_vara_real(ncid, BAD_VARID,
+     +                  start, edge, value)
+                if (err .ne. NF_ENOTVAR) 
+     +              call errore('bad var id: ', err)
+                do 11, j = 1, var_rank(i)
+                    if (var_dimid(j,i) .gt. 1) then     !/* skip record dim */
+                        start(j) = var_shape(j,i) + 1
+                        err = nf_get_vara_real(ncid, i,
+     +                          start, edge, value)
+                        if (canConvert .and. err .ne. NF_EINVALCOORDS)
+     +                      call errore('bad start: ', err)
+                        start(j) = 1
+                    endif
+11              continue
+                err = nf_get_vara_real(ncid, i, start,
+     +                          edge, value)
+                if (canConvert) then
+                    if (err .ne. 0) 
+     +                  call error(nf_strerror(err))
+                else
+                    if (err .ne. NF_ECHAR)
+     +                  call errore('wrong type: ', err)
+                endif
+                do 12, j = 1, var_rank(i)
+                    edge(j) = 1
+12              continue
+            endif
+
+C           Choose a random point dividing each dim into 2 parts
+C           get 2^rank (nslabs) slabs so defined
+            nslabs = 1
+            do 4, j = 1, var_rank(i)
+                mid(j) = roll( var_shape(j,i) )
+                nslabs = nslabs * 2
+4           continue
+C           bits of k determine whether to get lower or upper part of dim 
+            do 5, k = 1, nslabs
+                nels = 1
+                do 6, j = 1, var_rank(i)
+                    if (mod(udshift((k-1), -(j-1)), 2) .eq. 1) then
+                        start(j) = 1
+                        edge(j) = mid(j)
+                    else
+                        start(j) = 1 + mid(j)
+                        edge(j) = var_shape(j,i) - mid(j)
+                    end if
+                    nels = nels * edge(j)
+6               continue
+                allInIntRange = .true.
+                allInExtRange = .true.
+                do 7, j = 1, nels
+                    err = index2indexes(j, var_rank(i), edge, index)
+                    if (err .ne. 0)
+     +                  call error('error in index2indexes 1')
+                    do 8, d = 1, var_rank(i)
+                        index(d) = index(d) + start(d) - 1
+8                   continue
+                    expect(j) = hash4(var_type(i), var_rank(i), index, 
+     +                                NFT_REAL)
+                    if (inRange3(expect(j),var_type(i), 
+     +                           NFT_REAL)) then
+                        allInIntRange = 
+     +                      allInIntRange .and.
+     +                      in_internal_range(NFT_REAL, expect(j))
+                    else
+                        allInExtRange = .false.
+                    end if
+7               continue
+                err = nf_get_vara_real(ncid, i, start,
+     +                          edge, value)
+                if (canConvert) then
+                    if (allInExtRange) then
+                        if (allInIntRange) then
+                            if (err .ne. 0)
+     +                          call errore('nf_get_vara_real:', err)
+                        else
+                            if (err .ne. NF_ERANGE)
+     +                          call errore('Range error: ', err)
+                        end if
+                    else
+                        if (err .ne. 0 .and. err .ne. NF_ERANGE)
+     +                      call errore('OK or Range error: ', err)
+                    end if
+                    do 9, j = 1, nels
+                        if (inRange3(expect(j),var_type(i),
+     +                               NFT_REAL) .and.
+     +                      in_internal_range(NFT_REAL, expect(j)))
+     +                          then
+                            val = value(j)
+                            if (.not.equal(val,expect(j),
+     +                                     var_type(i),NFT_REAL)) 
+     +                              then
+                                call error(
+     +                              'value read not that expected')
+                                if (verbose) then
+                                    call error(' ')
+                                    call errori('varid: ', i)
+                                    call errorc('var_name: ',
+     +                                  var_name(i))
+                                    call errori('element number: %d ', 
+     +                                          j)
+                                    call errord('expect: ', expect(j))
+                                    call errord('got: ', val)
+                                end if
+                            else
+                                nok = nok + 1
+                            end if
+                        end if
+9                   continue
+                else
+                    if (nels .gt. 0  .and. err .ne. NF_ECHAR)
+     +                  call errore('wrong type: ', err)
+                end if
+5           continue
+1       continue
+        err = nf_close(ncid)
+        if (err .ne. 0)
+     +      call errorc('nf_close: ', nf_strerror(err))
+        call print_nok(nok)
+        end
+
+        subroutine test_nf_get_vara_double()
+        implicit        none
+#include "tests.inc"
+        integer ncid
+        integer d
+        integer i
+        integer j
+        integer k
+        integer err
+        logical allInExtRange   
+        logical allInIntRange   
+        integer nels
+        integer nslabs
+        integer nok      
+        integer start(MAX_RANK)
+        integer edge(MAX_RANK)
+        integer index(MAX_RANK)
+        integer mid(MAX_RANK)
+        logical canConvert     
+        doubleprecision    value(MAX_NELS)
+        doubleprecision expect(MAX_NELS)
+        doubleprecision val
+        integer udshift
+
+        nok = 0
+
+        err = nf_open(testfile, NF_NOWRITE, ncid)
+        if (err .ne. 0)
+     +      call errore('nf_open: ', err)
+        do 1, i = 1, NVARS
+            canConvert = (var_type(i) .eq. NF_CHAR) .eqv. 
+     +                   (NFT_DOUBLE .eq. NFT_TEXT)
+            if (.not.(var_rank(i) .le. MAX_RANK)) stop 2
+            if (.not.(var_nels(i) .le. MAX_NELS)) stop 2
+            do 2, j = 1, var_rank(i)
+                start(j) = 1
+                edge(j) = 1
+2           continue
+            err = nf_get_vara_double(BAD_ID, i, start,
+     +                  edge, value)
+            if (err .ne. NF_EBADID)
+     +          call errore('bad ncid: ', err)
+            err = nf_get_vara_double(ncid, BAD_VARID, start, 
+     +                           edge, value)
+            if (err .ne. NF_ENOTVAR)
+     +          call errore('bad var id: ', err)
+            do 3, j = 1, var_rank(i)
+                start(j) = var_shape(j,i) + 1
+                err = nf_get_vara_double(ncid, i, start,
+     +                               edge, value)
+                if (canConvert .and. err .ne. NF_EINVALCOORDS)
+     +              call errore('bad index: ', err)
+                start(j) = 1
+                edge(j) = var_shape(j,i) + 1
+                err = nf_get_vara_double(ncid, i, start,
+     +                               edge, value)
+                if (canConvert .and. err .ne. NF_EEDGE)
+     +              call errore('bad edge: ', err)
+                edge(j) = 1
+3           continue
+
+C           /* Check non-scalars for correct error returned even when */
+C           /* there is nothing to get (edge(j).eq.0) */
+            if (var_rank(i) .gt. 0) then
+                do 10, j = 1, var_rank(i)
+                    edge(j) = 0
+10              continue
+                err = nf_get_vara_double(BAD_ID, i, start,
+     +                  edge, value)
+                if (err .ne. NF_EBADID) 
+     +              call errore('bad ncid: ', err)
+                err = nf_get_vara_double(ncid, BAD_VARID,
+     +                  start, edge, value)
+                if (err .ne. NF_ENOTVAR) 
+     +              call errore('bad var id: ', err)
+                do 11, j = 1, var_rank(i)
+                    if (var_dimid(j,i) .gt. 1) then     !/* skip record dim */
+                        start(j) = var_shape(j,i) + 1
+                        err = nf_get_vara_double(ncid, i,
+     +                          start, edge, value)
+                        if (canConvert .and. err .ne. NF_EINVALCOORDS)
+     +                      call errore('bad start: ', err)
+                        start(j) = 1
+                    endif
+11              continue
+                err = nf_get_vara_double(ncid, i, start,
+     +                          edge, value)
+                if (canConvert) then
+                    if (err .ne. 0) 
+     +                  call error(nf_strerror(err))
+                else
+                    if (err .ne. NF_ECHAR)
+     +                  call errore('wrong type: ', err)
+                endif
+                do 12, j = 1, var_rank(i)
+                    edge(j) = 1
+12              continue
+            endif
+
+C           Choose a random point dividing each dim into 2 parts
+C           get 2^rank (nslabs) slabs so defined
+            nslabs = 1
+            do 4, j = 1, var_rank(i)
+                mid(j) = roll( var_shape(j,i) )
+                nslabs = nslabs * 2
+4           continue
+C           bits of k determine whether to get lower or upper part of dim 
+            do 5, k = 1, nslabs
+                nels = 1
+                do 6, j = 1, var_rank(i)
+                    if (mod(udshift((k-1), -(j-1)), 2) .eq. 1) then
+                        start(j) = 1
+                        edge(j) = mid(j)
+                    else
+                        start(j) = 1 + mid(j)
+                        edge(j) = var_shape(j,i) - mid(j)
+                    end if
+                    nels = nels * edge(j)
+6               continue
+                allInIntRange = .true.
+                allInExtRange = .true.
+                do 7, j = 1, nels
+                    err = index2indexes(j, var_rank(i), edge, index)
+                    if (err .ne. 0)
+     +                  call error('error in index2indexes 1')
+                    do 8, d = 1, var_rank(i)
+                        index(d) = index(d) + start(d) - 1
+8                   continue
+                    expect(j) = hash4(var_type(i), var_rank(i), index, 
+     +                                NFT_DOUBLE)
+                    if (inRange3(expect(j),var_type(i), 
+     +                           NFT_DOUBLE)) then
+                        allInIntRange = 
+     +                      allInIntRange .and.
+     +                      in_internal_range(NFT_DOUBLE, expect(j))
+                    else
+                        allInExtRange = .false.
+                    end if
+7               continue
+                err = nf_get_vara_double(ncid, i, start,
+     +                          edge, value)
+                if (canConvert) then
+                    if (allInExtRange) then
+                        if (allInIntRange) then
+                            if (err .ne. 0)
+     +                          call errore('nf_get_vara_double:', err)
+                        else
+                            if (err .ne. NF_ERANGE)
+     +                          call errore('Range error: ', err)
+                        end if
+                    else
+                        if (err .ne. 0 .and. err .ne. NF_ERANGE)
+     +                      call errore('OK or Range error: ', err)
+                    end if
+                    do 9, j = 1, nels
+                        if (inRange3(expect(j),var_type(i),
+     +                               NFT_DOUBLE) .and.
+     +                      in_internal_range(NFT_DOUBLE, expect(j)))
+     +                          then
+                            val = value(j)
+                            if (.not.equal(val,expect(j),
+     +                                     var_type(i),NFT_DOUBLE)) 
+     +                              then
+                                call error(
+     +                              'value read not that expected')
+                                if (verbose) then
+                                    call error(' ')
+                                    call errori('varid: ', i)
+                                    call errorc('var_name: ',
+     +                                  var_name(i))
+                                    call errori('element number: %d ', 
+     +                                          j)
+                                    call errord('expect: ', expect(j))
+                                    call errord('got: ', val)
+                                end if
+                            else
+                                nok = nok + 1
+                            end if
+                        end if
+9                   continue
+                else
+                    if (nels .gt. 0  .and. err .ne. NF_ECHAR)
+     +                  call errore('wrong type: ', err)
+                end if
+5           continue
+1       continue
+        err = nf_close(ncid)
+        if (err .ne. 0)
+     +      call errorc('nf_close: ', nf_strerror(err))
+        call print_nok(nok)
+        end
+
+
+        subroutine test_nf_get_vars_text()
+        implicit        none
+#include "tests.inc"
+        integer ncid
+        integer d
+        integer i
+        integer j
+        integer k
+        integer m
+        integer err
+        logical allInExtRange   
+        logical allInIntRange   
+        integer nels
+        integer nslabs
+        integer nstarts         
+        integer nok             
+        integer start(MAX_RANK)
+        integer edge(MAX_RANK)
+        integer index(MAX_RANK)
+        integer index2(MAX_RANK)
+        integer mid(MAX_RANK)
+        integer count(MAX_RANK)
+        integer sstride(MAX_RANK)
+        integer stride(MAX_RANK)
+        logical canConvert     
+        character    value(MAX_NELS)
+        doubleprecision expect(MAX_NELS)
+        doubleprecision val
+        integer udshift
+
+        nok = 0
+
+        err = nf_open(testfile, NF_NOWRITE, ncid)
+        if (err .ne. 0)
+     +      call errore('nf_open: ', err)
+        do 1, i = 1, NVARS
+            canConvert = (var_type(i) .eq. NF_CHAR) .eqv. 
+     +                   (NFT_TEXT .eq. NFT_TEXT)
+            if (.not.(var_rank(i) .le. MAX_RANK)) stop 2
+            if (.not.(var_nels(i) .le. MAX_NELS)) stop 2
+            do 2, j = 1, var_rank(i)
+                start(j) = 1
+                edge(j) = 1
+                stride(j) = 1
+2           continue
+            err = nf_get_vars_text(BAD_ID, i, start,
+     +                  edge, stride, value)
+            if (err .ne. NF_EBADID)
+     +          call errore('bad ncid: ', err)
+            err = nf_get_vars_text(ncid, BAD_VARID,
+     +                  start, edge, stride, 
+     +                           value)
+            if (err .ne. NF_ENOTVAR)
+     +          call errore('bad var id: ', err)
+            do 3, j = 1, var_rank(i)
+                start(j) = var_shape(j,i) + 1
+                err = nf_get_vars_text(ncid, i, start,
+     +                               edge, stride, 
+     +                               value)
+                if (.not. canConvert) then
+                    if (err .ne. NF_ECHAR)
+     +                  call errore('conversion: ', err)
+                else
+                    if (err .ne. NF_EINVALCOORDS)
+     +                  call errore('bad index: ', err)
+                endif
+                start(j) = 1
+                edge(j) = var_shape(j,i) + 1
+                err = nf_get_vars_text(ncid, i, start,
+     +                               edge, stride, 
+     +                               value)
+                if (.not. canConvert) then
+                    if (err .ne. NF_ECHAR)
+     +                  call errore('conversion: ', err)
+                else
+                    if (err .ne. NF_EEDGE)
+     +                  call errore('bad edge: ', err)
+                endif
+                edge(j) = 1
+                stride(j) = 0
+                err = nf_get_vars_text(ncid, i, start,
+     +                               edge, stride, 
+     +                               value)
+                if (.not. canConvert) then
+                    if (err .ne. NF_ECHAR)
+     +                  call errore('conversion: ', err)
+                else
+                    if (err .ne. NF_ESTRIDE)
+     +                  call errore('bad stride: ', err)
+                endif
+                stride(j) = 1
+3           continue
+C               Choose a random point dividing each dim into 2 parts
+C               get 2^rank (nslabs) slabs so defined
+            nslabs = 1
+            do 4, j = 1, var_rank(i)
+                mid(j) = roll( var_shape(j,i) )
+                nslabs = nslabs * 2
+4           continue
+C               bits of k determine whether to get lower or upper part of dim
+C               choose random stride from 1 to edge
+            do 5, k = 1, nslabs
+                nstarts = 1
+                do 6, j = 1, var_rank(i)
+                    if (mod(udshift(k-1, j-1), 2) .eq. 1) then
+                        start(j) = 1
+                        edge(j) = mid(j)
+                    else
+                        start(j) = 1 + mid(j)
+                        edge(j) = var_shape(j,i) - mid(j)
+                    end if
+                    if (edge(j) .gt. 0) then
+                        sstride(j) = 1 + roll(edge(j))
+                    else
+                        sstride(j) = 1
+                    end if
+                    nstarts = nstarts * stride(j)
+6               continue
+                do 7, m = 1, nstarts
+                    err = index2indexes(m, var_rank(i), sstride, 
+     +                                  index)
+                    if (err .ne. 0)
+     +                  call error('error in index2indexes')
+                    nels = 1
+                    do 8, j = 1, var_rank(i)
+                        count(j) = 1 + (edge(j) - index(j)) / 
+     +                                  stride(j)
+                        nels = nels * count(j)
+                        index(j) = index(j) + start(j) - 1
+8                   continue
+C                           Random choice of forward or backward 
+C    /* TODO
+C                   if ( roll(2) ) then
+C                       for (j = 0 j < var_rank(i) j++) {
+C                           index(j) += (count(j) - 1) * stride(j)
+C                           stride(j) = -stride(j)
+C                       }
+C                   end if
+C    */
+                    allInIntRange = .true.
+                    allInExtRange = .true.
+                    do 9, j = 1, nels
+                        err = index2indexes(j, var_rank(i), count, 
+     +                                      index2)
+                        if (err .ne. 0)
+     +                      call error('error in index2indexes() 1')
+                        do 10, d = 1, var_rank(i)
+                            index2(d) = index(d) + (index2(d)-1) * 
+     +                                  stride(d)
+10                      continue
+                        expect(j) = hash4(var_type(i), var_rank(i), 
+     +                                    index2, NFT_TEXT)
+                        if (inRange3(expect(j),var_type(i),
+     +                               NFT_TEXT)) then
+                            allInIntRange = 
+     +                          allInIntRange .and.
+     +                          in_internal_range(NFT_TEXT, 
+     +                                            expect(j))
+                        else
+                            allInExtRange = .false.
+                        end if
+9                   continue
+                    err = nf_get_vars_text(ncid, i, index,
+     +                                   count, stride,
+     +                                   value)
+                    if (canConvert) then
+                        if (allInExtRange) then
+                            if (allInIntRange) then
+                                if (err .ne. 0)
+     +                              call error(nf_strerror(err))
+                            else
+                                if (err .ne. NF_ERANGE)
+     +                              call errore('Range error: ', err)
+                            end if
+                        else
+                            if (err .ne. 0 .and. err .ne. NF_ERANGE)
+     +                          call errore('OK or Range error: ', err)
+                        end if
+                        do 11, j = 1, nels
+                            if (inRange3(expect(j),var_type(i),
+     +                          NFT_TEXT) .and.
+     +                          in_internal_range(NFT_TEXT, 
+     +                                            expect(j))) then
+                                val = ichar(value(j))
+                                if (.not.equal(val, expect(j),
+     +                              var_type(i), NFT_TEXT)) then
+                                    call error(
+     +                                  'value read not that expected')
+                                    if (verbose) then
+                                        call error(' ')
+                                        call errori('varid: ', i)
+                                        call errorc('var_name: ', 
+     +                                              var_name(i))
+                                        call errori('element number: ',
+     +                                              j)
+                                        call errord('expect: ', 
+     +                                              expect(j))
+                                        call errord('got: ', val)
+                                    end if
+                                else
+                                    nok = nok + 1
+                                end if
+                            end if
+11                      continue
+                    else
+                        if (nels .gt. 0 .and. err .ne. NF_ECHAR)
+     +                      call errore('wrong type: ', err)
+                    end if
+7               continue
+5           continue
+
+1       continue
+        err = nf_close(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_close: ', err)
+        call print_nok(nok)
+        end
+
+#ifdef NF_INT1_T
+        subroutine test_nf_get_vars_int1()
+        implicit        none
+#include "tests.inc"
+        integer ncid
+        integer d
+        integer i
+        integer j
+        integer k
+        integer m
+        integer err
+        logical allInExtRange   
+        logical allInIntRange   
+        integer nels
+        integer nslabs
+        integer nstarts         
+        integer nok             
+        integer start(MAX_RANK)
+        integer edge(MAX_RANK)
+        integer index(MAX_RANK)
+        integer index2(MAX_RANK)
+        integer mid(MAX_RANK)
+        integer count(MAX_RANK)
+        integer sstride(MAX_RANK)
+        integer stride(MAX_RANK)
+        logical canConvert     
+        NF_INT1_T    value(MAX_NELS)
+        doubleprecision expect(MAX_NELS)
+        doubleprecision val
+        integer udshift
+
+        nok = 0
+
+        err = nf_open(testfile, NF_NOWRITE, ncid)
+        if (err .ne. 0)
+     +      call errore('nf_open: ', err)
+        do 1, i = 1, NVARS
+            canConvert = (var_type(i) .eq. NF_CHAR) .eqv. 
+     +                   (NFT_INT1 .eq. NFT_TEXT)
+            if (.not.(var_rank(i) .le. MAX_RANK)) stop 2
+            if (.not.(var_nels(i) .le. MAX_NELS)) stop 2
+            do 2, j = 1, var_rank(i)
+                start(j) = 1
+                edge(j) = 1
+                stride(j) = 1
+2           continue
+            err = nf_get_vars_int1(BAD_ID, i, start,
+     +                  edge, stride, value)
+            if (err .ne. NF_EBADID)
+     +          call errore('bad ncid: ', err)
+            err = nf_get_vars_int1(ncid, BAD_VARID,
+     +                  start, edge, stride, 
+     +                           value)
+            if (err .ne. NF_ENOTVAR)
+     +          call errore('bad var id: ', err)
+            do 3, j = 1, var_rank(i)
+                start(j) = var_shape(j,i) + 1
+                err = nf_get_vars_int1(ncid, i, start,
+     +                               edge, stride, 
+     +                               value)
+                if (.not. canConvert) then
+                    if (err .ne. NF_ECHAR)
+     +                  call errore('conversion: ', err)
+                else
+                    if (err .ne. NF_EINVALCOORDS)
+     +                  call errore('bad index: ', err)
+                endif
+                start(j) = 1
+                edge(j) = var_shape(j,i) + 1
+                err = nf_get_vars_int1(ncid, i, start,
+     +                               edge, stride, 
+     +                               value)
+                if (.not. canConvert) then
+                    if (err .ne. NF_ECHAR)
+     +                  call errore('conversion: ', err)
+                else
+                    if (err .ne. NF_EEDGE)
+     +                  call errore('bad edge: ', err)
+                endif
+                edge(j) = 1
+                stride(j) = 0
+                err = nf_get_vars_int1(ncid, i, start,
+     +                               edge, stride, 
+     +                               value)
+                if (.not. canConvert) then
+                    if (err .ne. NF_ECHAR)
+     +                  call errore('conversion: ', err)
+                else
+                    if (err .ne. NF_ESTRIDE)
+     +                  call errore('bad stride: ', err)
+                endif
+                stride(j) = 1
+3           continue
+C               Choose a random point dividing each dim into 2 parts
+C               get 2^rank (nslabs) slabs so defined
+            nslabs = 1
+            do 4, j = 1, var_rank(i)
+                mid(j) = roll( var_shape(j,i) )
+                nslabs = nslabs * 2
+4           continue
+C               bits of k determine whether to get lower or upper part of dim
+C               choose random stride from 1 to edge
+            do 5, k = 1, nslabs
+                nstarts = 1
+                do 6, j = 1, var_rank(i)
+                    if (mod(udshift(k-1, j-1), 2) .eq. 1) then
+                        start(j) = 1
+                        edge(j) = mid(j)
+                    else
+                        start(j) = 1 + mid(j)
+                        edge(j) = var_shape(j,i) - mid(j)
+                    end if
+                    if (edge(j) .gt. 0) then
+                        sstride(j) = 1 + roll(edge(j))
+                    else
+                        sstride(j) = 1
+                    end if
+                    nstarts = nstarts * stride(j)
+6               continue
+                do 7, m = 1, nstarts
+                    err = index2indexes(m, var_rank(i), sstride, 
+     +                                  index)
+                    if (err .ne. 0)
+     +                  call error('error in index2indexes')
+                    nels = 1
+                    do 8, j = 1, var_rank(i)
+                        count(j) = 1 + (edge(j) - index(j)) / 
+     +                                  stride(j)
+                        nels = nels * count(j)
+                        index(j) = index(j) + start(j) - 1
+8                   continue
+C                           Random choice of forward or backward 
+C    /* TODO
+C                   if ( roll(2) ) then
+C                       for (j = 0 j < var_rank(i) j++) {
+C                           index(j) += (count(j) - 1) * stride(j)
+C                           stride(j) = -stride(j)
+C                       }
+C                   end if
+C    */
+                    allInIntRange = .true.
+                    allInExtRange = .true.
+                    do 9, j = 1, nels
+                        err = index2indexes(j, var_rank(i), count, 
+     +                                      index2)
+                        if (err .ne. 0)
+     +                      call error('error in index2indexes() 1')
+                        do 10, d = 1, var_rank(i)
+                            index2(d) = index(d) + (index2(d)-1) * 
+     +                                  stride(d)
+10                      continue
+                        expect(j) = hash4(var_type(i), var_rank(i), 
+     +                                    index2, NFT_INT1)
+                        if (inRange3(expect(j),var_type(i),
+     +                               NFT_INT1)) then
+                            allInIntRange = 
+     +                          allInIntRange .and.
+     +                          in_internal_range(NFT_INT1, 
+     +                                            expect(j))
+                        else
+                            allInExtRange = .false.
+                        end if
+9                   continue
+                    err = nf_get_vars_int1(ncid, i, index,
+     +                                   count, stride,
+     +                                   value)
+                    if (canConvert) then
+                        if (allInExtRange) then
+                            if (allInIntRange) then
+                                if (err .ne. 0)
+     +                              call error(nf_strerror(err))
+                            else
+                                if (err .ne. NF_ERANGE)
+     +                              call errore('Range error: ', err)
+                            end if
+                        else
+                            if (err .ne. 0 .and. err .ne. NF_ERANGE)
+     +                          call errore('OK or Range error: ', err)
+                        end if
+                        do 11, j = 1, nels
+                            if (inRange3(expect(j),var_type(i),
+     +                          NFT_INT1) .and.
+     +                          in_internal_range(NFT_INT1, 
+     +                                            expect(j))) then
+                                val = value(j)
+                                if (.not.equal(val, expect(j),
+     +                              var_type(i), NFT_INT1)) then
+                                    call error(
+     +                                  'value read not that expected')
+                                    if (verbose) then
+                                        call error(' ')
+                                        call errori('varid: ', i)
+                                        call errorc('var_name: ', 
+     +                                              var_name(i))
+                                        call errori('element number: ',
+     +                                              j)
+                                        call errord('expect: ', 
+     +                                              expect(j))
+                                        call errord('got: ', val)
+                                    end if
+                                else
+                                    nok = nok + 1
+                                end if
+                            end if
+11                      continue
+                    else
+                        if (nels .gt. 0 .and. err .ne. NF_ECHAR)
+     +                      call errore('wrong type: ', err)
+                    end if
+7               continue
+5           continue
+
+1       continue
+        err = nf_close(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_close: ', err)
+        call print_nok(nok)
+        end
+
+#endif
+#ifdef NF_INT2_T
+        subroutine test_nf_get_vars_int2()
+        implicit        none
+#include "tests.inc"
+        integer ncid
+        integer d
+        integer i
+        integer j
+        integer k
+        integer m
+        integer err
+        logical allInExtRange   
+        logical allInIntRange   
+        integer nels
+        integer nslabs
+        integer nstarts         
+        integer nok             
+        integer start(MAX_RANK)
+        integer edge(MAX_RANK)
+        integer index(MAX_RANK)
+        integer index2(MAX_RANK)
+        integer mid(MAX_RANK)
+        integer count(MAX_RANK)
+        integer sstride(MAX_RANK)
+        integer stride(MAX_RANK)
+        logical canConvert     
+        NF_INT2_T    value(MAX_NELS)
+        doubleprecision expect(MAX_NELS)
+        doubleprecision val
+        integer udshift
+
+        nok = 0
+
+        err = nf_open(testfile, NF_NOWRITE, ncid)
+        if (err .ne. 0)
+     +      call errore('nf_open: ', err)
+        do 1, i = 1, NVARS
+            canConvert = (var_type(i) .eq. NF_CHAR) .eqv. 
+     +                   (NFT_INT2 .eq. NFT_TEXT)
+            if (.not.(var_rank(i) .le. MAX_RANK)) stop 2
+            if (.not.(var_nels(i) .le. MAX_NELS)) stop 2
+            do 2, j = 1, var_rank(i)
+                start(j) = 1
+                edge(j) = 1
+                stride(j) = 1
+2           continue
+            err = nf_get_vars_int2(BAD_ID, i, start,
+     +                  edge, stride, value)
+            if (err .ne. NF_EBADID)
+     +          call errore('bad ncid: ', err)
+            err = nf_get_vars_int2(ncid, BAD_VARID,
+     +                  start, edge, stride, 
+     +                           value)
+            if (err .ne. NF_ENOTVAR)
+     +          call errore('bad var id: ', err)
+            do 3, j = 1, var_rank(i)
+                start(j) = var_shape(j,i) + 1
+                err = nf_get_vars_int2(ncid, i, start,
+     +                               edge, stride, 
+     +                               value)
+                if (.not. canConvert) then
+                    if (err .ne. NF_ECHAR)
+     +                  call errore('conversion: ', err)
+                else
+                    if (err .ne. NF_EINVALCOORDS)
+     +                  call errore('bad index: ', err)
+                endif
+                start(j) = 1
+                edge(j) = var_shape(j,i) + 1
+                err = nf_get_vars_int2(ncid, i, start,
+     +                               edge, stride, 
+     +                               value)
+                if (.not. canConvert) then
+                    if (err .ne. NF_ECHAR)
+     +                  call errore('conversion: ', err)
+                else
+                    if (err .ne. NF_EEDGE)
+     +                  call errore('bad edge: ', err)
+                endif
+                edge(j) = 1
+                stride(j) = 0
+                err = nf_get_vars_int2(ncid, i, start,
+     +                               edge, stride, 
+     +                               value)
+                if (.not. canConvert) then
+                    if (err .ne. NF_ECHAR)
+     +                  call errore('conversion: ', err)
+                else
+                    if (err .ne. NF_ESTRIDE)
+     +                  call errore('bad stride: ', err)
+                endif
+                stride(j) = 1
+3           continue
+C               Choose a random point dividing each dim into 2 parts
+C               get 2^rank (nslabs) slabs so defined
+            nslabs = 1
+            do 4, j = 1, var_rank(i)
+                mid(j) = roll( var_shape(j,i) )
+                nslabs = nslabs * 2
+4           continue
+C               bits of k determine whether to get lower or upper part of dim
+C               choose random stride from 1 to edge
+            do 5, k = 1, nslabs
+                nstarts = 1
+                do 6, j = 1, var_rank(i)
+                    if (mod(udshift(k-1, j-1), 2) .eq. 1) then
+                        start(j) = 1
+                        edge(j) = mid(j)
+                    else
+                        start(j) = 1 + mid(j)
+                        edge(j) = var_shape(j,i) - mid(j)
+                    end if
+                    if (edge(j) .gt. 0) then
+                        sstride(j) = 1 + roll(edge(j))
+                    else
+                        sstride(j) = 1
+                    end if
+                    nstarts = nstarts * stride(j)
+6               continue
+                do 7, m = 1, nstarts
+                    err = index2indexes(m, var_rank(i), sstride, 
+     +                                  index)
+                    if (err .ne. 0)
+     +                  call error('error in index2indexes')
+                    nels = 1
+                    do 8, j = 1, var_rank(i)
+                        count(j) = 1 + (edge(j) - index(j)) / 
+     +                                  stride(j)
+                        nels = nels * count(j)
+                        index(j) = index(j) + start(j) - 1
+8                   continue
+C                           Random choice of forward or backward 
+C    /* TODO
+C                   if ( roll(2) ) then
+C                       for (j = 0 j < var_rank(i) j++) {
+C                           index(j) += (count(j) - 1) * stride(j)
+C                           stride(j) = -stride(j)
+C                       }
+C                   end if
+C    */
+                    allInIntRange = .true.
+                    allInExtRange = .true.
+                    do 9, j = 1, nels
+                        err = index2indexes(j, var_rank(i), count, 
+     +                                      index2)
+                        if (err .ne. 0)
+     +                      call error('error in index2indexes() 1')
+                        do 10, d = 1, var_rank(i)
+                            index2(d) = index(d) + (index2(d)-1) * 
+     +                                  stride(d)
+10                      continue
+                        expect(j) = hash4(var_type(i), var_rank(i), 
+     +                                    index2, NFT_INT2)
+                        if (inRange3(expect(j),var_type(i),
+     +                               NFT_INT2)) then
+                            allInIntRange = 
+     +                          allInIntRange .and.
+     +                          in_internal_range(NFT_INT2, 
+     +                                            expect(j))
+                        else
+                            allInExtRange = .false.
+                        end if
+9                   continue
+                    err = nf_get_vars_int2(ncid, i, index,
+     +                                   count, stride,
+     +                                   value)
+                    if (canConvert) then
+                        if (allInExtRange) then
+                            if (allInIntRange) then
+                                if (err .ne. 0)
+     +                              call error(nf_strerror(err))
+                            else
+                                if (err .ne. NF_ERANGE)
+     +                              call errore('Range error: ', err)
+                            end if
+                        else
+                            if (err .ne. 0 .and. err .ne. NF_ERANGE)
+     +                          call errore('OK or Range error: ', err)
+                        end if
+                        do 11, j = 1, nels
+                            if (inRange3(expect(j),var_type(i),
+     +                          NFT_INT2) .and.
+     +                          in_internal_range(NFT_INT2, 
+     +                                            expect(j))) then
+                                val = value(j)
+                                if (.not.equal(val, expect(j),
+     +                              var_type(i), NFT_INT2)) then
+                                    call error(
+     +                                  'value read not that expected')
+                                    if (verbose) then
+                                        call error(' ')
+                                        call errori('varid: ', i)
+                                        call errorc('var_name: ', 
+     +                                              var_name(i))
+                                        call errori('element number: ',
+     +                                              j)
+                                        call errord('expect: ', 
+     +                                              expect(j))
+                                        call errord('got: ', val)
+                                    end if
+                                else
+                                    nok = nok + 1
+                                end if
+                            end if
+11                      continue
+                    else
+                        if (nels .gt. 0 .and. err .ne. NF_ECHAR)
+     +                      call errore('wrong type: ', err)
+                    end if
+7               continue
+5           continue
+
+1       continue
+        err = nf_close(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_close: ', err)
+        call print_nok(nok)
+        end
+
+#endif
+        subroutine test_nf_get_vars_int()
+        implicit        none
+#include "tests.inc"
+        integer ncid
+        integer d
+        integer i
+        integer j
+        integer k
+        integer m
+        integer err
+        logical allInExtRange   
+        logical allInIntRange   
+        integer nels
+        integer nslabs
+        integer nstarts         
+        integer nok             
+        integer start(MAX_RANK)
+        integer edge(MAX_RANK)
+        integer index(MAX_RANK)
+        integer index2(MAX_RANK)
+        integer mid(MAX_RANK)
+        integer count(MAX_RANK)
+        integer sstride(MAX_RANK)
+        integer stride(MAX_RANK)
+        logical canConvert     
+        integer    value(MAX_NELS)
+        doubleprecision expect(MAX_NELS)
+        doubleprecision val
+        integer udshift
+
+        nok = 0
+
+        err = nf_open(testfile, NF_NOWRITE, ncid)
+        if (err .ne. 0)
+     +      call errore('nf_open: ', err)
+        do 1, i = 1, NVARS
+            canConvert = (var_type(i) .eq. NF_CHAR) .eqv. 
+     +                   (NFT_INT .eq. NFT_TEXT)
+            if (.not.(var_rank(i) .le. MAX_RANK)) stop 2
+            if (.not.(var_nels(i) .le. MAX_NELS)) stop 2
+            do 2, j = 1, var_rank(i)
+                start(j) = 1
+                edge(j) = 1
+                stride(j) = 1
+2           continue
+            err = nf_get_vars_int(BAD_ID, i, start,
+     +                  edge, stride, value)
+            if (err .ne. NF_EBADID)
+     +          call errore('bad ncid: ', err)
+            err = nf_get_vars_int(ncid, BAD_VARID,
+     +                  start, edge, stride, 
+     +                           value)
+            if (err .ne. NF_ENOTVAR)
+     +          call errore('bad var id: ', err)
+            do 3, j = 1, var_rank(i)
+                start(j) = var_shape(j,i) + 1
+                err = nf_get_vars_int(ncid, i, start,
+     +                               edge, stride, 
+     +                               value)
+                if (.not. canConvert) then
+                    if (err .ne. NF_ECHAR)
+     +                  call errore('conversion: ', err)
+                else
+                    if (err .ne. NF_EINVALCOORDS)
+     +                  call errore('bad index: ', err)
+                endif
+                start(j) = 1
+                edge(j) = var_shape(j,i) + 1
+                err = nf_get_vars_int(ncid, i, start,
+     +                               edge, stride, 
+     +                               value)
+                if (.not. canConvert) then
+                    if (err .ne. NF_ECHAR)
+     +                  call errore('conversion: ', err)
+                else
+                    if (err .ne. NF_EEDGE)
+     +                  call errore('bad edge: ', err)
+                endif
+                edge(j) = 1
+                stride(j) = 0
+                err = nf_get_vars_int(ncid, i, start,
+     +                               edge, stride, 
+     +                               value)
+                if (.not. canConvert) then
+                    if (err .ne. NF_ECHAR)
+     +                  call errore('conversion: ', err)
+                else
+                    if (err .ne. NF_ESTRIDE)
+     +                  call errore('bad stride: ', err)
+                endif
+                stride(j) = 1
+3           continue
+C               Choose a random point dividing each dim into 2 parts
+C               get 2^rank (nslabs) slabs so defined
+            nslabs = 1
+            do 4, j = 1, var_rank(i)
+                mid(j) = roll( var_shape(j,i) )
+                nslabs = nslabs * 2
+4           continue
+C               bits of k determine whether to get lower or upper part of dim
+C               choose random stride from 1 to edge
+            do 5, k = 1, nslabs
+                nstarts = 1
+                do 6, j = 1, var_rank(i)
+                    if (mod(udshift(k-1, j-1), 2) .eq. 1) then
+                        start(j) = 1
+                        edge(j) = mid(j)
+                    else
+                        start(j) = 1 + mid(j)
+                        edge(j) = var_shape(j,i) - mid(j)
+                    end if
+                    if (edge(j) .gt. 0) then
+                        sstride(j) = 1 + roll(edge(j))
+                    else
+                        sstride(j) = 1
+                    end if
+                    nstarts = nstarts * stride(j)
+6               continue
+                do 7, m = 1, nstarts
+                    err = index2indexes(m, var_rank(i), sstride, 
+     +                                  index)
+                    if (err .ne. 0)
+     +                  call error('error in index2indexes')
+                    nels = 1
+                    do 8, j = 1, var_rank(i)
+                        count(j) = 1 + (edge(j) - index(j)) / 
+     +                                  stride(j)
+                        nels = nels * count(j)
+                        index(j) = index(j) + start(j) - 1
+8                   continue
+C                           Random choice of forward or backward 
+C    /* TODO
+C                   if ( roll(2) ) then
+C                       for (j = 0 j < var_rank(i) j++) {
+C                           index(j) += (count(j) - 1) * stride(j)
+C                           stride(j) = -stride(j)
+C                       }
+C                   end if
+C    */
+                    allInIntRange = .true.
+                    allInExtRange = .true.
+                    do 9, j = 1, nels
+                        err = index2indexes(j, var_rank(i), count, 
+     +                                      index2)
+                        if (err .ne. 0)
+     +                      call error('error in index2indexes() 1')
+                        do 10, d = 1, var_rank(i)
+                            index2(d) = index(d) + (index2(d)-1) * 
+     +                                  stride(d)
+10                      continue
+                        expect(j) = hash4(var_type(i), var_rank(i), 
+     +                                    index2, NFT_INT)
+                        if (inRange3(expect(j),var_type(i),
+     +                               NFT_INT)) then
+                            allInIntRange = 
+     +                          allInIntRange .and.
+     +                          in_internal_range(NFT_INT, 
+     +                                            expect(j))
+                        else
+                            allInExtRange = .false.
+                        end if
+9                   continue
+                    err = nf_get_vars_int(ncid, i, index,
+     +                                   count, stride,
+     +                                   value)
+                    if (canConvert) then
+                        if (allInExtRange) then
+                            if (allInIntRange) then
+                                if (err .ne. 0)
+     +                              call error(nf_strerror(err))
+                            else
+                                if (err .ne. NF_ERANGE)
+     +                              call errore('Range error: ', err)
+                            end if
+                        else
+                            if (err .ne. 0 .and. err .ne. NF_ERANGE)
+     +                          call errore('OK or Range error: ', err)
+                        end if
+                        do 11, j = 1, nels
+                            if (inRange3(expect(j),var_type(i),
+     +                          NFT_INT) .and.
+     +                          in_internal_range(NFT_INT, 
+     +                                            expect(j))) then
+                                val = value(j)
+                                if (.not.equal(val, expect(j),
+     +                              var_type(i), NFT_INT)) then
+                                    call error(
+     +                                  'value read not that expected')
+                                    if (verbose) then
+                                        call error(' ')
+                                        call errori('varid: ', i)
+                                        call errorc('var_name: ', 
+     +                                              var_name(i))
+                                        call errori('element number: ',
+     +                                              j)
+                                        call errord('expect: ', 
+     +                                              expect(j))
+                                        call errord('got: ', val)
+                                    end if
+                                else
+                                    nok = nok + 1
+                                end if
+                            end if
+11                      continue
+                    else
+                        if (nels .gt. 0 .and. err .ne. NF_ECHAR)
+     +                      call errore('wrong type: ', err)
+                    end if
+7               continue
+5           continue
+
+1       continue
+        err = nf_close(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_close: ', err)
+        call print_nok(nok)
+        end
+
+        subroutine test_nf_get_vars_real()
+        implicit        none
+#include "tests.inc"
+        integer ncid
+        integer d
+        integer i
+        integer j
+        integer k
+        integer m
+        integer err
+        logical allInExtRange   
+        logical allInIntRange   
+        integer nels
+        integer nslabs
+        integer nstarts         
+        integer nok             
+        integer start(MAX_RANK)
+        integer edge(MAX_RANK)
+        integer index(MAX_RANK)
+        integer index2(MAX_RANK)
+        integer mid(MAX_RANK)
+        integer count(MAX_RANK)
+        integer sstride(MAX_RANK)
+        integer stride(MAX_RANK)
+        logical canConvert     
+        real    value(MAX_NELS)
+        doubleprecision expect(MAX_NELS)
+        doubleprecision val
+        integer udshift
+
+        nok = 0
+
+        err = nf_open(testfile, NF_NOWRITE, ncid)
+        if (err .ne. 0)
+     +      call errore('nf_open: ', err)
+        do 1, i = 1, NVARS
+            canConvert = (var_type(i) .eq. NF_CHAR) .eqv. 
+     +                   (NFT_REAL .eq. NFT_TEXT)
+            if (.not.(var_rank(i) .le. MAX_RANK)) stop 2
+            if (.not.(var_nels(i) .le. MAX_NELS)) stop 2
+            do 2, j = 1, var_rank(i)
+                start(j) = 1
+                edge(j) = 1
+                stride(j) = 1
+2           continue
+            err = nf_get_vars_real(BAD_ID, i, start,
+     +                  edge, stride, value)
+            if (err .ne. NF_EBADID)
+     +          call errore('bad ncid: ', err)
+            err = nf_get_vars_real(ncid, BAD_VARID,
+     +                  start, edge, stride, 
+     +                           value)
+            if (err .ne. NF_ENOTVAR)
+     +          call errore('bad var id: ', err)
+            do 3, j = 1, var_rank(i)
+                start(j) = var_shape(j,i) + 1
+                err = nf_get_vars_real(ncid, i, start,
+     +                               edge, stride, 
+     +                               value)
+                if (.not. canConvert) then
+                    if (err .ne. NF_ECHAR)
+     +                  call errore('conversion: ', err)
+                else
+                    if (err .ne. NF_EINVALCOORDS)
+     +                  call errore('bad index: ', err)
+                endif
+                start(j) = 1
+                edge(j) = var_shape(j,i) + 1
+                err = nf_get_vars_real(ncid, i, start,
+     +                               edge, stride, 
+     +                               value)
+                if (.not. canConvert) then
+                    if (err .ne. NF_ECHAR)
+     +                  call errore('conversion: ', err)
+                else
+                    if (err .ne. NF_EEDGE)
+     +                  call errore('bad edge: ', err)
+                endif
+                edge(j) = 1
+                stride(j) = 0
+                err = nf_get_vars_real(ncid, i, start,
+     +                               edge, stride, 
+     +                               value)
+                if (.not. canConvert) then
+                    if (err .ne. NF_ECHAR)
+     +                  call errore('conversion: ', err)
+                else
+                    if (err .ne. NF_ESTRIDE)
+     +                  call errore('bad stride: ', err)
+                endif
+                stride(j) = 1
+3           continue
+C               Choose a random point dividing each dim into 2 parts
+C               get 2^rank (nslabs) slabs so defined
+            nslabs = 1
+            do 4, j = 1, var_rank(i)
+                mid(j) = roll( var_shape(j,i) )
+                nslabs = nslabs * 2
+4           continue
+C               bits of k determine whether to get lower or upper part of dim
+C               choose random stride from 1 to edge
+            do 5, k = 1, nslabs
+                nstarts = 1
+                do 6, j = 1, var_rank(i)
+                    if (mod(udshift(k-1, j-1), 2) .eq. 1) then
+                        start(j) = 1
+                        edge(j) = mid(j)
+                    else
+                        start(j) = 1 + mid(j)
+                        edge(j) = var_shape(j,i) - mid(j)
+                    end if
+                    if (edge(j) .gt. 0) then
+                        sstride(j) = 1 + roll(edge(j))
+                    else
+                        sstride(j) = 1
+                    end if
+                    nstarts = nstarts * stride(j)
+6               continue
+                do 7, m = 1, nstarts
+                    err = index2indexes(m, var_rank(i), sstride, 
+     +                                  index)
+                    if (err .ne. 0)
+     +                  call error('error in index2indexes')
+                    nels = 1
+                    do 8, j = 1, var_rank(i)
+                        count(j) = 1 + (edge(j) - index(j)) / 
+     +                                  stride(j)
+                        nels = nels * count(j)
+                        index(j) = index(j) + start(j) - 1
+8                   continue
+C                           Random choice of forward or backward 
+C    /* TODO
+C                   if ( roll(2) ) then
+C                       for (j = 0 j < var_rank(i) j++) {
+C                           index(j) += (count(j) - 1) * stride(j)
+C                           stride(j) = -stride(j)
+C                       }
+C                   end if
+C    */
+                    allInIntRange = .true.
+                    allInExtRange = .true.
+                    do 9, j = 1, nels
+                        err = index2indexes(j, var_rank(i), count, 
+     +                                      index2)
+                        if (err .ne. 0)
+     +                      call error('error in index2indexes() 1')
+                        do 10, d = 1, var_rank(i)
+                            index2(d) = index(d) + (index2(d)-1) * 
+     +                                  stride(d)
+10                      continue
+                        expect(j) = hash4(var_type(i), var_rank(i), 
+     +                                    index2, NFT_REAL)
+                        if (inRange3(expect(j),var_type(i),
+     +                               NFT_REAL)) then
+                            allInIntRange = 
+     +                          allInIntRange .and.
+     +                          in_internal_range(NFT_REAL, 
+     +                                            expect(j))
+                        else
+                            allInExtRange = .false.
+                        end if
+9                   continue
+                    err = nf_get_vars_real(ncid, i, index,
+     +                                   count, stride,
+     +                                   value)
+                    if (canConvert) then
+                        if (allInExtRange) then
+                            if (allInIntRange) then
+                                if (err .ne. 0)
+     +                              call error(nf_strerror(err))
+                            else
+                                if (err .ne. NF_ERANGE)
+     +                              call errore('Range error: ', err)
+                            end if
+                        else
+                            if (err .ne. 0 .and. err .ne. NF_ERANGE)
+     +                          call errore('OK or Range error: ', err)
+                        end if
+                        do 11, j = 1, nels
+                            if (inRange3(expect(j),var_type(i),
+     +                          NFT_REAL) .and.
+     +                          in_internal_range(NFT_REAL, 
+     +                                            expect(j))) then
+                                val = value(j)
+                                if (.not.equal(val, expect(j),
+     +                              var_type(i), NFT_REAL)) then
+                                    call error(
+     +                                  'value read not that expected')
+                                    if (verbose) then
+                                        call error(' ')
+                                        call errori('varid: ', i)
+                                        call errorc('var_name: ', 
+     +                                              var_name(i))
+                                        call errori('element number: ',
+     +                                              j)
+                                        call errord('expect: ', 
+     +                                              expect(j))
+                                        call errord('got: ', val)
+                                    end if
+                                else
+                                    nok = nok + 1
+                                end if
+                            end if
+11                      continue
+                    else
+                        if (nels .gt. 0 .and. err .ne. NF_ECHAR)
+     +                      call errore('wrong type: ', err)
+                    end if
+7               continue
+5           continue
+
+1       continue
+        err = nf_close(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_close: ', err)
+        call print_nok(nok)
+        end
+
+        subroutine test_nf_get_vars_double()
+        implicit        none
+#include "tests.inc"
+        integer ncid
+        integer d
+        integer i
+        integer j
+        integer k
+        integer m
+        integer err
+        logical allInExtRange   
+        logical allInIntRange   
+        integer nels
+        integer nslabs
+        integer nstarts         
+        integer nok             
+        integer start(MAX_RANK)
+        integer edge(MAX_RANK)
+        integer index(MAX_RANK)
+        integer index2(MAX_RANK)
+        integer mid(MAX_RANK)
+        integer count(MAX_RANK)
+        integer sstride(MAX_RANK)
+        integer stride(MAX_RANK)
+        logical canConvert     
+        doubleprecision    value(MAX_NELS)
+        doubleprecision expect(MAX_NELS)
+        doubleprecision val
+        integer udshift
+
+        nok = 0
+
+        err = nf_open(testfile, NF_NOWRITE, ncid)
+        if (err .ne. 0)
+     +      call errore('nf_open: ', err)
+        do 1, i = 1, NVARS
+            canConvert = (var_type(i) .eq. NF_CHAR) .eqv. 
+     +                   (NFT_DOUBLE .eq. NFT_TEXT)
+            if (.not.(var_rank(i) .le. MAX_RANK)) stop 2
+            if (.not.(var_nels(i) .le. MAX_NELS)) stop 2
+            do 2, j = 1, var_rank(i)
+                start(j) = 1
+                edge(j) = 1
+                stride(j) = 1
+2           continue
+            err = nf_get_vars_double(BAD_ID, i, start,
+     +                  edge, stride, value)
+            if (err .ne. NF_EBADID)
+     +          call errore('bad ncid: ', err)
+            err = nf_get_vars_double(ncid, BAD_VARID,
+     +                  start, edge, stride, 
+     +                           value)
+            if (err .ne. NF_ENOTVAR)
+     +          call errore('bad var id: ', err)
+            do 3, j = 1, var_rank(i)
+                start(j) = var_shape(j,i) + 1
+                err = nf_get_vars_double(ncid, i, start,
+     +                               edge, stride, 
+     +                               value)
+                if (.not. canConvert) then
+                    if (err .ne. NF_ECHAR)
+     +                  call errore('conversion: ', err)
+                else
+                    if (err .ne. NF_EINVALCOORDS)
+     +                  call errore('bad index: ', err)
+                endif
+                start(j) = 1
+                edge(j) = var_shape(j,i) + 1
+                err = nf_get_vars_double(ncid, i, start,
+     +                               edge, stride, 
+     +                               value)
+                if (.not. canConvert) then
+                    if (err .ne. NF_ECHAR)
+     +                  call errore('conversion: ', err)
+                else
+                    if (err .ne. NF_EEDGE)
+     +                  call errore('bad edge: ', err)
+                endif
+                edge(j) = 1
+                stride(j) = 0
+                err = nf_get_vars_double(ncid, i, start,
+     +                               edge, stride, 
+     +                               value)
+                if (.not. canConvert) then
+                    if (err .ne. NF_ECHAR)
+     +                  call errore('conversion: ', err)
+                else
+                    if (err .ne. NF_ESTRIDE)
+     +                  call errore('bad stride: ', err)
+                endif
+                stride(j) = 1
+3           continue
+C               Choose a random point dividing each dim into 2 parts
+C               get 2^rank (nslabs) slabs so defined
+            nslabs = 1
+            do 4, j = 1, var_rank(i)
+                mid(j) = roll( var_shape(j,i) )
+                nslabs = nslabs * 2
+4           continue
+C               bits of k determine whether to get lower or upper part of dim
+C               choose random stride from 1 to edge
+            do 5, k = 1, nslabs
+                nstarts = 1
+                do 6, j = 1, var_rank(i)
+                    if (mod(udshift(k-1, j-1), 2) .eq. 1) then
+                        start(j) = 1
+                        edge(j) = mid(j)
+                    else
+                        start(j) = 1 + mid(j)
+                        edge(j) = var_shape(j,i) - mid(j)
+                    end if
+                    if (edge(j) .gt. 0) then
+                        sstride(j) = 1 + roll(edge(j))
+                    else
+                        sstride(j) = 1
+                    end if
+                    nstarts = nstarts * stride(j)
+6               continue
+                do 7, m = 1, nstarts
+                    err = index2indexes(m, var_rank(i), sstride, 
+     +                                  index)
+                    if (err .ne. 0)
+     +                  call error('error in index2indexes')
+                    nels = 1
+                    do 8, j = 1, var_rank(i)
+                        count(j) = 1 + (edge(j) - index(j)) / 
+     +                                  stride(j)
+                        nels = nels * count(j)
+                        index(j) = index(j) + start(j) - 1
+8                   continue
+C                           Random choice of forward or backward 
+C    /* TODO
+C                   if ( roll(2) ) then
+C                       for (j = 0 j < var_rank(i) j++) {
+C                           index(j) += (count(j) - 1) * stride(j)
+C                           stride(j) = -stride(j)
+C                       }
+C                   end if
+C    */
+                    allInIntRange = .true.
+                    allInExtRange = .true.
+                    do 9, j = 1, nels
+                        err = index2indexes(j, var_rank(i), count, 
+     +                                      index2)
+                        if (err .ne. 0)
+     +                      call error('error in index2indexes() 1')
+                        do 10, d = 1, var_rank(i)
+                            index2(d) = index(d) + (index2(d)-1) * 
+     +                                  stride(d)
+10                      continue
+                        expect(j) = hash4(var_type(i), var_rank(i), 
+     +                                    index2, NFT_DOUBLE)
+                        if (inRange3(expect(j),var_type(i),
+     +                               NFT_DOUBLE)) then
+                            allInIntRange = 
+     +                          allInIntRange .and.
+     +                          in_internal_range(NFT_DOUBLE, 
+     +                                            expect(j))
+                        else
+                            allInExtRange = .false.
+                        end if
+9                   continue
+                    err = nf_get_vars_double(ncid, i, index,
+     +                                   count, stride,
+     +                                   value)
+                    if (canConvert) then
+                        if (allInExtRange) then
+                            if (allInIntRange) then
+                                if (err .ne. 0)
+     +                              call error(nf_strerror(err))
+                            else
+                                if (err .ne. NF_ERANGE)
+     +                              call errore('Range error: ', err)
+                            end if
+                        else
+                            if (err .ne. 0 .and. err .ne. NF_ERANGE)
+     +                          call errore('OK or Range error: ', err)
+                        end if
+                        do 11, j = 1, nels
+                            if (inRange3(expect(j),var_type(i),
+     +                          NFT_DOUBLE) .and.
+     +                          in_internal_range(NFT_DOUBLE, 
+     +                                            expect(j))) then
+                                val = value(j)
+                                if (.not.equal(val, expect(j),
+     +                              var_type(i), NFT_DOUBLE)) then
+                                    call error(
+     +                                  'value read not that expected')
+                                    if (verbose) then
+                                        call error(' ')
+                                        call errori('varid: ', i)
+                                        call errorc('var_name: ', 
+     +                                              var_name(i))
+                                        call errori('element number: ',
+     +                                              j)
+                                        call errord('expect: ', 
+     +                                              expect(j))
+                                        call errord('got: ', val)
+                                    end if
+                                else
+                                    nok = nok + 1
+                                end if
+                            end if
+11                      continue
+                    else
+                        if (nels .gt. 0 .and. err .ne. NF_ECHAR)
+     +                      call errore('wrong type: ', err)
+                    end if
+7               continue
+5           continue
+
+1       continue
+        err = nf_close(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_close: ', err)
+        call print_nok(nok)
+        end
+
+
+        subroutine test_nf_get_varm_text()
+        implicit        none
+#include "tests.inc"
+        integer ncid
+        integer d
+        integer i
+        integer j
+        integer k
+        integer m
+        integer err
+        logical allInExtRange   
+        logical allInIntRange   
+        integer nels
+        integer nslabs
+        integer nstarts         
+        integer nok             
+        integer start(MAX_RANK)
+        integer edge(MAX_RANK)
+        integer index(MAX_RANK)
+        integer index2(MAX_RANK)
+        integer mid(MAX_RANK)
+        integer count(MAX_RANK)
+        integer sstride(MAX_RANK)
+        integer stride(MAX_RANK)
+        integer imap(MAX_RANK)
+        logical canConvert     
+        character    value(MAX_NELS)
+        doubleprecision expect(MAX_NELS)
+        doubleprecision val
+        integer udshift
+
+        nok = 0
+
+        err = nf_open(testfile, NF_NOWRITE, ncid)
+        if (err .ne. 0)
+     +      call errore('nf_open: ', err)
+        do 1, i = 1, NVARS
+            canConvert = (var_type(i) .eq. NF_CHAR) .eqv. 
+     +                   (NFT_TEXT .eq. NFT_TEXT)
+            if (.not.(var_rank(i) .le. MAX_RANK)) stop 2
+            if (.not.(var_nels(i) .le. MAX_NELS)) stop 2
+            do 2, j = 1, var_rank(i)
+                start(j) = 1
+                edge(j) = 1
+                stride(j) = 1
+                imap(j) = 1
+2           continue
+            err = nf_get_varm_text(BAD_ID, i, start, edge,
+     +                           stride, imap, 
+     +                           value)
+            if (err .ne. NF_EBADID)
+     +          call errore('bad ncid: ', err)
+            err = nf_get_varm_text(ncid, BAD_VARID, start,
+     +                           edge, stride, 
+     +                           imap, value)
+            if (err .ne. NF_ENOTVAR)
+     +          call errore('bad var id: ', err)
+            do 3, j = 1, var_rank(i)
+                start(j) = var_shape(j,i) + 1
+                err = nf_get_varm_text(ncid, i, start,
+     +                               edge, stride, 
+     +                               imap, value)
+                if (.not. canConvert) then
+                    if (err .ne. NF_ECHAR)
+     +                  call errore('conversion: ', err)
+                else
+                    if (err .ne. NF_EINVALCOORDS)
+     +                  call errore('bad index: ', err)
+                endif
+                start(j) = 1
+                edge(j) = var_shape(j,i) + 1
+                err = nf_get_varm_text(ncid, i, start,
+     +                               edge, stride, 
+     +                               imap, value)
+                if (.not. canConvert) then
+                    if (err .ne. NF_ECHAR)
+     +                  call errore('conversion: ', err)
+                else
+                    if (err .ne. NF_EEDGE)
+     +                  call errore('bad edge: ', err)
+                endif
+                edge(j) = 1
+                stride(j) = 0
+                err = nf_get_varm_text(ncid, i, start,
+     +                               edge, stride, 
+     +                               imap, value)
+                if (.not. canConvert) then
+                    if (err .ne. NF_ECHAR)
+     +                  call errore('conversion: ', err)
+                else
+                    if (err .ne. NF_ESTRIDE)
+     +                  call errore('bad stride: ', err)
+                endif
+                stride(j) = 1
+3           continue
+C               Choose a random point dividing each dim into 2 parts 
+C               get 2^rank (nslabs) slabs so defined 
+            nslabs = 1
+            do 4, j = 1, var_rank(i)
+                mid(j) = roll( var_shape(j,i) )
+                nslabs = nslabs * 2
+4           continue
+C               /* bits of k determine whether to get lower or upper part 
+C                * of dim
+C                * choose random stride from 1 to edge */
+            do 5, k = 1, nslabs
+                nstarts = 1
+                do 6, j = 1, var_rank(i)
+                    if (mod(udshift((k-1), -(j-1)), 2) .ne. 0) then
+                        start(j) = 1
+                        edge(j) = mid(j)
+                    else
+                        start(j) = 1 + mid(j)
+                        edge(j) = var_shape(j,i) - mid(j)
+                    end if
+                    if (edge(j) .gt. 0) then
+                        stride(j) = 1+roll(edge(j))
+                    else
+                        stride(j) = 1
+                    end if
+                    sstride(j) = stride(j)
+                    nstarts = nstarts * stride(j)
+6               continue
+                do 7, m = 1, nstarts
+                    err = index2indexes(m, var_rank(i), sstride, index)
+                    if (err .ne. 0)
+     +                  call error('error in index2indexes')
+                    nels = 1
+                    do 8, j = 1, var_rank(i)
+                        count(j) = 1 + (edge(j) - index(j)) / 
+     +                                  stride(j)
+                        nels = nels * count(j)
+                        index(j) = index(j) + start(j) - 1
+8                   continue
+C                       Random choice of forward or backward 
+C    /* TODO
+C                   if ( roll(2) ) then
+C                       for (j = 0 j < var_rank(i) j++) {
+C                           index(j) += (count(j) - 1) * stride(j)
+C                           stride(j) = -stride(j)
+C                       }
+C                   end if
+C     */
+                    if (var_rank(i) .gt. 0) then
+                        imap(1) = 1
+                        do 9, j = 2, var_rank(i)
+                            imap(j) = imap(j-1) * count(j-1)
+9                       continue
+                    end if
+                    allInIntRange = .true.
+                    allInExtRange = .true.
+                    do 10, j = 1, nels
+                        err = index2indexes(j, var_rank(i), count, 
+     +                                      index2)
+                        if (err .ne. 0)
+     +                      call error('error in index2indexes 1')
+                        do 11, d = 1, var_rank(i)
+                            index2(d) = index(d) + (index2(d)-1) * 
+     +                                  stride(d)
+11                      continue
+                        expect(j) = hash4(var_type(i), var_rank(i), 
+     +                                    index2, NFT_TEXT)
+                        if (inRange3(expect(j),var_type(i),
+     +                               NFT_TEXT)) then
+                            allInIntRange = 
+     +                          allInIntRange .and.
+     +                          in_internal_range(NFT_TEXT,
+     +                                            expect(j))
+                        else
+                            allInExtRange = .false.
+                        end if
+10                  continue
+                    err = nf_get_varm_text(ncid,i,index,count,
+     +                                   stride,imap,
+     +                                   value)
+                    if (canConvert) then
+                        if (allInExtRange) then
+                            if (allInIntRange) then
+                                if (err .ne. 0)
+     +                              call error(nf_strerror(err))
+                            else
+                                if (err .ne. NF_ERANGE)
+     +                              call errore('Range error: ', err)
+                            end if
+                        else
+                            if (err .ne. 0 .and. err .ne. NF_ERANGE)
+     +                          call errore('OK or Range error: ', err)
+                        end if
+                        do 12, j = 1, nels
+                            if (inRange3(expect(j),var_type(i),
+     +                                   NFT_TEXT) .and.
+     +                          in_internal_range(NFT_TEXT,
+     +                                            expect(j))) then
+                                val = ichar(value(j))
+                                if (.not.equal(val, expect(j),
+     +                                         var_type(i), 
+     +                                         NFT_TEXT)) then
+                                    call error(
+     +                                  'value read not that expected')
+                                    if (verbose) then
+                                        call error(' ')
+                                        call errori('varid: ', i)
+                                        call errorc('var_name: ', 
+     +                                          var_name(i))
+                                        call errori('element number: ',
+     +                                              j)
+                                        call errord('expect: ', 
+     +                                              expect(j))
+                                        call errord('got: ', val)
+                                    end if
+                                else
+                                    nok = nok + 1
+                                end if
+                            end if
+12                      continue
+                    else
+                        if (nels .gt. 0 .and. err .ne. NF_ECHAR)
+     +                      call errore('wrong type: ', err)
+                    end if
+7               continue
+5           continue
+1       continue
+        err = nf_close(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_close: ',  err)
+        call print_nok(nok)
+        end
+
+#ifdef NF_INT1_T
+        subroutine test_nf_get_varm_int1()
+        implicit        none
+#include "tests.inc"
+        integer ncid
+        integer d
+        integer i
+        integer j
+        integer k
+        integer m
+        integer err
+        logical allInExtRange   
+        logical allInIntRange   
+        integer nels
+        integer nslabs
+        integer nstarts         
+        integer nok             
+        integer start(MAX_RANK)
+        integer edge(MAX_RANK)
+        integer index(MAX_RANK)
+        integer index2(MAX_RANK)
+        integer mid(MAX_RANK)
+        integer count(MAX_RANK)
+        integer sstride(MAX_RANK)
+        integer stride(MAX_RANK)
+        integer imap(MAX_RANK)
+        logical canConvert     
+        NF_INT1_T    value(MAX_NELS)
+        doubleprecision expect(MAX_NELS)
+        doubleprecision val
+        integer udshift
+
+        nok = 0
+
+        err = nf_open(testfile, NF_NOWRITE, ncid)
+        if (err .ne. 0)
+     +      call errore('nf_open: ', err)
+        do 1, i = 1, NVARS
+            canConvert = (var_type(i) .eq. NF_CHAR) .eqv. 
+     +                   (NFT_INT1 .eq. NFT_TEXT)
+            if (.not.(var_rank(i) .le. MAX_RANK)) stop 2
+            if (.not.(var_nels(i) .le. MAX_NELS)) stop 2
+            do 2, j = 1, var_rank(i)
+                start(j) = 1
+                edge(j) = 1
+                stride(j) = 1
+                imap(j) = 1
+2           continue
+            err = nf_get_varm_int1(BAD_ID, i, start, edge,
+     +                           stride, imap, 
+     +                           value)
+            if (err .ne. NF_EBADID)
+     +          call errore('bad ncid: ', err)
+            err = nf_get_varm_int1(ncid, BAD_VARID, start,
+     +                           edge, stride, 
+     +                           imap, value)
+            if (err .ne. NF_ENOTVAR)
+     +          call errore('bad var id: ', err)
+            do 3, j = 1, var_rank(i)
+                start(j) = var_shape(j,i) + 1
+                err = nf_get_varm_int1(ncid, i, start,
+     +                               edge, stride, 
+     +                               imap, value)
+                if (.not. canConvert) then
+                    if (err .ne. NF_ECHAR)
+     +                  call errore('conversion: ', err)
+                else
+                    if (err .ne. NF_EINVALCOORDS)
+     +                  call errore('bad index: ', err)
+                endif
+                start(j) = 1
+                edge(j) = var_shape(j,i) + 1
+                err = nf_get_varm_int1(ncid, i, start,
+     +                               edge, stride, 
+     +                               imap, value)
+                if (.not. canConvert) then
+                    if (err .ne. NF_ECHAR)
+     +                  call errore('conversion: ', err)
+                else
+                    if (err .ne. NF_EEDGE)
+     +                  call errore('bad edge: ', err)
+                endif
+                edge(j) = 1
+                stride(j) = 0
+                err = nf_get_varm_int1(ncid, i, start,
+     +                               edge, stride, 
+     +                               imap, value)
+                if (.not. canConvert) then
+                    if (err .ne. NF_ECHAR)
+     +                  call errore('conversion: ', err)
+                else
+                    if (err .ne. NF_ESTRIDE)
+     +                  call errore('bad stride: ', err)
+                endif
+                stride(j) = 1
+3           continue
+C               Choose a random point dividing each dim into 2 parts 
+C               get 2^rank (nslabs) slabs so defined 
+            nslabs = 1
+            do 4, j = 1, var_rank(i)
+                mid(j) = roll( var_shape(j,i) )
+                nslabs = nslabs * 2
+4           continue
+C               /* bits of k determine whether to get lower or upper part 
+C                * of dim
+C                * choose random stride from 1 to edge */
+            do 5, k = 1, nslabs
+                nstarts = 1
+                do 6, j = 1, var_rank(i)
+                    if (mod(udshift((k-1), -(j-1)), 2) .ne. 0) then
+                        start(j) = 1
+                        edge(j) = mid(j)
+                    else
+                        start(j) = 1 + mid(j)
+                        edge(j) = var_shape(j,i) - mid(j)
+                    end if
+                    if (edge(j) .gt. 0) then
+                        stride(j) = 1+roll(edge(j))
+                    else
+                        stride(j) = 1
+                    end if
+                    sstride(j) = stride(j)
+                    nstarts = nstarts * stride(j)
+6               continue
+                do 7, m = 1, nstarts
+                    err = index2indexes(m, var_rank(i), sstride, index)
+                    if (err .ne. 0)
+     +                  call error('error in index2indexes')
+                    nels = 1
+                    do 8, j = 1, var_rank(i)
+                        count(j) = 1 + (edge(j) - index(j)) / 
+     +                                  stride(j)
+                        nels = nels * count(j)
+                        index(j) = index(j) + start(j) - 1
+8                   continue
+C                       Random choice of forward or backward 
+C    /* TODO
+C                   if ( roll(2) ) then
+C                       for (j = 0 j < var_rank(i) j++) {
+C                           index(j) += (count(j) - 1) * stride(j)
+C                           stride(j) = -stride(j)
+C                       }
+C                   end if
+C     */
+                    if (var_rank(i) .gt. 0) then
+                        imap(1) = 1
+                        do 9, j = 2, var_rank(i)
+                            imap(j) = imap(j-1) * count(j-1)
+9                       continue
+                    end if
+                    allInIntRange = .true.
+                    allInExtRange = .true.
+                    do 10, j = 1, nels
+                        err = index2indexes(j, var_rank(i), count, 
+     +                                      index2)
+                        if (err .ne. 0)
+     +                      call error('error in index2indexes 1')
+                        do 11, d = 1, var_rank(i)
+                            index2(d) = index(d) + (index2(d)-1) * 
+     +                                  stride(d)
+11                      continue
+                        expect(j) = hash4(var_type(i), var_rank(i), 
+     +                                    index2, NFT_INT1)
+                        if (inRange3(expect(j),var_type(i),
+     +                               NFT_INT1)) then
+                            allInIntRange = 
+     +                          allInIntRange .and.
+     +                          in_internal_range(NFT_INT1,
+     +                                            expect(j))
+                        else
+                            allInExtRange = .false.
+                        end if
+10                  continue
+                    err = nf_get_varm_int1(ncid,i,index,count,
+     +                                   stride,imap,
+     +                                   value)
+                    if (canConvert) then
+                        if (allInExtRange) then
+                            if (allInIntRange) then
+                                if (err .ne. 0)
+     +                              call error(nf_strerror(err))
+                            else
+                                if (err .ne. NF_ERANGE)
+     +                              call errore('Range error: ', err)
+                            end if
+                        else
+                            if (err .ne. 0 .and. err .ne. NF_ERANGE)
+     +                          call errore('OK or Range error: ', err)
+                        end if
+                        do 12, j = 1, nels
+                            if (inRange3(expect(j),var_type(i),
+     +                                   NFT_INT1) .and.
+     +                          in_internal_range(NFT_INT1,
+     +                                            expect(j))) then
+                                val = value(j)
+                                if (.not.equal(val, expect(j),
+     +                                         var_type(i), 
+     +                                         NFT_INT1)) then
+                                    call error(
+     +                                  'value read not that expected')
+                                    if (verbose) then
+                                        call error(' ')
+                                        call errori('varid: ', i)
+                                        call errorc('var_name: ', 
+     +                                          var_name(i))
+                                        call errori('element number: ',
+     +                                              j)
+                                        call errord('expect: ', 
+     +                                              expect(j))
+                                        call errord('got: ', val)
+                                    end if
+                                else
+                                    nok = nok + 1
+                                end if
+                            end if
+12                      continue
+                    else
+                        if (nels .gt. 0 .and. err .ne. NF_ECHAR)
+     +                      call errore('wrong type: ', err)
+                    end if
+7               continue
+5           continue
+1       continue
+        err = nf_close(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_close: ',  err)
+        call print_nok(nok)
+        end
+
+#endif
+#ifdef NF_INT2_T
+        subroutine test_nf_get_varm_int2()
+        implicit        none
+#include "tests.inc"
+        integer ncid
+        integer d
+        integer i
+        integer j
+        integer k
+        integer m
+        integer err
+        logical allInExtRange   
+        logical allInIntRange   
+        integer nels
+        integer nslabs
+        integer nstarts         
+        integer nok             
+        integer start(MAX_RANK)
+        integer edge(MAX_RANK)
+        integer index(MAX_RANK)
+        integer index2(MAX_RANK)
+        integer mid(MAX_RANK)
+        integer count(MAX_RANK)
+        integer sstride(MAX_RANK)
+        integer stride(MAX_RANK)
+        integer imap(MAX_RANK)
+        logical canConvert     
+        NF_INT2_T    value(MAX_NELS)
+        doubleprecision expect(MAX_NELS)
+        doubleprecision val
+        integer udshift
+
+        nok = 0
+
+        err = nf_open(testfile, NF_NOWRITE, ncid)
+        if (err .ne. 0)
+     +      call errore('nf_open: ', err)
+        do 1, i = 1, NVARS
+            canConvert = (var_type(i) .eq. NF_CHAR) .eqv. 
+     +                   (NFT_INT2 .eq. NFT_TEXT)
+            if (.not.(var_rank(i) .le. MAX_RANK)) stop 2
+            if (.not.(var_nels(i) .le. MAX_NELS)) stop 2
+            do 2, j = 1, var_rank(i)
+                start(j) = 1
+                edge(j) = 1
+                stride(j) = 1
+                imap(j) = 1
+2           continue
+            err = nf_get_varm_int2(BAD_ID, i, start, edge,
+     +                           stride, imap, 
+     +                           value)
+            if (err .ne. NF_EBADID)
+     +          call errore('bad ncid: ', err)
+            err = nf_get_varm_int2(ncid, BAD_VARID, start,
+     +                           edge, stride, 
+     +                           imap, value)
+            if (err .ne. NF_ENOTVAR)
+     +          call errore('bad var id: ', err)
+            do 3, j = 1, var_rank(i)
+                start(j) = var_shape(j,i) + 1
+                err = nf_get_varm_int2(ncid, i, start,
+     +                               edge, stride, 
+     +                               imap, value)
+                if (.not. canConvert) then
+                    if (err .ne. NF_ECHAR)
+     +                  call errore('conversion: ', err)
+                else
+                    if (err .ne. NF_EINVALCOORDS)
+     +                  call errore('bad index: ', err)
+                endif
+                start(j) = 1
+                edge(j) = var_shape(j,i) + 1
+                err = nf_get_varm_int2(ncid, i, start,
+     +                               edge, stride, 
+     +                               imap, value)
+                if (.not. canConvert) then
+                    if (err .ne. NF_ECHAR)
+     +                  call errore('conversion: ', err)
+                else
+                    if (err .ne. NF_EEDGE)
+     +                  call errore('bad edge: ', err)
+                endif
+                edge(j) = 1
+                stride(j) = 0
+                err = nf_get_varm_int2(ncid, i, start,
+     +                               edge, stride, 
+     +                               imap, value)
+                if (.not. canConvert) then
+                    if (err .ne. NF_ECHAR)
+     +                  call errore('conversion: ', err)
+                else
+                    if (err .ne. NF_ESTRIDE)
+     +                  call errore('bad stride: ', err)
+                endif
+                stride(j) = 1
+3           continue
+C               Choose a random point dividing each dim into 2 parts 
+C               get 2^rank (nslabs) slabs so defined 
+            nslabs = 1
+            do 4, j = 1, var_rank(i)
+                mid(j) = roll( var_shape(j,i) )
+                nslabs = nslabs * 2
+4           continue
+C               /* bits of k determine whether to get lower or upper part 
+C                * of dim
+C                * choose random stride from 1 to edge */
+            do 5, k = 1, nslabs
+                nstarts = 1
+                do 6, j = 1, var_rank(i)
+                    if (mod(udshift((k-1), -(j-1)), 2) .ne. 0) then
+                        start(j) = 1
+                        edge(j) = mid(j)
+                    else
+                        start(j) = 1 + mid(j)
+                        edge(j) = var_shape(j,i) - mid(j)
+                    end if
+                    if (edge(j) .gt. 0) then
+                        stride(j) = 1+roll(edge(j))
+                    else
+                        stride(j) = 1
+                    end if
+                    sstride(j) = stride(j)
+                    nstarts = nstarts * stride(j)
+6               continue
+                do 7, m = 1, nstarts
+                    err = index2indexes(m, var_rank(i), sstride, index)
+                    if (err .ne. 0)
+     +                  call error('error in index2indexes')
+                    nels = 1
+                    do 8, j = 1, var_rank(i)
+                        count(j) = 1 + (edge(j) - index(j)) / 
+     +                                  stride(j)
+                        nels = nels * count(j)
+                        index(j) = index(j) + start(j) - 1
+8                   continue
+C                       Random choice of forward or backward 
+C    /* TODO
+C                   if ( roll(2) ) then
+C                       for (j = 0 j < var_rank(i) j++) {
+C                           index(j) += (count(j) - 1) * stride(j)
+C                           stride(j) = -stride(j)
+C                       }
+C                   end if
+C     */
+                    if (var_rank(i) .gt. 0) then
+                        imap(1) = 1
+                        do 9, j = 2, var_rank(i)
+                            imap(j) = imap(j-1) * count(j-1)
+9                       continue
+                    end if
+                    allInIntRange = .true.
+                    allInExtRange = .true.
+                    do 10, j = 1, nels
+                        err = index2indexes(j, var_rank(i), count, 
+     +                                      index2)
+                        if (err .ne. 0)
+     +                      call error('error in index2indexes 1')
+                        do 11, d = 1, var_rank(i)
+                            index2(d) = index(d) + (index2(d)-1) * 
+     +                                  stride(d)
+11                      continue
+                        expect(j) = hash4(var_type(i), var_rank(i), 
+     +                                    index2, NFT_INT2)
+                        if (inRange3(expect(j),var_type(i),
+     +                               NFT_INT2)) then
+                            allInIntRange = 
+     +                          allInIntRange .and.
+     +                          in_internal_range(NFT_INT2,
+     +                                            expect(j))
+                        else
+                            allInExtRange = .false.
+                        end if
+10                  continue
+                    err = nf_get_varm_int2(ncid,i,index,count,
+     +                                   stride,imap,
+     +                                   value)
+                    if (canConvert) then
+                        if (allInExtRange) then
+                            if (allInIntRange) then
+                                if (err .ne. 0)
+     +                              call error(nf_strerror(err))
+                            else
+                                if (err .ne. NF_ERANGE)
+     +                              call errore('Range error: ', err)
+                            end if
+                        else
+                            if (err .ne. 0 .and. err .ne. NF_ERANGE)
+     +                          call errore('OK or Range error: ', err)
+                        end if
+                        do 12, j = 1, nels
+                            if (inRange3(expect(j),var_type(i),
+     +                                   NFT_INT2) .and.
+     +                          in_internal_range(NFT_INT2,
+     +                                            expect(j))) then
+                                val = value(j)
+                                if (.not.equal(val, expect(j),
+     +                                         var_type(i), 
+     +                                         NFT_INT2)) then
+                                    call error(
+     +                                  'value read not that expected')
+                                    if (verbose) then
+                                        call error(' ')
+                                        call errori('varid: ', i)
+                                        call errorc('var_name: ', 
+     +                                          var_name(i))
+                                        call errori('element number: ',
+     +                                              j)
+                                        call errord('expect: ', 
+     +                                              expect(j))
+                                        call errord('got: ', val)
+                                    end if
+                                else
+                                    nok = nok + 1
+                                end if
+                            end if
+12                      continue
+                    else
+                        if (nels .gt. 0 .and. err .ne. NF_ECHAR)
+     +                      call errore('wrong type: ', err)
+                    end if
+7               continue
+5           continue
+1       continue
+        err = nf_close(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_close: ',  err)
+        call print_nok(nok)
+        end
+
+#endif
+        subroutine test_nf_get_varm_int()
+        implicit        none
+#include "tests.inc"
+        integer ncid
+        integer d
+        integer i
+        integer j
+        integer k
+        integer m
+        integer err
+        logical allInExtRange   
+        logical allInIntRange   
+        integer nels
+        integer nslabs
+        integer nstarts         
+        integer nok             
+        integer start(MAX_RANK)
+        integer edge(MAX_RANK)
+        integer index(MAX_RANK)
+        integer index2(MAX_RANK)
+        integer mid(MAX_RANK)
+        integer count(MAX_RANK)
+        integer sstride(MAX_RANK)
+        integer stride(MAX_RANK)
+        integer imap(MAX_RANK)
+        logical canConvert     
+        integer    value(MAX_NELS)
+        doubleprecision expect(MAX_NELS)
+        doubleprecision val
+        integer udshift
+
+        nok = 0
+
+        err = nf_open(testfile, NF_NOWRITE, ncid)
+        if (err .ne. 0)
+     +      call errore('nf_open: ', err)
+        do 1, i = 1, NVARS
+            canConvert = (var_type(i) .eq. NF_CHAR) .eqv. 
+     +                   (NFT_INT .eq. NFT_TEXT)
+            if (.not.(var_rank(i) .le. MAX_RANK)) stop 2
+            if (.not.(var_nels(i) .le. MAX_NELS)) stop 2
+            do 2, j = 1, var_rank(i)
+                start(j) = 1
+                edge(j) = 1
+                stride(j) = 1
+                imap(j) = 1
+2           continue
+            err = nf_get_varm_int(BAD_ID, i, start, edge,
+     +                           stride, imap, 
+     +                           value)
+            if (err .ne. NF_EBADID)
+     +          call errore('bad ncid: ', err)
+            err = nf_get_varm_int(ncid, BAD_VARID, start,
+     +                           edge, stride, 
+     +                           imap, value)
+            if (err .ne. NF_ENOTVAR)
+     +          call errore('bad var id: ', err)
+            do 3, j = 1, var_rank(i)
+                start(j) = var_shape(j,i) + 1
+                err = nf_get_varm_int(ncid, i, start,
+     +                               edge, stride, 
+     +                               imap, value)
+                if (.not. canConvert) then
+                    if (err .ne. NF_ECHAR)
+     +                  call errore('conversion: ', err)
+                else
+                    if (err .ne. NF_EINVALCOORDS)
+     +                  call errore('bad index: ', err)
+                endif
+                start(j) = 1
+                edge(j) = var_shape(j,i) + 1
+                err = nf_get_varm_int(ncid, i, start,
+     +                               edge, stride, 
+     +                               imap, value)
+                if (.not. canConvert) then
+                    if (err .ne. NF_ECHAR)
+     +                  call errore('conversion: ', err)
+                else
+                    if (err .ne. NF_EEDGE)
+     +                  call errore('bad edge: ', err)
+                endif
+                edge(j) = 1
+                stride(j) = 0
+                err = nf_get_varm_int(ncid, i, start,
+     +                               edge, stride, 
+     +                               imap, value)
+                if (.not. canConvert) then
+                    if (err .ne. NF_ECHAR)
+     +                  call errore('conversion: ', err)
+                else
+                    if (err .ne. NF_ESTRIDE)
+     +                  call errore('bad stride: ', err)
+                endif
+                stride(j) = 1
+3           continue
+C               Choose a random point dividing each dim into 2 parts 
+C               get 2^rank (nslabs) slabs so defined 
+            nslabs = 1
+            do 4, j = 1, var_rank(i)
+                mid(j) = roll( var_shape(j,i) )
+                nslabs = nslabs * 2
+4           continue
+C               /* bits of k determine whether to get lower or upper part 
+C                * of dim
+C                * choose random stride from 1 to edge */
+            do 5, k = 1, nslabs
+                nstarts = 1
+                do 6, j = 1, var_rank(i)
+                    if (mod(udshift((k-1), -(j-1)), 2) .ne. 0) then
+                        start(j) = 1
+                        edge(j) = mid(j)
+                    else
+                        start(j) = 1 + mid(j)
+                        edge(j) = var_shape(j,i) - mid(j)
+                    end if
+                    if (edge(j) .gt. 0) then
+                        stride(j) = 1+roll(edge(j))
+                    else
+                        stride(j) = 1
+                    end if
+                    sstride(j) = stride(j)
+                    nstarts = nstarts * stride(j)
+6               continue
+                do 7, m = 1, nstarts
+                    err = index2indexes(m, var_rank(i), sstride, index)
+                    if (err .ne. 0)
+     +                  call error('error in index2indexes')
+                    nels = 1
+                    do 8, j = 1, var_rank(i)
+                        count(j) = 1 + (edge(j) - index(j)) / 
+     +                                  stride(j)
+                        nels = nels * count(j)
+                        index(j) = index(j) + start(j) - 1
+8                   continue
+C                       Random choice of forward or backward 
+C    /* TODO
+C                   if ( roll(2) ) then
+C                       for (j = 0 j < var_rank(i) j++) {
+C                           index(j) += (count(j) - 1) * stride(j)
+C                           stride(j) = -stride(j)
+C                       }
+C                   end if
+C     */
+                    if (var_rank(i) .gt. 0) then
+                        imap(1) = 1
+                        do 9, j = 2, var_rank(i)
+                            imap(j) = imap(j-1) * count(j-1)
+9                       continue
+                    end if
+                    allInIntRange = .true.
+                    allInExtRange = .true.
+                    do 10, j = 1, nels
+                        err = index2indexes(j, var_rank(i), count, 
+     +                                      index2)
+                        if (err .ne. 0)
+     +                      call error('error in index2indexes 1')
+                        do 11, d = 1, var_rank(i)
+                            index2(d) = index(d) + (index2(d)-1) * 
+     +                                  stride(d)
+11                      continue
+                        expect(j) = hash4(var_type(i), var_rank(i), 
+     +                                    index2, NFT_INT)
+                        if (inRange3(expect(j),var_type(i),
+     +                               NFT_INT)) then
+                            allInIntRange = 
+     +                          allInIntRange .and.
+     +                          in_internal_range(NFT_INT,
+     +                                            expect(j))
+                        else
+                            allInExtRange = .false.
+                        end if
+10                  continue
+                    err = nf_get_varm_int(ncid,i,index,count,
+     +                                   stride,imap,
+     +                                   value)
+                    if (canConvert) then
+                        if (allInExtRange) then
+                            if (allInIntRange) then
+                                if (err .ne. 0)
+     +                              call error(nf_strerror(err))
+                            else
+                                if (err .ne. NF_ERANGE)
+     +                              call errore('Range error: ', err)
+                            end if
+                        else
+                            if (err .ne. 0 .and. err .ne. NF_ERANGE)
+     +                          call errore('OK or Range error: ', err)
+                        end if
+                        do 12, j = 1, nels
+                            if (inRange3(expect(j),var_type(i),
+     +                                   NFT_INT) .and.
+     +                          in_internal_range(NFT_INT,
+     +                                            expect(j))) then
+                                val = value(j)
+                                if (.not.equal(val, expect(j),
+     +                                         var_type(i), 
+     +                                         NFT_INT)) then
+                                    call error(
+     +                                  'value read not that expected')
+                                    if (verbose) then
+                                        call error(' ')
+                                        call errori('varid: ', i)
+                                        call errorc('var_name: ', 
+     +                                          var_name(i))
+                                        call errori('element number: ',
+     +                                              j)
+                                        call errord('expect: ', 
+     +                                              expect(j))
+                                        call errord('got: ', val)
+                                    end if
+                                else
+                                    nok = nok + 1
+                                end if
+                            end if
+12                      continue
+                    else
+                        if (nels .gt. 0 .and. err .ne. NF_ECHAR)
+     +                      call errore('wrong type: ', err)
+                    end if
+7               continue
+5           continue
+1       continue
+        err = nf_close(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_close: ',  err)
+        call print_nok(nok)
+        end
+
+        subroutine test_nf_get_varm_real()
+        implicit        none
+#include "tests.inc"
+        integer ncid
+        integer d
+        integer i
+        integer j
+        integer k
+        integer m
+        integer err
+        logical allInExtRange   
+        logical allInIntRange   
+        integer nels
+        integer nslabs
+        integer nstarts         
+        integer nok             
+        integer start(MAX_RANK)
+        integer edge(MAX_RANK)
+        integer index(MAX_RANK)
+        integer index2(MAX_RANK)
+        integer mid(MAX_RANK)
+        integer count(MAX_RANK)
+        integer sstride(MAX_RANK)
+        integer stride(MAX_RANK)
+        integer imap(MAX_RANK)
+        logical canConvert     
+        real    value(MAX_NELS)
+        doubleprecision expect(MAX_NELS)
+        doubleprecision val
+        integer udshift
+
+        nok = 0
+
+        err = nf_open(testfile, NF_NOWRITE, ncid)
+        if (err .ne. 0)
+     +      call errore('nf_open: ', err)
+        do 1, i = 1, NVARS
+            canConvert = (var_type(i) .eq. NF_CHAR) .eqv. 
+     +                   (NFT_REAL .eq. NFT_TEXT)
+            if (.not.(var_rank(i) .le. MAX_RANK)) stop 2
+            if (.not.(var_nels(i) .le. MAX_NELS)) stop 2
+            do 2, j = 1, var_rank(i)
+                start(j) = 1
+                edge(j) = 1
+                stride(j) = 1
+                imap(j) = 1
+2           continue
+            err = nf_get_varm_real(BAD_ID, i, start, edge,
+     +                           stride, imap, 
+     +                           value)
+            if (err .ne. NF_EBADID)
+     +          call errore('bad ncid: ', err)
+            err = nf_get_varm_real(ncid, BAD_VARID, start,
+     +                           edge, stride, 
+     +                           imap, value)
+            if (err .ne. NF_ENOTVAR)
+     +          call errore('bad var id: ', err)
+            do 3, j = 1, var_rank(i)
+                start(j) = var_shape(j,i) + 1
+                err = nf_get_varm_real(ncid, i, start,
+     +                               edge, stride, 
+     +                               imap, value)
+                if (.not. canConvert) then
+                    if (err .ne. NF_ECHAR)
+     +                  call errore('conversion: ', err)
+                else
+                    if (err .ne. NF_EINVALCOORDS)
+     +                  call errore('bad index: ', err)
+                endif
+                start(j) = 1
+                edge(j) = var_shape(j,i) + 1
+                err = nf_get_varm_real(ncid, i, start,
+     +                               edge, stride, 
+     +                               imap, value)
+                if (.not. canConvert) then
+                    if (err .ne. NF_ECHAR)
+     +                  call errore('conversion: ', err)
+                else
+                    if (err .ne. NF_EEDGE)
+     +                  call errore('bad edge: ', err)
+                endif
+                edge(j) = 1
+                stride(j) = 0
+                err = nf_get_varm_real(ncid, i, start,
+     +                               edge, stride, 
+     +                               imap, value)
+                if (.not. canConvert) then
+                    if (err .ne. NF_ECHAR)
+     +                  call errore('conversion: ', err)
+                else
+                    if (err .ne. NF_ESTRIDE)
+     +                  call errore('bad stride: ', err)
+                endif
+                stride(j) = 1
+3           continue
+C               Choose a random point dividing each dim into 2 parts 
+C               get 2^rank (nslabs) slabs so defined 
+            nslabs = 1
+            do 4, j = 1, var_rank(i)
+                mid(j) = roll( var_shape(j,i) )
+                nslabs = nslabs * 2
+4           continue
+C               /* bits of k determine whether to get lower or upper part 
+C                * of dim
+C                * choose random stride from 1 to edge */
+            do 5, k = 1, nslabs
+                nstarts = 1
+                do 6, j = 1, var_rank(i)
+                    if (mod(udshift((k-1), -(j-1)), 2) .ne. 0) then
+                        start(j) = 1
+                        edge(j) = mid(j)
+                    else
+                        start(j) = 1 + mid(j)
+                        edge(j) = var_shape(j,i) - mid(j)
+                    end if
+                    if (edge(j) .gt. 0) then
+                        stride(j) = 1+roll(edge(j))
+                    else
+                        stride(j) = 1
+                    end if
+                    sstride(j) = stride(j)
+                    nstarts = nstarts * stride(j)
+6               continue
+                do 7, m = 1, nstarts
+                    err = index2indexes(m, var_rank(i), sstride, index)
+                    if (err .ne. 0)
+     +                  call error('error in index2indexes')
+                    nels = 1
+                    do 8, j = 1, var_rank(i)
+                        count(j) = 1 + (edge(j) - index(j)) / 
+     +                                  stride(j)
+                        nels = nels * count(j)
+                        index(j) = index(j) + start(j) - 1
+8                   continue
+C                       Random choice of forward or backward 
+C    /* TODO
+C                   if ( roll(2) ) then
+C                       for (j = 0 j < var_rank(i) j++) {
+C                           index(j) += (count(j) - 1) * stride(j)
+C                           stride(j) = -stride(j)
+C                       }
+C                   end if
+C     */
+                    if (var_rank(i) .gt. 0) then
+                        imap(1) = 1
+                        do 9, j = 2, var_rank(i)
+                            imap(j) = imap(j-1) * count(j-1)
+9                       continue
+                    end if
+                    allInIntRange = .true.
+                    allInExtRange = .true.
+                    do 10, j = 1, nels
+                        err = index2indexes(j, var_rank(i), count, 
+     +                                      index2)
+                        if (err .ne. 0)
+     +                      call error('error in index2indexes 1')
+                        do 11, d = 1, var_rank(i)
+                            index2(d) = index(d) + (index2(d)-1) * 
+     +                                  stride(d)
+11                      continue
+                        expect(j) = hash4(var_type(i), var_rank(i), 
+     +                                    index2, NFT_REAL)
+                        if (inRange3(expect(j),var_type(i),
+     +                               NFT_REAL)) then
+                            allInIntRange = 
+     +                          allInIntRange .and.
+     +                          in_internal_range(NFT_REAL,
+     +                                            expect(j))
+                        else
+                            allInExtRange = .false.
+                        end if
+10                  continue
+                    err = nf_get_varm_real(ncid,i,index,count,
+     +                                   stride,imap,
+     +                                   value)
+                    if (canConvert) then
+                        if (allInExtRange) then
+                            if (allInIntRange) then
+                                if (err .ne. 0)
+     +                              call error(nf_strerror(err))
+                            else
+                                if (err .ne. NF_ERANGE)
+     +                              call errore('Range error: ', err)
+                            end if
+                        else
+                            if (err .ne. 0 .and. err .ne. NF_ERANGE)
+     +                          call errore('OK or Range error: ', err)
+                        end if
+                        do 12, j = 1, nels
+                            if (inRange3(expect(j),var_type(i),
+     +                                   NFT_REAL) .and.
+     +                          in_internal_range(NFT_REAL,
+     +                                            expect(j))) then
+                                val = value(j)
+                                if (.not.equal(val, expect(j),
+     +                                         var_type(i), 
+     +                                         NFT_REAL)) then
+                                    call error(
+     +                                  'value read not that expected')
+                                    if (verbose) then
+                                        call error(' ')
+                                        call errori('varid: ', i)
+                                        call errorc('var_name: ', 
+     +                                          var_name(i))
+                                        call errori('element number: ',
+     +                                              j)
+                                        call errord('expect: ', 
+     +                                              expect(j))
+                                        call errord('got: ', val)
+                                    end if
+                                else
+                                    nok = nok + 1
+                                end if
+                            end if
+12                      continue
+                    else
+                        if (nels .gt. 0 .and. err .ne. NF_ECHAR)
+     +                      call errore('wrong type: ', err)
+                    end if
+7               continue
+5           continue
+1       continue
+        err = nf_close(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_close: ',  err)
+        call print_nok(nok)
+        end
+
+        subroutine test_nf_get_varm_double()
+        implicit        none
+#include "tests.inc"
+        integer ncid
+        integer d
+        integer i
+        integer j
+        integer k
+        integer m
+        integer err
+        logical allInExtRange   
+        logical allInIntRange   
+        integer nels
+        integer nslabs
+        integer nstarts         
+        integer nok             
+        integer start(MAX_RANK)
+        integer edge(MAX_RANK)
+        integer index(MAX_RANK)
+        integer index2(MAX_RANK)
+        integer mid(MAX_RANK)
+        integer count(MAX_RANK)
+        integer sstride(MAX_RANK)
+        integer stride(MAX_RANK)
+        integer imap(MAX_RANK)
+        logical canConvert     
+        doubleprecision    value(MAX_NELS)
+        doubleprecision expect(MAX_NELS)
+        doubleprecision val
+        integer udshift
+
+        nok = 0
+
+        err = nf_open(testfile, NF_NOWRITE, ncid)
+        if (err .ne. 0)
+     +      call errore('nf_open: ', err)
+        do 1, i = 1, NVARS
+            canConvert = (var_type(i) .eq. NF_CHAR) .eqv. 
+     +                   (NFT_DOUBLE .eq. NFT_TEXT)
+            if (.not.(var_rank(i) .le. MAX_RANK)) stop 2
+            if (.not.(var_nels(i) .le. MAX_NELS)) stop 2
+            do 2, j = 1, var_rank(i)
+                start(j) = 1
+                edge(j) = 1
+                stride(j) = 1
+                imap(j) = 1
+2           continue
+            err = nf_get_varm_double(BAD_ID, i, start, edge,
+     +                           stride, imap, 
+     +                           value)
+            if (err .ne. NF_EBADID)
+     +          call errore('bad ncid: ', err)
+            err = nf_get_varm_double(ncid, BAD_VARID, start,
+     +                           edge, stride, 
+     +                           imap, value)
+            if (err .ne. NF_ENOTVAR)
+     +          call errore('bad var id: ', err)
+            do 3, j = 1, var_rank(i)
+                start(j) = var_shape(j,i) + 1
+                err = nf_get_varm_double(ncid, i, start,
+     +                               edge, stride, 
+     +                               imap, value)
+                if (.not. canConvert) then
+                    if (err .ne. NF_ECHAR)
+     +                  call errore('conversion: ', err)
+                else
+                    if (err .ne. NF_EINVALCOORDS)
+     +                  call errore('bad index: ', err)
+                endif
+                start(j) = 1
+                edge(j) = var_shape(j,i) + 1
+                err = nf_get_varm_double(ncid, i, start,
+     +                               edge, stride, 
+     +                               imap, value)
+                if (.not. canConvert) then
+                    if (err .ne. NF_ECHAR)
+     +                  call errore('conversion: ', err)
+                else
+                    if (err .ne. NF_EEDGE)
+     +                  call errore('bad edge: ', err)
+                endif
+                edge(j) = 1
+                stride(j) = 0
+                err = nf_get_varm_double(ncid, i, start,
+     +                               edge, stride, 
+     +                               imap, value)
+                if (.not. canConvert) then
+                    if (err .ne. NF_ECHAR)
+     +                  call errore('conversion: ', err)
+                else
+                    if (err .ne. NF_ESTRIDE)
+     +                  call errore('bad stride: ', err)
+                endif
+                stride(j) = 1
+3           continue
+C               Choose a random point dividing each dim into 2 parts 
+C               get 2^rank (nslabs) slabs so defined 
+            nslabs = 1
+            do 4, j = 1, var_rank(i)
+                mid(j) = roll( var_shape(j,i) )
+                nslabs = nslabs * 2
+4           continue
+C               /* bits of k determine whether to get lower or upper part 
+C                * of dim
+C                * choose random stride from 1 to edge */
+            do 5, k = 1, nslabs
+                nstarts = 1
+                do 6, j = 1, var_rank(i)
+                    if (mod(udshift((k-1), -(j-1)), 2) .ne. 0) then
+                        start(j) = 1
+                        edge(j) = mid(j)
+                    else
+                        start(j) = 1 + mid(j)
+                        edge(j) = var_shape(j,i) - mid(j)
+                    end if
+                    if (edge(j) .gt. 0) then
+                        stride(j) = 1+roll(edge(j))
+                    else
+                        stride(j) = 1
+                    end if
+                    sstride(j) = stride(j)
+                    nstarts = nstarts * stride(j)
+6               continue
+                do 7, m = 1, nstarts
+                    err = index2indexes(m, var_rank(i), sstride, index)
+                    if (err .ne. 0)
+     +                  call error('error in index2indexes')
+                    nels = 1
+                    do 8, j = 1, var_rank(i)
+                        count(j) = 1 + (edge(j) - index(j)) / 
+     +                                  stride(j)
+                        nels = nels * count(j)
+                        index(j) = index(j) + start(j) - 1
+8                   continue
+C                       Random choice of forward or backward 
+C    /* TODO
+C                   if ( roll(2) ) then
+C                       for (j = 0 j < var_rank(i) j++) {
+C                           index(j) += (count(j) - 1) * stride(j)
+C                           stride(j) = -stride(j)
+C                       }
+C                   end if
+C     */
+                    if (var_rank(i) .gt. 0) then
+                        imap(1) = 1
+                        do 9, j = 2, var_rank(i)
+                            imap(j) = imap(j-1) * count(j-1)
+9                       continue
+                    end if
+                    allInIntRange = .true.
+                    allInExtRange = .true.
+                    do 10, j = 1, nels
+                        err = index2indexes(j, var_rank(i), count, 
+     +                                      index2)
+                        if (err .ne. 0)
+     +                      call error('error in index2indexes 1')
+                        do 11, d = 1, var_rank(i)
+                            index2(d) = index(d) + (index2(d)-1) * 
+     +                                  stride(d)
+11                      continue
+                        expect(j) = hash4(var_type(i), var_rank(i), 
+     +                                    index2, NFT_DOUBLE)
+                        if (inRange3(expect(j),var_type(i),
+     +                               NFT_DOUBLE)) then
+                            allInIntRange = 
+     +                          allInIntRange .and.
+     +                          in_internal_range(NFT_DOUBLE,
+     +                                            expect(j))
+                        else
+                            allInExtRange = .false.
+                        end if
+10                  continue
+                    err = nf_get_varm_double(ncid,i,index,count,
+     +                                   stride,imap,
+     +                                   value)
+                    if (canConvert) then
+                        if (allInExtRange) then
+                            if (allInIntRange) then
+                                if (err .ne. 0)
+     +                              call error(nf_strerror(err))
+                            else
+                                if (err .ne. NF_ERANGE)
+     +                              call errore('Range error: ', err)
+                            end if
+                        else
+                            if (err .ne. 0 .and. err .ne. NF_ERANGE)
+     +                          call errore('OK or Range error: ', err)
+                        end if
+                        do 12, j = 1, nels
+                            if (inRange3(expect(j),var_type(i),
+     +                                   NFT_DOUBLE) .and.
+     +                          in_internal_range(NFT_DOUBLE,
+     +                                            expect(j))) then
+                                val = value(j)
+                                if (.not.equal(val, expect(j),
+     +                                         var_type(i), 
+     +                                         NFT_DOUBLE)) then
+                                    call error(
+     +                                  'value read not that expected')
+                                    if (verbose) then
+                                        call error(' ')
+                                        call errori('varid: ', i)
+                                        call errorc('var_name: ', 
+     +                                          var_name(i))
+                                        call errori('element number: ',
+     +                                              j)
+                                        call errord('expect: ', 
+     +                                              expect(j))
+                                        call errord('got: ', val)
+                                    end if
+                                else
+                                    nok = nok + 1
+                                end if
+                            end if
+12                      continue
+                    else
+                        if (nels .gt. 0 .and. err .ne. NF_ECHAR)
+     +                      call errore('wrong type: ', err)
+                    end if
+7               continue
+5           continue
+1       continue
+        err = nf_close(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_close: ',  err)
+        call print_nok(nok)
+        end
+
+
+        subroutine test_nf_get_att_text()
+        implicit        none
+#include "tests.inc"
+        integer ncid
+        integer i
+        integer j
+        integer k
+        integer err
+        integer ndx(1)
+        logical allInExtRange
+        logical allInIntRange
+        logical canConvert     
+        character    value(MAX_NELS)
+        doubleprecision expect(MAX_NELS)
+        integer nok             
+        doubleprecision val
+
+        nok = 0
+
+        err = nf_open(testfile, NF_NOWRITE, ncid)
+        if (err .ne. 0) 
+     +      call errore('nf_open: ', err)
+
+        do 1, i = 0, NVARS
+            do 2, j = 1, NATTS(i)
+                canConvert = (ATT_TYPE(j,i) .eq. NF_CHAR) .eqv.
+     +                       (NFT_TEXT .eq. NFT_TEXT)
+                err = nf_get_att_text(BAD_ID, i,
+     +                  ATT_NAME(j,i), 
+     +                  value)
+                if (err .ne. NF_EBADID) 
+     +              call errore('bad ncid: ', err)
+                err = nf_get_att_text(ncid, BAD_VARID, 
+     +                              ATT_NAME(j,i), 
+     +                              value)
+                if (err .ne. NF_ENOTVAR) 
+     +              call errore('bad var id: ', err)
+                err = nf_get_att_text(ncid, i, 'noSuch', value)
+                if (err .ne. NF_ENOTATT) 
+     +              call errore('Bad attribute name: ', err)
+                allInIntRange = .true.
+                allInExtRange = .true.
+                do 3, k = 1, ATT_LEN(j,i)
+                    ndx(1) = k
+                    expect(k) = hash4(ATT_TYPE(j,i), -1, ndx, 
+     +                                NFT_TEXT)
+                    if (inRange3(expect(k),ATT_TYPE(j,i),
+     +                           NFT_TEXT)) then
+                        allInIntRange = 
+     +                      allInIntRange .and.
+     +                      in_internal_range(NFT_TEXT, expect(k))
+                    else
+                        allInExtRange = .false.
+                    end if
+3               continue
+                err = nf_get_att_text(ncid, i, ATT_NAME(j,i), value)
+                if (canConvert .or. ATT_LEN(j,i) .eq. 0) then
+                    if (allInExtRange) then
+                        if (allInIntRange) then
+                            if (err .ne. 0)
+     +                          call errore('nf_get_att_text: ', err)
+                        else
+                            if (err .ne. NF_ERANGE)
+     +                          call errore('Range error: ', err)
+                        end if
+                    else
+                        if (err .ne. 0 .and. err .ne. NF_ERANGE)
+     +                      call errore('OK or Range error: ',
+     +                                  err)
+                    end if
+                    do 4, k = 1, ATT_LEN(j,i)
+                        if (inRange3(expect(k),ATT_TYPE(j,i),
+     +                               NFT_TEXT) .and.
+     +                      in_internal_range(NFT_TEXT,
+     +                                        expect(k))) then
+                            val = ichar(value(k))
+                            if (.not.equal(val, expect(k),
+     +                                     ATT_TYPE(j,i), 
+     +                                     NFT_TEXT))then
+                                call error(
+     +                              'value read not that expected')
+                                if (verbose) then
+                                    call error(' ')
+                                    call errori('varid: ', i)
+                                    call errorc('att_name: ', 
+     +                                  ATT_NAME(j,i))
+                                    call errori('element number: ', k)
+                                    call errord('expect: ', expect(k))
+                                    call errord('got: ', val)
+                                end if
+                            else
+                                nok = nok + 1
+                            end if
+                        end if
+4                   continue
+                else
+                    if (err .ne. NF_ECHAR)
+     +                  call errore('wrong type: ', err)
+                end if
+2           continue
+1       continue
+
+        err = nf_close(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_close: ', err)
+        call print_nok(nok)
+        end
+
+#ifdef NF_INT1_T
+        subroutine test_nf_get_att_int1()
+        implicit        none
+#include "tests.inc"
+        integer ncid
+        integer i
+        integer j
+        integer k
+        integer err
+        integer ndx(1)
+        logical allInExtRange
+        logical allInIntRange
+        logical canConvert     
+        NF_INT1_T    value(MAX_NELS)
+        doubleprecision expect(MAX_NELS)
+        integer nok             
+        doubleprecision val
+
+        nok = 0
+
+        err = nf_open(testfile, NF_NOWRITE, ncid)
+        if (err .ne. 0) 
+     +      call errore('nf_open: ', err)
+
+        do 1, i = 0, NVARS
+            do 2, j = 1, NATTS(i)
+                canConvert = (ATT_TYPE(j,i) .eq. NF_CHAR) .eqv.
+     +                       (NFT_INT1 .eq. NFT_TEXT)
+                err = nf_get_att_int1(BAD_ID, i,
+     +                  ATT_NAME(j,i), 
+     +                  value)
+                if (err .ne. NF_EBADID) 
+     +              call errore('bad ncid: ', err)
+                err = nf_get_att_int1(ncid, BAD_VARID, 
+     +                              ATT_NAME(j,i), 
+     +                              value)
+                if (err .ne. NF_ENOTVAR) 
+     +              call errore('bad var id: ', err)
+                err = nf_get_att_int1(ncid, i, 'noSuch', value)
+                if (err .ne. NF_ENOTATT) 
+     +              call errore('Bad attribute name: ', err)
+                allInIntRange = .true.
+                allInExtRange = .true.
+                do 3, k = 1, ATT_LEN(j,i)
+                    ndx(1) = k
+                    expect(k) = hash4(ATT_TYPE(j,i), -1, ndx, 
+     +                                NFT_INT1)
+                    if (inRange3(expect(k),ATT_TYPE(j,i),
+     +                           NFT_INT1)) then
+                        allInIntRange = 
+     +                      allInIntRange .and.
+     +                      in_internal_range(NFT_INT1, expect(k))
+                    else
+                        allInExtRange = .false.
+                    end if
+3               continue
+                err = nf_get_att_int1(ncid, i, ATT_NAME(j,i), value)
+                if (canConvert .or. ATT_LEN(j,i) .eq. 0) then
+                    if (allInExtRange) then
+                        if (allInIntRange) then
+                            if (err .ne. 0)
+     +                          call errore('nf_get_att_int1: ', err)
+                        else
+                            if (err .ne. NF_ERANGE)
+     +                          call errore('Range error: ', err)
+                        end if
+                    else
+                        if (err .ne. 0 .and. err .ne. NF_ERANGE)
+     +                      call errore('OK or Range error: ',
+     +                                  err)
+                    end if
+                    do 4, k = 1, ATT_LEN(j,i)
+                        if (inRange3(expect(k),ATT_TYPE(j,i),
+     +                               NFT_INT1) .and.
+     +                      in_internal_range(NFT_INT1,
+     +                                        expect(k))) then
+                            val = value(k)
+                            if (.not.equal(val, expect(k),
+     +                                     ATT_TYPE(j,i), 
+     +                                     NFT_INT1))then
+                                call error(
+     +                              'value read not that expected')
+                                if (verbose) then
+                                    call error(' ')
+                                    call errori('varid: ', i)
+                                    call errorc('att_name: ', 
+     +                                  ATT_NAME(j,i))
+                                    call errori('element number: ', k)
+                                    call errord('expect: ', expect(k))
+                                    call errord('got: ', val)
+                                end if
+                            else
+                                nok = nok + 1
+                            end if
+                        end if
+4                   continue
+                else
+                    if (err .ne. NF_ECHAR)
+     +                  call errore('wrong type: ', err)
+                end if
+2           continue
+1       continue
+
+        err = nf_close(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_close: ', err)
+        call print_nok(nok)
+        end
+
+#endif
+#ifdef NF_INT2_T
+        subroutine test_nf_get_att_int2()
+        implicit        none
+#include "tests.inc"
+        integer ncid
+        integer i
+        integer j
+        integer k
+        integer err
+        integer ndx(1)
+        logical allInExtRange
+        logical allInIntRange
+        logical canConvert     
+        NF_INT2_T    value(MAX_NELS)
+        doubleprecision expect(MAX_NELS)
+        integer nok             
+        doubleprecision val
+
+        nok = 0
+
+        err = nf_open(testfile, NF_NOWRITE, ncid)
+        if (err .ne. 0) 
+     +      call errore('nf_open: ', err)
+
+        do 1, i = 0, NVARS
+            do 2, j = 1, NATTS(i)
+                canConvert = (ATT_TYPE(j,i) .eq. NF_CHAR) .eqv.
+     +                       (NFT_INT2 .eq. NFT_TEXT)
+                err = nf_get_att_int2(BAD_ID, i,
+     +                  ATT_NAME(j,i), 
+     +                  value)
+                if (err .ne. NF_EBADID) 
+     +              call errore('bad ncid: ', err)
+                err = nf_get_att_int2(ncid, BAD_VARID, 
+     +                              ATT_NAME(j,i), 
+     +                              value)
+                if (err .ne. NF_ENOTVAR) 
+     +              call errore('bad var id: ', err)
+                err = nf_get_att_int2(ncid, i, 'noSuch', value)
+                if (err .ne. NF_ENOTATT) 
+     +              call errore('Bad attribute name: ', err)
+                allInIntRange = .true.
+                allInExtRange = .true.
+                do 3, k = 1, ATT_LEN(j,i)
+                    ndx(1) = k
+                    expect(k) = hash4(ATT_TYPE(j,i), -1, ndx, 
+     +                                NFT_INT2)
+                    if (inRange3(expect(k),ATT_TYPE(j,i),
+     +                           NFT_INT2)) then
+                        allInIntRange = 
+     +                      allInIntRange .and.
+     +                      in_internal_range(NFT_INT2, expect(k))
+                    else
+                        allInExtRange = .false.
+                    end if
+3               continue
+                err = nf_get_att_int2(ncid, i, ATT_NAME(j,i), value)
+                if (canConvert .or. ATT_LEN(j,i) .eq. 0) then
+                    if (allInExtRange) then
+                        if (allInIntRange) then
+                            if (err .ne. 0)
+     +                          call errore('nf_get_att_int2: ', err)
+                        else
+                            if (err .ne. NF_ERANGE)
+     +                          call errore('Range error: ', err)
+                        end if
+                    else
+                        if (err .ne. 0 .and. err .ne. NF_ERANGE)
+     +                      call errore('OK or Range error: ',
+     +                                  err)
+                    end if
+                    do 4, k = 1, ATT_LEN(j,i)
+                        if (inRange3(expect(k),ATT_TYPE(j,i),
+     +                               NFT_INT2) .and.
+     +                      in_internal_range(NFT_INT2,
+     +                                        expect(k))) then
+                            val = value(k)
+                            if (.not.equal(val, expect(k),
+     +                                     ATT_TYPE(j,i), 
+     +                                     NFT_INT2))then
+                                call error(
+     +                              'value read not that expected')
+                                if (verbose) then
+                                    call error(' ')
+                                    call errori('varid: ', i)
+                                    call errorc('att_name: ', 
+     +                                  ATT_NAME(j,i))
+                                    call errori('element number: ', k)
+                                    call errord('expect: ', expect(k))
+                                    call errord('got: ', val)
+                                end if
+                            else
+                                nok = nok + 1
+                            end if
+                        end if
+4                   continue
+                else
+                    if (err .ne. NF_ECHAR)
+     +                  call errore('wrong type: ', err)
+                end if
+2           continue
+1       continue
+
+        err = nf_close(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_close: ', err)
+        call print_nok(nok)
+        end
+
+#endif
+        subroutine test_nf_get_att_int()
+        implicit        none
+#include "tests.inc"
+        integer ncid
+        integer i
+        integer j
+        integer k
+        integer err
+        integer ndx(1)
+        logical allInExtRange
+        logical allInIntRange
+        logical canConvert     
+        integer    value(MAX_NELS)
+        doubleprecision expect(MAX_NELS)
+        integer nok             
+        doubleprecision val
+
+        nok = 0
+
+        err = nf_open(testfile, NF_NOWRITE, ncid)
+        if (err .ne. 0) 
+     +      call errore('nf_open: ', err)
+
+        do 1, i = 0, NVARS
+            do 2, j = 1, NATTS(i)
+                canConvert = (ATT_TYPE(j,i) .eq. NF_CHAR) .eqv.
+     +                       (NFT_INT .eq. NFT_TEXT)
+                err = nf_get_att_int(BAD_ID, i,
+     +                  ATT_NAME(j,i), 
+     +                  value)
+                if (err .ne. NF_EBADID) 
+     +              call errore('bad ncid: ', err)
+                err = nf_get_att_int(ncid, BAD_VARID, 
+     +                              ATT_NAME(j,i), 
+     +                              value)
+                if (err .ne. NF_ENOTVAR) 
+     +              call errore('bad var id: ', err)
+                err = nf_get_att_int(ncid, i, 'noSuch', value)
+                if (err .ne. NF_ENOTATT) 
+     +              call errore('Bad attribute name: ', err)
+                allInIntRange = .true.
+                allInExtRange = .true.
+                do 3, k = 1, ATT_LEN(j,i)
+                    ndx(1) = k
+                    expect(k) = hash4(ATT_TYPE(j,i), -1, ndx, 
+     +                                NFT_INT)
+                    if (inRange3(expect(k),ATT_TYPE(j,i),
+     +                           NFT_INT)) then
+                        allInIntRange = 
+     +                      allInIntRange .and.
+     +                      in_internal_range(NFT_INT, expect(k))
+                    else
+                        allInExtRange = .false.
+                    end if
+3               continue
+                err = nf_get_att_int(ncid, i, ATT_NAME(j,i), value)
+                if (canConvert .or. ATT_LEN(j,i) .eq. 0) then
+                    if (allInExtRange) then
+                        if (allInIntRange) then
+                            if (err .ne. 0)
+     +                          call errore('nf_get_att_int: ', err)
+                        else
+                            if (err .ne. NF_ERANGE)
+     +                          call errore('Range error: ', err)
+                        end if
+                    else
+                        if (err .ne. 0 .and. err .ne. NF_ERANGE)
+     +                      call errore('OK or Range error: ',
+     +                                  err)
+                    end if
+                    do 4, k = 1, ATT_LEN(j,i)
+                        if (inRange3(expect(k),ATT_TYPE(j,i),
+     +                               NFT_INT) .and.
+     +                      in_internal_range(NFT_INT,
+     +                                        expect(k))) then
+                            val = value(k)
+                            if (.not.equal(val, expect(k),
+     +                                     ATT_TYPE(j,i), 
+     +                                     NFT_INT))then
+                                call error(
+     +                              'value read not that expected')
+                                if (verbose) then
+                                    call error(' ')
+                                    call errori('varid: ', i)
+                                    call errorc('att_name: ', 
+     +                                  ATT_NAME(j,i))
+                                    call errori('element number: ', k)
+                                    call errord('expect: ', expect(k))
+                                    call errord('got: ', val)
+                                end if
+                            else
+                                nok = nok + 1
+                            end if
+                        end if
+4                   continue
+                else
+                    if (err .ne. NF_ECHAR)
+     +                  call errore('wrong type: ', err)
+                end if
+2           continue
+1       continue
+
+        err = nf_close(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_close: ', err)
+        call print_nok(nok)
+        end
+
+        subroutine test_nf_get_att_real()
+        implicit        none
+#include "tests.inc"
+        integer ncid
+        integer i
+        integer j
+        integer k
+        integer err
+        integer ndx(1)
+        logical allInExtRange
+        logical allInIntRange
+        logical canConvert     
+        real    value(MAX_NELS)
+        doubleprecision expect(MAX_NELS)
+        integer nok             
+        doubleprecision val
+
+        nok = 0
+
+        err = nf_open(testfile, NF_NOWRITE, ncid)
+        if (err .ne. 0) 
+     +      call errore('nf_open: ', err)
+
+        do 1, i = 0, NVARS
+            do 2, j = 1, NATTS(i)
+                canConvert = (ATT_TYPE(j,i) .eq. NF_CHAR) .eqv.
+     +                       (NFT_REAL .eq. NFT_TEXT)
+                err = nf_get_att_real(BAD_ID, i,
+     +                  ATT_NAME(j,i), 
+     +                  value)
+                if (err .ne. NF_EBADID) 
+     +              call errore('bad ncid: ', err)
+                err = nf_get_att_real(ncid, BAD_VARID, 
+     +                              ATT_NAME(j,i), 
+     +                              value)
+                if (err .ne. NF_ENOTVAR) 
+     +              call errore('bad var id: ', err)
+                err = nf_get_att_real(ncid, i, 'noSuch', value)
+                if (err .ne. NF_ENOTATT) 
+     +              call errore('Bad attribute name: ', err)
+                allInIntRange = .true.
+                allInExtRange = .true.
+                do 3, k = 1, ATT_LEN(j,i)
+                    ndx(1) = k
+                    expect(k) = hash4(ATT_TYPE(j,i), -1, ndx, 
+     +                                NFT_REAL)
+                    if (inRange3(expect(k),ATT_TYPE(j,i),
+     +                           NFT_REAL)) then
+                        allInIntRange = 
+     +                      allInIntRange .and.
+     +                      in_internal_range(NFT_REAL, expect(k))
+                    else
+                        allInExtRange = .false.
+                    end if
+3               continue
+                err = nf_get_att_real(ncid, i, ATT_NAME(j,i), value)
+                if (canConvert .or. ATT_LEN(j,i) .eq. 0) then
+                    if (allInExtRange) then
+                        if (allInIntRange) then
+                            if (err .ne. 0)
+     +                          call errore('nf_get_att_real: ', err)
+                        else
+                            if (err .ne. NF_ERANGE)
+     +                          call errore('Range error: ', err)
+                        end if
+                    else
+                        if (err .ne. 0 .and. err .ne. NF_ERANGE)
+     +                      call errore('OK or Range error: ',
+     +                                  err)
+                    end if
+                    do 4, k = 1, ATT_LEN(j,i)
+                        if (inRange3(expect(k),ATT_TYPE(j,i),
+     +                               NFT_REAL) .and.
+     +                      in_internal_range(NFT_REAL,
+     +                                        expect(k))) then
+                            val = value(k)
+                            if (.not.equal(val, expect(k),
+     +                                     ATT_TYPE(j,i), 
+     +                                     NFT_REAL))then
+                                call error(
+     +                              'value read not that expected')
+                                if (verbose) then
+                                    call error(' ')
+                                    call errori('varid: ', i)
+                                    call errorc('att_name: ', 
+     +                                  ATT_NAME(j,i))
+                                    call errori('element number: ', k)
+                                    call errord('expect: ', expect(k))
+                                    call errord('got: ', val)
+                                end if
+                            else
+                                nok = nok + 1
+                            end if
+                        end if
+4                   continue
+                else
+                    if (err .ne. NF_ECHAR)
+     +                  call errore('wrong type: ', err)
+                end if
+2           continue
+1       continue
+
+        err = nf_close(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_close: ', err)
+        call print_nok(nok)
+        end
+
+        subroutine test_nf_get_att_double()
+        implicit        none
+#include "tests.inc"
+        integer ncid
+        integer i
+        integer j
+        integer k
+        integer err
+        integer ndx(1)
+        logical allInExtRange
+        logical allInIntRange
+        logical canConvert     
+        doubleprecision    value(MAX_NELS)
+        doubleprecision expect(MAX_NELS)
+        integer nok             
+        doubleprecision val
+
+        nok = 0
+
+        err = nf_open(testfile, NF_NOWRITE, ncid)
+        if (err .ne. 0) 
+     +      call errore('nf_open: ', err)
+
+        do 1, i = 0, NVARS
+            do 2, j = 1, NATTS(i)
+                canConvert = (ATT_TYPE(j,i) .eq. NF_CHAR) .eqv.
+     +                       (NFT_DOUBLE .eq. NFT_TEXT)
+                err = nf_get_att_double(BAD_ID, i,
+     +                  ATT_NAME(j,i), 
+     +                  value)
+                if (err .ne. NF_EBADID) 
+     +              call errore('bad ncid: ', err)
+                err = nf_get_att_double(ncid, BAD_VARID, 
+     +                              ATT_NAME(j,i), 
+     +                              value)
+                if (err .ne. NF_ENOTVAR) 
+     +              call errore('bad var id: ', err)
+                err = nf_get_att_double(ncid, i, 'noSuch', value)
+                if (err .ne. NF_ENOTATT) 
+     +              call errore('Bad attribute name: ', err)
+                allInIntRange = .true.
+                allInExtRange = .true.
+                do 3, k = 1, ATT_LEN(j,i)
+                    ndx(1) = k
+                    expect(k) = hash4(ATT_TYPE(j,i), -1, ndx, 
+     +                                NFT_DOUBLE)
+                    if (inRange3(expect(k),ATT_TYPE(j,i),
+     +                           NFT_DOUBLE)) then
+                        allInIntRange = 
+     +                      allInIntRange .and.
+     +                      in_internal_range(NFT_DOUBLE, expect(k))
+                    else
+                        allInExtRange = .false.
+                    end if
+3               continue
+                err = nf_get_att_double(ncid, i, ATT_NAME(j,i), value)
+                if (canConvert .or. ATT_LEN(j,i) .eq. 0) then
+                    if (allInExtRange) then
+                        if (allInIntRange) then
+                            if (err .ne. 0)
+     +                          call errore('nf_get_att_double: ', err)
+                        else
+                            if (err .ne. NF_ERANGE)
+     +                          call errore('Range error: ', err)
+                        end if
+                    else
+                        if (err .ne. 0 .and. err .ne. NF_ERANGE)
+     +                      call errore('OK or Range error: ',
+     +                                  err)
+                    end if
+                    do 4, k = 1, ATT_LEN(j,i)
+                        if (inRange3(expect(k),ATT_TYPE(j,i),
+     +                               NFT_DOUBLE) .and.
+     +                      in_internal_range(NFT_DOUBLE,
+     +                                        expect(k))) then
+                            val = value(k)
+                            if (.not.equal(val, expect(k),
+     +                                     ATT_TYPE(j,i), 
+     +                                     NFT_DOUBLE))then
+                                call error(
+     +                              'value read not that expected')
+                                if (verbose) then
+                                    call error(' ')
+                                    call errori('varid: ', i)
+                                    call errorc('att_name: ', 
+     +                                  ATT_NAME(j,i))
+                                    call errori('element number: ', k)
+                                    call errord('expect: ', expect(k))
+                                    call errord('got: ', val)
+                                end if
+                            else
+                                nok = nok + 1
+                            end if
+                        end if
+4                   continue
+                else
+                    if (err .ne. NF_ECHAR)
+     +                  call errore('wrong type: ', err)
+                end if
+2           continue
+1       continue
+
+        err = nf_close(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_close: ', err)
+        call print_nok(nok)
+        end
+
diff --git a/nf_test/test_get.m4 b/nf_test/test_get.m4
new file mode 100644
index 0000000..ee7421f
--- /dev/null
+++ b/nf_test/test_get.m4
@@ -0,0 +1,1073 @@
+divert(-1)
+
+dnl This is m4 source.
+dnl Process using m4 to produce FORTRAN language file.
+
+changequote([,])
+
+undefine([index])dnl
+
+dnl Macros
+
+dnl Upcase(str)
+dnl
+define([Upcase],[dnl
+translit($1, abcdefghijklmnopqrstuvwxyz, ABCDEFGHIJKLMNOPQRSTUVWXYZ)])
+
+dnl NFT_ITYPE(type)
+dnl
+define([NFT_ITYPE], [NFT_[]Upcase($1)])
+
+dnl ARITH(itype, value)
+dnl
+define([ARITH], [ifelse($1, text, ichar($2), $2)])
+
+dnl  DATATYPE(funf_suffix)
+dnl
+define([DATATYPE], [dnl
+ifelse($1, text, character,
+ifelse($1, int1, NF_INT1_T,
+ifelse($1, int2, NF_INT2_T,
+ifelse($1, int, integer,
+ifelse($1, real, real,
+ifelse($1, double, doubleprecision)[]dnl
+)[]dnl
+)[]dnl
+)[]dnl
+)[]dnl
+)[]dnl
+])
+
+dnl TEST_NF_GET_VAR1(TYPE)
+dnl
+define([TEST_NF_GET_VAR1],[dnl
+        subroutine test_nf_get_var1_$1()
+        implicit        none
+#include "tests.inc"
+        integer ncid
+        integer i
+        integer j
+        integer err
+        integer nok      
+        integer index(MAX_RANK)
+        doubleprecision expect
+        logical canConvert     
+        DATATYPE($1)    value
+        doubleprecision val
+
+        nok = 0
+
+        err = nf_open(testfile, NF_NOWRITE, ncid)
+        if (err .ne. 0)
+     +      call errore('nf_open: ', err)
+        do 1, i = 1, NVARS
+            canConvert = (var_type(i) .eq. NF_CHAR) .eqv.
+     +                   (NFT_ITYPE($1) .eq. NFT_TEXT)
+            do 2, j = 1, var_rank(i)
+                index(j) = 1
+2           continue
+            err = nf_get_var1_$1(BAD_ID, i, index, value)
+            if (err .ne. NF_EBADID)
+     +          call errore('bad ncid: ', err)
+            err = nf_get_var1_$1(ncid, BAD_VARID,
+     +                  index, value)
+            if (err .ne. NF_ENOTVAR)
+     +          call errore('bad var id: ', err)
+            do 3, j = 1, var_rank(i)
+                index(j) = var_shape(j,i) + 1
+                err = nf_get_var1_$1(ncid, i, index, value)
+                if (.not. canConvert) then
+                    if (err .ne. NF_ECHAR)
+     +                  call errore('conversion: ', err)
+                else
+                    if (err .ne. NF_EINVALCOORDS)
+     +                  call errore('bad index: ', err)
+                endif
+                index(j) = 1
+3           continue
+            do 4, j = 1, var_nels(i)
+                err = index2indexes(j, var_rank(i), var_shape(1,i), 
+     +                              index)
+                if (err .ne. 0)
+     +              call error('error in index2indexes 1')
+                expect = hash4( var_type(i), var_rank(i), index, 
+     +                          NFT_ITYPE($1) )
+                err = nf_get_var1_$1(ncid, i, index,
+     +                          value)
+                if (canConvert) then
+                    if (inRange3(expect,var_type(i), 
+     +                           NFT_ITYPE($1))) then
+                        if (in_internal_range(NFT_ITYPE($1),
+     +                                        expect)) then
+                            if (err .ne. 0) then
+                                call errore('nf_get_var: ', err)
+                            else
+                                val = ARITH($1, value)
+                                if (.not. equal(val, expect, 
+     +                                          var_type(i), 
+     +                                          NFT_ITYPE($1))) then
+                                    call errord('unexpected: ', val)
+                                else
+                                    nok = nok + 1
+                                end if
+                            end if
+                        else
+                            if (err .ne. NF_ERANGE)
+     +                          call errore('Range error: ', err)
+                        end if
+                    else
+                        if (err .ne. 0  .and. err .ne. NF_ERANGE)
+     +                      call errore('OK or Range error: ', err)
+                    end if
+                else
+                    if (err .ne. NF_ECHAR)
+     +                  call errore('wrong type: ', err)
+                end if
+4           continue
+1       continue
+        err = nf_close(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_close: ',  err)
+        call print_nok(nok)
+        end
+])
+
+dnl TEST_NF_GET_VAR(TYPE)
+dnl
+define([TEST_NF_GET_VAR],[dnl
+        subroutine test_nf_get_var_$1()
+        implicit        none
+#include "tests.inc"
+        integer ncid
+        integer i
+        integer j
+        integer err
+        logical allInExtRange   
+        logical allInIntRange   
+        integer nels
+        integer nok      
+        integer index(MAX_RANK)
+        doubleprecision expect(MAX_NELS)
+        logical canConvert     
+        DATATYPE($1)    value(MAX_NELS)
+        doubleprecision val
+
+        nok = 0
+
+        err = nf_open(testfile, NF_NOWRITE, ncid)
+        if (err .ne. 0)
+     +      call errore('nf_open: ', err)
+        do 1, i = 1, NVARS
+            canConvert = (var_type(i) .eq. NF_CHAR) .eqv.
+     +                   (NFT_ITYPE($1) .eq. NFT_TEXT)
+            err = nf_get_var_$1(BAD_ID, i, value)
+            if (err .ne. NF_EBADID)
+     +          call errore('bad ncid: ', err)
+            err = nf_get_var_$1(ncid, BAD_VARID, value)
+            if (err .ne. NF_ENOTVAR)
+     +          call errore('bad var id: ', err)
+            nels = 1
+            do 3, j = 1, var_rank(i)
+                nels = nels * var_shape(j,i)
+3           continue
+            allInExtRange = .true.
+            allInIntRange = .true.
+            do 4, j = 1, var_nels(i)
+                err = index2indexes(j, var_rank(i), var_shape(1,i), 
+     +                              index)
+                if (err .ne. 0)
+     +              call error('error in index2indexes 1')
+                expect(j) = hash4( var_type(i), var_rank(i), index, 
+     +                          NFT_ITYPE($1) )
+                if (inRange3(expect(j),var_type(i), NFT_ITYPE($1))) then
+                    allInIntRange = allInIntRange .and.
+     +                  in_internal_range(NFT_ITYPE($1), expect(j))
+                else
+                    allInExtRange = .false.
+                end if
+4           continue
+            err = nf_get_var_$1(ncid, i, value)
+            if (canConvert) then
+                if (allInExtRange) then
+                    if (allInIntRange) then
+                        if (err .ne. 0) 
+     +                      call errore('nf_get_var: ', err)
+                    else
+                        if (err .ne. NF_ERANGE)
+     +                      call errore('Range error: ', err)
+                    endif
+                else
+                    if (err .ne. 0  .and. err .ne. NF_ERANGE)
+     +                  call errore('Range error: ', err)
+                endif
+                do 5, j = 1, var_nels(i)
+                    if (inRange3(expect(j),var_type(i),
+     +                           NFT_ITYPE($1)) .and.
+     +                  in_internal_range(NFT_ITYPE($1),
+     +                                          expect(j))) then
+                        val = ARITH($1, value(j))
+                        if (.not. equal(val, expect(j), 
+     +                                  var_type(i), 
+     +                                  NFT_ITYPE($1))) then
+                            call errord('unexpected: ', val)
+                        else
+                            nok = nok + 1
+                        end if
+                    endif
+5               continue
+            else
+                if (err .ne. NF_ECHAR)
+     +                  call errore('wrong type: ', err)
+            end if
+1       continue
+        err = nf_close(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_close: ',  err)
+        call print_nok(nok)
+        end
+])
+
+
+dnl TEST_NF_GET_VARA(TYPE)
+dnl
+define([TEST_NF_GET_VARA],[dnl
+        subroutine test_nf_get_vara_$1()
+        implicit        none
+#include "tests.inc"
+        integer ncid
+        integer d
+        integer i
+        integer j
+        integer k
+        integer err
+        logical allInExtRange   
+        logical allInIntRange   
+        integer nels
+        integer nslabs
+        integer nok      
+        integer start(MAX_RANK)
+        integer edge(MAX_RANK)
+        integer index(MAX_RANK)
+        integer mid(MAX_RANK)
+        logical canConvert     
+        DATATYPE($1)    value(MAX_NELS)
+        doubleprecision expect(MAX_NELS)
+        doubleprecision val
+        integer udshift
+
+        nok = 0
+
+        err = nf_open(testfile, NF_NOWRITE, ncid)
+        if (err .ne. 0)
+     +      call errore('nf_open: ', err)
+        do 1, i = 1, NVARS
+            canConvert = (var_type(i) .eq. NF_CHAR) .eqv. 
+     +                   (NFT_ITYPE($1) .eq. NFT_TEXT)
+            if (.not.(var_rank(i) .le. MAX_RANK)) stop 2
+            if (.not.(var_nels(i) .le. MAX_NELS)) stop 2
+            do 2, j = 1, var_rank(i)
+                start(j) = 1
+                edge(j) = 1
+2           continue
+            err = nf_get_vara_$1(BAD_ID, i, start,
+     +                  edge, value)
+            if (err .ne. NF_EBADID)
+     +          call errore('bad ncid: ', err)
+            err = nf_get_vara_$1(ncid, BAD_VARID, start, 
+     +                           edge, value)
+            if (err .ne. NF_ENOTVAR)
+     +          call errore('bad var id: ', err)
+            do 3, j = 1, var_rank(i)
+                start(j) = var_shape(j,i) + 1
+                err = nf_get_vara_$1(ncid, i, start,
+     +                               edge, value)
+                if (canConvert .and. err .ne. NF_EINVALCOORDS)
+     +              call errore('bad index: ', err)
+                start(j) = 1
+                edge(j) = var_shape(j,i) + 1
+                err = nf_get_vara_$1(ncid, i, start,
+     +                               edge, value)
+                if (canConvert .and. err .ne. NF_EEDGE)
+     +              call errore('bad edge: ', err)
+                edge(j) = 1
+3           continue
+
+C           /* Check non-scalars for correct error returned even when */
+C           /* there is nothing to get (edge(j).eq.0) */
+            if (var_rank(i) .gt. 0) then
+                do 10, j = 1, var_rank(i)
+                    edge(j) = 0
+10              continue
+                err = nf_get_vara_$1(BAD_ID, i, start,
+     +                  edge, value)
+                if (err .ne. NF_EBADID) 
+     +              call errore('bad ncid: ', err)
+                err = nf_get_vara_$1(ncid, BAD_VARID,
+     +                  start, edge, value)
+                if (err .ne. NF_ENOTVAR) 
+     +              call errore('bad var id: ', err)
+                do 11, j = 1, var_rank(i)
+                    if (var_dimid(j,i) .gt. 1) then     !/* skip record dim */
+                        start(j) = var_shape(j,i) + 1
+                        err = nf_get_vara_$1(ncid, i,
+     +                          start, edge, value)
+                        if (canConvert .and. err .ne. NF_EINVALCOORDS)
+     +                      call errore('bad start: ', err)
+                        start(j) = 1
+                    endif
+11              continue
+                err = nf_get_vara_$1(ncid, i, start,
+     +                          edge, value)
+                if (canConvert) then
+                    if (err .ne. 0) 
+     +                  call error(nf_strerror(err))
+                else
+                    if (err .ne. NF_ECHAR)
+     +                  call errore('wrong type: ', err)
+                endif
+                do 12, j = 1, var_rank(i)
+                    edge(j) = 1
+12              continue
+            endif
+
+C           Choose a random point dividing each dim into 2 parts
+C           get 2^rank (nslabs) slabs so defined
+            nslabs = 1
+            do 4, j = 1, var_rank(i)
+                mid(j) = roll( var_shape(j,i) )
+                nslabs = nslabs * 2
+4           continue
+C           bits of k determine whether to get lower or upper part of dim 
+            do 5, k = 1, nslabs
+                nels = 1
+                do 6, j = 1, var_rank(i)
+                    if (mod(udshift((k-1), -(j-1)), 2) .eq. 1) then
+                        start(j) = 1
+                        edge(j) = mid(j)
+                    else
+                        start(j) = 1 + mid(j)
+                        edge(j) = var_shape(j,i) - mid(j)
+                    end if
+                    nels = nels * edge(j)
+6               continue
+                allInIntRange = .true.
+                allInExtRange = .true.
+                do 7, j = 1, nels
+                    err = index2indexes(j, var_rank(i), edge, index)
+                    if (err .ne. 0)
+     +                  call error('error in index2indexes 1')
+                    do 8, d = 1, var_rank(i)
+                        index(d) = index(d) + start(d) - 1
+8                   continue
+                    expect(j) = hash4(var_type(i), var_rank(i), index, 
+     +                                NFT_ITYPE($1))
+                    if (inRange3(expect(j),var_type(i), 
+     +                           NFT_ITYPE($1))) then
+                        allInIntRange = 
+     +                      allInIntRange .and.
+     +                      in_internal_range(NFT_ITYPE($1), expect(j))
+                    else
+                        allInExtRange = .false.
+                    end if
+7               continue
+                err = nf_get_vara_$1(ncid, i, start,
+     +                          edge, value)
+                if (canConvert) then
+                    if (allInExtRange) then
+                        if (allInIntRange) then
+                            if (err .ne. 0)
+     +                          call errore('nf_get_vara_$1:', err)
+                        else
+                            if (err .ne. NF_ERANGE)
+     +                          call errore('Range error: ', err)
+                        end if
+                    else
+                        if (err .ne. 0 .and. err .ne. NF_ERANGE)
+     +                      call errore('OK or Range error: ', err)
+                    end if
+                    do 9, j = 1, nels
+                        if (inRange3(expect(j),var_type(i),
+     +                               NFT_ITYPE($1)) .and.
+     +                      in_internal_range(NFT_ITYPE($1), expect(j)))
+     +                          then
+                            val = ARITH($1, value(j))
+                            if (.not.equal(val,expect(j),
+     +                                     var_type(i),NFT_ITYPE($1))) 
+     +                              then
+                                call error(
+     +                              'value read not that expected')
+                                if (verbose) then
+                                    call error(' ')
+                                    call errori('varid: ', i)
+                                    call errorc('var_name: ',
+     +                                  var_name(i))
+                                    call errori('element number: %d ', 
+     +                                          j)
+                                    call errord('expect: ', expect(j))
+                                    call errord('got: ', val)
+                                end if
+                            else
+                                nok = nok + 1
+                            end if
+                        end if
+9                   continue
+                else
+                    if (nels .gt. 0  .and. err .ne. NF_ECHAR)
+     +                  call errore('wrong type: ', err)
+                end if
+5           continue
+1       continue
+        err = nf_close(ncid)
+        if (err .ne. 0)
+     +      call errorc('nf_close: ', nf_strerror(err))
+        call print_nok(nok)
+        end
+])dnl
+
+
+dnl TEST_NF_GET_VARS(TYPE)
+dnl
+define([TEST_NF_GET_VARS],dnl
+[dnl
+        subroutine test_nf_get_vars_$1()
+        implicit        none
+#include "tests.inc"
+        integer ncid
+        integer d
+        integer i
+        integer j
+        integer k
+        integer m
+        integer err
+        logical allInExtRange   
+        logical allInIntRange   
+        integer nels
+        integer nslabs
+        integer nstarts         
+        integer nok             
+        integer start(MAX_RANK)
+        integer edge(MAX_RANK)
+        integer index(MAX_RANK)
+        integer index2(MAX_RANK)
+        integer mid(MAX_RANK)
+        integer count(MAX_RANK)
+        integer sstride(MAX_RANK)
+        integer stride(MAX_RANK)
+        logical canConvert     
+        DATATYPE($1)    value(MAX_NELS)
+        doubleprecision expect(MAX_NELS)
+        doubleprecision val
+        integer udshift
+
+        nok = 0
+
+        err = nf_open(testfile, NF_NOWRITE, ncid)
+        if (err .ne. 0)
+     +      call errore('nf_open: ', err)
+        do 1, i = 1, NVARS
+            canConvert = (var_type(i) .eq. NF_CHAR) .eqv. 
+     +                   (NFT_ITYPE($1) .eq. NFT_TEXT)
+            if (.not.(var_rank(i) .le. MAX_RANK)) stop 2
+            if (.not.(var_nels(i) .le. MAX_NELS)) stop 2
+            do 2, j = 1, var_rank(i)
+                start(j) = 1
+                edge(j) = 1
+                stride(j) = 1
+2           continue
+            err = nf_get_vars_$1(BAD_ID, i, start,
+     +                  edge, stride, value)
+            if (err .ne. NF_EBADID)
+     +          call errore('bad ncid: ', err)
+            err = nf_get_vars_$1(ncid, BAD_VARID,
+     +                  start, edge, stride, 
+     +                           value)
+            if (err .ne. NF_ENOTVAR)
+     +          call errore('bad var id: ', err)
+            do 3, j = 1, var_rank(i)
+                start(j) = var_shape(j,i) + 1
+                err = nf_get_vars_$1(ncid, i, start,
+     +                               edge, stride, 
+     +                               value)
+                if (.not. canConvert) then
+                    if (err .ne. NF_ECHAR)
+     +                  call errore('conversion: ', err)
+                else
+                    if (err .ne. NF_EINVALCOORDS)
+     +                  call errore('bad index: ', err)
+                endif
+                start(j) = 1
+                edge(j) = var_shape(j,i) + 1
+                err = nf_get_vars_$1(ncid, i, start,
+     +                               edge, stride, 
+     +                               value)
+                if (.not. canConvert) then
+                    if (err .ne. NF_ECHAR)
+     +                  call errore('conversion: ', err)
+                else
+                    if (err .ne. NF_EEDGE)
+     +                  call errore('bad edge: ', err)
+                endif
+                edge(j) = 1
+                stride(j) = 0
+                err = nf_get_vars_$1(ncid, i, start,
+     +                               edge, stride, 
+     +                               value)
+                if (.not. canConvert) then
+                    if (err .ne. NF_ECHAR)
+     +                  call errore('conversion: ', err)
+                else
+                    if (err .ne. NF_ESTRIDE)
+     +                  call errore('bad stride: ', err)
+                endif
+                stride(j) = 1
+3           continue
+C               Choose a random point dividing each dim into 2 parts
+C               get 2^rank (nslabs) slabs so defined
+            nslabs = 1
+            do 4, j = 1, var_rank(i)
+                mid(j) = roll( var_shape(j,i) )
+                nslabs = nslabs * 2
+4           continue
+C               bits of k determine whether to get lower or upper part of dim
+C               choose random stride from 1 to edge
+            do 5, k = 1, nslabs
+                nstarts = 1
+                do 6, j = 1, var_rank(i)
+                    if (mod(udshift(k-1, j-1), 2) .eq. 1) then
+                        start(j) = 1
+                        edge(j) = mid(j)
+                    else
+                        start(j) = 1 + mid(j)
+                        edge(j) = var_shape(j,i) - mid(j)
+                    end if
+                    if (edge(j) .gt. 0) then
+                        sstride(j) = 1 + roll(edge(j))
+                    else
+                        sstride(j) = 1
+                    end if
+                    nstarts = nstarts * stride(j)
+6               continue
+                do 7, m = 1, nstarts
+                    err = index2indexes(m, var_rank(i), sstride, 
+     +                                  index)
+                    if (err .ne. 0)
+     +                  call error('error in index2indexes')
+                    nels = 1
+                    do 8, j = 1, var_rank(i)
+                        count(j) = 1 + (edge(j) - index(j)) / 
+     +                                  stride(j)
+                        nels = nels * count(j)
+                        index(j) = index(j) + start(j) - 1
+8                   continue
+C                           Random choice of forward or backward 
+C    /* TODO
+C                   if ( roll(2) ) then
+C                       for (j = 0 j < var_rank(i) j++) {
+C                           index(j) += (count(j) - 1) * stride(j)
+C                           stride(j) = -stride(j)
+C                       }
+C                   end if
+C    */
+                    allInIntRange = .true.
+                    allInExtRange = .true.
+                    do 9, j = 1, nels
+                        err = index2indexes(j, var_rank(i), count, 
+     +                                      index2)
+                        if (err .ne. 0)
+     +                      call error('error in index2indexes() 1')
+                        do 10, d = 1, var_rank(i)
+                            index2(d) = index(d) + (index2(d)-1) * 
+     +                                  stride(d)
+10                      continue
+                        expect(j) = hash4(var_type(i), var_rank(i), 
+     +                                    index2, NFT_ITYPE($1))
+                        if (inRange3(expect(j),var_type(i),
+     +                               NFT_ITYPE($1))) then
+                            allInIntRange = 
+     +                          allInIntRange .and.
+     +                          in_internal_range(NFT_ITYPE($1), 
+     +                                            expect(j))
+                        else
+                            allInExtRange = .false.
+                        end if
+9                   continue
+                    err = nf_get_vars_$1(ncid, i, index,
+     +                                   count, stride,
+     +                                   value)
+                    if (canConvert) then
+                        if (allInExtRange) then
+                            if (allInIntRange) then
+                                if (err .ne. 0)
+     +                              call error(nf_strerror(err))
+                            else
+                                if (err .ne. NF_ERANGE)
+     +                              call errore('Range error: ', err)
+                            end if
+                        else
+                            if (err .ne. 0 .and. err .ne. NF_ERANGE)
+     +                          call errore('OK or Range error: ', err)
+                        end if
+                        do 11, j = 1, nels
+                            if (inRange3(expect(j),var_type(i),
+     +                          NFT_ITYPE($1)) .and.
+     +                          in_internal_range(NFT_ITYPE($1), 
+     +                                            expect(j))) then
+                                val = ARITH($1, value(j))
+                                if (.not.equal(val, expect(j),
+     +                              var_type(i), NFT_ITYPE($1))) then
+                                    call error(
+     +                                  'value read not that expected')
+                                    if (verbose) then
+                                        call error(' ')
+                                        call errori('varid: ', i)
+                                        call errorc('var_name: ', 
+     +                                              var_name(i))
+                                        call errori('element number: ',
+     +                                              j)
+                                        call errord('expect: ', 
+     +                                              expect(j))
+                                        call errord('got: ', val)
+                                    end if
+                                else
+                                    nok = nok + 1
+                                end if
+                            end if
+11                      continue
+                    else
+                        if (nels .gt. 0 .and. err .ne. NF_ECHAR)
+     +                      call errore('wrong type: ', err)
+                    end if
+7               continue
+5           continue
+
+1       continue
+        err = nf_close(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_close: ', err)
+        call print_nok(nok)
+        end
+])dnl
+
+
+dnl TEST_NF_GET_VARM(TYPE)
+dnl
+define([TEST_NF_GET_VARM],dnl
+[dnl
+        subroutine test_nf_get_varm_$1()
+        implicit        none
+#include "tests.inc"
+        integer ncid
+        integer d
+        integer i
+        integer j
+        integer k
+        integer m
+        integer err
+        logical allInExtRange   
+        logical allInIntRange   
+        integer nels
+        integer nslabs
+        integer nstarts         
+        integer nok             
+        integer start(MAX_RANK)
+        integer edge(MAX_RANK)
+        integer index(MAX_RANK)
+        integer index2(MAX_RANK)
+        integer mid(MAX_RANK)
+        integer count(MAX_RANK)
+        integer sstride(MAX_RANK)
+        integer stride(MAX_RANK)
+        integer imap(MAX_RANK)
+        logical canConvert     
+        DATATYPE($1)    value(MAX_NELS)
+        doubleprecision expect(MAX_NELS)
+        doubleprecision val
+        integer udshift
+
+        nok = 0
+
+        err = nf_open(testfile, NF_NOWRITE, ncid)
+        if (err .ne. 0)
+     +      call errore('nf_open: ', err)
+        do 1, i = 1, NVARS
+            canConvert = (var_type(i) .eq. NF_CHAR) .eqv. 
+     +                   (NFT_ITYPE($1) .eq. NFT_TEXT)
+            if (.not.(var_rank(i) .le. MAX_RANK)) stop 2
+            if (.not.(var_nels(i) .le. MAX_NELS)) stop 2
+            do 2, j = 1, var_rank(i)
+                start(j) = 1
+                edge(j) = 1
+                stride(j) = 1
+                imap(j) = 1
+2           continue
+            err = nf_get_varm_$1(BAD_ID, i, start, edge,
+     +                           stride, imap, 
+     +                           value)
+            if (err .ne. NF_EBADID)
+     +          call errore('bad ncid: ', err)
+            err = nf_get_varm_$1(ncid, BAD_VARID, start,
+     +                           edge, stride, 
+     +                           imap, value)
+            if (err .ne. NF_ENOTVAR)
+     +          call errore('bad var id: ', err)
+            do 3, j = 1, var_rank(i)
+                start(j) = var_shape(j,i) + 1
+                err = nf_get_varm_$1(ncid, i, start,
+     +                               edge, stride, 
+     +                               imap, value)
+                if (.not. canConvert) then
+                    if (err .ne. NF_ECHAR)
+     +                  call errore('conversion: ', err)
+                else
+                    if (err .ne. NF_EINVALCOORDS)
+     +                  call errore('bad index: ', err)
+                endif
+                start(j) = 1
+                edge(j) = var_shape(j,i) + 1
+                err = nf_get_varm_$1(ncid, i, start,
+     +                               edge, stride, 
+     +                               imap, value)
+                if (.not. canConvert) then
+                    if (err .ne. NF_ECHAR)
+     +                  call errore('conversion: ', err)
+                else
+                    if (err .ne. NF_EEDGE)
+     +                  call errore('bad edge: ', err)
+                endif
+                edge(j) = 1
+                stride(j) = 0
+                err = nf_get_varm_$1(ncid, i, start,
+     +                               edge, stride, 
+     +                               imap, value)
+                if (.not. canConvert) then
+                    if (err .ne. NF_ECHAR)
+     +                  call errore('conversion: ', err)
+                else
+                    if (err .ne. NF_ESTRIDE)
+     +                  call errore('bad stride: ', err)
+                endif
+                stride(j) = 1
+3           continue
+C               Choose a random point dividing each dim into 2 parts 
+C               get 2^rank (nslabs) slabs so defined 
+            nslabs = 1
+            do 4, j = 1, var_rank(i)
+                mid(j) = roll( var_shape(j,i) )
+                nslabs = nslabs * 2
+4           continue
+C               /* bits of k determine whether to get lower or upper part 
+C                * of dim
+C                * choose random stride from 1 to edge */
+            do 5, k = 1, nslabs
+                nstarts = 1
+                do 6, j = 1, var_rank(i)
+                    if (mod(udshift((k-1), -(j-1)), 2) .ne. 0) then
+                        start(j) = 1
+                        edge(j) = mid(j)
+                    else
+                        start(j) = 1 + mid(j)
+                        edge(j) = var_shape(j,i) - mid(j)
+                    end if
+                    if (edge(j) .gt. 0) then
+                        stride(j) = 1+roll(edge(j))
+                    else
+                        stride(j) = 1
+                    end if
+                    sstride(j) = stride(j)
+                    nstarts = nstarts * stride(j)
+6               continue
+                do 7, m = 1, nstarts
+                    err = index2indexes(m, var_rank(i), sstride, index)
+                    if (err .ne. 0)
+     +                  call error('error in index2indexes')
+                    nels = 1
+                    do 8, j = 1, var_rank(i)
+                        count(j) = 1 + (edge(j) - index(j)) / 
+     +                                  stride(j)
+                        nels = nels * count(j)
+                        index(j) = index(j) + start(j) - 1
+8                   continue
+C                       Random choice of forward or backward 
+C    /* TODO
+C                   if ( roll(2) ) then
+C                       for (j = 0 j < var_rank(i) j++) {
+C                           index(j) += (count(j) - 1) * stride(j)
+C                           stride(j) = -stride(j)
+C                       }
+C                   end if
+C     */
+                    if (var_rank(i) .gt. 0) then
+                        imap(1) = 1
+                        do 9, j = 2, var_rank(i)
+                            imap(j) = imap(j-1) * count(j-1)
+9                       continue
+                    end if
+                    allInIntRange = .true.
+                    allInExtRange = .true.
+                    do 10, j = 1, nels
+                        err = index2indexes(j, var_rank(i), count, 
+     +                                      index2)
+                        if (err .ne. 0)
+     +                      call error('error in index2indexes 1')
+                        do 11, d = 1, var_rank(i)
+                            index2(d) = index(d) + (index2(d)-1) * 
+     +                                  stride(d)
+11                      continue
+                        expect(j) = hash4(var_type(i), var_rank(i), 
+     +                                    index2, NFT_ITYPE($1))
+                        if (inRange3(expect(j),var_type(i),
+     +                               NFT_ITYPE($1))) then
+                            allInIntRange = 
+     +                          allInIntRange .and.
+     +                          in_internal_range(NFT_ITYPE($1),
+     +                                            expect(j))
+                        else
+                            allInExtRange = .false.
+                        end if
+10                  continue
+                    err = nf_get_varm_$1(ncid,i,index,count,
+     +                                   stride,imap,
+     +                                   value)
+                    if (canConvert) then
+                        if (allInExtRange) then
+                            if (allInIntRange) then
+                                if (err .ne. 0)
+     +                              call error(nf_strerror(err))
+                            else
+                                if (err .ne. NF_ERANGE)
+     +                              call errore('Range error: ', err)
+                            end if
+                        else
+                            if (err .ne. 0 .and. err .ne. NF_ERANGE)
+     +                          call errore('OK or Range error: ', err)
+                        end if
+                        do 12, j = 1, nels
+                            if (inRange3(expect(j),var_type(i),
+     +                                   NFT_ITYPE($1)) .and.
+     +                          in_internal_range(NFT_ITYPE($1),
+     +                                            expect(j))) then
+                                val = ARITH($1, value(j))
+                                if (.not.equal(val, expect(j),
+     +                                         var_type(i), 
+     +                                         NFT_ITYPE($1))) then
+                                    call error(
+     +                                  'value read not that expected')
+                                    if (verbose) then
+                                        call error(' ')
+                                        call errori('varid: ', i)
+                                        call errorc('var_name: ', 
+     +                                          var_name(i))
+                                        call errori('element number: ',
+     +                                              j)
+                                        call errord('expect: ', 
+     +                                              expect(j))
+                                        call errord('got: ', val)
+                                    end if
+                                else
+                                    nok = nok + 1
+                                end if
+                            end if
+12                      continue
+                    else
+                        if (nels .gt. 0 .and. err .ne. NF_ECHAR)
+     +                      call errore('wrong type: ', err)
+                    end if
+7               continue
+5           continue
+1       continue
+        err = nf_close(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_close: ',  err)
+        call print_nok(nok)
+        end
+])dnl
+
+
+dnl TEST_NF_GET_ATT(TYPE)
+dnl
+define([TEST_NF_GET_ATT],dnl
+[dnl
+        subroutine test_nf_get_att_$1()
+        implicit        none
+#include "tests.inc"
+        integer ncid
+        integer i
+        integer j
+        integer k
+        integer err
+        integer ndx(1)
+        logical allInExtRange
+        logical allInIntRange
+        logical canConvert     
+        DATATYPE($1)    value(MAX_NELS)
+        doubleprecision expect(MAX_NELS)
+        integer nok             
+        doubleprecision val
+
+        nok = 0
+
+        err = nf_open(testfile, NF_NOWRITE, ncid)
+        if (err .ne. 0) 
+     +      call errore('nf_open: ', err)
+
+        do 1, i = 0, NVARS
+            do 2, j = 1, NATTS(i)
+                canConvert = (ATT_TYPE(j,i) .eq. NF_CHAR) .eqv.
+     +                       (NFT_ITYPE($1) .eq. NFT_TEXT)
+                err = nf_get_att_$1(BAD_ID, i,
+     +                  ATT_NAME(j,i), 
+     +                  value)
+                if (err .ne. NF_EBADID) 
+     +              call errore('bad ncid: ', err)
+                err = nf_get_att_$1(ncid, BAD_VARID, 
+     +                              ATT_NAME(j,i), 
+     +                              value)
+                if (err .ne. NF_ENOTVAR) 
+     +              call errore('bad var id: ', err)
+                err = nf_get_att_$1(ncid, i, 'noSuch', value)
+                if (err .ne. NF_ENOTATT) 
+     +              call errore('Bad attribute name: ', err)
+                allInIntRange = .true.
+                allInExtRange = .true.
+                do 3, k = 1, ATT_LEN(j,i)
+                    ndx(1) = k
+                    expect(k) = hash4(ATT_TYPE(j,i), -1, ndx, 
+     +                                NFT_ITYPE($1))
+                    if (inRange3(expect(k),ATT_TYPE(j,i),
+     +                           NFT_ITYPE($1))) then
+                        allInIntRange = 
+     +                      allInIntRange .and.
+     +                      in_internal_range(NFT_ITYPE($1), expect(k))
+                    else
+                        allInExtRange = .false.
+                    end if
+3               continue
+                err = nf_get_att_$1(ncid, i, ATT_NAME(j,i), value)
+                if (canConvert .or. ATT_LEN(j,i) .eq. 0) then
+                    if (allInExtRange) then
+                        if (allInIntRange) then
+                            if (err .ne. 0)
+     +                          call errore('nf_get_att_$1: ', err)
+                        else
+                            if (err .ne. NF_ERANGE)
+     +                          call errore('Range error: ', err)
+                        end if
+                    else
+                        if (err .ne. 0 .and. err .ne. NF_ERANGE)
+     +                      call errore('OK or Range error: ',
+     +                                  err)
+                    end if
+                    do 4, k = 1, ATT_LEN(j,i)
+                        if (inRange3(expect(k),ATT_TYPE(j,i),
+     +                               NFT_ITYPE($1)) .and.
+     +                      in_internal_range(NFT_ITYPE($1),
+     +                                        expect(k))) then
+                            val = ARITH($1, value(k))
+                            if (.not.equal(val, expect(k),
+     +                                     ATT_TYPE(j,i), 
+     +                                     NFT_ITYPE($1)))then
+                                call error(
+     +                              'value read not that expected')
+                                if (verbose) then
+                                    call error(' ')
+                                    call errori('varid: ', i)
+                                    call errorc('att_name: ', 
+     +                                  ATT_NAME(j,i))
+                                    call errori('element number: ', k)
+                                    call errord('expect: ', expect(k))
+                                    call errord('got: ', val)
+                                end if
+                            else
+                                nok = nok + 1
+                            end if
+                        end if
+4                   continue
+                else
+                    if (err .ne. NF_ECHAR)
+     +                  call errore('wrong type: ', err)
+                end if
+2           continue
+1       continue
+
+        err = nf_close(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_close: ', err)
+        call print_nok(nok)
+        end
+])dnl
+
+divert(0)dnl
+dnl If you see this line, you can ignore the next one.
+C Do not edit this file. It is produced from the corresponding .m4 source */
+
+C*********************************************************************
+C   Copyright 1996, UCAR/Unidata
+C   See netcdf/COPYRIGHT file for copying and redistribution conditions.
+C   $Id: test_get.m4,v 1.11 2008/04/30 16:50:46 ed Exp $
+C*********************************************************************
+
+TEST_NF_GET_VAR1(text)
+#ifdef NF_INT1_T
+TEST_NF_GET_VAR1(int1)
+#endif
+#ifdef NF_INT2_T
+TEST_NF_GET_VAR1(int2)
+#endif
+TEST_NF_GET_VAR1(int)
+TEST_NF_GET_VAR1(real)
+TEST_NF_GET_VAR1(double)
+
+TEST_NF_GET_VAR(text)
+#ifdef NF_INT1_T
+TEST_NF_GET_VAR(int1)
+#endif
+#ifdef NF_INT2_T
+TEST_NF_GET_VAR(int2)
+#endif
+TEST_NF_GET_VAR(int)
+TEST_NF_GET_VAR(real)
+TEST_NF_GET_VAR(double)
+
+TEST_NF_GET_VARA(text)
+#ifdef NF_INT1_T
+TEST_NF_GET_VARA(int1)
+#endif
+#ifdef NF_INT2_T
+TEST_NF_GET_VARA(int2)
+#endif
+TEST_NF_GET_VARA(int)
+TEST_NF_GET_VARA(real)
+TEST_NF_GET_VARA(double)
+
+TEST_NF_GET_VARS(text)
+#ifdef NF_INT1_T
+TEST_NF_GET_VARS(int1)
+#endif
+#ifdef NF_INT2_T
+TEST_NF_GET_VARS(int2)
+#endif
+TEST_NF_GET_VARS(int)
+TEST_NF_GET_VARS(real)
+TEST_NF_GET_VARS(double)
+
+TEST_NF_GET_VARM(text)
+#ifdef NF_INT1_T
+TEST_NF_GET_VARM(int1)
+#endif
+#ifdef NF_INT2_T
+TEST_NF_GET_VARM(int2)
+#endif
+TEST_NF_GET_VARM(int)
+TEST_NF_GET_VARM(real)
+TEST_NF_GET_VARM(double)
+
+TEST_NF_GET_ATT(text)
+#ifdef NF_INT1_T
+TEST_NF_GET_ATT(int1)
+#endif
+#ifdef NF_INT2_T
+TEST_NF_GET_ATT(int2)
+#endif
+TEST_NF_GET_ATT(int)
+TEST_NF_GET_ATT(real)
+TEST_NF_GET_ATT(double)
diff --git a/nf_test/test_put.F b/nf_test/test_put.F
new file mode 100644
index 0000000..7fdae82
--- /dev/null
+++ b/nf_test/test_put.F
@@ -0,0 +1,6641 @@
+C Do not edit this file. It is produced from the corresponding .m4 source */
+
+C********************************************************************
+C   Copyright 1996, UCAR/Unidata
+C   See netcdf/COPYRIGHT file for copying and redistribution conditions.
+C   $Id: test_put.m4,v 1.16 2008/04/30 16:50:45 ed Exp $
+C********************************************************************
+
+C
+C ensure hash value within range for internal TYPE
+C
+        function hash_text(type, rank, index, itype)
+        implicit        none
+#include "tests.inc"
+        integer type
+        integer rank
+        integer index(1)
+        integer itype
+        doubleprecision minimum
+        doubleprecision maximum
+
+        minimum = internal_min(itype)
+        maximum = internal_max(itype)
+
+        hash_text = max(minimum, min(maximum, hash4( type, rank,
+     +      index, itype)))
+        end
+
+#ifdef NF_INT1_T
+C
+C ensure hash value within range for internal TYPE
+C
+        function hash_int1(type, rank, index, itype)
+        implicit        none
+#include "tests.inc"
+        integer type
+        integer rank
+        integer index(1)
+        integer itype
+        doubleprecision minimum
+        doubleprecision maximum
+
+        minimum = internal_min(itype)
+        maximum = internal_max(itype)
+
+        hash_int1 = max(minimum, min(maximum, hash4( type, rank,
+     +      index, itype)))
+        end
+
+#endif
+#ifdef NF_INT2_T
+C
+C ensure hash value within range for internal TYPE
+C
+        function hash_int2(type, rank, index, itype)
+        implicit        none
+#include "tests.inc"
+        integer type
+        integer rank
+        integer index(1)
+        integer itype
+        doubleprecision minimum
+        doubleprecision maximum
+
+        minimum = internal_min(itype)
+        maximum = internal_max(itype)
+
+        hash_int2 = max(minimum, min(maximum, hash4( type, rank,
+     +      index, itype)))
+        end
+
+#endif
+C
+C ensure hash value within range for internal TYPE
+C
+        function hash_int(type, rank, index, itype)
+        implicit        none
+#include "tests.inc"
+        integer type
+        integer rank
+        integer index(1)
+        integer itype
+        doubleprecision minimum
+        doubleprecision maximum
+
+        minimum = internal_min(itype)
+        maximum = internal_max(itype)
+
+        hash_int = max(minimum, min(maximum, hash4( type, rank,
+     +      index, itype)))
+        end
+
+C
+C ensure hash value within range for internal TYPE
+C
+        function hash_real(type, rank, index, itype)
+        implicit        none
+#include "tests.inc"
+        integer type
+        integer rank
+        integer index(1)
+        integer itype
+        doubleprecision minimum
+        doubleprecision maximum
+
+        minimum = internal_min(itype)
+        maximum = internal_max(itype)
+
+        hash_real = max(minimum, min(maximum, hash4( type, rank,
+     +      index, itype)))
+        end
+
+C
+C ensure hash value within range for internal TYPE
+C
+        function hash_double(type, rank, index, itype)
+        implicit        none
+#include "tests.inc"
+        integer type
+        integer rank
+        integer index(1)
+        integer itype
+        doubleprecision minimum
+        doubleprecision maximum
+
+        minimum = internal_min(itype)
+        maximum = internal_max(itype)
+
+        hash_double = max(minimum, min(maximum, hash4( type, rank,
+     +      index, itype)))
+        end
+
+
+C
+C check all vars in file which are (text/numeric) compatible with TYPE
+C
+        subroutine check_vars_text(filename)
+        implicit        none
+#include "tests.inc"
+        character*(*)   filename
+        integer  ncid          !/* netCDF id */
+        integer index(MAX_RANK)
+        integer  err           !/* status */
+        integer  d
+        integer  i
+        integer  j
+        character    value
+        integer datatype
+        integer ndims
+        integer dimids(MAX_RANK)
+        integer ngatts
+        doubleprecision expect
+        character*(NF_MAX_NAME) name
+        integer length
+        logical canConvert      !/* Both text or both numeric */
+        integer nok             !/* count of valid comparisons */
+        doubleprecision val
+
+        nok = 0
+
+        err = nf_open(filename, NF_NOWRITE, ncid)
+        if (err .ne. 0)
+     +      call errore('nf_open: ', err)
+
+        do 1, i = 1, NVARS
+            canConvert = (var_type(i) .eq. NF_CHAR) .eqv.
+     +                   (NFT_TEXT .eq. NFT_TEXT)
+            if (canConvert)  then
+                err = nf_inq_var(ncid, i, name, datatype, ndims, dimids,
+     +                           ngatts)
+                if (err .ne. 0)
+     +              call errore('nf_inq_var: ', err)
+                if (name .ne. var_name(i))
+     +              call error('Unexpected var_name')
+                if (datatype .ne. var_type(i))
+     +              call error('Unexpected type')
+                if (ndims .ne. var_rank(i))
+     +              call error('Unexpected rank')
+                do 2, j = 1, ndims
+                    err = nf_inq_dim(ncid, dimids(j), name, length)
+                    if (err .ne. 0)
+     +                  call errore('nf_inq_dim: ', err)
+                    if (length .ne. var_shape(j,i))
+     +                  call error('Unexpected shape')
+2               continue
+                do 3, j = 1, var_nels(i)
+                    err = index2indexes(j, var_rank(i), var_shape(1,i), 
+     +                                  index)
+                    if (err .ne. 0)
+     +                  call error('error in index2indexes()')
+                    expect = hash4( var_type(i), var_rank(i), index, 
+     +                             NFT_TEXT)
+                    err = nf_get_var1_text(ncid, i, index, value)
+                    if (inRange3(expect,datatype,NFT_TEXT))  then
+                        if (in_internal_range(NFT_TEXT, 
+     +                                        expect)) then
+                            if (err .ne. 0)  then
+                                call errore('nf_get_var1_text: ', err)
+                            else
+                                val = ichar(value)
+                                if (.not.equal(
+     +                              val,
+     +                              expect,var_type(i),
+     +                              NFT_TEXT))  then
+                                    call error(
+     +                          'Var value read not that expected')
+                                    if (verbose)  then
+                                        call error(' ')
+                                        call errori('varid: %d', i)
+                                        call errorc('var_name: ', 
+     +                                          var_name(i))
+                                        call error('index:')
+                                        do 4, d = 1, var_rank(i)
+                                            call errori(' ', index(d))
+4                                       continue
+                                        call errord('expect: ', expect)
+                                        call errord('got: ',  val)
+                                    end if
+                                else
+                                    nok = nok + 1
+                                end if
+                            end if
+                        end if
+                    end if
+3               continue
+            end if
+1       continue
+        err = nf_close (ncid)
+        if (err .ne. 0)
+     +      call errore('nf_close: ', err)
+        call print_nok(nok)
+        end
+
+#ifdef NF_INT1_T
+C
+C check all vars in file which are (text/numeric) compatible with TYPE
+C
+        subroutine check_vars_int1(filename)
+        implicit        none
+#include "tests.inc"
+        character*(*)   filename
+        integer  ncid          !/* netCDF id */
+        integer index(MAX_RANK)
+        integer  err           !/* status */
+        integer  d
+        integer  i
+        integer  j
+        NF_INT1_T    value
+        integer datatype
+        integer ndims
+        integer dimids(MAX_RANK)
+        integer ngatts
+        doubleprecision expect
+        character*(NF_MAX_NAME) name
+        integer length
+        logical canConvert      !/* Both text or both numeric */
+        integer nok             !/* count of valid comparisons */
+        doubleprecision val
+
+        nok = 0
+
+        err = nf_open(filename, NF_NOWRITE, ncid)
+        if (err .ne. 0)
+     +      call errore('nf_open: ', err)
+
+        do 1, i = 1, NVARS
+            canConvert = (var_type(i) .eq. NF_CHAR) .eqv.
+     +                   (NFT_INT1 .eq. NFT_TEXT)
+            if (canConvert)  then
+                err = nf_inq_var(ncid, i, name, datatype, ndims, dimids,
+     +                           ngatts)
+                if (err .ne. 0)
+     +              call errore('nf_inq_var: ', err)
+                if (name .ne. var_name(i))
+     +              call error('Unexpected var_name')
+                if (datatype .ne. var_type(i))
+     +              call error('Unexpected type')
+                if (ndims .ne. var_rank(i))
+     +              call error('Unexpected rank')
+                do 2, j = 1, ndims
+                    err = nf_inq_dim(ncid, dimids(j), name, length)
+                    if (err .ne. 0)
+     +                  call errore('nf_inq_dim: ', err)
+                    if (length .ne. var_shape(j,i))
+     +                  call error('Unexpected shape')
+2               continue
+                do 3, j = 1, var_nels(i)
+                    err = index2indexes(j, var_rank(i), var_shape(1,i), 
+     +                                  index)
+                    if (err .ne. 0)
+     +                  call error('error in index2indexes()')
+                    expect = hash4( var_type(i), var_rank(i), index, 
+     +                             NFT_INT1)
+                    err = nf_get_var1_int1(ncid, i, index, value)
+                    if (inRange3(expect,datatype,NFT_INT1))  then
+                        if (in_internal_range(NFT_INT1, 
+     +                                        expect)) then
+                            if (err .ne. 0)  then
+                                call errore('nf_get_var1_int1: ', err)
+                            else
+                                val = value
+                                if (.not.equal(
+     +                              val,
+     +                              expect,var_type(i),
+     +                              NFT_INT1))  then
+                                    call error(
+     +                          'Var value read not that expected')
+                                    if (verbose)  then
+                                        call error(' ')
+                                        call errori('varid: %d', i)
+                                        call errorc('var_name: ', 
+     +                                          var_name(i))
+                                        call error('index:')
+                                        do 4, d = 1, var_rank(i)
+                                            call errori(' ', index(d))
+4                                       continue
+                                        call errord('expect: ', expect)
+                                        call errord('got: ',  val)
+                                    end if
+                                else
+                                    nok = nok + 1
+                                end if
+                            end if
+                        end if
+                    end if
+3               continue
+            end if
+1       continue
+        err = nf_close (ncid)
+        if (err .ne. 0)
+     +      call errore('nf_close: ', err)
+        call print_nok(nok)
+        end
+
+#endif
+#ifdef NF_INT2_T
+C
+C check all vars in file which are (text/numeric) compatible with TYPE
+C
+        subroutine check_vars_int2(filename)
+        implicit        none
+#include "tests.inc"
+        character*(*)   filename
+        integer  ncid          !/* netCDF id */
+        integer index(MAX_RANK)
+        integer  err           !/* status */
+        integer  d
+        integer  i
+        integer  j
+        NF_INT2_T    value
+        integer datatype
+        integer ndims
+        integer dimids(MAX_RANK)
+        integer ngatts
+        doubleprecision expect
+        character*(NF_MAX_NAME) name
+        integer length
+        logical canConvert      !/* Both text or both numeric */
+        integer nok             !/* count of valid comparisons */
+        doubleprecision val
+
+        nok = 0
+
+        err = nf_open(filename, NF_NOWRITE, ncid)
+        if (err .ne. 0)
+     +      call errore('nf_open: ', err)
+
+        do 1, i = 1, NVARS
+            canConvert = (var_type(i) .eq. NF_CHAR) .eqv.
+     +                   (NFT_INT2 .eq. NFT_TEXT)
+            if (canConvert)  then
+                err = nf_inq_var(ncid, i, name, datatype, ndims, dimids,
+     +                           ngatts)
+                if (err .ne. 0)
+     +              call errore('nf_inq_var: ', err)
+                if (name .ne. var_name(i))
+     +              call error('Unexpected var_name')
+                if (datatype .ne. var_type(i))
+     +              call error('Unexpected type')
+                if (ndims .ne. var_rank(i))
+     +              call error('Unexpected rank')
+                do 2, j = 1, ndims
+                    err = nf_inq_dim(ncid, dimids(j), name, length)
+                    if (err .ne. 0)
+     +                  call errore('nf_inq_dim: ', err)
+                    if (length .ne. var_shape(j,i))
+     +                  call error('Unexpected shape')
+2               continue
+                do 3, j = 1, var_nels(i)
+                    err = index2indexes(j, var_rank(i), var_shape(1,i), 
+     +                                  index)
+                    if (err .ne. 0)
+     +                  call error('error in index2indexes()')
+                    expect = hash4( var_type(i), var_rank(i), index, 
+     +                             NFT_INT2)
+                    err = nf_get_var1_int2(ncid, i, index, value)
+                    if (inRange3(expect,datatype,NFT_INT2))  then
+                        if (in_internal_range(NFT_INT2, 
+     +                                        expect)) then
+                            if (err .ne. 0)  then
+                                call errore('nf_get_var1_int2: ', err)
+                            else
+                                val = value
+                                if (.not.equal(
+     +                              val,
+     +                              expect,var_type(i),
+     +                              NFT_INT2))  then
+                                    call error(
+     +                          'Var value read not that expected')
+                                    if (verbose)  then
+                                        call error(' ')
+                                        call errori('varid: %d', i)
+                                        call errorc('var_name: ', 
+     +                                          var_name(i))
+                                        call error('index:')
+                                        do 4, d = 1, var_rank(i)
+                                            call errori(' ', index(d))
+4                                       continue
+                                        call errord('expect: ', expect)
+                                        call errord('got: ',  val)
+                                    end if
+                                else
+                                    nok = nok + 1
+                                end if
+                            end if
+                        end if
+                    end if
+3               continue
+            end if
+1       continue
+        err = nf_close (ncid)
+        if (err .ne. 0)
+     +      call errore('nf_close: ', err)
+        call print_nok(nok)
+        end
+
+#endif
+C
+C check all vars in file which are (text/numeric) compatible with TYPE
+C
+        subroutine check_vars_int(filename)
+        implicit        none
+#include "tests.inc"
+        character*(*)   filename
+        integer  ncid          !/* netCDF id */
+        integer index(MAX_RANK)
+        integer  err           !/* status */
+        integer  d
+        integer  i
+        integer  j
+        integer    value
+        integer datatype
+        integer ndims
+        integer dimids(MAX_RANK)
+        integer ngatts
+        doubleprecision expect
+        character*(NF_MAX_NAME) name
+        integer length
+        logical canConvert      !/* Both text or both numeric */
+        integer nok             !/* count of valid comparisons */
+        doubleprecision val
+
+        nok = 0
+
+        err = nf_open(filename, NF_NOWRITE, ncid)
+        if (err .ne. 0)
+     +      call errore('nf_open: ', err)
+
+        do 1, i = 1, NVARS
+            canConvert = (var_type(i) .eq. NF_CHAR) .eqv.
+     +                   (NFT_INT .eq. NFT_TEXT)
+            if (canConvert)  then
+                err = nf_inq_var(ncid, i, name, datatype, ndims, dimids,
+     +                           ngatts)
+                if (err .ne. 0)
+     +              call errore('nf_inq_var: ', err)
+                if (name .ne. var_name(i))
+     +              call error('Unexpected var_name')
+                if (datatype .ne. var_type(i))
+     +              call error('Unexpected type')
+                if (ndims .ne. var_rank(i))
+     +              call error('Unexpected rank')
+                do 2, j = 1, ndims
+                    err = nf_inq_dim(ncid, dimids(j), name, length)
+                    if (err .ne. 0)
+     +                  call errore('nf_inq_dim: ', err)
+                    if (length .ne. var_shape(j,i))
+     +                  call error('Unexpected shape')
+2               continue
+                do 3, j = 1, var_nels(i)
+                    err = index2indexes(j, var_rank(i), var_shape(1,i), 
+     +                                  index)
+                    if (err .ne. 0)
+     +                  call error('error in index2indexes()')
+                    expect = hash4( var_type(i), var_rank(i), index, 
+     +                             NFT_INT)
+                    err = nf_get_var1_int(ncid, i, index, value)
+                    if (inRange3(expect,datatype,NFT_INT))  then
+                        if (in_internal_range(NFT_INT, 
+     +                                        expect)) then
+                            if (err .ne. 0)  then
+                                call errore('nf_get_var1_int: ', err)
+                            else
+                                val = value
+                                if (.not.equal(
+     +                              val,
+     +                              expect,var_type(i),
+     +                              NFT_INT))  then
+                                    call error(
+     +                          'Var value read not that expected')
+                                    if (verbose)  then
+                                        call error(' ')
+                                        call errori('varid: %d', i)
+                                        call errorc('var_name: ', 
+     +                                          var_name(i))
+                                        call error('index:')
+                                        do 4, d = 1, var_rank(i)
+                                            call errori(' ', index(d))
+4                                       continue
+                                        call errord('expect: ', expect)
+                                        call errord('got: ',  val)
+                                    end if
+                                else
+                                    nok = nok + 1
+                                end if
+                            end if
+                        end if
+                    end if
+3               continue
+            end if
+1       continue
+        err = nf_close (ncid)
+        if (err .ne. 0)
+     +      call errore('nf_close: ', err)
+        call print_nok(nok)
+        end
+
+C
+C check all vars in file which are (text/numeric) compatible with TYPE
+C
+        subroutine check_vars_real(filename)
+        implicit        none
+#include "tests.inc"
+        character*(*)   filename
+        integer  ncid          !/* netCDF id */
+        integer index(MAX_RANK)
+        integer  err           !/* status */
+        integer  d
+        integer  i
+        integer  j
+        real    value
+        integer datatype
+        integer ndims
+        integer dimids(MAX_RANK)
+        integer ngatts
+        doubleprecision expect
+        character*(NF_MAX_NAME) name
+        integer length
+        logical canConvert      !/* Both text or both numeric */
+        integer nok             !/* count of valid comparisons */
+        doubleprecision val
+
+        nok = 0
+
+        err = nf_open(filename, NF_NOWRITE, ncid)
+        if (err .ne. 0)
+     +      call errore('nf_open: ', err)
+
+        do 1, i = 1, NVARS
+            canConvert = (var_type(i) .eq. NF_CHAR) .eqv.
+     +                   (NFT_REAL .eq. NFT_TEXT)
+            if (canConvert)  then
+                err = nf_inq_var(ncid, i, name, datatype, ndims, dimids,
+     +                           ngatts)
+                if (err .ne. 0)
+     +              call errore('nf_inq_var: ', err)
+                if (name .ne. var_name(i))
+     +              call error('Unexpected var_name')
+                if (datatype .ne. var_type(i))
+     +              call error('Unexpected type')
+                if (ndims .ne. var_rank(i))
+     +              call error('Unexpected rank')
+                do 2, j = 1, ndims
+                    err = nf_inq_dim(ncid, dimids(j), name, length)
+                    if (err .ne. 0)
+     +                  call errore('nf_inq_dim: ', err)
+                    if (length .ne. var_shape(j,i))
+     +                  call error('Unexpected shape')
+2               continue
+                do 3, j = 1, var_nels(i)
+                    err = index2indexes(j, var_rank(i), var_shape(1,i), 
+     +                                  index)
+                    if (err .ne. 0)
+     +                  call error('error in index2indexes()')
+                    expect = hash4( var_type(i), var_rank(i), index, 
+     +                             NFT_REAL)
+                    err = nf_get_var1_real(ncid, i, index, value)
+                    if (inRange3(expect,datatype,NFT_REAL))  then
+                        if (in_internal_range(NFT_REAL, 
+     +                                        expect)) then
+                            if (err .ne. 0)  then
+                                call errore('nf_get_var1_real: ', err)
+                            else
+                                val = value
+                                if (.not.equal(
+     +                              val,
+     +                              expect,var_type(i),
+     +                              NFT_REAL))  then
+                                    call error(
+     +                          'Var value read not that expected')
+                                    if (verbose)  then
+                                        call error(' ')
+                                        call errori('varid: %d', i)
+                                        call errorc('var_name: ', 
+     +                                          var_name(i))
+                                        call error('index:')
+                                        do 4, d = 1, var_rank(i)
+                                            call errori(' ', index(d))
+4                                       continue
+                                        call errord('expect: ', expect)
+                                        call errord('got: ',  val)
+                                    end if
+                                else
+                                    nok = nok + 1
+                                end if
+                            end if
+                        end if
+                    end if
+3               continue
+            end if
+1       continue
+        err = nf_close (ncid)
+        if (err .ne. 0)
+     +      call errore('nf_close: ', err)
+        call print_nok(nok)
+        end
+
+C
+C check all vars in file which are (text/numeric) compatible with TYPE
+C
+        subroutine check_vars_double(filename)
+        implicit        none
+#include "tests.inc"
+        character*(*)   filename
+        integer  ncid          !/* netCDF id */
+        integer index(MAX_RANK)
+        integer  err           !/* status */
+        integer  d
+        integer  i
+        integer  j
+        doubleprecision    value
+        integer datatype
+        integer ndims
+        integer dimids(MAX_RANK)
+        integer ngatts
+        doubleprecision expect
+        character*(NF_MAX_NAME) name
+        integer length
+        logical canConvert      !/* Both text or both numeric */
+        integer nok             !/* count of valid comparisons */
+        doubleprecision val
+
+        nok = 0
+
+        err = nf_open(filename, NF_NOWRITE, ncid)
+        if (err .ne. 0)
+     +      call errore('nf_open: ', err)
+
+        do 1, i = 1, NVARS
+            canConvert = (var_type(i) .eq. NF_CHAR) .eqv.
+     +                   (NFT_DOUBLE .eq. NFT_TEXT)
+            if (canConvert)  then
+                err = nf_inq_var(ncid, i, name, datatype, ndims, dimids,
+     +                           ngatts)
+                if (err .ne. 0)
+     +              call errore('nf_inq_var: ', err)
+                if (name .ne. var_name(i))
+     +              call error('Unexpected var_name')
+                if (datatype .ne. var_type(i))
+     +              call error('Unexpected type')
+                if (ndims .ne. var_rank(i))
+     +              call error('Unexpected rank')
+                do 2, j = 1, ndims
+                    err = nf_inq_dim(ncid, dimids(j), name, length)
+                    if (err .ne. 0)
+     +                  call errore('nf_inq_dim: ', err)
+                    if (length .ne. var_shape(j,i))
+     +                  call error('Unexpected shape')
+2               continue
+                do 3, j = 1, var_nels(i)
+                    err = index2indexes(j, var_rank(i), var_shape(1,i), 
+     +                                  index)
+                    if (err .ne. 0)
+     +                  call error('error in index2indexes()')
+                    expect = hash4( var_type(i), var_rank(i), index, 
+     +                             NFT_DOUBLE)
+                    err = nf_get_var1_double(ncid, i, index, value)
+                    if (inRange3(expect,datatype,NFT_DOUBLE))  then
+                        if (in_internal_range(NFT_DOUBLE, 
+     +                                        expect)) then
+                            if (err .ne. 0)  then
+                                call errore('nf_get_var1_double: ', err)
+                            else
+                                val = value
+                                if (.not.equal(
+     +                              val,
+     +                              expect,var_type(i),
+     +                              NFT_DOUBLE))  then
+                                    call error(
+     +                          'Var value read not that expected')
+                                    if (verbose)  then
+                                        call error(' ')
+                                        call errori('varid: %d', i)
+                                        call errorc('var_name: ', 
+     +                                          var_name(i))
+                                        call error('index:')
+                                        do 4, d = 1, var_rank(i)
+                                            call errori(' ', index(d))
+4                                       continue
+                                        call errord('expect: ', expect)
+                                        call errord('got: ',  val)
+                                    end if
+                                else
+                                    nok = nok + 1
+                                end if
+                            end if
+                        end if
+                    end if
+3               continue
+            end if
+1       continue
+        err = nf_close (ncid)
+        if (err .ne. 0)
+     +      call errore('nf_close: ', err)
+        call print_nok(nok)
+        end
+
+
+C/* 
+C *  check all attributes in file which are (text/numeric) compatible with TYPE
+C *  ignore any attributes containing values outside range of TYPE
+C */
+        subroutine check_atts_text(ncid)
+        implicit        none
+#include "tests.inc"
+        integer ncid
+        integer  err           !/* status */
+        integer  i
+        integer  j
+        integer  k
+        integer ndx(1)
+        character    value(MAX_NELS)
+        integer datatype
+        doubleprecision expect(MAX_NELS)
+        integer length
+        integer nInExtRange     !/* number values within external range */
+        integer nInIntRange     !/* number values within internal range */
+        logical canConvert      !/* Both text or both numeric */
+        integer nok             !/* count of valid comparisons */
+        doubleprecision val
+
+        nok = 0
+
+        do 1, i = 0, NVARS
+            do 2, j = 1, NATTS(i)
+                canConvert = (ATT_TYPE(j,i) .eq. NF_CHAR) .eqv.
+     +                       (NFT_TEXT .eq. NFT_TEXT)
+                if (canConvert) then
+                    err = nf_inq_att(ncid, i, ATT_NAME(j,i), datatype, 
+     +                               length)
+                    if (err .ne. 0)
+     +                  call errore('nf_inq_att: ', err)
+                    if (datatype .ne. ATT_TYPE(j,i))
+     +                  call error('nf_inq_att: unexpected type')
+                    if (length .ne. ATT_LEN(j,i))
+     +                  call error('nf_inq_att: unexpected length')
+                    if (.not.(length .le. MAX_NELS))
+     +                  stop 2
+                    nInIntRange = 0
+                    nInExtRange = 0
+                    do 4, k = 1, length
+                        ndx(1) = k
+                        expect(k) = hash4( datatype, -1, ndx, 
+     +                                    NFT_TEXT)
+                        if (inRange3(expect(k), datatype, 
+     +                               NFT_TEXT)) then
+                            nInExtRange = nInExtRange + 1
+                            if (in_internal_range(NFT_TEXT,
+     +                                            expect(k)))
+     +                          nInIntRange = nInIntRange + 1
+                        end if
+4                   continue
+                    err = nf_get_att_text(ncid, i, 
+     +                                  ATT_NAME(j,i), value)
+                    if (nInExtRange .eq. length .and. 
+     +                  nInIntRange .eq. length) then
+                        if (err .ne. 0)
+     +                      call error(nf_strerror(err))
+                    else
+                        if (err .ne. 0 .and. err .ne. NF_ERANGE)
+     +                      call errore('OK or Range error: ', err)
+                    end if
+                    do 3, k = 1, length
+                        if (inRange3(expect(k),datatype,NFT_TEXT)
+     +                          .and. 
+     +                          in_internal_range(NFT_TEXT, 
+     +                                            expect(k))) then
+                            val = ichar(value(k))
+                            if (.not.equal(
+     +                          val,
+     +                          expect(k),datatype,
+     +                          NFT_TEXT)) then
+                                call error(
+     +                              'att. value read not that expected')
+                                if (verbose) then
+                                    call error(' ')
+                                    call errori('varid: ', i)
+                                    call errorc('att_name: ', 
+     +                                  ATT_NAME(j,i))
+                                    call errori('element number: ', k)
+                                    call errord('expect: ', expect(k))
+                                    call errord('got: ',  val)
+                                end if
+                            else
+                                nok = nok + 1
+                            end if
+                        end if
+3                   continue
+                end if                                               
+2           continue
+1       continue
+
+        call print_nok(nok)
+        end
+
+#ifdef NF_INT1_T
+C/* 
+C *  check all attributes in file which are (text/numeric) compatible with TYPE
+C *  ignore any attributes containing values outside range of TYPE
+C */
+        subroutine check_atts_int1(ncid)
+        implicit        none
+#include "tests.inc"
+        integer ncid
+        integer  err           !/* status */
+        integer  i
+        integer  j
+        integer  k
+        integer ndx(1)
+        NF_INT1_T    value(MAX_NELS)
+        integer datatype
+        doubleprecision expect(MAX_NELS)
+        integer length
+        integer nInExtRange     !/* number values within external range */
+        integer nInIntRange     !/* number values within internal range */
+        logical canConvert      !/* Both text or both numeric */
+        integer nok             !/* count of valid comparisons */
+        doubleprecision val
+
+        nok = 0
+
+        do 1, i = 0, NVARS
+            do 2, j = 1, NATTS(i)
+                canConvert = (ATT_TYPE(j,i) .eq. NF_CHAR) .eqv.
+     +                       (NFT_INT1 .eq. NFT_TEXT)
+                if (canConvert) then
+                    err = nf_inq_att(ncid, i, ATT_NAME(j,i), datatype, 
+     +                               length)
+                    if (err .ne. 0)
+     +                  call errore('nf_inq_att: ', err)
+                    if (datatype .ne. ATT_TYPE(j,i))
+     +                  call error('nf_inq_att: unexpected type')
+                    if (length .ne. ATT_LEN(j,i))
+     +                  call error('nf_inq_att: unexpected length')
+                    if (.not.(length .le. MAX_NELS))
+     +                  stop 2
+                    nInIntRange = 0
+                    nInExtRange = 0
+                    do 4, k = 1, length
+                        ndx(1) = k
+                        expect(k) = hash4( datatype, -1, ndx, 
+     +                                    NFT_INT1)
+                        if (inRange3(expect(k), datatype, 
+     +                               NFT_INT1)) then
+                            nInExtRange = nInExtRange + 1
+                            if (in_internal_range(NFT_INT1,
+     +                                            expect(k)))
+     +                          nInIntRange = nInIntRange + 1
+                        end if
+4                   continue
+                    err = nf_get_att_int1(ncid, i, 
+     +                                  ATT_NAME(j,i), value)
+                    if (nInExtRange .eq. length .and. 
+     +                  nInIntRange .eq. length) then
+                        if (err .ne. 0)
+     +                      call error(nf_strerror(err))
+                    else
+                        if (err .ne. 0 .and. err .ne. NF_ERANGE)
+     +                      call errore('OK or Range error: ', err)
+                    end if
+                    do 3, k = 1, length
+                        if (inRange3(expect(k),datatype,NFT_INT1)
+     +                          .and. 
+     +                          in_internal_range(NFT_INT1, 
+     +                                            expect(k))) then
+                            val = value(k)
+                            if (.not.equal(
+     +                          val,
+     +                          expect(k),datatype,
+     +                          NFT_INT1)) then
+                                call error(
+     +                              'att. value read not that expected')
+                                if (verbose) then
+                                    call error(' ')
+                                    call errori('varid: ', i)
+                                    call errorc('att_name: ', 
+     +                                  ATT_NAME(j,i))
+                                    call errori('element number: ', k)
+                                    call errord('expect: ', expect(k))
+                                    call errord('got: ',  val)
+                                end if
+                            else
+                                nok = nok + 1
+                            end if
+                        end if
+3                   continue
+                end if                                               
+2           continue
+1       continue
+
+        call print_nok(nok)
+        end
+
+#endif
+#ifdef NF_INT2_T
+C/* 
+C *  check all attributes in file which are (text/numeric) compatible with TYPE
+C *  ignore any attributes containing values outside range of TYPE
+C */
+        subroutine check_atts_int2(ncid)
+        implicit        none
+#include "tests.inc"
+        integer ncid
+        integer  err           !/* status */
+        integer  i
+        integer  j
+        integer  k
+        integer ndx(1)
+        NF_INT2_T    value(MAX_NELS)
+        integer datatype
+        doubleprecision expect(MAX_NELS)
+        integer length
+        integer nInExtRange     !/* number values within external range */
+        integer nInIntRange     !/* number values within internal range */
+        logical canConvert      !/* Both text or both numeric */
+        integer nok             !/* count of valid comparisons */
+        doubleprecision val
+
+        nok = 0
+
+        do 1, i = 0, NVARS
+            do 2, j = 1, NATTS(i)
+                canConvert = (ATT_TYPE(j,i) .eq. NF_CHAR) .eqv.
+     +                       (NFT_INT2 .eq. NFT_TEXT)
+                if (canConvert) then
+                    err = nf_inq_att(ncid, i, ATT_NAME(j,i), datatype, 
+     +                               length)
+                    if (err .ne. 0)
+     +                  call errore('nf_inq_att: ', err)
+                    if (datatype .ne. ATT_TYPE(j,i))
+     +                  call error('nf_inq_att: unexpected type')
+                    if (length .ne. ATT_LEN(j,i))
+     +                  call error('nf_inq_att: unexpected length')
+                    if (.not.(length .le. MAX_NELS))
+     +                  stop 2
+                    nInIntRange = 0
+                    nInExtRange = 0
+                    do 4, k = 1, length
+                        ndx(1) = k
+                        expect(k) = hash4( datatype, -1, ndx, 
+     +                                    NFT_INT2)
+                        if (inRange3(expect(k), datatype, 
+     +                               NFT_INT2)) then
+                            nInExtRange = nInExtRange + 1
+                            if (in_internal_range(NFT_INT2,
+     +                                            expect(k)))
+     +                          nInIntRange = nInIntRange + 1
+                        end if
+4                   continue
+                    err = nf_get_att_int2(ncid, i, 
+     +                                  ATT_NAME(j,i), value)
+                    if (nInExtRange .eq. length .and. 
+     +                  nInIntRange .eq. length) then
+                        if (err .ne. 0)
+     +                      call error(nf_strerror(err))
+                    else
+                        if (err .ne. 0 .and. err .ne. NF_ERANGE)
+     +                      call errore('OK or Range error: ', err)
+                    end if
+                    do 3, k = 1, length
+                        if (inRange3(expect(k),datatype,NFT_INT2)
+     +                          .and. 
+     +                          in_internal_range(NFT_INT2, 
+     +                                            expect(k))) then
+                            val = value(k)
+                            if (.not.equal(
+     +                          val,
+     +                          expect(k),datatype,
+     +                          NFT_INT2)) then
+                                call error(
+     +                              'att. value read not that expected')
+                                if (verbose) then
+                                    call error(' ')
+                                    call errori('varid: ', i)
+                                    call errorc('att_name: ', 
+     +                                  ATT_NAME(j,i))
+                                    call errori('element number: ', k)
+                                    call errord('expect: ', expect(k))
+                                    call errord('got: ',  val)
+                                end if
+                            else
+                                nok = nok + 1
+                            end if
+                        end if
+3                   continue
+                end if                                               
+2           continue
+1       continue
+
+        call print_nok(nok)
+        end
+
+#endif
+C/* 
+C *  check all attributes in file which are (text/numeric) compatible with TYPE
+C *  ignore any attributes containing values outside range of TYPE
+C */
+        subroutine check_atts_int(ncid)
+        implicit        none
+#include "tests.inc"
+        integer ncid
+        integer  err           !/* status */
+        integer  i
+        integer  j
+        integer  k
+        integer ndx(1)
+        integer    value(MAX_NELS)
+        integer datatype
+        doubleprecision expect(MAX_NELS)
+        integer length
+        integer nInExtRange     !/* number values within external range */
+        integer nInIntRange     !/* number values within internal range */
+        logical canConvert      !/* Both text or both numeric */
+        integer nok             !/* count of valid comparisons */
+        doubleprecision val
+
+        nok = 0
+
+        do 1, i = 0, NVARS
+            do 2, j = 1, NATTS(i)
+                canConvert = (ATT_TYPE(j,i) .eq. NF_CHAR) .eqv.
+     +                       (NFT_INT .eq. NFT_TEXT)
+                if (canConvert) then
+                    err = nf_inq_att(ncid, i, ATT_NAME(j,i), datatype, 
+     +                               length)
+                    if (err .ne. 0)
+     +                  call errore('nf_inq_att: ', err)
+                    if (datatype .ne. ATT_TYPE(j,i))
+     +                  call error('nf_inq_att: unexpected type')
+                    if (length .ne. ATT_LEN(j,i))
+     +                  call error('nf_inq_att: unexpected length')
+                    if (.not.(length .le. MAX_NELS))
+     +                  stop 2
+                    nInIntRange = 0
+                    nInExtRange = 0
+                    do 4, k = 1, length
+                        ndx(1) = k
+                        expect(k) = hash4( datatype, -1, ndx, 
+     +                                    NFT_INT)
+                        if (inRange3(expect(k), datatype, 
+     +                               NFT_INT)) then
+                            nInExtRange = nInExtRange + 1
+                            if (in_internal_range(NFT_INT,
+     +                                            expect(k)))
+     +                          nInIntRange = nInIntRange + 1
+                        end if
+4                   continue
+                    err = nf_get_att_int(ncid, i, 
+     +                                  ATT_NAME(j,i), value)
+                    if (nInExtRange .eq. length .and. 
+     +                  nInIntRange .eq. length) then
+                        if (err .ne. 0)
+     +                      call error(nf_strerror(err))
+                    else
+                        if (err .ne. 0 .and. err .ne. NF_ERANGE)
+     +                      call errore('OK or Range error: ', err)
+                    end if
+                    do 3, k = 1, length
+                        if (inRange3(expect(k),datatype,NFT_INT)
+     +                          .and. 
+     +                          in_internal_range(NFT_INT, 
+     +                                            expect(k))) then
+                            val = value(k)
+                            if (.not.equal(
+     +                          val,
+     +                          expect(k),datatype,
+     +                          NFT_INT)) then
+                                call error(
+     +                              'att. value read not that expected')
+                                if (verbose) then
+                                    call error(' ')
+                                    call errori('varid: ', i)
+                                    call errorc('att_name: ', 
+     +                                  ATT_NAME(j,i))
+                                    call errori('element number: ', k)
+                                    call errord('expect: ', expect(k))
+                                    call errord('got: ',  val)
+                                end if
+                            else
+                                nok = nok + 1
+                            end if
+                        end if
+3                   continue
+                end if                                               
+2           continue
+1       continue
+
+        call print_nok(nok)
+        end
+
+C/* 
+C *  check all attributes in file which are (text/numeric) compatible with TYPE
+C *  ignore any attributes containing values outside range of TYPE
+C */
+        subroutine check_atts_real(ncid)
+        implicit        none
+#include "tests.inc"
+        integer ncid
+        integer  err           !/* status */
+        integer  i
+        integer  j
+        integer  k
+        integer ndx(1)
+        real    value(MAX_NELS)
+        integer datatype
+        doubleprecision expect(MAX_NELS)
+        integer length
+        integer nInExtRange     !/* number values within external range */
+        integer nInIntRange     !/* number values within internal range */
+        logical canConvert      !/* Both text or both numeric */
+        integer nok             !/* count of valid comparisons */
+        doubleprecision val
+
+        nok = 0
+
+        do 1, i = 0, NVARS
+            do 2, j = 1, NATTS(i)
+                canConvert = (ATT_TYPE(j,i) .eq. NF_CHAR) .eqv.
+     +                       (NFT_REAL .eq. NFT_TEXT)
+                if (canConvert) then
+                    err = nf_inq_att(ncid, i, ATT_NAME(j,i), datatype, 
+     +                               length)
+                    if (err .ne. 0)
+     +                  call errore('nf_inq_att: ', err)
+                    if (datatype .ne. ATT_TYPE(j,i))
+     +                  call error('nf_inq_att: unexpected type')
+                    if (length .ne. ATT_LEN(j,i))
+     +                  call error('nf_inq_att: unexpected length')
+                    if (.not.(length .le. MAX_NELS))
+     +                  stop 2
+                    nInIntRange = 0
+                    nInExtRange = 0
+                    do 4, k = 1, length
+                        ndx(1) = k
+                        expect(k) = hash4( datatype, -1, ndx, 
+     +                                    NFT_REAL)
+                        if (inRange3(expect(k), datatype, 
+     +                               NFT_REAL)) then
+                            nInExtRange = nInExtRange + 1
+                            if (in_internal_range(NFT_REAL,
+     +                                            expect(k)))
+     +                          nInIntRange = nInIntRange + 1
+                        end if
+4                   continue
+                    err = nf_get_att_real(ncid, i, 
+     +                                  ATT_NAME(j,i), value)
+                    if (nInExtRange .eq. length .and. 
+     +                  nInIntRange .eq. length) then
+                        if (err .ne. 0)
+     +                      call error(nf_strerror(err))
+                    else
+                        if (err .ne. 0 .and. err .ne. NF_ERANGE)
+     +                      call errore('OK or Range error: ', err)
+                    end if
+                    do 3, k = 1, length
+                        if (inRange3(expect(k),datatype,NFT_REAL)
+     +                          .and. 
+     +                          in_internal_range(NFT_REAL, 
+     +                                            expect(k))) then
+                            val = value(k)
+                            if (.not.equal(
+     +                          val,
+     +                          expect(k),datatype,
+     +                          NFT_REAL)) then
+                                call error(
+     +                              'att. value read not that expected')
+                                if (verbose) then
+                                    call error(' ')
+                                    call errori('varid: ', i)
+                                    call errorc('att_name: ', 
+     +                                  ATT_NAME(j,i))
+                                    call errori('element number: ', k)
+                                    call errord('expect: ', expect(k))
+                                    call errord('got: ',  val)
+                                end if
+                            else
+                                nok = nok + 1
+                            end if
+                        end if
+3                   continue
+                end if                                               
+2           continue
+1       continue
+
+        call print_nok(nok)
+        end
+
+C/* 
+C *  check all attributes in file which are (text/numeric) compatible with TYPE
+C *  ignore any attributes containing values outside range of TYPE
+C */
+        subroutine check_atts_double(ncid)
+        implicit        none
+#include "tests.inc"
+        integer ncid
+        integer  err           !/* status */
+        integer  i
+        integer  j
+        integer  k
+        integer ndx(1)
+        doubleprecision    value(MAX_NELS)
+        integer datatype
+        doubleprecision expect(MAX_NELS)
+        integer length
+        integer nInExtRange     !/* number values within external range */
+        integer nInIntRange     !/* number values within internal range */
+        logical canConvert      !/* Both text or both numeric */
+        integer nok             !/* count of valid comparisons */
+        doubleprecision val
+
+        nok = 0
+
+        do 1, i = 0, NVARS
+            do 2, j = 1, NATTS(i)
+                canConvert = (ATT_TYPE(j,i) .eq. NF_CHAR) .eqv.
+     +                       (NFT_DOUBLE .eq. NFT_TEXT)
+                if (canConvert) then
+                    err = nf_inq_att(ncid, i, ATT_NAME(j,i), datatype, 
+     +                               length)
+                    if (err .ne. 0)
+     +                  call errore('nf_inq_att: ', err)
+                    if (datatype .ne. ATT_TYPE(j,i))
+     +                  call error('nf_inq_att: unexpected type')
+                    if (length .ne. ATT_LEN(j,i))
+     +                  call error('nf_inq_att: unexpected length')
+                    if (.not.(length .le. MAX_NELS))
+     +                  stop 2
+                    nInIntRange = 0
+                    nInExtRange = 0
+                    do 4, k = 1, length
+                        ndx(1) = k
+                        expect(k) = hash4( datatype, -1, ndx, 
+     +                                    NFT_DOUBLE)
+                        if (inRange3(expect(k), datatype, 
+     +                               NFT_DOUBLE)) then
+                            nInExtRange = nInExtRange + 1
+                            if (in_internal_range(NFT_DOUBLE,
+     +                                            expect(k)))
+     +                          nInIntRange = nInIntRange + 1
+                        end if
+4                   continue
+                    err = nf_get_att_double(ncid, i, 
+     +                                  ATT_NAME(j,i), value)
+                    if (nInExtRange .eq. length .and. 
+     +                  nInIntRange .eq. length) then
+                        if (err .ne. 0)
+     +                      call error(nf_strerror(err))
+                    else
+                        if (err .ne. 0 .and. err .ne. NF_ERANGE)
+     +                      call errore('OK or Range error: ', err)
+                    end if
+                    do 3, k = 1, length
+                        if (inRange3(expect(k),datatype,NFT_DOUBLE)
+     +                          .and. 
+     +                          in_internal_range(NFT_DOUBLE, 
+     +                                            expect(k))) then
+                            val = value(k)
+                            if (.not.equal(
+     +                          val,
+     +                          expect(k),datatype,
+     +                          NFT_DOUBLE)) then
+                                call error(
+     +                              'att. value read not that expected')
+                                if (verbose) then
+                                    call error(' ')
+                                    call errori('varid: ', i)
+                                    call errorc('att_name: ', 
+     +                                  ATT_NAME(j,i))
+                                    call errori('element number: ', k)
+                                    call errord('expect: ', expect(k))
+                                    call errord('got: ',  val)
+                                end if
+                            else
+                                nok = nok + 1
+                            end if
+                        end if
+3                   continue
+                end if                                               
+2           continue
+1       continue
+
+        call print_nok(nok)
+        end
+
+
+        subroutine test_nf_put_var1_text()
+        implicit        none
+#include "tests.inc"
+        integer ncid
+        integer i
+        integer j
+        integer err
+        integer index(MAX_RANK)
+        logical canConvert      !/* Both text or both numeric */
+        character    value
+        doubleprecision val
+
+        value = char(int(5))!/* any value would do - only for error cases */
+
+        err = nf_create(scratch, NF_CLOBBER, ncid)
+        if (err .ne. 0) then
+            call errore('nf_create: ', err)
+            return
+        end if
+        call def_dims(ncid)
+        call def_vars(ncid)
+        err = nf_enddef(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_enddef: ', err)
+
+        do 1, i = 1, NVARS
+            canConvert = (var_type(i) .eq. NF_CHAR) .eqv.
+     +                   (NFT_TEXT .eq. NFT_TEXT)
+            do 2, j = 1, var_rank(i)
+                index(j) = 1
+2           continue
+            err = nf_put_var1_text(BAD_ID, i, index, value)
+            if (err .ne. NF_EBADID) 
+     +          call errore('bad ncid: ', err)
+            err = nf_put_var1_text(ncid, BAD_VARID,
+     +                           index, value)
+            if (err .ne. NF_ENOTVAR) 
+     +          call errore('bad var id: ', err)
+            do 3, j = 1, var_rank(i)
+                if (var_dimid(j,i) .gt. 1) then         !/* skip record dim */
+                    index(j) = var_shape(j,i) + 1
+                    err = nf_put_var1_text(ncid, i,
+     +                                   index, value)
+                    if (.not. canConvert) then
+                        if (err .ne. NF_ECHAR)
+     +                      call errore('conversion: ', err)
+                        else
+                            if (err .ne. NF_EINVALCOORDS)
+     +                          call errore('bad index: ', err)
+                        endif
+                    index(j) = 0
+                end if
+3           continue
+            do 4, j = 1, var_nels(i)
+                err = index2indexes(j, var_rank(i), var_shape(1,i), 
+     +                              index)
+                if (err .ne. 0) 
+     +              call error('error in index2indexes 1')
+                value = char(int(hash_text(var_type(i),var_rank(i),
+     +                            index, NFT_TEXT)))
+                err = nf_put_var1_text(ncid, i, index, value)
+                if (canConvert) then
+                    val = ichar(value)
+                    if (inRange3(val, var_type(i), NFT_TEXT)) then
+                        if (err .ne. 0)
+     +                      call error(nf_strerror(err))
+                    else
+                        if (err .ne. NF_ERANGE)
+     +                      call errore('Range error: ', err)
+                    end if
+                else
+                    if (err .ne. NF_ECHAR)
+     +                  call errore('wrong type: ', err)
+                end if
+4           continue
+1       continue
+
+        err = nf_close(ncid)
+        if (err .ne. 0) 
+     +      call errore('nf_close: ', err)
+
+        call check_vars_text(scratch)
+
+        err = nf_delete(scratch)
+        if (err .ne. 0)
+     +      call errorc('delete of scratch file failed: ', 
+     +                  scratch)
+        end
+
+#ifdef NF_INT1_T
+        subroutine test_nf_put_var1_int1()
+        implicit        none
+#include "tests.inc"
+        integer ncid
+        integer i
+        integer j
+        integer err
+        integer index(MAX_RANK)
+        logical canConvert      !/* Both text or both numeric */
+        NF_INT1_T    value
+        doubleprecision val
+
+        value = 5!/* any value would do - only for error cases */
+
+        err = nf_create(scratch, NF_CLOBBER, ncid)
+        if (err .ne. 0) then
+            call errore('nf_create: ', err)
+            return
+        end if
+        call def_dims(ncid)
+        call def_vars(ncid)
+        err = nf_enddef(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_enddef: ', err)
+
+        do 1, i = 1, NVARS
+            canConvert = (var_type(i) .eq. NF_CHAR) .eqv.
+     +                   (NFT_INT1 .eq. NFT_TEXT)
+            do 2, j = 1, var_rank(i)
+                index(j) = 1
+2           continue
+            err = nf_put_var1_int1(BAD_ID, i, index, value)
+            if (err .ne. NF_EBADID) 
+     +          call errore('bad ncid: ', err)
+            err = nf_put_var1_int1(ncid, BAD_VARID,
+     +                           index, value)
+            if (err .ne. NF_ENOTVAR) 
+     +          call errore('bad var id: ', err)
+            do 3, j = 1, var_rank(i)
+                if (var_dimid(j,i) .gt. 1) then         !/* skip record dim */
+                    index(j) = var_shape(j,i) + 1
+                    err = nf_put_var1_int1(ncid, i,
+     +                                   index, value)
+                    if (.not. canConvert) then
+                        if (err .ne. NF_ECHAR)
+     +                      call errore('conversion: ', err)
+                        else
+                            if (err .ne. NF_EINVALCOORDS)
+     +                          call errore('bad index: ', err)
+                        endif
+                    index(j) = 0
+                end if
+3           continue
+            do 4, j = 1, var_nels(i)
+                err = index2indexes(j, var_rank(i), var_shape(1,i), 
+     +                              index)
+                if (err .ne. 0) 
+     +              call error('error in index2indexes 1')
+                value = hash_int1(var_type(i),var_rank(i),
+     +                            index, NFT_INT1)
+                err = nf_put_var1_int1(ncid, i, index, value)
+                if (canConvert) then
+                    val = value
+                    if (inRange3(val, var_type(i), NFT_INT1)) then
+                        if (err .ne. 0)
+     +                      call error(nf_strerror(err))
+                    else
+                        if (err .ne. NF_ERANGE)
+     +                      call errore('Range error: ', err)
+                    end if
+                else
+                    if (err .ne. NF_ECHAR)
+     +                  call errore('wrong type: ', err)
+                end if
+4           continue
+1       continue
+
+        err = nf_close(ncid)
+        if (err .ne. 0) 
+     +      call errore('nf_close: ', err)
+
+        call check_vars_int1(scratch)
+
+        err = nf_delete(scratch)
+        if (err .ne. 0)
+     +      call errorc('delete of scratch file failed: ', 
+     +                  scratch)
+        end
+
+#endif
+#ifdef NF_INT2_T
+        subroutine test_nf_put_var1_int2()
+        implicit        none
+#include "tests.inc"
+        integer ncid
+        integer i
+        integer j
+        integer err
+        integer index(MAX_RANK)
+        logical canConvert      !/* Both text or both numeric */
+        NF_INT2_T    value
+        doubleprecision val
+
+        value = 5!/* any value would do - only for error cases */
+
+        err = nf_create(scratch, NF_CLOBBER, ncid)
+        if (err .ne. 0) then
+            call errore('nf_create: ', err)
+            return
+        end if
+        call def_dims(ncid)
+        call def_vars(ncid)
+        err = nf_enddef(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_enddef: ', err)
+
+        do 1, i = 1, NVARS
+            canConvert = (var_type(i) .eq. NF_CHAR) .eqv.
+     +                   (NFT_INT2 .eq. NFT_TEXT)
+            do 2, j = 1, var_rank(i)
+                index(j) = 1
+2           continue
+            err = nf_put_var1_int2(BAD_ID, i, index, value)
+            if (err .ne. NF_EBADID) 
+     +          call errore('bad ncid: ', err)
+            err = nf_put_var1_int2(ncid, BAD_VARID,
+     +                           index, value)
+            if (err .ne. NF_ENOTVAR) 
+     +          call errore('bad var id: ', err)
+            do 3, j = 1, var_rank(i)
+                if (var_dimid(j,i) .gt. 1) then         !/* skip record dim */
+                    index(j) = var_shape(j,i) + 1
+                    err = nf_put_var1_int2(ncid, i,
+     +                                   index, value)
+                    if (.not. canConvert) then
+                        if (err .ne. NF_ECHAR)
+     +                      call errore('conversion: ', err)
+                        else
+                            if (err .ne. NF_EINVALCOORDS)
+     +                          call errore('bad index: ', err)
+                        endif
+                    index(j) = 0
+                end if
+3           continue
+            do 4, j = 1, var_nels(i)
+                err = index2indexes(j, var_rank(i), var_shape(1,i), 
+     +                              index)
+                if (err .ne. 0) 
+     +              call error('error in index2indexes 1')
+                value = hash_int2(var_type(i),var_rank(i),
+     +                            index, NFT_INT2)
+                err = nf_put_var1_int2(ncid, i, index, value)
+                if (canConvert) then
+                    val = value
+                    if (inRange3(val, var_type(i), NFT_INT2)) then
+                        if (err .ne. 0)
+     +                      call error(nf_strerror(err))
+                    else
+                        if (err .ne. NF_ERANGE)
+     +                      call errore('Range error: ', err)
+                    end if
+                else
+                    if (err .ne. NF_ECHAR)
+     +                  call errore('wrong type: ', err)
+                end if
+4           continue
+1       continue
+
+        err = nf_close(ncid)
+        if (err .ne. 0) 
+     +      call errore('nf_close: ', err)
+
+        call check_vars_int2(scratch)
+
+        err = nf_delete(scratch)
+        if (err .ne. 0)
+     +      call errorc('delete of scratch file failed: ', 
+     +                  scratch)
+        end
+
+#endif
+        subroutine test_nf_put_var1_int()
+        implicit        none
+#include "tests.inc"
+        integer ncid
+        integer i
+        integer j
+        integer err
+        integer index(MAX_RANK)
+        logical canConvert      !/* Both text or both numeric */
+        integer    value
+        doubleprecision val
+
+        value = 5!/* any value would do - only for error cases */
+
+        err = nf_create(scratch, NF_CLOBBER, ncid)
+        if (err .ne. 0) then
+            call errore('nf_create: ', err)
+            return
+        end if
+        call def_dims(ncid)
+        call def_vars(ncid)
+        err = nf_enddef(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_enddef: ', err)
+
+        do 1, i = 1, NVARS
+            canConvert = (var_type(i) .eq. NF_CHAR) .eqv.
+     +                   (NFT_INT .eq. NFT_TEXT)
+            do 2, j = 1, var_rank(i)
+                index(j) = 1
+2           continue
+            err = nf_put_var1_int(BAD_ID, i, index, value)
+            if (err .ne. NF_EBADID) 
+     +          call errore('bad ncid: ', err)
+            err = nf_put_var1_int(ncid, BAD_VARID,
+     +                           index, value)
+            if (err .ne. NF_ENOTVAR) 
+     +          call errore('bad var id: ', err)
+            do 3, j = 1, var_rank(i)
+                if (var_dimid(j,i) .gt. 1) then         !/* skip record dim */
+                    index(j) = var_shape(j,i) + 1
+                    err = nf_put_var1_int(ncid, i,
+     +                                   index, value)
+                    if (.not. canConvert) then
+                        if (err .ne. NF_ECHAR)
+     +                      call errore('conversion: ', err)
+                        else
+                            if (err .ne. NF_EINVALCOORDS)
+     +                          call errore('bad index: ', err)
+                        endif
+                    index(j) = 0
+                end if
+3           continue
+            do 4, j = 1, var_nels(i)
+                err = index2indexes(j, var_rank(i), var_shape(1,i), 
+     +                              index)
+                if (err .ne. 0) 
+     +              call error('error in index2indexes 1')
+                value = hash_int(var_type(i),var_rank(i),
+     +                            index, NFT_INT)
+                err = nf_put_var1_int(ncid, i, index, value)
+                if (canConvert) then
+                    val = value
+                    if (inRange3(val, var_type(i), NFT_INT)) then
+                        if (err .ne. 0)
+     +                      call error(nf_strerror(err))
+                    else
+                        if (err .ne. NF_ERANGE)
+     +                      call errore('Range error: ', err)
+                    end if
+                else
+                    if (err .ne. NF_ECHAR)
+     +                  call errore('wrong type: ', err)
+                end if
+4           continue
+1       continue
+
+        err = nf_close(ncid)
+        if (err .ne. 0) 
+     +      call errore('nf_close: ', err)
+
+        call check_vars_int(scratch)
+
+        err = nf_delete(scratch)
+        if (err .ne. 0)
+     +      call errorc('delete of scratch file failed: ', 
+     +                  scratch)
+        end
+
+        subroutine test_nf_put_var1_real()
+        implicit        none
+#include "tests.inc"
+        integer ncid
+        integer i
+        integer j
+        integer err
+        integer index(MAX_RANK)
+        logical canConvert      !/* Both text or both numeric */
+        real    value
+        doubleprecision val
+
+        value = 5!/* any value would do - only for error cases */
+
+        err = nf_create(scratch, NF_CLOBBER, ncid)
+        if (err .ne. 0) then
+            call errore('nf_create: ', err)
+            return
+        end if
+        call def_dims(ncid)
+        call def_vars(ncid)
+        err = nf_enddef(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_enddef: ', err)
+
+        do 1, i = 1, NVARS
+            canConvert = (var_type(i) .eq. NF_CHAR) .eqv.
+     +                   (NFT_REAL .eq. NFT_TEXT)
+            do 2, j = 1, var_rank(i)
+                index(j) = 1
+2           continue
+            err = nf_put_var1_real(BAD_ID, i, index, value)
+            if (err .ne. NF_EBADID) 
+     +          call errore('bad ncid: ', err)
+            err = nf_put_var1_real(ncid, BAD_VARID,
+     +                           index, value)
+            if (err .ne. NF_ENOTVAR) 
+     +          call errore('bad var id: ', err)
+            do 3, j = 1, var_rank(i)
+                if (var_dimid(j,i) .gt. 1) then         !/* skip record dim */
+                    index(j) = var_shape(j,i) + 1
+                    err = nf_put_var1_real(ncid, i,
+     +                                   index, value)
+                    if (.not. canConvert) then
+                        if (err .ne. NF_ECHAR)
+     +                      call errore('conversion: ', err)
+                        else
+                            if (err .ne. NF_EINVALCOORDS)
+     +                          call errore('bad index: ', err)
+                        endif
+                    index(j) = 0
+                end if
+3           continue
+            do 4, j = 1, var_nels(i)
+                err = index2indexes(j, var_rank(i), var_shape(1,i), 
+     +                              index)
+                if (err .ne. 0) 
+     +              call error('error in index2indexes 1')
+                value = hash_real(var_type(i),var_rank(i),
+     +                            index, NFT_REAL)
+                err = nf_put_var1_real(ncid, i, index, value)
+                if (canConvert) then
+                    val = value
+                    if (inRange3(val, var_type(i), NFT_REAL)) then
+                        if (err .ne. 0)
+     +                      call error(nf_strerror(err))
+                    else
+                        if (err .ne. NF_ERANGE)
+     +                      call errore('Range error: ', err)
+                    end if
+                else
+                    if (err .ne. NF_ECHAR)
+     +                  call errore('wrong type: ', err)
+                end if
+4           continue
+1       continue
+
+        err = nf_close(ncid)
+        if (err .ne. 0) 
+     +      call errore('nf_close: ', err)
+
+        call check_vars_real(scratch)
+
+        err = nf_delete(scratch)
+        if (err .ne. 0)
+     +      call errorc('delete of scratch file failed: ', 
+     +                  scratch)
+        end
+
+        subroutine test_nf_put_var1_double()
+        implicit        none
+#include "tests.inc"
+        integer ncid
+        integer i
+        integer j
+        integer err
+        integer index(MAX_RANK)
+        logical canConvert      !/* Both text or both numeric */
+        doubleprecision    value
+        doubleprecision val
+
+        value = 5!/* any value would do - only for error cases */
+
+        err = nf_create(scratch, NF_CLOBBER, ncid)
+        if (err .ne. 0) then
+            call errore('nf_create: ', err)
+            return
+        end if
+        call def_dims(ncid)
+        call def_vars(ncid)
+        err = nf_enddef(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_enddef: ', err)
+
+        do 1, i = 1, NVARS
+            canConvert = (var_type(i) .eq. NF_CHAR) .eqv.
+     +                   (NFT_DOUBLE .eq. NFT_TEXT)
+            do 2, j = 1, var_rank(i)
+                index(j) = 1
+2           continue
+            err = nf_put_var1_double(BAD_ID, i, index, value)
+            if (err .ne. NF_EBADID) 
+     +          call errore('bad ncid: ', err)
+            err = nf_put_var1_double(ncid, BAD_VARID,
+     +                           index, value)
+            if (err .ne. NF_ENOTVAR) 
+     +          call errore('bad var id: ', err)
+            do 3, j = 1, var_rank(i)
+                if (var_dimid(j,i) .gt. 1) then         !/* skip record dim */
+                    index(j) = var_shape(j,i) + 1
+                    err = nf_put_var1_double(ncid, i,
+     +                                   index, value)
+                    if (.not. canConvert) then
+                        if (err .ne. NF_ECHAR)
+     +                      call errore('conversion: ', err)
+                        else
+                            if (err .ne. NF_EINVALCOORDS)
+     +                          call errore('bad index: ', err)
+                        endif
+                    index(j) = 0
+                end if
+3           continue
+            do 4, j = 1, var_nels(i)
+                err = index2indexes(j, var_rank(i), var_shape(1,i), 
+     +                              index)
+                if (err .ne. 0) 
+     +              call error('error in index2indexes 1')
+                value = hash_double(var_type(i),var_rank(i),
+     +                            index, NFT_DOUBLE)
+                err = nf_put_var1_double(ncid, i, index, value)
+                if (canConvert) then
+                    val = value
+                    if (inRange3(val, var_type(i), NFT_DOUBLE)) then
+                        if (err .ne. 0)
+     +                      call error(nf_strerror(err))
+                    else
+                        if (err .ne. NF_ERANGE)
+     +                      call errore('Range error: ', err)
+                    end if
+                else
+                    if (err .ne. NF_ECHAR)
+     +                  call errore('wrong type: ', err)
+                end if
+4           continue
+1       continue
+
+        err = nf_close(ncid)
+        if (err .ne. 0) 
+     +      call errore('nf_close: ', err)
+
+        call check_vars_double(scratch)
+
+        err = nf_delete(scratch)
+        if (err .ne. 0)
+     +      call errorc('delete of scratch file failed: ', 
+     +                  scratch)
+        end
+
+
+        subroutine test_nf_put_var_text()
+        implicit        none
+#include "tests.inc"
+        integer ncid
+        integer vid
+        integer i
+        integer j
+        integer err
+        integer nels
+        integer index(MAX_RANK)
+        logical canConvert      !/* Both text or both numeric */
+        logical allInExtRange   !/* All values within external range?*/
+        character    value(MAX_NELS)
+        doubleprecision val
+
+        err = nf_create(scratch, NF_CLOBBER, ncid)
+        if (err .ne. 0) then
+            call errore('nf_create: ', err)
+            return
+        end if
+        call def_dims(ncid)
+        call def_vars(ncid)
+        err = nf_enddef(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_enddef: ', err)
+
+        do 1, i = 1, NVARS
+            canConvert = (var_type(i) .eq. NF_CHAR) .eqv.
+     +                   (NFT_TEXT .eq. NFT_TEXT)
+            err = nf_put_var_text(BAD_ID, i, value)
+            if (err .ne. NF_EBADID) 
+     +          call errore('bad ncid: ', err)
+            err = nf_put_var_text(ncid, BAD_VARID, value)
+            if (err .ne. NF_ENOTVAR) 
+     +          call errore('bad var id: ', err)
+            nels = 1
+            do 3, j = 1, var_rank(i)
+                nels = nels * var_shape(j,i)
+3           continue
+            allInExtRange = .true.
+            do 4, j = 1, var_nels(i)
+                err = index2indexes(j, var_rank(i), var_shape(1,i), 
+     +                              index)
+                if (err .ne. 0) 
+     +              call error('error in index2indexes 1')
+                value(j) = char(int(hash_text(var_type(i), 
+     +              var_rank(i),
+     +              index, NFT_TEXT)))
+                val = ichar(value(j))
+                allInExtRange = allInExtRange .and.
+     +              inRange3(val, var_type(i), NFT_TEXT)
+4           continue
+            err = nf_put_var_text(ncid, i, value)
+            if (canConvert) then
+                if (allInExtRange) then
+                    if (err .ne. 0)
+     +                  call error(nf_strerror(err))
+                else
+                    if (err .ne. NF_ERANGE .and.
+     +                      var_dimid(var_rank(i),i) .ne. RECDIM)
+     +                  call errore('Range error: ', err)
+                endif
+            else
+                if (err .ne. NF_ECHAR)
+     +              call errore('wrong type: ', err)
+            endif
+1       continue
+
+C       The preceeding has written nothing for record variables, now try
+C       again with more than 0 records.
+
+C       Write record number NRECS to force writing of preceding records.
+C       Assumes variable cr is char vector with UNLIMITED dimension.
+
+        err = nf_inq_varid(ncid, "cr", vid)
+        if (err .ne. 0)
+     +      call errore('nf_inq_varid: ', err)
+        index(1) = NRECS
+        err = nf_put_var1_text(ncid, vid, index, 'x')
+        if (err .ne. 0)
+     +      call errore('nf_put_var1_text: ', err)
+
+        do 5 i = 1, NVARS
+C           Only test record variables here
+            if (var_rank(i) .ge. 1 .and.
+     +          var_dimid(var_rank(i),i) .eq. RECDIM) then
+                canConvert = (var_type(i) .eq. NF_CHAR) .eqv.
+     +                   (NFT_TEXT .eq. NFT_TEXT)
+                if (var_rank(i) .gt. MAX_RANK)
+     +              stop 2
+                if (var_nels(i) .gt. MAX_NELS)
+     +              stop 2
+                err = nf_put_var_text(BAD_ID, i, value)
+
+                nels = 1
+                do 6 j = 1, var_rank(i)
+                    nels = nels * var_shape(j,i)
+6               continue
+                allInExtRange = .true.
+                do 7, j = 1, nels
+                    err = index2indexes(j, var_rank(i), var_shape(1,i), 
+     +                              index)
+                    if (err .ne. 0) 
+     +                  call error('error in index2indexes()')
+                    value(j) = char(int(hash_text(var_type(i), 
+     +                  var_rank(i),
+     +                  index, NFT_TEXT)))
+                    val = ichar(value(j))
+                    allInExtRange = allInExtRange .and.
+     +                  inRange3(val, var_type(i), NFT_TEXT)
+7               continue
+                err = nf_put_var_text(ncid, i, value)
+                if (canConvert) then
+                    if (allInExtRange) then
+                        if (err .ne. 0)
+     +                      call error(nf_strerror(err))
+                    else
+                        if (err .ne. NF_ERANGE)
+     +                      call errore('range error: ', err)
+                    endif
+                else
+                    if (nels .gt. 0 .and. err .ne. NF_ECHAR)
+     +                  call errore('wrong type: ', err)
+                endif
+            endif
+5       continue
+
+        err = nf_close(ncid)
+        if (err .ne. 0) 
+     +      call errore('nf_close: ', err)
+
+        call check_vars_text(scratch)
+
+        err = nf_delete(scratch)
+        if (err .ne. 0)
+     +      call errorc('delete of scratch file failed: ', 
+     +                  scratch)
+        end
+
+#ifdef NF_INT1_T
+        subroutine test_nf_put_var_int1()
+        implicit        none
+#include "tests.inc"
+        integer ncid
+        integer vid
+        integer i
+        integer j
+        integer err
+        integer nels
+        integer index(MAX_RANK)
+        logical canConvert      !/* Both text or both numeric */
+        logical allInExtRange   !/* All values within external range?*/
+        NF_INT1_T    value(MAX_NELS)
+        doubleprecision val
+
+        err = nf_create(scratch, NF_CLOBBER, ncid)
+        if (err .ne. 0) then
+            call errore('nf_create: ', err)
+            return
+        end if
+        call def_dims(ncid)
+        call def_vars(ncid)
+        err = nf_enddef(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_enddef: ', err)
+
+        do 1, i = 1, NVARS
+            canConvert = (var_type(i) .eq. NF_CHAR) .eqv.
+     +                   (NFT_INT1 .eq. NFT_TEXT)
+            err = nf_put_var_int1(BAD_ID, i, value)
+            if (err .ne. NF_EBADID) 
+     +          call errore('bad ncid: ', err)
+            err = nf_put_var_int1(ncid, BAD_VARID, value)
+            if (err .ne. NF_ENOTVAR) 
+     +          call errore('bad var id: ', err)
+            nels = 1
+            do 3, j = 1, var_rank(i)
+                nels = nels * var_shape(j,i)
+3           continue
+            allInExtRange = .true.
+            do 4, j = 1, var_nels(i)
+                err = index2indexes(j, var_rank(i), var_shape(1,i), 
+     +                              index)
+                if (err .ne. 0) 
+     +              call error('error in index2indexes 1')
+                value(j) = hash_int1(var_type(i), 
+     +              var_rank(i),
+     +              index, NFT_INT1)
+                val = value(j)
+                allInExtRange = allInExtRange .and.
+     +              inRange3(val, var_type(i), NFT_INT1)
+4           continue
+            err = nf_put_var_int1(ncid, i, value)
+            if (canConvert) then
+                if (allInExtRange) then
+                    if (err .ne. 0)
+     +                  call error(nf_strerror(err))
+                else
+                    if (err .ne. NF_ERANGE .and.
+     +                      var_dimid(var_rank(i),i) .ne. RECDIM)
+     +                  call errore('Range error: ', err)
+                endif
+            else
+                if (err .ne. NF_ECHAR)
+     +              call errore('wrong type: ', err)
+            endif
+1       continue
+
+C       The preceeding has written nothing for record variables, now try
+C       again with more than 0 records.
+
+C       Write record number NRECS to force writing of preceding records.
+C       Assumes variable cr is char vector with UNLIMITED dimension.
+
+        err = nf_inq_varid(ncid, "cr", vid)
+        if (err .ne. 0)
+     +      call errore('nf_inq_varid: ', err)
+        index(1) = NRECS
+        err = nf_put_var1_text(ncid, vid, index, 'x')
+        if (err .ne. 0)
+     +      call errore('nf_put_var1_text: ', err)
+
+        do 5 i = 1, NVARS
+C           Only test record variables here
+            if (var_rank(i) .ge. 1 .and.
+     +          var_dimid(var_rank(i),i) .eq. RECDIM) then
+                canConvert = (var_type(i) .eq. NF_CHAR) .eqv.
+     +                   (NFT_INT1 .eq. NFT_TEXT)
+                if (var_rank(i) .gt. MAX_RANK)
+     +              stop 2
+                if (var_nels(i) .gt. MAX_NELS)
+     +              stop 2
+                err = nf_put_var_int1(BAD_ID, i, value)
+
+                nels = 1
+                do 6 j = 1, var_rank(i)
+                    nels = nels * var_shape(j,i)
+6               continue
+                allInExtRange = .true.
+                do 7, j = 1, nels
+                    err = index2indexes(j, var_rank(i), var_shape(1,i), 
+     +                              index)
+                    if (err .ne. 0) 
+     +                  call error('error in index2indexes()')
+                    value(j) = hash_int1(var_type(i), 
+     +                  var_rank(i),
+     +                  index, NFT_INT1)
+                    val = value(j)
+                    allInExtRange = allInExtRange .and.
+     +                  inRange3(val, var_type(i), NFT_INT1)
+7               continue
+                err = nf_put_var_int1(ncid, i, value)
+                if (canConvert) then
+                    if (allInExtRange) then
+                        if (err .ne. 0)
+     +                      call error(nf_strerror(err))
+                    else
+                        if (err .ne. NF_ERANGE)
+     +                      call errore('range error: ', err)
+                    endif
+                else
+                    if (nels .gt. 0 .and. err .ne. NF_ECHAR)
+     +                  call errore('wrong type: ', err)
+                endif
+            endif
+5       continue
+
+        err = nf_close(ncid)
+        if (err .ne. 0) 
+     +      call errore('nf_close: ', err)
+
+        call check_vars_int1(scratch)
+
+        err = nf_delete(scratch)
+        if (err .ne. 0)
+     +      call errorc('delete of scratch file failed: ', 
+     +                  scratch)
+        end
+
+#endif
+#ifdef NF_INT2_T
+        subroutine test_nf_put_var_int2()
+        implicit        none
+#include "tests.inc"
+        integer ncid
+        integer vid
+        integer i
+        integer j
+        integer err
+        integer nels
+        integer index(MAX_RANK)
+        logical canConvert      !/* Both text or both numeric */
+        logical allInExtRange   !/* All values within external range?*/
+        NF_INT2_T    value(MAX_NELS)
+        doubleprecision val
+
+        err = nf_create(scratch, NF_CLOBBER, ncid)
+        if (err .ne. 0) then
+            call errore('nf_create: ', err)
+            return
+        end if
+        call def_dims(ncid)
+        call def_vars(ncid)
+        err = nf_enddef(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_enddef: ', err)
+
+        do 1, i = 1, NVARS
+            canConvert = (var_type(i) .eq. NF_CHAR) .eqv.
+     +                   (NFT_INT2 .eq. NFT_TEXT)
+            err = nf_put_var_int2(BAD_ID, i, value)
+            if (err .ne. NF_EBADID) 
+     +          call errore('bad ncid: ', err)
+            err = nf_put_var_int2(ncid, BAD_VARID, value)
+            if (err .ne. NF_ENOTVAR) 
+     +          call errore('bad var id: ', err)
+            nels = 1
+            do 3, j = 1, var_rank(i)
+                nels = nels * var_shape(j,i)
+3           continue
+            allInExtRange = .true.
+            do 4, j = 1, var_nels(i)
+                err = index2indexes(j, var_rank(i), var_shape(1,i), 
+     +                              index)
+                if (err .ne. 0) 
+     +              call error('error in index2indexes 1')
+                value(j) = hash_int2(var_type(i), 
+     +              var_rank(i),
+     +              index, NFT_INT2)
+                val = value(j)
+                allInExtRange = allInExtRange .and.
+     +              inRange3(val, var_type(i), NFT_INT2)
+4           continue
+            err = nf_put_var_int2(ncid, i, value)
+            if (canConvert) then
+                if (allInExtRange) then
+                    if (err .ne. 0)
+     +                  call error(nf_strerror(err))
+                else
+                    if (err .ne. NF_ERANGE .and.
+     +                      var_dimid(var_rank(i),i) .ne. RECDIM)
+     +                  call errore('Range error: ', err)
+                endif
+            else
+                if (err .ne. NF_ECHAR)
+     +              call errore('wrong type: ', err)
+            endif
+1       continue
+
+C       The preceeding has written nothing for record variables, now try
+C       again with more than 0 records.
+
+C       Write record number NRECS to force writing of preceding records.
+C       Assumes variable cr is char vector with UNLIMITED dimension.
+
+        err = nf_inq_varid(ncid, "cr", vid)
+        if (err .ne. 0)
+     +      call errore('nf_inq_varid: ', err)
+        index(1) = NRECS
+        err = nf_put_var1_text(ncid, vid, index, 'x')
+        if (err .ne. 0)
+     +      call errore('nf_put_var1_text: ', err)
+
+        do 5 i = 1, NVARS
+C           Only test record variables here
+            if (var_rank(i) .ge. 1 .and.
+     +          var_dimid(var_rank(i),i) .eq. RECDIM) then
+                canConvert = (var_type(i) .eq. NF_CHAR) .eqv.
+     +                   (NFT_INT2 .eq. NFT_TEXT)
+                if (var_rank(i) .gt. MAX_RANK)
+     +              stop 2
+                if (var_nels(i) .gt. MAX_NELS)
+     +              stop 2
+                err = nf_put_var_int2(BAD_ID, i, value)
+
+                nels = 1
+                do 6 j = 1, var_rank(i)
+                    nels = nels * var_shape(j,i)
+6               continue
+                allInExtRange = .true.
+                do 7, j = 1, nels
+                    err = index2indexes(j, var_rank(i), var_shape(1,i), 
+     +                              index)
+                    if (err .ne. 0) 
+     +                  call error('error in index2indexes()')
+                    value(j) = hash_int2(var_type(i), 
+     +                  var_rank(i),
+     +                  index, NFT_INT2)
+                    val = value(j)
+                    allInExtRange = allInExtRange .and.
+     +                  inRange3(val, var_type(i), NFT_INT2)
+7               continue
+                err = nf_put_var_int2(ncid, i, value)
+                if (canConvert) then
+                    if (allInExtRange) then
+                        if (err .ne. 0)
+     +                      call error(nf_strerror(err))
+                    else
+                        if (err .ne. NF_ERANGE)
+     +                      call errore('range error: ', err)
+                    endif
+                else
+                    if (nels .gt. 0 .and. err .ne. NF_ECHAR)
+     +                  call errore('wrong type: ', err)
+                endif
+            endif
+5       continue
+
+        err = nf_close(ncid)
+        if (err .ne. 0) 
+     +      call errore('nf_close: ', err)
+
+        call check_vars_int2(scratch)
+
+        err = nf_delete(scratch)
+        if (err .ne. 0)
+     +      call errorc('delete of scratch file failed: ', 
+     +                  scratch)
+        end
+
+#endif
+        subroutine test_nf_put_var_int()
+        implicit        none
+#include "tests.inc"
+        integer ncid
+        integer vid
+        integer i
+        integer j
+        integer err
+        integer nels
+        integer index(MAX_RANK)
+        logical canConvert      !/* Both text or both numeric */
+        logical allInExtRange   !/* All values within external range?*/
+        integer    value(MAX_NELS)
+        doubleprecision val
+
+        err = nf_create(scratch, NF_CLOBBER, ncid)
+        if (err .ne. 0) then
+            call errore('nf_create: ', err)
+            return
+        end if
+        call def_dims(ncid)
+        call def_vars(ncid)
+        err = nf_enddef(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_enddef: ', err)
+
+        do 1, i = 1, NVARS
+            canConvert = (var_type(i) .eq. NF_CHAR) .eqv.
+     +                   (NFT_INT .eq. NFT_TEXT)
+            err = nf_put_var_int(BAD_ID, i, value)
+            if (err .ne. NF_EBADID) 
+     +          call errore('bad ncid: ', err)
+            err = nf_put_var_int(ncid, BAD_VARID, value)
+            if (err .ne. NF_ENOTVAR) 
+     +          call errore('bad var id: ', err)
+            nels = 1
+            do 3, j = 1, var_rank(i)
+                nels = nels * var_shape(j,i)
+3           continue
+            allInExtRange = .true.
+            do 4, j = 1, var_nels(i)
+                err = index2indexes(j, var_rank(i), var_shape(1,i), 
+     +                              index)
+                if (err .ne. 0) 
+     +              call error('error in index2indexes 1')
+                value(j) = hash_int(var_type(i), 
+     +              var_rank(i),
+     +              index, NFT_INT)
+                val = value(j)
+                allInExtRange = allInExtRange .and.
+     +              inRange3(val, var_type(i), NFT_INT)
+4           continue
+            err = nf_put_var_int(ncid, i, value)
+            if (canConvert) then
+                if (allInExtRange) then
+                    if (err .ne. 0)
+     +                  call error(nf_strerror(err))
+                else
+                    if (err .ne. NF_ERANGE .and.
+     +                      var_dimid(var_rank(i),i) .ne. RECDIM)
+     +                  call errore('Range error: ', err)
+                endif
+            else
+                if (err .ne. NF_ECHAR)
+     +              call errore('wrong type: ', err)
+            endif
+1       continue
+
+C       The preceeding has written nothing for record variables, now try
+C       again with more than 0 records.
+
+C       Write record number NRECS to force writing of preceding records.
+C       Assumes variable cr is char vector with UNLIMITED dimension.
+
+        err = nf_inq_varid(ncid, "cr", vid)
+        if (err .ne. 0)
+     +      call errore('nf_inq_varid: ', err)
+        index(1) = NRECS
+        err = nf_put_var1_text(ncid, vid, index, 'x')
+        if (err .ne. 0)
+     +      call errore('nf_put_var1_text: ', err)
+
+        do 5 i = 1, NVARS
+C           Only test record variables here
+            if (var_rank(i) .ge. 1 .and.
+     +          var_dimid(var_rank(i),i) .eq. RECDIM) then
+                canConvert = (var_type(i) .eq. NF_CHAR) .eqv.
+     +                   (NFT_INT .eq. NFT_TEXT)
+                if (var_rank(i) .gt. MAX_RANK)
+     +              stop 2
+                if (var_nels(i) .gt. MAX_NELS)
+     +              stop 2
+                err = nf_put_var_int(BAD_ID, i, value)
+
+                nels = 1
+                do 6 j = 1, var_rank(i)
+                    nels = nels * var_shape(j,i)
+6               continue
+                allInExtRange = .true.
+                do 7, j = 1, nels
+                    err = index2indexes(j, var_rank(i), var_shape(1,i), 
+     +                              index)
+                    if (err .ne. 0) 
+     +                  call error('error in index2indexes()')
+                    value(j) = hash_int(var_type(i), 
+     +                  var_rank(i),
+     +                  index, NFT_INT)
+                    val = value(j)
+                    allInExtRange = allInExtRange .and.
+     +                  inRange3(val, var_type(i), NFT_INT)
+7               continue
+                err = nf_put_var_int(ncid, i, value)
+                if (canConvert) then
+                    if (allInExtRange) then
+                        if (err .ne. 0)
+     +                      call error(nf_strerror(err))
+                    else
+                        if (err .ne. NF_ERANGE)
+     +                      call errore('range error: ', err)
+                    endif
+                else
+                    if (nels .gt. 0 .and. err .ne. NF_ECHAR)
+     +                  call errore('wrong type: ', err)
+                endif
+            endif
+5       continue
+
+        err = nf_close(ncid)
+        if (err .ne. 0) 
+     +      call errore('nf_close: ', err)
+
+        call check_vars_int(scratch)
+
+        err = nf_delete(scratch)
+        if (err .ne. 0)
+     +      call errorc('delete of scratch file failed: ', 
+     +                  scratch)
+        end
+
+        subroutine test_nf_put_var_real()
+        implicit        none
+#include "tests.inc"
+        integer ncid
+        integer vid
+        integer i
+        integer j
+        integer err
+        integer nels
+        integer index(MAX_RANK)
+        logical canConvert      !/* Both text or both numeric */
+        logical allInExtRange   !/* All values within external range?*/
+        real    value(MAX_NELS)
+        doubleprecision val
+
+        err = nf_create(scratch, NF_CLOBBER, ncid)
+        if (err .ne. 0) then
+            call errore('nf_create: ', err)
+            return
+        end if
+        call def_dims(ncid)
+        call def_vars(ncid)
+        err = nf_enddef(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_enddef: ', err)
+
+        do 1, i = 1, NVARS
+            canConvert = (var_type(i) .eq. NF_CHAR) .eqv.
+     +                   (NFT_REAL .eq. NFT_TEXT)
+            err = nf_put_var_real(BAD_ID, i, value)
+            if (err .ne. NF_EBADID) 
+     +          call errore('bad ncid: ', err)
+            err = nf_put_var_real(ncid, BAD_VARID, value)
+            if (err .ne. NF_ENOTVAR) 
+     +          call errore('bad var id: ', err)
+            nels = 1
+            do 3, j = 1, var_rank(i)
+                nels = nels * var_shape(j,i)
+3           continue
+            allInExtRange = .true.
+            do 4, j = 1, var_nels(i)
+                err = index2indexes(j, var_rank(i), var_shape(1,i), 
+     +                              index)
+                if (err .ne. 0) 
+     +              call error('error in index2indexes 1')
+                value(j) = hash_real(var_type(i), 
+     +              var_rank(i),
+     +              index, NFT_REAL)
+                val = value(j)
+                allInExtRange = allInExtRange .and.
+     +              inRange3(val, var_type(i), NFT_REAL)
+4           continue
+            err = nf_put_var_real(ncid, i, value)
+            if (canConvert) then
+                if (allInExtRange) then
+                    if (err .ne. 0)
+     +                  call error(nf_strerror(err))
+                else
+                    if (err .ne. NF_ERANGE .and.
+     +                      var_dimid(var_rank(i),i) .ne. RECDIM)
+     +                  call errore('Range error: ', err)
+                endif
+            else
+                if (err .ne. NF_ECHAR)
+     +              call errore('wrong type: ', err)
+            endif
+1       continue
+
+C       The preceeding has written nothing for record variables, now try
+C       again with more than 0 records.
+
+C       Write record number NRECS to force writing of preceding records.
+C       Assumes variable cr is char vector with UNLIMITED dimension.
+
+        err = nf_inq_varid(ncid, "cr", vid)
+        if (err .ne. 0)
+     +      call errore('nf_inq_varid: ', err)
+        index(1) = NRECS
+        err = nf_put_var1_text(ncid, vid, index, 'x')
+        if (err .ne. 0)
+     +      call errore('nf_put_var1_text: ', err)
+
+        do 5 i = 1, NVARS
+C           Only test record variables here
+            if (var_rank(i) .ge. 1 .and.
+     +          var_dimid(var_rank(i),i) .eq. RECDIM) then
+                canConvert = (var_type(i) .eq. NF_CHAR) .eqv.
+     +                   (NFT_REAL .eq. NFT_TEXT)
+                if (var_rank(i) .gt. MAX_RANK)
+     +              stop 2
+                if (var_nels(i) .gt. MAX_NELS)
+     +              stop 2
+                err = nf_put_var_real(BAD_ID, i, value)
+
+                nels = 1
+                do 6 j = 1, var_rank(i)
+                    nels = nels * var_shape(j,i)
+6               continue
+                allInExtRange = .true.
+                do 7, j = 1, nels
+                    err = index2indexes(j, var_rank(i), var_shape(1,i), 
+     +                              index)
+                    if (err .ne. 0) 
+     +                  call error('error in index2indexes()')
+                    value(j) = hash_real(var_type(i), 
+     +                  var_rank(i),
+     +                  index, NFT_REAL)
+                    val = value(j)
+                    allInExtRange = allInExtRange .and.
+     +                  inRange3(val, var_type(i), NFT_REAL)
+7               continue
+                err = nf_put_var_real(ncid, i, value)
+                if (canConvert) then
+                    if (allInExtRange) then
+                        if (err .ne. 0)
+     +                      call error(nf_strerror(err))
+                    else
+                        if (err .ne. NF_ERANGE)
+     +                      call errore('range error: ', err)
+                    endif
+                else
+                    if (nels .gt. 0 .and. err .ne. NF_ECHAR)
+     +                  call errore('wrong type: ', err)
+                endif
+            endif
+5       continue
+
+        err = nf_close(ncid)
+        if (err .ne. 0) 
+     +      call errore('nf_close: ', err)
+
+        call check_vars_real(scratch)
+
+        err = nf_delete(scratch)
+        if (err .ne. 0)
+     +      call errorc('delete of scratch file failed: ', 
+     +                  scratch)
+        end
+
+        subroutine test_nf_put_var_double()
+        implicit        none
+#include "tests.inc"
+        integer ncid
+        integer vid
+        integer i
+        integer j
+        integer err
+        integer nels
+        integer index(MAX_RANK)
+        logical canConvert      !/* Both text or both numeric */
+        logical allInExtRange   !/* All values within external range?*/
+        doubleprecision    value(MAX_NELS)
+        doubleprecision val
+
+        err = nf_create(scratch, NF_CLOBBER, ncid)
+        if (err .ne. 0) then
+            call errore('nf_create: ', err)
+            return
+        end if
+        call def_dims(ncid)
+        call def_vars(ncid)
+        err = nf_enddef(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_enddef: ', err)
+
+        do 1, i = 1, NVARS
+            canConvert = (var_type(i) .eq. NF_CHAR) .eqv.
+     +                   (NFT_DOUBLE .eq. NFT_TEXT)
+            err = nf_put_var_double(BAD_ID, i, value)
+            if (err .ne. NF_EBADID) 
+     +          call errore('bad ncid: ', err)
+            err = nf_put_var_double(ncid, BAD_VARID, value)
+            if (err .ne. NF_ENOTVAR) 
+     +          call errore('bad var id: ', err)
+            nels = 1
+            do 3, j = 1, var_rank(i)
+                nels = nels * var_shape(j,i)
+3           continue
+            allInExtRange = .true.
+            do 4, j = 1, var_nels(i)
+                err = index2indexes(j, var_rank(i), var_shape(1,i), 
+     +                              index)
+                if (err .ne. 0) 
+     +              call error('error in index2indexes 1')
+                value(j) = hash_double(var_type(i), 
+     +              var_rank(i),
+     +              index, NFT_DOUBLE)
+                val = value(j)
+                allInExtRange = allInExtRange .and.
+     +              inRange3(val, var_type(i), NFT_DOUBLE)
+4           continue
+            err = nf_put_var_double(ncid, i, value)
+            if (canConvert) then
+                if (allInExtRange) then
+                    if (err .ne. 0)
+     +                  call error(nf_strerror(err))
+                else
+                    if (err .ne. NF_ERANGE .and.
+     +                      var_dimid(var_rank(i),i) .ne. RECDIM)
+     +                  call errore('Range error: ', err)
+                endif
+            else
+                if (err .ne. NF_ECHAR)
+     +              call errore('wrong type: ', err)
+            endif
+1       continue
+
+C       The preceeding has written nothing for record variables, now try
+C       again with more than 0 records.
+
+C       Write record number NRECS to force writing of preceding records.
+C       Assumes variable cr is char vector with UNLIMITED dimension.
+
+        err = nf_inq_varid(ncid, "cr", vid)
+        if (err .ne. 0)
+     +      call errore('nf_inq_varid: ', err)
+        index(1) = NRECS
+        err = nf_put_var1_text(ncid, vid, index, 'x')
+        if (err .ne. 0)
+     +      call errore('nf_put_var1_text: ', err)
+
+        do 5 i = 1, NVARS
+C           Only test record variables here
+            if (var_rank(i) .ge. 1 .and.
+     +          var_dimid(var_rank(i),i) .eq. RECDIM) then
+                canConvert = (var_type(i) .eq. NF_CHAR) .eqv.
+     +                   (NFT_DOUBLE .eq. NFT_TEXT)
+                if (var_rank(i) .gt. MAX_RANK)
+     +              stop 2
+                if (var_nels(i) .gt. MAX_NELS)
+     +              stop 2
+                err = nf_put_var_double(BAD_ID, i, value)
+
+                nels = 1
+                do 6 j = 1, var_rank(i)
+                    nels = nels * var_shape(j,i)
+6               continue
+                allInExtRange = .true.
+                do 7, j = 1, nels
+                    err = index2indexes(j, var_rank(i), var_shape(1,i), 
+     +                              index)
+                    if (err .ne. 0) 
+     +                  call error('error in index2indexes()')
+                    value(j) = hash_double(var_type(i), 
+     +                  var_rank(i),
+     +                  index, NFT_DOUBLE)
+                    val = value(j)
+                    allInExtRange = allInExtRange .and.
+     +                  inRange3(val, var_type(i), NFT_DOUBLE)
+7               continue
+                err = nf_put_var_double(ncid, i, value)
+                if (canConvert) then
+                    if (allInExtRange) then
+                        if (err .ne. 0)
+     +                      call error(nf_strerror(err))
+                    else
+                        if (err .ne. NF_ERANGE)
+     +                      call errore('range error: ', err)
+                    endif
+                else
+                    if (nels .gt. 0 .and. err .ne. NF_ECHAR)
+     +                  call errore('wrong type: ', err)
+                endif
+            endif
+5       continue
+
+        err = nf_close(ncid)
+        if (err .ne. 0) 
+     +      call errore('nf_close: ', err)
+
+        call check_vars_double(scratch)
+
+        err = nf_delete(scratch)
+        if (err .ne. 0)
+     +      call errorc('delete of scratch file failed: ', 
+     +                  scratch)
+        end
+
+
+        subroutine test_nf_put_vara_text()
+        implicit        none
+#include "tests.inc"
+        integer ncid
+        integer i
+        integer j
+        integer k
+        integer d
+        integer err
+        integer nslabs
+        integer nels
+        integer start(MAX_RANK)
+        integer edge(MAX_RANK)
+        integer mid(MAX_RANK)
+        integer index(MAX_RANK)
+        logical canConvert      !/* Both text or both numeric */
+        logical allInExtRange   !/* all values within external range? */
+        character    value(MAX_NELS)
+        doubleprecision val
+        integer udshift
+
+        err = nf_create(scratch, NF_CLOBBER, ncid)
+        if (err .ne. 0) then
+            call errore('nf_create: ', err)
+            return
+        end if
+        call def_dims(ncid)
+        call def_vars(ncid)
+        err = nf_enddef(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_enddef: ', err)
+
+        do 1, i = 1, NVARS
+            canConvert = (var_type(i) .eq. NF_CHAR) .eqv.
+     +                   (NFT_TEXT .eq. NFT_TEXT)
+            if (.not.(var_rank(i) .le. MAX_RANK))
+     +          stop 2
+            if (.not.(var_nels(i) .le. MAX_NELS))
+     +          stop 2
+            do 2, j = 1, var_rank(i)
+                start(j) = 1
+                edge(j) = 1
+2           continue
+            err = nf_put_vara_text(BAD_ID, i, start,
+     +                  edge, value)
+            if (err .ne. NF_EBADID) 
+     +          call errore('bad ncid: ', err)
+            err = nf_put_vara_text(ncid, BAD_VARID,
+     +                  start, edge, value)
+            if (err .ne. NF_ENOTVAR) 
+     +          call errore('bad var id: ', err)
+            do 3, j = 1, var_rank(i)
+                if (var_dimid(j,i) .ne. RECDIM) then    !/* skip record dim */
+                    start(j) = var_shape(j,i) + 1
+                    err = nf_put_vara_text(ncid, i, start, 
+     +                                   edge, value)
+                    if (.not. canConvert) then
+                        if (err .ne. NF_ECHAR)
+     +                      call errore('conversion: ', err)
+                    else
+                        if (err .ne. NF_EINVALCOORDS)
+     +                      call errore('bad start: ', err)
+                    endif
+                    start(j) = 1
+                    edge(j) = var_shape(j,i) + 1
+                    err = nf_put_vara_text(ncid, i, start, 
+     +                                   edge, value)
+                    if (.not. canConvert) then
+                        if (err .ne. NF_ECHAR)
+     +                      call errore('conversion: ', err)
+                    else
+                        if (err .ne. NF_EEDGE)
+     +                      call errore('bad edge: ', err)
+                    endif
+                    edge(j) = 1
+                end if
+3           continue
+
+C       /* Check correct error returned even when nothing to put */
+        do 20, j = 1, var_rank(i)
+              edge(j) = 0
+20      continue
+        err = nf_put_vara_text(BAD_ID, i, start,
+     +          edge, value)
+        if (err .ne. NF_EBADID) 
+     +      call errore('bad ncid: ', err)
+        err = nf_put_vara_text(ncid, BAD_VARID,
+     +          start, edge, value)
+        if (err .ne. NF_ENOTVAR) 
+     +      call errore('bad var id: ', err)
+        do 21, j = 1, var_rank(i)
+            if (var_dimid(j,i) .gt. 1) then     ! skip record dim
+                start(j) = var_shape(j,i) + 2
+                err = nf_put_vara_text(ncid, i, start,
+     +                  edge, value)
+                if (.not. canConvert) then
+                    if (err .ne. NF_ECHAR)
+     +                  call errore('conversion: ', err)
+                else
+                    if (err .ne. NF_EINVALCOORDS)
+     +                  call errore('bad start: ', err)
+                endif
+                start(j) = 1
+            endif
+21      continue
+        err = nf_put_vara_text(ncid, i, start, edge, value)
+        if (canConvert) then
+            if (err .ne. 0) 
+     +          call error(nf_strerror(err))
+        else
+            if (err .ne. NF_ECHAR)
+     +          call errore('wrong type: ', err)
+        endif
+        do 22, j = 1, var_rank(i)
+              edge(j) = 1
+22      continue
+
+
+                !/* Choose a random point dividing each dim into 2 parts */
+                !/* Put 2^rank (nslabs) slabs so defined */
+            nslabs = 1
+            do 4, j = 1, var_rank(i)
+                mid(j) = roll( var_shape(j,i) )
+                nslabs = nslabs * 2
+4           continue
+                !/* bits of k determine whether to put lower or upper part of dim */
+            do 5, k = 1, nslabs
+                nels = 1
+                do 6, j = 1, var_rank(i)
+                    if (mod(udshift(k-1, -(j-1)), 2) .eq. 1) then
+                        start(j) = 1
+                        edge(j) = mid(j)
+                    else
+                        start(j) = 1 + mid(j)
+                        edge(j) = var_shape(j,i) - mid(j)
+                    end if
+                    nels = nels * edge(j)
+6               continue
+                allInExtRange = .true.
+                do 7, j = 1, nels
+                    err = index2indexes(j, var_rank(i), edge, index)
+                    if (err .ne. 0) 
+     +                  call error('error in index2indexes 1')
+                    do 8, d = 1, var_rank(i)
+                        index(d) = index(d) + start(d) - 1
+8                   continue
+                    value(j)= char(int(hash_text(var_type(i), 
+     +                                  var_rank(i), index, 
+     +                                  NFT_TEXT)))
+                    val = ichar(value(j))
+                    allInExtRange = allInExtRange .and.
+     +                  inRange3(val, var_type(i), NFT_TEXT)
+7               continue
+                err = nf_put_vara_text(ncid, i, start,
+     +                  edge, value)
+                if (canConvert) then
+                    if (allInExtRange) then
+                        if (err .ne. 0) 
+     +                      call error(nf_strerror(err))
+                    else
+                        if (err .ne. NF_ERANGE)
+     +                      call errore('range error: ', err)
+                    end if
+                else
+                    if (nels .gt. 0 .and. err .ne. NF_ECHAR)
+     +                  call errore('wrong type: ', err)
+                end if
+5           continue
+1       continue
+
+        err = nf_close(ncid)
+        if (err .ne. 0) 
+     +      call errore('nf_close: ', err)
+
+        call check_vars_text(scratch)
+
+        err = nf_delete(scratch)
+        if (err .ne. 0)
+     +      call errorc('delete of scratch file failed: ', 
+     +          scratch)
+        end
+
+#ifdef NF_INT1_T
+        subroutine test_nf_put_vara_int1()
+        implicit        none
+#include "tests.inc"
+        integer ncid
+        integer i
+        integer j
+        integer k
+        integer d
+        integer err
+        integer nslabs
+        integer nels
+        integer start(MAX_RANK)
+        integer edge(MAX_RANK)
+        integer mid(MAX_RANK)
+        integer index(MAX_RANK)
+        logical canConvert      !/* Both text or both numeric */
+        logical allInExtRange   !/* all values within external range? */
+        NF_INT1_T    value(MAX_NELS)
+        doubleprecision val
+        integer udshift
+
+        err = nf_create(scratch, NF_CLOBBER, ncid)
+        if (err .ne. 0) then
+            call errore('nf_create: ', err)
+            return
+        end if
+        call def_dims(ncid)
+        call def_vars(ncid)
+        err = nf_enddef(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_enddef: ', err)
+
+        do 1, i = 1, NVARS
+            canConvert = (var_type(i) .eq. NF_CHAR) .eqv.
+     +                   (NFT_INT1 .eq. NFT_TEXT)
+            if (.not.(var_rank(i) .le. MAX_RANK))
+     +          stop 2
+            if (.not.(var_nels(i) .le. MAX_NELS))
+     +          stop 2
+            do 2, j = 1, var_rank(i)
+                start(j) = 1
+                edge(j) = 1
+2           continue
+            err = nf_put_vara_int1(BAD_ID, i, start,
+     +                  edge, value)
+            if (err .ne. NF_EBADID) 
+     +          call errore('bad ncid: ', err)
+            err = nf_put_vara_int1(ncid, BAD_VARID,
+     +                  start, edge, value)
+            if (err .ne. NF_ENOTVAR) 
+     +          call errore('bad var id: ', err)
+            do 3, j = 1, var_rank(i)
+                if (var_dimid(j,i) .ne. RECDIM) then    !/* skip record dim */
+                    start(j) = var_shape(j,i) + 1
+                    err = nf_put_vara_int1(ncid, i, start, 
+     +                                   edge, value)
+                    if (.not. canConvert) then
+                        if (err .ne. NF_ECHAR)
+     +                      call errore('conversion: ', err)
+                    else
+                        if (err .ne. NF_EINVALCOORDS)
+     +                      call errore('bad start: ', err)
+                    endif
+                    start(j) = 1
+                    edge(j) = var_shape(j,i) + 1
+                    err = nf_put_vara_int1(ncid, i, start, 
+     +                                   edge, value)
+                    if (.not. canConvert) then
+                        if (err .ne. NF_ECHAR)
+     +                      call errore('conversion: ', err)
+                    else
+                        if (err .ne. NF_EEDGE)
+     +                      call errore('bad edge: ', err)
+                    endif
+                    edge(j) = 1
+                end if
+3           continue
+
+C       /* Check correct error returned even when nothing to put */
+        do 20, j = 1, var_rank(i)
+              edge(j) = 0
+20      continue
+        err = nf_put_vara_int1(BAD_ID, i, start,
+     +          edge, value)
+        if (err .ne. NF_EBADID) 
+     +      call errore('bad ncid: ', err)
+        err = nf_put_vara_int1(ncid, BAD_VARID,
+     +          start, edge, value)
+        if (err .ne. NF_ENOTVAR) 
+     +      call errore('bad var id: ', err)
+        do 21, j = 1, var_rank(i)
+            if (var_dimid(j,i) .gt. 1) then     ! skip record dim
+                start(j) = var_shape(j,i) + 2
+                err = nf_put_vara_int1(ncid, i, start,
+     +                  edge, value)
+                if (.not. canConvert) then
+                    if (err .ne. NF_ECHAR)
+     +                  call errore('conversion: ', err)
+                else
+                    if (err .ne. NF_EINVALCOORDS)
+     +                  call errore('bad start: ', err)
+                endif
+                start(j) = 1
+            endif
+21      continue
+        err = nf_put_vara_int1(ncid, i, start, edge, value)
+        if (canConvert) then
+            if (err .ne. 0) 
+     +          call error(nf_strerror(err))
+        else
+            if (err .ne. NF_ECHAR)
+     +          call errore('wrong type: ', err)
+        endif
+        do 22, j = 1, var_rank(i)
+              edge(j) = 1
+22      continue
+
+
+                !/* Choose a random point dividing each dim into 2 parts */
+                !/* Put 2^rank (nslabs) slabs so defined */
+            nslabs = 1
+            do 4, j = 1, var_rank(i)
+                mid(j) = roll( var_shape(j,i) )
+                nslabs = nslabs * 2
+4           continue
+                !/* bits of k determine whether to put lower or upper part of dim */
+            do 5, k = 1, nslabs
+                nels = 1
+                do 6, j = 1, var_rank(i)
+                    if (mod(udshift(k-1, -(j-1)), 2) .eq. 1) then
+                        start(j) = 1
+                        edge(j) = mid(j)
+                    else
+                        start(j) = 1 + mid(j)
+                        edge(j) = var_shape(j,i) - mid(j)
+                    end if
+                    nels = nels * edge(j)
+6               continue
+                allInExtRange = .true.
+                do 7, j = 1, nels
+                    err = index2indexes(j, var_rank(i), edge, index)
+                    if (err .ne. 0) 
+     +                  call error('error in index2indexes 1')
+                    do 8, d = 1, var_rank(i)
+                        index(d) = index(d) + start(d) - 1
+8                   continue
+                    value(j)= hash_int1(var_type(i), 
+     +                                  var_rank(i), index, 
+     +                                  NFT_INT1)
+                    val = value(j)
+                    allInExtRange = allInExtRange .and.
+     +                  inRange3(val, var_type(i), NFT_INT1)
+7               continue
+                err = nf_put_vara_int1(ncid, i, start,
+     +                  edge, value)
+                if (canConvert) then
+                    if (allInExtRange) then
+                        if (err .ne. 0) 
+     +                      call error(nf_strerror(err))
+                    else
+                        if (err .ne. NF_ERANGE)
+     +                      call errore('range error: ', err)
+                    end if
+                else
+                    if (nels .gt. 0 .and. err .ne. NF_ECHAR)
+     +                  call errore('wrong type: ', err)
+                end if
+5           continue
+1       continue
+
+        err = nf_close(ncid)
+        if (err .ne. 0) 
+     +      call errore('nf_close: ', err)
+
+        call check_vars_int1(scratch)
+
+        err = nf_delete(scratch)
+        if (err .ne. 0)
+     +      call errorc('delete of scratch file failed: ', 
+     +          scratch)
+        end
+
+#endif
+#ifdef NF_INT2_T
+        subroutine test_nf_put_vara_int2()
+        implicit        none
+#include "tests.inc"
+        integer ncid
+        integer i
+        integer j
+        integer k
+        integer d
+        integer err
+        integer nslabs
+        integer nels
+        integer start(MAX_RANK)
+        integer edge(MAX_RANK)
+        integer mid(MAX_RANK)
+        integer index(MAX_RANK)
+        logical canConvert      !/* Both text or both numeric */
+        logical allInExtRange   !/* all values within external range? */
+        NF_INT2_T    value(MAX_NELS)
+        doubleprecision val
+        integer udshift
+
+        err = nf_create(scratch, NF_CLOBBER, ncid)
+        if (err .ne. 0) then
+            call errore('nf_create: ', err)
+            return
+        end if
+        call def_dims(ncid)
+        call def_vars(ncid)
+        err = nf_enddef(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_enddef: ', err)
+
+        do 1, i = 1, NVARS
+            canConvert = (var_type(i) .eq. NF_CHAR) .eqv.
+     +                   (NFT_INT2 .eq. NFT_TEXT)
+            if (.not.(var_rank(i) .le. MAX_RANK))
+     +          stop 2
+            if (.not.(var_nels(i) .le. MAX_NELS))
+     +          stop 2
+            do 2, j = 1, var_rank(i)
+                start(j) = 1
+                edge(j) = 1
+2           continue
+            err = nf_put_vara_int2(BAD_ID, i, start,
+     +                  edge, value)
+            if (err .ne. NF_EBADID) 
+     +          call errore('bad ncid: ', err)
+            err = nf_put_vara_int2(ncid, BAD_VARID,
+     +                  start, edge, value)
+            if (err .ne. NF_ENOTVAR) 
+     +          call errore('bad var id: ', err)
+            do 3, j = 1, var_rank(i)
+                if (var_dimid(j,i) .ne. RECDIM) then    !/* skip record dim */
+                    start(j) = var_shape(j,i) + 1
+                    err = nf_put_vara_int2(ncid, i, start, 
+     +                                   edge, value)
+                    if (.not. canConvert) then
+                        if (err .ne. NF_ECHAR)
+     +                      call errore('conversion: ', err)
+                    else
+                        if (err .ne. NF_EINVALCOORDS)
+     +                      call errore('bad start: ', err)
+                    endif
+                    start(j) = 1
+                    edge(j) = var_shape(j,i) + 1
+                    err = nf_put_vara_int2(ncid, i, start, 
+     +                                   edge, value)
+                    if (.not. canConvert) then
+                        if (err .ne. NF_ECHAR)
+     +                      call errore('conversion: ', err)
+                    else
+                        if (err .ne. NF_EEDGE)
+     +                      call errore('bad edge: ', err)
+                    endif
+                    edge(j) = 1
+                end if
+3           continue
+
+C       /* Check correct error returned even when nothing to put */
+        do 20, j = 1, var_rank(i)
+              edge(j) = 0
+20      continue
+        err = nf_put_vara_int2(BAD_ID, i, start,
+     +          edge, value)
+        if (err .ne. NF_EBADID) 
+     +      call errore('bad ncid: ', err)
+        err = nf_put_vara_int2(ncid, BAD_VARID,
+     +          start, edge, value)
+        if (err .ne. NF_ENOTVAR) 
+     +      call errore('bad var id: ', err)
+        do 21, j = 1, var_rank(i)
+            if (var_dimid(j,i) .gt. 1) then     ! skip record dim
+                start(j) = var_shape(j,i) + 2
+                err = nf_put_vara_int2(ncid, i, start,
+     +                  edge, value)
+                if (.not. canConvert) then
+                    if (err .ne. NF_ECHAR)
+     +                  call errore('conversion: ', err)
+                else
+                    if (err .ne. NF_EINVALCOORDS)
+     +                  call errore('bad start: ', err)
+                endif
+                start(j) = 1
+            endif
+21      continue
+        err = nf_put_vara_int2(ncid, i, start, edge, value)
+        if (canConvert) then
+            if (err .ne. 0) 
+     +          call error(nf_strerror(err))
+        else
+            if (err .ne. NF_ECHAR)
+     +          call errore('wrong type: ', err)
+        endif
+        do 22, j = 1, var_rank(i)
+              edge(j) = 1
+22      continue
+
+
+                !/* Choose a random point dividing each dim into 2 parts */
+                !/* Put 2^rank (nslabs) slabs so defined */
+            nslabs = 1
+            do 4, j = 1, var_rank(i)
+                mid(j) = roll( var_shape(j,i) )
+                nslabs = nslabs * 2
+4           continue
+                !/* bits of k determine whether to put lower or upper part of dim */
+            do 5, k = 1, nslabs
+                nels = 1
+                do 6, j = 1, var_rank(i)
+                    if (mod(udshift(k-1, -(j-1)), 2) .eq. 1) then
+                        start(j) = 1
+                        edge(j) = mid(j)
+                    else
+                        start(j) = 1 + mid(j)
+                        edge(j) = var_shape(j,i) - mid(j)
+                    end if
+                    nels = nels * edge(j)
+6               continue
+                allInExtRange = .true.
+                do 7, j = 1, nels
+                    err = index2indexes(j, var_rank(i), edge, index)
+                    if (err .ne. 0) 
+     +                  call error('error in index2indexes 1')
+                    do 8, d = 1, var_rank(i)
+                        index(d) = index(d) + start(d) - 1
+8                   continue
+                    value(j)= hash_int2(var_type(i), 
+     +                                  var_rank(i), index, 
+     +                                  NFT_INT2)
+                    val = value(j)
+                    allInExtRange = allInExtRange .and.
+     +                  inRange3(val, var_type(i), NFT_INT2)
+7               continue
+                err = nf_put_vara_int2(ncid, i, start,
+     +                  edge, value)
+                if (canConvert) then
+                    if (allInExtRange) then
+                        if (err .ne. 0) 
+     +                      call error(nf_strerror(err))
+                    else
+                        if (err .ne. NF_ERANGE)
+     +                      call errore('range error: ', err)
+                    end if
+                else
+                    if (nels .gt. 0 .and. err .ne. NF_ECHAR)
+     +                  call errore('wrong type: ', err)
+                end if
+5           continue
+1       continue
+
+        err = nf_close(ncid)
+        if (err .ne. 0) 
+     +      call errore('nf_close: ', err)
+
+        call check_vars_int2(scratch)
+
+        err = nf_delete(scratch)
+        if (err .ne. 0)
+     +      call errorc('delete of scratch file failed: ', 
+     +          scratch)
+        end
+
+#endif
+        subroutine test_nf_put_vara_int()
+        implicit        none
+#include "tests.inc"
+        integer ncid
+        integer i
+        integer j
+        integer k
+        integer d
+        integer err
+        integer nslabs
+        integer nels
+        integer start(MAX_RANK)
+        integer edge(MAX_RANK)
+        integer mid(MAX_RANK)
+        integer index(MAX_RANK)
+        logical canConvert      !/* Both text or both numeric */
+        logical allInExtRange   !/* all values within external range? */
+        integer    value(MAX_NELS)
+        doubleprecision val
+        integer udshift
+
+        err = nf_create(scratch, NF_CLOBBER, ncid)
+        if (err .ne. 0) then
+            call errore('nf_create: ', err)
+            return
+        end if
+        call def_dims(ncid)
+        call def_vars(ncid)
+        err = nf_enddef(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_enddef: ', err)
+
+        do 1, i = 1, NVARS
+            canConvert = (var_type(i) .eq. NF_CHAR) .eqv.
+     +                   (NFT_INT .eq. NFT_TEXT)
+            if (.not.(var_rank(i) .le. MAX_RANK))
+     +          stop 2
+            if (.not.(var_nels(i) .le. MAX_NELS))
+     +          stop 2
+            do 2, j = 1, var_rank(i)
+                start(j) = 1
+                edge(j) = 1
+2           continue
+            err = nf_put_vara_int(BAD_ID, i, start,
+     +                  edge, value)
+            if (err .ne. NF_EBADID) 
+     +          call errore('bad ncid: ', err)
+            err = nf_put_vara_int(ncid, BAD_VARID,
+     +                  start, edge, value)
+            if (err .ne. NF_ENOTVAR) 
+     +          call errore('bad var id: ', err)
+            do 3, j = 1, var_rank(i)
+                if (var_dimid(j,i) .ne. RECDIM) then    !/* skip record dim */
+                    start(j) = var_shape(j,i) + 1
+                    err = nf_put_vara_int(ncid, i, start, 
+     +                                   edge, value)
+                    if (.not. canConvert) then
+                        if (err .ne. NF_ECHAR)
+     +                      call errore('conversion: ', err)
+                    else
+                        if (err .ne. NF_EINVALCOORDS)
+     +                      call errore('bad start: ', err)
+                    endif
+                    start(j) = 1
+                    edge(j) = var_shape(j,i) + 1
+                    err = nf_put_vara_int(ncid, i, start, 
+     +                                   edge, value)
+                    if (.not. canConvert) then
+                        if (err .ne. NF_ECHAR)
+     +                      call errore('conversion: ', err)
+                    else
+                        if (err .ne. NF_EEDGE)
+     +                      call errore('bad edge: ', err)
+                    endif
+                    edge(j) = 1
+                end if
+3           continue
+
+C       /* Check correct error returned even when nothing to put */
+        do 20, j = 1, var_rank(i)
+              edge(j) = 0
+20      continue
+        err = nf_put_vara_int(BAD_ID, i, start,
+     +          edge, value)
+        if (err .ne. NF_EBADID) 
+     +      call errore('bad ncid: ', err)
+        err = nf_put_vara_int(ncid, BAD_VARID,
+     +          start, edge, value)
+        if (err .ne. NF_ENOTVAR) 
+     +      call errore('bad var id: ', err)
+        do 21, j = 1, var_rank(i)
+            if (var_dimid(j,i) .gt. 1) then     ! skip record dim
+                start(j) = var_shape(j,i) + 2
+                err = nf_put_vara_int(ncid, i, start,
+     +                  edge, value)
+                if (.not. canConvert) then
+                    if (err .ne. NF_ECHAR)
+     +                  call errore('conversion: ', err)
+                else
+                    if (err .ne. NF_EINVALCOORDS)
+     +                  call errore('bad start: ', err)
+                endif
+                start(j) = 1
+            endif
+21      continue
+        err = nf_put_vara_int(ncid, i, start, edge, value)
+        if (canConvert) then
+            if (err .ne. 0) 
+     +          call error(nf_strerror(err))
+        else
+            if (err .ne. NF_ECHAR)
+     +          call errore('wrong type: ', err)
+        endif
+        do 22, j = 1, var_rank(i)
+              edge(j) = 1
+22      continue
+
+
+                !/* Choose a random point dividing each dim into 2 parts */
+                !/* Put 2^rank (nslabs) slabs so defined */
+            nslabs = 1
+            do 4, j = 1, var_rank(i)
+                mid(j) = roll( var_shape(j,i) )
+                nslabs = nslabs * 2
+4           continue
+                !/* bits of k determine whether to put lower or upper part of dim */
+            do 5, k = 1, nslabs
+                nels = 1
+                do 6, j = 1, var_rank(i)
+                    if (mod(udshift(k-1, -(j-1)), 2) .eq. 1) then
+                        start(j) = 1
+                        edge(j) = mid(j)
+                    else
+                        start(j) = 1 + mid(j)
+                        edge(j) = var_shape(j,i) - mid(j)
+                    end if
+                    nels = nels * edge(j)
+6               continue
+                allInExtRange = .true.
+                do 7, j = 1, nels
+                    err = index2indexes(j, var_rank(i), edge, index)
+                    if (err .ne. 0) 
+     +                  call error('error in index2indexes 1')
+                    do 8, d = 1, var_rank(i)
+                        index(d) = index(d) + start(d) - 1
+8                   continue
+                    value(j)= hash_int(var_type(i), 
+     +                                  var_rank(i), index, 
+     +                                  NFT_INT)
+                    val = value(j)
+                    allInExtRange = allInExtRange .and.
+     +                  inRange3(val, var_type(i), NFT_INT)
+7               continue
+                err = nf_put_vara_int(ncid, i, start,
+     +                  edge, value)
+                if (canConvert) then
+                    if (allInExtRange) then
+                        if (err .ne. 0) 
+     +                      call error(nf_strerror(err))
+                    else
+                        if (err .ne. NF_ERANGE)
+     +                      call errore('range error: ', err)
+                    end if
+                else
+                    if (nels .gt. 0 .and. err .ne. NF_ECHAR)
+     +                  call errore('wrong type: ', err)
+                end if
+5           continue
+1       continue
+
+        err = nf_close(ncid)
+        if (err .ne. 0) 
+     +      call errore('nf_close: ', err)
+
+        call check_vars_int(scratch)
+
+        err = nf_delete(scratch)
+        if (err .ne. 0)
+     +      call errorc('delete of scratch file failed: ', 
+     +          scratch)
+        end
+
+        subroutine test_nf_put_vara_real()
+        implicit        none
+#include "tests.inc"
+        integer ncid
+        integer i
+        integer j
+        integer k
+        integer d
+        integer err
+        integer nslabs
+        integer nels
+        integer start(MAX_RANK)
+        integer edge(MAX_RANK)
+        integer mid(MAX_RANK)
+        integer index(MAX_RANK)
+        logical canConvert      !/* Both text or both numeric */
+        logical allInExtRange   !/* all values within external range? */
+        real    value(MAX_NELS)
+        doubleprecision val
+        integer udshift
+
+        err = nf_create(scratch, NF_CLOBBER, ncid)
+        if (err .ne. 0) then
+            call errore('nf_create: ', err)
+            return
+        end if
+        call def_dims(ncid)
+        call def_vars(ncid)
+        err = nf_enddef(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_enddef: ', err)
+
+        do 1, i = 1, NVARS
+            canConvert = (var_type(i) .eq. NF_CHAR) .eqv.
+     +                   (NFT_REAL .eq. NFT_TEXT)
+            if (.not.(var_rank(i) .le. MAX_RANK))
+     +          stop 2
+            if (.not.(var_nels(i) .le. MAX_NELS))
+     +          stop 2
+            do 2, j = 1, var_rank(i)
+                start(j) = 1
+                edge(j) = 1
+2           continue
+            err = nf_put_vara_real(BAD_ID, i, start,
+     +                  edge, value)
+            if (err .ne. NF_EBADID) 
+     +          call errore('bad ncid: ', err)
+            err = nf_put_vara_real(ncid, BAD_VARID,
+     +                  start, edge, value)
+            if (err .ne. NF_ENOTVAR) 
+     +          call errore('bad var id: ', err)
+            do 3, j = 1, var_rank(i)
+                if (var_dimid(j,i) .ne. RECDIM) then    !/* skip record dim */
+                    start(j) = var_shape(j,i) + 1
+                    err = nf_put_vara_real(ncid, i, start, 
+     +                                   edge, value)
+                    if (.not. canConvert) then
+                        if (err .ne. NF_ECHAR)
+     +                      call errore('conversion: ', err)
+                    else
+                        if (err .ne. NF_EINVALCOORDS)
+     +                      call errore('bad start: ', err)
+                    endif
+                    start(j) = 1
+                    edge(j) = var_shape(j,i) + 1
+                    err = nf_put_vara_real(ncid, i, start, 
+     +                                   edge, value)
+                    if (.not. canConvert) then
+                        if (err .ne. NF_ECHAR)
+     +                      call errore('conversion: ', err)
+                    else
+                        if (err .ne. NF_EEDGE)
+     +                      call errore('bad edge: ', err)
+                    endif
+                    edge(j) = 1
+                end if
+3           continue
+
+C       /* Check correct error returned even when nothing to put */
+        do 20, j = 1, var_rank(i)
+              edge(j) = 0
+20      continue
+        err = nf_put_vara_real(BAD_ID, i, start,
+     +          edge, value)
+        if (err .ne. NF_EBADID) 
+     +      call errore('bad ncid: ', err)
+        err = nf_put_vara_real(ncid, BAD_VARID,
+     +          start, edge, value)
+        if (err .ne. NF_ENOTVAR) 
+     +      call errore('bad var id: ', err)
+        do 21, j = 1, var_rank(i)
+            if (var_dimid(j,i) .gt. 1) then     ! skip record dim
+                start(j) = var_shape(j,i) + 2
+                err = nf_put_vara_real(ncid, i, start,
+     +                  edge, value)
+                if (.not. canConvert) then
+                    if (err .ne. NF_ECHAR)
+     +                  call errore('conversion: ', err)
+                else
+                    if (err .ne. NF_EINVALCOORDS)
+     +                  call errore('bad start: ', err)
+                endif
+                start(j) = 1
+            endif
+21      continue
+        err = nf_put_vara_real(ncid, i, start, edge, value)
+        if (canConvert) then
+            if (err .ne. 0) 
+     +          call error(nf_strerror(err))
+        else
+            if (err .ne. NF_ECHAR)
+     +          call errore('wrong type: ', err)
+        endif
+        do 22, j = 1, var_rank(i)
+              edge(j) = 1
+22      continue
+
+
+                !/* Choose a random point dividing each dim into 2 parts */
+                !/* Put 2^rank (nslabs) slabs so defined */
+            nslabs = 1
+            do 4, j = 1, var_rank(i)
+                mid(j) = roll( var_shape(j,i) )
+                nslabs = nslabs * 2
+4           continue
+                !/* bits of k determine whether to put lower or upper part of dim */
+            do 5, k = 1, nslabs
+                nels = 1
+                do 6, j = 1, var_rank(i)
+                    if (mod(udshift(k-1, -(j-1)), 2) .eq. 1) then
+                        start(j) = 1
+                        edge(j) = mid(j)
+                    else
+                        start(j) = 1 + mid(j)
+                        edge(j) = var_shape(j,i) - mid(j)
+                    end if
+                    nels = nels * edge(j)
+6               continue
+                allInExtRange = .true.
+                do 7, j = 1, nels
+                    err = index2indexes(j, var_rank(i), edge, index)
+                    if (err .ne. 0) 
+     +                  call error('error in index2indexes 1')
+                    do 8, d = 1, var_rank(i)
+                        index(d) = index(d) + start(d) - 1
+8                   continue
+                    value(j)= hash_real(var_type(i), 
+     +                                  var_rank(i), index, 
+     +                                  NFT_REAL)
+                    val = value(j)
+                    allInExtRange = allInExtRange .and.
+     +                  inRange3(val, var_type(i), NFT_REAL)
+7               continue
+                err = nf_put_vara_real(ncid, i, start,
+     +                  edge, value)
+                if (canConvert) then
+                    if (allInExtRange) then
+                        if (err .ne. 0) 
+     +                      call error(nf_strerror(err))
+                    else
+                        if (err .ne. NF_ERANGE)
+     +                      call errore('range error: ', err)
+                    end if
+                else
+                    if (nels .gt. 0 .and. err .ne. NF_ECHAR)
+     +                  call errore('wrong type: ', err)
+                end if
+5           continue
+1       continue
+
+        err = nf_close(ncid)
+        if (err .ne. 0) 
+     +      call errore('nf_close: ', err)
+
+        call check_vars_real(scratch)
+
+        err = nf_delete(scratch)
+        if (err .ne. 0)
+     +      call errorc('delete of scratch file failed: ', 
+     +          scratch)
+        end
+
+        subroutine test_nf_put_vara_double()
+        implicit        none
+#include "tests.inc"
+        integer ncid
+        integer i
+        integer j
+        integer k
+        integer d
+        integer err
+        integer nslabs
+        integer nels
+        integer start(MAX_RANK)
+        integer edge(MAX_RANK)
+        integer mid(MAX_RANK)
+        integer index(MAX_RANK)
+        logical canConvert      !/* Both text or both numeric */
+        logical allInExtRange   !/* all values within external range? */
+        doubleprecision    value(MAX_NELS)
+        doubleprecision val
+        integer udshift
+
+        err = nf_create(scratch, NF_CLOBBER, ncid)
+        if (err .ne. 0) then
+            call errore('nf_create: ', err)
+            return
+        end if
+        call def_dims(ncid)
+        call def_vars(ncid)
+        err = nf_enddef(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_enddef: ', err)
+
+        do 1, i = 1, NVARS
+            canConvert = (var_type(i) .eq. NF_CHAR) .eqv.
+     +                   (NFT_DOUBLE .eq. NFT_TEXT)
+            if (.not.(var_rank(i) .le. MAX_RANK))
+     +          stop 2
+            if (.not.(var_nels(i) .le. MAX_NELS))
+     +          stop 2
+            do 2, j = 1, var_rank(i)
+                start(j) = 1
+                edge(j) = 1
+2           continue
+            err = nf_put_vara_double(BAD_ID, i, start,
+     +                  edge, value)
+            if (err .ne. NF_EBADID) 
+     +          call errore('bad ncid: ', err)
+            err = nf_put_vara_double(ncid, BAD_VARID,
+     +                  start, edge, value)
+            if (err .ne. NF_ENOTVAR) 
+     +          call errore('bad var id: ', err)
+            do 3, j = 1, var_rank(i)
+                if (var_dimid(j,i) .ne. RECDIM) then    !/* skip record dim */
+                    start(j) = var_shape(j,i) + 1
+                    err = nf_put_vara_double(ncid, i, start, 
+     +                                   edge, value)
+                    if (.not. canConvert) then
+                        if (err .ne. NF_ECHAR)
+     +                      call errore('conversion: ', err)
+                    else
+                        if (err .ne. NF_EINVALCOORDS)
+     +                      call errore('bad start: ', err)
+                    endif
+                    start(j) = 1
+                    edge(j) = var_shape(j,i) + 1
+                    err = nf_put_vara_double(ncid, i, start, 
+     +                                   edge, value)
+                    if (.not. canConvert) then
+                        if (err .ne. NF_ECHAR)
+     +                      call errore('conversion: ', err)
+                    else
+                        if (err .ne. NF_EEDGE)
+     +                      call errore('bad edge: ', err)
+                    endif
+                    edge(j) = 1
+                end if
+3           continue
+
+C       /* Check correct error returned even when nothing to put */
+        do 20, j = 1, var_rank(i)
+              edge(j) = 0
+20      continue
+        err = nf_put_vara_double(BAD_ID, i, start,
+     +          edge, value)
+        if (err .ne. NF_EBADID) 
+     +      call errore('bad ncid: ', err)
+        err = nf_put_vara_double(ncid, BAD_VARID,
+     +          start, edge, value)
+        if (err .ne. NF_ENOTVAR) 
+     +      call errore('bad var id: ', err)
+        do 21, j = 1, var_rank(i)
+            if (var_dimid(j,i) .gt. 1) then     ! skip record dim
+                start(j) = var_shape(j,i) + 2
+                err = nf_put_vara_double(ncid, i, start,
+     +                  edge, value)
+                if (.not. canConvert) then
+                    if (err .ne. NF_ECHAR)
+     +                  call errore('conversion: ', err)
+                else
+                    if (err .ne. NF_EINVALCOORDS)
+     +                  call errore('bad start: ', err)
+                endif
+                start(j) = 1
+            endif
+21      continue
+        err = nf_put_vara_double(ncid, i, start, edge, value)
+        if (canConvert) then
+            if (err .ne. 0) 
+     +          call error(nf_strerror(err))
+        else
+            if (err .ne. NF_ECHAR)
+     +          call errore('wrong type: ', err)
+        endif
+        do 22, j = 1, var_rank(i)
+              edge(j) = 1
+22      continue
+
+
+                !/* Choose a random point dividing each dim into 2 parts */
+                !/* Put 2^rank (nslabs) slabs so defined */
+            nslabs = 1
+            do 4, j = 1, var_rank(i)
+                mid(j) = roll( var_shape(j,i) )
+                nslabs = nslabs * 2
+4           continue
+                !/* bits of k determine whether to put lower or upper part of dim */
+            do 5, k = 1, nslabs
+                nels = 1
+                do 6, j = 1, var_rank(i)
+                    if (mod(udshift(k-1, -(j-1)), 2) .eq. 1) then
+                        start(j) = 1
+                        edge(j) = mid(j)
+                    else
+                        start(j) = 1 + mid(j)
+                        edge(j) = var_shape(j,i) - mid(j)
+                    end if
+                    nels = nels * edge(j)
+6               continue
+                allInExtRange = .true.
+                do 7, j = 1, nels
+                    err = index2indexes(j, var_rank(i), edge, index)
+                    if (err .ne. 0) 
+     +                  call error('error in index2indexes 1')
+                    do 8, d = 1, var_rank(i)
+                        index(d) = index(d) + start(d) - 1
+8                   continue
+                    value(j)= hash_double(var_type(i), 
+     +                                  var_rank(i), index, 
+     +                                  NFT_DOUBLE)
+                    val = value(j)
+                    allInExtRange = allInExtRange .and.
+     +                  inRange3(val, var_type(i), NFT_DOUBLE)
+7               continue
+                err = nf_put_vara_double(ncid, i, start,
+     +                  edge, value)
+                if (canConvert) then
+                    if (allInExtRange) then
+                        if (err .ne. 0) 
+     +                      call error(nf_strerror(err))
+                    else
+                        if (err .ne. NF_ERANGE)
+     +                      call errore('range error: ', err)
+                    end if
+                else
+                    if (nels .gt. 0 .and. err .ne. NF_ECHAR)
+     +                  call errore('wrong type: ', err)
+                end if
+5           continue
+1       continue
+
+        err = nf_close(ncid)
+        if (err .ne. 0) 
+     +      call errore('nf_close: ', err)
+
+        call check_vars_double(scratch)
+
+        err = nf_delete(scratch)
+        if (err .ne. 0)
+     +      call errorc('delete of scratch file failed: ', 
+     +          scratch)
+        end
+
+
+        subroutine test_nf_put_vars_text()
+        implicit        none
+#include "tests.inc"
+        integer ncid
+        integer d
+        integer i
+        integer j
+        integer k
+        integer m
+        integer err
+        integer nels
+        integer nslabs
+        integer nstarts        !/* number of different starts */
+        integer start(MAX_RANK)
+        integer edge(MAX_RANK)
+        integer index(MAX_RANK)
+        integer index2(MAX_RANK)
+        integer mid(MAX_RANK)
+        integer count(MAX_RANK)
+        integer sstride(MAX_RANK)
+        integer stride(MAX_RANK)
+        logical canConvert      !/* Both text or both numeric */
+        logical allInExtRange   !/* all values within external range? */
+        character    value(MAX_NELS)
+        doubleprecision val
+        integer udshift
+
+        err = nf_create(scratch, NF_CLOBBER, ncid)
+        if (err .ne. 0) then
+            call errore('nf_create: ', err)
+            return
+        end if
+        call def_dims(ncid)
+        call def_vars(ncid)
+        err = nf_enddef(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_enddef: ', err)
+
+        do 1, i = 1, NVARS
+            canConvert = (var_type(i) .eq. NF_CHAR) .eqv.
+     +                   (NFT_TEXT .eq. NFT_TEXT)
+            if (.not.(var_rank(i) .le. MAX_RANK))
+     +          stop 2
+            if (.not.(var_nels(i) .le. MAX_NELS))
+     +          stop 2
+            do 2, j = 1, var_rank(i)
+                start(j) = 1
+                edge(j) = 1
+                stride(j) = 1
+2           continue
+            err = nf_put_vars_text(BAD_ID, i, start,
+     +                  edge, stride, value)
+            if (err .ne. NF_EBADID) 
+     +          call errore('bad ncid: ', err)
+            err = nf_put_vars_text(ncid, BAD_VARID, start,
+     +                           edge, stride, 
+     +                           value)
+            if (err .ne. NF_ENOTVAR) 
+     +          call errore('bad var id: ', err)
+            do 3, j = 1, var_rank(i)
+                if (var_dimid(j,i) .ne. RECDIM) then    ! skip record dim
+                    start(j) = var_shape(j,i) + 2
+                    err = nf_put_vars_text(ncid, i, start,
+     +                                   edge, stride, 
+     +                                   value)
+                    if (.not. canConvert) then
+                        if (err .ne. NF_ECHAR)
+     +                      call errore('conversion: ', err)
+                    else
+                        if (err .ne. NF_EINVALCOORDS)
+     +                          call errore('bad start: ', err)
+                    endif
+                    start(j) = 1
+                    edge(j) = var_shape(j,i) + 1
+                    err = nf_put_vars_text(ncid, i, start,
+     +                                   edge, stride, 
+     +                                   value)
+                    if (.not. canConvert) then
+                        if (err .ne. NF_ECHAR)
+     +                      call errore('conversion: ', err)
+                    else
+                        if (err .ne. NF_EEDGE)
+     +                      call errore('bad edge: ', err)
+                    endif
+                    edge(j) = 1
+                    stride(j) = 0
+                    err = nf_put_vars_text(ncid, i, start,
+     +                                   edge, stride, 
+     +                                   value)
+                    if (.not. canConvert) then
+                        if (err .ne. NF_ECHAR)
+     +                      call errore('conversion: ', err)
+                    else
+                        if (err .ne. NF_ESTRIDE)
+     +                      call errore('bad stride: ', err)
+                    endif
+                    stride(j) = 1
+                end if
+3           continue
+                !/* Choose a random point dividing each dim into 2 parts */
+                !/* Put 2^rank (nslabs) slabs so defined */
+            nslabs = 1
+            do 4, j = 1, var_rank(i)
+                mid(j) = roll( var_shape(j,i) )
+                nslabs = nslabs * 2
+4           continue
+                !/* bits of k determine whether to put lower or upper part of dim */
+                !/* choose random stride from 1 to edge */
+            do 5, k = 1, nslabs
+                nstarts = 1
+                do 6, j = 1, var_rank(i)
+                    if (mod(udshift(k-1, -(j-1)), 2) .eq. 1) then
+                        start(j) = 1
+                        edge(j) = mid(j)
+                    else
+                        start(j) = 1 + mid(j)
+                        edge(j) = var_shape(j,i) - mid(j)
+                    end if
+                    if (edge(j) .gt. 0) then
+                        stride(j) = 1+roll(edge(j))
+                    else
+                        stride(j) = 1
+                    end if
+                    sstride(j) = stride(j)
+                    nstarts = nstarts * stride(j)
+6               continue
+                do 7, m = 1, nstarts
+                    err = index2indexes(m, var_rank(i), sstride, index)
+                    if (err .ne. 0)
+     +                  call error('error in index2indexes')
+                    nels = 1
+                    do 8, j = 1, var_rank(i)
+                        count(j) = 1 + (edge(j) - index(j)) / stride(j)
+                        nels = nels * count(j)
+                        index(j) = index(j) + start(j) - 1
+8                   continue
+                        !/* Random choice of forward or backward */
+C/* TODO
+C                   if ( roll(2) ) {
+C                       for (j = 1 j .lt. var_rank(i) j++) {
+C                           index(j) += (count(j) - 1) * stride(j)
+C                           stride(j) = -stride(j)
+C                       }
+C                   }
+C*/
+                    allInExtRange = .true.
+                    do 9, j = 1, nels
+                        err = index2indexes(j, var_rank(i), count, 
+     +                                      index2)
+                        if (err .ne. 0)
+     +                      call error('error in index2indexes')
+                        do 10, d = 1, var_rank(i)
+                            index2(d) = index(d) + 
+     +                                  (index2(d)-1) * stride(d)
+10                      continue
+                        value(j) = char(int(hash_text(var_type(i), 
+     +                     var_rank(i), 
+     +                     index2, NFT_TEXT)))
+                        val = ichar(value(j))
+                        allInExtRange = allInExtRange .and.
+     +                      inRange3(val, var_type(i), 
+     +                               NFT_TEXT)
+9                   continue
+                    err = nf_put_vars_text(ncid, i, index,
+     +                                   count, stride,
+     +                                   value)
+                    if (canConvert) then
+                        if (allInExtRange) then
+                            if (err .ne. 0) 
+     +                          call error(nf_strerror(err))
+                        else
+                            if (err .ne. NF_ERANGE)
+     +                          call errore('range error: ', err)
+                        end if
+                    else
+                        if (nels .gt. 0 .and. err .ne. NF_ECHAR)
+     +                      call errore('wrong type: ', err)
+                    end if
+7               continue
+5           continue
+1       continue
+
+        err = nf_close(ncid)
+        if (err .ne. 0) 
+     +      call errore('nf_close: ', err)
+
+        call check_vars_text(scratch)
+
+        err = nf_delete(scratch)
+        if (err .ne. 0)
+     +      call errorc('delete of scratch file failed:', 
+     +          scratch)
+        end
+
+#ifdef NF_INT1_T
+        subroutine test_nf_put_vars_int1()
+        implicit        none
+#include "tests.inc"
+        integer ncid
+        integer d
+        integer i
+        integer j
+        integer k
+        integer m
+        integer err
+        integer nels
+        integer nslabs
+        integer nstarts        !/* number of different starts */
+        integer start(MAX_RANK)
+        integer edge(MAX_RANK)
+        integer index(MAX_RANK)
+        integer index2(MAX_RANK)
+        integer mid(MAX_RANK)
+        integer count(MAX_RANK)
+        integer sstride(MAX_RANK)
+        integer stride(MAX_RANK)
+        logical canConvert      !/* Both text or both numeric */
+        logical allInExtRange   !/* all values within external range? */
+        NF_INT1_T    value(MAX_NELS)
+        doubleprecision val
+        integer udshift
+
+        err = nf_create(scratch, NF_CLOBBER, ncid)
+        if (err .ne. 0) then
+            call errore('nf_create: ', err)
+            return
+        end if
+        call def_dims(ncid)
+        call def_vars(ncid)
+        err = nf_enddef(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_enddef: ', err)
+
+        do 1, i = 1, NVARS
+            canConvert = (var_type(i) .eq. NF_CHAR) .eqv.
+     +                   (NFT_INT1 .eq. NFT_TEXT)
+            if (.not.(var_rank(i) .le. MAX_RANK))
+     +          stop 2
+            if (.not.(var_nels(i) .le. MAX_NELS))
+     +          stop 2
+            do 2, j = 1, var_rank(i)
+                start(j) = 1
+                edge(j) = 1
+                stride(j) = 1
+2           continue
+            err = nf_put_vars_int1(BAD_ID, i, start,
+     +                  edge, stride, value)
+            if (err .ne. NF_EBADID) 
+     +          call errore('bad ncid: ', err)
+            err = nf_put_vars_int1(ncid, BAD_VARID, start,
+     +                           edge, stride, 
+     +                           value)
+            if (err .ne. NF_ENOTVAR) 
+     +          call errore('bad var id: ', err)
+            do 3, j = 1, var_rank(i)
+                if (var_dimid(j,i) .ne. RECDIM) then    ! skip record dim
+                    start(j) = var_shape(j,i) + 2
+                    err = nf_put_vars_int1(ncid, i, start,
+     +                                   edge, stride, 
+     +                                   value)
+                    if (.not. canConvert) then
+                        if (err .ne. NF_ECHAR)
+     +                      call errore('conversion: ', err)
+                    else
+                        if (err .ne. NF_EINVALCOORDS)
+     +                          call errore('bad start: ', err)
+                    endif
+                    start(j) = 1
+                    edge(j) = var_shape(j,i) + 1
+                    err = nf_put_vars_int1(ncid, i, start,
+     +                                   edge, stride, 
+     +                                   value)
+                    if (.not. canConvert) then
+                        if (err .ne. NF_ECHAR)
+     +                      call errore('conversion: ', err)
+                    else
+                        if (err .ne. NF_EEDGE)
+     +                      call errore('bad edge: ', err)
+                    endif
+                    edge(j) = 1
+                    stride(j) = 0
+                    err = nf_put_vars_int1(ncid, i, start,
+     +                                   edge, stride, 
+     +                                   value)
+                    if (.not. canConvert) then
+                        if (err .ne. NF_ECHAR)
+     +                      call errore('conversion: ', err)
+                    else
+                        if (err .ne. NF_ESTRIDE)
+     +                      call errore('bad stride: ', err)
+                    endif
+                    stride(j) = 1
+                end if
+3           continue
+                !/* Choose a random point dividing each dim into 2 parts */
+                !/* Put 2^rank (nslabs) slabs so defined */
+            nslabs = 1
+            do 4, j = 1, var_rank(i)
+                mid(j) = roll( var_shape(j,i) )
+                nslabs = nslabs * 2
+4           continue
+                !/* bits of k determine whether to put lower or upper part of dim */
+                !/* choose random stride from 1 to edge */
+            do 5, k = 1, nslabs
+                nstarts = 1
+                do 6, j = 1, var_rank(i)
+                    if (mod(udshift(k-1, -(j-1)), 2) .eq. 1) then
+                        start(j) = 1
+                        edge(j) = mid(j)
+                    else
+                        start(j) = 1 + mid(j)
+                        edge(j) = var_shape(j,i) - mid(j)
+                    end if
+                    if (edge(j) .gt. 0) then
+                        stride(j) = 1+roll(edge(j))
+                    else
+                        stride(j) = 1
+                    end if
+                    sstride(j) = stride(j)
+                    nstarts = nstarts * stride(j)
+6               continue
+                do 7, m = 1, nstarts
+                    err = index2indexes(m, var_rank(i), sstride, index)
+                    if (err .ne. 0)
+     +                  call error('error in index2indexes')
+                    nels = 1
+                    do 8, j = 1, var_rank(i)
+                        count(j) = 1 + (edge(j) - index(j)) / stride(j)
+                        nels = nels * count(j)
+                        index(j) = index(j) + start(j) - 1
+8                   continue
+                        !/* Random choice of forward or backward */
+C/* TODO
+C                   if ( roll(2) ) {
+C                       for (j = 1 j .lt. var_rank(i) j++) {
+C                           index(j) += (count(j) - 1) * stride(j)
+C                           stride(j) = -stride(j)
+C                       }
+C                   }
+C*/
+                    allInExtRange = .true.
+                    do 9, j = 1, nels
+                        err = index2indexes(j, var_rank(i), count, 
+     +                                      index2)
+                        if (err .ne. 0)
+     +                      call error('error in index2indexes')
+                        do 10, d = 1, var_rank(i)
+                            index2(d) = index(d) + 
+     +                                  (index2(d)-1) * stride(d)
+10                      continue
+                        value(j) = hash_int1(var_type(i), 
+     +                     var_rank(i), 
+     +                     index2, NFT_INT1)
+                        val = value(j)
+                        allInExtRange = allInExtRange .and.
+     +                      inRange3(val, var_type(i), 
+     +                               NFT_INT1)
+9                   continue
+                    err = nf_put_vars_int1(ncid, i, index,
+     +                                   count, stride,
+     +                                   value)
+                    if (canConvert) then
+                        if (allInExtRange) then
+                            if (err .ne. 0) 
+     +                          call error(nf_strerror(err))
+                        else
+                            if (err .ne. NF_ERANGE)
+     +                          call errore('range error: ', err)
+                        end if
+                    else
+                        if (nels .gt. 0 .and. err .ne. NF_ECHAR)
+     +                      call errore('wrong type: ', err)
+                    end if
+7               continue
+5           continue
+1       continue
+
+        err = nf_close(ncid)
+        if (err .ne. 0) 
+     +      call errore('nf_close: ', err)
+
+        call check_vars_int1(scratch)
+
+        err = nf_delete(scratch)
+        if (err .ne. 0)
+     +      call errorc('delete of scratch file failed:', 
+     +          scratch)
+        end
+
+#endif
+#ifdef NF_INT2_T
+        subroutine test_nf_put_vars_int2()
+        implicit        none
+#include "tests.inc"
+        integer ncid
+        integer d
+        integer i
+        integer j
+        integer k
+        integer m
+        integer err
+        integer nels
+        integer nslabs
+        integer nstarts        !/* number of different starts */
+        integer start(MAX_RANK)
+        integer edge(MAX_RANK)
+        integer index(MAX_RANK)
+        integer index2(MAX_RANK)
+        integer mid(MAX_RANK)
+        integer count(MAX_RANK)
+        integer sstride(MAX_RANK)
+        integer stride(MAX_RANK)
+        logical canConvert      !/* Both text or both numeric */
+        logical allInExtRange   !/* all values within external range? */
+        NF_INT2_T    value(MAX_NELS)
+        doubleprecision val
+        integer udshift
+
+        err = nf_create(scratch, NF_CLOBBER, ncid)
+        if (err .ne. 0) then
+            call errore('nf_create: ', err)
+            return
+        end if
+        call def_dims(ncid)
+        call def_vars(ncid)
+        err = nf_enddef(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_enddef: ', err)
+
+        do 1, i = 1, NVARS
+            canConvert = (var_type(i) .eq. NF_CHAR) .eqv.
+     +                   (NFT_INT2 .eq. NFT_TEXT)
+            if (.not.(var_rank(i) .le. MAX_RANK))
+     +          stop 2
+            if (.not.(var_nels(i) .le. MAX_NELS))
+     +          stop 2
+            do 2, j = 1, var_rank(i)
+                start(j) = 1
+                edge(j) = 1
+                stride(j) = 1
+2           continue
+            err = nf_put_vars_int2(BAD_ID, i, start,
+     +                  edge, stride, value)
+            if (err .ne. NF_EBADID) 
+     +          call errore('bad ncid: ', err)
+            err = nf_put_vars_int2(ncid, BAD_VARID, start,
+     +                           edge, stride, 
+     +                           value)
+            if (err .ne. NF_ENOTVAR) 
+     +          call errore('bad var id: ', err)
+            do 3, j = 1, var_rank(i)
+                if (var_dimid(j,i) .ne. RECDIM) then    ! skip record dim
+                    start(j) = var_shape(j,i) + 2
+                    err = nf_put_vars_int2(ncid, i, start,
+     +                                   edge, stride, 
+     +                                   value)
+                    if (.not. canConvert) then
+                        if (err .ne. NF_ECHAR)
+     +                      call errore('conversion: ', err)
+                    else
+                        if (err .ne. NF_EINVALCOORDS)
+     +                          call errore('bad start: ', err)
+                    endif
+                    start(j) = 1
+                    edge(j) = var_shape(j,i) + 1
+                    err = nf_put_vars_int2(ncid, i, start,
+     +                                   edge, stride, 
+     +                                   value)
+                    if (.not. canConvert) then
+                        if (err .ne. NF_ECHAR)
+     +                      call errore('conversion: ', err)
+                    else
+                        if (err .ne. NF_EEDGE)
+     +                      call errore('bad edge: ', err)
+                    endif
+                    edge(j) = 1
+                    stride(j) = 0
+                    err = nf_put_vars_int2(ncid, i, start,
+     +                                   edge, stride, 
+     +                                   value)
+                    if (.not. canConvert) then
+                        if (err .ne. NF_ECHAR)
+     +                      call errore('conversion: ', err)
+                    else
+                        if (err .ne. NF_ESTRIDE)
+     +                      call errore('bad stride: ', err)
+                    endif
+                    stride(j) = 1
+                end if
+3           continue
+                !/* Choose a random point dividing each dim into 2 parts */
+                !/* Put 2^rank (nslabs) slabs so defined */
+            nslabs = 1
+            do 4, j = 1, var_rank(i)
+                mid(j) = roll( var_shape(j,i) )
+                nslabs = nslabs * 2
+4           continue
+                !/* bits of k determine whether to put lower or upper part of dim */
+                !/* choose random stride from 1 to edge */
+            do 5, k = 1, nslabs
+                nstarts = 1
+                do 6, j = 1, var_rank(i)
+                    if (mod(udshift(k-1, -(j-1)), 2) .eq. 1) then
+                        start(j) = 1
+                        edge(j) = mid(j)
+                    else
+                        start(j) = 1 + mid(j)
+                        edge(j) = var_shape(j,i) - mid(j)
+                    end if
+                    if (edge(j) .gt. 0) then
+                        stride(j) = 1+roll(edge(j))
+                    else
+                        stride(j) = 1
+                    end if
+                    sstride(j) = stride(j)
+                    nstarts = nstarts * stride(j)
+6               continue
+                do 7, m = 1, nstarts
+                    err = index2indexes(m, var_rank(i), sstride, index)
+                    if (err .ne. 0)
+     +                  call error('error in index2indexes')
+                    nels = 1
+                    do 8, j = 1, var_rank(i)
+                        count(j) = 1 + (edge(j) - index(j)) / stride(j)
+                        nels = nels * count(j)
+                        index(j) = index(j) + start(j) - 1
+8                   continue
+                        !/* Random choice of forward or backward */
+C/* TODO
+C                   if ( roll(2) ) {
+C                       for (j = 1 j .lt. var_rank(i) j++) {
+C                           index(j) += (count(j) - 1) * stride(j)
+C                           stride(j) = -stride(j)
+C                       }
+C                   }
+C*/
+                    allInExtRange = .true.
+                    do 9, j = 1, nels
+                        err = index2indexes(j, var_rank(i), count, 
+     +                                      index2)
+                        if (err .ne. 0)
+     +                      call error('error in index2indexes')
+                        do 10, d = 1, var_rank(i)
+                            index2(d) = index(d) + 
+     +                                  (index2(d)-1) * stride(d)
+10                      continue
+                        value(j) = hash_int2(var_type(i), 
+     +                     var_rank(i), 
+     +                     index2, NFT_INT2)
+                        val = value(j)
+                        allInExtRange = allInExtRange .and.
+     +                      inRange3(val, var_type(i), 
+     +                               NFT_INT2)
+9                   continue
+                    err = nf_put_vars_int2(ncid, i, index,
+     +                                   count, stride,
+     +                                   value)
+                    if (canConvert) then
+                        if (allInExtRange) then
+                            if (err .ne. 0) 
+     +                          call error(nf_strerror(err))
+                        else
+                            if (err .ne. NF_ERANGE)
+     +                          call errore('range error: ', err)
+                        end if
+                    else
+                        if (nels .gt. 0 .and. err .ne. NF_ECHAR)
+     +                      call errore('wrong type: ', err)
+                    end if
+7               continue
+5           continue
+1       continue
+
+        err = nf_close(ncid)
+        if (err .ne. 0) 
+     +      call errore('nf_close: ', err)
+
+        call check_vars_int2(scratch)
+
+        err = nf_delete(scratch)
+        if (err .ne. 0)
+     +      call errorc('delete of scratch file failed:', 
+     +          scratch)
+        end
+
+#endif
+        subroutine test_nf_put_vars_int()
+        implicit        none
+#include "tests.inc"
+        integer ncid
+        integer d
+        integer i
+        integer j
+        integer k
+        integer m
+        integer err
+        integer nels
+        integer nslabs
+        integer nstarts        !/* number of different starts */
+        integer start(MAX_RANK)
+        integer edge(MAX_RANK)
+        integer index(MAX_RANK)
+        integer index2(MAX_RANK)
+        integer mid(MAX_RANK)
+        integer count(MAX_RANK)
+        integer sstride(MAX_RANK)
+        integer stride(MAX_RANK)
+        logical canConvert      !/* Both text or both numeric */
+        logical allInExtRange   !/* all values within external range? */
+        integer    value(MAX_NELS)
+        doubleprecision val
+        integer udshift
+
+        err = nf_create(scratch, NF_CLOBBER, ncid)
+        if (err .ne. 0) then
+            call errore('nf_create: ', err)
+            return
+        end if
+        call def_dims(ncid)
+        call def_vars(ncid)
+        err = nf_enddef(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_enddef: ', err)
+
+        do 1, i = 1, NVARS
+            canConvert = (var_type(i) .eq. NF_CHAR) .eqv.
+     +                   (NFT_INT .eq. NFT_TEXT)
+            if (.not.(var_rank(i) .le. MAX_RANK))
+     +          stop 2
+            if (.not.(var_nels(i) .le. MAX_NELS))
+     +          stop 2
+            do 2, j = 1, var_rank(i)
+                start(j) = 1
+                edge(j) = 1
+                stride(j) = 1
+2           continue
+            err = nf_put_vars_int(BAD_ID, i, start,
+     +                  edge, stride, value)
+            if (err .ne. NF_EBADID) 
+     +          call errore('bad ncid: ', err)
+            err = nf_put_vars_int(ncid, BAD_VARID, start,
+     +                           edge, stride, 
+     +                           value)
+            if (err .ne. NF_ENOTVAR) 
+     +          call errore('bad var id: ', err)
+            do 3, j = 1, var_rank(i)
+                if (var_dimid(j,i) .ne. RECDIM) then    ! skip record dim
+                    start(j) = var_shape(j,i) + 2
+                    err = nf_put_vars_int(ncid, i, start,
+     +                                   edge, stride, 
+     +                                   value)
+                    if (.not. canConvert) then
+                        if (err .ne. NF_ECHAR)
+     +                      call errore('conversion: ', err)
+                    else
+                        if (err .ne. NF_EINVALCOORDS)
+     +                          call errore('bad start: ', err)
+                    endif
+                    start(j) = 1
+                    edge(j) = var_shape(j,i) + 1
+                    err = nf_put_vars_int(ncid, i, start,
+     +                                   edge, stride, 
+     +                                   value)
+                    if (.not. canConvert) then
+                        if (err .ne. NF_ECHAR)
+     +                      call errore('conversion: ', err)
+                    else
+                        if (err .ne. NF_EEDGE)
+     +                      call errore('bad edge: ', err)
+                    endif
+                    edge(j) = 1
+                    stride(j) = 0
+                    err = nf_put_vars_int(ncid, i, start,
+     +                                   edge, stride, 
+     +                                   value)
+                    if (.not. canConvert) then
+                        if (err .ne. NF_ECHAR)
+     +                      call errore('conversion: ', err)
+                    else
+                        if (err .ne. NF_ESTRIDE)
+     +                      call errore('bad stride: ', err)
+                    endif
+                    stride(j) = 1
+                end if
+3           continue
+                !/* Choose a random point dividing each dim into 2 parts */
+                !/* Put 2^rank (nslabs) slabs so defined */
+            nslabs = 1
+            do 4, j = 1, var_rank(i)
+                mid(j) = roll( var_shape(j,i) )
+                nslabs = nslabs * 2
+4           continue
+                !/* bits of k determine whether to put lower or upper part of dim */
+                !/* choose random stride from 1 to edge */
+            do 5, k = 1, nslabs
+                nstarts = 1
+                do 6, j = 1, var_rank(i)
+                    if (mod(udshift(k-1, -(j-1)), 2) .eq. 1) then
+                        start(j) = 1
+                        edge(j) = mid(j)
+                    else
+                        start(j) = 1 + mid(j)
+                        edge(j) = var_shape(j,i) - mid(j)
+                    end if
+                    if (edge(j) .gt. 0) then
+                        stride(j) = 1+roll(edge(j))
+                    else
+                        stride(j) = 1
+                    end if
+                    sstride(j) = stride(j)
+                    nstarts = nstarts * stride(j)
+6               continue
+                do 7, m = 1, nstarts
+                    err = index2indexes(m, var_rank(i), sstride, index)
+                    if (err .ne. 0)
+     +                  call error('error in index2indexes')
+                    nels = 1
+                    do 8, j = 1, var_rank(i)
+                        count(j) = 1 + (edge(j) - index(j)) / stride(j)
+                        nels = nels * count(j)
+                        index(j) = index(j) + start(j) - 1
+8                   continue
+                        !/* Random choice of forward or backward */
+C/* TODO
+C                   if ( roll(2) ) {
+C                       for (j = 1 j .lt. var_rank(i) j++) {
+C                           index(j) += (count(j) - 1) * stride(j)
+C                           stride(j) = -stride(j)
+C                       }
+C                   }
+C*/
+                    allInExtRange = .true.
+                    do 9, j = 1, nels
+                        err = index2indexes(j, var_rank(i), count, 
+     +                                      index2)
+                        if (err .ne. 0)
+     +                      call error('error in index2indexes')
+                        do 10, d = 1, var_rank(i)
+                            index2(d) = index(d) + 
+     +                                  (index2(d)-1) * stride(d)
+10                      continue
+                        value(j) = hash_int(var_type(i), 
+     +                     var_rank(i), 
+     +                     index2, NFT_INT)
+                        val = value(j)
+                        allInExtRange = allInExtRange .and.
+     +                      inRange3(val, var_type(i), 
+     +                               NFT_INT)
+9                   continue
+                    err = nf_put_vars_int(ncid, i, index,
+     +                                   count, stride,
+     +                                   value)
+                    if (canConvert) then
+                        if (allInExtRange) then
+                            if (err .ne. 0) 
+     +                          call error(nf_strerror(err))
+                        else
+                            if (err .ne. NF_ERANGE)
+     +                          call errore('range error: ', err)
+                        end if
+                    else
+                        if (nels .gt. 0 .and. err .ne. NF_ECHAR)
+     +                      call errore('wrong type: ', err)
+                    end if
+7               continue
+5           continue
+1       continue
+
+        err = nf_close(ncid)
+        if (err .ne. 0) 
+     +      call errore('nf_close: ', err)
+
+        call check_vars_int(scratch)
+
+        err = nf_delete(scratch)
+        if (err .ne. 0)
+     +      call errorc('delete of scratch file failed:', 
+     +          scratch)
+        end
+
+        subroutine test_nf_put_vars_real()
+        implicit        none
+#include "tests.inc"
+        integer ncid
+        integer d
+        integer i
+        integer j
+        integer k
+        integer m
+        integer err
+        integer nels
+        integer nslabs
+        integer nstarts        !/* number of different starts */
+        integer start(MAX_RANK)
+        integer edge(MAX_RANK)
+        integer index(MAX_RANK)
+        integer index2(MAX_RANK)
+        integer mid(MAX_RANK)
+        integer count(MAX_RANK)
+        integer sstride(MAX_RANK)
+        integer stride(MAX_RANK)
+        logical canConvert      !/* Both text or both numeric */
+        logical allInExtRange   !/* all values within external range? */
+        real    value(MAX_NELS)
+        doubleprecision val
+        integer udshift
+
+        err = nf_create(scratch, NF_CLOBBER, ncid)
+        if (err .ne. 0) then
+            call errore('nf_create: ', err)
+            return
+        end if
+        call def_dims(ncid)
+        call def_vars(ncid)
+        err = nf_enddef(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_enddef: ', err)
+
+        do 1, i = 1, NVARS
+            canConvert = (var_type(i) .eq. NF_CHAR) .eqv.
+     +                   (NFT_REAL .eq. NFT_TEXT)
+            if (.not.(var_rank(i) .le. MAX_RANK))
+     +          stop 2
+            if (.not.(var_nels(i) .le. MAX_NELS))
+     +          stop 2
+            do 2, j = 1, var_rank(i)
+                start(j) = 1
+                edge(j) = 1
+                stride(j) = 1
+2           continue
+            err = nf_put_vars_real(BAD_ID, i, start,
+     +                  edge, stride, value)
+            if (err .ne. NF_EBADID) 
+     +          call errore('bad ncid: ', err)
+            err = nf_put_vars_real(ncid, BAD_VARID, start,
+     +                           edge, stride, 
+     +                           value)
+            if (err .ne. NF_ENOTVAR) 
+     +          call errore('bad var id: ', err)
+            do 3, j = 1, var_rank(i)
+                if (var_dimid(j,i) .ne. RECDIM) then    ! skip record dim
+                    start(j) = var_shape(j,i) + 2
+                    err = nf_put_vars_real(ncid, i, start,
+     +                                   edge, stride, 
+     +                                   value)
+                    if (.not. canConvert) then
+                        if (err .ne. NF_ECHAR)
+     +                      call errore('conversion: ', err)
+                    else
+                        if (err .ne. NF_EINVALCOORDS)
+     +                          call errore('bad start: ', err)
+                    endif
+                    start(j) = 1
+                    edge(j) = var_shape(j,i) + 1
+                    err = nf_put_vars_real(ncid, i, start,
+     +                                   edge, stride, 
+     +                                   value)
+                    if (.not. canConvert) then
+                        if (err .ne. NF_ECHAR)
+     +                      call errore('conversion: ', err)
+                    else
+                        if (err .ne. NF_EEDGE)
+     +                      call errore('bad edge: ', err)
+                    endif
+                    edge(j) = 1
+                    stride(j) = 0
+                    err = nf_put_vars_real(ncid, i, start,
+     +                                   edge, stride, 
+     +                                   value)
+                    if (.not. canConvert) then
+                        if (err .ne. NF_ECHAR)
+     +                      call errore('conversion: ', err)
+                    else
+                        if (err .ne. NF_ESTRIDE)
+     +                      call errore('bad stride: ', err)
+                    endif
+                    stride(j) = 1
+                end if
+3           continue
+                !/* Choose a random point dividing each dim into 2 parts */
+                !/* Put 2^rank (nslabs) slabs so defined */
+            nslabs = 1
+            do 4, j = 1, var_rank(i)
+                mid(j) = roll( var_shape(j,i) )
+                nslabs = nslabs * 2
+4           continue
+                !/* bits of k determine whether to put lower or upper part of dim */
+                !/* choose random stride from 1 to edge */
+            do 5, k = 1, nslabs
+                nstarts = 1
+                do 6, j = 1, var_rank(i)
+                    if (mod(udshift(k-1, -(j-1)), 2) .eq. 1) then
+                        start(j) = 1
+                        edge(j) = mid(j)
+                    else
+                        start(j) = 1 + mid(j)
+                        edge(j) = var_shape(j,i) - mid(j)
+                    end if
+                    if (edge(j) .gt. 0) then
+                        stride(j) = 1+roll(edge(j))
+                    else
+                        stride(j) = 1
+                    end if
+                    sstride(j) = stride(j)
+                    nstarts = nstarts * stride(j)
+6               continue
+                do 7, m = 1, nstarts
+                    err = index2indexes(m, var_rank(i), sstride, index)
+                    if (err .ne. 0)
+     +                  call error('error in index2indexes')
+                    nels = 1
+                    do 8, j = 1, var_rank(i)
+                        count(j) = 1 + (edge(j) - index(j)) / stride(j)
+                        nels = nels * count(j)
+                        index(j) = index(j) + start(j) - 1
+8                   continue
+                        !/* Random choice of forward or backward */
+C/* TODO
+C                   if ( roll(2) ) {
+C                       for (j = 1 j .lt. var_rank(i) j++) {
+C                           index(j) += (count(j) - 1) * stride(j)
+C                           stride(j) = -stride(j)
+C                       }
+C                   }
+C*/
+                    allInExtRange = .true.
+                    do 9, j = 1, nels
+                        err = index2indexes(j, var_rank(i), count, 
+     +                                      index2)
+                        if (err .ne. 0)
+     +                      call error('error in index2indexes')
+                        do 10, d = 1, var_rank(i)
+                            index2(d) = index(d) + 
+     +                                  (index2(d)-1) * stride(d)
+10                      continue
+                        value(j) = hash_real(var_type(i), 
+     +                     var_rank(i), 
+     +                     index2, NFT_REAL)
+                        val = value(j)
+                        allInExtRange = allInExtRange .and.
+     +                      inRange3(val, var_type(i), 
+     +                               NFT_REAL)
+9                   continue
+                    err = nf_put_vars_real(ncid, i, index,
+     +                                   count, stride,
+     +                                   value)
+                    if (canConvert) then
+                        if (allInExtRange) then
+                            if (err .ne. 0) 
+     +                          call error(nf_strerror(err))
+                        else
+                            if (err .ne. NF_ERANGE)
+     +                          call errore('range error: ', err)
+                        end if
+                    else
+                        if (nels .gt. 0 .and. err .ne. NF_ECHAR)
+     +                      call errore('wrong type: ', err)
+                    end if
+7               continue
+5           continue
+1       continue
+
+        err = nf_close(ncid)
+        if (err .ne. 0) 
+     +      call errore('nf_close: ', err)
+
+        call check_vars_real(scratch)
+
+        err = nf_delete(scratch)
+        if (err .ne. 0)
+     +      call errorc('delete of scratch file failed:', 
+     +          scratch)
+        end
+
+        subroutine test_nf_put_vars_double()
+        implicit        none
+#include "tests.inc"
+        integer ncid
+        integer d
+        integer i
+        integer j
+        integer k
+        integer m
+        integer err
+        integer nels
+        integer nslabs
+        integer nstarts        !/* number of different starts */
+        integer start(MAX_RANK)
+        integer edge(MAX_RANK)
+        integer index(MAX_RANK)
+        integer index2(MAX_RANK)
+        integer mid(MAX_RANK)
+        integer count(MAX_RANK)
+        integer sstride(MAX_RANK)
+        integer stride(MAX_RANK)
+        logical canConvert      !/* Both text or both numeric */
+        logical allInExtRange   !/* all values within external range? */
+        doubleprecision    value(MAX_NELS)
+        doubleprecision val
+        integer udshift
+
+        err = nf_create(scratch, NF_CLOBBER, ncid)
+        if (err .ne. 0) then
+            call errore('nf_create: ', err)
+            return
+        end if
+        call def_dims(ncid)
+        call def_vars(ncid)
+        err = nf_enddef(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_enddef: ', err)
+
+        do 1, i = 1, NVARS
+            canConvert = (var_type(i) .eq. NF_CHAR) .eqv.
+     +                   (NFT_DOUBLE .eq. NFT_TEXT)
+            if (.not.(var_rank(i) .le. MAX_RANK))
+     +          stop 2
+            if (.not.(var_nels(i) .le. MAX_NELS))
+     +          stop 2
+            do 2, j = 1, var_rank(i)
+                start(j) = 1
+                edge(j) = 1
+                stride(j) = 1
+2           continue
+            err = nf_put_vars_double(BAD_ID, i, start,
+     +                  edge, stride, value)
+            if (err .ne. NF_EBADID) 
+     +          call errore('bad ncid: ', err)
+            err = nf_put_vars_double(ncid, BAD_VARID, start,
+     +                           edge, stride, 
+     +                           value)
+            if (err .ne. NF_ENOTVAR) 
+     +          call errore('bad var id: ', err)
+            do 3, j = 1, var_rank(i)
+                if (var_dimid(j,i) .ne. RECDIM) then    ! skip record dim
+                    start(j) = var_shape(j,i) + 2
+                    err = nf_put_vars_double(ncid, i, start,
+     +                                   edge, stride, 
+     +                                   value)
+                    if (.not. canConvert) then
+                        if (err .ne. NF_ECHAR)
+     +                      call errore('conversion: ', err)
+                    else
+                        if (err .ne. NF_EINVALCOORDS)
+     +                          call errore('bad start: ', err)
+                    endif
+                    start(j) = 1
+                    edge(j) = var_shape(j,i) + 1
+                    err = nf_put_vars_double(ncid, i, start,
+     +                                   edge, stride, 
+     +                                   value)
+                    if (.not. canConvert) then
+                        if (err .ne. NF_ECHAR)
+     +                      call errore('conversion: ', err)
+                    else
+                        if (err .ne. NF_EEDGE)
+     +                      call errore('bad edge: ', err)
+                    endif
+                    edge(j) = 1
+                    stride(j) = 0
+                    err = nf_put_vars_double(ncid, i, start,
+     +                                   edge, stride, 
+     +                                   value)
+                    if (.not. canConvert) then
+                        if (err .ne. NF_ECHAR)
+     +                      call errore('conversion: ', err)
+                    else
+                        if (err .ne. NF_ESTRIDE)
+     +                      call errore('bad stride: ', err)
+                    endif
+                    stride(j) = 1
+                end if
+3           continue
+                !/* Choose a random point dividing each dim into 2 parts */
+                !/* Put 2^rank (nslabs) slabs so defined */
+            nslabs = 1
+            do 4, j = 1, var_rank(i)
+                mid(j) = roll( var_shape(j,i) )
+                nslabs = nslabs * 2
+4           continue
+                !/* bits of k determine whether to put lower or upper part of dim */
+                !/* choose random stride from 1 to edge */
+            do 5, k = 1, nslabs
+                nstarts = 1
+                do 6, j = 1, var_rank(i)
+                    if (mod(udshift(k-1, -(j-1)), 2) .eq. 1) then
+                        start(j) = 1
+                        edge(j) = mid(j)
+                    else
+                        start(j) = 1 + mid(j)
+                        edge(j) = var_shape(j,i) - mid(j)
+                    end if
+                    if (edge(j) .gt. 0) then
+                        stride(j) = 1+roll(edge(j))
+                    else
+                        stride(j) = 1
+                    end if
+                    sstride(j) = stride(j)
+                    nstarts = nstarts * stride(j)
+6               continue
+                do 7, m = 1, nstarts
+                    err = index2indexes(m, var_rank(i), sstride, index)
+                    if (err .ne. 0)
+     +                  call error('error in index2indexes')
+                    nels = 1
+                    do 8, j = 1, var_rank(i)
+                        count(j) = 1 + (edge(j) - index(j)) / stride(j)
+                        nels = nels * count(j)
+                        index(j) = index(j) + start(j) - 1
+8                   continue
+                        !/* Random choice of forward or backward */
+C/* TODO
+C                   if ( roll(2) ) {
+C                       for (j = 1 j .lt. var_rank(i) j++) {
+C                           index(j) += (count(j) - 1) * stride(j)
+C                           stride(j) = -stride(j)
+C                       }
+C                   }
+C*/
+                    allInExtRange = .true.
+                    do 9, j = 1, nels
+                        err = index2indexes(j, var_rank(i), count, 
+     +                                      index2)
+                        if (err .ne. 0)
+     +                      call error('error in index2indexes')
+                        do 10, d = 1, var_rank(i)
+                            index2(d) = index(d) + 
+     +                                  (index2(d)-1) * stride(d)
+10                      continue
+                        value(j) = hash_double(var_type(i), 
+     +                     var_rank(i), 
+     +                     index2, NFT_DOUBLE)
+                        val = value(j)
+                        allInExtRange = allInExtRange .and.
+     +                      inRange3(val, var_type(i), 
+     +                               NFT_DOUBLE)
+9                   continue
+                    err = nf_put_vars_double(ncid, i, index,
+     +                                   count, stride,
+     +                                   value)
+                    if (canConvert) then
+                        if (allInExtRange) then
+                            if (err .ne. 0) 
+     +                          call error(nf_strerror(err))
+                        else
+                            if (err .ne. NF_ERANGE)
+     +                          call errore('range error: ', err)
+                        end if
+                    else
+                        if (nels .gt. 0 .and. err .ne. NF_ECHAR)
+     +                      call errore('wrong type: ', err)
+                    end if
+7               continue
+5           continue
+1       continue
+
+        err = nf_close(ncid)
+        if (err .ne. 0) 
+     +      call errore('nf_close: ', err)
+
+        call check_vars_double(scratch)
+
+        err = nf_delete(scratch)
+        if (err .ne. 0)
+     +      call errorc('delete of scratch file failed:', 
+     +          scratch)
+        end
+
+
+        subroutine test_nf_put_varm_text()
+        implicit        none
+#include "tests.inc"
+        integer ncid
+        integer d
+        integer i
+        integer j
+        integer k
+        integer m
+        integer err
+        integer nels
+        integer nslabs
+        integer nstarts        !/* number of different starts */
+        integer start(MAX_RANK)
+        integer edge(MAX_RANK)
+        integer index(MAX_RANK)
+        integer index2(MAX_RANK)
+        integer mid(MAX_RANK)
+        integer count(MAX_RANK)
+        integer sstride(MAX_RANK)
+        integer stride(MAX_RANK)
+        integer imap(MAX_RANK)
+        logical canConvert      !/* Both text or both numeric */
+        logical allInExtRange   !/* all values within external range? */
+        character value(MAX_NELS)
+        doubleprecision val
+        integer udshift
+
+        err = nf_create(scratch, NF_CLOBBER, ncid)
+        if (err .ne. 0) then
+            call errore('nf_create: ', err)
+            return
+        end if
+        call def_dims(ncid)
+        call def_vars(ncid)
+        err = nf_enddef(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_enddef: ', err)
+
+        do 1, i = 1, NVARS
+            canConvert = (var_type(i) .eq. NF_CHAR) .eqv.
+     +                   (NFT_TEXT .eq. NFT_TEXT)
+            if (.not.(var_rank(i) .le. MAX_RANK))
+     +          stop 2
+            if (.not.(var_nels(i) .le. MAX_NELS))
+     +          stop 2
+            do 2, j = 1, var_rank(i)
+                start(j) = 1
+                edge(j) = 1
+                stride(j) = 1
+                imap(j) = 1
+2           continue
+            err = nf_put_varm_text(BAD_ID, i, start,
+     +                           edge, stride, imap, 
+     +                           value)
+            if (err .ne. NF_EBADID) 
+     +          call errore('bad ncid: ', err)
+            err = nf_put_varm_text(ncid, BAD_VARID, start,
+     +                           edge, stride, 
+     +                           imap, value)
+            if (err .ne. NF_ENOTVAR) 
+     +          call errore('bad var id: ', err)
+            do 3, j = 1, var_rank(i)
+                if (var_dimid(j,i) .ne. RECDIM) then    !/* skip record dim */
+                    start(j) = var_shape(j,i) + 2
+                    err = nf_put_varm_text(ncid, i, start,
+     +                                   edge, stride, 
+     +                                   imap, value)
+                    if (.not. canConvert) then
+                        if (err .ne. NF_ECHAR)
+     +                      call errore('conversion: ', err)
+                    else
+                        if (err .ne. NF_EINVALCOORDS)
+     +                      call errore('bad start: ', err)
+                    endif
+                    start(j) = 1
+                    edge(j) = var_shape(j,i) + 1
+                    err = nf_put_varm_text(ncid, i, start,
+     +                                   edge, stride, 
+     +                                   imap, value)
+                    if (.not. canConvert) then
+                        if (err .ne. NF_ECHAR)
+     +                      call errore('conversion: ', err)
+                    else
+                        if (err .ne. NF_EEDGE)
+     +                      call errore('bad edge: ', err)
+                    endif
+                    edge(j) = 1
+                    stride(j) = 0
+                    err = nf_put_varm_text(ncid, i, start,
+     +                                   edge, stride, 
+     +                                   imap, value)
+                    if (.not. canConvert) then
+                        if (err .ne. NF_ECHAR)
+     +                      call errore('conversion: ', err)
+                    else
+                        if (err .ne. NF_ESTRIDE)
+     +                      call errore('bad stride: ', err)
+                    endif
+                    stride(j) = 1
+                end if
+3           continue
+                !/* Choose a random point dividing each dim into 2 parts */
+                !/* Put 2^rank (nslabs) slabs so defined */
+            nslabs = 1
+            do 4, j = 1, var_rank(i)
+                mid(j) = roll( var_shape(j,i) )
+                nslabs = nslabs * 2
+4           continue
+                !/* bits of k determine whether to put lower or upper part of dim */
+                !/* choose random stride from 1 to edge */
+            do 5, k = 1, nslabs
+                nstarts = 1
+                do 6, j = 1, var_rank(i)
+                    if (mod(udshift(k-1, -(j-1)), 2) .eq. 1) then
+                        start(j) = 1
+                        edge(j) = mid(j)
+                    else
+                        start(j) = 1 + mid(j)
+                        edge(j) = var_shape(j,i) - mid(j)
+                    end if
+                    if (edge(j) .gt. 0) then
+                        stride(j) = 1+roll(edge(j))
+                    else
+                        stride(j) = 1
+                    end if
+                    sstride(j) = stride(j)
+                    nstarts = nstarts * stride(j)
+6               continue
+                do 7, m = 1, nstarts
+                    err = index2indexes(m, var_rank(i), sstride, index)
+                    if (err .ne. 0)
+     +                  call error('error in index2indexes')
+                    nels = 1
+                    do 8, j = 1, var_rank(i)
+                        count(j) = 1 + (edge(j) - index(j)) / stride(j)
+                        nels = nels * count(j)
+                        index(j) = index(j) + start(j) - 1
+8                   continue
+                        !/* Random choice of forward or backward */
+C/* TODO
+C                   if ( roll(2) ) then
+C                       do 9, j = 1, var_rank(i)
+C                           index(j) = index(j) + 
+C     +                         (count(j) - 1) * stride(j)
+C                           stride(j) = -stride(j)
+C9                      continue
+C                   end if
+C*/
+                    if (var_rank(i) .gt. 0) then
+                        imap(1) = 1
+                        do 10, j = 2, var_rank(i)
+                            imap(j) = imap(j-1) * count(j-1)
+10                      continue
+                    end if
+                    allInExtRange = .true.
+                    do 11 j = 1, nels
+                        err = index2indexes(j, var_rank(i), count, 
+     +                                      index2)
+                        if (err .ne. 0)
+     +                      call error('error in index2indexes')
+                        do 12, d = 1, var_rank(i)
+                            index2(d) = index(d) + 
+     +                          (index2(d)-1) * stride(d)
+12                      continue
+                        value(j) = char(int(hash_text(var_type(i),
+     +                                       var_rank(i), 
+     +                                       index2, NFT_TEXT)))
+                        val = ichar(value(j))
+                        allInExtRange = allInExtRange .and.
+     +                      inRange3(val, var_type(i), 
+     +                               NFT_TEXT)
+11                  continue
+                    err = nf_put_varm_text(ncid,i,index,count,
+     +                                   stride,imap,
+     +                                   value)
+                    if (canConvert) then
+                        if (allInExtRange) then
+                            if (err .ne. 0)
+     +                          call error(nf_strerror(err))
+                        else
+                            if (err .ne. NF_ERANGE)
+     +                          call errore('range error: ', err)
+                        end if
+                    else
+                        if (nels .gt. 0 .and. err .ne. NF_ECHAR)
+     +                      call errore('wrong type: ', err)
+                    end if
+7               continue
+5           continue
+1       continue
+
+        err = nf_close(ncid)
+        if (err .ne. 0) 
+     +      call errore('nf_close: ', err)
+
+        call check_vars_text(scratch)
+
+        err = nf_delete(scratch)
+        if (err .ne. 0)
+     +      call errorc('delete of scratch file failed:', 
+     +          scratch)
+        end
+
+#ifdef NF_INT1_T
+        subroutine test_nf_put_varm_int1()
+        implicit        none
+#include "tests.inc"
+        integer ncid
+        integer d
+        integer i
+        integer j
+        integer k
+        integer m
+        integer err
+        integer nels
+        integer nslabs
+        integer nstarts        !/* number of different starts */
+        integer start(MAX_RANK)
+        integer edge(MAX_RANK)
+        integer index(MAX_RANK)
+        integer index2(MAX_RANK)
+        integer mid(MAX_RANK)
+        integer count(MAX_RANK)
+        integer sstride(MAX_RANK)
+        integer stride(MAX_RANK)
+        integer imap(MAX_RANK)
+        logical canConvert      !/* Both text or both numeric */
+        logical allInExtRange   !/* all values within external range? */
+        NF_INT1_T value(MAX_NELS)
+        doubleprecision val
+        integer udshift
+
+        err = nf_create(scratch, NF_CLOBBER, ncid)
+        if (err .ne. 0) then
+            call errore('nf_create: ', err)
+            return
+        end if
+        call def_dims(ncid)
+        call def_vars(ncid)
+        err = nf_enddef(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_enddef: ', err)
+
+        do 1, i = 1, NVARS
+            canConvert = (var_type(i) .eq. NF_CHAR) .eqv.
+     +                   (NFT_INT1 .eq. NFT_TEXT)
+            if (.not.(var_rank(i) .le. MAX_RANK))
+     +          stop 2
+            if (.not.(var_nels(i) .le. MAX_NELS))
+     +          stop 2
+            do 2, j = 1, var_rank(i)
+                start(j) = 1
+                edge(j) = 1
+                stride(j) = 1
+                imap(j) = 1
+2           continue
+            err = nf_put_varm_int1(BAD_ID, i, start,
+     +                           edge, stride, imap, 
+     +                           value)
+            if (err .ne. NF_EBADID) 
+     +          call errore('bad ncid: ', err)
+            err = nf_put_varm_int1(ncid, BAD_VARID, start,
+     +                           edge, stride, 
+     +                           imap, value)
+            if (err .ne. NF_ENOTVAR) 
+     +          call errore('bad var id: ', err)
+            do 3, j = 1, var_rank(i)
+                if (var_dimid(j,i) .ne. RECDIM) then    !/* skip record dim */
+                    start(j) = var_shape(j,i) + 2
+                    err = nf_put_varm_int1(ncid, i, start,
+     +                                   edge, stride, 
+     +                                   imap, value)
+                    if (.not. canConvert) then
+                        if (err .ne. NF_ECHAR)
+     +                      call errore('conversion: ', err)
+                    else
+                        if (err .ne. NF_EINVALCOORDS)
+     +                      call errore('bad start: ', err)
+                    endif
+                    start(j) = 1
+                    edge(j) = var_shape(j,i) + 1
+                    err = nf_put_varm_int1(ncid, i, start,
+     +                                   edge, stride, 
+     +                                   imap, value)
+                    if (.not. canConvert) then
+                        if (err .ne. NF_ECHAR)
+     +                      call errore('conversion: ', err)
+                    else
+                        if (err .ne. NF_EEDGE)
+     +                      call errore('bad edge: ', err)
+                    endif
+                    edge(j) = 1
+                    stride(j) = 0
+                    err = nf_put_varm_int1(ncid, i, start,
+     +                                   edge, stride, 
+     +                                   imap, value)
+                    if (.not. canConvert) then
+                        if (err .ne. NF_ECHAR)
+     +                      call errore('conversion: ', err)
+                    else
+                        if (err .ne. NF_ESTRIDE)
+     +                      call errore('bad stride: ', err)
+                    endif
+                    stride(j) = 1
+                end if
+3           continue
+                !/* Choose a random point dividing each dim into 2 parts */
+                !/* Put 2^rank (nslabs) slabs so defined */
+            nslabs = 1
+            do 4, j = 1, var_rank(i)
+                mid(j) = roll( var_shape(j,i) )
+                nslabs = nslabs * 2
+4           continue
+                !/* bits of k determine whether to put lower or upper part of dim */
+                !/* choose random stride from 1 to edge */
+            do 5, k = 1, nslabs
+                nstarts = 1
+                do 6, j = 1, var_rank(i)
+                    if (mod(udshift(k-1, -(j-1)), 2) .eq. 1) then
+                        start(j) = 1
+                        edge(j) = mid(j)
+                    else
+                        start(j) = 1 + mid(j)
+                        edge(j) = var_shape(j,i) - mid(j)
+                    end if
+                    if (edge(j) .gt. 0) then
+                        stride(j) = 1+roll(edge(j))
+                    else
+                        stride(j) = 1
+                    end if
+                    sstride(j) = stride(j)
+                    nstarts = nstarts * stride(j)
+6               continue
+                do 7, m = 1, nstarts
+                    err = index2indexes(m, var_rank(i), sstride, index)
+                    if (err .ne. 0)
+     +                  call error('error in index2indexes')
+                    nels = 1
+                    do 8, j = 1, var_rank(i)
+                        count(j) = 1 + (edge(j) - index(j)) / stride(j)
+                        nels = nels * count(j)
+                        index(j) = index(j) + start(j) - 1
+8                   continue
+                        !/* Random choice of forward or backward */
+C/* TODO
+C                   if ( roll(2) ) then
+C                       do 9, j = 1, var_rank(i)
+C                           index(j) = index(j) + 
+C     +                         (count(j) - 1) * stride(j)
+C                           stride(j) = -stride(j)
+C9                      continue
+C                   end if
+C*/
+                    if (var_rank(i) .gt. 0) then
+                        imap(1) = 1
+                        do 10, j = 2, var_rank(i)
+                            imap(j) = imap(j-1) * count(j-1)
+10                      continue
+                    end if
+                    allInExtRange = .true.
+                    do 11 j = 1, nels
+                        err = index2indexes(j, var_rank(i), count, 
+     +                                      index2)
+                        if (err .ne. 0)
+     +                      call error('error in index2indexes')
+                        do 12, d = 1, var_rank(i)
+                            index2(d) = index(d) + 
+     +                          (index2(d)-1) * stride(d)
+12                      continue
+                        value(j) = hash_int1(var_type(i),
+     +                                       var_rank(i), 
+     +                                       index2, NFT_INT1)
+                        val = value(j)
+                        allInExtRange = allInExtRange .and.
+     +                      inRange3(val, var_type(i), 
+     +                               NFT_INT1)
+11                  continue
+                    err = nf_put_varm_int1(ncid,i,index,count,
+     +                                   stride,imap,
+     +                                   value)
+                    if (canConvert) then
+                        if (allInExtRange) then
+                            if (err .ne. 0)
+     +                          call error(nf_strerror(err))
+                        else
+                            if (err .ne. NF_ERANGE)
+     +                          call errore('range error: ', err)
+                        end if
+                    else
+                        if (nels .gt. 0 .and. err .ne. NF_ECHAR)
+     +                      call errore('wrong type: ', err)
+                    end if
+7               continue
+5           continue
+1       continue
+
+        err = nf_close(ncid)
+        if (err .ne. 0) 
+     +      call errore('nf_close: ', err)
+
+        call check_vars_int1(scratch)
+
+        err = nf_delete(scratch)
+        if (err .ne. 0)
+     +      call errorc('delete of scratch file failed:', 
+     +          scratch)
+        end
+
+#endif
+#ifdef NF_INT2_T
+        subroutine test_nf_put_varm_int2()
+        implicit        none
+#include "tests.inc"
+        integer ncid
+        integer d
+        integer i
+        integer j
+        integer k
+        integer m
+        integer err
+        integer nels
+        integer nslabs
+        integer nstarts        !/* number of different starts */
+        integer start(MAX_RANK)
+        integer edge(MAX_RANK)
+        integer index(MAX_RANK)
+        integer index2(MAX_RANK)
+        integer mid(MAX_RANK)
+        integer count(MAX_RANK)
+        integer sstride(MAX_RANK)
+        integer stride(MAX_RANK)
+        integer imap(MAX_RANK)
+        logical canConvert      !/* Both text or both numeric */
+        logical allInExtRange   !/* all values within external range? */
+        NF_INT2_T value(MAX_NELS)
+        doubleprecision val
+        integer udshift
+
+        err = nf_create(scratch, NF_CLOBBER, ncid)
+        if (err .ne. 0) then
+            call errore('nf_create: ', err)
+            return
+        end if
+        call def_dims(ncid)
+        call def_vars(ncid)
+        err = nf_enddef(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_enddef: ', err)
+
+        do 1, i = 1, NVARS
+            canConvert = (var_type(i) .eq. NF_CHAR) .eqv.
+     +                   (NFT_INT2 .eq. NFT_TEXT)
+            if (.not.(var_rank(i) .le. MAX_RANK))
+     +          stop 2
+            if (.not.(var_nels(i) .le. MAX_NELS))
+     +          stop 2
+            do 2, j = 1, var_rank(i)
+                start(j) = 1
+                edge(j) = 1
+                stride(j) = 1
+                imap(j) = 1
+2           continue
+            err = nf_put_varm_int2(BAD_ID, i, start,
+     +                           edge, stride, imap, 
+     +                           value)
+            if (err .ne. NF_EBADID) 
+     +          call errore('bad ncid: ', err)
+            err = nf_put_varm_int2(ncid, BAD_VARID, start,
+     +                           edge, stride, 
+     +                           imap, value)
+            if (err .ne. NF_ENOTVAR) 
+     +          call errore('bad var id: ', err)
+            do 3, j = 1, var_rank(i)
+                if (var_dimid(j,i) .ne. RECDIM) then    !/* skip record dim */
+                    start(j) = var_shape(j,i) + 2
+                    err = nf_put_varm_int2(ncid, i, start,
+     +                                   edge, stride, 
+     +                                   imap, value)
+                    if (.not. canConvert) then
+                        if (err .ne. NF_ECHAR)
+     +                      call errore('conversion: ', err)
+                    else
+                        if (err .ne. NF_EINVALCOORDS)
+     +                      call errore('bad start: ', err)
+                    endif
+                    start(j) = 1
+                    edge(j) = var_shape(j,i) + 1
+                    err = nf_put_varm_int2(ncid, i, start,
+     +                                   edge, stride, 
+     +                                   imap, value)
+                    if (.not. canConvert) then
+                        if (err .ne. NF_ECHAR)
+     +                      call errore('conversion: ', err)
+                    else
+                        if (err .ne. NF_EEDGE)
+     +                      call errore('bad edge: ', err)
+                    endif
+                    edge(j) = 1
+                    stride(j) = 0
+                    err = nf_put_varm_int2(ncid, i, start,
+     +                                   edge, stride, 
+     +                                   imap, value)
+                    if (.not. canConvert) then
+                        if (err .ne. NF_ECHAR)
+     +                      call errore('conversion: ', err)
+                    else
+                        if (err .ne. NF_ESTRIDE)
+     +                      call errore('bad stride: ', err)
+                    endif
+                    stride(j) = 1
+                end if
+3           continue
+                !/* Choose a random point dividing each dim into 2 parts */
+                !/* Put 2^rank (nslabs) slabs so defined */
+            nslabs = 1
+            do 4, j = 1, var_rank(i)
+                mid(j) = roll( var_shape(j,i) )
+                nslabs = nslabs * 2
+4           continue
+                !/* bits of k determine whether to put lower or upper part of dim */
+                !/* choose random stride from 1 to edge */
+            do 5, k = 1, nslabs
+                nstarts = 1
+                do 6, j = 1, var_rank(i)
+                    if (mod(udshift(k-1, -(j-1)), 2) .eq. 1) then
+                        start(j) = 1
+                        edge(j) = mid(j)
+                    else
+                        start(j) = 1 + mid(j)
+                        edge(j) = var_shape(j,i) - mid(j)
+                    end if
+                    if (edge(j) .gt. 0) then
+                        stride(j) = 1+roll(edge(j))
+                    else
+                        stride(j) = 1
+                    end if
+                    sstride(j) = stride(j)
+                    nstarts = nstarts * stride(j)
+6               continue
+                do 7, m = 1, nstarts
+                    err = index2indexes(m, var_rank(i), sstride, index)
+                    if (err .ne. 0)
+     +                  call error('error in index2indexes')
+                    nels = 1
+                    do 8, j = 1, var_rank(i)
+                        count(j) = 1 + (edge(j) - index(j)) / stride(j)
+                        nels = nels * count(j)
+                        index(j) = index(j) + start(j) - 1
+8                   continue
+                        !/* Random choice of forward or backward */
+C/* TODO
+C                   if ( roll(2) ) then
+C                       do 9, j = 1, var_rank(i)
+C                           index(j) = index(j) + 
+C     +                         (count(j) - 1) * stride(j)
+C                           stride(j) = -stride(j)
+C9                      continue
+C                   end if
+C*/
+                    if (var_rank(i) .gt. 0) then
+                        imap(1) = 1
+                        do 10, j = 2, var_rank(i)
+                            imap(j) = imap(j-1) * count(j-1)
+10                      continue
+                    end if
+                    allInExtRange = .true.
+                    do 11 j = 1, nels
+                        err = index2indexes(j, var_rank(i), count, 
+     +                                      index2)
+                        if (err .ne. 0)
+     +                      call error('error in index2indexes')
+                        do 12, d = 1, var_rank(i)
+                            index2(d) = index(d) + 
+     +                          (index2(d)-1) * stride(d)
+12                      continue
+                        value(j) = hash_int2(var_type(i),
+     +                                       var_rank(i), 
+     +                                       index2, NFT_INT2)
+                        val = value(j)
+                        allInExtRange = allInExtRange .and.
+     +                      inRange3(val, var_type(i), 
+     +                               NFT_INT2)
+11                  continue
+                    err = nf_put_varm_int2(ncid,i,index,count,
+     +                                   stride,imap,
+     +                                   value)
+                    if (canConvert) then
+                        if (allInExtRange) then
+                            if (err .ne. 0)
+     +                          call error(nf_strerror(err))
+                        else
+                            if (err .ne. NF_ERANGE)
+     +                          call errore('range error: ', err)
+                        end if
+                    else
+                        if (nels .gt. 0 .and. err .ne. NF_ECHAR)
+     +                      call errore('wrong type: ', err)
+                    end if
+7               continue
+5           continue
+1       continue
+
+        err = nf_close(ncid)
+        if (err .ne. 0) 
+     +      call errore('nf_close: ', err)
+
+        call check_vars_int2(scratch)
+
+        err = nf_delete(scratch)
+        if (err .ne. 0)
+     +      call errorc('delete of scratch file failed:', 
+     +          scratch)
+        end
+
+#endif
+        subroutine test_nf_put_varm_int()
+        implicit        none
+#include "tests.inc"
+        integer ncid
+        integer d
+        integer i
+        integer j
+        integer k
+        integer m
+        integer err
+        integer nels
+        integer nslabs
+        integer nstarts        !/* number of different starts */
+        integer start(MAX_RANK)
+        integer edge(MAX_RANK)
+        integer index(MAX_RANK)
+        integer index2(MAX_RANK)
+        integer mid(MAX_RANK)
+        integer count(MAX_RANK)
+        integer sstride(MAX_RANK)
+        integer stride(MAX_RANK)
+        integer imap(MAX_RANK)
+        logical canConvert      !/* Both text or both numeric */
+        logical allInExtRange   !/* all values within external range? */
+        integer value(MAX_NELS)
+        doubleprecision val
+        integer udshift
+
+        err = nf_create(scratch, NF_CLOBBER, ncid)
+        if (err .ne. 0) then
+            call errore('nf_create: ', err)
+            return
+        end if
+        call def_dims(ncid)
+        call def_vars(ncid)
+        err = nf_enddef(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_enddef: ', err)
+
+        do 1, i = 1, NVARS
+            canConvert = (var_type(i) .eq. NF_CHAR) .eqv.
+     +                   (NFT_INT .eq. NFT_TEXT)
+            if (.not.(var_rank(i) .le. MAX_RANK))
+     +          stop 2
+            if (.not.(var_nels(i) .le. MAX_NELS))
+     +          stop 2
+            do 2, j = 1, var_rank(i)
+                start(j) = 1
+                edge(j) = 1
+                stride(j) = 1
+                imap(j) = 1
+2           continue
+            err = nf_put_varm_int(BAD_ID, i, start,
+     +                           edge, stride, imap, 
+     +                           value)
+            if (err .ne. NF_EBADID) 
+     +          call errore('bad ncid: ', err)
+            err = nf_put_varm_int(ncid, BAD_VARID, start,
+     +                           edge, stride, 
+     +                           imap, value)
+            if (err .ne. NF_ENOTVAR) 
+     +          call errore('bad var id: ', err)
+            do 3, j = 1, var_rank(i)
+                if (var_dimid(j,i) .ne. RECDIM) then    !/* skip record dim */
+                    start(j) = var_shape(j,i) + 2
+                    err = nf_put_varm_int(ncid, i, start,
+     +                                   edge, stride, 
+     +                                   imap, value)
+                    if (.not. canConvert) then
+                        if (err .ne. NF_ECHAR)
+     +                      call errore('conversion: ', err)
+                    else
+                        if (err .ne. NF_EINVALCOORDS)
+     +                      call errore('bad start: ', err)
+                    endif
+                    start(j) = 1
+                    edge(j) = var_shape(j,i) + 1
+                    err = nf_put_varm_int(ncid, i, start,
+     +                                   edge, stride, 
+     +                                   imap, value)
+                    if (.not. canConvert) then
+                        if (err .ne. NF_ECHAR)
+     +                      call errore('conversion: ', err)
+                    else
+                        if (err .ne. NF_EEDGE)
+     +                      call errore('bad edge: ', err)
+                    endif
+                    edge(j) = 1
+                    stride(j) = 0
+                    err = nf_put_varm_int(ncid, i, start,
+     +                                   edge, stride, 
+     +                                   imap, value)
+                    if (.not. canConvert) then
+                        if (err .ne. NF_ECHAR)
+     +                      call errore('conversion: ', err)
+                    else
+                        if (err .ne. NF_ESTRIDE)
+     +                      call errore('bad stride: ', err)
+                    endif
+                    stride(j) = 1
+                end if
+3           continue
+                !/* Choose a random point dividing each dim into 2 parts */
+                !/* Put 2^rank (nslabs) slabs so defined */
+            nslabs = 1
+            do 4, j = 1, var_rank(i)
+                mid(j) = roll( var_shape(j,i) )
+                nslabs = nslabs * 2
+4           continue
+                !/* bits of k determine whether to put lower or upper part of dim */
+                !/* choose random stride from 1 to edge */
+            do 5, k = 1, nslabs
+                nstarts = 1
+                do 6, j = 1, var_rank(i)
+                    if (mod(udshift(k-1, -(j-1)), 2) .eq. 1) then
+                        start(j) = 1
+                        edge(j) = mid(j)
+                    else
+                        start(j) = 1 + mid(j)
+                        edge(j) = var_shape(j,i) - mid(j)
+                    end if
+                    if (edge(j) .gt. 0) then
+                        stride(j) = 1+roll(edge(j))
+                    else
+                        stride(j) = 1
+                    end if
+                    sstride(j) = stride(j)
+                    nstarts = nstarts * stride(j)
+6               continue
+                do 7, m = 1, nstarts
+                    err = index2indexes(m, var_rank(i), sstride, index)
+                    if (err .ne. 0)
+     +                  call error('error in index2indexes')
+                    nels = 1
+                    do 8, j = 1, var_rank(i)
+                        count(j) = 1 + (edge(j) - index(j)) / stride(j)
+                        nels = nels * count(j)
+                        index(j) = index(j) + start(j) - 1
+8                   continue
+                        !/* Random choice of forward or backward */
+C/* TODO
+C                   if ( roll(2) ) then
+C                       do 9, j = 1, var_rank(i)
+C                           index(j) = index(j) + 
+C     +                         (count(j) - 1) * stride(j)
+C                           stride(j) = -stride(j)
+C9                      continue
+C                   end if
+C*/
+                    if (var_rank(i) .gt. 0) then
+                        imap(1) = 1
+                        do 10, j = 2, var_rank(i)
+                            imap(j) = imap(j-1) * count(j-1)
+10                      continue
+                    end if
+                    allInExtRange = .true.
+                    do 11 j = 1, nels
+                        err = index2indexes(j, var_rank(i), count, 
+     +                                      index2)
+                        if (err .ne. 0)
+     +                      call error('error in index2indexes')
+                        do 12, d = 1, var_rank(i)
+                            index2(d) = index(d) + 
+     +                          (index2(d)-1) * stride(d)
+12                      continue
+                        value(j) = hash_int(var_type(i),
+     +                                       var_rank(i), 
+     +                                       index2, NFT_INT)
+                        val = value(j)
+                        allInExtRange = allInExtRange .and.
+     +                      inRange3(val, var_type(i), 
+     +                               NFT_INT)
+11                  continue
+                    err = nf_put_varm_int(ncid,i,index,count,
+     +                                   stride,imap,
+     +                                   value)
+                    if (canConvert) then
+                        if (allInExtRange) then
+                            if (err .ne. 0)
+     +                          call error(nf_strerror(err))
+                        else
+                            if (err .ne. NF_ERANGE)
+     +                          call errore('range error: ', err)
+                        end if
+                    else
+                        if (nels .gt. 0 .and. err .ne. NF_ECHAR)
+     +                      call errore('wrong type: ', err)
+                    end if
+7               continue
+5           continue
+1       continue
+
+        err = nf_close(ncid)
+        if (err .ne. 0) 
+     +      call errore('nf_close: ', err)
+
+        call check_vars_int(scratch)
+
+        err = nf_delete(scratch)
+        if (err .ne. 0)
+     +      call errorc('delete of scratch file failed:', 
+     +          scratch)
+        end
+
+        subroutine test_nf_put_varm_real()
+        implicit        none
+#include "tests.inc"
+        integer ncid
+        integer d
+        integer i
+        integer j
+        integer k
+        integer m
+        integer err
+        integer nels
+        integer nslabs
+        integer nstarts        !/* number of different starts */
+        integer start(MAX_RANK)
+        integer edge(MAX_RANK)
+        integer index(MAX_RANK)
+        integer index2(MAX_RANK)
+        integer mid(MAX_RANK)
+        integer count(MAX_RANK)
+        integer sstride(MAX_RANK)
+        integer stride(MAX_RANK)
+        integer imap(MAX_RANK)
+        logical canConvert      !/* Both text or both numeric */
+        logical allInExtRange   !/* all values within external range? */
+        real value(MAX_NELS)
+        doubleprecision val
+        integer udshift
+
+        err = nf_create(scratch, NF_CLOBBER, ncid)
+        if (err .ne. 0) then
+            call errore('nf_create: ', err)
+            return
+        end if
+        call def_dims(ncid)
+        call def_vars(ncid)
+        err = nf_enddef(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_enddef: ', err)
+
+        do 1, i = 1, NVARS
+            canConvert = (var_type(i) .eq. NF_CHAR) .eqv.
+     +                   (NFT_REAL .eq. NFT_TEXT)
+            if (.not.(var_rank(i) .le. MAX_RANK))
+     +          stop 2
+            if (.not.(var_nels(i) .le. MAX_NELS))
+     +          stop 2
+            do 2, j = 1, var_rank(i)
+                start(j) = 1
+                edge(j) = 1
+                stride(j) = 1
+                imap(j) = 1
+2           continue
+            err = nf_put_varm_real(BAD_ID, i, start,
+     +                           edge, stride, imap, 
+     +                           value)
+            if (err .ne. NF_EBADID) 
+     +          call errore('bad ncid: ', err)
+            err = nf_put_varm_real(ncid, BAD_VARID, start,
+     +                           edge, stride, 
+     +                           imap, value)
+            if (err .ne. NF_ENOTVAR) 
+     +          call errore('bad var id: ', err)
+            do 3, j = 1, var_rank(i)
+                if (var_dimid(j,i) .ne. RECDIM) then    !/* skip record dim */
+                    start(j) = var_shape(j,i) + 2
+                    err = nf_put_varm_real(ncid, i, start,
+     +                                   edge, stride, 
+     +                                   imap, value)
+                    if (.not. canConvert) then
+                        if (err .ne. NF_ECHAR)
+     +                      call errore('conversion: ', err)
+                    else
+                        if (err .ne. NF_EINVALCOORDS)
+     +                      call errore('bad start: ', err)
+                    endif
+                    start(j) = 1
+                    edge(j) = var_shape(j,i) + 1
+                    err = nf_put_varm_real(ncid, i, start,
+     +                                   edge, stride, 
+     +                                   imap, value)
+                    if (.not. canConvert) then
+                        if (err .ne. NF_ECHAR)
+     +                      call errore('conversion: ', err)
+                    else
+                        if (err .ne. NF_EEDGE)
+     +                      call errore('bad edge: ', err)
+                    endif
+                    edge(j) = 1
+                    stride(j) = 0
+                    err = nf_put_varm_real(ncid, i, start,
+     +                                   edge, stride, 
+     +                                   imap, value)
+                    if (.not. canConvert) then
+                        if (err .ne. NF_ECHAR)
+     +                      call errore('conversion: ', err)
+                    else
+                        if (err .ne. NF_ESTRIDE)
+     +                      call errore('bad stride: ', err)
+                    endif
+                    stride(j) = 1
+                end if
+3           continue
+                !/* Choose a random point dividing each dim into 2 parts */
+                !/* Put 2^rank (nslabs) slabs so defined */
+            nslabs = 1
+            do 4, j = 1, var_rank(i)
+                mid(j) = roll( var_shape(j,i) )
+                nslabs = nslabs * 2
+4           continue
+                !/* bits of k determine whether to put lower or upper part of dim */
+                !/* choose random stride from 1 to edge */
+            do 5, k = 1, nslabs
+                nstarts = 1
+                do 6, j = 1, var_rank(i)
+                    if (mod(udshift(k-1, -(j-1)), 2) .eq. 1) then
+                        start(j) = 1
+                        edge(j) = mid(j)
+                    else
+                        start(j) = 1 + mid(j)
+                        edge(j) = var_shape(j,i) - mid(j)
+                    end if
+                    if (edge(j) .gt. 0) then
+                        stride(j) = 1+roll(edge(j))
+                    else
+                        stride(j) = 1
+                    end if
+                    sstride(j) = stride(j)
+                    nstarts = nstarts * stride(j)
+6               continue
+                do 7, m = 1, nstarts
+                    err = index2indexes(m, var_rank(i), sstride, index)
+                    if (err .ne. 0)
+     +                  call error('error in index2indexes')
+                    nels = 1
+                    do 8, j = 1, var_rank(i)
+                        count(j) = 1 + (edge(j) - index(j)) / stride(j)
+                        nels = nels * count(j)
+                        index(j) = index(j) + start(j) - 1
+8                   continue
+                        !/* Random choice of forward or backward */
+C/* TODO
+C                   if ( roll(2) ) then
+C                       do 9, j = 1, var_rank(i)
+C                           index(j) = index(j) + 
+C     +                         (count(j) - 1) * stride(j)
+C                           stride(j) = -stride(j)
+C9                      continue
+C                   end if
+C*/
+                    if (var_rank(i) .gt. 0) then
+                        imap(1) = 1
+                        do 10, j = 2, var_rank(i)
+                            imap(j) = imap(j-1) * count(j-1)
+10                      continue
+                    end if
+                    allInExtRange = .true.
+                    do 11 j = 1, nels
+                        err = index2indexes(j, var_rank(i), count, 
+     +                                      index2)
+                        if (err .ne. 0)
+     +                      call error('error in index2indexes')
+                        do 12, d = 1, var_rank(i)
+                            index2(d) = index(d) + 
+     +                          (index2(d)-1) * stride(d)
+12                      continue
+                        value(j) = hash_real(var_type(i),
+     +                                       var_rank(i), 
+     +                                       index2, NFT_REAL)
+                        val = value(j)
+                        allInExtRange = allInExtRange .and.
+     +                      inRange3(val, var_type(i), 
+     +                               NFT_REAL)
+11                  continue
+                    err = nf_put_varm_real(ncid,i,index,count,
+     +                                   stride,imap,
+     +                                   value)
+                    if (canConvert) then
+                        if (allInExtRange) then
+                            if (err .ne. 0)
+     +                          call error(nf_strerror(err))
+                        else
+                            if (err .ne. NF_ERANGE)
+     +                          call errore('range error: ', err)
+                        end if
+                    else
+                        if (nels .gt. 0 .and. err .ne. NF_ECHAR)
+     +                      call errore('wrong type: ', err)
+                    end if
+7               continue
+5           continue
+1       continue
+
+        err = nf_close(ncid)
+        if (err .ne. 0) 
+     +      call errore('nf_close: ', err)
+
+        call check_vars_real(scratch)
+
+        err = nf_delete(scratch)
+        if (err .ne. 0)
+     +      call errorc('delete of scratch file failed:', 
+     +          scratch)
+        end
+
+        subroutine test_nf_put_varm_double()
+        implicit        none
+#include "tests.inc"
+        integer ncid
+        integer d
+        integer i
+        integer j
+        integer k
+        integer m
+        integer err
+        integer nels
+        integer nslabs
+        integer nstarts        !/* number of different starts */
+        integer start(MAX_RANK)
+        integer edge(MAX_RANK)
+        integer index(MAX_RANK)
+        integer index2(MAX_RANK)
+        integer mid(MAX_RANK)
+        integer count(MAX_RANK)
+        integer sstride(MAX_RANK)
+        integer stride(MAX_RANK)
+        integer imap(MAX_RANK)
+        logical canConvert      !/* Both text or both numeric */
+        logical allInExtRange   !/* all values within external range? */
+        doubleprecision value(MAX_NELS)
+        doubleprecision val
+        integer udshift
+
+        err = nf_create(scratch, NF_CLOBBER, ncid)
+        if (err .ne. 0) then
+            call errore('nf_create: ', err)
+            return
+        end if
+        call def_dims(ncid)
+        call def_vars(ncid)
+        err = nf_enddef(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_enddef: ', err)
+
+        do 1, i = 1, NVARS
+            canConvert = (var_type(i) .eq. NF_CHAR) .eqv.
+     +                   (NFT_DOUBLE .eq. NFT_TEXT)
+            if (.not.(var_rank(i) .le. MAX_RANK))
+     +          stop 2
+            if (.not.(var_nels(i) .le. MAX_NELS))
+     +          stop 2
+            do 2, j = 1, var_rank(i)
+                start(j) = 1
+                edge(j) = 1
+                stride(j) = 1
+                imap(j) = 1
+2           continue
+            err = nf_put_varm_double(BAD_ID, i, start,
+     +                           edge, stride, imap, 
+     +                           value)
+            if (err .ne. NF_EBADID) 
+     +          call errore('bad ncid: ', err)
+            err = nf_put_varm_double(ncid, BAD_VARID, start,
+     +                           edge, stride, 
+     +                           imap, value)
+            if (err .ne. NF_ENOTVAR) 
+     +          call errore('bad var id: ', err)
+            do 3, j = 1, var_rank(i)
+                if (var_dimid(j,i) .ne. RECDIM) then    !/* skip record dim */
+                    start(j) = var_shape(j,i) + 2
+                    err = nf_put_varm_double(ncid, i, start,
+     +                                   edge, stride, 
+     +                                   imap, value)
+                    if (.not. canConvert) then
+                        if (err .ne. NF_ECHAR)
+     +                      call errore('conversion: ', err)
+                    else
+                        if (err .ne. NF_EINVALCOORDS)
+     +                      call errore('bad start: ', err)
+                    endif
+                    start(j) = 1
+                    edge(j) = var_shape(j,i) + 1
+                    err = nf_put_varm_double(ncid, i, start,
+     +                                   edge, stride, 
+     +                                   imap, value)
+                    if (.not. canConvert) then
+                        if (err .ne. NF_ECHAR)
+     +                      call errore('conversion: ', err)
+                    else
+                        if (err .ne. NF_EEDGE)
+     +                      call errore('bad edge: ', err)
+                    endif
+                    edge(j) = 1
+                    stride(j) = 0
+                    err = nf_put_varm_double(ncid, i, start,
+     +                                   edge, stride, 
+     +                                   imap, value)
+                    if (.not. canConvert) then
+                        if (err .ne. NF_ECHAR)
+     +                      call errore('conversion: ', err)
+                    else
+                        if (err .ne. NF_ESTRIDE)
+     +                      call errore('bad stride: ', err)
+                    endif
+                    stride(j) = 1
+                end if
+3           continue
+                !/* Choose a random point dividing each dim into 2 parts */
+                !/* Put 2^rank (nslabs) slabs so defined */
+            nslabs = 1
+            do 4, j = 1, var_rank(i)
+                mid(j) = roll( var_shape(j,i) )
+                nslabs = nslabs * 2
+4           continue
+                !/* bits of k determine whether to put lower or upper part of dim */
+                !/* choose random stride from 1 to edge */
+            do 5, k = 1, nslabs
+                nstarts = 1
+                do 6, j = 1, var_rank(i)
+                    if (mod(udshift(k-1, -(j-1)), 2) .eq. 1) then
+                        start(j) = 1
+                        edge(j) = mid(j)
+                    else
+                        start(j) = 1 + mid(j)
+                        edge(j) = var_shape(j,i) - mid(j)
+                    end if
+                    if (edge(j) .gt. 0) then
+                        stride(j) = 1+roll(edge(j))
+                    else
+                        stride(j) = 1
+                    end if
+                    sstride(j) = stride(j)
+                    nstarts = nstarts * stride(j)
+6               continue
+                do 7, m = 1, nstarts
+                    err = index2indexes(m, var_rank(i), sstride, index)
+                    if (err .ne. 0)
+     +                  call error('error in index2indexes')
+                    nels = 1
+                    do 8, j = 1, var_rank(i)
+                        count(j) = 1 + (edge(j) - index(j)) / stride(j)
+                        nels = nels * count(j)
+                        index(j) = index(j) + start(j) - 1
+8                   continue
+                        !/* Random choice of forward or backward */
+C/* TODO
+C                   if ( roll(2) ) then
+C                       do 9, j = 1, var_rank(i)
+C                           index(j) = index(j) + 
+C     +                         (count(j) - 1) * stride(j)
+C                           stride(j) = -stride(j)
+C9                      continue
+C                   end if
+C*/
+                    if (var_rank(i) .gt. 0) then
+                        imap(1) = 1
+                        do 10, j = 2, var_rank(i)
+                            imap(j) = imap(j-1) * count(j-1)
+10                      continue
+                    end if
+                    allInExtRange = .true.
+                    do 11 j = 1, nels
+                        err = index2indexes(j, var_rank(i), count, 
+     +                                      index2)
+                        if (err .ne. 0)
+     +                      call error('error in index2indexes')
+                        do 12, d = 1, var_rank(i)
+                            index2(d) = index(d) + 
+     +                          (index2(d)-1) * stride(d)
+12                      continue
+                        value(j) = hash_double(var_type(i),
+     +                                       var_rank(i), 
+     +                                       index2, NFT_DOUBLE)
+                        val = value(j)
+                        allInExtRange = allInExtRange .and.
+     +                      inRange3(val, var_type(i), 
+     +                               NFT_DOUBLE)
+11                  continue
+                    err = nf_put_varm_double(ncid,i,index,count,
+     +                                   stride,imap,
+     +                                   value)
+                    if (canConvert) then
+                        if (allInExtRange) then
+                            if (err .ne. 0)
+     +                          call error(nf_strerror(err))
+                        else
+                            if (err .ne. NF_ERANGE)
+     +                          call errore('range error: ', err)
+                        end if
+                    else
+                        if (nels .gt. 0 .and. err .ne. NF_ECHAR)
+     +                      call errore('wrong type: ', err)
+                    end if
+7               continue
+5           continue
+1       continue
+
+        err = nf_close(ncid)
+        if (err .ne. 0) 
+     +      call errore('nf_close: ', err)
+
+        call check_vars_double(scratch)
+
+        err = nf_delete(scratch)
+        if (err .ne. 0)
+     +      call errorc('delete of scratch file failed:', 
+     +          scratch)
+        end
+
+
+        subroutine test_nf_put_att_text()
+        implicit        none
+#include "tests.inc"
+        integer ncid
+        integer i
+        integer j
+        integer k
+        integer err
+        character       value(MAX_NELS)
+
+        err = nf_create(scratch, NF_NOCLOBBER, ncid)
+        if (err .ne. 0) then
+            call errore('NF_create: ', err)
+            return
+        end if
+        call def_dims(ncid)
+        call def_vars(ncid)
+
+        do 1, i = 0, NVARS
+            do 2, j = 1, NATTS(i)
+                if (ATT_TYPE(j,i) .eq. NF_CHAR) then
+                    if (.not.(ATT_LEN(j,i) .le. MAX_NELS))
+     +                  stop 2
+                    err = nf_put_att_text(BAD_ID, i,
+     +                  ATT_NAME(j,i), ATT_LEN(j,i), value)
+                    if (err .ne. NF_EBADID)
+     +                  call errore('bad ncid: ', err)
+                    err = nf_put_att_text(ncid, BAD_VARID, 
+     +                                    ATT_NAME(j,i), 
+     +                                    ATT_LEN(j,i), value)
+                    if (err .ne. NF_ENOTVAR)
+     +                  call errore('bad var id: ', err)
+                    do 3, k = 1, ATT_LEN(j,i)
+                        value(k) = char(int(hash(ATT_TYPE(j,i), -1, k)))
+3                   continue
+                    err = nf_put_att_text(ncid, i, ATT_NAME(j,i), 
+     +                  ATT_LEN(j,i), value)
+                    if (err .ne. 0)
+     +                  call error(NF_strerror(err))
+                end if
+2           continue
+1       continue
+
+        call check_atts_text(ncid)
+        err = NF_close(ncid)
+        if (err .ne. 0)
+     +      call errore('NF_close: ', err)
+
+        err = nf_delete(scratch)
+        if (err .ne. 0)
+     +      call errorc('delete of scratch file failed:', 
+     +          scratch)
+        end
+
+#ifdef NF_INT1_T
+        subroutine test_nf_put_att_int1()
+        implicit        none
+#include "tests.inc"
+        integer ncid
+        integer i
+        integer j
+        integer k
+        integer ndx(1)
+        integer err
+        NF_INT1_T value(MAX_NELS)
+        logical allInExtRange  !/* all values within external range? */
+        doubleprecision val
+
+        err = nf_create(scratch, NF_NOCLOBBER, ncid)
+        if (err .ne. 0) then
+            call errore('nf_create: ', err)
+            return
+        end if
+        call def_dims(ncid)
+        call def_vars(ncid)
+
+        do 1, i = 0, NVARS
+            do 2, j = 1, NATTS(i)
+                if (.not.(ATT_TYPE(j,i) .eq. NF_CHAR)) then
+                    if (.not.((ATT_LEN(j,i) .le. MAX_NELS)))
+     +                  stop 2
+                    err = nf_put_att_int1(BAD_ID, i,
+     +                                  ATT_NAME(j,i), 
+     +                                  ATT_TYPE(j,i), 
+     +                                  ATT_LEN(j,i), value)
+                    if (err .ne. NF_EBADID)
+     +                  call errore('bad ncid: ', err)
+                    err = nf_put_att_int1(ncid, BAD_VARID,
+     +                  ATT_NAME(j,i), 
+     +                  ATT_TYPE(j,i), ATT_LEN(j,i), value)
+                    if (err .ne. NF_ENOTVAR)
+     +                  call errore('bad var id: ', err)
+                    err = nf_put_att_int1(ncid, i,
+     +                  ATT_NAME(j,i), BAD_TYPE, 
+     +                  ATT_LEN(j,i), value)
+                    if (err .ne. NF_EBADTYPE)
+     +                  call errore('bad type: ', err)
+                    allInExtRange = .true.
+                    do 3, k = 1, ATT_LEN(j,i)
+                        ndx(1) = k
+                        value(k) = hash_int1(ATT_TYPE(j,i), -1, ndx, 
+     +                                     NFT_INT1)
+                        val = value(k)
+                        allInExtRange = allInExtRange .and.
+     +                      inRange3(val, ATT_TYPE(j,i), 
+     +                               NFT_INT1)
+3                   continue
+                    err = nf_put_att_int1(ncid, i, ATT_NAME(j,i), 
+     +                                  ATT_TYPE(j,i), ATT_LEN(j,i), 
+     +                                  value)
+                    if (allInExtRange) then
+                        if (err .ne. 0)
+     +                      call error(nf_strerror(err))
+                    else
+                        if (err .ne. NF_ERANGE)
+     +                      call errore('range error: ', err)
+                    end if
+                end if
+2           continue
+1       continue
+
+        call check_atts_int1(ncid)
+        err = nf_close(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_close: ', err)
+
+        err = nf_delete(scratch)
+        if (err .ne. 0)
+     +      call errorc('delete of scratch file failed:', 
+     +          scratch)
+        end
+
+#endif
+#ifdef NF_INT2_T
+        subroutine test_nf_put_att_int2()
+        implicit        none
+#include "tests.inc"
+        integer ncid
+        integer i
+        integer j
+        integer k
+        integer ndx(1)
+        integer err
+        NF_INT2_T value(MAX_NELS)
+        logical allInExtRange  !/* all values within external range? */
+        doubleprecision val
+
+        err = nf_create(scratch, NF_NOCLOBBER, ncid)
+        if (err .ne. 0) then
+            call errore('nf_create: ', err)
+            return
+        end if
+        call def_dims(ncid)
+        call def_vars(ncid)
+
+        do 1, i = 0, NVARS
+            do 2, j = 1, NATTS(i)
+                if (.not.(ATT_TYPE(j,i) .eq. NF_CHAR)) then
+                    if (.not.((ATT_LEN(j,i) .le. MAX_NELS)))
+     +                  stop 2
+                    err = nf_put_att_int2(BAD_ID, i,
+     +                                  ATT_NAME(j,i), 
+     +                                  ATT_TYPE(j,i), 
+     +                                  ATT_LEN(j,i), value)
+                    if (err .ne. NF_EBADID)
+     +                  call errore('bad ncid: ', err)
+                    err = nf_put_att_int2(ncid, BAD_VARID,
+     +                  ATT_NAME(j,i), 
+     +                  ATT_TYPE(j,i), ATT_LEN(j,i), value)
+                    if (err .ne. NF_ENOTVAR)
+     +                  call errore('bad var id: ', err)
+                    err = nf_put_att_int2(ncid, i,
+     +                  ATT_NAME(j,i), BAD_TYPE, 
+     +                  ATT_LEN(j,i), value)
+                    if (err .ne. NF_EBADTYPE)
+     +                  call errore('bad type: ', err)
+                    allInExtRange = .true.
+                    do 3, k = 1, ATT_LEN(j,i)
+                        ndx(1) = k
+                        value(k) = hash_int2(ATT_TYPE(j,i), -1, ndx, 
+     +                                     NFT_INT2)
+                        val = value(k)
+                        allInExtRange = allInExtRange .and.
+     +                      inRange3(val, ATT_TYPE(j,i), 
+     +                               NFT_INT2)
+3                   continue
+                    err = nf_put_att_int2(ncid, i, ATT_NAME(j,i), 
+     +                                  ATT_TYPE(j,i), ATT_LEN(j,i), 
+     +                                  value)
+                    if (allInExtRange) then
+                        if (err .ne. 0)
+     +                      call error(nf_strerror(err))
+                    else
+                        if (err .ne. NF_ERANGE)
+     +                      call errore('range error: ', err)
+                    end if
+                end if
+2           continue
+1       continue
+
+        call check_atts_int2(ncid)
+        err = nf_close(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_close: ', err)
+
+        err = nf_delete(scratch)
+        if (err .ne. 0)
+     +      call errorc('delete of scratch file failed:', 
+     +          scratch)
+        end
+
+#endif
+        subroutine test_nf_put_att_int()
+        implicit        none
+#include "tests.inc"
+        integer ncid
+        integer i
+        integer j
+        integer k
+        integer ndx(1)
+        integer err
+        integer value(MAX_NELS)
+        logical allInExtRange  !/* all values within external range? */
+        doubleprecision val
+
+        err = nf_create(scratch, NF_NOCLOBBER, ncid)
+        if (err .ne. 0) then
+            call errore('nf_create: ', err)
+            return
+        end if
+        call def_dims(ncid)
+        call def_vars(ncid)
+
+        do 1, i = 0, NVARS
+            do 2, j = 1, NATTS(i)
+                if (.not.(ATT_TYPE(j,i) .eq. NF_CHAR)) then
+                    if (.not.((ATT_LEN(j,i) .le. MAX_NELS)))
+     +                  stop 2
+                    err = nf_put_att_int(BAD_ID, i,
+     +                                  ATT_NAME(j,i), 
+     +                                  ATT_TYPE(j,i), 
+     +                                  ATT_LEN(j,i), value)
+                    if (err .ne. NF_EBADID)
+     +                  call errore('bad ncid: ', err)
+                    err = nf_put_att_int(ncid, BAD_VARID,
+     +                  ATT_NAME(j,i), 
+     +                  ATT_TYPE(j,i), ATT_LEN(j,i), value)
+                    if (err .ne. NF_ENOTVAR)
+     +                  call errore('bad var id: ', err)
+                    err = nf_put_att_int(ncid, i,
+     +                  ATT_NAME(j,i), BAD_TYPE, 
+     +                  ATT_LEN(j,i), value)
+                    if (err .ne. NF_EBADTYPE)
+     +                  call errore('bad type: ', err)
+                    allInExtRange = .true.
+                    do 3, k = 1, ATT_LEN(j,i)
+                        ndx(1) = k
+                        value(k) = hash_int(ATT_TYPE(j,i), -1, ndx, 
+     +                                     NFT_INT)
+                        val = value(k)
+                        allInExtRange = allInExtRange .and.
+     +                      inRange3(val, ATT_TYPE(j,i), 
+     +                               NFT_INT)
+3                   continue
+                    err = nf_put_att_int(ncid, i, ATT_NAME(j,i), 
+     +                                  ATT_TYPE(j,i), ATT_LEN(j,i), 
+     +                                  value)
+                    if (allInExtRange) then
+                        if (err .ne. 0)
+     +                      call error(nf_strerror(err))
+                    else
+                        if (err .ne. NF_ERANGE)
+     +                      call errore('range error: ', err)
+                    end if
+                end if
+2           continue
+1       continue
+
+        call check_atts_int(ncid)
+        err = nf_close(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_close: ', err)
+
+        err = nf_delete(scratch)
+        if (err .ne. 0)
+     +      call errorc('delete of scratch file failed:', 
+     +          scratch)
+        end
+
+        subroutine test_nf_put_att_real()
+        implicit        none
+#include "tests.inc"
+        integer ncid
+        integer i
+        integer j
+        integer k
+        integer ndx(1)
+        integer err
+        real value(MAX_NELS)
+        logical allInExtRange  !/* all values within external range? */
+        doubleprecision val
+
+        err = nf_create(scratch, NF_NOCLOBBER, ncid)
+        if (err .ne. 0) then
+            call errore('nf_create: ', err)
+            return
+        end if
+        call def_dims(ncid)
+        call def_vars(ncid)
+
+        do 1, i = 0, NVARS
+            do 2, j = 1, NATTS(i)
+                if (.not.(ATT_TYPE(j,i) .eq. NF_CHAR)) then
+                    if (.not.((ATT_LEN(j,i) .le. MAX_NELS)))
+     +                  stop 2
+                    err = nf_put_att_real(BAD_ID, i,
+     +                                  ATT_NAME(j,i), 
+     +                                  ATT_TYPE(j,i), 
+     +                                  ATT_LEN(j,i), value)
+                    if (err .ne. NF_EBADID)
+     +                  call errore('bad ncid: ', err)
+                    err = nf_put_att_real(ncid, BAD_VARID,
+     +                  ATT_NAME(j,i), 
+     +                  ATT_TYPE(j,i), ATT_LEN(j,i), value)
+                    if (err .ne. NF_ENOTVAR)
+     +                  call errore('bad var id: ', err)
+                    err = nf_put_att_real(ncid, i,
+     +                  ATT_NAME(j,i), BAD_TYPE, 
+     +                  ATT_LEN(j,i), value)
+                    if (err .ne. NF_EBADTYPE)
+     +                  call errore('bad type: ', err)
+                    allInExtRange = .true.
+                    do 3, k = 1, ATT_LEN(j,i)
+                        ndx(1) = k
+                        value(k) = hash_real(ATT_TYPE(j,i), -1, ndx, 
+     +                                     NFT_REAL)
+                        val = value(k)
+                        allInExtRange = allInExtRange .and.
+     +                      inRange3(val, ATT_TYPE(j,i), 
+     +                               NFT_REAL)
+3                   continue
+                    err = nf_put_att_real(ncid, i, ATT_NAME(j,i), 
+     +                                  ATT_TYPE(j,i), ATT_LEN(j,i), 
+     +                                  value)
+                    if (allInExtRange) then
+                        if (err .ne. 0)
+     +                      call error(nf_strerror(err))
+                    else
+                        if (err .ne. NF_ERANGE)
+     +                      call errore('range error: ', err)
+                    end if
+                end if
+2           continue
+1       continue
+
+        call check_atts_real(ncid)
+        err = nf_close(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_close: ', err)
+
+        err = nf_delete(scratch)
+        if (err .ne. 0)
+     +      call errorc('delete of scratch file failed:', 
+     +          scratch)
+        end
+
+        subroutine test_nf_put_att_double()
+        implicit        none
+#include "tests.inc"
+        integer ncid
+        integer i
+        integer j
+        integer k
+        integer ndx(1)
+        integer err
+        doubleprecision value(MAX_NELS)
+        logical allInExtRange  !/* all values within external range? */
+        doubleprecision val
+
+        err = nf_create(scratch, NF_NOCLOBBER, ncid)
+        if (err .ne. 0) then
+            call errore('nf_create: ', err)
+            return
+        end if
+        call def_dims(ncid)
+        call def_vars(ncid)
+
+        do 1, i = 0, NVARS
+            do 2, j = 1, NATTS(i)
+                if (.not.(ATT_TYPE(j,i) .eq. NF_CHAR)) then
+                    if (.not.((ATT_LEN(j,i) .le. MAX_NELS)))
+     +                  stop 2
+                    err = nf_put_att_double(BAD_ID, i,
+     +                                  ATT_NAME(j,i), 
+     +                                  ATT_TYPE(j,i), 
+     +                                  ATT_LEN(j,i), value)
+                    if (err .ne. NF_EBADID)
+     +                  call errore('bad ncid: ', err)
+                    err = nf_put_att_double(ncid, BAD_VARID,
+     +                  ATT_NAME(j,i), 
+     +                  ATT_TYPE(j,i), ATT_LEN(j,i), value)
+                    if (err .ne. NF_ENOTVAR)
+     +                  call errore('bad var id: ', err)
+                    err = nf_put_att_double(ncid, i,
+     +                  ATT_NAME(j,i), BAD_TYPE, 
+     +                  ATT_LEN(j,i), value)
+                    if (err .ne. NF_EBADTYPE)
+     +                  call errore('bad type: ', err)
+                    allInExtRange = .true.
+                    do 3, k = 1, ATT_LEN(j,i)
+                        ndx(1) = k
+                        value(k) = hash_double(ATT_TYPE(j,i), -1, ndx, 
+     +                                     NFT_DOUBLE)
+                        val = value(k)
+                        allInExtRange = allInExtRange .and.
+     +                      inRange3(val, ATT_TYPE(j,i), 
+     +                               NFT_DOUBLE)
+3                   continue
+                    err = nf_put_att_double(ncid, i, ATT_NAME(j,i), 
+     +                                  ATT_TYPE(j,i), ATT_LEN(j,i), 
+     +                                  value)
+                    if (allInExtRange) then
+                        if (err .ne. 0)
+     +                      call error(nf_strerror(err))
+                    else
+                        if (err .ne. NF_ERANGE)
+     +                      call errore('range error: ', err)
+                    end if
+                end if
+2           continue
+1       continue
+
+        call check_atts_double(ncid)
+        err = nf_close(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_close: ', err)
+
+        err = nf_delete(scratch)
+        if (err .ne. 0)
+     +      call errorc('delete of scratch file failed:', 
+     +          scratch)
+        end
+
diff --git a/nf_test/test_put.m4 b/nf_test/test_put.m4
new file mode 100644
index 0000000..f79b88c
--- /dev/null
+++ b/nf_test/test_put.m4
@@ -0,0 +1,1374 @@
+divert(-1)
+
+dnl This is m4 source.
+dnl Process using m4 to produce FORTRAN language file.
+
+changequote([,]) dnl
+
+undefine([index])dnl
+
+dnl Macros
+
+dnl Upcase(str)
+dnl
+define([Upcase],[dnl
+translit($1, abcdefghijklmnopqrstuvwxyz, ABCDEFGHIJKLMNOPQRSTUVWXYZ)])
+
+dnl NFT_ITYPE(type)
+dnl
+define([NFT_ITYPE], [NFT_[]Upcase($1)])
+
+dnl ARITH(itype, value)
+dnl
+define([ARITH], [ifelse($1, text, ichar($2), $2)])
+
+dnl  DATATYPE(funf_suffix)
+dnl
+define([DATATYPE], [dnl
+ifelse($1, text, character,
+ifelse($1, int1, NF_INT1_T,
+ifelse($1, int2, NF_INT2_T,
+ifelse($1, int, integer,
+ifelse($1, real, real,
+ifelse($1, double, doubleprecision)[]dnl
+)[]dnl
+)[]dnl
+)[]dnl
+)[]dnl
+)[]dnl
+])
+
+dnl  MAKE_ARITH(funf_suffix, var)
+dnl
+define([MAKE_ARITH], [dnl
+ifelse($1, text, ichar($2), $2)[]dnl
+])
+
+dnl  MAKE_DOUBLE(funf_suffix, var)
+dnl
+define([MAKE_DOUBLE], [dnl
+ifelse($1, text, dble(ichar($2)), dble($2))[]dnl
+])
+
+dnl  MAKE_TYPE(funf_suffix, var)
+dnl
+define([MAKE_TYPE], [dnl
+ifelse($1, text, char(int($2)), $2)[]dnl
+])
+
+dnl HASH(TYPE)
+dnl
+define([HASH],
+[dnl
+C
+C ensure hash value within range for internal TYPE
+C
+        function hash_$1(type, rank, index, itype)
+        implicit        none
+#include "tests.inc"
+        integer type
+        integer rank
+        integer index(1)
+        integer itype
+        doubleprecision minimum
+        doubleprecision maximum
+
+        minimum = internal_min(itype)
+        maximum = internal_max(itype)
+
+        hash_$1 = max(minimum, min(maximum, hash4( type, rank,
+     +      index, itype)))
+        end
+])dnl
+
+
+dnl CHECK_VARS(TYPE)
+dnl
+define([CHECK_VARS],dnl
+[dnl
+C
+C check all vars in file which are (text/numeric) compatible with TYPE
+C
+        subroutine check_vars_$1(filename)
+        implicit        none
+#include "tests.inc"
+        character*(*)   filename
+        integer  ncid          !/* netCDF id */
+        integer index(MAX_RANK)
+        integer  err           !/* status */
+        integer  d
+        integer  i
+        integer  j
+        DATATYPE($1)    value
+        integer datatype
+        integer ndims
+        integer dimids(MAX_RANK)
+        integer ngatts
+        doubleprecision expect
+        character*(NF_MAX_NAME) name
+        integer length
+        logical canConvert      !/* Both text or both numeric */
+        integer nok             !/* count of valid comparisons */
+        doubleprecision val
+
+        nok = 0
+
+        err = nf_open(filename, NF_NOWRITE, ncid)
+        if (err .ne. 0)
+     +      call errore('nf_open: ', err)
+
+        do 1, i = 1, NVARS
+            canConvert = (var_type(i) .eq. NF_CHAR) .eqv.
+     +                   (NFT_ITYPE($1) .eq. NFT_TEXT)
+            if (canConvert)  then
+                err = nf_inq_var(ncid, i, name, datatype, ndims, dimids,
+     +                           ngatts)
+                if (err .ne. 0)
+     +              call errore('nf_inq_var: ', err)
+                if (name .ne. var_name(i))
+     +              call error('Unexpected var_name')
+                if (datatype .ne. var_type(i))
+     +              call error('Unexpected type')
+                if (ndims .ne. var_rank(i))
+     +              call error('Unexpected rank')
+                do 2, j = 1, ndims
+                    err = nf_inq_dim(ncid, dimids(j), name, length)
+                    if (err .ne. 0)
+     +                  call errore('nf_inq_dim: ', err)
+                    if (length .ne. var_shape(j,i))
+     +                  call error('Unexpected shape')
+2               continue
+                do 3, j = 1, var_nels(i)
+                    err = index2indexes(j, var_rank(i), var_shape(1,i), 
+     +                                  index)
+                    if (err .ne. 0)
+     +                  call error('error in index2indexes()')
+                    expect = hash4( var_type(i), var_rank(i), index, 
+     +                             NFT_ITYPE($1))
+                    err = nf_get_var1_$1(ncid, i, index, value)
+                    if (inRange3(expect,datatype,NFT_ITYPE($1)))  then
+                        if (in_internal_range(NFT_ITYPE($1), 
+     +                                        expect)) then
+                            if (err .ne. 0)  then
+                                call errore('nf_get_var1_$1: ', err)
+                            else
+                                val = MAKE_ARITH($1,value)
+                                if (.not.equal(
+     +                              val,
+     +                              expect,var_type(i),
+     +                              NFT_ITYPE($1)))  then
+                                    call error(
+     +                          'Var value read not that expected')
+                                    if (verbose)  then
+                                        call error(' ')
+                                        call errori('varid: %d', i)
+                                        call errorc('var_name: ', 
+     +                                          var_name(i))
+                                        call error('index:')
+                                        do 4, d = 1, var_rank(i)
+                                            call errori(' ', index(d))
+4                                       continue
+                                        call errord('expect: ', expect)
+                                        call errord('got: ',  val)
+                                    end if
+                                else
+                                    nok = nok + 1
+                                end if
+                            end if
+                        end if
+                    end if
+3               continue
+            end if
+1       continue
+        err = nf_close (ncid)
+        if (err .ne. 0)
+     +      call errore('nf_close: ', err)
+        call print_nok(nok)
+        end
+])dnl
+
+
+dnl CHECK_ATTS(TYPE)         numeric only
+dnl
+define([CHECK_ATTS],dnl
+[dnl
+C/* 
+C *  check all attributes in file which are (text/numeric) compatible with TYPE
+C *  ignore any attributes containing values outside range of TYPE
+C */
+        subroutine check_atts_$1(ncid)
+        implicit        none
+#include "tests.inc"
+        integer ncid
+        integer  err           !/* status */
+        integer  i
+        integer  j
+        integer  k
+        integer ndx(1)
+        DATATYPE($1)    value(MAX_NELS)
+        integer datatype
+        doubleprecision expect(MAX_NELS)
+        integer length
+        integer nInExtRange     !/* number values within external range */
+        integer nInIntRange     !/* number values within internal range */
+        logical canConvert      !/* Both text or both numeric */
+        integer nok             !/* count of valid comparisons */
+        doubleprecision val
+
+        nok = 0
+
+        do 1, i = 0, NVARS
+            do 2, j = 1, NATTS(i)
+                canConvert = (ATT_TYPE(j,i) .eq. NF_CHAR) .eqv.
+     +                       (NFT_ITYPE($1) .eq. NFT_TEXT)
+                if (canConvert) then
+                    err = nf_inq_att(ncid, i, ATT_NAME(j,i), datatype, 
+     +                               length)
+                    if (err .ne. 0)
+     +                  call errore('nf_inq_att: ', err)
+                    if (datatype .ne. ATT_TYPE(j,i))
+     +                  call error('nf_inq_att: unexpected type')
+                    if (length .ne. ATT_LEN(j,i))
+     +                  call error('nf_inq_att: unexpected length')
+                    if (.not.(length .le. MAX_NELS))
+     +                  stop 2
+                    nInIntRange = 0
+                    nInExtRange = 0
+                    do 4, k = 1, length
+                        ndx(1) = k
+                        expect(k) = hash4( datatype, -1, ndx, 
+     +                                    NFT_ITYPE($1))
+                        if (inRange3(expect(k), datatype, 
+     +                               NFT_ITYPE($1))) then
+                            nInExtRange = nInExtRange + 1
+                            if (in_internal_range(NFT_ITYPE($1),
+     +                                            expect(k)))
+     +                          nInIntRange = nInIntRange + 1
+                        end if
+4                   continue
+                    err = nf_get_att_$1(ncid, i, 
+     +                                  ATT_NAME(j,i), value)
+                    if (nInExtRange .eq. length .and. 
+     +                  nInIntRange .eq. length) then
+                        if (err .ne. 0)
+     +                      call error(nf_strerror(err))
+                    else
+                        if (err .ne. 0 .and. err .ne. NF_ERANGE)
+     +                      call errore('OK or Range error: ', err)
+                    end if
+                    do 3, k = 1, length
+                        if (inRange3(expect(k),datatype,NFT_ITYPE($1))
+     +                          .and. 
+     +                          in_internal_range(NFT_ITYPE($1), 
+     +                                            expect(k))) then
+                            val = MAKE_ARITH($1,value(k))
+                            if (.not.equal(
+     +                          val,
+     +                          expect(k),datatype,
+     +                          NFT_ITYPE($1))) then
+                                call error(
+     +                              'att. value read not that expected')
+                                if (verbose) then
+                                    call error(' ')
+                                    call errori('varid: ', i)
+                                    call errorc('att_name: ', 
+     +                                  ATT_NAME(j,i))
+                                    call errori('element number: ', k)
+                                    call errord('expect: ', expect(k))
+                                    call errord('got: ',  val)
+                                end if
+                            else
+                                nok = nok + 1
+                            end if
+                        end if
+3                   continue
+                end if                                               
+2           continue
+1       continue
+
+        call print_nok(nok)
+        end
+])dnl
+
+
+dnl TEST_NF_PUT_VAR1(TYPE)
+dnl
+define([TEST_NF_PUT_VAR1],dnl
+[dnl
+        subroutine test_nf_put_var1_$1()
+        implicit        none
+#include "tests.inc"
+        integer ncid
+        integer i
+        integer j
+        integer err
+        integer index(MAX_RANK)
+        logical canConvert      !/* Both text or both numeric */
+        DATATYPE($1)    value
+        doubleprecision val
+
+        value = MAKE_TYPE($1, 5)!/* any value would do - only for error cases */
+
+        err = nf_create(scratch, NF_CLOBBER, ncid)
+        if (err .ne. 0) then
+            call errore('nf_create: ', err)
+            return
+        end if
+        call def_dims(ncid)
+        call def_vars(ncid)
+        err = nf_enddef(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_enddef: ', err)
+
+        do 1, i = 1, NVARS
+            canConvert = (var_type(i) .eq. NF_CHAR) .eqv.
+     +                   (NFT_ITYPE($1) .eq. NFT_TEXT)
+            do 2, j = 1, var_rank(i)
+                index(j) = 1
+2           continue
+            err = nf_put_var1_$1(BAD_ID, i, index, value)
+            if (err .ne. NF_EBADID) 
+     +          call errore('bad ncid: ', err)
+            err = nf_put_var1_$1(ncid, BAD_VARID,
+     +                           index, value)
+            if (err .ne. NF_ENOTVAR) 
+     +          call errore('bad var id: ', err)
+            do 3, j = 1, var_rank(i)
+                if (var_dimid(j,i) .gt. 1) then         !/* skip record dim */
+                    index(j) = var_shape(j,i) + 1
+                    err = nf_put_var1_$1(ncid, i,
+     +                                   index, value)
+                    if (.not. canConvert) then
+                        if (err .ne. NF_ECHAR)
+     +                      call errore('conversion: ', err)
+                        else
+                            if (err .ne. NF_EINVALCOORDS)
+     +                          call errore('bad index: ', err)
+                        endif
+                    index(j) = 0
+                end if
+3           continue
+            do 4, j = 1, var_nels(i)
+                err = index2indexes(j, var_rank(i), var_shape(1,i), 
+     +                              index)
+                if (err .ne. 0) 
+     +              call error('error in index2indexes 1')
+                value = MAKE_TYPE($1, hash_$1(var_type(i),var_rank(i),
+     +                            index, NFT_ITYPE($1)))
+                err = nf_put_var1_$1(ncid, i, index, value)
+                if (canConvert) then
+                    val = ARITH($1, value)
+                    if (inRange3(val, var_type(i), NFT_ITYPE($1))) then
+                        if (err .ne. 0)
+     +                      call error(nf_strerror(err))
+                    else
+                        if (err .ne. NF_ERANGE)
+     +                      call errore('Range error: ', err)
+                    end if
+                else
+                    if (err .ne. NF_ECHAR)
+     +                  call errore('wrong type: ', err)
+                end if
+4           continue
+1       continue
+
+        err = nf_close(ncid)
+        if (err .ne. 0) 
+     +      call errore('nf_close: ', err)
+
+        call check_vars_$1(scratch)
+
+        err = nf_delete(scratch)
+        if (err .ne. 0)
+     +      call errorc('delete of scratch file failed: ', 
+     +                  scratch)
+        end
+])dnl
+
+
+dnl TEST_NF_PUT_VAR(TYPE)
+dnl
+define([TEST_NF_PUT_VAR],dnl
+[dnl
+        subroutine test_nf_put_var_$1()
+        implicit        none
+#include "tests.inc"
+        integer ncid
+        integer vid
+        integer i
+        integer j
+        integer err
+        integer nels
+        integer index(MAX_RANK)
+        logical canConvert      !/* Both text or both numeric */
+        logical allInExtRange   !/* All values within external range?*/
+        DATATYPE($1)    value(MAX_NELS)
+        doubleprecision val
+
+        err = nf_create(scratch, NF_CLOBBER, ncid)
+        if (err .ne. 0) then
+            call errore('nf_create: ', err)
+            return
+        end if
+        call def_dims(ncid)
+        call def_vars(ncid)
+        err = nf_enddef(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_enddef: ', err)
+
+        do 1, i = 1, NVARS
+            canConvert = (var_type(i) .eq. NF_CHAR) .eqv.
+     +                   (NFT_ITYPE($1) .eq. NFT_TEXT)
+            err = nf_put_var_$1(BAD_ID, i, value)
+            if (err .ne. NF_EBADID) 
+     +          call errore('bad ncid: ', err)
+            err = nf_put_var_$1(ncid, BAD_VARID, value)
+            if (err .ne. NF_ENOTVAR) 
+     +          call errore('bad var id: ', err)
+            nels = 1
+            do 3, j = 1, var_rank(i)
+                nels = nels * var_shape(j,i)
+3           continue
+            allInExtRange = .true.
+            do 4, j = 1, var_nels(i)
+                err = index2indexes(j, var_rank(i), var_shape(1,i), 
+     +                              index)
+                if (err .ne. 0) 
+     +              call error('error in index2indexes 1')
+                value(j) = MAKE_TYPE($1, hash_$1(var_type(i), 
+     +              var_rank(i),
+     +              index, NFT_ITYPE($1)))
+                val = ARITH($1, value(j))
+                allInExtRange = allInExtRange .and.
+     +              inRange3(val, var_type(i), NFT_ITYPE($1))
+4           continue
+            err = nf_put_var_$1(ncid, i, value)
+            if (canConvert) then
+                if (allInExtRange) then
+                    if (err .ne. 0)
+     +                  call error(nf_strerror(err))
+                else
+                    if (err .ne. NF_ERANGE .and.
+     +                      var_dimid(var_rank(i),i) .ne. RECDIM)
+     +                  call errore('Range error: ', err)
+                endif
+            else
+                if (err .ne. NF_ECHAR)
+     +              call errore('wrong type: ', err)
+            endif
+1       continue
+
+C       The preceeding has written nothing for record variables, now try
+C       again with more than 0 records.
+
+C       Write record number NRECS to force writing of preceding records.
+C       Assumes variable cr is char vector with UNLIMITED dimension.
+
+        err = nf_inq_varid(ncid, "cr", vid)
+        if (err .ne. 0)
+     +      call errore('nf_inq_varid: ', err)
+        index(1) = NRECS
+        err = nf_put_var1_text(ncid, vid, index, 'x')
+        if (err .ne. 0)
+     +      call errore('nf_put_var1_text: ', err)
+
+        do 5 i = 1, NVARS
+C           Only test record variables here
+            if (var_rank(i) .ge. 1 .and.
+     +          var_dimid(var_rank(i),i) .eq. RECDIM) then
+                canConvert = (var_type(i) .eq. NF_CHAR) .eqv.
+     +                   (NFT_ITYPE($1) .eq. NFT_TEXT)
+                if (var_rank(i) .gt. MAX_RANK)
+     +              stop 2
+                if (var_nels(i) .gt. MAX_NELS)
+     +              stop 2
+                err = nf_put_var_$1(BAD_ID, i, value)
+
+                nels = 1
+                do 6 j = 1, var_rank(i)
+                    nels = nels * var_shape(j,i)
+6               continue
+                allInExtRange = .true.
+                do 7, j = 1, nels
+                    err = index2indexes(j, var_rank(i), var_shape(1,i), 
+     +                              index)
+                    if (err .ne. 0) 
+     +                  call error('error in index2indexes()')
+                    value(j) = MAKE_TYPE($1, hash_$1(var_type(i), 
+     +                  var_rank(i),
+     +                  index, NFT_ITYPE($1)))
+                    val = ARITH($1, value(j))
+                    allInExtRange = allInExtRange .and.
+     +                  inRange3(val, var_type(i), NFT_ITYPE($1))
+7               continue
+                err = nf_put_var_$1(ncid, i, value)
+                if (canConvert) then
+                    if (allInExtRange) then
+                        if (err .ne. 0)
+     +                      call error(nf_strerror(err))
+                    else
+                        if (err .ne. NF_ERANGE)
+     +                      call errore('range error: ', err)
+                    endif
+                else
+                    if (nels .gt. 0 .and. err .ne. NF_ECHAR)
+     +                  call errore('wrong type: ', err)
+                endif
+            endif
+5       continue
+
+        err = nf_close(ncid)
+        if (err .ne. 0) 
+     +      call errore('nf_close: ', err)
+
+        call check_vars_$1(scratch)
+
+        err = nf_delete(scratch)
+        if (err .ne. 0)
+     +      call errorc('delete of scratch file failed: ', 
+     +                  scratch)
+        end
+])dnl
+
+
+dnl TEST_NF_PUT_VARA(TYPE)
+dnl
+define([TEST_NF_PUT_VARA],dnl
+[dnl
+        subroutine test_nf_put_vara_$1()
+        implicit        none
+#include "tests.inc"
+        integer ncid
+        integer i
+        integer j
+        integer k
+        integer d
+        integer err
+        integer nslabs
+        integer nels
+        integer start(MAX_RANK)
+        integer edge(MAX_RANK)
+        integer mid(MAX_RANK)
+        integer index(MAX_RANK)
+        logical canConvert      !/* Both text or both numeric */
+        logical allInExtRange   !/* all values within external range? */
+        DATATYPE($1)    value(MAX_NELS)
+        doubleprecision val
+        integer udshift
+
+        err = nf_create(scratch, NF_CLOBBER, ncid)
+        if (err .ne. 0) then
+            call errore('nf_create: ', err)
+            return
+        end if
+        call def_dims(ncid)
+        call def_vars(ncid)
+        err = nf_enddef(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_enddef: ', err)
+
+        do 1, i = 1, NVARS
+            canConvert = (var_type(i) .eq. NF_CHAR) .eqv.
+     +                   (NFT_ITYPE($1) .eq. NFT_TEXT)
+            if (.not.(var_rank(i) .le. MAX_RANK))
+     +          stop 2
+            if (.not.(var_nels(i) .le. MAX_NELS))
+     +          stop 2
+            do 2, j = 1, var_rank(i)
+                start(j) = 1
+                edge(j) = 1
+2           continue
+            err = nf_put_vara_$1(BAD_ID, i, start,
+     +                  edge, value)
+            if (err .ne. NF_EBADID) 
+     +          call errore('bad ncid: ', err)
+            err = nf_put_vara_$1(ncid, BAD_VARID,
+     +                  start, edge, value)
+            if (err .ne. NF_ENOTVAR) 
+     +          call errore('bad var id: ', err)
+            do 3, j = 1, var_rank(i)
+                if (var_dimid(j,i) .ne. RECDIM) then    !/* skip record dim */
+                    start(j) = var_shape(j,i) + 1
+                    err = nf_put_vara_$1(ncid, i, start, 
+     +                                   edge, value)
+                    if (.not. canConvert) then
+                        if (err .ne. NF_ECHAR)
+     +                      call errore('conversion: ', err)
+                    else
+                        if (err .ne. NF_EINVALCOORDS)
+     +                      call errore('bad start: ', err)
+                    endif
+                    start(j) = 1
+                    edge(j) = var_shape(j,i) + 1
+                    err = nf_put_vara_$1(ncid, i, start, 
+     +                                   edge, value)
+                    if (.not. canConvert) then
+                        if (err .ne. NF_ECHAR)
+     +                      call errore('conversion: ', err)
+                    else
+                        if (err .ne. NF_EEDGE)
+     +                      call errore('bad edge: ', err)
+                    endif
+                    edge(j) = 1
+                end if
+3           continue
+
+C       /* Check correct error returned even when nothing to put */
+        do 20, j = 1, var_rank(i)
+              edge(j) = 0
+20      continue
+        err = nf_put_vara_$1(BAD_ID, i, start,
+     +          edge, value)
+        if (err .ne. NF_EBADID) 
+     +      call errore('bad ncid: ', err)
+        err = nf_put_vara_$1(ncid, BAD_VARID,
+     +          start, edge, value)
+        if (err .ne. NF_ENOTVAR) 
+     +      call errore('bad var id: ', err)
+        do 21, j = 1, var_rank(i)
+            if (var_dimid(j,i) .gt. 1) then     ! skip record dim
+                start(j) = var_shape(j,i) + 2
+                err = nf_put_vara_$1(ncid, i, start,
+     +                  edge, value)
+                if (.not. canConvert) then
+                    if (err .ne. NF_ECHAR)
+     +                  call errore('conversion: ', err)
+                else
+                    if (err .ne. NF_EINVALCOORDS)
+     +                  call errore('bad start: ', err)
+                endif
+                start(j) = 1
+            endif
+21      continue
+        err = nf_put_vara_$1(ncid, i, start, edge, value)
+        if (canConvert) then
+            if (err .ne. 0) 
+     +          call error(nf_strerror(err))
+        else
+            if (err .ne. NF_ECHAR)
+     +          call errore('wrong type: ', err)
+        endif
+        do 22, j = 1, var_rank(i)
+              edge(j) = 1
+22      continue
+
+
+                !/* Choose a random point dividing each dim into 2 parts */
+                !/* Put 2^rank (nslabs) slabs so defined */
+            nslabs = 1
+            do 4, j = 1, var_rank(i)
+                mid(j) = roll( var_shape(j,i) )
+                nslabs = nslabs * 2
+4           continue
+                !/* bits of k determine whether to put lower or upper part of dim */
+            do 5, k = 1, nslabs
+                nels = 1
+                do 6, j = 1, var_rank(i)
+                    if (mod(udshift(k-1, -(j-1)), 2) .eq. 1) then
+                        start(j) = 1
+                        edge(j) = mid(j)
+                    else
+                        start(j) = 1 + mid(j)
+                        edge(j) = var_shape(j,i) - mid(j)
+                    end if
+                    nels = nels * edge(j)
+6               continue
+                allInExtRange = .true.
+                do 7, j = 1, nels
+                    err = index2indexes(j, var_rank(i), edge, index)
+                    if (err .ne. 0) 
+     +                  call error('error in index2indexes 1')
+                    do 8, d = 1, var_rank(i)
+                        index(d) = index(d) + start(d) - 1
+8                   continue
+                    value(j)= MAKE_TYPE($1, hash_$1(var_type(i), 
+     +                                  var_rank(i), index, 
+     +                                  NFT_ITYPE($1)))
+                    val = ARITH($1, value(j))
+                    allInExtRange = allInExtRange .and.
+     +                  inRange3(val, var_type(i), NFT_ITYPE($1))
+7               continue
+                err = nf_put_vara_$1(ncid, i, start,
+     +                  edge, value)
+                if (canConvert) then
+                    if (allInExtRange) then
+                        if (err .ne. 0) 
+     +                      call error(nf_strerror(err))
+                    else
+                        if (err .ne. NF_ERANGE)
+     +                      call errore('range error: ', err)
+                    end if
+                else
+                    if (nels .gt. 0 .and. err .ne. NF_ECHAR)
+     +                  call errore('wrong type: ', err)
+                end if
+5           continue
+1       continue
+
+        err = nf_close(ncid)
+        if (err .ne. 0) 
+     +      call errore('nf_close: ', err)
+
+        call check_vars_$1(scratch)
+
+        err = nf_delete(scratch)
+        if (err .ne. 0)
+     +      call errorc('delete of scratch file failed: ', 
+     +          scratch)
+        end
+])dnl
+
+
+dnl TEST_NF_PUT_VARS(TYPE)
+dnl
+define([TEST_NF_PUT_VARS],dnl
+[dnl
+        subroutine test_nf_put_vars_$1()
+        implicit        none
+#include "tests.inc"
+        integer ncid
+        integer d
+        integer i
+        integer j
+        integer k
+        integer m
+        integer err
+        integer nels
+        integer nslabs
+        integer nstarts        !/* number of different starts */
+        integer start(MAX_RANK)
+        integer edge(MAX_RANK)
+        integer index(MAX_RANK)
+        integer index2(MAX_RANK)
+        integer mid(MAX_RANK)
+        integer count(MAX_RANK)
+        integer sstride(MAX_RANK)
+        integer stride(MAX_RANK)
+        logical canConvert      !/* Both text or both numeric */
+        logical allInExtRange   !/* all values within external range? */
+        DATATYPE($1)    value(MAX_NELS)
+        doubleprecision val
+        integer udshift
+
+        err = nf_create(scratch, NF_CLOBBER, ncid)
+        if (err .ne. 0) then
+            call errore('nf_create: ', err)
+            return
+        end if
+        call def_dims(ncid)
+        call def_vars(ncid)
+        err = nf_enddef(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_enddef: ', err)
+
+        do 1, i = 1, NVARS
+            canConvert = (var_type(i) .eq. NF_CHAR) .eqv.
+     +                   (NFT_ITYPE($1) .eq. NFT_TEXT)
+            if (.not.(var_rank(i) .le. MAX_RANK))
+     +          stop 2
+            if (.not.(var_nels(i) .le. MAX_NELS))
+     +          stop 2
+            do 2, j = 1, var_rank(i)
+                start(j) = 1
+                edge(j) = 1
+                stride(j) = 1
+2           continue
+            err = nf_put_vars_$1(BAD_ID, i, start,
+     +                  edge, stride, value)
+            if (err .ne. NF_EBADID) 
+     +          call errore('bad ncid: ', err)
+            err = nf_put_vars_$1(ncid, BAD_VARID, start,
+     +                           edge, stride, 
+     +                           value)
+            if (err .ne. NF_ENOTVAR) 
+     +          call errore('bad var id: ', err)
+            do 3, j = 1, var_rank(i)
+                if (var_dimid(j,i) .ne. RECDIM) then    ! skip record dim
+                    start(j) = var_shape(j,i) + 2
+                    err = nf_put_vars_$1(ncid, i, start,
+     +                                   edge, stride, 
+     +                                   value)
+                    if (.not. canConvert) then
+                        if (err .ne. NF_ECHAR)
+     +                      call errore('conversion: ', err)
+                    else
+                        if (err .ne. NF_EINVALCOORDS)
+     +                          call errore('bad start: ', err)
+                    endif
+                    start(j) = 1
+                    edge(j) = var_shape(j,i) + 1
+                    err = nf_put_vars_$1(ncid, i, start,
+     +                                   edge, stride, 
+     +                                   value)
+                    if (.not. canConvert) then
+                        if (err .ne. NF_ECHAR)
+     +                      call errore('conversion: ', err)
+                    else
+                        if (err .ne. NF_EEDGE)
+     +                      call errore('bad edge: ', err)
+                    endif
+                    edge(j) = 1
+                    stride(j) = 0
+                    err = nf_put_vars_$1(ncid, i, start,
+     +                                   edge, stride, 
+     +                                   value)
+                    if (.not. canConvert) then
+                        if (err .ne. NF_ECHAR)
+     +                      call errore('conversion: ', err)
+                    else
+                        if (err .ne. NF_ESTRIDE)
+     +                      call errore('bad stride: ', err)
+                    endif
+                    stride(j) = 1
+                end if
+3           continue
+                !/* Choose a random point dividing each dim into 2 parts */
+                !/* Put 2^rank (nslabs) slabs so defined */
+            nslabs = 1
+            do 4, j = 1, var_rank(i)
+                mid(j) = roll( var_shape(j,i) )
+                nslabs = nslabs * 2
+4           continue
+                !/* bits of k determine whether to put lower or upper part of dim */
+                !/* choose random stride from 1 to edge */
+            do 5, k = 1, nslabs
+                nstarts = 1
+                do 6, j = 1, var_rank(i)
+                    if (mod(udshift(k-1, -(j-1)), 2) .eq. 1) then
+                        start(j) = 1
+                        edge(j) = mid(j)
+                    else
+                        start(j) = 1 + mid(j)
+                        edge(j) = var_shape(j,i) - mid(j)
+                    end if
+                    if (edge(j) .gt. 0) then
+                        stride(j) = 1+roll(edge(j))
+                    else
+                        stride(j) = 1
+                    end if
+                    sstride(j) = stride(j)
+                    nstarts = nstarts * stride(j)
+6               continue
+                do 7, m = 1, nstarts
+                    err = index2indexes(m, var_rank(i), sstride, index)
+                    if (err .ne. 0)
+     +                  call error('error in index2indexes')
+                    nels = 1
+                    do 8, j = 1, var_rank(i)
+                        count(j) = 1 + (edge(j) - index(j)) / stride(j)
+                        nels = nels * count(j)
+                        index(j) = index(j) + start(j) - 1
+8                   continue
+                        !/* Random choice of forward or backward */
+C/* TODO
+C                   if ( roll(2) ) {
+C                       for (j = 1 j .lt. var_rank(i) j++) {
+C                           index(j) += (count(j) - 1) * stride(j)
+C                           stride(j) = -stride(j)
+C                       }
+C                   }
+C*/
+                    allInExtRange = .true.
+                    do 9, j = 1, nels
+                        err = index2indexes(j, var_rank(i), count, 
+     +                                      index2)
+                        if (err .ne. 0)
+     +                      call error('error in index2indexes')
+                        do 10, d = 1, var_rank(i)
+                            index2(d) = index(d) + 
+     +                                  (index2(d)-1) * stride(d)
+10                      continue
+                        value(j) = MAKE_TYPE($1, hash_$1(var_type(i), 
+     +                     var_rank(i), 
+     +                     index2, NFT_ITYPE($1)))
+                        val = ARITH($1, value(j))
+                        allInExtRange = allInExtRange .and.
+     +                      inRange3(val, var_type(i), 
+     +                               NFT_ITYPE($1))
+9                   continue
+                    err = nf_put_vars_$1(ncid, i, index,
+     +                                   count, stride,
+     +                                   value)
+                    if (canConvert) then
+                        if (allInExtRange) then
+                            if (err .ne. 0) 
+     +                          call error(nf_strerror(err))
+                        else
+                            if (err .ne. NF_ERANGE)
+     +                          call errore('range error: ', err)
+                        end if
+                    else
+                        if (nels .gt. 0 .and. err .ne. NF_ECHAR)
+     +                      call errore('wrong type: ', err)
+                    end if
+7               continue
+5           continue
+1       continue
+
+        err = nf_close(ncid)
+        if (err .ne. 0) 
+     +      call errore('nf_close: ', err)
+
+        call check_vars_$1(scratch)
+
+        err = nf_delete(scratch)
+        if (err .ne. 0)
+     +      call errorc('delete of scratch file failed:', 
+     +          scratch)
+        end
+])dnl
+
+
+dnl TEST_NF_PUT_VARM(TYPE)
+dnl
+define([TEST_NF_PUT_VARM],dnl
+[dnl
+        subroutine test_nf_put_varm_$1()
+        implicit        none
+#include "tests.inc"
+        integer ncid
+        integer d
+        integer i
+        integer j
+        integer k
+        integer m
+        integer err
+        integer nels
+        integer nslabs
+        integer nstarts        !/* number of different starts */
+        integer start(MAX_RANK)
+        integer edge(MAX_RANK)
+        integer index(MAX_RANK)
+        integer index2(MAX_RANK)
+        integer mid(MAX_RANK)
+        integer count(MAX_RANK)
+        integer sstride(MAX_RANK)
+        integer stride(MAX_RANK)
+        integer imap(MAX_RANK)
+        logical canConvert      !/* Both text or both numeric */
+        logical allInExtRange   !/* all values within external range? */
+        DATATYPE($1) value(MAX_NELS)
+        doubleprecision val
+        integer udshift
+
+        err = nf_create(scratch, NF_CLOBBER, ncid)
+        if (err .ne. 0) then
+            call errore('nf_create: ', err)
+            return
+        end if
+        call def_dims(ncid)
+        call def_vars(ncid)
+        err = nf_enddef(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_enddef: ', err)
+
+        do 1, i = 1, NVARS
+            canConvert = (var_type(i) .eq. NF_CHAR) .eqv.
+     +                   (NFT_ITYPE($1) .eq. NFT_TEXT)
+            if (.not.(var_rank(i) .le. MAX_RANK))
+     +          stop 2
+            if (.not.(var_nels(i) .le. MAX_NELS))
+     +          stop 2
+            do 2, j = 1, var_rank(i)
+                start(j) = 1
+                edge(j) = 1
+                stride(j) = 1
+                imap(j) = 1
+2           continue
+            err = nf_put_varm_$1(BAD_ID, i, start,
+     +                           edge, stride, imap, 
+     +                           value)
+            if (err .ne. NF_EBADID) 
+     +          call errore('bad ncid: ', err)
+            err = nf_put_varm_$1(ncid, BAD_VARID, start,
+     +                           edge, stride, 
+     +                           imap, value)
+            if (err .ne. NF_ENOTVAR) 
+     +          call errore('bad var id: ', err)
+            do 3, j = 1, var_rank(i)
+                if (var_dimid(j,i) .ne. RECDIM) then    !/* skip record dim */
+                    start(j) = var_shape(j,i) + 2
+                    err = nf_put_varm_$1(ncid, i, start,
+     +                                   edge, stride, 
+     +                                   imap, value)
+                    if (.not. canConvert) then
+                        if (err .ne. NF_ECHAR)
+     +                      call errore('conversion: ', err)
+                    else
+                        if (err .ne. NF_EINVALCOORDS)
+     +                      call errore('bad start: ', err)
+                    endif
+                    start(j) = 1
+                    edge(j) = var_shape(j,i) + 1
+                    err = nf_put_varm_$1(ncid, i, start,
+     +                                   edge, stride, 
+     +                                   imap, value)
+                    if (.not. canConvert) then
+                        if (err .ne. NF_ECHAR)
+     +                      call errore('conversion: ', err)
+                    else
+                        if (err .ne. NF_EEDGE)
+     +                      call errore('bad edge: ', err)
+                    endif
+                    edge(j) = 1
+                    stride(j) = 0
+                    err = nf_put_varm_$1(ncid, i, start,
+     +                                   edge, stride, 
+     +                                   imap, value)
+                    if (.not. canConvert) then
+                        if (err .ne. NF_ECHAR)
+     +                      call errore('conversion: ', err)
+                    else
+                        if (err .ne. NF_ESTRIDE)
+     +                      call errore('bad stride: ', err)
+                    endif
+                    stride(j) = 1
+                end if
+3           continue
+                !/* Choose a random point dividing each dim into 2 parts */
+                !/* Put 2^rank (nslabs) slabs so defined */
+            nslabs = 1
+            do 4, j = 1, var_rank(i)
+                mid(j) = roll( var_shape(j,i) )
+                nslabs = nslabs * 2
+4           continue
+                !/* bits of k determine whether to put lower or upper part of dim */
+                !/* choose random stride from 1 to edge */
+            do 5, k = 1, nslabs
+                nstarts = 1
+                do 6, j = 1, var_rank(i)
+                    if (mod(udshift(k-1, -(j-1)), 2) .eq. 1) then
+                        start(j) = 1
+                        edge(j) = mid(j)
+                    else
+                        start(j) = 1 + mid(j)
+                        edge(j) = var_shape(j,i) - mid(j)
+                    end if
+                    if (edge(j) .gt. 0) then
+                        stride(j) = 1+roll(edge(j))
+                    else
+                        stride(j) = 1
+                    end if
+                    sstride(j) = stride(j)
+                    nstarts = nstarts * stride(j)
+6               continue
+                do 7, m = 1, nstarts
+                    err = index2indexes(m, var_rank(i), sstride, index)
+                    if (err .ne. 0)
+     +                  call error('error in index2indexes')
+                    nels = 1
+                    do 8, j = 1, var_rank(i)
+                        count(j) = 1 + (edge(j) - index(j)) / stride(j)
+                        nels = nels * count(j)
+                        index(j) = index(j) + start(j) - 1
+8                   continue
+                        !/* Random choice of forward or backward */
+C/* TODO
+C                   if ( roll(2) ) then
+C                       do 9, j = 1, var_rank(i)
+C                           index(j) = index(j) + 
+C     +                         (count(j) - 1) * stride(j)
+C                           stride(j) = -stride(j)
+C9                      continue
+C                   end if
+C*/
+                    if (var_rank(i) .gt. 0) then
+                        imap(1) = 1
+                        do 10, j = 2, var_rank(i)
+                            imap(j) = imap(j-1) * count(j-1)
+10                      continue
+                    end if
+                    allInExtRange = .true.
+                    do 11 j = 1, nels
+                        err = index2indexes(j, var_rank(i), count, 
+     +                                      index2)
+                        if (err .ne. 0)
+     +                      call error('error in index2indexes')
+                        do 12, d = 1, var_rank(i)
+                            index2(d) = index(d) + 
+     +                          (index2(d)-1) * stride(d)
+12                      continue
+                        value(j) = MAKE_TYPE($1, hash_$1(var_type(i),
+     +                                       var_rank(i), 
+     +                                       index2, NFT_ITYPE($1)))
+                        val = ARITH($1, value(j))
+                        allInExtRange = allInExtRange .and.
+     +                      inRange3(val, var_type(i), 
+     +                               NFT_ITYPE($1))
+11                  continue
+                    err = nf_put_varm_$1(ncid,i,index,count,
+     +                                   stride,imap,
+     +                                   value)
+                    if (canConvert) then
+                        if (allInExtRange) then
+                            if (err .ne. 0)
+     +                          call error(nf_strerror(err))
+                        else
+                            if (err .ne. NF_ERANGE)
+     +                          call errore('range error: ', err)
+                        end if
+                    else
+                        if (nels .gt. 0 .and. err .ne. NF_ECHAR)
+     +                      call errore('wrong type: ', err)
+                    end if
+7               continue
+5           continue
+1       continue
+
+        err = nf_close(ncid)
+        if (err .ne. 0) 
+     +      call errore('nf_close: ', err)
+
+        call check_vars_$1(scratch)
+
+        err = nf_delete(scratch)
+        if (err .ne. 0)
+     +      call errorc('delete of scratch file failed:', 
+     +          scratch)
+        end
+])dnl
+
+
+dnl TEST_NF_PUT_ATT(TYPE)         numeric only
+dnl
+define([TEST_NF_PUT_ATT],dnl
+[dnl
+        subroutine test_nf_put_att_$1()
+        implicit        none
+#include "tests.inc"
+        integer ncid
+        integer i
+        integer j
+        integer k
+        integer ndx(1)
+        integer err
+        DATATYPE($1) value(MAX_NELS)
+        logical allInExtRange  !/* all values within external range? */
+        doubleprecision val
+
+        err = nf_create(scratch, NF_NOCLOBBER, ncid)
+        if (err .ne. 0) then
+            call errore('nf_create: ', err)
+            return
+        end if
+        call def_dims(ncid)
+        call def_vars(ncid)
+
+        do 1, i = 0, NVARS
+            do 2, j = 1, NATTS(i)
+                if (.not.(ATT_TYPE(j,i) .eq. NF_CHAR)) then
+                    if (.not.((ATT_LEN(j,i) .le. MAX_NELS)))
+     +                  stop 2
+                    err = nf_put_att_$1(BAD_ID, i,
+     +                                  ATT_NAME(j,i), 
+     +                                  ATT_TYPE(j,i), 
+     +                                  ATT_LEN(j,i), value)
+                    if (err .ne. NF_EBADID)
+     +                  call errore('bad ncid: ', err)
+                    err = nf_put_att_$1(ncid, BAD_VARID,
+     +                  ATT_NAME(j,i), 
+     +                  ATT_TYPE(j,i), ATT_LEN(j,i), value)
+                    if (err .ne. NF_ENOTVAR)
+     +                  call errore('bad var id: ', err)
+                    err = nf_put_att_$1(ncid, i,
+     +                  ATT_NAME(j,i), BAD_TYPE, 
+     +                  ATT_LEN(j,i), value)
+                    if (err .ne. NF_EBADTYPE)
+     +                  call errore('bad type: ', err)
+                    allInExtRange = .true.
+                    do 3, k = 1, ATT_LEN(j,i)
+                        ndx(1) = k
+                        value(k) = hash_$1(ATT_TYPE(j,i), -1, ndx, 
+     +                                     NFT_ITYPE($1))
+                        val = ARITH($1, value(k))
+                        allInExtRange = allInExtRange .and.
+     +                      inRange3(val, ATT_TYPE(j,i), 
+     +                               NFT_ITYPE($1))
+3                   continue
+                    err = nf_put_att_$1(ncid, i, ATT_NAME(j,i), 
+     +                                  ATT_TYPE(j,i), ATT_LEN(j,i), 
+     +                                  value)
+                    if (allInExtRange) then
+                        if (err .ne. 0)
+     +                      call error(nf_strerror(err))
+                    else
+                        if (err .ne. NF_ERANGE)
+     +                      call errore('range error: ', err)
+                    end if
+                end if
+2           continue
+1       continue
+
+        call check_atts_$1(ncid)
+        err = nf_close(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_close: ', err)
+
+        err = nf_delete(scratch)
+        if (err .ne. 0)
+     +      call errorc('delete of scratch file failed:', 
+     +          scratch)
+        end
+])dnl
+
+divert(0)dnl
+dnl If you see this line, you can ignore the next one.
+C Do not edit this file. It is produced from the corresponding .m4 source */
+
+C********************************************************************
+C   Copyright 1996, UCAR/Unidata
+C   See netcdf/COPYRIGHT file for copying and redistribution conditions.
+C   $Id: test_put.m4,v 1.16 2008/04/30 16:50:45 ed Exp $
+C********************************************************************
+
+HASH(text)
+#ifdef NF_INT1_T
+HASH(int1)
+#endif
+#ifdef NF_INT2_T
+HASH(int2)
+#endif
+HASH(int)
+HASH(real)
+HASH(double)
+
+CHECK_VARS(text)
+#ifdef NF_INT1_T
+CHECK_VARS(int1)
+#endif
+#ifdef NF_INT2_T
+CHECK_VARS(int2)
+#endif
+CHECK_VARS(int)
+CHECK_VARS(real)
+CHECK_VARS(double)
+
+CHECK_ATTS(text)
+#ifdef NF_INT1_T
+CHECK_ATTS(int1)
+#endif
+#ifdef NF_INT2_T
+CHECK_ATTS(int2)
+#endif
+CHECK_ATTS(int)
+CHECK_ATTS(real)
+CHECK_ATTS(double)
+
+TEST_NF_PUT_VAR1(text)
+#ifdef NF_INT1_T
+TEST_NF_PUT_VAR1(int1)
+#endif
+#ifdef NF_INT2_T
+TEST_NF_PUT_VAR1(int2)
+#endif
+TEST_NF_PUT_VAR1(int)
+TEST_NF_PUT_VAR1(real)
+TEST_NF_PUT_VAR1(double)
+
+TEST_NF_PUT_VAR(text)
+#ifdef NF_INT1_T
+TEST_NF_PUT_VAR(int1)
+#endif
+#ifdef NF_INT2_T
+TEST_NF_PUT_VAR(int2)
+#endif
+TEST_NF_PUT_VAR(int)
+TEST_NF_PUT_VAR(real)
+TEST_NF_PUT_VAR(double)
+
+TEST_NF_PUT_VARA(text)
+#ifdef NF_INT1_T
+TEST_NF_PUT_VARA(int1)
+#endif
+#ifdef NF_INT2_T
+TEST_NF_PUT_VARA(int2)
+#endif
+TEST_NF_PUT_VARA(int)
+TEST_NF_PUT_VARA(real)
+TEST_NF_PUT_VARA(double)
+
+TEST_NF_PUT_VARS(text)
+#ifdef NF_INT1_T
+TEST_NF_PUT_VARS(int1)
+#endif
+#ifdef NF_INT2_T
+TEST_NF_PUT_VARS(int2)
+#endif
+TEST_NF_PUT_VARS(int)
+TEST_NF_PUT_VARS(real)
+TEST_NF_PUT_VARS(double)
+
+TEST_NF_PUT_VARM(text)
+#ifdef NF_INT1_T
+TEST_NF_PUT_VARM(int1)
+#endif
+#ifdef NF_INT2_T
+TEST_NF_PUT_VARM(int2)
+#endif
+TEST_NF_PUT_VARM(int)
+TEST_NF_PUT_VARM(real)
+TEST_NF_PUT_VARM(double)
+
+        subroutine test_nf_put_att_text()
+        implicit        none
+#include "tests.inc"
+        integer ncid
+        integer i
+        integer j
+        integer k
+        integer err
+        character       value(MAX_NELS)
+
+        err = nf_create(scratch, NF_NOCLOBBER, ncid)
+        if (err .ne. 0) then
+            call errore('NF_create: ', err)
+            return
+        end if
+        call def_dims(ncid)
+        call def_vars(ncid)
+
+        do 1, i = 0, NVARS
+            do 2, j = 1, NATTS(i)
+                if (ATT_TYPE(j,i) .eq. NF_CHAR) then
+                    if (.not.(ATT_LEN(j,i) .le. MAX_NELS))
+     +                  stop 2
+                    err = nf_put_att_text(BAD_ID, i,
+     +                  ATT_NAME(j,i), ATT_LEN(j,i), value)
+                    if (err .ne. NF_EBADID)
+     +                  call errore('bad ncid: ', err)
+                    err = nf_put_att_text(ncid, BAD_VARID, 
+     +                                    ATT_NAME(j,i), 
+     +                                    ATT_LEN(j,i), value)
+                    if (err .ne. NF_ENOTVAR)
+     +                  call errore('bad var id: ', err)
+                    do 3, k = 1, ATT_LEN(j,i)
+                        value(k) = char(int(hash(ATT_TYPE(j,i), -1, k)))
+3                   continue
+                    err = nf_put_att_text(ncid, i, ATT_NAME(j,i), 
+     +                  ATT_LEN(j,i), value)
+                    if (err .ne. 0)
+     +                  call error(NF_strerror(err))
+                end if
+2           continue
+1       continue
+
+        call check_atts_text(ncid)
+        err = NF_close(ncid)
+        if (err .ne. 0)
+     +      call errore('NF_close: ', err)
+
+        err = nf_delete(scratch)
+        if (err .ne. 0)
+     +      call errorc('delete of scratch file failed:', 
+     +          scratch)
+        end
+
+#ifdef NF_INT1_T
+TEST_NF_PUT_ATT(int1)
+#endif
+#ifdef NF_INT2_T
+TEST_NF_PUT_ATT(int2)
+#endif
+TEST_NF_PUT_ATT(int)
+TEST_NF_PUT_ATT(real)
+TEST_NF_PUT_ATT(double)
diff --git a/nf_test/test_read.F b/nf_test/test_read.F
new file mode 100644
index 0000000..b1de8c3
--- /dev/null
+++ b/nf_test/test_read.F
@@ -0,0 +1,1068 @@
+C*********************************************************************
+C   Copyright 1996, UCAR/Unidata
+C   See netcdf/COPYRIGHT file for copying and redistribution conditions.
+C   $Id: test_read.F,v 1.13 2006/09/25 20:09:26 ed Exp $
+C*********************************************************************
+
+C Test nf_strerror.
+C    Try on a bad error status.
+C    Test for each defined error status.
+C
+        subroutine test_nf_strerror()
+        implicit        none
+#include "tests.inc"
+        integer         number_of_messages
+        parameter       (number_of_messages = 27)
+
+        integer         i
+        integer         status(number_of_messages)
+        character*80    message
+        character*80    msg(number_of_messages)
+
+        data    status(1)  / NF_NOERR/
+        data    status(2)  / NF_EBADID /
+        data    status(3)  / NF_EEXIST /
+        data    status(4)  / NF_EINVAL /
+        data    status(5)  / NF_EPERM /
+        data    status(6)  / NF_ENOTINDEFINE /
+        data    status(7)  / NF_EINDEFINE /
+        data    status(8)  / NF_EINVALCOORDS /
+        data    status(9)  / NF_EMAXDIMS /
+        data    status(10) / NF_ENAMEINUSE /
+        data    status(11) / NF_ENOTATT /
+        data    status(12) / NF_EMAXATTS /
+        data    status(13) / NF_EBADTYPE /
+        data    status(14) / NF_EBADDIM /
+        data    status(15) / NF_EUNLIMPOS /
+        data    status(16) / NF_EMAXVARS /
+        data    status(17) / NF_ENOTVAR /
+        data    status(18) / NF_EGLOBAL /
+        data    status(19) / NF_ENOTNC /
+        data    status(20) / NF_ESTS /
+        data    status(21) / NF_EMAXNAME /
+        data    status(22) / NF_EUNLIMIT /
+        data    status(23) / NF_ENORECVARS /
+        data    status(24) / NF_ECHAR /
+        data    status(25) / NF_EEDGE /
+        data    status(26) / NF_ESTRIDE /
+        data    status(27) / NF_EBADNAME /
+
+        data msg(1)  / 'No error' /
+        data msg(2)  / 'NetCDF: Not a valid ID' /
+        data msg(3)  / 'NetCDF: File exists && NC_NOCLOBBER' /
+        data msg(4)  / 'NetCDF: Invalid argument' /
+        data msg(5)  / 'NetCDF: Write to read only' /
+        data msg(6)  / 'NetCDF: Operation not allowed in data mode' /
+        data msg(7)  / 'NetCDF: Operation not allowed in define mode' /
+        data msg(8)  / 'NetCDF: Index exceeds dimension bound' /
+        data msg(9)  / 'NetCDF: NC_MAX_DIMS exceeded' /
+        data msg(10) / 'NetCDF: String match to name in use' /
+        data msg(11) / 'NetCDF: Attribute not found' /
+        data msg(12) / 'NetCDF: NC_MAX_ATTRS exceeded' /
+        data msg(13)
+     +  / 'NetCDF: Not a valid data type or _FillValue type mismatch' /
+        data msg(14) / 'NetCDF: Invalid dimension ID or name' /
+        data msg(15) / 'NetCDF: NC_UNLIMITED in the wrong index' /
+        data msg(16) / 'NetCDF: NC_MAX_VARS exceeded' /
+        data msg(17) / 'NetCDF: Variable not found' /
+        data msg(18) / 'NetCDF: Action prohibited on NC_GLOBAL varid' /
+        data msg(19) / 'NetCDF: Unknown file format' /
+        data msg(20) / 'NetCDF: In Fortran, string too short' /
+        data msg(21) / 'NetCDF: NC_MAX_NAME exceeded' /
+        data msg(22) / 'NetCDF: NC_UNLIMITED size already in use' /
+        data msg(23) 
+     +  / 'NetCDF: nc_rec op when there are no record vars' /
+        data msg(24) 
+     +  /'NetCDF: Attempt to convert between text & numbers'/
+        data msg(25) / 'NetCDF: Start+count exceeds dimension bound' /
+        data msg(26) / 'NetCDF: Illegal stride' /
+        data msg(27) / 'NetCDF: Name contains illegal characters' /
+
+C       /* Try on a bad error status */
+        message = nf_strerror(-666)!/* should fail */
+        if (message .ne. 'Unknown Error')
+     +      call errorc('nf_strerror on bad error status returned: ',
+     +          message)
+
+C       /* Try on each legitimate error status */
+        do 1, i=1, number_of_messages
+            message = nf_strerror(status(i))
+            if (message .ne. msg(i))
+     +          call error('nf_strerror() should return "' // msg(i) //
+     +                     '"')
+1       continue
+        end
+
+
+C Test nf_open.
+C If in read-only section of tests,
+C    Try to open a non-existent netCDF file, check error return.
+C    Open a file that is not a netCDF file, check error return.
+C    Open a netCDF file with a bad mode argument, check error return.
+C    Open a netCDF file with NF_NOWRITE mode, try to write, check error.
+C    Try to open a netcdf twice, check whether returned netcdf ids different.
+C If in writable section of tests,
+C    Open a netCDF file with NF_WRITE mode, write something, close it.
+C On exit, any open netCDF files are closed.
+        subroutine test_nf_open()
+        implicit        none
+#include "tests.inc"
+        integer err
+        integer ncid
+        integer ncid2
+        character TEMPFILE*8
+        integer unit51
+C       /* Create a non-netCDF file named 'temp.tmp' */
+        unit51 = 51
+        TEMPFILE = 'temp.tmp'
+        OPEN(unit51, FILE=TEMPFILE)
+        WRITE(51,*) 'text'
+        CLOSE(51)
+        
+C       /* Try to open a nonexistent file */
+        err = nf_open('tooth-fairy.nc', NF_NOWRITE, ncid)!/* should fail */
+        if (err .eq. NF_NOERR)
+     +      call error('nf_open of nonexistent file should have failed')
+        if (.not. NF_ISSYSERR(err))
+     +      call error(
+     +  'nf_open of nonexistent file should have returned system error')
+
+C       /* Open a file that is not a netCDF file. */
+        err = nf_open(TEMPFILE, NF_NOWRITE, ncid)!/* should fail */
+        if (err .ne. NF_ENOTNC)
+     +      call errore('nf_open of non-netCDF file: ', err)
+
+C       /* Open a netCDF file in read-only mode, check that write fails */
+        err = nf_open(testfile, NF_NOWRITE, ncid)
+        if (err .ne. 0)
+     +      call errore('nf_open: ', err)
+        err = nf_redef(ncid)    !/* should fail */
+        if (err .ne. NF_EPERM)
+     +      call error('nf_redef of read-only file should fail')
+C       /* Opened OK, see if can open again and get a different netCDF ID */
+        err = nf_open(testfile, NF_NOWRITE, ncid2)
+        if (err .ne. 0) then
+            call errore('nf_open: ', err)
+        else
+            err = nf_close(ncid2)
+        end if
+        if (ncid2 .eq. ncid)
+     +      call error(
+     +  'netCDF IDs for first and second nf_open calls should differ')
+
+        if (.not. readonly) then        !/* tests using netCDF scratch file */
+            err = nf_create(scratch, NF_NOCLOBBER, ncid2)
+            if (err .ne. 0) then
+                call errore('nf_create: ', err)
+            else 
+                err = nf_close(ncid2)
+            end if
+            err = nf_open(scratch, NF_WRITE, ncid2)
+            if (err .ne. 0) then
+                call errore('nf_open: ', err)
+            else 
+                err = nf_close(ncid2)
+            end if
+            err = nf_delete(scratch)
+            if (err .ne. 0) 
+     +          call errorc('delete of scratch file failed', scratch)
+        end if
+
+        err = nf_close(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_close: ', err)
+        end
+
+
+C 
+C Test nf_close.
+C    Try to close a netCDF file twice, check whether second close fails.
+C    Try on bad handle, check error return.
+C    Try in define mode and data mode.
+C/
+        subroutine test_nf_close()
+        implicit        none
+#include "tests.inc"
+        integer ncid
+        integer err
+
+        err = nf_open(testfile, NF_NOWRITE, ncid)
+        if (err .ne. 0)
+     +      call errore('nf_open: ', err)
+
+C       /* Close a netCDF file twice, second time should fail */
+        err = nf_close(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_close failed: ', err)
+        err = nf_close(ncid)
+        if (err .ne. NF_EBADID)
+     +      call error('nf_close of closed file should have failed')
+        
+C       /* Try with a bad netCDF ID */
+        err = nf_close(BAD_ID)!/* should fail */
+        if (err .ne. NF_EBADID)
+     +      call errore(
+     +          'nf_close with bad netCDF ID returned wrong error: ', 
+     +          err)
+
+C       /* Close in data mode */
+        err = nf_open(testfile, NF_NOWRITE, ncid)
+        if (err .ne. 0)
+     +      call errore('nf_open: ', err)
+        err = nf_close(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_close in data mode failed: ', err)
+
+        if (.not. readonly) then        !/* tests using netCDF scratch file */
+            err = nf_create(scratch, NF_NOCLOBBER, ncid)
+            if (err .ne. 0) 
+     +          call errore('nf_create: ', err)
+            err = nf_close(ncid)
+            if (err .ne. 0)
+     +          call errore('nf_close in define mode: ', err)
+            err = nf_delete(scratch)
+            if (err .ne. 0)
+     +          call errorc('delete of scratch file failed: ', 
+     +              scratch)
+        end if
+        end
+
+
+C Test nf_inq.
+C    Try on bad handle, check error return.
+C    Try in data mode, check returned values.
+C    Try asking for subsets of info.
+C If in writable section of tests,
+C    Try in define mode, after adding an unlimited dimension, variable.
+C On exit, any open netCDF files are closed.
+        subroutine test_nf_inq()
+        implicit        none
+#include "tests.inc"
+        integer ncid
+        integer ncid2                   !/* for scratch netCDF dataset */
+        integer ndims                   !/* number of dimensions */
+        integer nvars                   !/* number of variables */
+        integer ngatts                  !/* number of global attributes */
+        integer recdim                  !/* id of unlimited dimension */
+        integer err
+        integer ndims0
+        integer nvars0
+        integer ngatts0
+        integer recdim0
+        integer did
+        integer vid
+
+        err = nf_open(testfile, NF_NOWRITE, ncid)
+        if (err .ne. 0)
+     +      call errore('nf_open: ', err)
+        
+C       /* Try on bad handle */
+        err = nf_inq(BAD_ID, ndims, nvars, ngatts, recdim)
+        if (err .ne. NF_EBADID)
+     +      call errore('bad ncid: ', err)
+        
+        err = nf_inq(ncid, ndims, nvars, ngatts, recdim)
+        if (err .ne. 0) then
+            call errore('nf_inq: ', err)
+        else if (ndims .ne. NDIMS) then
+            call errori('nf_inq: wrong number of dimensions returned: ',
+     +                  ndims)
+        else if (nvars .ne. NVARS) then
+            call errori('nf_inq: wrong number of variables returned: ',
+     +                  nvars)
+        else if (ngatts .ne. NGATTS) then
+            call errori(
+     +          'nf_inq: wrong number of global atts returned: ',
+     +          ngatts)
+        else if (recdim .ne. RECDIM) then
+            call errori('nf_inq: wrong record dimension ID returned: ',
+     +                  recdim)
+        end if
+
+        if (.not. readonly) then        !/* tests using netCDF scratch file */
+            err = nf_create(scratch, NF_NOCLOBBER, ncid2)
+            if (err .ne. 0) then
+                call errore('nf_create: ', err)
+            else                !/* add dim, var, gatt, check inq */
+                err = nf_enddef(ncid2) !/* enter data mode */
+                err = nf_inq(ncid2, ndims0, nvars0, ngatts0, recdim0)
+                if (err .ne. 0)
+     +              call errore('nf_inq: ', err)
+                err = nf_redef(ncid2) !/* enter define mode */
+C               /* Check that inquire still works in define mode */
+                err = nf_inq(ncid2, ndims, nvars, ngatts, recdim)
+                if (err .ne. 0) then
+                    call errore('nf_inq in define mode: ', err)
+                else if (ndims .ne. ndims0) then
+                    call errori('nf_inq in define mode: ndims wrong, ',
+     +                          ndims)
+                else if (nvars .ne. nvars0) then
+                    call errori('nf_inq in define mode: nvars wrong, ',
+     +                          nvars)
+                else if (ngatts .ne. ngatts0) then
+                    call errori(
+     +                  'nf_inq in define mode: ngatts wrong, ', ngatts)
+                else if (recdim .ne. recdim0) then
+                    call errori('nf_inq in define mode: recdim wrong, ',
+     +                          recdim)
+                end if
+
+C               /* Add dim, var, global att */
+                err = nf_def_dim(ncid2, 'inqd', 1, did)
+                if (err .ne. 0)
+     +              call errore('nf_def_dim: ', err)
+                err = nf_def_var(ncid2, 'inqv', NF_FLOAT, 0, 0, vid)
+                if (err .ne. 0)
+     +              call errore('nf_def_var: ', err)
+
+                err = nf_put_att_text(ncid2, NF_GLOBAL, 'inqa', 
+     +                                len('stuff'), 'stuff')
+                if (err .ne. 0)
+     +              call errore('nf_put_att_text: ', err)
+
+C               /* Make sure nf_inq sees the additions while in define mode */
+                err = nf_inq(ncid2, ndims, nvars, ngatts, recdim)
+                if (err .ne. 0) then
+                    call errore('nf_inq in define mode: ', err)
+                else if (ndims .ne. ndims0 + 1) then
+                    call errori('nf_inq in define mode: ndims wrong, ',
+     +                          ndims)
+                else if (nvars .ne. nvars0 + 1) then
+                    call errori('nf_inq in define mode: nvars wrong, ',
+     +                          nvars)
+                else if (ngatts .ne. ngatts0 + 1) then
+                    call errori('nf_inq in define mode: ngatts wrong, ',
+     +                          ngatts)
+                end if
+                err = nf_enddef(ncid2)
+                if (err .ne. 0)
+     +              call errore('nf_enddef: ', err)
+
+C               /* Make sure nf_inq stills sees additions in data mode */
+                err = nf_inq(ncid2, ndims, nvars, ngatts, recdim)
+                if (err .ne. 0) then
+                    call errore('nf_inq failed in data mode: ',err)
+                else if (ndims .ne. ndims0 + 1) then
+                    call errori('nf_inq in define mode: ndims wrong, ',
+     +                          ndims)
+                else if (nvars .ne. nvars0 + 1) then
+                    call errori('nf_inq in define mode: nvars wrong, ',
+     +                          nvars)
+                else if (ngatts .ne. ngatts0 + 1) then
+                    call errori('nf_inq in define mode: ngatts wrong, ',
+     +                          ngatts)
+                end if
+                err = nf_close(ncid2)
+                err = nf_delete(scratch)
+                if (err .ne. 0)
+     +              call errorc('delete of scratch file failed:', 
+     +                  scratch)
+            end if
+        end if
+
+        err = nf_close(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_close: ', err)
+        end
+
+
+        subroutine test_nf_inq_natts()
+        implicit        none
+#include "tests.inc"
+        integer ncid
+        integer ngatts                  !/* number of global attributes */
+        integer err
+
+        err = nf_inq_natts(BAD_ID, ngatts)
+        if (err .ne. NF_EBADID)
+     +      call errore('bad ncid: ', err)
+        err = nf_open(testfile, NF_NOWRITE, ncid)
+        if (err .ne. 0)
+     +      call errore('nf_open: ', err)
+        err = nf_inq_natts(ncid, ngatts)
+        if (err .ne. 0) then
+            call errore('nf_inq_natts: ', err)
+        else if (ngatts .ne. NGATTS) then
+            call errori(
+     +          'nf_inq_natts: wrong number of global atts returned, ',
+     +          ngatts)
+        end if
+        err = nf_close(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_close: ', err)
+        end
+
+
+        subroutine test_nf_inq_ndims()
+        implicit        none
+#include "tests.inc"
+        integer ncid
+        integer ndims
+        integer err
+
+        err = nf_inq_ndims(BAD_ID, ndims)
+        if (err .ne. NF_EBADID)
+     +      call errore('bad ncid: ', err)
+        err = nf_open(testfile, NF_NOWRITE, ncid)
+        if (err .ne. 0)
+     +      call errore('nf_open: ', err)
+        err = nf_inq_ndims(ncid, ndims)
+        if (err .ne. 0) then
+            call errore('nf_inq_ndims: ', err)
+        else if (ndims .ne. NDIMS) then
+            call errori('nf_inq_ndims: wrong number returned, ', ndims)
+        end if
+        err = nf_close(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_close: ', err)
+        end
+
+
+        subroutine test_nf_inq_nvars()
+        implicit        none
+#include "tests.inc"
+        integer ncid
+        integer nvars
+        integer err
+
+        err = nf_inq_nvars(BAD_ID, nvars)
+        if (err .ne. NF_EBADID)
+     +      call errore('bad ncid: ', err)
+        err = nf_open(testfile, NF_NOWRITE, ncid)
+        if (err .ne. 0)
+     +      call errore('nf_open: ', err)
+        err = nf_inq_nvars(ncid, nvars)
+        if (err .ne. 0) then
+            call errore('nf_inq_nvars: ', err)
+        else if (nvars .ne. NVARS) then
+            call errori('nf_inq_nvars: wrong number returned, ', nvars)
+        end if
+        err = nf_close(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_close: ', err)
+        end
+
+
+        subroutine test_nf_inq_unlimdim()
+        implicit        none
+#include "tests.inc"
+        integer ncid
+        integer unlimdim
+        integer err
+
+        err = nf_inq_unlimdim(BAD_ID, unlimdim)
+        if (err .ne. NF_EBADID)
+     +      call errore('bad ncid: ', err)
+        err = nf_open(testfile, NF_NOWRITE, ncid)
+        if (err .ne. 0)
+     +      call errore('nf_open: ', err)
+        err = nf_inq_unlimdim(ncid, unlimdim)
+        if (err .ne. 0) then
+            call errore('nf_inq_unlimdim: ', err)
+        else if (unlimdim .ne. RECDIM) then
+            call errori('nf_inq_unlimdim: wrong number returned, ', 
+     +                  unlimdim)
+        end if
+        err = nf_close(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_close: ', err)
+        end
+
+
+        subroutine test_nf_inq_format()
+        implicit        none
+#include "tests.inc"
+        integer ncid
+        integer nformat
+        integer err
+
+        err = nf_inq_format(BAD_ID, nformat)
+        if (err .ne. NF_EBADID)
+     +      call errore('bad ncid: ', err)
+        err = nf_open(testfile, NF_NOWRITE, ncid)
+        if (err .ne. 0)
+     +      call errore('nf_open: ', err)
+        err = nf_inq_format(ncid, nformat)
+        if (err .ne. 0) then
+            call errore('nf_inq_format: ', err)
+        else if (nformat .ne. nf_format_classic .and.
+     +           nformat .ne. nf_format_64bit) then
+            call errori('nf_inq_format: wrong format number returned, ', 
+     +                  nformat)
+        end if
+        err = nf_close(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_close: ', err)
+        end
+
+
+        subroutine test_nf_inq_dimid()
+        implicit        none
+#include "tests.inc"
+        integer ncid
+        integer dimid
+        integer i
+        integer err
+
+        err = nf_open(testfile, NF_NOWRITE, ncid)
+        if (err .ne. 0)
+     +      call errore('nf_open: ', err)
+        err = nf_inq_dimid(ncid, 'noSuch', dimid)
+        if (err .ne. NF_EBADDIM)
+     +      call errore('bad dim name: ', err)
+        do 1, i = 1, NDIMS
+            err = nf_inq_dimid(BAD_ID, dim_name(i), dimid)
+            if (err .ne. NF_EBADID)
+     +          call errore('bad ncid: ', err)
+            err = nf_inq_dimid(ncid, dim_name(i), dimid)
+            if (err .ne. 0) then
+                call errore('nf_inq_dimid: ', err)
+            else if (dimid .ne. i) then
+                call errori('expected ', i)
+                call errori('got ', dimid)
+            end if
+1       continue
+        err = nf_close(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_close: ', err)
+        end
+
+
+        subroutine test_nf_inq_dim()
+        implicit        none
+#include "tests.inc"
+        integer ncid
+        integer i
+        integer err
+        character*(NF_MAX_NAME) name
+        integer length
+
+        err = nf_open(testfile, NF_NOWRITE, ncid)
+        if (err .ne. 0)
+     +      call errore('nf_open: ', err)
+        do 1, i = 1, NDIMS
+            err = nf_inq_dim(BAD_ID, i, name, length)
+            if (err .ne. NF_EBADID)
+     +          call errore('bad ncid: ', err)
+            err = nf_inq_dim(ncid, BAD_DIMID, name, length)
+            if (err .ne. NF_EBADDIM)
+     +          call errore('bad dimid: ', err)
+            err = nf_inq_dim(ncid, i, name, length)
+            if (err .ne. 0) then
+                call errore('nf_inq_dim: ', err)
+            else if (dim_name(i) .ne. name)  then
+                call errorc('name unexpected: ', name)
+            else if (dim_len(i) .ne. length) then
+                call errori('size unexpected: ', length)
+            end if
+1       continue
+        err = nf_close(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_close: ', err)
+        end
+
+
+        subroutine test_nf_inq_dimlen()
+        implicit        none
+#include "tests.inc"
+        integer ncid
+        integer i
+        integer err
+        integer length
+
+        err = nf_open(testfile, NF_NOWRITE, ncid)
+        if (err .ne. 0)
+     +      call errore('nf_open: ', err)
+        do 1, i = 1, NDIMS
+            err = nf_inq_dimlen(BAD_ID, i, length)
+            if (err .ne. NF_EBADID)
+     +          call errore('bad ncid: ', err)
+            err = nf_inq_dimlen(ncid, BAD_DIMID, length)
+            if (err .ne. NF_EBADDIM)
+     +          call errore('bad dimid: ', err)
+            err = nf_inq_dimlen(ncid, i, length)
+            if (err .ne. 0) then
+                call errore('nf_inq_dimlen: ', err)
+            else if (dim_len(i) .ne. length) then
+                call errori('size unexpected: ', length)
+            end if
+1       continue
+        err = nf_close(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_close: ', err)
+        end
+
+
+        subroutine test_nf_inq_dimname()
+        implicit        none
+#include "tests.inc"
+        integer ncid
+        integer i
+        integer err
+        character*(NF_MAX_NAME)  name
+
+        err = nf_open(testfile, NF_NOWRITE, ncid)
+        if (err .ne. 0)
+     +      call errore('nf_open: ', err)
+        do 1, i = 1, NDIMS
+            err = nf_inq_dimname(BAD_ID, i, name)
+            if (err .ne. NF_EBADID)
+     +          call errore('bad ncid: ', err)
+            err = nf_inq_dimname(ncid, BAD_DIMID, name)
+            if (err .ne. NF_EBADDIM)
+     +          call errore('bad dimid: ', err)
+            err = nf_inq_dimname(ncid, i, name)
+            if (err .ne. 0) then
+                call errore('nf_inq_dimname: ', err)
+            else if (dim_name(i) .ne. name)  then
+                call errorc('name unexpected: ', name)
+            end if
+1       continue
+        err = nf_close(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_close: ', err)
+        end
+
+
+        subroutine test_nf_inq_varid()
+        implicit        none
+#include "tests.inc"
+        integer ncid
+        integer vid
+        integer i
+        integer err
+
+        err = nf_open(testfile, NF_NOWRITE, ncid)
+        if (err .ne. 0)
+     +      call errore('nf_open: ', err)
+
+        err = nf_inq_varid(ncid, 'noSuch', vid)
+        if (err .ne. NF_ENOTVAR)
+     +      call errore('bad ncid: ', err)
+
+        do 1, i = 1, NVARS
+            err = nf_inq_varid(BAD_ID, var_name(i), vid)
+            if (err .ne. NF_EBADID)
+     +          call errore('bad ncid: ', err)
+            err = nf_inq_varid(ncid, var_name(i), vid)
+            if (err .ne. 0) then
+                call errore('nf_inq_varid: ', err)
+            else if (vid .ne. i) then
+                call errori('varid unexpected: ', vid)
+            endif
+1       continue
+
+        err = nf_close(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_close: ', err)
+        end
+
+
+        subroutine test_nf_inq_var()
+        implicit        none
+#include "tests.inc"
+        integer ncid
+        integer i
+        integer err
+        character*(NF_MAX_NAME) name
+        integer datatype
+        integer ndims
+        integer dimids(MAX_RANK)
+        integer na
+
+        err = nf_open(testfile, NF_NOWRITE, ncid)
+        if (err .ne. 0)
+     +      call errore('nf_open: ', err)
+        do 1, i = 1, NVARS
+            err = nf_inq_var(BAD_ID, i, name, datatype, ndims, dimids, 
+     +                       na)
+            if (err .ne. NF_EBADID)
+     +          call errore('bad ncid: ', err)
+            err = nf_inq_var(ncid,BAD_VARID,name,datatype,ndims,dimids,
+     +                       na)
+            if (err .ne. NF_ENOTVAR)
+     +          call errore('bad var id: ', err)
+            err = nf_inq_var(ncid, i, name, datatype, ndims, dimids, 
+     +                       na)
+            if (err .ne. 0) then
+                call errore('nf_inq_var: ', err)
+            else if (var_name(i) .ne. name)  then
+                call errorc('name unexpected: ', name)
+            else if (var_type(i) .ne. datatype) then
+                call errori('type unexpected: ', datatype)
+            else if (var_rank(i) .ne. ndims) then
+                call errori('ndims expected: ', ndims)
+            else if (.not.int_vec_eq(var_dimid(1,i),dimids,ndims)) then
+                call error('unexpected dimid')
+            else if (var_natts(i) .ne. na) then
+                call errori('natts unexpected: ', na)
+            end if
+1       continue
+        err = nf_close(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_close: ', err)
+        end
+
+
+        subroutine test_nf_inq_vardimid()
+        implicit        none
+#include "tests.inc"
+        integer ncid
+        integer i
+        integer err
+        integer dimids(MAX_RANK)
+
+        err = nf_open(testfile, NF_NOWRITE, ncid)
+        if (err .ne. 0)
+     +      call errore('nf_open: ', err)
+        do 1, i = 1, NVARS
+            err = nf_inq_vardimid(BAD_ID, i, dimids)
+            if (err .ne. NF_EBADID)
+     +          call errore('bad ncid: ', err)
+            err = nf_inq_vardimid(ncid, BAD_VARID, dimids)
+            if (err .ne. NF_ENOTVAR)
+     +          call errore('bad var id: ', err)
+            err = nf_inq_vardimid(ncid, i, dimids)
+            if (err .ne. 0) then
+                call errore('nf_inq_vardimid: ', err)
+            else if (.not.int_vec_eq(var_dimid(1,i), dimids, 
+     +               var_rank(i))) then
+                call error('unexpected dimid')
+            end if
+1       continue
+        err = nf_close(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_close: ', err)
+        end
+
+
+        subroutine test_nf_inq_varname()
+        implicit        none
+#include "tests.inc"
+        integer ncid
+        integer i
+        integer err
+        character*(NF_MAX_NAME) name
+
+        err = nf_open(testfile, NF_NOWRITE, ncid)
+        if (err .ne. 0)
+     +      call errore('nf_open: ', err)
+        do 1, i = 1, NVARS
+            err = nf_inq_varname(BAD_ID, i, name)
+            if (err .ne. NF_EBADID)
+     +          call errore('bad ncid: ', err)
+            err = nf_inq_varname(ncid, BAD_VARID, name)
+            if (err .ne. NF_ENOTVAR)
+     +          call errore('bad var id: ', err)
+            err = nf_inq_varname(ncid, i, name)
+            if (err .ne. 0) then
+                call errore('nf_inq_varname: ', err)
+            else if (var_name(i) .ne. name)  then
+                call errorc('name unexpected: ', name)
+            end if
+1       continue
+        err = nf_close(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_close: ', err)
+        end
+
+
+        subroutine test_nf_inq_varnatts()
+        implicit        none
+#include "tests.inc"
+        integer ncid
+        integer i
+        integer err
+        integer na
+
+        err = nf_open(testfile, NF_NOWRITE, ncid)
+        if (err .ne. 0)
+     +      call errore('nf_open: ', err)
+        do 1, i = 0, NVARS	! start with global attributes
+            err = nf_inq_varnatts(BAD_ID, i, na)
+            if (err .ne. NF_EBADID)
+     +          call errore('bad ncid: ', err)
+            err = nf_inq_varnatts(ncid, BAD_VARID, na)
+            if (err .ne. NF_ENOTVAR)
+     +          call errore('bad var id: ', err)
+            err = nf_inq_varnatts(ncid, VARID(i), na)
+            if (err .ne. 0) then
+                call errore('nf_inq_varnatts: ', err)
+            else if (NATTS(i) .ne. na) then	! works for global attributes
+                call errori('natts unexpected: ', na)
+            end if
+1       continue
+        err = nf_close(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_close: ', err)
+        end
+
+
+        subroutine test_nf_inq_varndims()
+        implicit        none
+#include "tests.inc"
+        integer ncid
+        integer i
+        integer err
+        integer ndims
+
+        err = nf_open(testfile, NF_NOWRITE, ncid)
+        if (err .ne. 0)
+     +      call errore('nf_open: ', err)
+        do 1, i = 1, NVARS
+            err = nf_inq_varndims(BAD_ID, i, ndims)
+            if (err .ne. NF_EBADID)
+     +          call errore('bad ncid: ', err)
+            err = nf_inq_varndims(ncid, BAD_VARID, ndims)
+            if (err .ne. NF_ENOTVAR)
+     +          call errore('bad var id: ', err)
+            err = nf_inq_varndims(ncid, i, ndims)
+            if (err .ne. 0) then
+                call errore('nf_inq_varndims: ', err)
+            else if (var_rank(i) .ne. ndims) then
+                call errori('ndims unexpected: ', ndims)
+            end if
+1       continue
+        err = nf_close(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_close: ', err)
+        end
+
+
+        subroutine test_nf_inq_vartype()
+        implicit        none
+#include "tests.inc"
+        integer ncid
+        integer i
+        integer err
+        integer datatype
+
+        err = nf_open(testfile, NF_NOWRITE, ncid)
+        if (err .ne. 0)
+     +      call errore('nf_open: ', err)
+        do 1, i = 1, NVARS
+            err = nf_inq_vartype(BAD_ID, i, datatype)
+            if (err .ne. NF_EBADID)
+     +          call errore('bad ncid: ', err)
+            err = nf_inq_vartype(ncid, BAD_VARID, datatype)
+            if (err .ne. NF_ENOTVAR)
+     +          call errore('bad var id: ', err)
+            err = nf_inq_vartype(ncid, i, datatype)
+            if (err .ne. 0) then
+                call errore('nf_inq_vartype: ', err)
+            else if (var_type(i) .ne. datatype) then
+                call errori('type unexpected: ', datatype)
+            end if
+1       continue
+        err = nf_close(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_close: ', err)
+        end
+
+
+        subroutine test_nf_inq_att()
+        implicit        none
+#include "tests.inc"
+        integer ncid
+        integer i
+        integer j
+        integer err
+        integer t
+        integer n
+
+        err = nf_open(testfile, NF_NOWRITE, ncid)
+        if (err .ne. 0) 
+     +      call errore('nf_open: ', err)
+
+        do 1, i = 0, NVARS
+            do 2, j = 1, NATTS(i)
+                err = nf_inq_att(BAD_ID, i, ATT_NAME(j,i), t, n)
+                if (err .ne. NF_EBADID) 
+     +              call errore('bad ncid: ', err)
+                err = nf_inq_att(ncid, BAD_VARID, ATT_NAME(j,i), t, n)
+                if (err .ne. NF_ENOTVAR) 
+     +              call errore('bad var id: ', err)
+                err = nf_inq_att(ncid, i, 'noSuch', t, n)
+                if (err .ne. NF_ENOTATT) 
+     +              call errore('Bad attribute name: ', err)
+                err = nf_inq_att(ncid, i, ATT_NAME(j,i), t, n)
+                if (err .ne. 0) then
+                    call error(nf_strerror(err))
+                else
+                    if (t .ne. ATT_TYPE(j,i))
+     +                  call error('type not that expected')
+                    if (n .ne. ATT_LEN(j,i)) 
+     +                  call error('length not that expected')
+                end if
+2           continue
+1       continue
+
+        err = nf_close(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_close: ', err)
+        end
+
+
+        subroutine test_nf_inq_attlen()
+        implicit        none
+#include "tests.inc"
+        integer ncid
+        integer i
+        integer j
+        integer err
+        integer len
+
+        err = nf_open(testfile, NF_NOWRITE, ncid)
+        if (err .ne. 0)
+     +      call errore('nf_open: ', err)
+
+        do 1, i = 0, NVARS
+            err = nf_inq_attlen(ncid, i, 'noSuch', len)
+            if (err .ne. NF_ENOTATT)
+     +          call errore('Bad attribute name: ', err)
+            do 2, j = 1, NATTS(i)
+                err = nf_inq_attlen(BAD_ID, i, ATT_NAME(j,i), len)
+                if (err .ne. NF_EBADID)
+     +              call errore('bad ncid: ', err)
+                err = nf_inq_attlen(ncid, BAD_VARID, ATT_NAME(j,i), len)
+                if (err .ne. NF_ENOTVAR)
+     +              call errore('bad varid: ', err)
+                err = nf_inq_attlen(ncid, i, ATT_NAME(j,i), len)
+                if (err .ne. 0) then
+                    call error(nf_strerror(err))
+                else
+                    if (len .ne. ATT_LEN(j,i))
+     +                  call error('len not that expected')
+                end if
+2           continue
+1       continue
+
+        err = nf_close(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_close: ', err)
+        end
+
+
+        subroutine test_nf_inq_atttype()
+        implicit        none
+#include "tests.inc"
+        integer ncid
+        integer i
+        integer j
+        integer err
+        integer datatype
+
+        err = nf_open(testfile, NF_NOWRITE, ncid)
+        if (err .ne. 0)
+     +      call errore('nf_open: ', err)
+
+        do 1, i = 0, NVARS
+            err = nf_inq_atttype(ncid, i, 'noSuch', datatype)
+            if (err .ne. NF_ENOTATT)
+     +          call errore('Bad attribute name: ', err)
+            do 2, j = 1, NATTS(i)
+                err = nf_inq_atttype(BAD_ID, i, ATT_NAME(j,i), datatype)
+                if (err .ne. NF_EBADID)
+     +              call errore('bad ncid: ', err)
+                err = nf_inq_atttype(ncid, BAD_VARID, ATT_NAME(j,i), 
+     +                               datatype)
+                if (err .ne. NF_ENOTVAR)
+     +              call errore('bad varid: ', err)
+                err = nf_inq_atttype(ncid, i, ATT_NAME(j,i), datatype)
+                if (err .ne. 0) then
+                    call error(nf_strerror(err))
+                else
+                    if (datatype .ne. ATT_TYPE(j,i))
+     +                  call error('type not that expected')
+                end if
+2           continue
+1       continue
+
+        err = nf_close(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_close: ', err)
+        end
+
+
+        subroutine test_nf_inq_attname()
+        implicit        none
+#include "tests.inc"
+        integer ncid
+        integer i
+        integer j
+        integer err
+        character*(NF_MAX_NAME) name
+
+        err = nf_open(testfile, NF_NOWRITE, ncid)
+        if (err .ne. 0)
+     +      call errore('nf_open: ', err)
+
+        do 1, i = 0, NVARS
+            err = nf_inq_attname(ncid, i, BAD_ATTNUM, name)
+            if (err .ne. NF_ENOTATT)
+     +          call errore('Bad attribute number: ', err)
+            err = nf_inq_attname(ncid, i, NATTS(i)+1, name)
+            if (err .ne. NF_ENOTATT)
+     +          call errore('Bad attribute number: ', err)
+            do 2, j = 1, NATTS(i)
+                err = nf_inq_attname(BAD_ID, i, j, name)
+                if (err .ne. NF_EBADID)
+     +              call errore('bad ncid: ', err)
+                err = nf_inq_attname(ncid, BAD_VARID, j, name)
+                if (err .ne. NF_ENOTVAR)
+     +              call errore('bad var id: ', err)
+                err = nf_inq_attname(ncid, i, j, name)
+                if (err .ne. 0) then
+                    call error(nf_strerror(err))
+                else
+                    if (ATT_NAME(j,i) .ne. name)
+     +                  call error('name not that expected')
+                end if
+2           continue
+1       continue
+
+        err = nf_close(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_close: ', err)
+        end
+
+
+        subroutine test_nf_inq_attid()
+        implicit        none
+#include "tests.inc"
+        integer ncid
+        integer i
+        integer j
+        integer err
+        integer attnum
+
+        err = nf_open(testfile, NF_NOWRITE, ncid)
+        if (err .ne. 0)
+     +      call errore('nf_open: ', err)
+
+        do 1, i = 0, NVARS
+            err = nf_inq_attid(ncid, i, 'noSuch', attnum)
+            if (err .ne. NF_ENOTATT)
+     +          call errore('Bad attribute name: ', err)
+            do 2, j = 1, NATTS(i)
+                err = nf_inq_attid(BAD_ID, i, ATT_NAME(j,i), attnum)
+                if (err .ne. NF_EBADID)
+     +              call errore('bad ncid: ', err)
+                err = nf_inq_attid(ncid, BAD_VARID, ATT_NAME(j,i), 
+     +                             attnum)
+                if (err .ne. NF_ENOTVAR)
+     +              call errore('bad varid: ', err)
+                err = nf_inq_attid(ncid, i, ATT_NAME(j,i), attnum)
+                if (err .ne. 0) then
+                    call error(nf_strerror(err))
+                else
+                    if (attnum .ne. j)
+     +                  call error('attnum not that expected')
+                end if
+2           continue
+1       continue
+
+        err = nf_close(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_close: ', err)
+        end
diff --git a/nf_test/test_write.F b/nf_test/test_write.F
new file mode 100644
index 0000000..c28b67b
--- /dev/null
+++ b/nf_test/test_write.F
@@ -0,0 +1,1434 @@
+C********************************************************************
+C   Copyright 1996, UCAR/Unidata
+C   See netcdf/COPYRIGHT file for copying and redistribution conditions.
+C   $Id: test_write.F,v 1.15 2008/04/30 16:50:45 ed Exp $
+C********************************************************************
+
+
+C Test nf_create
+C    For mode in NF_NOCLOBBER, NF_CLOBBER do:
+C       create netcdf file 'scratch.nc' with no data, close it
+C       test that it can be opened, do nf_inq to check nvars = 0, etc.
+C    Try again in NF_NOCLOBBER mode, check error return
+C On exit, delete this file
+        subroutine test_nf_create()
+        implicit        none
+#include "tests.inc"
+
+        integer clobber         !/* 0 for NF_NOCLOBBER, 1 for NF_CLOBBER */
+        integer err
+        integer ncid
+        integer ndims           !/* number of dimensions */
+        integer nvars           !/* number of variables */
+        integer ngatts          !/* number of global attributes */
+        integer recdim          !/* id of unlimited dimension */
+        integer flags
+
+        flags = NF_NOCLOBBER
+        do 1, clobber = 0, 1
+            err = nf_create(scratch, flags, ncid)
+            if (err .ne. 0) then
+                call errore('nf_create: ', err)
+            end if
+            err = nf_close(ncid)
+            if (err .ne. 0) then
+                call errore('nf_close: ', err)
+            end if
+            err = nf_open(scratch, NF_NOWRITE, ncid)
+            if (err .ne. 0) then
+                call errore('nf_open: ', err)
+            end if
+            err = nf_inq(ncid, ndims, nvars, ngatts, recdim)
+            if (err .ne. 0) then
+                call errore('nf_inq: ', err)
+            else if (ndims .ne. 0) then
+                call errori(
+     +              'nf_inq: wrong number of dimensions returned, ',
+     +              ndims)
+            else if (nvars .ne. 0) then
+                call errori(
+     +              'nf_inq: wrong number of variables returned, ',
+     +              nvars)
+            else if (ngatts .ne. 0) then
+                call errori(
+     +              'nf_inq: wrong number of global atts returned, ',
+     +              ngatts)
+            else if (recdim .ge. 1) then
+                call errori(
+     +              'nf_inq: wrong record dimension ID returned, ',
+     +              recdim)
+            end if
+            err = nf_close(ncid)
+            if (err .ne. 0) then
+                call errore('nf_close: ', err)
+            end if
+
+            flags = NF_CLOBBER
+1       continue
+
+        err = nf_create(scratch, NF_NOCLOBBER, ncid)
+        if (err .ne. NF_EEXIST) then
+            call errore('attempt to overwrite file: ', err)
+        end if
+        err = nf_delete(scratch)
+        if (err .ne. 0) then
+            call errori('delete of scratch file failed: ', err)
+        end if
+        end
+
+
+C Test nf_redef 
+C (In fact also tests nf_enddef - called from test_nf_enddef)
+C    BAD_ID
+C    attempt redef (error) & enddef on read-only file
+C    create file, define dims & vars. 
+C    attempt put var (error)
+C    attempt redef (error) & enddef.
+C    put vars
+C    attempt def new dims (error)
+C    redef
+C    def new dims, vars.
+C    put atts
+C    enddef
+C    put vars
+C    close
+C    check file: vars & atts
+        subroutine test_nf_redef()
+        implicit        none
+#include "tests.inc"
+        integer         title_len
+        parameter       (title_len = 9)
+
+        integer                 ncid            !/* netcdf id */
+        integer                 dimid           !/* dimension id */
+        integer                 vid             !/* variable id */
+        integer                 err
+        character*(title_len)   title
+        doubleprecision         var
+        character*(NF_MAX_NAME) name
+        integer                 length
+
+        title = 'Not funny'
+
+C           /* BAD_ID tests */
+        err = nf_redef(BAD_ID)
+        if (err .ne. NF_EBADID)
+     +      call errore('bad ncid: ', err)
+        err = nf_enddef(BAD_ID)
+        if (err .ne. NF_EBADID)
+     +      call errore('bad ncid: ', err)
+
+C           /* read-only tests */
+        err = nf_open(testfile, NF_NOWRITE, ncid)
+        if (err .ne. 0)
+     +      call errore('nf_open: ', err)
+        err = nf_redef(ncid)
+        if (err .ne. NF_EPERM)
+     +      call errore('nf_redef in NF_NOWRITE mode: ', err)
+        err = nf_enddef(ncid)
+        if (err .ne. NF_ENOTINDEFINE)
+     +      call errore('nf_redef in NF_NOWRITE mode: ', err)
+        err = nf_close(ncid)
+        if (err .ne. 0) 
+     +      call errore('nf_close: ', err)
+
+C           /* tests using scratch file */
+        err = nf_create(scratch, NF_NOCLOBBER, ncid)
+        if (err .ne. 0) then
+            call errore('nf_create: ', err)
+            return
+        end if
+        call def_dims(ncid)
+        call def_vars(ncid)
+        call put_atts(ncid)
+        err = nf_inq_varid(ncid, 'd', vid)
+        if (err .ne. 0) 
+     +      call errore('nf_inq_varid: ', err)
+        var = 1.0
+        err = nf_put_var1_double(ncid, vid, 0, var)
+        if (err .ne. NF_EINDEFINE)
+     +      call errore('nf_put_var... in define mode: ', err)
+        err = nf_redef(ncid)
+        if (err .ne. NF_EINDEFINE)
+     +      call errore('nf_redef in define mode: ', err)
+        err = nf_enddef(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_enddef: ', err)
+        call put_vars(ncid)
+        err = nf_def_dim(ncid, 'abc', 8, dimid)
+        if (err .ne. NF_ENOTINDEFINE)
+     +      call errore('nf_def_dim in define mode: ', err)
+        err = nf_redef(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_redef: ', err)
+        err = nf_def_dim(ncid, 'abc', 8, dimid)
+        if (err .ne. 0)
+     +      call errore('nf_def_dim: ', err)
+        err = nf_def_var(ncid, 'abc', NF_INT, 0, 0, vid)
+        if (err .ne. 0)
+     +      call errore('nf_def_var: ', err)
+        err = nf_put_att_text(ncid, NF_GLOBAL, 'title', len(title), 
+     +                        title)
+        if (err .ne .0)
+     +      call errore('nf_put_att_text: ', err)
+        err = nf_enddef(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_enddef: ', err)
+        var = 1.0
+        err = nf_put_var1_double(ncid, vid, 0, var)
+        if (err .ne. 0)
+     +      call errore('nf_put_var1_double: ', err)
+        err = nf_close(ncid)
+        if (err .ne. 0) 
+     +      call errore('nf_close: ', err)
+
+C           /* check scratch file written as expected */
+        call check_file(scratch)
+        err = nf_open(scratch, NF_NOWRITE, ncid)
+        if (err .ne. 0)
+     +      call errore('nf_open: ', err)
+        err = nf_inq_dim(ncid, dimid, name, length)
+        if (err .ne. 0) 
+     +      call errore('nf_inq_dim: ', err)
+        if (name .ne. "abc")
+     +      call errori('Unexpected dim name in netCDF ', ncid)
+        if (length .ne. 8) 
+     +      call errori('Unexpected dim length: ', length)
+        err = nf_get_var1_double(ncid, vid, 0, var)
+        if (err .ne. 0)
+     +      call errore('nf_get_var1_double: ', err)
+        if (var .ne. 1.0)
+     +      call errori(
+     +          'nf_get_var1_double: unexpected value in netCDF ', ncid)
+        err = nf_close(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_close: ', err)
+
+        err = nf_delete(scratch)
+        if (err .ne. 0)
+     +      call errori('delete failed for netCDF: ', err)
+        end
+
+C Test nf_enddef 
+C Simply calls test_nf_redef which tests both nf_redef & nf_enddef
+
+        subroutine test_nf_enddef()
+        implicit        none
+#include "tests.inc"
+
+        call test_nf_redef
+        end
+
+
+C Test nf_sync
+C    try with bad handle, check error
+C    try in define mode, check error
+C    try writing with one handle, reading with another on same netCDF
+        subroutine test_nf_sync()
+        implicit        none
+#include "tests.inc"
+
+        integer ncidw         !/* netcdf id for writing */
+        integer ncidr         !/* netcdf id for reading */
+        integer err
+
+C           /* BAD_ID test */
+        err = nf_sync(BAD_ID)
+        if (err .ne. NF_EBADID)
+     +      call errore('bad ncid: ', err)
+
+C           /* create scratch file & try nf_sync in define mode */
+        err = nf_create(scratch, NF_NOCLOBBER, ncidw)
+        if (err .ne. 0) then
+            call errore('nf_create: ', err)
+            return
+        end if
+        err = nf_sync(ncidw)
+        if (err .ne. NF_EINDEFINE)
+     +      call errore('nf_sync called in define mode: ', err)
+
+C           /* write using same handle */
+        call def_dims(ncidw)
+        call def_vars(ncidw)
+        call put_atts(ncidw)
+        err = nf_enddef(ncidw)
+        if (err .ne. 0)
+     +      call errore('nf_enddef: ', err)
+        call put_vars(ncidw)
+        err = nf_sync(ncidw)
+        if (err .ne. 0)
+     +      call errore('nf_sync of ncidw failed: ', err)
+
+C           /* open another handle, nf_sync, read (check) */
+        err = nf_open(scratch, NF_NOWRITE, ncidr)
+        if (err .ne. 0)
+     +      call errore('nf_open: ', err)
+        err = nf_sync(ncidr)
+        if (err .ne. 0)
+     +      call errore('nf_sync of ncidr failed: ', err)
+        call check_dims(ncidr)
+        call check_atts(ncidr)
+        call check_vars(ncidr)
+
+C           /* close both handles */
+        err = nf_close(ncidr)
+        if (err .ne. 0)
+     +      call errore('nf_close: ', err)
+        err = nf_close(ncidw)
+        if (err .ne. 0)
+     +      call errore('nf_close: ', err)
+
+        err = nf_delete(scratch)
+        if (err .ne. 0)
+     +      call errori('delete of scratch file failed: ', err)
+        end
+
+
+C Test nf_abort
+C    try with bad handle, check error
+C    try in define mode before anything written, check that file was deleted
+C    try after nf_enddef, nf_redef, define new dims, vars, atts
+C    try after writing variable
+        subroutine test_nf_abort()
+        implicit        none
+#include "tests.inc"
+
+        integer ncid          !/* netcdf id */
+        integer err
+        integer ndims
+        integer nvars
+        integer ngatts
+        integer recdim
+
+C           /* BAD_ID test */
+        err = nf_abort(BAD_ID)
+        if (err .ne. NF_EBADID)
+     +      call errore('bad ncid: status = ', err)
+
+C           /* create scratch file & try nf_abort in define mode */
+        err = nf_create(scratch, NF_NOCLOBBER, ncid)
+        if (err .ne. 0) then
+            call errore('nf_create: ', err)
+            return
+        end if
+        call def_dims(ncid)
+        call def_vars(ncid)
+        call put_atts(ncid)
+        err = nf_abort(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_abort of ncid failed: ', err)
+        err = nf_close(ncid)    !/* should already be closed */
+        if (err .ne. NF_EBADID)
+     +      call errore('bad ncid: ', err)
+        err = nf_delete(scratch)        !/* should already be deleted */
+        if (err .eq. 0)
+     +      call errori('scratch file should not exist: ', err)
+
+C            create scratch file
+C            do nf_enddef & nf_redef
+C            define new dims, vars, atts
+C            try nf_abort: should restore previous state (no dims, vars, atts)
+        err = nf_create(scratch, NF_NOCLOBBER, ncid)
+        if (err .ne. 0) then
+            call errore('nf_create: ', err)
+            return
+        end if
+        err = nf_enddef(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_enddef: ', err)
+        err = nf_redef(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_redef: ', err)
+        call def_dims(ncid)
+        call def_vars(ncid)
+        call put_atts(ncid)
+        err = nf_abort(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_abort of ncid failed: ', err)
+        err = nf_close(ncid)    !/* should already be closed */
+        if (err .ne. NF_EBADID)
+     +      call errore('bad ncid: ', err)
+        err = nf_open(scratch, NF_NOWRITE, ncid)
+        if (err .ne. 0)
+     +      call errore('nf_open: ', err)
+        err = nf_inq (ncid, ndims, nvars, ngatts, recdim)
+        if (err .ne. 0)
+     +      call errore('nf_inq: ', err)
+        if (ndims .ne. 0)
+     +      call errori('ndims should be ', 0)
+        if (nvars .ne. 0)
+     +      call errori('nvars should be ', 0)
+        if (ngatts .ne. 0)
+     +      call errori('ngatts should be ', 0)
+        err = nf_close (ncid)
+        if (err .ne. 0)
+     +      call errore('nf_close: ', err)
+
+C           /* try nf_abort in data mode - should just close */
+        err = nf_create(scratch, NF_CLOBBER, ncid)
+        if (err .ne. 0) then
+            call errore('nf_create: ', err)
+            return
+        end if
+        call def_dims(ncid)
+        call def_vars(ncid)
+        call put_atts(ncid)
+        err = nf_enddef(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_enddef: ', err)
+        call put_vars(ncid)
+        err = nf_abort(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_abort of ncid failed: ', err)
+        err = nf_close(ncid)       !/* should already be closed */
+        if (err .ne. NF_EBADID)
+     +      call errore('bad ncid: ', err)
+        call check_file(scratch)
+        err = nf_delete(scratch)
+        if (err .ne. 0)
+     +      call errori('delete of scratch file failed: ', err)
+        end
+
+
+C Test nf_def_dim
+C    try with bad netCDF handle, check error
+C    try in data mode, check error
+C    check that returned id is one more than previous id
+C    try adding same dimension twice, check error
+C    try with illegal sizes, check error
+C    make sure unlimited size works, shows up in nf_inq_unlimdim
+C    try to define a second unlimited dimension, check error
+        subroutine test_nf_def_dim()
+        implicit        none
+#include "tests.inc"
+
+        integer ncid
+        integer err             !/* status */
+        integer i
+        integer dimid         !/* dimension id */
+        integer length
+
+C           /* BAD_ID test */
+        err = nf_def_dim(BAD_ID, 'abc', 8, dimid)
+        if (err .ne. NF_EBADID)
+     +      call errore('bad ncid: ', err)
+
+C           /* data mode test */
+        err = nf_create(scratch, NF_CLOBBER, ncid)
+        if (err .ne. 0) then
+            call errore('nf_create: ', err)
+            return
+        end if
+        err = nf_enddef(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_enddef: ', err)
+        err = nf_def_dim(ncid, 'abc', 8, dimid)
+        if (err .ne. NF_ENOTINDEFINE)
+     +      call errore('bad ncid: ', err)
+
+C           /* define-mode tests: unlimited dim */
+        err = nf_redef(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_redef: ', err)
+        err = nf_def_dim(ncid, dim_name(1), NF_UNLIMITED, dimid)
+        if (err .ne. 0) 
+     +      call errore('nf_def_dim: ', err)
+        if (dimid .ne. 1) 
+     +      call errori('Unexpected dimid: ', dimid)
+        err = nf_inq_unlimdim(ncid, dimid)
+        if (err .ne. 0) 
+     +      call errore('nf_inq_unlimdim: ', err)
+        if (dimid .ne. RECDIM) 
+     +      call error('Unexpected recdim: ')
+        err = nf_inq_dimlen(ncid, dimid, length)
+        if (length .ne. 0) 
+     +      call errori('Unexpected length: ', 0)
+        err = nf_def_dim(ncid, 'abc', NF_UNLIMITED, dimid)
+        if (err .ne. NF_EUNLIMIT)
+     +      call errore('2nd unlimited dimension: ', err)
+
+C           /* define-mode tests: remaining dims */
+        do 1, i = 2, NDIMS
+            err = nf_def_dim(ncid, dim_name(i-1), dim_len(i), 
+     +                       dimid)
+            if (err .ne. NF_ENAMEINUSE)
+     +          call errore('duplicate name: ', err)
+            err = nf_def_dim(ncid, BAD_NAME, dim_len(i), dimid)
+            if (err .ne. NF_EBADNAME)
+     +          call errore('bad name: ', err)
+            err = nf_def_dim(ncid, dim_name(i), NF_UNLIMITED-1, 
+     +                       dimid)
+            if (err .ne. NF_EDIMSIZE)
+     +          call errore('bad size: ', err)
+            err = nf_def_dim(ncid, dim_name(i), dim_len(i), dimid)
+            if (err .ne. 0) 
+     +          call errore('nf_def_dim: ', err)
+            if (dimid .ne. i) 
+     +          call errori('Unexpected dimid: ', 0)
+1       continue
+
+C           /* Following just to expand unlimited dim */
+        call def_vars(ncid)
+        err = nf_enddef(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_enddef: ', err)
+        call put_vars(ncid)
+
+C           /* Check all dims */
+        call check_dims(ncid)
+
+        err = nf_close(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_close: ', err)
+        err = nf_delete(scratch)
+        if (err .ne. 0)
+     +      call errori('delete of scratch file failed: ', err)
+        end
+
+
+C Test nf_rename_dim
+C    try with bad netCDF handle, check error
+C    check that proper rename worked with nf_inq_dim
+C    try renaming to existing dimension name, check error
+C    try with bad dimension handle, check error
+        subroutine test_nf_rename_dim()
+        implicit        none
+#include "tests.inc"
+
+        integer ncid
+        integer err             !/* status */
+        character*(NF_MAX_NAME) name
+
+C           /* BAD_ID test */
+        err = nf_rename_dim(BAD_ID, 1, 'abc')
+        if (err .ne. NF_EBADID)
+     +      call errore('bad ncid: ', err)
+
+C           /* main tests */
+        err = nf_create(scratch, NF_NOCLOBBER, ncid)
+        if (err .ne. 0) then
+            call errore('nf_create: ', err)
+            return
+        end if
+        call def_dims(ncid)
+        err = nf_rename_dim(ncid, BAD_DIMID, 'abc')
+        if (err .ne. NF_EBADDIM)
+     +      call errore('bad dimid: ', err)
+        err = nf_rename_dim(ncid, 3, 'abc')
+        if (err .ne. 0)
+     +      call errore('nf_rename_dim: ', err)
+        err = nf_inq_dimname(ncid, 3, name)
+        if (name .ne. 'abc')
+     +      call errorc('Unexpected name: ', name)
+        err = nf_rename_dim(ncid, 1, 'abc')
+        if (err .ne. NF_ENAMEINUSE)
+     +      call errore('duplicate name: ', err)
+
+        err = nf_close(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_close: ', err)
+        err = nf_delete(scratch)
+        if (err .ne. 0)
+     +      call errori('delete of scratch file failed: ', err)
+        end
+
+
+C Test nf_def_var
+C    try with bad netCDF handle, check error
+C    try with bad name, check error
+C    scalar tests:
+C      check that proper define worked with nf_inq_var
+C      try redefining an existing variable, check error
+C      try with bad datatype, check error
+C      try with bad number of dimensions, check error
+C      try in data mode, check error
+C    check that returned id is one more than previous id
+C    try with bad dimension ids, check error
+        subroutine test_nf_def_var()
+        implicit        none
+#include "tests.inc"
+
+        integer ncid
+        integer vid
+        integer err             !/* status */
+        integer i
+        integer ndims
+        integer na
+        character*(NF_MAX_NAME) name
+        integer dimids(MAX_RANK)
+        integer datatype
+
+C           /* BAD_ID test */
+        err = nf_def_var(BAD_ID, 'abc', NF_SHORT, 0, dimids, vid)
+        if (err .ne. NF_EBADID)
+     +      call errore('bad ncid: status = ', err)
+
+C           /* scalar tests */
+        err = nf_create(scratch, NF_NOCLOBBER, ncid)
+        if (err .ne. 0) then
+            call errore('nf_create: ', err)
+            return
+        end if
+        err = nf_def_var(ncid, 'abc', NF_SHORT, 0, dimids, vid)
+        if (err .ne. 0)
+     +      call errore('nf_def_var: ', err)
+        err = nf_inq_var(ncid, vid, name, datatype, ndims, dimids, 
+     +                   na)
+        if (err .ne. 0)
+     +      call errore('nf_inq_var: ', err)
+        if (name .ne. 'abc')
+     +      call errorc('Unexpected name: ', name)
+        if (datatype .ne. NF_SHORT)
+     +      call error('Unexpected datatype')
+        if (ndims .ne. 0)
+     +      call error('Unexpected rank')
+        err = nf_def_var(ncid, BAD_NAME, NF_SHORT, 0, dimids, vid)
+        if (err .ne. NF_EBADNAME)
+     +      call errore('bad name: ', err)
+        err = nf_def_var(ncid, 'abc', NF_SHORT, 0, dimids, vid)
+        if (err .ne. NF_ENAMEINUSE)
+     +      call errore('duplicate name: ', err)
+        err = nf_def_var(ncid, 'ABC', BAD_TYPE, -1, dimids, vid)
+        if (err .ne. NF_EBADTYPE)
+     +      call errore('bad type: ', err)
+        err = nf_def_var(ncid, 'ABC', NF_SHORT, -1, dimids, vid)
+        if (err .ne. NF_EINVAL)
+     +      call errore('bad rank: ', err)
+        err = nf_enddef(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_enddef: ', err)
+        err = nf_def_var(ncid, 'ABC', NF_SHORT, 0, dimids, vid)
+        if (err .ne. NF_ENOTINDEFINE)
+     +      call errore('nf_def_var called in data mode: ', err)
+        err = nf_close(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_close: ', err)
+        err = nf_delete(scratch)
+        if (err .ne. 0)
+     +      call errorc('delete of scratch file failed: ', scratch)
+
+C           /* general tests using global vars */
+        err = nf_create(scratch, NF_CLOBBER, ncid)
+        if (err .ne. 0) then
+            call errore('nf_create: ', err)
+            return
+        end if
+        call def_dims(ncid)
+        do 1, i = 1, NVARS
+            err = nf_def_var(ncid, var_name(i), var_type(i), 
+     +                       var_rank(i), var_dimid(1,i), vid)
+            if (err .ne. 0) 
+     +          call errore('nf_def_var: ', err)
+            if (vid .ne. i)
+     +          call error('Unexpected varid')
+1       continue
+
+C           /* try bad dim ids */
+        dimids(1) = BAD_DIMID
+        err = nf_def_var(ncid, 'abc', NF_SHORT, 1, dimids, vid)
+        if (err .ne. NF_EBADDIM)
+     +      call errore('bad dim ids: ', err)
+        err = nf_close(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_close: ', err)
+
+        err = nf_delete(scratch)
+        if (err .ne. 0)
+     +      call errorc('delete of scratch file failed: ', scratch)
+        end
+
+
+C Test nf_rename_var
+C    try with bad netCDF handle, check error
+C    try with bad variable handle, check error
+C    try renaming to existing variable name, check error
+C    check that proper rename worked with nf_inq_varid
+C    try in data mode, check error
+        subroutine test_nf_rename_var()
+        implicit        none
+#include "tests.inc"
+
+        integer ncid
+        integer vid
+        integer err
+        integer i
+        character*(NF_MAX_NAME) name
+
+        err = nf_create(scratch, NF_NOCLOBBER, ncid)
+        if (err .ne. 0) then
+            call errore('nf_create: ', err)
+            return
+        end if
+        err = nf_rename_var(ncid, BAD_VARID, 'newName')
+        if (err .ne. NF_ENOTVAR)
+     +      call errore('bad var id: ', err)
+        call def_dims(ncid)
+        call def_vars(ncid)
+
+C           /* Prefix "new_" to each name */
+        do 1, i = 1, NVARS
+            err = nf_rename_var(BAD_ID, i, 'newName')
+            if (err .ne. NF_EBADID)
+     +          call errore('bad ncid: ', err)
+            err = nf_rename_var(ncid, i, var_name(NVARS))
+            if (err .ne. NF_ENAMEINUSE)
+     +          call errore('duplicate name: ', err)
+            name = 'new_' // var_name(i)
+            err = nf_rename_var(ncid, i, name)
+            if (err .ne. 0)
+     +          call errore('nf_rename_var: ', err)
+            err = nf_inq_varid(ncid, name, vid)
+            if (err .ne. 0)
+     +          call errore('nf_inq_varid: ', err)
+            if (vid .ne. i)
+     +          call error('Unexpected varid')
+1       continue
+
+C           /* Change to data mode */
+C           /* Try making names even longer. Then restore original names */
+        err = nf_enddef(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_enddef: ', err)
+        do 2, i = 1, NVARS
+            name = 'even_longer_' // var_name(i)
+            err = nf_rename_var(ncid, i, name)
+            if (err .ne. NF_ENOTINDEFINE)
+     +          call errore('longer name in data mode: ', err)
+            err = nf_rename_var(ncid, i, var_name(i))
+            if (err .ne. 0)
+     +          call errore('nf_rename_var: ', err)
+            err = nf_inq_varid(ncid, var_name(i), vid)
+            if (err .ne. 0)
+     +          call errore('nf_inq_varid: ', err)
+            if (vid .ne. i)
+     +          call error('Unexpected varid')
+2       continue
+
+        call put_vars(ncid)
+        call check_vars(ncid)
+
+        err = nf_close(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_close: ', err)
+
+        err = nf_delete(scratch)
+        if (err .ne. 0)
+     +      call errorc('delete of scratch file failed: ', scratch)
+        end
+
+
+C Test nf_copy_att
+C    try with bad source or target netCDF handles, check error
+C    try with bad source or target variable handle, check error
+C    try with nonexisting attribute, check error
+C    check that NF_GLOBAL variable for source or target works
+C    check that new attribute put works with target in define mode
+C    check that old attribute put works with target in data mode
+C    check that changing type and length of an attribute work OK
+C    try with same ncid for source and target, different variables
+C    try with same ncid for source and target, same variable
+        subroutine test_nf_copy_att()
+        implicit        none
+#include "tests.inc"
+
+        integer ncid_in
+        integer ncid_out
+        integer vid
+        integer err
+        integer i
+        integer j
+        character*(NF_MAX_NAME) name    !/* of att */
+        integer datatype                !/* of att */
+        integer length                  !/* of att */
+        character*1     value
+
+        err = nf_open(testfile, NF_NOWRITE, ncid_in)
+        if (err .ne. 0)
+     +      call errore('nf_open: ', err)
+        err = nf_create(scratch, NF_NOCLOBBER, ncid_out)
+        if (err .ne. 0) then
+            call errore('nf_create: ', err)
+            return
+        end if
+        call def_dims(ncid_out)
+        call def_vars(ncid_out)
+
+        do 1, i = 0, NVARS
+            vid = VARID(i)
+            do 2, j = 1, NATTS(i)
+                name = ATT_NAME(j,i)
+                err = nf_copy_att(ncid_in, BAD_VARID, name, ncid_out, 
+     +                            vid)
+                if (err .ne. NF_ENOTVAR)
+     +              call errore('bad var id: ', err)
+                err = nf_copy_att(ncid_in, vid, name, ncid_out, 
+     +                            BAD_VARID)
+                if (err .ne. NF_ENOTVAR)
+     +              call errore('bad var id: ', err)
+                err = nf_copy_att(BAD_ID, vid, name, ncid_out, vid)
+                if (err .ne. NF_EBADID)
+     +              call errore('bad ncid: ', err)
+                err = nf_copy_att(ncid_in, vid, name, BAD_ID, vid)
+                if (err .ne. NF_EBADID)
+     +              call errore('bad ncid: ', err)
+                err = nf_copy_att(ncid_in, vid, 'noSuch', ncid_out, vid)
+                if (err .ne. NF_ENOTATT)
+     +              call errore('bad attname: ', err)
+                err = nf_copy_att(ncid_in, vid, name, ncid_out, vid)
+                if (err .ne. 0)
+     +              call errore('nf_copy_att: ', err)
+                err = nf_copy_att(ncid_out, vid, name, ncid_out, vid)
+                if (err .ne. 0)
+     +              call errore('source = target: ', err)
+2           continue
+1       continue
+
+        err = nf_close(ncid_in)
+        if (err .ne. 0)
+     +      call errore('nf_close: ', err)
+
+C           /* Close scratch. Reopen & check attributes */
+        err = nf_close(ncid_out)
+        if (err .ne. 0)
+     +      call errore('nf_close: ', err)
+        err = nf_open(scratch, NF_WRITE, ncid_out)
+        if (err .ne. 0)
+     +      call errore('nf_open: ', err)
+        call check_atts(ncid_out)
+
+C           change to define mode
+C           define single char. global att. ':a' with value 'A'
+C           This will be used as source for following copies
+        err = nf_redef(ncid_out)
+        if (err .ne. 0)
+     +      call errore('nf_redef: ', err)
+        err = nf_put_att_text(ncid_out, NF_GLOBAL, 'a', 1, 'A')
+        if (err .ne. 0)
+     +      call errore('nf_put_att_text: ', err)
+
+C           change to data mode
+C           Use scratch as both source & dest.
+C           try copy to existing att. change type & decrease length
+C           rename 1st existing att of each var (if any) 'a'
+C           if this att. exists them copy ':a' to it
+        err = nf_enddef(ncid_out)
+        if (err .ne. 0)
+     +      call errore('nf_enddef: ', err)
+        do 3, i = 1, NVARS
+            if (NATTS(i) .gt. 0 .and. ATT_LEN(1,i) .gt. 0) then
+                err = nf_rename_att(ncid_out, i, att_name(1,i), 'a')
+                if (err .ne. 0)
+     +              call errore('nf_rename_att: ', err)
+                err = nf_copy_att(ncid_out, NF_GLOBAL, 'a', ncid_out, 
+     +                            i)
+                if (err .ne. 0)
+     +              call errore('nf_copy_att: ', err)
+            end if
+3       continue
+        err = nf_close(ncid_out)
+        if (err .ne. 0)
+     +      call errore('nf_close: ', err)
+
+C           /* Reopen & check */
+        err = nf_open(scratch, NF_WRITE, ncid_out)
+        if (err .ne. 0)
+     +      call errore('nf_open: ', err)
+        do 4, i = 1, NVARS
+            if (NATTS(i) .gt. 0 .and. ATT_LEN(1,i) .gt. 0) then
+                err = nf_inq_att(ncid_out, i, 'a', datatype, length)
+                if (err .ne. 0)
+     +              call errore('nf_inq_att: ', err)
+                if (datatype .ne. NF_CHAR)
+     +              call error('Unexpected type')
+                if (length .ne. 1)
+     +              call error('Unexpected length')
+                err = nf_get_att_text(ncid_out, i, 'a', value)
+                if (err .ne. 0)
+     +              call errore('nf_get_att_text: ', err)
+                if (value .ne. 'A')
+     +              call error('Unexpected value')
+            end if                                                   
+4       continue                                                   
+
+        err = nf_close(ncid_out)
+        if (err .ne. 0)
+     +      call errore('nf_close: ', err)
+        err = nf_delete(scratch)
+        if (err .ne. 0)
+     +      call errorc('delete of scratch file failed', scratch)
+        end
+
+
+C Test nf_rename_att
+C    try with bad netCDF handle, check error
+C    try with bad variable handle, check error
+C    try with nonexisting att name, check error
+C    try renaming to existing att name, check error
+C    check that proper rename worked with nf_inq_attid
+C    try in data mode, check error
+        subroutine test_nf_rename_att()
+        implicit        none
+#include "tests.inc"
+
+        integer ncid
+        integer vid
+        integer err
+        integer i
+        integer j
+        integer  k
+        integer attnum
+        character*(NF_MAX_NAME) atnam
+        character*(NF_MAX_NAME) name
+        character*(NF_MAX_NAME) oldname
+        character*(NF_MAX_NAME) newname
+        integer nok             !/* count of valid comparisons */
+        integer datatype
+        integer attyp
+        integer length
+        integer attlength
+        integer ndx(1)
+        character*(MAX_NELS)    text
+        doubleprecision value(MAX_NELS)
+        doubleprecision expect
+
+        nok = 0
+
+        err = nf_create(scratch, NF_NOCLOBBER, ncid)
+        if (err .ne. 0) then
+            call errore('nf_create: ', err)
+            return
+        end if
+        err = nf_rename_att(ncid, BAD_VARID, 'abc', 'newName')
+        if (err .ne. NF_ENOTVAR)
+     +      call errore('bad var id: ', err)
+        call def_dims(ncid)
+        call def_vars(ncid)
+        call put_atts(ncid)
+
+        do 1, i = 0, NVARS
+            vid = VARID(i)
+            do 2, j = 1, NATTS(i)
+                atnam = ATT_NAME(j,i)
+                err = nf_rename_att(BAD_ID, vid, atnam, 'newName')
+                if (err .ne. NF_EBADID)
+     +              call errore('bad ncid: ', err)
+                err = nf_rename_att(ncid, vid, 'noSuch', 'newName')
+                if (err .ne. NF_ENOTATT)
+     +              call errore('bad attname: ', err)
+                newname = 'new_' // atnam
+                err = nf_rename_att(ncid, vid, atnam, newname)
+                if (err .ne. 0)
+     +              call errore('nf_rename_att: ', err)
+                err = nf_inq_attid(ncid, vid, newname, attnum)
+                if (err .ne. 0)
+     +              call errore('nf_inq_attid: ', err)
+                if (attnum .ne. j)
+     +              call error('Unexpected attnum')
+2           continue
+1       continue
+
+C           /* Close. Reopen & check */
+        err = nf_close(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_close: ', err)
+        err = nf_open(scratch, NF_WRITE, ncid)
+        if (err .ne. 0)
+     +      call errore('nf_open: ', err)
+
+        do 3, i = 0, NVARS
+            vid = VARID(i)
+            do 4, j = 1, NATTS(i)
+                atnam = ATT_NAME(j,i)
+                attyp = ATT_TYPE(j,i)
+                attlength = ATT_LEN(j,i)
+                newname = 'new_' // atnam
+                err = nf_inq_attname(ncid, vid, j, name)
+                if (err .ne. 0)
+     +              call errore('nf_inq_attname: ', err)
+                if (name .ne. newname)
+     +              call error('nf_inq_attname: unexpected name')
+                err = nf_inq_att(ncid, vid, name, datatype, length)
+                if (err .ne. 0)
+     +              call errore('nf_inq_att: ', err)
+                if (datatype .ne. attyp)
+     +              call error('nf_inq_att: unexpected type')
+                if (length .ne. attlength)
+     +              call error('nf_inq_att: unexpected length')
+                if (datatype .eq. NF_CHAR) then
+                    err = nf_get_att_text(ncid, vid, name, text)
+                    if (err .ne. 0)
+     +                  call errore('nf_get_att_text: ', err)
+                    do 5, k = 1, attlength
+                        ndx(1) = k
+                        expect = hash(datatype, -1, ndx)
+                        if (ichar(text(k:k)) .ne. expect) then
+                            call error(
+     +                          'nf_get_att_text: unexpected value')
+                        else
+                            nok = nok + 1
+                        end if
+5                   continue
+                else
+                    err = nf_get_att_double(ncid, vid, name, value)
+                    if (err .ne. 0)
+     +                  call errore('nf_get_att_double: ', err)
+                    do 6, k = 1, attlength
+                        ndx(1) = k
+                        expect = hash(datatype, -1, ndx)
+                        if (inRange(expect, datatype)) then
+                            if (.not. equal(value(k),expect,datatype,
+     +                                      NF_DOUBLE)) then
+                                call error(
+     +                          'nf_get_att_double: unexpected value')
+                            else
+                                nok = nok + 1
+                            end if
+                        end if
+6                   continue
+                end if
+4           continue
+3       continue
+        call print_nok(nok)
+
+C           /* Now in data mode */
+C           /* Try making names even longer. Then restore original names */
+
+        do 7, i = 0, NVARS
+            vid = VARID(i)
+            do 8, j = 1, NATTS(i)
+                atnam = ATT_NAME(j,i)
+                oldname = 'new_' // atnam
+                newname = 'even_longer_' // atnam
+                err = nf_rename_att(ncid, vid, oldname, newname)
+                if (err .ne. NF_ENOTINDEFINE)
+     +              call errore('longer name in data mode: ', err)
+                err = nf_rename_att(ncid, vid, oldname, atnam)
+                if (err .ne. 0)
+     +              call errore('nf_rename_att: ', err)
+                err = nf_inq_attid(ncid, vid, atnam, attnum)
+                if (err .ne. 0)
+     +              call errore('nf_inq_attid: ', err)
+                if (attnum .ne. j)
+     +              call error('Unexpected attnum')
+8           continue
+7       continue
+
+        err = nf_close(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_close: ', err)
+
+        err = nf_delete(scratch)
+        if (err .ne. 0)
+     +      call errori('delete of scratch file failed: ', err)
+        end
+
+
+C Test nf_del_att
+C    try with bad netCDF handle, check error
+C    try with bad variable handle, check error
+C    try with nonexisting att name, check error
+C    check that proper delete worked using:
+C      nf_inq_attid, nf_inq_natts, nf_inq_varnatts
+        subroutine test_nf_del_att()
+        implicit        none
+#include "tests.inc"
+
+        integer ncid
+        integer err
+        integer i
+        integer j
+        integer attnum
+        integer na
+        integer numatts
+        integer vid
+        character*(NF_MAX_NAME)  name           !/* of att */
+
+        err = nf_create(scratch, NF_NOCLOBBER, ncid)
+        if (err .ne. 0) then
+            call errore('nf_create: ', err)
+            return
+        end if
+        err = nf_del_att(ncid, BAD_VARID, 'abc')
+        if (err .ne. NF_ENOTVAR)
+     +      call errore('bad var id: ', err)
+        call def_dims(ncid)
+        call def_vars(ncid)
+        call put_atts(ncid)
+
+        do 1, i = 0, NVARS
+            vid = VARID(i)
+            numatts = NATTS(i)
+            do 2, j = 1, numatts
+                name = ATT_NAME(j,i)
+                err = nf_del_att(BAD_ID, vid, name)
+                if (err .ne. NF_EBADID)
+     +              call errore('bad ncid: ', err)
+                err = nf_del_att(ncid, vid, 'noSuch')
+                if (err .ne. NF_ENOTATT)
+     +              call errore('bad attname: ', err)
+                err = nf_del_att(ncid, vid, name)
+                if (err .ne. 0)
+     +              call errore('nf_del_att: ', err)
+                err = nf_inq_attid(ncid, vid, name, attnum)
+                if (err .ne. NF_ENOTATT)
+     +              call errore('bad attname: ', err)
+                if (i .lt. 1) then
+                    err = nf_inq_natts(ncid, na)
+                    if (err .ne. 0)
+     +                  call errore('nf_inq_natts: ', err)
+		    if (na .ne. numatts-j) then
+			call errori('natts: expected: ', numatts-j)
+			call errori('natts: got:      ', na)
+		    end if
+		end if
+		err = nf_inq_varnatts(ncid, vid, na)
+		if (err .ne. 0)
+     +              call errore('nf_inq_natts: ', err)
+                if (na .ne. numatts-j) then
+                    call errori('natts: expected: ', numatts-j)
+                    call errori('natts: got:      ', na)
+                end if
+2           continue
+1       continue
+
+C           /* Close. Reopen & check no attributes left */
+        err = nf_close(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_close: ', err)
+        err = nf_open(scratch, NF_WRITE, ncid)
+        if (err .ne. 0)
+     +      call errore('nf_open: ', err)
+        err = nf_inq_natts(ncid, na)
+        if (err .ne. 0)
+     +      call errore('nf_inq_natts: ', err)
+        if (na .ne. 0)
+     +      call errori('natts: expected 0, got ', na)
+        do 3, i = 0, NVARS
+            vid = VARID(i)
+            err = nf_inq_varnatts(ncid, vid, na)
+            if (err .ne. 0)
+     +          call errore('nf_inq_natts: ', err)
+            if (na .ne. 0)
+     +          call errori('natts: expected 0, got ', na)
+3       continue
+
+C           /* restore attributes. change to data mode. try to delete */
+        err = nf_redef(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_redef: ', err)
+        call put_atts(ncid)
+        err = nf_enddef(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_enddef: ', err)
+
+        do 4, i = 0, NVARS
+            vid = VARID(i)
+            numatts = NATTS(i)
+            do 5, j = 1, numatts
+                name = ATT_NAME(j,i)
+                err = nf_del_att(ncid, vid, name)
+                if (err .ne. NF_ENOTINDEFINE)
+     +              call errore('in data mode: ', err)
+5           continue
+4       continue
+
+        err = nf_close(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_close: ', err)
+        err = nf_delete(scratch)
+        if (err .ne. 0)
+     +      call errori('delete of scratch file failed: ', err)
+        end
+
+
+C Test nf_set_fill
+C    try with bad netCDF handle, check error
+C    try in read-only mode, check error
+C    try with bad new_fillmode, check error
+C    try in data mode, check error
+C    check that proper set to NF_FILL works for record & non-record variables
+C    (note that it is not possible to test NF_NOFILL mode!)
+C    close file & create again for test using attribute _FillValue
+        subroutine test_nf_set_fill()
+        implicit none
+#include "tests.inc"
+
+        integer ncid
+        integer vid
+        integer err
+        integer i
+        integer j
+        integer old_fillmode
+        integer nok             !/* count of valid comparisons */
+        character*1 text
+        doubleprecision value
+        doubleprecision fill
+        integer index(MAX_RANK)
+
+        nok = 0
+        value = 0
+
+C           /* bad ncid */
+        err = nf_set_fill(BAD_ID, NF_NOFILL, old_fillmode)
+        if (err .ne. NF_EBADID)
+     +      call errore('bad ncid: ', err)
+
+C           /* try in read-only mode */
+        err = nf_open(testfile, NF_NOWRITE, ncid)
+        if (err .ne. 0)
+     +      call errore('nf_open: ', err)
+        err = nf_set_fill(ncid, NF_NOFILL, old_fillmode)
+        if (err .ne. NF_EPERM)
+     +      call errore('read-only: ', err)
+        err = nf_close(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_close: ', err)
+
+C           /* create scratch */
+        err = nf_create(scratch, NF_NOCLOBBER, ncid)
+        if (err .ne. 0) then
+            call errore('nf_create: ', err)
+            return
+        end if
+
+C           /* BAD_FILLMODE */
+        err = nf_set_fill(ncid, BAD_FILLMODE, old_fillmode)
+        if (err .ne. NF_EINVAL)
+     +      call errore('bad fillmode: ', err)
+
+C           /* proper calls */
+        err = nf_set_fill(ncid, NF_NOFILL, old_fillmode)
+        if (err .ne. 0)
+     +      call errore('nf_set_fill: ', err)
+        if (old_fillmode .ne. NF_FILL)
+     +      call errori('Unexpected old fill mode: ', old_fillmode)
+        err = nf_set_fill(ncid, NF_FILL, old_fillmode)
+        if (err .ne. 0)
+     +      call errore('nf_set_fill: ', err)
+        if (old_fillmode .ne. NF_NOFILL)
+     +      call errori('Unexpected old fill mode: ', old_fillmode)
+
+C           /* define dims & vars */
+        call def_dims(ncid)
+        call def_vars(ncid)
+
+C           /* Change to data mode. Set fillmode again */
+        err = nf_enddef(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_enddef: ', err)
+        err = nf_set_fill(ncid, NF_FILL, old_fillmode)
+        if (err .ne. 0)
+     +      call errore('nf_set_fill: ', err)
+        if (old_fillmode .ne. NF_FILL)
+     +      call errori('Unexpected old fill mode: ', old_fillmode)
+
+C       /* Write record number NRECS to force writing of preceding records */
+C       /* Assumes variable cr is char vector with UNLIMITED dimension */
+        err = nf_inq_varid(ncid, 'cr', vid)
+        if (err .ne. 0)
+     +      call errore('nf_inq_varid: ', err)
+        index(1) = NRECS
+        text = char(NF_FILL_CHAR)
+        err = nf_put_var1_text(ncid, vid, index, text)
+        if (err .ne. 0)
+     +      call errore('nf_put_var1_text: ', err)
+
+C           /* get all variables & check all values equal default fill */
+        do 1, i = 1, NVARS
+            if (var_type(i) .eq. NF_CHAR) then
+                fill = NF_FILL_CHAR
+            else if (var_type(i) .eq. NF_BYTE) then
+                fill = NF_FILL_BYTE
+            else if (var_type(i) .eq. NF_SHORT) then
+                fill = NF_FILL_SHORT
+            else if (var_type(i) .eq. NF_INT) then
+                fill = NF_FILL_INT
+            else if (var_type(i) .eq. NF_FLOAT) then
+                fill = NF_FILL_FLOAT
+            else if (var_type(i) .eq. NF_DOUBLE) then
+                fill = NF_FILL_DOUBLE
+            else
+                stop 2
+            end if
+
+            do 2, j = 1, var_nels(i)
+                err = index2indexes(j, var_rank(i), var_shape(1,i), 
+     +                              index)
+                if (err .ne. 0)
+     +              call error('error in index2indexes()')
+                if (var_type(i) .eq. NF_CHAR) then
+                    err = nf_get_var1_text(ncid, i, index, text)
+                    if (err .ne. 0)
+     +                  call errore('nf_get_var1_text failed: ',err)
+                    value = ichar(text)
+                else
+                    err = nf_get_var1_double(ncid, i, index, value)
+                    if (err .ne. 0)
+     +                  call errore('nf_get_var1_double failed: ',err)
+                end if
+                if (value .ne. fill .and. 
+     +              abs((fill - value)/fill) .gt. 1.0e-9) then
+                    call errord('Unexpected fill value: ', value)
+                else
+                    nok = nok + 1
+                end if
+2           continue
+1       continue
+
+C       /* close scratch & create again for test using attribute _FillValue */
+        err = nf_close(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_close: ', err)
+        err = nf_create(scratch, NF_CLOBBER, ncid)
+        if (err .ne. 0) then
+            call errore('nf_create: ', err)
+            return
+        end if
+        call def_dims(ncid)
+        call def_vars(ncid)
+
+C           /* set _FillValue = 42 for all vars */
+        fill = 42
+        text = char(int(fill))
+        do 3, i = 1, NVARS
+            if (var_type(i) .eq. NF_CHAR) then
+                err = nf_put_att_text(ncid, i, '_FillValue', 1, text)
+                if (err .ne. 0)
+     +              call errore('nf_put_att_text: ', err)
+            else
+                err = nf_put_att_double(ncid, i, '_FillValue',
+     +                                  var_type(i),1,fill)
+                if (err .ne. 0)
+     +              call errore('nf_put_att_double: ', err)
+            end if
+3       continue
+
+C           /* data mode. write records */
+        err = nf_enddef(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_enddef: ', err)
+        index(1) = NRECS
+        err = nf_put_var1_text(ncid, vid, index, text)
+        if (err .ne. 0)
+     +      call errore('nf_put_var1_text: ', err)
+
+C           /* get all variables & check all values equal 42 */
+        do 4, i = 1, NVARS
+            do 5, j = 1, var_nels(i)
+                err = index2indexes(j, var_rank(i), var_shape(1,i), 
+     +                              index)
+                if (err .ne. 0)
+     +              call error('error in index2indexes')
+                if (var_type(i) .eq. NF_CHAR) then
+                    err = nf_get_var1_text(ncid, i, index, text)
+                    if (err .ne. 0)
+     +                  call errore('nf_get_var1_text failed: ',err)
+                    value = ichar(text)
+                else
+                    err = nf_get_var1_double(ncid, i, index, value)
+                    if (err .ne. 0)
+     +                  call errore('nf_get_var1_double failed: ', err)
+                end if
+                if (value .ne. fill) then
+                    call errord(' Value expected: ', fill)
+                    call errord(' Value read:     ', value)
+                else
+                    nok = nok + 1
+                end if
+5           continue
+4       continue
+        call print_nok(nok)
+
+        err = nf_close(ncid)
+        if (err .ne. 0)
+     +      call errore('nf_close: ', err)
+        err = nf_delete(scratch)
+        if (err .ne. 0)
+     +      call errori('delete of scratch file failed: ', err)
+        end
+
+C * Test nc_set_default_format
+C *    try with bad default format
+C *    try with NULL old_formatp
+C *    try in data mode, check error
+C *    check that proper set to NC_FILL works for record & non-record variables
+C *    (note that it is not possible to test NC_NOFILL mode!)
+C *    close file & create again for test using attribute _FillValue
+      subroutine test_nf_set_default_format()
+      implicit none
+#include "tests.inc"
+      
+      integer ncid
+      integer err
+      integer i
+      integer version
+      integer old_format
+      integer nf_get_file_version
+      
+C     /* bad format */
+      err = nf_set_default_format(5, old_format)
+      IF (err .ne. NF_EINVAL)
+     +     call errore("bad default format: status = %d", err)
+     
+C     /* Cycle through available formats. (actually netcdf-4 formats are
+C     ignored for the moment - ed 5/15/5) */
+      do 1 i=1, 2
+         err = nf_set_default_format(i, old_format)
+         if (err .ne. 0) 
+     +         call errore("setting classic format: status = %d", err)
+         err = nf_create(scratch, NF_CLOBBER, ncid)
+         if (err .ne. 0) call errore("bad nf_create: status = %d", err)
+         err = nf_put_att_text(ncid, NF_GLOBAL, "testatt", 
+     +        4, "blah")
+         if (err .ne. 0) call errore("bad put_att: status = %d", err)
+         err = nf_close(ncid)
+         if (err .ne. 0) call errore("bad close: status = %d", err)
+         err = nf_get_file_version(scratch, version)
+         if (err .ne. 0) call errore("bad file version = %d", err)
+         if (version .ne. i)
+     +        call errore("bad file version = %d", err)
+ 1    continue
+
+C    /* Remove the left-over file. */
+C      err = nf_delete(scratch)
+      if (err .ne. 0) call errore("remove failed", err)
+      end
+      
+C     This function looks in a file for the netCDF magic number.
+      integer function nf_get_file_version(path, version)
+      implicit none
+#include "tests.inc"
+      
+      character*(*) path
+      integer version, iosnum
+      character magic*4
+      integer ver
+      integer f
+      parameter (f = 10)
+
+      open(f, file=path, status='OLD', form='UNFORMATTED',
+     +     access='DIRECT', recl=4)
+
+C     Assume this is not a netcdf file.
+      nf_get_file_version = NF_ENOTNC
+      version = 0
+
+C     Read the magic number, the first 4 bytes of the file.
+      read(f, rec=1, err = 1) magic
+
+C     If the first three characters are not "CDF" we're done.
+      if (index(magic, 'CDF') .eq. 1) then
+         ver = ichar(magic(4:4))
+         if (ver .eq. 1) then
+            version = 1
+            nf_get_file_version = NF_NOERR
+         elseif (ver .eq. 2) then
+            version = 2
+            nf_get_file_version = NF_NOERR
+         endif
+      endif
+
+ 1    close(f)
+      return
+      end
+
diff --git a/nf_test/tests.inc b/nf_test/tests.inc
new file mode 100644
index 0000000..dea47a7
--- /dev/null
+++ b/nf_test/tests.inc
@@ -0,0 +1,233 @@
+!/*********************************************************************
+! *   Copyright 1996, UCAR/Unidata
+! *   See netcdf/COPYRIGHT file for copying and redistribution conditions.
+! *   $Id: tests.inc,v 1.16 2009/04/02 18:29:21 dmh Exp $
+! *********************************************************************/
+!!!!
+! Do not tabify this unless you like hitting the 72 char limit !!!
+!!!
+#ifndef UD_TESTS_INC
+#define UD_TESTS_INC
+
+
+!/* The following prevents non-FORTRAN code from appearing in the output. */
+#if defined(__osf__)
+#   undef _POSIX_SOURCE
+#   define _POSIX_SOURCE
+#endif
+
+#define NO_NETCDF_2 1
+
+#include "nfconfig.inc"
+
+!/* Parameters of test data */
+
+#ifdef  NF_INT1_T
+#   define NF_B 1
+#else
+#   define NF_B 0
+#endif
+#ifdef  NF_INT2_T
+#   define NF_S 1
+#else
+#   define NF_S 0
+#endif
+! Total number of FORTRAN types:
+#define NUM_FORTRAN_TYPES (3 + NF_S + NF_B)
+#undef NF_B
+#undef NF_S
+
+#define NTYPES 6
+#define NDIMS 5
+#define NVARS 136
+#define NRECS 2
+#define NGATTS NTYPES
+#define RECDIM 1
+#define MAX_RANK 3
+#define MAX_NELS 64
+#define MAX_DIM_LEN 4
+#define MAX_NATTS 3
+
+
+!/*
+! * Limits of external types (based on those in ncx.h):
+! */
+#define X_CHAR_MIN 0
+#define X_CHAR_MAX 127
+#define X_INT1_MIN (-128)
+#define X_INT1_MAX 127
+#define X_INT2_MIN (-32768)
+#define X_INT2_MAX 32767
+#define X_INT_MIN  (-2147483647-1)
+#define X_INT_MAX  2147483647
+#if 0
+#define X_REAL_MAX 3.4028234663852886e+38
+#else
+#define X_REAL_MAX 3.4028234663852886e+37
+#endif
+#define X_REAL_MIN (-X_FLOAT_MAX)
+#if 0
+#define X_DOUBLE_MAX 1.7976931348623157E+308
+#else
+#define X_DOUBLE_MAX 1.7976931348623157D+200
+#endif
+#define X_DOUBLE_MIN (-X_DOUBLE_MAX)
+
+#define X_BYTE_MIN X_INT1_MIN
+#define X_BYTE_MAX X_INT1_MAX
+#define X_SHORT_MIN X_INT2_MIN
+#define X_SHORT_MAX X_INT2_MAX
+#define X_FLOAT_MIN X_REAL_MIN
+#define X_FLOAT_MAX X_REAL_MAX
+
+
+!/*
+! * Examples of invalid argument values:
+! */
+#define BAD_ID -1
+#define BAD_DIMID -1
+#define BAD_VARID -2
+#define BAD_ATTNUM -1
+#define BAD_TYPE 0
+#define BAD_FILLMODE -1
+#define BAD_NAME 'a/b'
+
+
+!/*
+! * Internal data types:
+! */
+#define NFT_UNSPECIFIED 0
+#define NFT_TEXT 16
+#define NFT_CHAR NFT_TEXT
+#define NFT_INT1 17
+#define NFT_INT2 18
+#define NFT_INT 20
+#define NFT_REAL 36
+#define NFT_DOUBLE 40
+
+
+!/*
+! * Define a macro for trimming trailing blanks from character variables.
+! */
+#define TRIM(string) string(1:len_trim(string))
+
+
+!
+! FORTRAN GETARG() subroutine:
+!
+#ifdef __hpux
+#   define      getarg  getarg_
+#endif
+
+
+#endif /* UD_TESTS_INC */
+
+
+#include "netcdf.inc"
+
+
+!    /* Global variables - filenames */
+
+      CHARACTER*80      testfile        !/* netCDF read-only test data */
+      CHARACTER*80      scratch         !/* netCDF test file for writing */
+
+!    /* Global variables - command-line arguments */
+
+      LOGICAL   CREATE_FILE
+      LOGICAL   READONLY
+      LOGICAL   VERBOSE
+      INTEGER   NFAILS
+      INTEGER   MAX_NMPT        !/* max num messages per test */
+
+!    /* Global variables - test data */
+
+      CHARACTER*2               DIM_NAME(NDIMS)
+      INTEGER                   DIM_LEN(NDIMS)
+      CHARACTER*(2+MAX_RANK)    VAR_NAME(NVARS)
+      INTEGER                   VAR_TYPE(NVARS)
+      INTEGER                   VAR_RANK(NVARS)
+      INTEGER                   VAR_DIMID(MAX_RANK,NVARS)
+      INTEGER                   VAR_SHAPE(MAX_RANK,NVARS)
+      INTEGER                   VAR_NELS(NVARS)
+      INTEGER                   VAR_NATTS(NVARS)
+      CHARACTER*2               ATTNAME(MAX_NATTS,NVARS)
+      CHARACTER*2               GATT_NAME(NGATTS)
+      INTEGER                   ATTTYPE(NGATTS,NVARS)
+      INTEGER                   GATT_TYPE(NGATTS)
+      INTEGER                   ATTLEN(MAX_NATTS,NVARS)
+      INTEGER                   GATT_LEN(NGATTS)
+
+!    /* Miscellaneous global variables: */
+      CHARACTER*80              PROGNAME        !/* name of the program */
+      INTEGER                   NFAILSTOTAL
+
+!    /* Common blocks for global variables: */
+
+      COMMON    /LOGCOM/        CREATE_FILE,
+     *                          READONLY,       !/* don't try to change files */
+     *                          VERBOSE         !/* print details of tests */
+
+      COMMON    /TXTCOM/        TESTFILE,
+     *                          SCRATCH,
+     *                          DIM_NAME,
+     *                          VAR_NAME,
+     *                          ATTNAME,
+     *                          GATT_NAME,
+     *                          PROGNAME
+
+      COMMON    /INTCOM/        NFAILS,         !/* number of failures in 
+     *                                          ! * specific test */
+     *                          DIM_LEN,
+     *                          VAR_TYPE,
+     *                          VAR_RANK,
+     *                          VAR_DIMID,
+     *                          VAR_SHAPE,
+     *                          VAR_NELS,
+     *                          VAR_NATTS,
+     *                          ATTTYPE,
+     *                          GATT_TYPE,
+     *                          ATTLEN,
+     *                          GATT_LEN,
+     *                          MAX_NMPT,
+     *                          NFAILSTOTAL
+
+
+!    /* Functions for accessing attribute test data */
+!    /* varid is -1 for NC_GLOBAL so can do global atts in same loop */
+
+!/*      EXTERNAL       ATT_NAME */
+
+      INTEGER           VARID
+      INTEGER           NATTS
+      CHARACTER*2       ATT_NAME
+      INTEGER           ATT_TYPE
+      INTEGER           ATT_LEN
+
+
+      LOGICAL           INRANGE
+      LOGICAL           INRANGE_UCHAR
+      LOGICAL           INRANGE_FLOAT
+
+      LOGICAL           INRANGE3
+      LOGICAL           IN_INTERNAL_RANGE
+      LOGICAL           EQUAL
+      LOGICAL           INT_VEC_EQ
+      INTEGER           ROLL
+      INTEGER           INDEX2INDEXES
+      INTEGER           INDEX2NCINDEXES
+      INTEGER           INDEXES2INDEX
+      INTEGER           NC2DBL
+      INTEGER           DBL2NC
+      INTEGER           LEN_TRIM
+      DOUBLEPRECISION   HASH
+      DOUBLEPRECISION   HASH4
+      DOUBLEPRECISION   HASH_TEXT
+      DOUBLEPRECISION   HASH_INT1
+      DOUBLEPRECISION   HASH_INT2
+      DOUBLEPRECISION   HASH_INT
+      DOUBLEPRECISION   HASH_REAL
+      DOUBLEPRECISION   HASH_DOUBLE
+      DOUBLEPRECISION   INTERNAL_MIN
+      DOUBLEPRECISION   INTERNAL_MAX
+      DOUBLEPRECISION   EXTERNAL_MIN
+      DOUBLEPRECISION   EXTERNAL_MAX
diff --git a/nf_test/tst_f77_v2.F b/nf_test/tst_f77_v2.F
new file mode 100644
index 0000000..6a9f029
--- /dev/null
+++ b/nf_test/tst_f77_v2.F
@@ -0,0 +1,74 @@
+C     This is part of netCDF, Copyright 2006, UCAR
+
+C     This test program uses the fortran 77 v2 API to create a simple
+C     data file with some phoney data in it. This program is heavily
+C     based on one contributed by Jeremy Kepner,
+C     jvkepner at astro.Princeton.EDU.
+
+C     This program will bail out in the event of a netcdf error.
+
+C     $Id: tst_f77_v2.F,v 1.2 2009/01/25 14:33:44 ed Exp $
+
+      PROGRAM tst_f77_v2
+      
+      IMPLICIT NONE
+
+#include "tests.inc"
+
+      INTEGER n_dim,x_dim,y_dim,z_dim
+      PARAMETER(n_dim = 3, x_dim = 20, y_dim = 10, z_dim = 5)
+      INTEGER dim_array(n_dim)
+      INTEGER start(n_dim),count(n_dim)
+
+      INTEGER ncid, errcode
+      INTEGER x_id,y_id,z_id,arr_id
+      REAL array(x_dim,y_dim,z_dim)
+      INTEGER i,j,k
+
+C     Put something into the array.
+      DO i=1,x_dim
+         DO j=1,y_dim
+            DO k=1,z_dim
+               array(i,j,k) = (i-1) + x_dim*(j-1) + x_dim*y_dim*(k-1)
+            ENDDO
+         ENDDO
+      ENDDO
+
+      print *, ''
+      print *, ' *** Testing netCDF v2 api for F77.'
+
+C     Create file.
+      ncid = NCCRE('tst_f77_v2.nc', NCCLOB, errcode)
+
+C     Create Dimensions.
+      x_id = NCDDEF(ncid, 'X', x_dim, errcode)
+      y_id = NCDDEF(ncid, 'Y', y_dim, errcode)
+      z_id = NCDDEF(ncid, 'Z', z_dim, errcode)
+
+C     Create a variable.
+C     Assign dimensions to array.
+      dim_array(1) = z_id
+      dim_array(2) = y_id
+      dim_array(3) = x_id
+      arr_id = NCVDEF(ncid,'array',NCFLOAT,n_dim,dim_array,errcode)
+
+C     Skip attributes.
+
+C     Leave definitions.
+      CALL NCENDF(ncid, errcode)
+
+C     Write variable to file.
+      start(1) = 1
+      start(2) = 1
+      start(3) = 1
+      count(1) = z_dim
+      count(2) = y_dim
+      count(3) = x_dim
+      CALL NCVPT(ncid,arr_id,start,count,array,errcode)
+
+C     Close the file.
+      CALL NCCLOS(ncid, errcode)
+
+      print *, ' *** SUCCESS!'
+
+      END
diff --git a/nf_test/tst_f90.f90 b/nf_test/tst_f90.f90
new file mode 100644
index 0000000..4cddf32
--- /dev/null
+++ b/nf_test/tst_f90.f90
@@ -0,0 +1,151 @@
+! This program provides an elementary check of some of the parts of the 
+!   Fortran 90 interface to netCDF 3.5. It is a Fortran 90 implementation
+!   of the nctst.cpp program provided with the C++ interface to netcdf
+!   (in the src/cxx directory of the netcdf distribution). 
+!
+program netcdfTest
+  use typeSizes
+  use netcdf
+  implicit none
+  
+  ! netcdf related variables
+  integer :: ncFileID,                                   &
+             latDimID, lonDimID, frTimeDimID, timeDimID, mxStrDimID, &
+             pressVarID, latVarID, lonVarID, frTimeVarID, refTimeVarID, &
+             scalarVarID, scalarStrVarID
+             
+  ! Local variables
+  integer, parameter :: numLats = 4, numLons = 3, &
+                        numFrTimes = 2, timeStringLen = 20, mxStrLen=80
+  character (len = *), parameter :: fileName = "tst_f90.nc"
+  integer :: counter, i
+  real, dimension(numLons, numLats, numFrTimes) :: pressure
+  integer (kind = FourByteInt), dimension(numFrTimes) :: frTimeVals
+  real (kind = FourByteReal) fillVal;
+  real (kind = FourByteReal), dimension(2) :: validRange;
+  character (len = 20) frTimeUnits
+  character(len=mxStrLen) :: scalarString, scalarStrRead
+
+  print *, ''
+  print *,'*** Testing netCDF-3 Fortran 90 API.'
+
+! --------------------
+  ! Code begins
+  ! --------------------
+  if(.not. byteSizesOK()) then
+    print *, "Compiler does not appear to support required kinds of variables."
+    stop
+  end if
+    
+  ! Create the file
+  call check(nf90_create(path = trim(fileName), cmode = nf90_clobber, ncid = ncFileID))
+  
+  ! Define the dimensions
+  call check(nf90_def_dim(ncid = ncFileID, name = "lat",     len = numLats,        dimid = latDimID))
+  call check(nf90_def_dim(ncid = ncFileID, name = "lon",     len = numLons,        dimid = lonDimID))
+  call check(nf90_def_dim(ncid = ncFileID, name = "frtime",  len = nf90_unlimited, dimid = frTimeDimID))
+  call check(nf90_def_dim(ncid = ncFileID, name = "timelen", len = timeStringLen,  dimid = timeDimID))
+  call check(nf90_def_dim(ncid = ncFileID, name = "mxstrlen",len = mxStrLen,       dimid = mxStrDimID))
+
+  ! Create variables and attributes
+  call check(nf90_def_var(ncid = ncFileID, name = "P", xtype = nf90_float,     &
+                     dimids = (/ lonDimID, latDimID, frTimeDimID /), varID = pressVarID) )
+  call check(nf90_put_att(ncFileID, pressVarID, "long_name",   "pressure at maximum wind"))
+  call check(nf90_put_att(ncFileID, pressVarID, "units",       "hectopascals") )
+  ! Use 4-byte reals explicitly, to match 4-byte attribute type in test file
+  validRange(1) = 0.
+  validRange(2) = 1500
+  call check(nf90_put_att(ncFileID, pressVarID, "valid_range", validRange))
+  ! Use a 4-byte float constant, to match variable type
+  fillVal = -9999.0
+  call check(nf90_put_att(ncFileID, pressVarID,  "_FillValue", fillVal ) )
+                      
+  call check(nf90_def_var(ncFileID, "lat", nf90_float, dimids = latDimID, varID = latVarID) )
+  call check(nf90_put_att(ncFileID, latVarID, "long_name", "latitude"))
+  call check(nf90_put_att(ncFileID, latVarID, "units", "degrees_north"))
+
+  call check(nf90_def_var(ncFileID, "lon", nf90_float, lonDimID, lonVarID) )
+  call check(nf90_put_att(ncFileID, lonVarID, "long_name", "longitude"))
+  call check(nf90_put_att(ncFileID, lonVarID, "units",     "degrees_east"))
+
+  call check(nf90_def_var(ncFileID, "frtime", nf90_int, frTimeDimID, frTimeVarID) )
+  call check(nf90_put_att(ncFileID, frTimeVarID, "long_name", "forecast time"))
+  call check(nf90_put_att(ncFileID, frTimeVarID, "units",     "hours"))
+
+  call check(nf90_def_var(ncFileID, "reftime", nf90_char, timeDimID, refTimeVarID) )
+  call check(nf90_put_att(ncFileID, refTimeVarID, "long_name", "reference time"))
+  call check(nf90_put_att(ncFileID, refTimeVarID, "units",     "text_time"))
+                     
+  ! In the C++ interface the define a scalar variable - do we know how to do this? 
+  call check(nf90_def_var(ncFileID, "ScalarVariable", nf90_real, scalarVarID))
+
+  ! Define a scalar string -- in a netCDF file it's a 1-D character array
+  call check(nf90_def_var(ncFileID, "ScalarString", nf90_char, (/mxStrDimID/), scalarStrVarID))
+  
+  ! Global attributes
+  call check(nf90_put_att(ncFileID, nf90_global, "history", &
+                     "created by Unidata LDM from NPS broadcast"))
+  call check(nf90_put_att(ncFileID, nf90_global, "title", &
+                     "NMC Global Product Set: Pressure at Maximum Wind"))
+  
+  ! Leave define mode
+  call check(nf90_enddef(ncfileID))
+  
+  ! Write the dimension variables
+  call check(nf90_put_var(ncFileID, latVarId,     (/ -90., -87.5, -85., -82.5 /)) )
+  call check(nf90_put_var(ncFileID, lonVarId,     (/ -180, -175, -170 /)      ) )
+  ! Don't use anonymous array here, in case platform has 8-byte integers
+  frTimeVals(1) = 12
+  frTimeVals(2) = 18
+  call check(nf90_put_var(ncFileID, frTimeVarId,  frTimeVals                  ) )
+  call check(nf90_put_var(ncFileID, reftimeVarID, "1992-3-21 12:00"           ) )
+  
+  ! Write the pressure variable. Write a slab at a time to check incrementing.
+  pressure = 949. + real(reshape( (/ (counter, counter = 1, numLats * numLons * numFrTimes) /),  &
+                                    (/ numLons, numLats, numFrTimes /) ) )
+  call check(nf90_put_var(ncFileID, pressVarID, pressure(:, :, 1:1)) )
+  call check(nf90_put_var(ncFileID, pressVarID, pressure(:, :, 2:2), start = (/ 1, 1, 2 /)) )
+  
+  call check(nf90_put_var(ncFileID, scalarVarID, 10))
+
+  ! Write a scalar string -- note that Fortran assignement adds blank fill
+  scalarString = 'this is a blank padded string'
+  call check(nf90_put_var(ncFileID, scalarStrVarID, scalarString))
+
+  call check(nf90_close(ncFileID))
+
+  ! Now open the file to read and check a few values
+  call check(nf90_open(trim(fileName), NF90_NOWRITE, ncFileID))
+  call check(nf90_inq_varid(ncFileID,"frtime",frTimeVarID))
+  call check(nf90_get_att(ncFileID,frTimeVarID,"units",frTimeUnits))
+  if(frTimeUnits .ne. "hours") then
+     print *, 'Attribute value not what was written:', frTimeUnits
+     stop 2
+  endif
+  call check(nf90_get_var(ncFileID, scalarStrVarID, scalarStrRead))
+  if(scalarStrRead .ne. scalarString) then
+     do i = 1, len(scalarString)
+        if (scalarStrRead(i:i) .ne. scalarString(i:i)) exit
+     end do
+     print *, 'String written to file does not match string read from file.'
+     print *, 'Position of first difference:', i, ' character written:', '"'//scalarString(i:i)//'"', &
+                                                  ' character read:', '"'//scalarStrRead(i:i)//'"'
+     stop 2
+  endif
+
+  call check(nf90_close(ncFileID))
+
+  print *,'*** SUCCESS!'
+
+contains
+  ! Internal subroutine - checks error status after each netcdf, prints out text message each time
+  !   an error code is returned. 
+  subroutine check(status)
+    integer, intent ( in) :: status
+    
+    if(status /= nf90_noerr) then 
+      print *, trim(nf90_strerror(status))
+      stop 2
+    end if
+  end subroutine check  
+end program netcdfTest
diff --git a/nf_test/tst_f90_nc4.f90 b/nf_test/tst_f90_nc4.f90
new file mode 100644
index 0000000..7294131
--- /dev/null
+++ b/nf_test/tst_f90_nc4.f90
@@ -0,0 +1,54 @@
+program tst_f90_nc4
+  use typeSizes
+  use netcdf
+  implicit none
+  integer :: fh, ierr, dimid, varid, ndim, nvar
+  character (len = *), parameter :: FILE_NAME = "tst_f90_nc4.nc"
+
+  print *, ''
+  print *,'*** testing simple netCDF-4 file.'
+
+  call check(nf90_create(FILE_NAME, NF90_NETCDF4, fh))
+  call check(nf90_def_dim(fh, 'fred', 10, dimid))
+  call check(nf90_def_var(fh, 'john', NF90_INT, (/dimid/), varid))
+  call check(nf90_close(fh))
+  
+  ! Check the file.
+  call check(nf90_open(FILE_NAME, NF90_WRITE, fh))
+  call check(nf90_inquire(fh, nDimensions = ndim, nVariables = nvar))
+  if (nvar .ne. 1 .or. ndim .ne. 1) stop 3
+  call check(nf90_close(fh))
+  print *,'*** OK!'
+
+  print *,'*** Testing simple classic file.'
+
+  call check(nf90_create(FILE_NAME, NF90_CLOBBER, fh))
+  call check(nf90_def_dim(fh, 'fred', 10, dimid))
+  call check(nf90_def_var(fh, 'john', NF90_INT, (/dimid/), varid))
+  call check(nf90_close(fh))
+  
+  ! Check the file.
+  call check(nf90_open(FILE_NAME, NF90_WRITE, fh))
+  call check(nf90_inquire(fh, nDimensions = ndim, nVariables = nvar))
+  if (nvar .ne. 1 .or. ndim .ne. 1) stop 3
+  call check(nf90_close(fh))
+  print *,'*** OK!'
+
+  print *,'*** SUCCESS!'
+
+contains
+!     This subroutine handles errors by printing an error message and
+!     exiting with a non-zero status.
+  subroutine check(errcode)
+    use netcdf
+    implicit none
+    integer, intent(in) :: errcode
+    
+    if(errcode /= nf90_noerr) then
+       print *, 'Error: ', trim(nf90_strerror(errcode))
+       stop 2
+    endif
+  end subroutine check
+end program tst_f90_nc4
+
+	
diff --git a/nf_test/tst_flarge.f90 b/nf_test/tst_flarge.f90
new file mode 100644
index 0000000..eee05d7
--- /dev/null
+++ b/nf_test/tst_flarge.f90
@@ -0,0 +1,64 @@
+! Copyright 2007, UCAR/Unidata. See netcdf/COPYRIGHT file for copying
+! and redistribution conditions.
+
+! This program tests large files (> 4 GB) in netCDF-4. 
+
+! $Id: tst_flarge.f90,v 1.3 2010/05/15 00:47:21 russ Exp $
+program tst_flarge
+  use typeSizes
+  use netcdf
+  implicit none
+
+  integer :: ncFileID, dimID, varID1, varID2 
+  integer, parameter :: BIG_DIMENSION = 300000000
+  character (len = *), parameter :: fileName = "tst_flarge.nc"
+  character (len = *), parameter :: dimName = "really_big_dimension"
+  character (len = *), parameter :: var1Name = "TweedleDum"
+  character (len = *), parameter :: var2Name = "TweedleDee"
+  double precision, parameter :: VAL1 = 42.5
+  double precision, parameter :: VAL2 = -42.5
+  double precision :: val1_in
+  double precision :: val2_in
+
+  print *,'*** Testing netCDF-4 large files from Fortran 90 API.'
+
+  ! Create the file with 2 NF_DOUBLE vars, each with one really long dimension.
+  call check(nf90_create(trim(fileName), nf90_netcdf4, ncFileID))
+  call check(nf90_def_dim(ncFileID, dimName, BIG_DIMENSION, dimID))
+  call check(nf90_def_var(ncFileID, var1Name, nf90_double, (/ dimID /), varID1) )
+  call check(nf90_def_var(ncFileID, var2Name, nf90_double, (/ dimID /), varID2) )
+
+!   ! Write a value in each variable.
+  call check(nf90_put_var(ncFileID, VarID1, (/ 42.5 /), &
+       start = (/ 1 /), count = (/ 1 /)) )
+  call check(nf90_put_var(ncFileID, VarID2, (/ -42.5 /), &
+       start = (/ BIG_DIMENSION /), count = (/ 1 /)) )
+
+  call check(nf90_close(ncFileID))
+
+  ! Now open the file to read and check a few values
+  call check(nf90_open(trim(fileName), NF90_NOWRITE, ncFileID))
+  call check(nf90_get_var(ncFileID, VarID1, val1_in, start = (/ 1 /)) )
+  call check(nf90_get_var(ncFileID, VarID2, val2_in, start = (/ BIG_DIMENSION /)) )
+  if(val1_in /= VAL1 .or. val2_in /= VAL2) then
+     print *, 'Variable value not what was written'
+     stop 2
+  end if
+
+  call check(nf90_close(ncFileID))
+  OPEN (UNIT=5, FILE=fileName, STATUS="OLD")
+  CLOSE (UNIT=5, STATUS="DELETE")
+  print *,'*** SUCCESS!'
+
+contains
+  ! Internal subroutine - checks error status after each netcdf, prints out text message each time
+  !   an error code is returned. 
+  subroutine check(status)
+    integer, intent ( in) :: status
+
+    if(status /= nf90_noerr) then 
+       print *, trim(nf90_strerror(status))
+       stop 2
+    end if
+  end subroutine check
+end program tst_flarge
diff --git a/nf_test/tst_io.f90 b/nf_test/tst_io.f90
new file mode 100644
index 0000000..39c51ea
--- /dev/null
+++ b/nf_test/tst_io.f90
@@ -0,0 +1,185 @@
+! Copyright 2007, UCAR/Unidata. See netcdf/COPYRIGHT file for copying
+! and redistribution conditions.
+
+! This program tests io times with large files (> 4 GB) in
+! netCDF-4. This is user-contributed code.
+
+! $Id: tst_io.f90,v 1.7 2009/02/17 13:17:18 ed Exp $
+program tst_io
+  use netcdf ! access to netcdf module
+  implicit none
+  integer, parameter :: prsz1 = 50, prsz2 = 50, &
+       prsz3 = 50, prsz4 = 50, repct = 10
+  integer :: i1, i2, i3, i4, j, k, ticksPerSec
+  real :: psr
+  integer :: clockRate
+  integer :: start, now, wrint1, ncint1, wrint2, ncint2, &
+       wrint3, ncint3, iosb, iosn, size
+  real, dimension (prsz1, prsz2, prsz3, prsz4) :: x
+  character(len = *), parameter :: nclFilenm1 = 'tst_io1.nc', &
+       nclFilenm2 = 'tst_io2.nc', nclFilenm3 = 'tst_io3.nc', &
+       nclFilenm4 = 'tst_io4.nc', nclFilenm5 = 'tst_io5.nc', &
+       nclFilenm6 = 'tst_io6.nc', nclFilenm7 = 'tst_io7.nc', &
+       nclFilenm8 = 'tst_io8.nc', nclFilenm9 = 'tst_io9.nc', &
+       nclFilenm10 = 'tst_io10.nc', nclFilenm11 = 'tst_io11.nc'
+  ! needed for netcdf
+  integer :: ncid, x1id, x2id, x3id, x4id, vrid
+  integer :: vrids, vridt, vridu, vridv, vridw, vridx, vridy, vridz
+
+  psr = 1.7/real(prsz1)
+
+  print *, "Starting data initialization."
+  size = (prsz1 * prsz2 * prsz3 * prsz4 )/ 250000
+  do i1 = 1, prsz1
+     do i2 = 1, prsz2
+        do i3 = 1, prsz3 ! Jackson Pollock it is not
+           do i4 = 1, prsz4
+              x(i1, i2, i3, i4) = sin(i1*psr)*(0.5 + cos(i2*psr))+(psr/i3)+ i4/(10.0*prsz4)
+           enddo
+        enddo
+     enddo
+  enddo
+  call system_clock(start, ticksPerSec)
+  clockRate = 1000/ticksPerSec
+  print 5, size, 1000.0/real(ticksPerSec)
+5 format("Array sizes =", i4, "MB. Clock resolution = ", f6.3, " ms."/)
+
+  ! First the binary writes
+  call system_clock(start, ticksPerSec)
+  write(1, iostat = iosb) x
+  call system_clock(now)
+  wrint1 = now - start
+  call check (iosb, 1)
+  print 1, size, "MB","binary write = ", wrint1 * clockRate
+1 format("Time for", i5, a, a26, i6, " msec. ")
+
+  call system_clock(start)
+  do i1 = 1, repct
+     rewind (2, iostat = iosb)
+     call check (iosb, 2)
+     write(2, iostat = iosb) x
+     call check (iosb, 3)
+  enddo
+  call system_clock(now)
+  wrint2 = now - start
+  call check (iosb, 4)
+  close(2, iostat = iosb)
+  call check (iosb, 5)
+  print 2, size, "MB", repct, " binary rewind/writes = ", wrint2 * clockRate
+2 format("Time for", i5, a, i3, a23, i6," msec. ", a, i6)
+  close(1, iostat = iosb)
+
+  call system_clock(start)
+  write(13, iostat = iosb) x
+  call check (iosb, 6)
+  write(14, iostat = iosb) x
+  call check (iosb, 7)
+  write(15, iostat = iosb) x
+  call check (iosb, 8)
+  write(16, iostat = iosb) x
+  call check (iosb, 9)
+  write(17, iostat = iosb) x
+  call check (iosb, 10)
+  write(18, iostat = iosb) x
+  call check (iosb, 11)
+  write(19, iostat = iosb) x
+  call check (iosb, 12)
+  write(20, iostat = iosb) x
+  call check (iosb, 13)
+  call system_clock(now)
+  wrint3 = now - start
+  print 2, size, "MB", 8, " binary file writes = ", wrint3 * clockRate
+  do i1 = 1, 8
+     close(12 + i1, iostat = iosb)
+     call check (iosb, 14)
+  enddo
+
+  ! Next the netCDF writes
+  call setupNetCDF (nclFilenm1, ncid, vrid, x, prsz1, prsz2, prsz3, prsz4, &
+       x1id, x2id, x3id, x4id, NF90_CLOBBER, 20)
+  call system_clock(start)
+  call check (NF90_PUT_VAR(ncid, vrid, x), 18)
+  call system_clock(now)
+  ncint1 = now - start
+  print 3, size, "MB"," netcdf write = ", ncint1 * clockRate, &
+       real(ncint1)/real (wrint1)
+3 format("Time for", i5, a, a25, i7, " msec. Spd ratio = ", f5.2)
+
+  call check (NF90_CLOSE(ncid), 14)
+
+  call system_clock(start)
+  do i1 = 1, repct
+     call setupNetCDF (nclFilenm1, ncid, vrid, x, prsz1, prsz2, prsz3, prsz4, &
+          x1id, x2id, x3id, x4id, NF90_CLOBBER, 130)
+     call check (NF90_PUT_VAR(ncid, vrid, x), 23 + i1)
+     call check (NF90_CLOSE(ncid), 15)
+  enddo
+  call system_clock(now)
+  ncint2 = now - start
+  print 4, size, repct, " repeated netcdf writes = ", ncint2 * clockRate, &
+       real(ncint2)/real(wrint2);
+4 format("Time for", i5, "MB", i3, a22, i7, " msec. Spd ratio = ", f5.2)
+
+!   call system_clock(start)
+!   call setupNetCDF (nclFilenm3, ncid, vrids, s, prsz1, prsz2, prsz3, prsz4, &
+!        x1id, x2id, x3id, x4id, NF90_CLOBBER, 20)
+!   call setupNetCDF (nclFilenm4, ncid, vridt, t, prsz1, prsz2, prsz3, prsz4, &
+!        x1id, x2id, x3id, x4id, NF90_CLOBBER, 30)
+!   call setupNetCDF (nclFilenm5, ncid, vridu, u, prsz1, prsz2, prsz3, prsz4, &
+!        x1id, x2id, x3id, x4id, NF90_CLOBBER, 40)
+!   call setupNetCDF (nclFilenm6, ncid, vridv, v, prsz1, prsz2, prsz3, prsz4, &
+!        x1id, x2id, x3id, x4id, NF90_CLOBBER, 50)
+!   call setupNetCDF (nclFilenm7, ncid, vridw, w, prsz1, prsz2, prsz3, prsz4, &
+!        x1id, x2id, x3id, x4id, NF90_CLOBBER, 60)
+!   call setupNetCDF (nclFilenm8, ncid, vridx, x, prsz1, prsz2, prsz3, prsz4, &
+!        x1id, x2id, x3id, x4id, NF90_CLOBBER, 70)
+!   call setupNetCDF (nclFilenm9, ncid, vridy, y, prsz1, prsz2, prsz3, prsz4, &
+!        x1id, x2id, x3id, x4id, NF90_CLOBBER, 80)
+!   call setupNetCDF (nclFilenm10, ncid, vridz, z, prsz1, prsz2, prsz3, prsz4, &
+!        x1id, x2id, x3id, x4id, NF90_CLOBBER, 90)
+!   call check (NF90_PUT_VAR(ncid, vrids, s), 118)
+!   call check (NF90_PUT_VAR(ncid, vridt, t), 119)
+!   call check (NF90_PUT_VAR(ncid, vridu, u), 120)
+!   call check (NF90_PUT_VAR(ncid, vridv, v), 121)
+!   call check (NF90_PUT_VAR(ncid, vridw, w), 122)
+!   call check (NF90_PUT_VAR(ncid, vridx, x), 123)
+!   call check (NF90_PUT_VAR(ncid, vridy, y), 124)
+!   call check (NF90_PUT_VAR(ncid, vridz, z), 125)
+!   call system_clock(now)
+!   ncint3 = now - start
+!   call check (NF90_CLOSE(ncid), 16)
+!   print 4, size, 8, " netcdf file writes = ", ncint3 * clockRate, &
+!        real(ncint3)/real(wrint3);
+
+contains
+  subroutine check (st, n) ! checks the return error code
+    integer, intent (in) :: st, n
+    if ((n < 10.and.st /= 0).or.(n > 10.and.st /= NF90_noerr))then
+       print *, "I/O error at", n, " status = ", st
+       stop 2
+    endif
+  end subroutine check
+
+  subroutine setupNetCDF(fn, nc, vr, vrnam, d1, d2, d3, d4, do1, do2, &
+       do3, do4, stat, deb)
+    integer, intent(in) :: d1, d2, d3, d4, stat, deb
+    integer, intent(out) :: do1, do2, do3, do4, vr
+    integer, intent(inout) :: nc
+    integer, dimension(4) :: dimids (4)
+
+    character(len = *), intent(in) :: fn
+    real, dimension (d1, d2, d3, d4), intent (in) :: vrnam
+
+    call check (NF90_CREATE (fn, stat, nc), deb + 1)
+    call check (NF90_DEF_DIM(nc, "d1", d1, do1), deb + 2)
+    call check (NF90_DEF_DIM(nc, "d2", d2, do2), deb + 3)
+    call check (NF90_DEF_DIM(nc, "d3", d3, do3), deb + 4)
+    call check (NF90_DEF_DIM(nc, "d4", d4, do4), deb + 5)
+
+    dimids = (/ do1, do2, do3, do4 /)
+    call check (NF90_DEF_VAR(nc, "data", NF90_REAL, dimids, vr), deb + 6)
+    call check (NF90_ENDDEF (nc), deb + 7)
+
+  end subroutine setupNetCDF
+
+end program tst_io
diff --git a/nf_test/tst_types.f90 b/nf_test/tst_types.f90
new file mode 100644
index 0000000..8a25930
--- /dev/null
+++ b/nf_test/tst_types.f90
@@ -0,0 +1,93 @@
+!     This is part of the netCDF package.
+!     Copyright 2007 University Corporation for Atmospheric Research/Unidata.
+!     See COPYRIGHT file for conditions of use.
+
+!     This program tests netCDF-4 new types from fortran 90.
+
+!     $Id: tst_types.f90,v 1.7 2009/01/25 14:33:44 ed Exp $
+
+program tst_types
+  use typeSizes
+  use netcdf
+  implicit none
+  
+  ! This is the name of the data file we will create.
+  character (len = *), parameter :: FILE_NAME = "tst_types.nc"
+
+  ! Information for the types we create.
+  character (len = *), parameter :: OPAQUE_TYPE_NAME = "Odessyus"
+  character (len = *), parameter :: var_name = "Polyphemus"
+  character (len = 80) :: name_in
+  character (len = 10), parameter :: opaque_data = "0123456789"
+  character (len = *), parameter :: att_name = "att1"
+
+  integer, parameter :: OPAQUE_SIZE = 10
+  integer (kind = EightByteInt) BIG_NUMBER, num_in
+  parameter (BIG_NUMBER = 4294967295_EightByteInt)
+  integer :: ncid, opaque_typeid, varid
+  integer :: size_in, base_typeid_in, nfields_in, class_in
+
+  print *, ''
+  print *,'*** Testing new netCDF-4 types from Fortran 90.'
+  
+  ! Create the netCDF file. 
+  call check(nf90_create(FILE_NAME, nf90_netcdf4, ncid))
+
+  ! Create an opaque type.
+  call check(nf90_def_opaque(ncid, OPAQUE_SIZE, OPAQUE_TYPE_NAME, opaque_typeid))
+
+  ! Write an (global) opaque attribute.
+  call check(nf90_put_att_any(ncid, NF90_GLOBAL, att_name, opaque_typeid, 1, opaque_data))
+
+  ! Create an int64 scalar variable.
+  call check(nf90_def_var(ncid, var_name, nf90_int64, varid))
+
+  ! Write a large integer (too large to fit in 32-bit ints).
+  call check(nf90_put_var(ncid, varid, BIG_NUMBER))
+
+  ! Close the file. 
+  call check(nf90_close(ncid))
+
+  ! Reopen the netCDF file. 
+  call check(nf90_open(FILE_NAME, 0, ncid))
+
+  ! Check the opaque type.
+  call check(nf90_inq_user_type(ncid, opaque_typeid, name_in, size_in, &
+       base_typeid_in, nfields_in, class_in))
+  if (name_in(1:len(OPAQUE_TYPE_NAME)) .ne. OPAQUE_TYPE_NAME .or. &
+       size_in .ne. OPAQUE_SIZE .or. base_typeid_in .ne. 0 .or. &
+       nfields_in .ne. 0 .or. class_in .ne. NF90_OPAQUE) stop 2
+
+  ! Check it again with the inq_opaque call.
+  call check(nf90_inq_opaque(ncid, opaque_typeid, name_in, size_in))
+  if (name_in(1:len(OPAQUE_TYPE_NAME)) .ne. OPAQUE_TYPE_NAME .or. &
+       size_in .ne. OPAQUE_SIZE) stop 2
+
+  ! Check it again with the inq_type call
+!!  call check(nf90_inq_type(ncid, opaque_typeid, name_in, size_in))
+  if (name_in(1:len(OPAQUE_TYPE_NAME)) .ne. OPAQUE_TYPE_NAME .or. &
+       size_in .ne. OPAQUE_SIZE) stop 2
+
+  ! Read in the large number.
+  call check(nf90_get_var(ncid, varid, num_in))
+  if (num_in .ne. BIG_NUMBER) stop 2
+
+  ! Close the file. 
+  call check(nf90_close(ncid))
+  
+  print *,'*** SUCCESS!'
+
+!     This subroutine handles errors by printing an error message and
+!     exiting with a non-zero status.
+contains
+  subroutine check(status)
+    integer, intent ( in) :: status
+    
+    if(status /= nf90_noerr) then 
+      print *, trim(nf90_strerror(status))
+      stop 2
+    end if
+  end subroutine check  
+
+end program tst_types
+
diff --git a/nf_test/tst_types2.f90 b/nf_test/tst_types2.f90
new file mode 100644
index 0000000..cb5e30e
--- /dev/null
+++ b/nf_test/tst_types2.f90
@@ -0,0 +1,259 @@
+!     This is part of the netCDF package.
+!     Copyright 2008 University Corporation for Atmospheric Research/Unidata.
+!     See COPYRIGHT file for conditions of use.
+
+!     This program tests netCDF-4 int64 types from fortran 90.
+
+!     $Id: tst_types2.f90,v 1.2 2009/01/25 14:33:44 ed Exp $
+
+program tst_types2
+  use typeSizes
+  use netcdf
+  implicit none
+  
+  ! This is the name of the data file we will create.
+  character (len = *), parameter :: FILE_NAME = "tst_types2.nc"
+  
+  integer :: ncid, varid1, varid2, varid3, varid4, varid5, varid6, varid7
+  integer :: dimid1, dimid2, dimid3, dimid4, dimid5, dimid6, dimid7
+  integer :: dimids1(1), dimids2(2), dimids3(3), dimids4(4), dimids5(5), dimids6(6), dimids7(7)
+  integer :: i1, i2, i3, i4, i5, i6, i7
+  integer, parameter :: DLEN = 2
+  integer (kind = EightByteInt) :: data1_in(DLEN), data1_out(DLEN)
+  integer (kind = EightByteInt) :: data2_in(DLEN, DLEN), data2_out(DLEN, DLEN)
+  integer (kind = EightByteInt) :: data3_in(DLEN, DLEN, DLEN), data3_out(DLEN, DLEN, DLEN)
+  integer (kind = EightByteInt) :: data4_in(DLEN, DLEN, DLEN, DLEN), data4_out(DLEN, DLEN, DLEN, DLEN)
+  integer (kind = EightByteInt) :: data5_in(DLEN, DLEN, DLEN, DLEN, DLEN), data5_out(DLEN, DLEN, DLEN, DLEN, DLEN)
+  integer (kind = EightByteInt) :: data6_in(DLEN, DLEN, DLEN, DLEN, DLEN, DLEN), data6_out(DLEN, DLEN, DLEN, DLEN, DLEN, DLEN)
+  integer (kind = EightByteInt) :: data7_in(DLEN, DLEN, DLEN, DLEN, DLEN, DLEN, DLEN), &
+       data7_out(DLEN, DLEN, DLEN, DLEN, DLEN, DLEN, DLEN)
+  integer (kind = EightByteInt), parameter :: REALLY_BIG = 9223372036854775807_EightByteInt
+
+  print *, ''
+  print *,'*** Testing netCDF-4 64-bit integer types from Fortran 90.'
+
+  do i1 = 1, DLEN
+     data1_out(i1) = REALLY_BIG
+  end do
+  do i2 = 1, DLEN
+     do i1 = 1, DLEN
+        data2_out(i1, i2) = REALLY_BIG - i1 - i2
+     end do
+  end do
+  do i3 = 1, DLEN
+     do i2 = 1, DLEN
+        do i1 = 1, DLEN
+           data3_out(i1, i2, i3) = REALLY_BIG - i1 - i2 - i3
+        end do
+     end do
+  end do
+  do i4 = 1, DLEN
+     do i3 = 1, DLEN
+        do i2 = 1, DLEN
+           do i1 = 1, DLEN
+              data4_out(i1, i2, i3, i4) = REALLY_BIG - i1 - i2 - i3 - i4
+           end do
+        end do
+     end do
+  end do
+  do i5 = 1, DLEN
+     do i4 = 1, DLEN
+        do i3 = 1, DLEN
+           do i2 = 1, DLEN
+              do i1 = 1, DLEN
+                 data5_out(i1, i2, i3, i4, i5) = REALLY_BIG - i1 - i2 - i3 - i4 - i5
+              end do
+           end do
+        end do
+     end do
+  end do
+  do i6 = 1, DLEN
+     do i5 = 1, DLEN
+        do i4 = 1, DLEN
+           do i3 = 1, DLEN
+              do i2 = 1, DLEN
+                 do i1 = 1, DLEN
+                    data6_out(i1, i2, i3, i4, i5, i6) = REALLY_BIG - i1 - i2 - i3 - i4 - i5 - i6
+                 end do
+              end do
+           end do
+        end do
+     end do
+  end do
+  do i7 = 1, DLEN
+     do i6 = 1, DLEN
+        do i5 = 1, DLEN
+           do i4 = 1, DLEN
+              do i3 = 1, DLEN
+                 do i2 = 1, DLEN
+                    do i1 = 1, DLEN
+                       data7_out(i1, i2, i3, i4, i5, i6, i7) = REALLY_BIG - i1 - i2 - i3 - i4 - i5 - i6 - i7
+                    end do
+                 end do
+              end do
+           end do
+        end do
+     end do
+  end do
+  
+  ! Create the netCDF file. 
+  call check(nf90_create(FILE_NAME, nf90_netcdf4, ncid))
+
+  ! Define dimensions.
+  call check(nf90_def_dim(ncid, "d1", DLEN, dimid1))
+  call check(nf90_def_dim(ncid, "d2", DLEN, dimid2))
+  call check(nf90_def_dim(ncid, "d3", DLEN, dimid3))
+  call check(nf90_def_dim(ncid, "d4", DLEN, dimid4))
+  call check(nf90_def_dim(ncid, "d5", DLEN, dimid5))
+  call check(nf90_def_dim(ncid, "d6", DLEN, dimid6))
+  call check(nf90_def_dim(ncid, "d7", DLEN, dimid7))
+
+  ! Create some int64 variables, from 1 to 7D.
+  dimids1(1) = dimid1
+  call check(nf90_def_var(ncid, "v1", nf90_int64, dimids1, varid1))
+  dimids2(1) = dimid1
+  dimids2(2) = dimid2
+  call check(nf90_def_var(ncid, "v2", nf90_int64, dimids2, varid2))
+  dimids3(1) = dimid1
+  dimids3(2) = dimid2
+  dimids3(3) = dimid3
+  call check(nf90_def_var(ncid, "v3", nf90_int64, dimids3, varid3))
+  dimids4(1) = dimid1
+  dimids4(2) = dimid2
+  dimids4(3) = dimid3
+  dimids4(4) = dimid4
+  call check(nf90_def_var(ncid, "v4", nf90_int64, dimids4, varid4))
+  dimids5(1) = dimid1
+  dimids5(2) = dimid2
+  dimids5(3) = dimid3
+  dimids5(4) = dimid4
+  dimids5(5) = dimid5
+  call check(nf90_def_var(ncid, "v5", nf90_int64, dimids5, varid5))
+  dimids6(1) = dimid1
+  dimids6(2) = dimid2
+  dimids6(3) = dimid3
+  dimids6(4) = dimid4
+  dimids6(5) = dimid5
+  dimids6(6) = dimid6
+  call check(nf90_def_var(ncid, "v6", nf90_int64, dimids6, varid6))
+  dimids7(1) = dimid1
+  dimids7(2) = dimid2
+  dimids7(3) = dimid3
+  dimids7(4) = dimid4
+  dimids7(5) = dimid5
+  dimids7(6) = dimid6
+  dimids7(7) = dimid7
+  call check(nf90_def_var(ncid, "v7", nf90_int64, dimids7, varid7))
+
+  ! Write some large integers.
+  call check(nf90_put_var(ncid, varid1, data1_out))
+  call check(nf90_put_var(ncid, varid2, data2_out))
+  call check(nf90_put_var(ncid, varid3, data3_out))
+  call check(nf90_put_var(ncid, varid4, data4_out))
+  call check(nf90_put_var(ncid, varid5, data5_out))
+  call check(nf90_put_var(ncid, varid6, data6_out))
+  call check(nf90_put_var(ncid, varid7, data7_out))
+
+  ! Close the file. 
+  call check(nf90_close(ncid))
+
+  ! Reopen the netCDF file. 
+  call check(nf90_open(FILE_NAME, 0, ncid))
+
+  ! Read in the large numbers.
+  call check(nf90_get_var(ncid, varid1, data1_in))
+  call check(nf90_get_var(ncid, varid2, data2_in))
+  call check(nf90_get_var(ncid, varid3, data3_in))
+  call check(nf90_get_var(ncid, varid4, data4_in))
+  call check(nf90_get_var(ncid, varid5, data5_in))
+  call check(nf90_get_var(ncid, varid6, data6_in))
+  call check(nf90_get_var(ncid, varid7, data7_in))
+
+  ! Check the values for correctness.
+  do i1 = 1, DLEN
+     if (data1_in(i1) .ne. data1_out(i1)) stop 2
+  end do
+  do i2 = 1, DLEN
+     do i1 = 1, DLEN
+        if (data2_in(i1, i2) .ne. data2_out(i1, i2)) stop 2
+     end do
+  end do
+  do i3 = 1, DLEN
+     do i2 = 1, DLEN
+        do i1 = 1, DLEN
+           if (data3_in(i1, i2, i3) .ne. data3_out(i1, i2, i3)) stop 2
+        end do
+     end do
+  end do
+  do i4 = 1, DLEN
+     do i3 = 1, DLEN
+        do i2 = 1, DLEN
+           do i1 = 1, DLEN
+              if (data4_in(i1, i2, i3, i4) .ne. &
+                   data4_out(i1, i2, i3, i4)) stop 2
+           end do
+        end do
+     end do
+  end do
+  do i5 = 1, DLEN
+     do i4 = 1, DLEN
+        do i3 = 1, DLEN
+           do i2 = 1, DLEN
+              do i1 = 1, DLEN
+                 if (data5_in(i1, i2, i3, i4, i5) .ne. &
+                      data5_out(i1, i2, i3, i4, i5)) stop 2
+              end do
+           end do
+        end do
+     end do
+  end do
+  do i6 = 1, DLEN
+     do i5 = 1, DLEN
+        do i4 = 1, DLEN
+           do i3 = 1, DLEN
+              do i2 = 1, DLEN
+                 do i1 = 1, DLEN
+                    if (data6_in(i1, i2, i3, i4, i5, i6) .ne. &
+                         data6_out(i1, i2, i3, i4, i5, i6)) stop 2
+                 end do
+              end do
+           end do
+        end do
+     end do
+  end do
+  do i7 = 1, DLEN
+     do i6 = 1, DLEN
+        do i5 = 1, DLEN
+           do i4 = 1, DLEN
+              do i3 = 1, DLEN
+                 do i2 = 1, DLEN
+                    do i1 = 1, DLEN
+                       if (data7_in(i1, i2, i3, i4, i5, i6, i7) .ne. &
+                            data7_out(i1, i2, i3, i4, i5, i6, i7)) stop 2
+                    end do
+                 end do
+              end do
+           end do
+        end do
+     end do
+  end do
+
+  ! Close the file. 
+  call check(nf90_close(ncid))
+  
+  print *,'*** SUCCESS!'
+
+!     This subroutine handles errors by printing an error message and
+!     exiting with a non-zero status.
+contains
+  subroutine check(status)
+    integer, intent ( in) :: status
+    
+    if(status /= nf90_noerr) then 
+      print *, trim(nf90_strerror(status))
+      stop 2
+    end if
+  end subroutine check  
+
+end program tst_types2
+
diff --git a/nf_test/util.F b/nf_test/util.F
new file mode 100644
index 0000000..7ec8ada
--- /dev/null
+++ b/nf_test/util.F
@@ -0,0 +1,1449 @@
+!*********************************************************************
+!   Copyright 1996, UCAR/Unidata
+!   See netcdf/COPYRIGHT file for copying and redistribution conditions.
+!   $Id: util.F,v 1.16 2008/12/31 17:54:10 ed Exp $
+!********************************************************************/
+
+
+      SUBROUTINE PRINT_NOK(NOK)
+      IMPLICIT  NONE
+      INTEGER   NOK
+#include "tests.inc"
+
+      IF (VERBOSE .OR. NFAILS .GT. 0) PRINT *, ' '
+      IF (VERBOSE) PRINT *, NOK, ' good comparisons.'
+      END
+
+
+! Is value within external type range? */
+      FUNCTION INRANGE(VALUE, DATATYPE)
+      IMPLICIT  NONE
+      DOUBLEPRECISION   VALUE
+      INTEGER           DATATYPE
+#include "tests.inc"
+
+      DOUBLEPRECISION   MIN
+      DOUBLEPRECISION   MAX
+
+      IF (DATATYPE .EQ. NF_CHAR) THEN
+          MIN = X_CHAR_MIN
+          MAX = X_CHAR_MAX
+      ELSE IF (DATATYPE .EQ. NF_BYTE) THEN
+          MIN = X_BYTE_MIN
+          MAX = X_BYTE_MAX
+      ELSE IF (DATATYPE .EQ. NF_SHORT) THEN
+          MIN = X_SHORT_MIN
+          MAX = X_SHORT_MAX
+      ELSE IF (DATATYPE .EQ. NF_INT) THEN
+          MIN = X_INT_MIN
+          MAX = X_INT_MAX
+      ELSE IF (DATATYPE .EQ. NF_FLOAT) THEN
+          MIN = X_FLOAT_MIN
+          MAX = X_FLOAT_MAX
+      ELSE IF (DATATYPE .EQ. NF_DOUBLE) THEN
+          MIN = X_DOUBLE_MIN
+          MAX = X_DOUBLE_MAX
+      ELSE
+          CALL UDABORT
+      END IF
+
+      INRANGE = (VALUE .GE. MIN) .AND. (VALUE .LE. MAX)
+      END
+
+
+      FUNCTION INRANGE_UCHAR(VALUE, DATATYPE)
+      IMPLICIT  NONE
+      DOUBLEPRECISION   VALUE
+      INTEGER           DATATYPE
+#include "tests.inc"
+
+      IF (DATATYPE .EQ. NF_BYTE) THEN
+          INRANGE_UCHAR = (VALUE .GE. 0) .AND. (VALUE .LE. 255)
+      ELSE
+          INRANGE_UCHAR = INRANGE(VALUE, DATATYPE)
+      END IF
+      END
+
+
+      FUNCTION INRANGE_FLOAT(VALUE, DATATYPE)
+      IMPLICIT  NONE
+      DOUBLEPRECISION   VALUE
+      INTEGER           DATATYPE
+#include "tests.inc"
+
+      DOUBLEPRECISION   MIN
+      DOUBLEPRECISION   MAX
+      REAL              FVALUE
+
+      IF (DATATYPE .EQ. NF_CHAR) THEN
+          MIN = X_CHAR_MIN
+          MAX = X_CHAR_MAX
+      ELSE IF (DATATYPE .EQ. NF_BYTE) THEN
+          MIN = X_BYTE_MIN
+          MAX = X_BYTE_MAX
+      ELSE IF (DATATYPE .EQ. NF_SHORT) THEN
+          MIN = X_SHORT_MIN
+          MAX = X_SHORT_MAX
+      ELSE IF (DATATYPE .EQ. NF_INT) THEN
+          MIN = X_INT_MIN
+          MAX = X_INT_MAX
+      ELSE IF (DATATYPE .EQ. NF_FLOAT) THEN
+          IF (internal_max(NFT_REAL) .LT. X_FLOAT_MAX) THEN
+              MIN = -internal_max(NFT_REAL)
+              MAX = internal_max(NFT_REAL)
+          ELSE
+              MIN = X_FLOAT_MIN
+              MAX = X_FLOAT_MAX
+          END IF
+      ELSE IF (DATATYPE .EQ. NF_DOUBLE) THEN
+          IF (internal_max(NFT_REAL) .LT. X_DOUBLE_MAX) THEN
+              MIN = -internal_max(NFT_REAL)
+              MAX = internal_max(NFT_REAL)
+          ELSE
+              MIN = X_DOUBLE_MIN
+              MAX = X_DOUBLE_MAX
+          END IF
+      ELSE
+          CALL UDABORT
+      END IF
+
+      IF (.NOT.((VALUE .GE. MIN) .AND. (VALUE .LE. MAX))) THEN
+          INRANGE_FLOAT = .FALSE.
+      ELSE
+          FVALUE = VALUE
+          INRANGE_FLOAT = (FVALUE .GE. MIN) .AND. (FVALUE .LE. MAX)
+      END IF
+      END
+
+
+! wrapper for inrange to handle special NF_BYTE/uchar adjustment */
+      function inrange3(value, datatype, itype)
+      implicit          none
+      doubleprecision   value
+      integer           datatype
+      integer           itype
+#include "tests.inc"
+
+      if (itype .eq. NFT_REAL) then
+          inrange3 = inrange_float(value, datatype)
+      else
+          inrange3 = inrange(value, datatype)
+      end if
+      end
+
+
+!
+!  Does x == y, where one is internal and other external (netCDF)?  
+!  Use tolerant comparison based on IEEE FLT_EPSILON or DBL_EPSILON.
+!
+      function equal(x, y, extType, itype)
+      implicit  none
+      doubleprecision   x
+      doubleprecision   y
+      integer           extType         !!/* external data type */
+      integer           itype
+#include "tests.inc"
+
+      doubleprecision   epsilon
+
+      if ((extType .eq. NF_REAL) .or. (itype .eq. NFT_REAL)) then
+          epsilon = 1.19209290E-07
+      else
+          epsilon = 2.2204460492503131E-16
+      end if
+      equal = abs(x-y) .le. epsilon * max( abs(x), abs(y))
+      end
+
+
+! Test whether two int vectors are equal. If so return 1, else 0  */
+        function int_vec_eq(v1, v2, n)
+        implicit        none
+        integer n
+        integer v1(n)
+        integer v2(n)
+#include "tests.inc"
+
+        integer i
+
+        int_vec_eq = .true.
+
+        if (n .le. 0)
+     +      return
+
+        do 1, i=1, n
+            if (v1(i) .ne. v2(i)) then
+                int_vec_eq = .false.
+                return
+            end if
+1       continue
+        end
+
+
+!
+!  Generate random integer from 0 through n-1
+!  Like throwing an n-sided dice marked 0, 1, 2, ..., n-1
+!
+      function roll(n)
+      implicit  none
+      integer   n
+#include "tests.inc"
+
+      doubleprecision   udrand
+      external          udrand
+
+1     roll = (udrand(0) * (n-1)) + 0.5
+      if (roll .ge. n) goto 1
+      end
+
+
+!
+!      Convert an origin-1 cumulative index to a netCDF index vector.
+!       Grosset dimension first; finest dimension last.
+!
+!      Authors: Harvey Davies, Unidata/UCAR, Boulder, Colorado
+!                Steve Emmerson, (same place)
+!
+        function index2ncindexes(index, rank, base, indexes)
+        implicit        none
+        integer         index           !!/* index to be converted */
+        integer         rank            !/* number of dimensions */
+        integer         base(rank)      !/* base(rank) ignored */
+        integer         indexes(rank)   !/* returned FORTRAN indexes */
+#include "tests.inc"
+
+        integer i
+        integer offset
+
+        if (rank .gt. 0) then
+            offset = index - 1
+            do 1, i = rank, 1, -1
+                if (base(i) .eq. 0) then
+                    index2ncindexes = 1
+                    return
+                end if
+                indexes(i) = 1 + mod(offset, base(i))
+                offset = offset / base(i)
+1           continue
+        end if
+        index2ncindexes = 0
+        end
+
+
+!
+!      Convert an origin-1 cumulative index to a FORTRAN index vector.
+!       Finest dimension first; grossest dimension last.
+!
+!      Authors: Harvey Davies, Unidata/UCAR, Boulder, Colorado
+!                Steve Emmerson, (same place)
+!
+        function index2indexes(index, rank, base, indexes)
+        implicit        none
+        integer         index           !/* index to be converted */
+        integer         rank            !/* number of dimensions */
+        integer         base(rank)      !/* base(rank) ignored */
+        integer         indexes(rank)   !/* returned FORTRAN indexes */
+#include "tests.inc"
+
+        integer i
+        integer offset
+
+        if (rank .gt. 0) then
+            offset = index - 1
+            do 1, i = 1, rank
+                if (base(i) .eq. 0) then
+                    index2indexes = 1
+                    return
+                end if
+                indexes(i) = 1 + mod(offset, base(i))
+                offset = offset / base(i)
+1           continue
+        end if
+        index2indexes = 0
+        end
+
+
+!
+!      Convert a FORTRAN index vector to an origin-1 cumulative index.
+!       Finest dimension first; grossest dimension last.
+!
+!      Authors: Harvey Davies, Unidata/UCAR, Boulder, Colorado
+!                Steve Emmerson, (same place)
+!
+        function indexes2index(rank, indexes, base)
+        implicit        none
+        integer         rank            !/* number of dimensions */
+        integer         indexes(rank)   !/* FORTRAN indexes */
+        integer         base(rank)      !/* base(rank) ignored */
+#include "tests.inc"
+
+        integer i
+
+        indexes2index = 0
+        if (rank .gt. 0) then
+            do 1, i = rank, 1, -1
+                indexes2index = (indexes2index-1) * base(i) + indexes(i)
+1           continue
+        end if
+        end
+
+
+#ifdef USE_EXTREME_NUMBERS
+! Generate data values as function of type, rank (-1 for attribute), index */
+      function hash(type, rank, index) 
+      implicit  none
+      integer   type
+      integer   rank
+      integer   index(*)
+#include "tests.inc"
+
+      doubleprecision   base
+      doubleprecision   result
+      integer           d       !/* index of dimension */
+
+        !/* If vector then elements 1 & 2 are min & max. Elements 3 & 4 are */
+        !/* just < min & > max (except for NF_CHAR & NF_DOUBLE) */
+      if (abs(rank) .eq. 1 .and. index(1) .le. 4) then
+          if (index(1) .eq. 1) then
+              if (type .eq. NF_CHAR) then
+                  hash = X_CHAR_MIN
+              else if (type .eq. NF_BYTE) then
+                  hash = X_BYTE_MIN
+              else if (type .eq. NF_SHORT) then
+                  hash = X_SHORT_MIN
+              else if (type .eq. NF_INT) then
+                  hash = X_INT_MIN
+              else if (type .eq. NF_FLOAT) then
+                  hash = X_FLOAT_MIN
+              else if (type .eq. NF_DOUBLE) then
+                  hash = X_DOUBLE_MIN
+              else
+                  call udabort
+              end if
+          else if (index(1) .eq. 2) then
+              if (type .eq. NF_CHAR) then
+                  hash = X_CHAR_MAX
+              else if (type .eq. NF_BYTE) then
+                  hash = X_BYTE_MAX
+              else if (type .eq. NF_SHORT) then
+                  hash = X_SHORT_MAX
+              else if (type .eq. NF_INT) then
+                  hash = X_INT_MAX
+              else if (type .eq. NF_FLOAT) then
+                  hash = X_FLOAT_MAX
+              else if (type .eq. NF_DOUBLE) then
+                  hash = X_DOUBLE_MAX
+              else
+                  call udabort
+              end if
+          else if (index(1) .eq. 3) then
+              if (type .eq. NF_CHAR) then
+                  hash = ichar('A')
+              else if (type .eq. NF_BYTE) then
+                  hash = X_BYTE_MIN-1.0
+              else if (type .eq. NF_SHORT) then
+                  hash = X_SHORT_MIN-1.0
+              else if (type .eq. NF_INT) then
+                  hash = X_INT_MIN
+              else if (type .eq. NF_FLOAT) then
+                  hash = X_FLOAT_MIN
+              else if (type .eq. NF_DOUBLE) then
+                  hash = -1.0
+              else
+                  call udabort
+              end if
+          else if (index(1) .eq. 4) then
+              if (type .eq. NF_CHAR) then
+                  hash = ichar('Z')
+              else if (type .eq. NF_BYTE) then
+                  hash = X_BYTE_MAX+1.0
+              else if (type .eq. NF_SHORT) then
+                  hash = X_SHORT_MAX+1.0
+              else if (type .eq. NF_INT) then
+                  hash = X_INT_MAX+1.0
+              else if (type .eq. NF_FLOAT) then
+                  hash = X_FLOAT_MAX
+              else if (type .eq. NF_DOUBLE) then
+                  hash = 1.0
+              else
+                  call udabort
+              end if
+          end if
+      else
+          if (type .eq. NF_CHAR) then
+              base = 2
+          else if (type .eq. NF_BYTE) then
+              base = -2
+          else if (type .eq. NF_SHORT) then
+              base = -5
+          else if (type .eq. NF_INT) then
+              base = -20
+          else if (type .eq. NF_FLOAT) then
+              base = -9
+          else if (type .eq. NF_DOUBLE) then
+              base = -10
+          else
+              stop 2
+          end if
+
+          if (rank .lt. 0) then
+              result = base * 7
+          else
+              result = base * (rank + 1)
+          end if
+
+!         /*
+!          * NB: Finest netCDF dimension assumed first.
+!          */
+          do 1, d = abs(rank), 1, -1
+              result = base * (result + index(d) - 1)
+1         continue
+          hash = result
+      end if
+      end
+#else /* USE_EXTREME_NUMBERS */
+#define SANE_SHORT 3333
+#define SANE_INT 2222
+#define SANE_FLOAT 300.0
+#define SANE_DOUBLE 1000.0
+
+! Generate data values as function of type, rank (-1 for attribute), index */
+      function hash(type, rank, index) 
+      implicit  none
+      integer   type
+      integer   rank
+      integer   index(*)
+#include "tests.inc"
+
+      doubleprecision   base
+      doubleprecision   result
+      integer           d       !/* index of dimension */
+
+        !/* If vector then elements 1 & 2 are min & max. Elements 3 & 4 are */
+        !/* just < min & > max (except for NF_CHAR & NF_DOUBLE) */
+      if (abs(rank) .eq. 1 .and. index(1) .le. 4) then
+          if (index(1) .eq. 1) then
+              if (type .eq. NF_CHAR) then
+                  hash = X_CHAR_MIN
+              else if (type .eq. NF_BYTE) then
+                  hash = X_BYTE_MIN
+              else if (type .eq. NF_SHORT) then
+                  hash = SANE_SHORT
+              else if (type .eq. NF_INT) then
+                  hash = SANE_INT
+              else if (type .eq. NF_FLOAT) then
+                  hash = SANE_FLOAT
+              else if (type .eq. NF_DOUBLE) then
+                  hash = SANE_DOUBLE
+              else
+                  call udabort
+              end if
+          else if (index(1) .eq. 2) then
+              if (type .eq. NF_CHAR) then
+                  hash = X_CHAR_MAX
+              else if (type .eq. NF_BYTE) then
+                  hash = X_BYTE_MAX
+              else if (type .eq. NF_SHORT) then
+                  hash = SANE_SHORT
+              else if (type .eq. NF_INT) then
+                  hash = SANE_INT
+              else if (type .eq. NF_FLOAT) then
+                  hash = SANE_FLOAT
+              else if (type .eq. NF_DOUBLE) then
+                  hash = SANE_DOUBLE
+              else
+                  call udabort
+              end if
+          else if (index(1) .eq. 3) then
+              if (type .eq. NF_CHAR) then
+                  hash = ichar('A')
+              else if (type .eq. NF_BYTE) then
+                  hash = X_BYTE_MIN-1.0
+              else if (type .eq. NF_SHORT) then
+                  hash = SANE_SHORT-1.0
+              else if (type .eq. NF_INT) then
+                  hash = SANE_INT
+              else if (type .eq. NF_FLOAT) then
+                  hash = SANE_FLOAT
+              else if (type .eq. NF_DOUBLE) then
+                  hash = -1.0
+              else
+                  call udabort
+              end if
+          else if (index(1) .eq. 4) then
+              if (type .eq. NF_CHAR) then
+                  hash = ichar('Z')
+              else if (type .eq. NF_BYTE) then
+                  hash = X_BYTE_MAX+1.0
+              else if (type .eq. NF_SHORT) then
+                  hash = SANE_SHORT+1.0
+              else if (type .eq. NF_INT) then
+                  hash = SANE_INT+1.0
+              else if (type .eq. NF_FLOAT) then
+                  hash = SANE_FLOAT
+              else if (type .eq. NF_DOUBLE) then
+                  hash = 1.0
+              else
+                  call udabort
+              end if
+          end if
+      else
+          if (type .eq. NF_CHAR) then
+              base = 2
+          else if (type .eq. NF_BYTE) then
+              base = -2
+          else if (type .eq. NF_SHORT) then
+              base = -5
+          else if (type .eq. NF_INT) then
+              base = -20
+          else if (type .eq. NF_FLOAT) then
+              base = -9
+          else if (type .eq. NF_DOUBLE) then
+              base = -10
+          else
+              stop 2
+          end if
+
+          if (rank .lt. 0) then
+              result = base * 7
+          else
+              result = base * (rank + 1)
+          end if
+
+!         /*
+!          * NB: Finest netCDF dimension assumed first.
+!          */
+          do 1, d = abs(rank), 1, -1
+              result = base * (result + index(d) - 1)
+1         continue
+          hash = result
+      end if
+      end
+#endif
+
+! wrapper for hash to handle special NC_BYTE/uchar adjustment */
+      function hash4(type, rank, index, itype)
+      implicit  none
+      integer   type
+      integer   rank
+      integer   index(*)
+      integer   itype
+#include "tests.inc"
+
+      hash4 = hash( type, rank, index )
+      if ((itype .eq. NFT_CHAR) .and. (type .eq. NF_BYTE) .and. 
+     +    (hash4 .ge. -128) .and. (hash4 .lt. 0)) hash4 = hash4 + 256
+      end
+
+
+      integer function char2type(letter)
+      implicit          none
+      character*1       letter
+#include "tests.inc"
+
+      if (letter .eq. 'c') then
+          char2type = NF_CHAR
+      else if (letter .eq. 'b') then
+          char2type = NF_BYTE
+      else if (letter .eq. 's') then
+          char2type = NF_SHORT
+      else if (letter .eq. 'i') then
+          char2type = NF_INT
+      else if (letter .eq. 'f') then
+          char2type = NF_FLOAT
+      else if (letter .eq. 'd') then
+          char2type = NF_DOUBLE
+      else
+        stop 2
+      end if
+      end
+
+
+      subroutine init_dims(digit)
+      implicit          none
+      character*1       digit(NDIMS)
+#include "tests.inc"
+
+      integer   dimid                   !/* index of dimension */
+      do 1, dimid = 1, NDIMS
+          if (dimid .eq. RECDIM) then
+              dim_len(dimid) = NRECS
+          else
+              dim_len(dimid) = dimid - 1
+          endif
+          dim_name(dimid) = 'D' // digit(dimid)
+1     continue
+      end
+
+
+      subroutine init_gatts(type_letter)
+      implicit          none
+      character*1       type_letter(NTYPES)
+#include "tests.inc"
+
+      integer   attid
+      integer   char2type
+
+      do 1, attid = 1, NTYPES
+          gatt_name(attid) = 'G' // type_letter(attid)
+          gatt_len(attid) = attid
+          gatt_type(attid) = char2type(type_letter(attid))
+1     continue
+      end
+
+
+      integer function prod(nn, sp)
+      implicit  none
+      integer   nn
+      integer   sp(MAX_RANK)
+#include "tests.inc"
+
+      integer   i
+
+      prod = 1
+      do 1, i = 1, nn
+          prod = prod * sp(i)
+1     continue
+      end
+
+
+!
+!   define global variables:
+!   dim_name, dim_len, 
+!   var_name, var_type, var_rank, var_shape, var_natts, var_dimid, var_nels
+!   att_name, gatt_name, att_type, gatt_type, att_len, gatt_len
+!
+        subroutine init_gvars
+        implicit        none
+#include "tests.inc"
+
+        integer         max_dim_len(MAX_RANK)
+        character*1     type_letter(NTYPES)
+        character*1     digit(10)
+
+        integer rank
+        integer vn              !/* var number */
+        integer xtype           !/* index of type */
+        integer an              !/* origin-0 cumulative attribute index */
+        integer nvars
+        integer jj
+        integer ntypes
+        integer tc
+        integer tmp(MAX_RANK)
+        integer ac              !/* attribute index */
+        integer dn              !/* dimension number */
+        integer prod            !/* function */
+        integer char2type       !/* function */
+        integer err
+
+        data    max_dim_len     /0, MAX_DIM_LEN, MAX_DIM_LEN/
+        data    type_letter     /'c', 'b', 's', 'i', 'f', 'd'/
+        data    digit           /'r', '1', '2', '3', '4', '5',
+     +                           '6', '7', '8', '9'/
+
+        max_dim_len(1) = MAX_DIM_LEN + 1
+
+        call init_dims(digit)
+
+        vn = 1
+        xtype = 1
+        an = 0
+
+!       /* Loop over variable ranks */
+        do 1, rank = 0, MAX_RANK
+            nvars = prod(rank, max_dim_len)
+
+            !/* Loop over variable shape vectors */
+            do 2, jj = 1, nvars                         !/* 1, 5, 20, 80 */
+                !/* number types of this shape */
+                if (rank .lt. 2) then
+                    ntypes = NTYPES                     !/* 6 */
+                else
+                    ntypes = 1
+                end if
+
+                !/* Loop over external data types */
+                do 3, tc = 1, ntypes                    !/* 6, 1 */
+                    var_name(vn) = type_letter(xtype)
+                    var_type(vn) = char2type(type_letter(xtype))
+                    var_rank(vn) = rank
+                    if (rank .eq. 0) then
+                        var_natts(vn) = mod(vn - 1, MAX_NATTS + 1)
+                    else
+                        var_natts(vn) = 0
+                    end if
+
+                    do 4, ac = 1, var_natts(vn)
+                        attname(ac,vn) = 
+     +                      type_letter(1+mod(an, NTYPES))
+                        attlen(ac,vn) = an
+                        atttype(ac,vn) =
+     +                      char2type(type_letter(1+mod(an, NTYPES)))
+                        an = an + 1
+4                   continue
+
+                    !/* Construct initial shape vector */
+                    err = index2ncindexes(jj, rank, max_dim_len, tmp)
+                    do 5, dn = 1, rank
+                        var_dimid(dn,vn) = tmp(1+rank-dn)
+5                   continue
+
+                    var_nels(vn) = 1
+                    do 6, dn = 1, rank
+                        if (dn .lt. rank) then
+                            var_dimid(dn,vn) = var_dimid(dn,vn) + 1
+                        end if
+                        if (var_dimid(dn,vn) .gt. 9) then
+                            stop 2
+                        end if
+                        var_name(vn)(rank+2-dn:rank+2-dn) = 
+     +                      digit(var_dimid(dn,vn))
+                        if (var_dimid(dn,vn) .ne. RECDIM) then
+                            var_shape(dn,vn) = var_dimid(dn,vn) - 1
+                        else
+                            var_shape(dn,vn) = NRECS
+                        end if
+                        var_nels(vn) = var_nels(vn) * var_shape(dn,vn)
+6                   continue
+
+                    vn = vn + 1
+                    xtype = 1 + mod(xtype, NTYPES)
+3               continue
+2           continue
+1       continue
+
+        call init_gatts(type_letter)
+        end
+
+
+! define dims defined by global variables */
+        subroutine def_dims(ncid)
+        implicit        none
+        integer         ncid
+#include "tests.inc"
+
+        integer         err             !/* status */
+        integer         i
+        integer         dimid           !/* dimension id */
+
+        do 1, i = 1, NDIMS
+            if (i .eq. RECDIM) then
+                err = nf_def_dim(ncid, dim_name(i), NF_UNLIMITED,
+     +                           dimid)
+            else
+                err = nf_def_dim(ncid, dim_name(i), dim_len(i),
+     +                           dimid)
+            end if
+            if (err .ne. 0) then
+                call errore('nf_def_dim: ', err)
+            end if
+1       continue
+        end
+
+
+! define vars defined by global variables */
+        subroutine def_vars(ncid)
+        implicit        none
+        integer         ncid
+#include "tests.inc"
+
+        integer         err             !/* status */
+        integer         i
+        integer         var_id
+
+        do 1, i = 1, NVARS
+            err = nf_def_var(ncid, var_name(i), var_type(i), 
+     +                       var_rank(i), var_dimid(1,i), var_id)
+            if (err .ne. 0) then
+                call errore('nf_def_var: ', err)
+            end if
+1       continue
+        end
+
+
+! put attributes defined by global variables */
+        subroutine put_atts(ncid)
+        implicit        none
+        integer         ncid
+#include "tests.inc"
+
+        integer                 err             !/* netCDF status */
+        integer                 i               !/* variable index (0 => global 
+                                                ! * attribute */
+        integer                 k               !/* attribute index */
+        integer                 j               !/* index of attribute */
+        integer                 ndx(1)
+        logical                 allInRange
+        doubleprecision         att(MAX_NELS)
+        character*(MAX_NELS+2)  catt
+
+        do 1, i = 0, NVARS      !/* var 0 => NF_GLOBAL attributes */
+            do 2, j = 1, NATTS(i)
+                if (NF_CHAR .eq. ATT_TYPE(j,i)) then
+                    catt = ' '
+                    do 3, k = 1, ATT_LEN(j,i)
+                        ndx(1) = k
+                        catt(k:k) = char(int(hash(ATT_TYPE(j,i), -1, 
+     +                                   ndx)))
+3                   continue
+!                   /*
+!                    * The following ensures that the text buffer doesn't
+!                    * start with 4 zeros (which is a CFORTRAN NULL pointer
+!                    * indicator) yet contains a zero (which causes the
+!                    * CFORTRAN interface to pass the address of the
+!                    * actual text buffer).
+!                    */
+                    catt(ATT_LEN(j,i)+1:ATT_LEN(j,i)+1) = char(1)
+                    catt(ATT_LEN(j,i)+2:ATT_LEN(j,i)+2) = char(0)
+
+                    err = nf_put_att_text(ncid, varid(i), 
+     +                                    ATT_NAME(j,i),
+     +                                    ATT_LEN(j,i), catt)
+                    if (err .ne. 0) then
+                        call errore('nf_put_att_text: ', err)
+                    end if
+                else
+                    allInRange = .true.
+                    do 4, k = 1, ATT_LEN(j,i)
+                        ndx(1) = k
+                        att(k) = hash(ATT_TYPE(j,i), -1, ndx)
+                        allInRange = allInRange .and.
+     +                               inRange(att(k), ATT_TYPE(j,i))
+4                   continue
+                    err = nf_put_att_double(ncid, varid(i),
+     +                                      ATT_NAME(j,i),
+     +                                      ATT_TYPE(j,i),
+     +                                      ATT_LEN(j,i), att)
+                    if (allInRange) then
+                        if (err .ne. 0) then
+                            call errore('nf_put_att_double: ', err)
+                        end if
+                    else
+                        if (err .ne. NF_ERANGE) then
+                            call errore(
+     +                  'type-conversion range error: status = ',
+     +                          err)
+                        end if
+                    end if
+                end if
+2           continue
+1       continue
+        end
+
+
+! put variables defined by global variables */
+        subroutine put_vars(ncid)
+        implicit        none
+        integer                 ncid
+#include "tests.inc"
+
+        integer                 start(MAX_RANK)
+        integer                 index(MAX_RANK)
+        integer                 err             !/* netCDF status */
+        integer                 i
+        integer                 j
+        doubleprecision         value(MAX_NELS)
+        character*(MAX_NELS+2)  text
+        logical                 allInRange
+
+        do 1, j = 1, MAX_RANK
+            start(j) = 1
+1       continue
+
+        do 2, i = 1, NVARS
+            allInRange = .true.
+            do 3, j = 1, var_nels(i)
+                err = index2indexes(j, var_rank(i), var_shape(1,i), 
+     +                              index)
+                if (err .ne. 0) then
+                    call errori(
+     +                  'Error calling index2indexes() for var ', j)
+                end if
+                if (var_name(i)(1:1) .eq. 'c') then
+                    text(j:j) = 
+     +                  char(int(hash(var_type(i), var_rank(i), index)))
+                else
+                    value(j)  = hash(var_type(i), var_rank(i), index)
+                    allInRange = allInRange .and.
+     +                  inRange(value(j), var_type(i))
+                end if
+3           continue
+            if (var_name(i)(1:1) .eq. 'c') then
+!               /*
+!                * The following statement ensures that the first 4
+!                * characters in 'text' are not all zeros (which is
+!                * a cfortran.h NULL indicator) and that the string
+!                * contains a zero (which will cause the address of the
+!                * actual string buffer to be passed).
+!                */
+                text(var_nels(i)+1:var_nels(i)+1) = char(1)
+                text(var_nels(i)+2:var_nels(i)+2) = char(0)
+                err = nf_put_vara_text(ncid, i, start, var_shape(1,i), 
+     +                                 text)
+                if (err .ne. 0) then
+                    call errore('nf_put_vara_text: ', err)
+                end if
+            else
+                err = nf_put_vara_double(ncid, i, start, var_shape(1,i),
+     +                                   value)
+                if (allInRange) then
+                    if (err .ne. 0) then
+                        call errore('nf_put_vara_double: ', err)
+                    end if
+                else
+                    if (err .ne. NF_ERANGE) then
+                        call errore(
+     +                      'type-conversion range error: status = ', 
+     +                      err)
+                    end if
+                end if
+            end if
+2       continue
+        end
+
+
+! Create & write all of specified file using global variables */
+        subroutine write_file(filename) 
+        implicit        none
+        character*(*)   filename
+#include "tests.inc"
+
+        integer ncid            !/* netCDF id */
+        integer err             !/* netCDF status */
+
+        err = nf_create(filename, NF_CLOBBER, ncid)
+        if (err .ne. 0) then
+            call errore('nf_create: ', err)
+        end if
+
+        call def_dims(ncid)
+        call def_vars(ncid)
+        call put_atts(ncid)
+        err = nf_enddef(ncid)
+        if (err .ne. 0) then
+            call errore('nf_enddef: ', err)
+        end if
+        call put_vars(ncid)
+
+        err = nf_close(ncid)
+        if (err .ne. 0) then
+            call errore('nf_close: ', err)
+        end if
+        end
+
+
+!
+! check dimensions of specified file have expected name & length
+!
+        subroutine check_dims(ncid)
+        implicit        none
+        integer         ncid
+#include "tests.inc"
+
+        character*(NF_MAX_NAME) name
+        integer                 length
+        integer                 i
+        integer                 err           !/* netCDF status */
+
+        do 1, i = 1, NDIMS
+            err = nf_inq_dim(ncid, i, name, length)
+            if (err .ne. 0) then
+                call errore('nf_inq_dim: ', err)
+            end if
+            if (name .ne. dim_name(i)) then
+                call errori('Unexpected name of dimension ', i)
+            end if
+            if (length .ne. dim_len(i)) then
+                call errori('Unexpected length of dimension ', i)
+            end if
+1       continue
+        end
+
+
+!
+! check variables of specified file have expected name, type, shape & values
+!
+        subroutine check_vars(ncid)
+        implicit        none
+        integer         ncid
+#include "tests.inc"
+
+        integer                 index(MAX_RANK)
+        integer                 err             !/* netCDF status */
+        integer                 i
+        integer                 j
+        character*1             text
+        doubleprecision         value
+        integer                 datatype
+        integer                 ndims
+        integer                 natt
+        integer                 dimids(MAX_RANK)
+        logical                 isChar
+        doubleprecision         expect
+        character*(NF_MAX_NAME) name
+        integer                 length
+        integer                 nok             !/* count of valid comparisons */
+
+        nok = 0
+
+        do 1, i = 1, NVARS
+            isChar = var_type(i) .eq. NF_CHAR
+            err = nf_inq_var(ncid, i, name, datatype, ndims, dimids, 
+     +          natt)
+            if (err .ne. 0) then
+                call errore('nf_inq_var: ', err)
+            end if
+            if (name .ne. var_name(i)) then
+                call errori('Unexpected var_name for variable ', i)
+            end if
+            if (datatype .ne. var_type(i))  then
+                call errori('Unexpected type for variable ', i)
+            end if
+            if (ndims .ne. var_rank(i))  then
+                call errori('Unexpected rank for variable ', i)
+            end if
+            do 2, j = 1, ndims
+                err = nf_inq_dim(ncid, dimids(j), name, length)
+                if (err .ne. 0) then
+                    call errore('nf_inq_dim: ', err)
+                end if
+                if (length .ne. var_shape(j,i))  then
+                    call errori('Unexpected shape for variable ', i)
+                end if
+2           continue
+            do 3, j = 1, var_nels(i)
+                err = index2indexes(j, var_rank(i), var_shape(1,i), 
+     +                  index)
+                if (err .ne. 0)  then
+                    call errori('error in index2indexes() 2, variable ',
+     +                          i)
+                end if
+                expect = hash(var_type(i), var_rank(i), index )
+                if (isChar) then
+                    err = nf_get_var1_text(ncid, i, index, text)
+                    if (err .ne. 0) then
+                        call errore('nf_get_var1_text: ', err)
+                    end if
+                    if (ichar(text) .ne. expect) then
+                        call errori(
+     +              'Var value read not that expected for variable ', i)
+                    else
+                        nok = nok + 1
+                    end if
+                else
+                    err = nf_get_var1_double(ncid, i, index, value)
+                    if (inRange(expect,var_type(i))) then
+                        if (err .ne. 0) then
+                            call errore('nf_get_var1_double: ', err)
+                        else
+                            if (.not. equal(value,expect,var_type(i),
+     +                          NFT_DOUBLE)) then
+                                call errori(
+     +              'Var value read not that expected for variable ', i)
+                            else
+                                nok = nok + 1
+                            end if
+                        end if
+                    end if
+                end if
+3           continue
+1       continue
+        call print_nok(nok)
+        end
+
+
+!
+! check attributes of specified file have expected name, type, length & values
+!
+        subroutine check_atts(ncid) 
+        implicit        none
+        integer         ncid
+#include "tests.inc"
+
+        integer                 err             !/* netCDF status */
+        integer                 i
+        integer                 j
+        integer                 k
+        integer                 vid             !/* "variable" ID */
+        integer                 datatype
+        integer                 ndx(1)
+        character*(NF_MAX_NAME) name
+        integer                 length
+        character*(MAX_NELS)    text
+        doubleprecision         value(MAX_NELS)
+        doubleprecision         expect
+        integer                 nok             !/* count of valid comparisons */
+
+        nok = 0
+
+        do 1, vid = 0, NVARS
+            i = varid(vid)
+
+            do 2, j = 1, NATTS(i)
+                err = nf_inq_attname(ncid, i, j, name)
+                if (err .ne. 0) then
+                    call errore('nf_inq_attname: ', err)
+                end if
+                if (name .ne. ATT_NAME(j,i)) then
+                    call errori(
+     +                  'nf_inq_attname: unexpected name for var ', i)
+                end if
+                err = nf_inq_att(ncid, i, name, datatype, length)
+                if (err .ne. 0) then
+                    call errore('nf_inq_att: ', err)
+                end if
+                if (datatype .ne. ATT_TYPE(j,i)) then
+                    call errori('nf_inq_att: unexpected type for var ',
+     +                         i)
+                end if
+                if (length .ne. ATT_LEN(j,i)) then
+                    call errori(
+     +                  'nf_inq_att: unexpected length for var ', i)
+                end if
+                if (datatype .eq. NF_CHAR) then
+                    err = nf_get_att_text(ncid, i, name, text)
+                    if (err .ne. 0) then
+                        call errore('nf_get_att_text: ', err)
+                    end if
+                    do 3, k = 1, ATT_LEN(j,i)
+                        ndx(1) = k
+                        if (ichar(text(k:k)) .ne. hash(datatype, -1, 
+     +                                                 ndx))
+     +                  then
+                            call errori(
+     +          'nf_get_att_text: unexpected value for var ', i)
+                        else
+                            nok = nok + 1
+                        end if
+3                   continue
+                else
+                    err = nf_get_att_double(ncid, i, name, value)
+                    do 4, k = 1, ATT_LEN(j,i)
+                        ndx(1) = k
+                        expect = hash(datatype, -1, ndx)
+                        if (inRange(expect,ATT_TYPE(j,i))) then
+                            if (err .ne. 0) then
+                                call errore('nf_get_att_double: ', err)
+                            end if
+                            if (.not. equal(value(k), expect,
+     +                          ATT_TYPE(j,i), NFT_DOUBLE)) then
+                                call errori(
+     +                  'Att value read not that expected for var ', i)
+                            else
+                                nok = nok + 1
+                            end if
+                        end if
+4                   continue
+                end if
+2           continue
+1       continue
+        call print_nok(nok)
+        end
+
+
+! Check file (dims, vars, atts) corresponds to global variables */
+        subroutine check_file(filename) 
+        implicit        none
+        character*(*)   filename
+#include "tests.inc"
+
+        integer ncid            !/* netCDF id */
+        integer err             !/* netCDF status */
+
+        err = nf_open(filename, NF_NOWRITE, ncid)
+        if (err .ne. 0) then
+            call errore('nf_open: ', err)
+        else
+            call check_dims(ncid)
+            call check_vars(ncid)
+            call check_atts(ncid)
+            err = nf_close (ncid)
+            if (err .ne. 0) then
+                call errore('nf_close: ', err)
+            end if
+        end if
+        end
+
+
+!
+! Functions for accessing attribute test data.
+!
+! NB: 'varid' is 0 for global attributes; thus, global attributes can
+! be handled in the same loop as variable attributes.
+!
+
+      FUNCTION VARID(VID)
+      IMPLICIT NONE
+      INTEGER VID
+#include "tests.inc"
+      IF (VID .LT. 1) THEN
+          VARID = NF_GLOBAL
+      ELSE
+          VARID = VID
+      ENDIF
+      end
+
+
+      FUNCTION NATTS(VID)
+      IMPLICIT  NONE
+      INTEGER VID
+#include "tests.inc"
+      IF (VID .LT. 1) THEN
+          NATTS = NGATTS
+      ELSE
+          NATTS = VAR_NATTS(VID)
+      ENDIF
+      END
+
+
+      FUNCTION ATT_NAME(J,VID)
+      IMPLICIT  NONE
+      INTEGER J
+      INTEGER VID
+#include "tests.inc"
+      IF (VID .LT. 1) THEN
+          ATT_NAME = GATT_NAME(J)
+      ELSE
+          ATT_NAME = ATTNAME(J,VID)
+      ENDIF
+      END
+
+
+      FUNCTION ATT_TYPE(J,VID)
+      IMPLICIT  NONE
+      INTEGER J
+      INTEGER VID
+#include "tests.inc"
+      IF (VID .LT. 1) THEN
+          ATT_TYPE = GATT_TYPE(J)
+      ELSE
+          ATT_TYPE = ATTTYPE(J,VID)
+      ENDIF
+      END
+
+
+      FUNCTION ATT_LEN(J,VID)
+      IMPLICIT  NONE
+      INTEGER J
+      INTEGER VID
+#include "tests.inc"
+      IF (VID .LT. 1) THEN
+          ATT_LEN = GATT_LEN(J)
+      ELSE
+          ATT_LEN = ATTLEN(J,VID)
+      ENDIF
+      END
+
+
+!
+! Return the minimum value of an internal type.
+!
+        function internal_min(type)
+        implicit        none
+        integer         type
+	doubleprecision	min_schar
+	doubleprecision	min_short
+	doubleprecision	min_int
+	doubleprecision	min_long
+	doubleprecision	max_float
+	doubleprecision	max_double
+#include "tests.inc"
+
+        if (type .eq. NFT_CHAR) then
+            internal_min = 0
+        else if (type .eq. NFT_INT1) then
+#if NF_INT1_IS_C_SIGNED_CHAR
+            internal_min = min_schar()
+#endif
+#if NF_INT1_IS_C_SHORT
+            internal_min = min_short()
+#endif
+#if NF_INT1_IS_C_INT
+            internal_min = min_int()
+#endif
+#if NF_INT1_IS_C_LONG
+            internal_min = min_long()
+#endif
+        else if (type .eq. NFT_INT2) then
+#if NF_INT2_IS_C_SHORT
+            internal_min = min_short()
+#endif            
+#if NF_INT2_IS_C_INT
+            internal_min = min_int()
+#endif            
+#if NF_INT2_IS_C_LONG
+            internal_min = min_long()
+#endif
+        else if (type .eq. NFT_INT) then
+#if NF_INT_IS_C_INT
+            internal_min = min_int()
+#endif            
+#if NF_INT_IS_C_LONG
+            internal_min = min_long()
+#endif
+        else if (type .eq. NFT_REAL) then
+#if NF_REAL_IS_C_FLOAT
+            internal_min = -max_float()
+#endif
+#if NF_REAL_IS_C_DOUBLE
+            internal_min = -max_double()
+#endif
+        else if (type .eq. NFT_DOUBLE) then
+#if NF_DOUBLEPRECISION_IS_C_DOUBLE
+            internal_min = -max_double()
+#endif
+#if NF_DOUBLEPRECISION_IS_C_FLOAT
+            internal_min = -max_float()
+#endif
+        else
+            stop 2
+        end if
+        end
+
+
+!
+! Return the maximum value of an internal type.
+!
+        function internal_max(type)
+        implicit        none
+        integer         type
+	doubleprecision	max_schar
+	doubleprecision	max_short
+	doubleprecision	max_int
+	doubleprecision	max_long
+	doubleprecision	max_float
+	doubleprecision	max_double
+#include "tests.inc"
+
+        if (type .eq. NFT_CHAR) then
+            internal_max = 255
+        else if (type .eq. NFT_INT1) then
+#if NF_INT1_IS_C_SIGNED_CHAR
+            internal_max = max_schar()
+#endif
+#if NF_INT1_IS_C_SHORT
+            internal_max = max_short()
+#endif
+#if NF_INT1_IS_C_INT
+            internal_max = max_int()
+#endif
+#if NF_INT1_IS_C_LONG
+            internal_max = max_long()
+#endif
+        else if (type .eq. NFT_INT2) then
+#if NF_INT2_IS_C_SHORT
+            internal_max = max_short()
+#endif
+#if NF_INT2_IS_C_INT
+            internal_max = max_int()
+#endif
+#if NF_INT2_IS_C_LONG
+            internal_max = max_long()
+#endif
+        else if (type .eq. NFT_INT) then
+#if NF_INT_IS_C_INT
+            internal_max = max_int()
+#endif
+#if NF_INT_IS_C_LONG
+            internal_max = max_long()
+#endif
+        else if (type .eq. NFT_REAL) then
+#if NF_REAL_IS_C_FLOAT
+            internal_max = max_float()
+#endif
+#if NF_REAL_IS_C_DOUBLE
+            internal_max = max_double()
+#endif
+        else if (type .eq. NFT_DOUBLE) then
+#if NF_DOUBLEPRECISION_IS_C_DOUBLE
+            internal_max = max_double()
+#endif            
+#if NF_DOUBLEPRECISION_IS_C_FLOAT
+            internal_max = max_float()
+#endif
+        else
+            stop 2
+        end if
+        end
+
+
+!
+! Return the minimum value of an external type.
+!
+        function external_min(type)
+        implicit        none
+        integer         type
+#include "tests.inc"
+
+        if (type .eq. NF_BYTE) then
+            external_min = X_BYTE_MIN
+        else if (type .eq. NF_CHAR) then
+            external_min = X_CHAR_MIN
+        else if (type .eq. NF_SHORT) then
+            external_min = X_SHORT_MIN
+        else if (type .eq. NF_INT) then
+            external_min = X_INT_MIN
+        else if (type .eq. NF_FLOAT) then
+            external_min = X_FLOAT_MIN
+        else if (type .eq. NF_DOUBLE) then
+            external_min = X_DOUBLE_MIN
+        else
+            stop 2
+        end if
+        end
+
+
+!
+! Return the maximum value of an internal type.
+!
+        function external_max(type)
+        implicit        none
+        integer         type
+#include "tests.inc"
+
+        if (type .eq. NF_BYTE) then
+            external_max = X_BYTE_MAX
+        else if (type .eq. NF_CHAR) then
+            external_max = X_CHAR_MAX
+        else if (type .eq. NF_SHORT) then
+            external_max = X_SHORT_MAX
+        else if (type .eq. NF_INT) then
+            external_max = X_INT_MAX
+        else if (type .eq. NF_FLOAT) then
+            external_max = X_FLOAT_MAX
+        else if (type .eq. NF_DOUBLE) then
+            external_max = X_DOUBLE_MAX
+        else
+            stop 2
+        end if
+        end
+
+
+!
+! Indicate whether or not a value lies in the range of an internal type.
+!
+        function in_internal_range(itype, value)
+        implicit        none
+        integer         itype
+        doubleprecision value
+#include "tests.inc"
+
+        in_internal_range = value .ge. internal_min(itype) .and.
+     +                      value .le. internal_max(itype)
+        end
+
+
+!
+! Return the length of a character variable minus any trailing blanks.
+!
+        function len_trim(string)
+        implicit        none
+        character*(*)   string
+#include "tests.inc"
+
+        do 1, len_trim = len(string), 1, -1
+            if (string(len_trim:len_trim) .ne. ' ')
+     +          goto 2
+1       continue
+
+2       return
+        end
diff --git a/test-driver b/test-driver
new file mode 100755
index 0000000..d306056
--- /dev/null
+++ b/test-driver
@@ -0,0 +1,139 @@
+#! /bin/sh
+# test-driver - basic testsuite driver script.
+
+scriptversion=2013-07-13.22; # UTC
+
+# Copyright (C) 2011-2013 Free Software Foundation, Inc.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# This file is maintained in Automake, please report
+# bugs to <bug-automake at gnu.org> or send patches to
+# <automake-patches at gnu.org>.
+
+# Make unconditional expansion of undefined variables an error.  This
+# helps a lot in preventing typo-related bugs.
+set -u
+
+usage_error ()
+{
+  echo "$0: $*" >&2
+  print_usage >&2
+  exit 2
+}
+
+print_usage ()
+{
+  cat <<END
+Usage:
+  test-driver --test-name=NAME --log-file=PATH --trs-file=PATH
+              [--expect-failure={yes|no}] [--color-tests={yes|no}]
+              [--enable-hard-errors={yes|no}] [--]
+              TEST-SCRIPT [TEST-SCRIPT-ARGUMENTS]
+The '--test-name', '--log-file' and '--trs-file' options are mandatory.
+END
+}
+
+test_name= # Used for reporting.
+log_file=  # Where to save the output of the test script.
+trs_file=  # Where to save the metadata of the test run.
+expect_failure=no
+color_tests=no
+enable_hard_errors=yes
+while test $# -gt 0; do
+  case $1 in
+  --help) print_usage; exit $?;;
+  --version) echo "test-driver $scriptversion"; exit $?;;
+  --test-name) test_name=$2; shift;;
+  --log-file) log_file=$2; shift;;
+  --trs-file) trs_file=$2; shift;;
+  --color-tests) color_tests=$2; shift;;
+  --expect-failure) expect_failure=$2; shift;;
+  --enable-hard-errors) enable_hard_errors=$2; shift;;
+  --) shift; break;;
+  -*) usage_error "invalid option: '$1'";;
+   *) break;;
+  esac
+  shift
+done
+
+missing_opts=
+test x"$test_name" = x && missing_opts="$missing_opts --test-name"
+test x"$log_file"  = x && missing_opts="$missing_opts --log-file"
+test x"$trs_file"  = x && missing_opts="$missing_opts --trs-file"
+if test x"$missing_opts" != x; then
+  usage_error "the following mandatory options are missing:$missing_opts"
+fi
+
+if test $# -eq 0; then
+  usage_error "missing argument"
+fi
+
+if test $color_tests = yes; then
+  # Keep this in sync with 'lib/am/check.am:$(am__tty_colors)'.
+  red='' # Red.
+  grn='' # Green.
+  lgn='' # Light green.
+  blu='' # Blue.
+  mgn='' # Magenta.
+  std=''     # No color.
+else
+  red= grn= lgn= blu= mgn= std=
+fi
+
+do_exit='rm -f $log_file $trs_file; (exit $st); exit $st'
+trap "st=129; $do_exit" 1
+trap "st=130; $do_exit" 2
+trap "st=141; $do_exit" 13
+trap "st=143; $do_exit" 15
+
+# Test script is run here.
+"$@" >$log_file 2>&1
+estatus=$?
+if test $enable_hard_errors = no && test $estatus -eq 99; then
+  estatus=1
+fi
+
+case $estatus:$expect_failure in
+  0:yes) col=$red res=XPASS recheck=yes gcopy=yes;;
+  0:*)   col=$grn res=PASS  recheck=no  gcopy=no;;
+  77:*)  col=$blu res=SKIP  recheck=no  gcopy=yes;;
+  99:*)  col=$mgn res=ERROR recheck=yes gcopy=yes;;
+  *:yes) col=$lgn res=XFAIL recheck=no  gcopy=yes;;
+  *:*)   col=$red res=FAIL  recheck=yes gcopy=yes;;
+esac
+
+# Report outcome to console.
+echo "${col}${res}${std}: $test_name"
+
+# Register the test result, and other relevant metadata.
+echo ":test-result: $res" > $trs_file
+echo ":global-test-result: $res" >> $trs_file
+echo ":recheck: $recheck" >> $trs_file
+echo ":copy-in-global-log: $gcopy" >> $trs_file
+
+# Local Variables:
+# mode: shell-script
+# sh-indentation: 2
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-time-zone: "UTC"
+# time-stamp-end: "; # UTC"
+# End:

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-grass/netcdf-fortran.git



More information about the Pkg-grass-devel mailing list